{* 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) private SelectLevel: cardinal; SelectPlayList: cardinal; SelectPlayList2: cardinal; SelectRounds: cardinal; IPlaylist: array[0..2] of UTF8String; IPlaylist2: array of UTF8String; PlayList: integer; PlayList2: integer; procedure SetPlaylist2; public constructor Create; override; function ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean; override; procedure OnShow; override; procedure SetAnimationProgress(Progress: real); override; end; implementation uses UGraphic, UMain, UIni, UTexture, ULanguage, UParty, USong, UPlaylist, USongs, UUnicodeUtils; function TScreenPartyOptions.ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean; var I, J: integer; 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; //Save Difficulty Ini.Difficulty := SelectsS[SelectLevel].SelectedOption; Ini.SaveLevel; //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; 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; end; SDLK_LEFT: begin AudioPlayback.PlaySound(SoundLib.Option); InteractDec; //Change Playlist2 if Playlist is Changed if (Interaction = 1) then begin SetPlaylist2; 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 PlayList := 0; PlayList2 := 0; //Load Screen From Theme LoadFromTheme(Theme.PartyOptions); Theme.PartyOptions.SelectLevel.oneItemOnly := true; Theme.PartyOptions.SelectLevel.showArrows := true; SelectLevel := AddSelectSlide(Theme.PartyOptions.SelectLevel, Ini.Difficulty, Theme.ILevel); Theme.PartyOptions.SelectPlayList.oneItemOnly := true; Theme.PartyOptions.SelectPlayList.showArrows := true; SelectPlayList := AddSelectSlide(Theme.PartyOptions.SelectPlayList, PlayList, IPlaylist); Theme.PartyOptions.SelectPlayList2.oneItemOnly := true; Theme.PartyOptions.SelectPlayList2.showArrows := true; SelectPlayList2 := AddSelectSlide(Theme.PartyOptions.SelectPlayList2, PlayList2, IPlaylist2); Interaction := 0; 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; Party.Clear; // check if there are loaded modes if Party.ModesAvailable then begin // modes are loaded Randomize; end else begin // no modes found ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS')); Display.AbortScreenChange; end; end; procedure TScreenPartyOptions.SetAnimationProgress(Progress: real); begin {for I := 0 to 6 do SelectS[I].Texture.ScaleW := Progress;} end; end.