unit UScreenPartyOptionsM2;
interface
uses
UMenu,
gl,
glu,
TextGL,
SDL,
UDisplay,
UMusic,
UFiles,
SysUtils,
UPartyM2,
UThemes;
type
TScreenPartyOptionsM2 = class(TMenu)
public
ID_DUELL: Byte;
SelectLevel: cardinal;
SelectPlayList: cardinal;
SelectPlayList2: cardinal;
NameRounds: cardinal;
CountRounds: cardinal;
SelectPlayers: cardinal;
SelectRounds: cardinal;
SelectOptionPlugin: cardinal;
SelectOptionHandicap: cardinal;
MenuPluginOpen: boolean;
PluginList: array of TPartyPlugin;
SelectedPlugin: Integer;
PlayList: integer;
PlayList2: integer;
Rounds: integer;
NumPlayer: integer;
OptionPlugin: integer;
OptionHandicap: 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;
IRounds: array of String;
IOptionYesNo: array of String;
const
IPlayers: array[0..7] of String = ('2', '3', '4', '5', '6', '7', '8', '9');
MAX_ROUNDS: Integer = 100;
ID='ID_020'; //for help system
implementation
uses
UGraphic,
UMain,
UIni,
UTexture,
ULanguage,
UDLLManager,
UPlaylist,
UHelp,
ULog,
USongs;
function TScreenPartyOptionsM2.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
var
I, J, Len: integer;
DuellAvailible: boolean;
begin
Result := true;
if MenuPluginOpen then
begin
PartyInput_MenuPlugin(PressedKey, ScanCode, PressedDown);
Exit;
end;
if (PressedDown) then
begin
// check special keys
case PressedKey of
SDLK_TAB:
begin
ScreenPopupHelp.ShowPopup();
end;
SDLK_ESCAPE,
SDLK_BACKSPACE :
begin
Music.PlayBack;
FadeTo(@ScreenMain);
end;
SDLK_RETURN:
begin
if not (OptionPlugin=1) then
begin
//Don'T start when Playlist is Selected and there are no Playlists
if (Playlist = 2) and (Length(PlaylistMan.Playlists) = 0) then
Exit;
//check plugins
SetLength(PartySessionM2.Plugins, 0);
DuellAvailible := false;
for I := 0 to Length(PluginList)-1 do
begin
//deactivate if not select plugins
//deselect all Plugins
if (OptionPlugin=0) then
PluginList[I].Selected := false;
//activate only duell plugin
if (OptionPlugin=0) and (PluginList[I].ID=ID_DUELL) and not PluginList[I].Medley then
begin
DuellAvailible := true;
if OptionPlugin=0 then
PluginList[I].Selected := true;
end;
if PluginList[I].Selected then
begin
Len := Length(PartySessionM2.Plugins);
SetLength(PartySessionM2.Plugins, Len+1);
PartySessionM2.Plugins[Len] := PluginList[I];
end;
end;
// Don't start when OptionPlugin=0 and no DUEL-Plugin
if not DuellAvailible and (OptionPlugin=0) then
begin
ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS') + ' (Duell)');
Exit;
end;
if Length(PartySessionM2.Plugins)=0 then
begin
ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS'));
Exit;
end;
//Save OptionPlugin
if OptionPlugin=0 then
PartySessionM2.Option_Plugins := false
else
PartySessionM2.Option_Plugins := true;
//Save Option Handicap
if OptionHandicap=0 then
PartySessionM2.HandicapMode := false
else
PartySessionM2.HandicapMode := true;
//Save Difficulty
Ini.Difficulty := SelectsS[SelectLevel].SelectedOption;
Ini.SaveLevel;
//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;
PartySessionM2.ID_DUELL := ID_DUELL;
//Start Party
PartySessionM2.StartNewParty(NumPlayer+2, Rounds+1);
Music.PlayStart;
//Go to Player Screen
FadeTo(@ScreenPartyPlayerM2);
end else
begin
MenuPluginOpen := true;
if not Help.SetHelpID('ID_030') then
Log.LogError('No Entry for Help-ID ID_030 (ScreenPartyOptionsM2, SelectPlugins)');
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:
begin
InteractNext;
if Interaction=7 then
MenuPluginOpen := true;
end;
SDLK_UP: InteractPrev;
SDLK_RIGHT:
begin
Music.PlayOption;
InteractInc;
//Change Playlist2 if Playlist is Changed
if (Interaction = 1) then
begin
SetPlaylist2;
end
else if(Interaction = 3) then
begin
Rounds:=(((NumPlayer+2)*(NumPlayer+2))-NumPlayer-2)-1;
SelectsS[SelectRounds].SetSelectOpt(Rounds);
end else if(Interaction = 4) then
begin
if (Rounds+1 + NumPlayer + 1 <= MAX_ROUNDS-1) then
Rounds:=Rounds + NumPlayer + 1
else
dec(Rounds);
SelectsS[SelectRounds].SetSelectOpt(Rounds);
end else if(Interaction = 5) then //Option Plugins
begin
//select all Plugins
for I := 0 to Length(PluginList) - 1 do
begin
PluginList[I].Selected := true;
end;
end;
end;
SDLK_LEFT:
begin
Music.PlayOption;
InteractDec;
//Change Playlist2 if Playlist is Changed
if (Interaction = 1) then
begin
SetPlaylist2;
end
else if(Interaction = 3) then
begin
Rounds:=(((NumPlayer+2)*(NumPlayer+2))-NumPlayer-2)-1;
SelectsS[SelectRounds].SetSelectOpt(Rounds);
end else if(Interaction = 4) then
begin
if (Rounds+1 - NumPlayer - 1 >= 2) then
Rounds:=Rounds - NumPlayer - 1
else
inc(Rounds);
SelectsS[SelectRounds].SetSelectOpt(Rounds);
end;
end;
end;
end;
end;
function TScreenPartyOptionsM2.PartyInput_MenuPlugin(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): boolean;
var
I, J, Len: integer;
DuellAvailible: 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
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;
//check plugins
SetLength(PartySessionM2.Plugins, 0);
DuellAvailible := false;
for I := 0 to Length(PluginList)-1 do
begin
if (PluginList[I].ID=ID_DUELL) then
begin
DuellAvailible := true;
if OptionPlugin=0 then
PluginList[I].Selected := true;
end;
if PluginList[I].Selected then
begin
Len := Length(PartySessionM2.Plugins);
SetLength(PartySessionM2.Plugins, Len+1);
PartySessionM2.Plugins[Len] := PluginList[I];
end;
end;
// Don't start when OptionPlugin=0 and no DUEL-Plugin
if not DuellAvailible and (OptionPlugin=0) then
begin
ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS') + ' (Duell)');
Exit;
end;
if Length(PartySessionM2.Plugins)=0 then
begin
ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS'));
Exit;
end;
//Save OptionPlugin
if OptionPlugin=0 then
PartySessionM2.Option_Plugins := false
else
PartySessionM2.Option_Plugins := true;
//Save Option Handicap
if OptionHandicap=0 then
PartySessionM2.HandicapMode := false
else
PartySessionM2.HandicapMode := true;
//Save Difficulty
Ini.Difficulty := SelectsS[SelectLevel].SelectedOption;
Ini.SaveLevel;
//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 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;
PartySessionM2.ID_DUELL := ID_DUELL;
//Start Party
PartySessionM2.StartNewParty(NumPlayer+2, Rounds+1);
Music.PlayStart;
//Go to Player Screen
FadeTo(@ScreenPartyPlayerM2);
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<Length(PluginList)-1 then
Inc(SelectedPlugin);
end;
end; //of case
end; //of if
end;
procedure TScreenPartyOptionsM2.Draw_MenuPlugin;
Type
TRect = record
left, right, top, bottom: integer;
end;
Const
h = 40;
procedure DrawPlugin(num: integer; Rect: TRect; Plug: TPartyPlugin; selected: boolean);
var
text: PChar;
name: string;
begin
glColor4f(1, 1, 1, 1);
glLineWidth(1);
if selected then
begin
glBegin(GL_LINE_LOOP);
glVertex2f(Rect.left-5, Rect.top+h*num);
glVertex2f(Rect.right+5, Rect.top+h*num);
glVertex2f(Rect.right+5, Rect.top+h*(num+1));
glVertex2f(Rect.left-5, Rect.top+h*(num+1));
glEnd;
end;
SetFontStyle(1);
SetFontItalic(false);
SetFontSize(13);
SetFontPos (Rect.left, Rect.top+ num*h);
name := Plug.Name;
text := Addr(name[1]);
glPrint(text);
SetFontPos (Rect.left+Round((Rect.right-Rect.left)/4*3), Rect.top+ num*h);
if Plug.Selected then
name := Language.Translate('SONG_MENU_YES')
else
name := Language.Translate('SONG_MENU_NO');
text := Addr(name[1]);
glPrint(text);
end;
procedure DrawScroll(X, Y, W, H: integer; pos, len: double);
var
fY, tY: double;
begin
glColor4f(1, 1, 1, 1);
glLineWidth(1);
glBegin(GL_LINE_LOOP);
glVertex2f(X, Y);
glVertex2f(X+W, Y);
glVertex2f(X+W, Y+H);
glVertex2f(X, Y+H);
glEnd;
fY := Y+(H-H*len)*pos;
tY := fY+H*len;
if tY+0.001>=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;
constructor TScreenPartyOptionsM2.Create;
var
I: integer;
begin
inherited Create;
//Fill IPlaylist
SetLength(IOptionYesNo, 2);
IOptionYesNo[0] := Language.Translate('SONG_MENU_NO');
IOptionYesNo[1] := Language.Translate('SONG_MENU_YES');
SetLength(IRounds, Round(MAX_ROUNDS));
for I := 1 to MAX_ROUNDS do
begin
IRounds[I-1]:=IntToStr(I);
end;
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
NumPlayer := 0;
Rounds := 0;
PlayList := 0;
PlayList2 := 0;
//Load Screen From Theme
LoadFromTheme(Theme.PartyOptionsM2);
SelectLevel := AddSelectSlide (Theme.PartyOptionsM2.SelectLevel, Ini.Difficulty, Theme.ILevel);
SelectPlayList := AddSelectSlide (Theme.PartyOptionsM2.SelectPlayList, PlayList, IPlaylist);
SelectPlayList2 := AddSelectSlide (Theme.PartyOptionsM2.SelectPlayList2, PlayList2, IPlaylist2);
SelectPlayers := AddSelectSlide (Theme.PartyOptionsM2.SelectPlayers1, NumPlayer, IPlayers);
SelectRounds := AddSelectSlide (Theme.PartyOptionsM2.SelectRounds, Rounds, IRounds);
SelectOptionPlugin := AddSelectSlide (Theme.PartyOptionsM2.SelectOptionPlugin, OptionPlugin, IOptionYesNo);
SelectOptionHandicap := AddSelectSlide (Theme.PartyOptionsM2.SelectOptionHandicap, OptionHandicap, IOptionYesNo);
Interaction := 0;
Rounds:=1;
SelectsS[SelectRounds].SetSelectOpt(Rounds);
end;
procedure TScreenPartyOptionsM2.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.PartyOptionsM2.SelectPlayList2, 2, IPlaylist2, Playlist2);
end;
procedure TScreenPartyOptionsM2.onShow;
var
Len, I: Integer;
ID_BLIND: Byte;
ID_NOSCORE: Byte;
begin
if not Help.SetHelpID(ID) then
Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyOptionsM2)');
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;
if (not DLLMan.Plugins[I].TeamModeOnly) then
begin
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;
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 := smChallenge;
SetPlaylist2;
end;
function TScreenPartyOptionsM2.Draw: boolean;
begin
// draw static menu
inherited Draw;
if MenuPluginOpen then
Draw_MenuPlugin;
Result := true;
end;
procedure TScreenPartyOptionsM2.SetAnimationProgress(Progress: real);
begin
{for I := 0 to 6 do
SelectS[I].Texture.ScaleW := Progress;}
end;
end.