unit UScreenPartyOptions; interface uses UMenu, gl, glu, TextGL, SDL, UDisplay, UMusic, UParty, UFiles, SysUtils, UThemes; type TScreenPartyOptions = class(TMenu) public SelectLevel: Cardinal; SelectPlayList: Cardinal; SelectPlayList2: Cardinal; SelectRounds: Cardinal; SelectTeams: Cardinal; SelectPlayers1: Cardinal; SelectPlayers2: Cardinal; SelectPlayers3: Cardinal; PluginList: array of TPartyPlugin; SelectedPlugin: Integer; MenuPluginOpen: boolean; PlayList: Integer; PlayList2: Integer; Rounds: Integer; NumTeams: Integer; NumPlayer1, NumPlayer2, NumPlayer3: Integer; constructor Create; override; function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override; procedure onShow; override; function Draw: boolean; override; procedure SetAnimationProgress(Progress: real); override; procedure SetPlaylist2; procedure Draw_MenuPlugin; function PartyInput_MenuPlugin(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): boolean; end; var IPlaylist: array[0..2] of String; IPlaylist2: array of String; const ITeams: array[0..1] of String =('2', '3'); IPlayers: array[0..3] of String =('1', '2', '3', '4'); IRounds: array[0..30] of String = ('2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32'); ID='ID_015'; //for help system implementation uses UGraphic, UMain, UIni, UTexture, ULanguage, UDLLManager, UPlaylist, USongs, UHelp, ULog; function TScreenPartyOptions.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; begin Result := true; if MenuPluginOpen then begin PartyInput_MenuPlugin(PressedKey, ScanCode, PressedDown); Exit; 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 Music.PlayBack; FadeTo(@ScreenMain); end; SDLK_RETURN: begin MenuPluginOpen := true; if not Help.SetHelpID('ID_030') then Log.LogError('No Entry for Help-ID ID_030 (ScreenPartyOptions, SelectPlugins)'); 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: InteractNext; SDLK_UP: InteractPrev; SDLK_RIGHT: begin Music.PlayOption; InteractInc; //Change Playlist2 if Playlist is Changed If (Interaction = 1) then begin SetPlaylist2; end //Change Team3 Players visibility Else If (Interaction = 4) then begin SelectsS[7].Visible := (NumTeams = 1); end; end; SDLK_LEFT: begin Music.PlayOption; InteractDec; //Change Playlist2 if Playlist is Changed If (Interaction = 1) then begin SetPlaylist2; end //Change Team3 Players visibility Else If (Interaction = 4) then begin SelectsS[7].Visible := (NumTeams = 1); end; end; end; end; end; function TScreenPartyOptions.PartyInput_MenuPlugin(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): boolean; var I, J, Len: Integer; OnlyMultiPlayer: boolean; SinglePlayerTeams: boolean; begin Result := true; If (PressedDown) Then begin // Key Down case PressedKey of SDLK_TAB: begin ScreenPopupHelp.ShowPopup(); end; SDLK_ESCAPE: begin MenuPluginOpen := false; if not Help.SetHelpID(ID) then Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyOptions)'); end; SDLK_RETURN: begin if (Playlist = 0) and ((Ini.Tabs = 1) or (Ini.Sorting <> sRandom)) then begin Ini.Tabs := 0; Ini.Sorting := sRandom; ScreenSong.Refresh(true); PlaylistMan.LoadPlayLists; end; MenuPluginOpen := false; if not Help.SetHelpID(ID) then Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyOptions)'); //Don'T start when Playlist is Selected and there are no Playlists If (Playlist = 2) and (Length(PlaylistMan.Playlists) = 0) then Exit; // Don't start when SinglePlayer Teams but only Multiplayer Plugins available OnlyMultiPlayer:=true; SinglePlayerTeams := ((NumPlayer1 = 0) OR (NumPlayer2 = 0) OR ((NumPlayer3 = 0) AND (NumTeams = 1))); SetLength(PartySession.Plugins, 0); for I := 0 to Length(PluginList)-1 do begin if PluginList[I].Selected then begin if PluginList[I].Medley or (not DLLMan.Plugins[PluginList[I].ID].TeamModeOnly) or (not SinglePlayerTeams and DLLMan.Plugins[PluginList[I].ID].TeamModeOnly) then begin Len := Length(PartySession.Plugins); SetLength(PartySession.Plugins, Len+1); PartySession.Plugins[Len] := PluginList[I]; end; if not PluginList[I].Medley then OnlyMultiPlayer := (OnlyMultiPlayer AND DLLMan.Plugins[PluginList[I].ID].TeamModeOnly) else OnlyMultiPlayer := false; end; end; if (OnlyMultiPlayer) AND SinglePlayerTeams or (Length(PartySession.Plugins)=0) then begin ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS')); Exit; end; //Save Difficulty Ini.Difficulty := SelectsS[SelectLevel].SelectedOption; Ini.SaveLevel; //Save Num Teams: PartySession.Teams.NumTeams := NumTeams + 2; PartySession.Teams.Teaminfo[0].NumPlayers := NumPlayer1+1; PartySession.Teams.Teaminfo[1].NumPlayers := NumPlayer2+1; PartySession.Teams.Teaminfo[2].NumPlayers := NumPlayer3+1; //Save Playlist PlaylistMan.Mode := Playlist; PlaylistMan.CurPlayList := High(Cardinal); //If Category Selected Search Category ID if Playlist = 1 then begin J := -1; For I := 0 to high(CatSongs.Song) do begin if CatSongs.Song[I].Main and (CatSongs.NumCatSongs(CatSongs.Song[I].OrderNum)>0) then Inc(J); if J = Playlist2 then begin PlaylistMan.CurPlayList := I; Break; end; end; //No Categorys or Invalid Entry If PlaylistMan.CurPlayList = High(Cardinal) then Exit; end else PlaylistMan.CurPlayList := Playlist2; //Start Party PartySession.StartNewParty(Rounds + 2); Music.PlayStart; //Go to Player Screen FadeTo(@ScreenPartyPlayer); end; SDLK_SPACE: begin Music.PlayOption; PluginList[SelectedPlugin].Selected := not PluginList[SelectedPlugin].Selected; end; SDLK_LEFT: begin if PluginList[SelectedPlugin].Selected then begin Music.PlayOption; PluginList[SelectedPlugin].Selected := false; end; end; SDLK_RIGHT: begin if not PluginList[SelectedPlugin].Selected then begin Music.PlayOption; PluginList[SelectedPlugin].Selected := true; end; end; SDLK_UP: begin if SelectedPlugin>0 then Dec(SelectedPlugin); end; SDLK_DOWN: begin if SelectedPlugin=Y+H then tY := Y+H; glBegin(GL_QUADS); glVertex2f(X, fY); glVertex2f(X+W, fY); glVertex2f(X+W, tY); glVertex2f(X, tY); glEnd; end; var Rect: TRect; abs: real; ab: real; I: integer; barH: double; pos: double; begin Rect.left := 150; Rect.right := 650; Rect.top := 30; Rect.bottom := 550; abs := 15; if Length(PluginList)<=13 then begin ab := 0; barH := 1; end else begin ab := 10; barH := h*13/(h*Length(PluginList)); end; glEnable(GL_BLEND); glBegin(gl_quads); //Background: glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.left-abs, Rect.top-abs); glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.right+abs+ab, Rect.top-abs); glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.right+abs+ab, Rect.bottom+abs); glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.left-abs, Rect.bottom+abs); glEnd; glDisable(GL_BLEND); //Draw MainFrame glColor4f(1, 1, 1, 1); glLineWidth(1); glBegin(GL_LINE_LOOP); glVertex2f(Rect.left-abs+1, Rect.top-abs+1); glVertex2f(Rect.right+abs-1, Rect.top-abs+1); glVertex2f(Rect.right+abs-1, Rect.bottom+abs-1); glVertex2f(Rect.left-abs+1, Rect.bottom+abs-1); glEnd; if barH<1 then begin pos := SelectedPlugin/(Length(PluginList)-1); //draw plugin names and selections for I := 0 to 12 do begin if (SelectedPlugin<=6) then DrawPlugin(I, Rect, PluginList[I], I=SelectedPlugin) else if ((SelectedPlugin-6)<=(Length(PluginList)-13)) then DrawPlugin(I, Rect, PluginList[I+(SelectedPlugin-6)], I+(SelectedPlugin-6)=SelectedPlugin) else DrawPlugin(I, Rect, PluginList[I+(Length(PluginList)-13)], I+(Length(PluginList)-13)=SelectedPlugin); end; DrawScroll(Round(Rect.right+abs-1), Rect.top-round(abs)+1, Round(ab), Rect.bottom-Rect.top+round(abs+abs)-2, pos, barH); end else begin for I := 0 to Length(PluginList)-1 do DrawPlugin(I, Rect, PluginList[I], I=SelectedPlugin) end; end; function TScreenPartyOptions.Draw: boolean; begin // draw static menu inherited Draw; if MenuPluginOpen then Draw_MenuPlugin; end; constructor TScreenPartyOptions.Create; {var I: integer;} begin inherited Create; //Fill IPlaylist IPlaylist[0] := Language.Translate('PARTY_PLAYLIST_ALL'); IPlaylist[1] := Language.Translate('PARTY_PLAYLIST_CATEGORY'); IPlaylist[2] := Language.Translate('PARTY_PLAYLIST_PLAYLIST'); //Fill IPlaylist2 SetLength(IPlaylist2, 1); IPlaylist2[0] := '---'; //Clear all Selects NumTeams := 0; NumPlayer1 := 0; NumPlayer2 := 0; NumPlayer3 := 0; Rounds := 5; PlayList := 0; PlayList2 := 0; //Load Screen From Theme LoadFromTheme(Theme.PartyOptions); SelectLevel := AddSelectSlide (Theme.PartyOptions.SelectLevel, Ini.Difficulty, Theme.ILevel); SelectPlayList := AddSelectSlide (Theme.PartyOptions.SelectPlayList, PlayList, IPlaylist); SelectPlayList2 := AddSelectSlide (Theme.PartyOptions.SelectPlayList2, PlayList2, IPlaylist2); SelectRounds := AddSelectSlide (Theme.PartyOptions.SelectRounds, Rounds, IRounds); SelectTeams := AddSelectSlide (Theme.PartyOptions.SelectTeams, NumTeams, ITeams); SelectPlayers1 := AddSelectSlide (Theme.PartyOptions.SelectPlayers1, NumPlayer1, IPlayers); SelectPlayers2 := AddSelectSlide (Theme.PartyOptions.SelectPlayers2, NumPlayer2, IPlayers); SelectPlayers3 := AddSelectSlide (Theme.PartyOptions.SelectPlayers3, NumPlayer3, IPlayers); Interaction := 0; //Hide Team3 Players SelectsS[7].Visible := False; end; procedure TScreenPartyOptions.SetPlaylist2; var I: Integer; begin Case Playlist of 0: begin SetLength(IPlaylist2, 1); IPlaylist2[0] := '(' + IntToStr(CatSongs.NumSongs()) + ' Songs)'; end; 1: begin SetLength(IPlaylist2, 0); For I := 0 to high(CatSongs.Song) do begin If CatSongs.Song[I].Main and (CatSongs.NumCatSongs(CatSongs.Song[I].OrderNum)>0) then begin SetLength(IPlaylist2, Length(IPlaylist2) + 1); IPlaylist2[high(IPlaylist2)] := CatSongs.Song[I].Artist + ' (' + IntToStr(CatSongs.NumCatSongs(CatSongs.Song[I].OrderNum)) + ' Songs)'; end; end; If (Length(IPlaylist2) = 0) then begin SetLength(IPlaylist2, 1); IPlaylist2[0] := 'No Categories found'; end; end; 2: begin if (Length(PlaylistMan.Playlists) > 0) then begin SetLength(IPlaylist2, Length(PlaylistMan.Playlists)); PlaylistMan.GetNamesAndNumSongs(IPlaylist2); end else begin SetLength(IPlaylist2, 1); IPlaylist2[0] := 'No Playlists found'; end; end; end; Playlist2 := 0; UpdateSelectSlideOptions(Theme.PartyOptions.SelectPlayList2, 2, IPlaylist2, Playlist2); end; procedure TScreenPartyOptions.onShow; var Len, I: Integer; ID_DUELL: Integer; ID_BLIND: Integer; ID_NOSCORE: Integer; begin if not Help.SetHelpID(ID) then Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyOptions)'); MenuPluginOpen := false; //Fill plugin array ID_DUELL := high(Byte); ID_BLIND := high(Byte); ID_NOSCORE := high(Byte); SetLength(PluginList, 0); for I := 0 to high(DLLMan.Plugins) do begin if DLLMan.Plugins[I].Name='PLUGIN_DUELL_NAME' then ID_DUELL := I; if DLLMan.Plugins[I].Name='PLUGIN_BLIND_NAME' then ID_BLIND := I; if DLLMan.Plugins[I].Name='PLUGIN_NOSCORE_NAME' then ID_NOSCORE := I; Len := Length(PluginList); SetLength(PluginList, Len + 1); PluginList[Len].ID := I; PluginList[Len].TimesPlayed := 0; PluginList[Len].Medley := false; PluginList[Len].MedleySurprise := false; PluginList[Len].Selected := true; PluginList[Len].Name := Language.Translate(DLLMan.Plugins[I].Name); PluginList[Len].Desc := Language.Translate(DLLMan.Plugins[I].PluginDesc); end; //Add Medley "Plugin" (if Plugin DUELL availible) if ID_DUELL<>high(Byte) then begin Len := Length(PluginList); SetLength(PluginList, Len + 1); PluginList[Len].ID := ID_DUELL; PluginList[Len].TimesPlayed := 0; PluginList[Len].Medley := true; PluginList[Len].MedleySurprise := false; PluginList[Len].Selected := true; PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEY_NAME'); PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEY_DESC'); end; //Add Medley blind "Plugin" (if Plugin BLIND availible) if ID_BLIND<>high(Byte) then begin Len := Length(PluginList); SetLength(PluginList, Len + 1); PluginList[Len].ID := ID_BLIND; PluginList[Len].TimesPlayed := 0; PluginList[Len].Medley := true; PluginList[Len].MedleySurprise := false; PluginList[Len].Selected := true; PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEYBLIND_NAME'); PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEYBLIND_DESC'); end; //Add Medley noscore "Plugin" (if Plugin NOSCORE availible) if ID_NOSCORE<>high(Byte) then begin Len := Length(PluginList); SetLength(PluginList, Len + 1); PluginList[Len].ID := ID_NOSCORE; PluginList[Len].TimesPlayed := 0; PluginList[Len].Medley := true; PluginList[Len].MedleySurprise := false; PluginList[Len].Selected := true; PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEYNOSCORE_NAME'); PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEYNOSCORE_DESC'); end; //Add Medley Surprise "Plugin" (if Plugin DUELL availible) if ID_DUELL<>high(Byte) then begin Len := Length(PluginList); SetLength(PluginList, Len + 1); PluginList[Len].ID := ID_DUELL; PluginList[Len].TimesPlayed := 0; PluginList[Len].Medley := true; PluginList[Len].MedleySurprise := true; PluginList[Len].Selected := true; PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEYSURPRISE_NAME'); PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEYSURPRISE_DESC'); end; //Add Medley Surprise blind "Plugin" (if Plugin BLIND availible) if ID_BLIND<>high(Byte) then begin Len := Length(PluginList); SetLength(PluginList, Len + 1); PluginList[Len].ID := ID_BLIND; PluginList[Len].TimesPlayed := 0; PluginList[Len].Medley := true; PluginList[Len].MedleySurprise := true; PluginList[Len].Selected := true; PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEYSURPRISEBLIND_NAME'); PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEYSURPRISEBLIND_DESC'); end; SelectedPlugin := 0; ScreenSong.Mode := smParty; SetPlaylist2; end; procedure TScreenPartyOptions.SetAnimationProgress(Progress: real); begin {for I := 0 to 6 do SelectS[I].Texture.ScaleW := Progress;} end; end.