{* UltraStar Deluxe - Karaoke Game * * UltraStar Deluxe is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * $URL$ * $Id$ *} unit UScreenPartyOptions; interface {$IFDEF FPC} {$MODE Delphi} {$ENDIF} {$I switches.inc} uses UMenu, SDL, UDisplay, UMusic, UFiles, SysUtils, UThemes; type TScreenPartyOptions = class(TMenu) public SelectLevel: cardinal; SelectPlayList: cardinal; SelectPlayList2: cardinal; SelectRounds: cardinal; SelectTeams: cardinal; SelectPlayers1: cardinal; SelectPlayers2: cardinal; SelectPlayers3: cardinal; PlayList: integer; PlayList2: integer; Rounds: integer; NumTeams: integer; NumPlayer1, NumPlayer2, NumPlayer3: integer; constructor Create; override; function ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean; override; procedure OnShow; override; procedure SetAnimationProgress(Progress: real); override; procedure SetPlaylist2; end; var IPlaylist: array[0..2] of UTF8String; IPlaylist2: array of UTF8String; const ITeams: array[0..1] of UTF8String = ('2', '3'); IPlayers: array[0..3] of UTF8String = ('1', '2', '3', '4'); IRounds: array[0..5] of UTF8String = ('2', '3', '4', '5', '6', '7'); implementation uses UGraphic, UMain, UIni, UTexture, ULanguage, UParty, USong, UDLLManager, UPlaylist, USongs, UUnicodeUtils; function TScreenPartyOptions.ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean; var I, J: integer; OnlyMultiPlayer: boolean; begin Result := true; if (PressedDown) then begin // Key Down // check normal keys case UCS4UpperCase(CharCode) of Ord('Q'): begin Result := false; Exit; end; end; // check special keys case PressedKey of SDLK_ESCAPE, SDLK_BACKSPACE : begin AudioPlayback.PlaySound(SoundLib.Back); FadeTo(@ScreenMain); end; SDLK_RETURN: begin //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; for I := 0 to High(DLLMan.Plugins) do begin OnlyMultiPlayer := (OnlyMultiPlayer and DLLMan.Plugins[I].TeamModeOnly); end; if (OnlyMultiPlayer) and ((NumPlayer1 = 0) or (NumPlayer2 = 0) or ((NumPlayer3 = 0) and (NumTeams = 1))) 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 := TSingMode( 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 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); AudioPlayback.PlaySound(SoundLib.Start); //Go to Player Screen FadeTo(@ScreenPartyPlayer); 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 AudioPlayback.PlaySound(SoundLib.Option); 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 AudioPlayback.PlaySound(SoundLib.Option); 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; constructor TScreenPartyOptions.Create; 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] := '---'; end; 1: begin SetLength(IPlaylist2, 0); for I := 0 to high(CatSongs.Song) do begin if (CatSongs.Song[I].Main) then begin SetLength(IPlaylist2, Length(IPlaylist2) + 1); IPlaylist2[high(IPlaylist2)] := CatSongs.Song[I].Artist; 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.GetNames(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; begin inherited; Randomize; end; procedure TScreenPartyOptions.SetAnimationProgress(Progress: real); begin {for I := 0 to 6 do SelectS[I].Texture.ScaleW := Progress;} end; end.