unit UScreenMain; interface uses UMenu, SDL, UDisplay, UMusic, UFiles, SysUtils, UThemes, UHelp; type TScreenMain = class(TMenu) private IdleTicks: cardinal; procedure StartScreenScredits; public TextDescription: integer; TextDescriptionLong: integer; ShowNumErrors: boolean; constructor Create; override; function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override; procedure onShow; override; function Draw: boolean; override; procedure InteractNext; override; procedure InteractPrev; override; procedure InteractInc; override; procedure InteractDec; override; procedure SetAnimationProgress(Progress: real); override; end; const ID='ID_003'; //for help system implementation uses Windows, UPlaylist, UGraphic, UMain, UIni, UTexture, USongs, Textgl, opengl, ULanguage, UParty, UDLLManager, UScreenCredits, USkins, ULog; procedure TScreenMain.StartScreenScredits; begin //If CreditsScreen is not Created -> Then Create If (ScreenCredits = nil) then begin try //Display White Loading Text SetFontStyle(2); //Font: Outlined1 SetFontSize(12); SetFontItalic(False); SetFontPos (400 - glTextWidth ('Loading Credits ...')/2, 250); //Position glColor4f(1,1,1,1); glPrint('Loading Credits ...'); SwapBuffers; ScreenCredits := TScreenCredits.Create; except Log.LogError ('Couldn''t Create Credits Screen'); end; end; If (ScreenCredits <> nil) then begin Music.PlayStart; FadeTo(@ScreenCredits); end; end; function TScreenMain.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; var SDL_ModState: Word; I, num: Integer; begin Result := true; IdleTicks := SDL_GetTicks; SDL_ModState := SDL_GetModState and (KMOD_LSHIFT + KMOD_RSHIFT + KMOD_LCTRL + KMOD_RCTRL + KMOD_LALT + KMOD_RALT); num := 0; //suitable songs for party-modes for i := 0 to Length(Songs.Song) - 1 do begin if not Songs.Song[i].isDuet then inc(num); end; If (PressedDown) Then begin // Key Down case PressedKey of SDLK_TAB: begin ScreenPopupHelp.ShowPopup(); end; SDLK_Q: begin Result := false; end; SDLK_ESCAPE, SDLK_BACKSPACE : begin Result := False; end; SDLK_C: begin if (SDL_ModState = KMOD_LALT) then StartScreenScredits; end; SDLK_M: begin if SDL_ModState = KMOD_LSHIFT then begin if (num >= 1) then begin if (Length(DLLMan.Plugins)>=1) then begin Music.PlayStart; FadeTo(@ScreenPartyOptionsM2); end else //show error message, No Plugins Loaded ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS')); end else //show error message, No Songs Loaded ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_SONGS')); end else begin if (num >= 1) then begin if (Length(DLLMan.Plugins)>=1) then begin Music.PlayStart; FadeTo(@ScreenPartyOptions); end else //show error message, No Plugins Loaded ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS')); end else //show error message, No Songs Loaded ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_SONGS')); end; end; SDLK_S: begin Music.PlayStart; FadeTo(@ScreenStatMain); end; SDLK_E: begin Music.PlayStart; FadeTo(@ScreenEdit); end; SDLK_RETURN: begin //Solo if (Interaction = 0) then begin if (Length(Songs.Song) >= 1) then begin Music.PlayStart; if (Ini.Players >= 0) and (Ini.Players <= 3) then PlayersPlay := Ini.Players + 1; if (Ini.Players = 4) then PlayersPlay := 6; ScreenName.Goto_SingScreen := False; FadeTo(@ScreenName); end else //show error message ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_SONGS')); end; //Multi if Interaction = 1 then begin if (num >= 1) then begin if (Length(DLLMan.Plugins)>=1) then begin Music.PlayStart; FadeTo(@ScreenPartyOptions); end else //show error message, No Plugins Loaded ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS')); end else //show error message, No Songs Loaded ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_SONGS')); end; //Multi M2 if Interaction = 2 then begin if (num >= 1) then begin if (Length(DLLMan.Plugins)>=1) then begin Music.PlayStart; FadeTo(@ScreenPartyOptionsM2); end else //show error message, No Plugins Loaded ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS')); end else //show error message, No Songs Loaded ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_SONGS')); end; //Stats if Interaction = 3 then begin Music.PlayStart; FadeTo(@ScreenStatMain); end; //Editor if Interaction = 4 then begin Music.PlayStart; FadeTo(@ScreenEdit); end; //Options if Interaction = 5 then begin Music.PlayStart; FadeTo(@ScreenOptions); end; //Exit if Interaction = 6 then begin Result := false; end; end; // Up and Down could be done at the same time, // but I don't want to declare variables inside // functions like this one, called so many times SDLK_DOWN: InteractInc; SDLK_UP: InteractDec; SDLK_RIGHT: InteractNext; SDLK_LEFT: InteractPrev; end; end else // Key Up case PressedKey of SDLK_RETURN : begin end; end; end; constructor TScreenMain.Create; begin inherited Create; //---------------- //Attention ^^: //New Creation Order needed because of LoadFromTheme //and Button Collections. //At First Custom Texts and Statics //Then LoadFromTheme //after LoadFromTheme the Buttons and Selects //---------------- TextDescription := AddText(Theme.Main.TextDescription); TextDescriptionLong := AddText(Theme.Main.TextDescriptionLong); LoadFromTheme(Theme.Main); AddButton(Theme.Main.ButtonSolo); AddButton(Theme.Main.ButtonMulti); AddButton(Theme.Main.ButtonMultiM2); AddButton(Theme.Main.ButtonStat); AddButton(Theme.Main.ButtonEditor); AddButton(Theme.Main.ButtonOptions); AddButton(Theme.Main.ButtonExit); Interaction := 0; ShowNumErrors := true; end; procedure TScreenMain.onShow; var J: integer; begin IdleTicks := SDL_GetTicks; ScreenSong.Mode := smNormal; ScreenSong.SongIndex := -1; PlaylistMan.Mode := 0; if not Help.SetHelpID(ID) then Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenMain)'); if (Ini.LoadFaultySongs=0) and ShowNumErrors and (Songs.NumFaultySongs>0) then begin ScreenPopupCheck.ShowPopup(Format(Language.Translate('MSG_ERROR_SONGLOADING'), [Songs.NumFaultySongs])); end else ShowNumErrors := false; if (Ini.tabs_temp <> Ini.tabs) or (Ini.sorting_temp <> Ini.Sorting)then begin Ini.Tabs := Ini.tabs_temp; Ini.Sorting := Ini.sorting_temp; ScreenSong.Refresh(true); PlaylistMan.LoadPlayLists; end; end; function TScreenMain.Draw: boolean; var txt: string; begin Result := inherited Draw; if ScreenPopupHelp.Visible or ScreenPopupCheck.Visible or ScreenPopupError.Visible then IdleTicks := SDL_GetTicks; if (IdleTicks + 30*1000 < SDL_GetTicks) then begin StartScreenScredits; end; glColor4f(1,1,1,1); SetFontStyle(0); SetFontItalic(False); SetFontSize(6); txt := Language.Translate('US_VERSION_NUMBER'); SetFontPos(795 - glTextWidth(PChar(txt)), 580); glPrint(PChar(txt)); end; procedure TScreenMain.InteractNext; begin inherited InteractNext; Text[TextDescription].Text := Theme.Main.Description[Interaction]; Text[TextDescriptionLong].Text := Theme.Main.DescriptionLong[Interaction]; end; procedure TScreenMain.InteractPrev; begin inherited InteractPrev; Text[TextDescription].Text := Theme.Main.Description[Interaction]; Text[TextDescriptionLong].Text := Theme.Main.DescriptionLong[Interaction]; end; procedure TScreenMain.InteractDec; begin inherited InteractDec; Text[TextDescription].Text := Theme.Main.Description[Interaction]; Text[TextDescriptionLong].Text := Theme.Main.DescriptionLong[Interaction]; end; procedure TScreenMain.InteractInc; begin inherited InteractInc; Text[TextDescription].Text := Theme.Main.Description[Interaction]; Text[TextDescriptionLong].Text := Theme.Main.DescriptionLong[Interaction]; end; procedure TScreenMain.SetAnimationProgress(Progress: real); begin Static[0].Texture.ScaleW := Progress; Static[0].Texture.ScaleH := Progress; end; end.