aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Game/Code/Classes/UGraphic.pas28
-rw-r--r--Game/Code/Classes/UThemes.pas123
-rw-r--r--Game/Code/Menu/UMenu.pas348
-rw-r--r--Game/Code/Menu/UMenuButton.pas17
-rw-r--r--Game/Code/Menu/UMenuButtonCollection.pas59
-rw-r--r--Game/Code/Menu/UMenuInteract.pas2
-rw-r--r--Game/Code/Menu/UMenuText.pas2
-rw-r--r--Game/Code/Screens/UScreenCredits.pas6
-rw-r--r--Game/Code/Screens/UScreenEdit.pas6
-rw-r--r--Game/Code/Screens/UScreenEditConvert.pas6
-rw-r--r--Game/Code/Screens/UScreenEditHeader.pas6
-rw-r--r--Game/Code/Screens/UScreenEditSub.pas6
-rw-r--r--Game/Code/Screens/UScreenLevel.pas8
-rw-r--r--Game/Code/Screens/UScreenLoading.pas16
-rw-r--r--Game/Code/Screens/UScreenMain.pas79
-rw-r--r--Game/Code/Screens/UScreenName.pas9
-rw-r--r--Game/Code/Screens/UScreenOpen.pas6
-rw-r--r--Game/Code/Screens/UScreenOptions.pas91
-rw-r--r--Game/Code/Screens/UScreenOptionsAdvanced.pas14
-rw-r--r--Game/Code/Screens/UScreenOptionsGame.pas14
-rw-r--r--Game/Code/Screens/UScreenOptionsGraphics.pas14
-rw-r--r--Game/Code/Screens/UScreenOptionsLyrics.pas14
-rw-r--r--Game/Code/Screens/UScreenOptionsRecord.pas14
-rw-r--r--Game/Code/Screens/UScreenOptionsSound.pas15
-rw-r--r--Game/Code/Screens/UScreenOptionsThemes.pas14
-rw-r--r--Game/Code/Screens/UScreenPartyNewRound.pas13
-rw-r--r--Game/Code/Screens/UScreenPartyOptions.pas45
-rw-r--r--Game/Code/Screens/UScreenPartyPlayer.pas8
-rw-r--r--Game/Code/Screens/UScreenPartyScore.pas8
-rw-r--r--Game/Code/Screens/UScreenPartyWin.pas8
-rw-r--r--Game/Code/Screens/UScreenScore.pas54
-rw-r--r--Game/Code/Screens/UScreenSing.pas8
-rw-r--r--Game/Code/Screens/UScreenSong.pas8
-rw-r--r--Game/Code/Screens/UScreenSongJumpto.pas11
-rw-r--r--Game/Code/Screens/UScreenSongMenu.pas48
-rw-r--r--Game/Code/Screens/UScreenStatDetail.pas26
-rw-r--r--Game/Code/Screens/UScreenStatMain.pas13
-rw-r--r--Game/Code/Screens/UScreenTop5.pas8
-rw-r--r--Game/Code/UltraStar.dpr26
-rw-r--r--Languages/English.ini19
-rw-r--r--Languages/German.ini16
-rw-r--r--Languages/readme.txt9
-rw-r--r--Themes/Deluxe.ini79
43 files changed, 777 insertions, 547 deletions
diff --git a/Game/Code/Classes/UGraphic.pas b/Game/Code/Classes/UGraphic.pas
index df7cd411..39eea53d 100644
--- a/Game/Code/Classes/UGraphic.pas
+++ b/Game/Code/Classes/UGraphic.pas
@@ -375,7 +375,7 @@ end;
procedure LoadScreens;
begin
- ScreenLoading := TScreenLoading.Create('');
+ ScreenLoading := TScreenLoading.Create;
ScreenLoading.onShow;
Display.ActualScreen := @ScreenLoading;
ScreenLoading.Draw;
@@ -397,35 +397,35 @@ begin
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Song Menu', 3); Log.BenchmarkStart(3);
ScreenSing := TScreenSing.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Sing', 3); Log.BenchmarkStart(3);
- ScreenScore := TScreenScore.Create('');
+ ScreenScore := TScreenScore.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Score', 3); Log.BenchmarkStart(3);
ScreenTop5 := TScreenTop5.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Top5', 3); Log.BenchmarkStart(3);
- ScreenOptions := TScreenOptions.Create('');
+ ScreenOptions := TScreenOptions.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options', 3); Log.BenchmarkStart(3);
- ScreenOptionsGame := TScreenOptionsGame.Create('');
+ ScreenOptionsGame := TScreenOptionsGame.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Game', 3); Log.BenchmarkStart(3);
- ScreenOptionsGraphics := TScreenOptionsGraphics.Create('');
+ ScreenOptionsGraphics := TScreenOptionsGraphics.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Graphics', 3); Log.BenchmarkStart(3);
- ScreenOptionsSound := TScreenOptionsSound.Create('');
+ ScreenOptionsSound := TScreenOptionsSound.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Sound', 3); Log.BenchmarkStart(3);
- ScreenOptionsLyrics := TScreenOptionsLyrics.Create('');
+ ScreenOptionsLyrics := TScreenOptionsLyrics.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Lyrics', 3); Log.BenchmarkStart(3);
- ScreenOptionsThemes := TScreenOptionsThemes.Create('');
+ ScreenOptionsThemes := TScreenOptionsThemes.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Themes', 3); Log.BenchmarkStart(3);
ScreenOptionsRecord := TScreenOptionsRecord.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Record', 3); Log.BenchmarkStart(3);
- ScreenOptionsAdvanced := TScreenOptionsAdvanced.Create('');
+ ScreenOptionsAdvanced := TScreenOptionsAdvanced.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Advanced', 3); Log.BenchmarkStart(3);
- ScreenEditSub := TScreenEditSub.Create('');
+ ScreenEditSub := TScreenEditSub.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Edit Sub', 3); Log.BenchmarkStart(3);
- ScreenEdit := TScreenEdit.Create('');
+ ScreenEdit := TScreenEdit.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Edit', 3); Log.BenchmarkStart(3);
- ScreenEditConvert := TScreenEditConvert.Create('');
+ ScreenEditConvert := TScreenEditConvert.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen EditConvert', 3); Log.BenchmarkStart(3);
// ScreenEditHeader := TScreenEditHeader.Create(Skin.ScoreBG);
// Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Edit Header', 3); Log.BenchmarkStart(3);
- ScreenOpen := TScreenOpen.Create('');
+ ScreenOpen := TScreenOpen.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Open', 3); Log.BenchmarkStart(3);
ScreenSingModi := TScreenSingModi.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Sing with Modi support', 3); Log.BenchmarkStart(3);
@@ -447,7 +447,7 @@ begin
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Stat Main', 3); Log.BenchmarkStart(3);
ScreenStatDetail := TScreenStatDetail.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Stat Detail', 3); Log.BenchmarkStart(3);
- ScreenCredits := TScreenCredits.Create('');
+ ScreenCredits := TScreenCredits.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Credits', 3); Log.BenchmarkStart(3);
end;
diff --git a/Game/Code/Classes/UThemes.pas b/Game/Code/Classes/UThemes.pas
index 90bab7c1..31081f23 100644
--- a/Game/Code/Classes/UThemes.pas
+++ b/Game/Code/Classes/UThemes.pas
@@ -142,8 +142,21 @@ type
DeSelectReflectionspacing : Real;
FadeTex: string;
FadeTexPos: integer;
+
+ //Button Collection Mod
+ Parent: Byte; //Number of the Button Collection this Button is assigned to. IF 0: No Assignement
+ end;
+
+ //Button Collection Mod
+ TThemeButtonCollection = record
+ Style: TThemeButton;
+ ChildCount: Byte; //No of assigned Childs
+ FirstChild: Byte; //No of Child on whose Interaction Position the Button should be
end;
+ AThemeButtonCollection = array of TThemeButtonCollection;
+ PAThemeButtonCollection = ^AThemeButtonCollection;
+
TThemeSelect = record
Tex: string;
TexSBG: string;
@@ -186,10 +199,14 @@ type
SkipX: integer;
end;
+ PThemeBasic = ^TThemeBasic;
TThemeBasic = class
Background: TThemeBackground;
Text: AThemeText;
Static: AThemeStatic;
+
+ //Button Collection Mod
+ ButtonCollection: AThemeButtonCollection;
end;
TThemeLoading = class(TThemeBasic)
@@ -199,15 +216,16 @@ type
TThemeMain = class(TThemeBasic)
ButtonSolo: TThemeButton;
-// ButtonMulti: TThemeButton;
+ ButtonMulti: TThemeButton;
+ ButtonStat: TThemeButton;
ButtonEditor: TThemeButton;
ButtonOptions: TThemeButton;
ButtonExit: TThemeButton;
TextDescription: TThemeText;
TextDescriptionLong: TThemeText;
- Description: array[0..4] of string;
- DescriptionLong: array[0..4] of string;
+ Description: array[0..5] of string;
+ DescriptionLong: array[0..5] of string;
end;
TThemeName = class(TThemeBasic)
@@ -604,12 +622,16 @@ type
end;
TTheme = class
+ private
{$IFDEF THEMESAVE}
ThemeIni: TIniFile;
{$ELSE}
ThemeIni: TMemIniFile;
{$ENDIF}
+ LastThemeBasic: TThemeBasic;
+ public
+
Loading: TThemeLoading;
Main: TThemeMain;
Name: TThemeName;
@@ -656,7 +678,9 @@ type
procedure ThemeLoadTexts(var ThemeText: AThemeText; Name: string);
procedure ThemeLoadStatic(var ThemeStatic: TThemeStatic; Name: string);
procedure ThemeLoadStatics(var ThemeStatic: AThemeStatic; Name: string);
- procedure ThemeLoadButton(var ThemeButton: TThemeButton; Name: string);
+ procedure ThemeLoadButton(var ThemeButton: TThemeButton; Name: string; const Collections: PAThemeButtonCollection = nil);
+ procedure ThemeLoadButtonCollection(var Collection: TThemeButtonCollection; Name: string);
+ procedure ThemeLoadButtonCollections(var Collections: AThemeButtonCollection; Name: string);
procedure ThemeLoadSelect(var ThemeSelect: TThemeSelect; Name: string);
procedure ThemeLoadSelectSlide(var ThemeSelectS: TThemeSelectSlide; Name: string);
@@ -692,7 +716,7 @@ uses
{{$IFDEF TRANSLATE}
ULanguage,
{{$ENDIF}
-USkins, UIni;
+USkins, UIni, Dialogs;
constructor TTheme.Create(FileName: string);
begin
@@ -830,24 +854,30 @@ begin
ThemeLoadText(Main.TextDescription, 'MainTextDescription');
ThemeLoadText(Main.TextDescriptionLong, 'MainTextDescriptionLong');
ThemeLoadButton(Main.ButtonSolo, 'MainButtonSolo');
+ ThemeLoadButton(Main.ButtonMulti, 'MainButtonMulti');
+ ThemeLoadButton(Main.ButtonStat, 'MainButtonStats');
ThemeLoadButton(Main.ButtonEditor, 'MainButtonEditor');
ThemeLoadButton(Main.ButtonOptions, 'MainButtonOptions');
ThemeLoadButton(Main.ButtonExit, 'MainButtonExit');
- //Score Text Translation Start
+ //Main Desc Text Translation Start
{{$IFDEF TRANSLATE}
Main.Description[0] := Language.Translate('SING_SING');
Main.DescriptionLong[0] := Language.Translate('SING_SING_DESC');
- Main.Description[1] := Language.Translate('SING_EDITOR');
- Main.DescriptionLong[1] := Language.Translate('SING_EDITOR_DESC');
- Main.Description[2] := Language.Translate('SING_GAME_OPTIONS');
- Main.DescriptionLong[2] := Language.Translate('SING_GAME_OPTIONS_DESC');
- Main.Description[3] := Language.Translate('SING_EXIT');
- Main.DescriptionLong[3] := Language.Translate('SING_EXIT_DESC');
+ Main.Description[1] := Language.Translate('SING_MULTI');
+ Main.DescriptionLong[1] := Language.Translate('SING_MULTI_DESC');
+ Main.Description[2] := Language.Translate('SING_STATS');
+ Main.DescriptionLong[2] := Language.Translate('SING_STATS_DESC');
+ Main.Description[3] := Language.Translate('SING_EDITOR');
+ Main.DescriptionLong[3] := Language.Translate('SING_EDITOR_DESC');
+ Main.Description[4] := Language.Translate('SING_GAME_OPTIONS');
+ Main.DescriptionLong[4] := Language.Translate('SING_GAME_OPTIONS_DESC');
+ Main.Description[5] := Language.Translate('SING_EXIT');
+ Main.DescriptionLong[5] := Language.Translate('SING_EXIT_DESC');
{{$ENDIF}
- //Score Text Translation End
+ //Main Desc Text Translation End
Main.TextDescription.Text := Main.Description[0];
Main.TextDescriptionLong.Text := Main.DescriptionLong[0];
@@ -931,14 +961,14 @@ begin
// Sing
ThemeLoadBasic(Sing, 'Sing');
- //moveable singbar mod
- ThemeLoadStatic(Sing.StaticP1SingBar, 'SingP1SingBar');
- ThemeLoadStatic(Sing.StaticP1TwoPSingBar, 'SingP1TwoPSingBar');
- ThemeLoadStatic(Sing.StaticP1ThreePSingBar, 'SingP1ThreePSingBar');
- ThemeLoadStatic(Sing.StaticP2RSingBar, 'SingP2RSingBar');
- ThemeLoadStatic(Sing.StaticP2MSingBar, 'SingP2MSingBar');
- ThemeLoadStatic(Sing.StaticP3SingBar, 'SingP3SingBar');
- //eoa moveable singbar
+ //moveable singbar mod
+ ThemeLoadStatic(Sing.StaticP1SingBar, 'SingP1SingBar');
+ ThemeLoadStatic(Sing.StaticP1TwoPSingBar, 'SingP1TwoPSingBar');
+ ThemeLoadStatic(Sing.StaticP1ThreePSingBar, 'SingP1ThreePSingBar');
+ ThemeLoadStatic(Sing.StaticP2RSingBar, 'SingP2RSingBar');
+ ThemeLoadStatic(Sing.StaticP2MSingBar, 'SingP2MSingBar');
+ ThemeLoadStatic(Sing.StaticP3SingBar, 'SingP3SingBar');
+ //eoa moveable singbar
ThemeLoadStatic(Sing.StaticP1, 'SingP1Static');
ThemeLoadText(Sing.TextP1, 'SingP1Text');
@@ -1315,6 +1345,9 @@ begin
ThemeLoadBackground(Theme.Background, Name);
ThemeLoadTexts(Theme.Text, Name + 'Text');
ThemeLoadStatics(Theme.Static, Name + 'Static');
+ ThemeLoadButtonCollections(Theme.ButtonCollection, Name + 'ButtonCollection');
+
+ LastThemeBasic := Theme;
end;
procedure TTheme.ThemeLoadBackground(var ThemeBackground: TThemeBackground; Name: string);
@@ -1417,11 +1450,40 @@ begin
end;
end;
-procedure TTheme.ThemeLoadButton(var ThemeButton: TThemeButton; Name: string);
+//Button Collection Mod
+procedure TTheme.ThemeLoadButtonCollection(var Collection: TThemeButtonCollection; Name: string);
+var T: Integer;
+begin
+ //Load Collection Style
+ ThemeLoadButton(Collection.Style, Name);
+
+ //Load Other Attributes
+ T := ThemeIni.ReadInteger (Name, 'FirstChild', 0);
+ if (T > 0) And (T < 256) then
+ Collection.FirstChild := T
+ else
+ Collection.FirstChild := 0;
+end;
+
+procedure TTheme.ThemeLoadButtonCollections(var Collections: AThemeButtonCollection; Name: string);
+var
+ I: integer;
+begin
+ I := 1;
+ while ThemeIni.SectionExists(Name + IntToStr(I)) do begin
+ SetLength(Collections, I);
+ ThemeLoadButtonCollection(Collections[I-1], Name + IntToStr(I));
+ Inc(I);
+ end;
+end;
+//End Button Collection Mod
+
+procedure TTheme.ThemeLoadButton(var ThemeButton: TThemeButton; Name: string; const Collections: PAThemeButtonCollection);
var
C: integer;
TLen: integer;
T: integer;
+ Collections2: PAThemeButtonCollection;
begin
DecimalSeparator := '.';
ThemeButton.Tex := ThemeIni.ReadString(Name, 'Tex', '');
@@ -1477,6 +1539,23 @@ begin
if (ThemeButton.FadeTexPos > 4) Or (ThemeButton.FadeTexPos < 0) then
ThemeButton.FadeTexPos := 0;
+ //Button Collection Mod
+ T := ThemeIni.ReadInteger(Name, 'Parent', 0);
+
+ //Set Collections to Last Basic Collections if no valid Value
+ if (Collections = nil) then
+ Collections2 := @LastThemeBasic.ButtonCollection
+ else
+ Collections2 := Collections;
+ //Test for valid Value
+ if (Collections2 <> nil) AND (T > 0) AND (T <= Length(Collections2^)) then
+ begin
+ Inc(Collections2^[T-1].ChildCount);
+ ThemeButton.Parent := T;
+ end
+ else
+ ThemeButton.Parent := 0;
+
//Read ButtonTexts
TLen := ThemeIni.ReadInteger(Name, 'Texts', 0);
SetLength(ThemeButton.Text, TLen);
diff --git a/Game/Code/Menu/UMenu.pas b/Game/Code/Menu/UMenu.pas
index 28ba17e7..fc217dba 100644
--- a/Game/Code/Menu/UMenu.pas
+++ b/Game/Code/Menu/UMenu.pas
@@ -3,7 +3,7 @@ unit UMenu;
interface
uses OpenGL12, SysUtils, UTexture, UMenuStatic, UMenuText, UMenuButton, UMenuSelect, UMenuSelectSlide,
- UMenuInteract, UThemes;
+ UMenuInteract, UThemes, UMenuButtonCollection;
type
{ Int16 = SmallInt;}
@@ -18,12 +18,13 @@ type
Button: array of TButton;
Selects: array of TSelect;
SelectsS: array of TSelectSlide;
+ ButtonCollection: Array of TButtonCollection;
BackImg: TTexture;
BackW: integer;
BackH: integer;
public
Text: array of TText;
- Static: array of TStatic;
+ Static: array of TStatic;
mX: integer; // mouse X
mY: integer; // mouse Y
@@ -33,14 +34,20 @@ type
destructor Destroy; override;
constructor Create; overload; virtual;
- constructor Create(Back: string); overload; virtual; // Back is a JPG resource name for background
- constructor Create(Back: string; W, H: integer); overload; virtual; // W and H are the number of overlaps
+ //constructor Create(Back: string); overload; virtual; // Back is a JPG resource name for background
+ //constructor Create(Back: string; W, H: integer); overload; virtual; // W and H are the number of overlaps
// interaction
procedure AddInteraction(Typ, Num: integer);
procedure SetInteraction(Num: integer);
property Interaction: integer read SelInteraction write SetInteraction;
+ //Procedure Load BG, Texts, Statics and Button Collections from ThemeBasic
+ procedure LoadFromTheme(const ThemeBasic: TThemeBasic);
+
+ procedure PrepareButtonCollections(const Collections: AThemeButtonCollection);
+ procedure AddButtonCollection(const ThemeCollection: TThemeButtonCollection; Const Num: Byte);
+
// background
procedure AddBackground(Name: string);
@@ -70,6 +77,7 @@ type
procedure AddButtonText(AddX, AddY: real; AddText: string); overload;
procedure AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; AddText: string); overload;
procedure AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; AddText: string); overload;
+ procedure AddButtonText(CustomButton: TButton; AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; AddText: string); overload;
// select
function AddSelect(ThemeSelect: TThemeSelect; var Data: integer; Values: array of string): integer; overload;
@@ -113,7 +121,8 @@ type
procedure SetAnimationProgress(Progress: real); virtual;
-
+ function IsSelectable(Int: Cardinal): Boolean;
+
procedure InteractNext; virtual;
procedure InteractCustom(CustomSwitch: integer); virtual;
procedure InteractPrev; virtual;
@@ -132,13 +141,14 @@ const
iSelect = 1;
iText = 2;
iSelectS = 3;
+ iBCollectionChild = 5;
// fBlack = 0; // fade type
// fWhite = 1;
implementation
-uses UMain, UDrawTexture, UGraphic, UDisplay, UCovers, USkins;
+uses UMain, UDrawTexture, UGraphic, UDisplay, UCovers, USkins, Dialogs;
destructor TMenu.Destroy;
begin
@@ -157,7 +167,7 @@ begin
//Set ButtonPos to Autoset Length
ButtonPos := -1;
end;
-
+{
constructor TMenu.Create(Back: String);
begin
inherited Create;
@@ -183,7 +193,7 @@ begin
BackImg.H := BackImg.H / H;
BackW := W;
BackH := H;
-end;
+end; }
procedure TMenu.AddInteraction(Typ, Num: integer);
var
@@ -204,25 +214,67 @@ begin
// set inactive
OldNum := Interactions[Interaction].Num;
OldTyp := Interactions[Interaction].Typ;
+
+ NewNum := Interactions[Num].Num;
+ NewTyp := Interactions[Num].Typ;
+
case OldTyp of
iButton: Button[OldNum].Selected := False;
iSelect: Selects[OldNum].Selected := False;
iText: Text[OldNum].Selected := False;
iSelectS: SelectsS[OldNum].Selected := False;
+ //Button Collection Mod
+ iBCollectionChild:
+ begin
+ Button[OldNum].Selected := False;
+
+ //Deselect Collection if Next Button is Not from Collection
+ if (NewTyp <> iButton) Or (Button[NewNum].Parent <> Button[OldNum].Parent) then
+ ButtonCollection[Button[OldNum].Parent-1].Selected := False;
+ end;
end;
// set active
SelInteraction := Num;
- NewNum := Interactions[Interaction].Num;
- NewTyp := Interactions[Interaction].Typ;
case NewTyp of
iButton: Button[NewNum].Selected := True;
iSelect: Selects[NewNum].Selected := True;
iText: Text[NewNum].Selected := True;
iSelectS: SelectsS[NewNum].Selected := True;
+
+ //Button Collection Mod
+ iBCollectionChild:
+ begin
+ Button[NewNum].Selected := True;
+ ButtonCollection[Button[NewNum].Parent-1].Selected := True;
+ end;
end;
end;
+//----------------------
+//LoadFromTheme - Load BG, Texts, Statics and
+//Button Collections from ThemeBasic
+//----------------------
+procedure TMenu.LoadFromTheme(const ThemeBasic: TThemeBasic);
+var
+ I: Integer;
+begin
+ //Add Button Collections (Set Button CollectionsLength)
+ //Button Collections are Created when the first ChildButton is Created
+ PrepareButtonCollections(ThemeBasic.ButtonCollection);
+
+
+ //Add Background
+ AddBackground(ThemeBasic.Background.Tex);
+
+ //Add Statics and Texts
+ for I := 0 to High(ThemeBasic.Static) do
+ AddStatic(ThemeBasic.Static[I]);
+
+ for I := 0 to High(ThemeBasic.Text) do
+ AddText(ThemeBasic.Text[I]);
+end;
+
procedure TMenu.AddBackground(Name: string);
begin
if Name <> '' then begin
@@ -235,6 +287,84 @@ begin
end;
end;
+//----------------------
+//PrepareButtonCollections:
+//Add Button Collections (Set Button CollectionsLength)
+//----------------------
+procedure TMenu.PrepareButtonCollections(const Collections: AThemeButtonCollection);
+var
+ I: Integer;
+begin
+ SetLength(ButtonCollection, Length(Collections));
+ For I := 0 to High(ButtonCollection) do
+ AddButtonCollection(Collections[I], I);
+end;
+
+//----------------------
+//AddButtonCollection:
+//Create a Button Collection;
+//----------------------
+procedure TMenu.AddButtonCollection(const ThemeCollection: TThemeButtonCollection; Const Num: Byte);
+var
+ BT, BTLen: Integer;
+begin
+ if (Num > High(ButtonCollection)) then
+ exit;
+
+ ButtonCollection[Num] := TButtonCollection.Create(Texture.GetTexture(Skin.GetTextureFileName(ThemeCollection.Style.Tex), ThemeCollection.Style.Typ, true)); // use cache texture
+
+ //Set Parent menu
+ ButtonCollection[Num].ScreenButton := @Self.Button;
+
+ //Set Attributes
+ ButtonCollection[Num].FirstChild := ThemeCollection.FirstChild;
+ ButtonCollection[Num].CountChilds := ThemeCollection.ChildCount;
+ ButtonCollection[Num].Parent := Num + 1;
+
+ //Set Style
+ ButtonCollection[Num].X := ThemeCollection.Style.X;
+ ButtonCollection[Num].Y := ThemeCollection.Style.Y;
+ ButtonCollection[Num].W := ThemeCollection.Style.W;
+ ButtonCollection[Num].H := ThemeCollection.Style.H;
+ ButtonCollection[Num].SelectColR := ThemeCollection.Style.ColR;
+ ButtonCollection[Num].SelectColG := ThemeCollection.Style.ColG;
+ ButtonCollection[Num].SelectColB := ThemeCollection.Style.ColB;
+ ButtonCollection[Num].SelectInt := ThemeCollection.Style.Int;
+ ButtonCollection[Num].DeselectColR := ThemeCollection.Style.DColR;
+ ButtonCollection[Num].DeselectColG := ThemeCollection.Style.DColG;
+ ButtonCollection[Num].DeselectColB := ThemeCollection.Style.DColB;
+ ButtonCollection[Num].DeselectInt := ThemeCollection.Style.DInt;
+ ButtonCollection[Num].Texture.TexX1 := 0;
+ ButtonCollection[Num].Texture.TexY1 := 0;
+ ButtonCollection[Num].Texture.TexX2 := 1;
+ ButtonCollection[Num].Texture.TexY2 := 1;
+ ButtonCollection[Num].SetSelect(false);
+
+ ButtonCollection[Num].Reflection := ThemeCollection.Style.Reflection;
+ ButtonCollection[Num].Reflectionspacing := ThemeCollection.Style.ReflectionSpacing;
+ ButtonCollection[Num].DeSelectReflectionspacing := ThemeCollection.Style.DeSelectReflectionSpacing;
+
+ ButtonCollection[Num].Z := ThemeCollection.Style.Z;
+
+ //Some Things from ButtonFading
+ ButtonCollection[Num].SelectH := ThemeCollection.Style.SelectH;
+ ButtonCollection[Num].SelectW := ThemeCollection.Style.SelectW;
+
+ ButtonCollection[Num].Fade := ThemeCollection.Style.Fade;
+ ButtonCollection[Num].FadeText := ThemeCollection.Style.FadeText;
+ ButtonCollection[Num].FadeTex := Texture.GetTexture(Skin.GetTextureFileName(ThemeCollection.Style.FadeTex), ThemeCollection.Style.Typ, true);
+ ButtonCollection[Num].FadeTexPos := ThemeCollection.Style.FadeTexPos;
+
+
+ BTLen := Length(ThemeCollection.Style.Text);
+ for BT := 0 to BTLen-1 do begin
+ AddButtonText(ButtonCollection[Num], ThemeCollection.Style.Text[BT].X, ThemeCollection.Style.Text[BT].Y,
+ ThemeCollection.Style.Text[BT].ColR, ThemeCollection.Style.Text[BT].ColG, ThemeCollection.Style.Text[BT].ColB,
+ ThemeCollection.Style.Text[BT].Font, ThemeCollection.Style.Text[BT].Size, ThemeCollection.Style.Text[BT].Align,
+ ThemeCollection.Style.Text[BT].Text);
+ end;
+end;
+
function TMenu.AddStatic(ThemeStatic: TThemeStatic): integer;
begin
Result := AddStatic(ThemeStatic.X, ThemeStatic.Y, ThemeStatic.W, ThemeStatic.H, ThemeStatic.Z,
@@ -415,6 +545,20 @@ begin
ThemeButton.Text[BT].Font, ThemeButton.Text[BT].Size, ThemeButton.Text[BT].Align,
ThemeButton.Text[BT].Text);
end;
+
+ //BAutton Collection Mod
+ if (ThemeButton.Parent <> 0) then
+ begin
+ //If Collection Exists then Change Interaction to Child Button
+ if (@ButtonCollection[ThemeButton.Parent-1] <> nil) then
+ begin
+ Interactions[High(Interactions)].Typ := iBCollectionChild;
+ Button[Result].Visible := False;
+ Button[Result].Parent := ThemeButton.Parent;
+ if (ButtonCollection[ThemeButton.Parent-1].Fade) then
+ Button[Result].Texture.Alpha := 0;
+ end;
+ end;
end;
function TMenu.AddButton(X, Y, W, H: real; Name: String): integer;
@@ -473,6 +617,10 @@ begin
Button[Result].Reflectionspacing := ReflectionSpacing;
Button[Result].DeSelectReflectionspacing := DeSelectReflectionSpacing;
+ //Button Collection Mod
+ Button[Result].Parent := 0;
+
+
// adds interaction
AddInteraction(iButton, Result);
Interaction := 0;
@@ -527,6 +675,10 @@ begin
for J := 0 to Length(Text) - 1 do
Text[J].Draw;
+ // Draw all ButtonCollections
+ For J := 0 to High(ButtonCollection) do
+ ButtonCollection[J].Draw;
+
// Second, we draw all of our buttons
for J := 0 to Length(Button) - 1 do
Button[J].Draw;
@@ -595,60 +747,68 @@ begin
SetLength(WidgetsRect, MinNumber);
end;}
+function TMenu.IsSelectable(Int: Cardinal): Boolean;
+begin
+ Result := True;
+ Case Interactions[Int].Typ of
+ //Button
+ iButton: Result := Button[Interactions[Int].Num].Visible and Button[Interactions[Int].Num].Selectable;
+ //Select
+ iSelect: Result := True;
+ //Select Slide
+ iSelectS: Result := SelectsS[Interactions[Int].Num].Visible;
+
+ //ButtonCollection Child
+ iBCollectionChild:
+ Result := (ButtonCollection[Button[Interactions[Int].Num].Parent - 1].FirstChild - 1 = Int) AND ((Interactions[Interaction].Typ <> iBCollectionChild) OR (Button[Interactions[Interaction].Num].Parent <> Button[Interactions[Int].Num].Parent));
+ end;
+end;
+
procedure TMenu.InteractNext;
var
- Num: integer;
- Typ: integer;
- Again: boolean;
+ Int: Integer;
begin
- Again := true;
+ Int := Interaction;
// change interaction as long as it's needed
- while (Again = true) do begin
- Num := (Interaction + 1) Mod Length(Interactions);
- Interaction := Num;
- Again := false; // reset, default to accept changing interaction
-
-
- // checking newly interacted element
- Num := Interactions[Interaction].Num;
- Typ := Interactions[Interaction].Typ;
- case Typ of
- iButton:
- begin
- if Button[Num].Selectable = false then Again := True;
- end;
- end; // case
- end; // while
+ repeat
+ Int := (Int + 1) Mod Length(Interactions);
+
+ //If no Interaction is Selectable Simply Select Next
+ if (Int = Interaction) then
+ begin
+ Int := (Int + 1) Mod Length(Interactions);
+ Break;
+ end;
+ Until IsSelectable(Int);
+
+ //Set Interaction
+ Interaction := Int;
end;
procedure TMenu.InteractPrev;
var
- Num: integer;
- Typ: integer;
- Again: boolean;
+ Int: Integer;
begin
- Again := true;
+ Int := Interaction;
// change interaction as long as it's needed
- while (Again = true) do begin
- Num := SelInteraction - 1;
- if Num = -1 then Num := High(Interactions);
- Interaction := Num;
- Again := false; // reset, default to accept changing interaction
-
- // checking newly interacted element
- Num := Interactions[Interaction].Num;
- Typ := Interactions[Interaction].Typ;
- case Typ of
- iButton:
- begin
- if Button[Num].Selectable = false then Again := True;
- end;
- end; // case
- end; // while
-
+ repeat
+ Int := Int - 1;
+ if Int = -1 then Int := High(Interactions);
+
+ //If no Interaction is Selectable Simply Select Next
+ if (Int = Interaction) then
+ begin
+ Int := SelInteraction - 1;
+ if Int = -1 then Int := High(Interactions);
+ Break;
+ end;
+ Until IsSelectable(Int);
+
+ //Set Interaction
+ Interaction := Int
end;
@@ -658,7 +818,9 @@ var
Typ: integer;
Again: boolean;
begin
- if num<0 then begin
+ //Code Commented atm, because it needs to be Rewritten
+ //it doesn't work with Button Collections
+ {then begin
CustomSwitch:= CustomSwitch*(-1);
Again := true;
// change interaction as long as it's needed
@@ -698,7 +860,7 @@ begin
end;
end; // case
end; // while
- end
+ end }
end;
@@ -746,6 +908,24 @@ begin
end;
end;
+procedure TMenu.AddButtonText(CustomButton: TButton; AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; AddText: string);
+var
+ Il: integer;
+begin
+ with CustomButton do begin
+ Il := Length(Text);
+ SetLength(Text, Il+1);
+ Text[Il] := TText.Create(X + AddX, Y + AddY, AddText);
+ Text[Il].ColR := ColR;
+ Text[Il].ColG := ColG;
+ Text[Il].ColB := ColB;
+ Text[Il].Int := 1;//0.5;
+ Text[Il].Style := Font;
+ Text[Il].Size := Size;
+ Text[Il].Align := Align;
+ end;
+end;
+
function TMenu.AddSelect(ThemeSelect: TThemeSelect; var Data: integer; Values: array of string): integer;
var
SO: integer;
@@ -1114,6 +1294,28 @@ begin
if Value <= High(SelectsS[Num].TextOptT) then
SelectsS[Num].SelectedOption := Value;
end;
+ //Button Collection Mod
+ iBCollectionChild:
+ begin
+
+ //Select Next Button in Collection
+ For Num := 1 to High(Button) do
+ begin
+ Value := (Interaction + Num) Mod Length(Button);
+ if Value = 0 then
+ begin
+ InteractNext;
+ Break;
+ end;
+ if (Button[Value].Parent = Button[Interaction].Parent) then
+ begin
+ Interaction := Value;
+ Break;
+ end;
+ end;
+ end;
+ //interact Next if there is Nothing to Change
+ else InteractNext;
end;
end;
@@ -1141,7 +1343,45 @@ begin
if Value >= 0 then
SelectsS[Num].SelectedOption := Value;
end;
- end
+ //Button Collection Mod
+ iBCollectionChild:
+ begin
+ //Select Prev Button in Collection
+ For Num := High(Button) downto 1 do
+ begin
+ Value := (Interaction + Num) Mod Length(Button);
+ if Value = High(Button) then
+ begin
+ InteractPrev;
+ Break;
+ end;
+ if (Button[Value].Parent = Button[Interaction].Parent) then
+ begin
+ Interaction := Value;
+ Break;
+ end;
+ end;
+ end;
+ //interact Prev if there is Nothing to Change
+ else
+ begin
+ InteractPrev;
+ //If ButtonCollection with more than 1 Entry then Select Last Entry
+ if (ButtonCollection[Button[Interactions[Interaction].Num].Parent-1].CountChilds > 1) then
+ begin
+ //Select Last Child
+ For Num := High(Button) downto 1 do
+ begin
+ Value := (Interaction + Num) Mod Length(Button);
+ if (Button[Value].Parent = Button[Interaction].Parent) then
+ begin
+ Interaction := Value;
+ Break;
+ end;
+ end;
+ end;
+ end;
+ end;
end;
procedure TMenu.AddBox(X, Y, W, H: real);
diff --git a/Game/Code/Menu/UMenuButton.pas b/Game/Code/Menu/UMenuButton.pas
index 34d45083..fde808e2 100644
--- a/Game/Code/Menu/UMenuButton.pas
+++ b/Game/Code/Menu/UMenuButton.pas
@@ -4,8 +4,9 @@ interface
uses TextGL, UTexture, OpenGL12, UMenuText;
type
+ CButton = class of TButton;
TButton = class
- private
+ protected
SelectBool: Boolean;
FadeProgress: Real;
@@ -14,9 +15,10 @@ type
DeSelectW: Real;
DeSelectH: Real;
PosX: Real;
- PosY: Real;
-
+ PosY: Real;
+
constructor Create(); overload;
+
public
Text: Array of TText;
Texture: TTexture; // Button Screen position and size
@@ -40,6 +42,9 @@ type
Selectable: boolean;
+ //No of the Parent Collection, 0 if in no Collection
+ Parent: Byte;
+
SelectColR: real;
SelectColG: real;
SelectColB: real;
@@ -60,7 +65,7 @@ type
procedure SetW(Value: real);
procedure SetH(Value: real);
- procedure SetSelect(Value: Boolean);
+ procedure SetSelect(Value: Boolean); virtual;
property X: real read PosX write SetX;
property Y: real read PosY write SetY;
property Z: real read Texture.z write Texture.z;
@@ -68,7 +73,7 @@ type
property H: real read DeSelectH write SetH;
property Selected: Boolean read SelectBool write SetSelect;
- procedure Draw;
+ procedure Draw; virtual;
constructor Create(Textura: TTexture); overload;
destructor Destroy; override;
@@ -250,6 +255,8 @@ begin
PosX := 0;
PosY := 0;
+
+ Parent := 0;
end;
// ***** Public methods ****** //
diff --git a/Game/Code/Menu/UMenuButtonCollection.pas b/Game/Code/Menu/UMenuButtonCollection.pas
new file mode 100644
index 00000000..66ac70fc
--- /dev/null
+++ b/Game/Code/Menu/UMenuButtonCollection.pas
@@ -0,0 +1,59 @@
+unit UMenuButtonCollection;
+
+interface
+uses UMenuButton;
+
+type
+ //----------------
+ //TButtonCollection
+ //No Extra Attributes or Functions ATM
+ //----------------
+ AButton = Array of TButton;
+ PAButton = ^AButton;
+ TButtonCollection = class(TButton)
+ //num of the First Button, that can be Selected
+ FirstChild: Byte;
+ CountChilds: Byte;
+
+ ScreenButton: PAButton;
+
+ procedure SetSelect(Value : Boolean); override;
+ procedure Draw; override;
+ end;
+
+implementation
+
+procedure TButtonCollection.SetSelect(Value : Boolean);
+var I: Integer;
+begin
+ inherited;
+
+ //Set Visible for Every Button that is a Child of this ButtonCollection
+ if (Not Fade) then
+ For I := 0 to High(ScreenButton^) do
+ if (ScreenButton^[I].Parent = Parent) then
+ ScreenButton^[I].Visible := Value;
+end;
+
+procedure TButtonCollection.Draw;
+var I: Integer;
+begin
+ inherited;
+ //If fading is activated, Fade Child Buttons
+ if (Fade) then
+ begin
+ For I := 0 to High(ScreenButton^) do
+ if (ScreenButton^[I].Parent = Parent) then
+ begin
+ if (FadeProgress < 0.5) then
+ ScreenButton^[I].Visible := SelectBool
+ else
+ ScreenButton^[I].Texture.Alpha := (FadeProgress-0.666)*3;
+ //ScreenButton^[I].Text[0].
+ end;
+ end;
+end;
+
+
+
+end.
diff --git a/Game/Code/Menu/UMenuInteract.pas b/Game/Code/Menu/UMenuInteract.pas
index 3f2960b8..43249e3e 100644
--- a/Game/Code/Menu/UMenuInteract.pas
+++ b/Game/Code/Menu/UMenuInteract.pas
@@ -4,7 +4,7 @@ interface
type
TInteract = record // for moving thru menu
- Typ: integer; // 0 - button, 1 - select
+ Typ: integer; // 0 - button, 1 - select, 2 - Text, 3 - Select SLide, 5 - ButtonCollection Child
Num: integer; // number of this item in proper list like buttons, selects
end;
diff --git a/Game/Code/Menu/UMenuText.pas b/Game/Code/Menu/UMenuText.pas
index abf3784c..4cb48cad 100644
--- a/Game/Code/Menu/UMenuText.pas
+++ b/Game/Code/Menu/UMenuText.pas
@@ -162,6 +162,7 @@ begin
//Look for Break before the Break
if (glTextWidth(PChar(Copy(Value, LastBreak, NextPos - LastBreak + 1))) > W) AND (NextPos-LastPos > 1) then
begin
+ isBreak := False;
//Not the First word after Break, so we don't have to break within a word
if (FirstWord > 1) then
begin
@@ -175,6 +176,7 @@ begin
end;
end;
+ isBreak := True;
//Add Break from Text
AddBreak(LastBreak, NextPos);
end
diff --git a/Game/Code/Screens/UScreenCredits.pas b/Game/Code/Screens/UScreenCredits.pas
index 2e5f4abc..0411c7b6 100644
--- a/Game/Code/Screens/UScreenCredits.pas
+++ b/Game/Code/Screens/UScreenCredits.pas
@@ -14,7 +14,7 @@ type
Credits_Alpha: Cardinal;
Fadeout: boolean;
- constructor Create(Back: String); override;
+ constructor Create; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
function Draw: boolean; override;
procedure onShow; override;
@@ -97,11 +97,11 @@ begin
end; //fi
end;
-constructor TScreenCredits.Create(Back: String);
+constructor TScreenCredits.Create;
var
I: integer;
begin
- inherited Create(Back);
+ inherited Create;
AddBackground(Theme.Loading.Background.Tex);
diff --git a/Game/Code/Screens/UScreenEdit.pas b/Game/Code/Screens/UScreenEdit.pas
index aa3301a7..00df0418 100644
--- a/Game/Code/Screens/UScreenEdit.pas
+++ b/Game/Code/Screens/UScreenEdit.pas
@@ -11,7 +11,7 @@ type
FadeOut: boolean;
Path: string;
FileName: string;}
- constructor Create(Back: String); override;
+ constructor Create; override;
procedure onShow; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
{ function Draw: boolean; override;
@@ -63,9 +63,9 @@ begin
end;
end;
-constructor TScreenEdit.Create(Back: String);
+constructor TScreenEdit.Create;
begin
- inherited Create(Back);
+ inherited Create;
AddButton(400-200, 100 + 0*70, 400, 40, Skin.GetTextureFileName('ButtonF'));
AddButtonText(10, 5, 0, 0, 0, 'Convert Midi to Txt');
// Button[High(Button)].Text[0].Size := 11;
diff --git a/Game/Code/Screens/UScreenEditConvert.pas b/Game/Code/Screens/UScreenEditConvert.pas
index 68742535..62a50b3e 100644
--- a/Game/Code/Screens/UScreenEditConvert.pas
+++ b/Game/Code/Screens/UScreenEditConvert.pas
@@ -58,7 +58,7 @@ type
procedure Extract;
procedure MidiFile1MidiEvent(event: PMidiEvent);
function SelectedNumber: integer;
- constructor Create(Back: String); override;
+ constructor Create; override;
procedure onShow; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
function Draw: boolean; override;
@@ -299,11 +299,11 @@ begin
MidiOut.PutShort(event.event, event.data1, event.data2);
end;
-constructor TScreenEditConvert.Create(Back: String);
+constructor TScreenEditConvert.Create;
var
P: integer;
begin
- inherited Create(Back);
+ inherited Create;
AddButton(40, 20, 100, 40, Skin.GetTextureFileName('ButtonF'));
AddButtonText(15, 5, 0, 0, 0, 'Open');
// Button[High(Button)].Text[0].Size := 11;
diff --git a/Game/Code/Screens/UScreenEditHeader.pas b/Game/Code/Screens/UScreenEditHeader.pas
index a601555a..dbdd186c 100644
--- a/Game/Code/Screens/UScreenEditHeader.pas
+++ b/Game/Code/Screens/UScreenEditHeader.pas
@@ -35,7 +35,7 @@ type
Sel: array[0..11] of boolean;
procedure SetRoundButtons;
- constructor Create(Back: String); override;
+ constructor Create; override;
procedure onShow; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
{ function Draw: boolean; override;
@@ -124,9 +124,9 @@ begin
end;
end;
-constructor TScreenEditHeader.Create(Back: String);
+constructor TScreenEditHeader.Create;
begin
- inherited Create(Back);
+ inherited Create;
AddButton(40, 20, 100, 40, Skin.GetTextureFileName('ButtonF'));
AddButtonText(15, 5, 'Open');
diff --git a/Game/Code/Screens/UScreenEditSub.pas b/Game/Code/Screens/UScreenEditSub.pas
index 6094edd1..a665ba1c 100644
--- a/Game/Code/Screens/UScreenEditSub.pas
+++ b/Game/Code/Screens/UScreenEditSub.pas
@@ -62,7 +62,7 @@ type
FadeOut: boolean;
Path: string;
FileName: string;
- constructor Create(Back: String); override;
+ constructor Create; override;
procedure onShow; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
function ParseInputEditText(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
@@ -1035,9 +1035,9 @@ begin
end;
-constructor TScreenEditSub.Create(Back: String);
+constructor TScreenEditSub.Create;
begin
- inherited Create(Back);
+ inherited Create;
SetLength(Player, 1);
// linijka
diff --git a/Game/Code/Screens/UScreenLevel.pas b/Game/Code/Screens/UScreenLevel.pas
index 28aa40ea..80d42773 100644
--- a/Game/Code/Screens/UScreenLevel.pas
+++ b/Game/Code/Screens/UScreenLevel.pas
@@ -68,18 +68,12 @@ var
begin
inherited Create;
- AddBackground(Theme.Level.Background.Tex);
+ LoadFromTheme(Theme.Level);
AddButton(Theme.Level.ButtonEasy);
AddButton(Theme.Level.ButtonMedium);
AddButton(Theme.Level.ButtonHard);
- for I := 0 to High(Theme.Level.Static) do
- AddStatic(Theme.Level.Static[I]);
-
- for I := 0 to High(Theme.Level.Text) do
- AddText(Theme.Level.Text[I]);
-
Interaction := 0;
end;
diff --git a/Game/Code/Screens/UScreenLoading.pas b/Game/Code/Screens/UScreenLoading.pas
index 5cc938bb..438b606e 100644
--- a/Game/Code/Screens/UScreenLoading.pas
+++ b/Game/Code/Screens/UScreenLoading.pas
@@ -9,7 +9,7 @@ type
TScreenLoading = class(TMenu)
public
Fadeout: boolean;
- constructor Create(Back: String); override;
+ constructor Create; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
function GetBGTexNum: GLUInt;
procedure onShow; override;
@@ -24,19 +24,11 @@ begin
Result := true;
end;
-constructor TScreenLoading.Create(Back: String);
-var
- I: integer;
+constructor TScreenLoading.Create;
begin
- inherited Create(Back);
+ inherited Create;
- AddBackground(Theme.Loading.Background.Tex);
-
- for I := 0 to High(Theme.Loading.Static) do
- AddStatic(Theme.Loading.Static[I]);
-
- for I := 0 to High(Theme.Loading.Text) do
- AddText(Theme.Loading.Text[I]);
+ LoadFromTheme(Theme.Loading);
Fadeout := false;
end;
diff --git a/Game/Code/Screens/UScreenMain.pas b/Game/Code/Screens/UScreenMain.pas
index 4c822640..49bd98ee 100644
--- a/Game/Code/Screens/UScreenMain.pas
+++ b/Game/Code/Screens/UScreenMain.pas
@@ -16,6 +16,8 @@ type
procedure onShow; override;
procedure InteractNext; override;
procedure InteractPrev; override;
+ procedure InteractInc; override;
+ procedure InteractDec; override;
procedure UpdateLCD;
procedure SetAnimationProgress(Progress: real); override;
//function Draw: boolean; override;
@@ -84,6 +86,7 @@ begin
SDLK_RETURN:
begin
+ //Solo
if (Interaction = 0) and (Length(Songs.Song) >= 1) then begin
Music.PlayStart;
if (Ini.Players >= 0) and (Ini.Players <= 3) then PlayersPlay := Ini.Players + 1;
@@ -92,23 +95,44 @@ begin
ScreenName.Goto_SingScreen := False;
FadeTo(@ScreenName);
end;
+
+ //Multi
if Interaction = 1 then begin
+ if (Ini.Players >= 1) AND (Length(DLLMan.Plugins)>=1) then
+ begin
+ Music.PlayStart;
+ FadeTo(@ScreenPartyOptions);
+ end;
+ end;
+
+ //Stats
+ if Interaction = 2 then begin
+ Music.PlayStart;
+ FadeTo(@ScreenStatMain);
+ end;
+
+ //Editor
+ if Interaction = 3 then begin
Music.PlayStart;
FadeTo(@ScreenEdit);
end;
- if Interaction = 2 then begin
+
+ //Options
+ if Interaction = 4 then begin
Music.PlayStart;
FadeTo(@ScreenOptions);
end;
- if Interaction = 3 then begin
+
+ //Exit
+ if Interaction = 5 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: InteractNext;
- SDLK_UP: InteractPrev;
+ SDLK_DOWN: InteractInc;
+ SDLK_UP: InteractDec;
SDLK_RIGHT: InteractNext;
SDLK_LEFT: InteractPrev;
end;
@@ -127,27 +151,28 @@ var
begin
inherited Create;
-// AddButton(400-200, 320, 400, 60, Skin.GameStart);
-// AddButton(400-200, 390, 400, 60, Skin.Editor);
-// AddButton(400-200, 460, 400, 60, Skin.Options);
-// AddButton(400-200, 530, 400, 60, Skin.Exit);
+ //----------------
+ //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);
- AddBackground(Theme.Main.Background.Tex);
+ LoadFromTheme(Theme.Main);
AddButton(Theme.Main.ButtonSolo);
+ AddButton(Theme.Main.ButtonMulti);
+ AddButton(Theme.Main.ButtonStat);
AddButton(Theme.Main.ButtonEditor);
AddButton(Theme.Main.ButtonOptions);
AddButton(Theme.Main.ButtonExit);
- for I := 0 to High(Theme.Main.Static) do
- AddStatic(Theme.Main.Static[I]);
-
- for I := 0 to High(Theme.Main.Text) do
- AddText(Theme.Main.Text[I]);
-
- TextDescription := AddText(Theme.Main.TextDescription);
- TextDescriptionLong := AddText(Theme.Main.TextDescriptionLong);
-
Interaction := 0;
end;
@@ -175,6 +200,24 @@ begin
Light.LightOne(0, 200);
end;
+procedure TScreenMain.InteractDec;
+begin
+ inherited InteractDec;
+ Text[TextDescription].Text := Theme.Main.Description[Interaction];
+ Text[TextDescriptionLong].Text := Theme.Main.DescriptionLong[Interaction];
+ UpdateLCD;
+ Light.LightOne(0, 200);
+end;
+
+procedure TScreenMain.InteractInc;
+begin
+ inherited InteractInc;
+ Text[TextDescription].Text := Theme.Main.Description[Interaction];
+ Text[TextDescriptionLong].Text := Theme.Main.DescriptionLong[Interaction];
+ UpdateLCD;
+ Light.LightOne(1, 200);
+end;
+
procedure TScreenMain.UpdateLCD;
begin
case Interaction of
diff --git a/Game/Code/Screens/UScreenName.pas b/Game/Code/Screens/UScreenName.pas
index e8bc2dd8..9819b994 100644
--- a/Game/Code/Screens/UScreenName.pas
+++ b/Game/Code/Screens/UScreenName.pas
@@ -76,17 +76,12 @@ var
begin
inherited Create;
- AddBackground(Theme.Name.Background.Tex);
+ LoadFromTheme(Theme.Name);
+
for I := 1 to 6 do
AddButton(Theme.Name.ButtonPlayer[I]);
- for I := 0 to High(Theme.Name.Static) do
- AddStatic(Theme.Name.Static[I]);
-
- for I := 0 to High(Theme.Name.Text) do
- AddText(Theme.Name.Text[I]);
-
Interaction := 0;
end;
diff --git a/Game/Code/Screens/UScreenOpen.pas b/Game/Code/Screens/UScreenOpen.pas
index 264f57a9..4f0c32c5 100644
--- a/Game/Code/Screens/UScreenOpen.pas
+++ b/Game/Code/Screens/UScreenOpen.pas
@@ -16,7 +16,7 @@ type
Path: string;
BackScreen: pointer;
procedure AddBox(X, Y, W, H: real);
- constructor Create(Back: String); override;
+ constructor Create; override;
procedure onShow; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
// function Draw: boolean; override;
@@ -90,9 +90,9 @@ begin
AddStatic(X+2, Y+2, W-4, H-4, 1, 1, 1, Skin.GetTextureFileName('Bar'), 'JPG', 'Font Black');
end;
-constructor TScreenOpen.Create(Back: String);
+constructor TScreenOpen.Create;
begin
- inherited Create(Back);
+ inherited Create;
// linijka
{ AddStatic(20, 10, 80, 30, 0, 0, 0, 'Bar', 'JPG', 'Font Black');
diff --git a/Game/Code/Screens/UScreenOptions.pas b/Game/Code/Screens/UScreenOptions.pas
index 0fffedac..f0229d8c 100644
--- a/Game/Code/Screens/UScreenOptions.pas
+++ b/Game/Code/Screens/UScreenOptions.pas
@@ -9,7 +9,7 @@ type
TScreenOptions = class(TMenu)
public
TextDescription: integer;
- constructor Create(Back: String); override;
+ constructor Create; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
procedure onShow; override;
procedure InteractNext; override;
@@ -80,88 +80,23 @@ begin
FadeTo(@ScreenMain);
end;
end;
- SDLK_LEFT:
- begin
- {case SelInteraction of
- 0: InteractCustom(+2);
- 1: InteractCustom(-1);
- 2: InteractCustom(-1);
- 3: InteractCustom(+2);
- 4: InteractCustom(-1);
- 5: InteractCustom(-1);
- end;}
- InteractPrev;
- end;
- SDLK_RIGHT:
- begin
- {case SelInteraction of
- 0: InteractCustom(+1);
- 1: InteractCustom(+1);
- 2: InteractCustom(-2);
- 3: InteractCustom(+1);
- 4: InteractCustom(+1);
- 5: InteractCustom(-2);
- end;}
- InteractNext;
- end;
- SDLK_UP:
- begin
- InteractPrev;
- {case SelInteraction of
- 0: InteractCustom(+3);
- 1: InteractCustom(+3);
- 2: InteractCustom(+3);
- 3: InteractCustom(-3);
- 4: InteractCustom(-3);
- 5: InteractCustom(-3);
- end; }
- end;
- SDLK_DOWN:
- begin
- {case SelInteraction of
- 0: InteractCustom(+3);
- 1: InteractCustom(+3);
- 2: InteractCustom(+3);
- 3: InteractCustom(-3);
- 4: InteractCustom(-3);
- 5: InteractCustom(-3);
- end; }
- InteractNext;
- end;
+ SDLK_DOWN: InteractInc;
+ SDLK_UP: InteractDec;
+ SDLK_RIGHT: InteractNext;
+ SDLK_LEFT: InteractPrev;
end;
end;
end;
-constructor TScreenOptions.Create(Back: String);
+constructor TScreenOptions.Create;
var
I: integer;
begin
- inherited Create(Back);
+ inherited Create;
- // Game
-{ AddButton(225, 100 + 0*60, 350, 50, Skin.Button, 'JPG', 'Transparent Range');
- AddButtonText(11, 10, 'Game');}
-
- // Graphics
-{ AddButton(225, 100 + 1*60, 350, 50, Skin.Button, 'JPG', 'Transparent Range');
- AddButtonText(11, 10, 'Graphics');
-
- // Sound
- AddButton(225, 100 + 2*60, 350, 50, Skin.Button, 'JPG', 'Transparent Range');
- AddButtonText(11, 10, 'Sound');
-
- // Lyrics
- AddButton(225, 100 + 3*60, 350, 50, Skin.Button, 'JPG', 'Transparent Range');
- AddButtonText(11, 10, 'Lyrics');
-
- // Themes
- AddButton(225, 100 + 4*60, 350, 50, Skin.Button, 'JPG', 'Transparent Range');
- AddButtonText(11, 10, 'Themes');
-
- // Exit
- AddButton(225, 100 + 6*60, 350, 50, Skin.Exit);}
+ TextDescription := AddText(Theme.Options.TextDescription);
- AddBackground(Theme.Options.Background.Tex);
+ LoadFromTheme(Theme.Options);
AddButton(Theme.Options.ButtonGame);
if (Length(Button[0].Text)=0) then
@@ -195,14 +130,6 @@ begin
if (Length(Button[7].Text)=0) then
AddButtonText(14, 20, Theme.Options.Description[7]);
- for I := 0 to High(Theme.Options.Static) do
- AddStatic(Theme.Options.Static[I]);
-
- for I := 0 to High(Theme.Options.Text) do
- AddText(Theme.Options.Text[I]);
-
- TextDescription := AddText(Theme.Options.TextDescription);
-
Interaction := 0;
end;
diff --git a/Game/Code/Screens/UScreenOptionsAdvanced.pas b/Game/Code/Screens/UScreenOptionsAdvanced.pas
index ed3bc164..256b02db 100644
--- a/Game/Code/Screens/UScreenOptionsAdvanced.pas
+++ b/Game/Code/Screens/UScreenOptionsAdvanced.pas
@@ -8,7 +8,7 @@ uses
type
TScreenOptionsAdvanced = class(TMenu)
public
- constructor Create(Back: String); override;
+ constructor Create; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
procedure onShow; override;
end;
@@ -59,19 +59,13 @@ begin
end;
end;
-constructor TScreenOptionsAdvanced.Create(Back: String);
+constructor TScreenOptionsAdvanced.Create;
var
I: integer;
begin
- inherited Create(Back);
+ inherited Create;
- AddBackground(Theme.OptionsAdvanced.Background.Tex);
-
- for I := 0 to High(Theme.OptionsAdvanced.Static) do
- AddStatic(Theme.OptionsAdvanced.Static[I]);
-
- for I := 0 to High(Theme.OptionsAdvanced.Text) do
- AddText(Theme.OptionsAdvanced.Text[I]);
+ LoadFromTheme(Theme.OptionsAdvanced);
AddSelect(Theme.OptionsAdvanced.SelectLoadAnimation, Ini.LoadAnimation, ILoadAnimation);
AddSelect(Theme.OptionsAdvanced.SelectScreenFade, Ini.ScreenFade, IScreenFade);
diff --git a/Game/Code/Screens/UScreenOptionsGame.pas b/Game/Code/Screens/UScreenOptionsGame.pas
index 63bbec36..88bb34e3 100644
--- a/Game/Code/Screens/UScreenOptionsGame.pas
+++ b/Game/Code/Screens/UScreenOptionsGame.pas
@@ -9,7 +9,7 @@ type
TScreenOptionsGame = class(TMenu)
public
old_Tabs, old_Sorting: integer;
- constructor Create(Back: String); override;
+ constructor Create; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
procedure onShow; override;
procedure RefreshSongs;
@@ -61,19 +61,13 @@ begin
end;
end;
-constructor TScreenOptionsGame.Create(Back: String);
+constructor TScreenOptionsGame.Create;
var
I: integer;
begin
- inherited Create(Back);
+ inherited Create;
- AddBackground(Theme.OptionsGame.Background.Tex);
-
- for I := 0 to High(Theme.OptionsGame.Static) do
- AddStatic(Theme.OptionsGame.Static[I]);
-
- for I := 0 to High(Theme.OptionsGame.Text) do
- AddText(Theme.OptionsGame.Text[I]);
+ LoadFromTheme(Theme.OptionsGame);
//Refresh Songs Patch
old_Sorting := Ini.Sorting;
diff --git a/Game/Code/Screens/UScreenOptionsGraphics.pas b/Game/Code/Screens/UScreenOptionsGraphics.pas
index 6152c9c0..b36bb7d3 100644
--- a/Game/Code/Screens/UScreenOptionsGraphics.pas
+++ b/Game/Code/Screens/UScreenOptionsGraphics.pas
@@ -8,7 +8,7 @@ uses
type
TScreenOptionsGraphics = class(TMenu)
public
- constructor Create(Back: String); override;
+ constructor Create; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
procedure onShow; override;
end;
@@ -66,19 +66,13 @@ begin
end;
end;
-constructor TScreenOptionsGraphics.Create(Back: String);
+constructor TScreenOptionsGraphics.Create;
var
I: integer;
begin
- inherited Create(Back);
+ inherited Create;
- AddBackground(Theme.OptionsGraphics.Background.Tex);
-
- for I := 0 to High(Theme.OptionsGraphics.Static) do
- AddStatic(Theme.OptionsGraphics.Static[I]);
-
- for I := 0 to High(Theme.OptionsGraphics.Text) do
- AddText(Theme.OptionsGraphics.Text[I]);
+ LoadFromTheme(Theme.OptionsGraphics);
AddSelectSlide(Theme.OptionsGraphics.SelectSlideResolution, Ini.Resolution, IResolution);
AddSelect(Theme.OptionsGraphics.SelectFullscreen, Ini.Fullscreen, IFullscreen);
diff --git a/Game/Code/Screens/UScreenOptionsLyrics.pas b/Game/Code/Screens/UScreenOptionsLyrics.pas
index 35cb2415..ff03b2ba 100644
--- a/Game/Code/Screens/UScreenOptionsLyrics.pas
+++ b/Game/Code/Screens/UScreenOptionsLyrics.pas
@@ -8,7 +8,7 @@ uses
type
TScreenOptionsLyrics = class(TMenu)
public
- constructor Create(Back: String); override;
+ constructor Create; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
procedure onShow; override;
end;
@@ -59,19 +59,13 @@ begin
end;
end;
-constructor TScreenOptionsLyrics.Create(Back: String);
+constructor TScreenOptionsLyrics.Create;
var
I: integer;
begin
- inherited Create(Back);
+ inherited Create;
- AddBackground(Theme.OptionsLyrics.Background.Tex);
-
- for I := 0 to High(Theme.OptionsLyrics.Static) do
- AddStatic(Theme.OptionsLyrics.Static[I]);
-
- for I := 0 to High(Theme.OptionsLyrics.Text) do
- AddText(Theme.OptionsLyrics.Text[I]);
+ LoadFromTheme(Theme.OptionsLyrics);
AddSelect(Theme.OptionsLyrics.SelectLyricsFont, Ini.LyricsFont, ILyricsFont);
AddSelect(Theme.OptionsLyrics.SelectLyricsEffect, Ini.LyricsEffect, ILyricsEffect);
diff --git a/Game/Code/Screens/UScreenOptionsRecord.pas b/Game/Code/Screens/UScreenOptionsRecord.pas
index 1d09d0b8..af7d2cd6 100644
--- a/Game/Code/Screens/UScreenOptionsRecord.pas
+++ b/Game/Code/Screens/UScreenOptionsRecord.pas
@@ -74,20 +74,8 @@ var
begin
inherited Create;
- AddBackground(Theme.OptionsRecord.Background.Tex);
- for I := 0 to High(Theme.OptionsRecord.Static) do
- AddStatic(Theme.OptionsRecord.Static[I]);
+ LoadFromTheme(Theme.OptionsRecord);
- for I := 0 to High(Theme.OptionsRecord.Text) do
- AddText(Theme.OptionsRecord.Text[I]);
-
-// SetLength(ICard, 0);
-// ICard[0] := 'karta';
-
-// SetLength(IInput, 0);
-// IInput[0] := 'wejscie';
-
-// if Length(Recording.SoundCard) > 0 then begin
SetLength(ICard, Length(Recording.SoundCard));
for SC := 0 to High(Recording.SoundCard) do
ICard[SC] := Recording.SoundCard[SC].Description;
diff --git a/Game/Code/Screens/UScreenOptionsSound.pas b/Game/Code/Screens/UScreenOptionsSound.pas
index aea6cdbc..ee53ef02 100644
--- a/Game/Code/Screens/UScreenOptionsSound.pas
+++ b/Game/Code/Screens/UScreenOptionsSound.pas
@@ -8,7 +8,7 @@ uses
type
TScreenOptionsSound = class(TMenu)
public
- constructor Create(Back: String); override;
+ constructor Create; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
procedure onShow; override;
end;
@@ -59,25 +59,18 @@ begin
end;
end;
-constructor TScreenOptionsSound.Create(Back: String);
+constructor TScreenOptionsSound.Create;
var
I: integer;
begin
- inherited Create(Back);
+ inherited Create;
- AddBackground(Theme.OptionsSound.Background.Tex);
-
- for I := 0 to High(Theme.OptionsSound.Static) do
- AddStatic(Theme.OptionsSound.Static[I]);
-
- for I := 0 to High(Theme.OptionsSound.Text) do
- AddText(Theme.OptionsSound.Text[I]);
+ LoadFromTheme(Theme.OptionsSound);
AddSelect(Theme.OptionsSound.SelectMicBoost, Ini.MicBoost, IMicBoost);
AddSelect(Theme.OptionsSound.SelectClickAssist, Ini.ClickAssist, IClickAssist);
AddSelect(Theme.OptionsSound.SelectBeatClick, Ini.BeatClick, IBeatClick);
AddSelect(Theme.OptionsSound.SelectThreshold, Ini.Threshold, IThreshold);
- //AddSelect(Theme.OptionsSound.SelectTwoPlayerMode, Ini.TwoPlayerMode, ITwoPlayerMode);
AddButton(Theme.OptionsSound.ButtonExit);
if (Length(Button[0].Text)=0) then
diff --git a/Game/Code/Screens/UScreenOptionsThemes.pas b/Game/Code/Screens/UScreenOptionsThemes.pas
index 151913be..c0bf2e15 100644
--- a/Game/Code/Screens/UScreenOptionsThemes.pas
+++ b/Game/Code/Screens/UScreenOptionsThemes.pas
@@ -9,7 +9,7 @@ type
TScreenOptionsThemes = class(TMenu)
public
SkinSelect: Integer;
- constructor Create(Back: String); override;
+ constructor Create; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
procedure onShow; override;
procedure InteractInc; override;
@@ -84,19 +84,13 @@ begin
end;
end;
-constructor TScreenOptionsThemes.Create(Back: String);
+constructor TScreenOptionsThemes.Create;
var
I: integer;
begin
- inherited Create(Back);
+ inherited Create;
- AddBackground(Theme.OptionsThemes.Background.Tex);
-
- for I := 0 to High(Theme.OptionsThemes.Static) do
- AddStatic(Theme.OptionsThemes.Static[I]);
-
- for I := 0 to High(Theme.OptionsThemes.Text) do
- AddText(Theme.OptionsThemes.Text[I]);
+ LoadFromTheme(Theme.OptionsThemes);
AddSelectSlide(Theme.OptionsThemes.SelectTheme, Ini.Theme, ITheme);
diff --git a/Game/Code/Screens/UScreenPartyNewRound.pas b/Game/Code/Screens/UScreenPartyNewRound.pas
index b268e04f..cf643310 100644
--- a/Game/Code/Screens/UScreenPartyNewRound.pas
+++ b/Game/Code/Screens/UScreenPartyNewRound.pas
@@ -116,9 +116,6 @@ var
begin
inherited Create;
- AddBackground(Theme.PartyNewRound.Background.Tex);
- Log.LogError(Theme.PartyNewRound.Background.Tex);
-
TextRound1 := AddText (Theme.PartyNewRound.TextRound1);
TextRound2 := AddText (Theme.PartyNewRound.TextRound2);
TextRound3 := AddText (Theme.PartyNewRound.TextRound3);
@@ -161,15 +158,7 @@ begin
StaticTeam2 := AddStatic (Theme.PartyNewRound.StaticTeam2);
StaticTeam3 := AddStatic (Theme.PartyNewRound.StaticTeam3);
- AddButton (Theme.PartyNewRound.ButtonNext);
-
- for I := 0 to High(Theme.PartyNewRound.Static) do
- AddStatic(Theme.PartyNewRound.Static[I]);
-
- for I := 0 to High(Theme.PartyNewRound.Text) do
- AddText(Theme.PartyNewRound.Text[I]);
-
- Interaction := 0;
+ LoadFromTheme(Theme.PartyNewRound);
end;
procedure TScreenPartyNewRound.onShow;
diff --git a/Game/Code/Screens/UScreenPartyOptions.pas b/Game/Code/Screens/UScreenPartyOptions.pas
index fd7b5107..f0df9871 100644
--- a/Game/Code/Screens/UScreenPartyOptions.pas
+++ b/Game/Code/Screens/UScreenPartyOptions.pas
@@ -45,37 +45,6 @@ uses UGraphic, UMain, UIni, UTexture, ULanguage, UParty, UDLLManager, UPlaylist,
function TScreenPartyOptions.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
var
I, J: Integer;
-
- function IsVisible: Boolean;
- begin
- Result := True;
- if (Interactions[Interaction].Typ = 0) then
- begin
- Result := Button[Interactions[Interaction].Num].Visible;
- end
- else if (Interactions[Interaction].Typ = 1) then
- begin
- //Result := Selects[Interactions[Interaction].Num].Visible;
- end
- else if (Interactions[Interaction].Typ = 3) then
- begin
- Result := SelectsS[Interactions[Interaction].Num].Visible;
- end;
- end;
-
- Procedure SelectNext;
- begin
- repeat
- InteractNext;
- until IsVisible;
- end;
-
- Procedure SelectPrev;
- begin
- repeat
- InteractPrev;
- until IsVisible;
- end;
begin
Result := true;
If (PressedDown) Then
@@ -137,8 +106,8 @@ begin
// 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: SelectNext;
- SDLK_UP: SelectPrev;
+ SDLK_DOWN: InteractNext;
+ SDLK_UP: InteractPrev;
SDLK_RIGHT:
begin
Music.PlayOption;
@@ -193,6 +162,7 @@ begin
SetLength(IPlaylist2, 1);
IPlaylist2[0] := '---';
+ //Clear all Selects
NumTeams := 0;
NumPlayer1 := 0;
NumPlayer2 := 0;
@@ -201,7 +171,8 @@ begin
PlayList := 0;
PlayList2 := 0;
- AddBackground(Theme.PartyOptions.Background.Tex);
+ //Load Screen From Theme
+ LoadFromTheme(Theme.PartyOptions);
SelectLevel := AddSelectSlide (Theme.PartyOptions.SelectLevel, Ini.Difficulty, Theme.ILevel);
SelectPlayList := AddSelectSlide (Theme.PartyOptions.SelectPlayList, PlayList, IPlaylist);
@@ -212,12 +183,6 @@ begin
SelectPlayers2 := AddSelectSlide (Theme.PartyOptions.SelectPlayers2, NumPlayer2, IPlayers);
SelectPlayers3 := AddSelectSlide (Theme.PartyOptions.SelectPlayers3, NumPlayer3, IPlayers);
- for I := 0 to High(Theme.PartyOptions.Static) do
- AddStatic(Theme.PartyOptions.Static[I]);
-
- for I := 0 to High(Theme.PartyOptions.Text) do
- AddText(Theme.PartyOptions.Text[I]);
-
Interaction := 0;
//Hide Team3 Players
diff --git a/Game/Code/Screens/UScreenPartyPlayer.pas b/Game/Code/Screens/UScreenPartyPlayer.pas
index 02f87710..d6e13d65 100644
--- a/Game/Code/Screens/UScreenPartyPlayer.pas
+++ b/Game/Code/Screens/UScreenPartyPlayer.pas
@@ -108,7 +108,7 @@ var
begin
inherited Create;
- AddBackground(Theme.PartyPlayer.Background.Tex);
+ LoadFromTheme(Theme.PartyPlayer);
Team1Name := AddButton(Theme.PartyPlayer.Team1Name);
AddButton(Theme.PartyPlayer.Player1Name);
@@ -128,12 +128,6 @@ begin
AddButton(Theme.PartyPlayer.Player11Name);
AddButton(Theme.PartyPlayer.Player12Name);
- for I := 0 to High(Theme.PartyPlayer.Static) do
- AddStatic(Theme.PartyPlayer.Static[I]);
-
- for I := 0 to High(Theme.PartyPlayer.Text) do
- AddText(Theme.PartyPlayer.Text[I]);
-
Interaction := 0;
end;
diff --git a/Game/Code/Screens/UScreenPartyScore.pas b/Game/Code/Screens/UScreenPartyScore.pas
index 142ec947..805525a1 100644
--- a/Game/Code/Screens/UScreenPartyScore.pas
+++ b/Game/Code/Screens/UScreenPartyScore.pas
@@ -72,8 +72,6 @@ var
begin
inherited Create;
- AddBackground(Theme.PartyScore.Background.Tex);
-
TextScoreTeam1 := AddText (Theme.PartyScore.TextScoreTeam1);
TextScoreTeam2 := AddText (Theme.PartyScore.TextScoreTeam2);
TextScoreTeam3 := AddText (Theme.PartyScore.TextScoreTeam3);
@@ -87,11 +85,7 @@ begin
TextWinner := AddText (Theme.PartyScore.TextWinner);
- for I := 0 to High(Theme.PartyScore.Static) do
- AddStatic(Theme.PartyScore.Static[I]);
-
- for I := 0 to High(Theme.PartyScore.Text) do
- AddText(Theme.PartyScore.Text[I]);
+ LoadFromTheme(Theme.PartyScore);
end;
procedure TScreenPartyScore.onShow;
diff --git a/Game/Code/Screens/UScreenPartyWin.pas b/Game/Code/Screens/UScreenPartyWin.pas
index ac5f38d9..ff65e82f 100644
--- a/Game/Code/Screens/UScreenPartyWin.pas
+++ b/Game/Code/Screens/UScreenPartyWin.pas
@@ -61,8 +61,6 @@ var
begin
inherited Create;
- AddBackground(Theme.PartyWin.Background.Tex);
-
TextScoreTeam1 := AddText (Theme.PartyWin.TextScoreTeam1);
TextScoreTeam2 := AddText (Theme.PartyWin.TextScoreTeam2);
TextScoreTeam3 := AddText (Theme.PartyWin.TextScoreTeam3);
@@ -76,11 +74,7 @@ begin
TextWinner := AddText (Theme.PartyWin.TextWinner);
- for I := 0 to High(Theme.PartyWin.Static) do
- AddStatic(Theme.PartyWin.Static[I]);
-
- for I := 0 to High(Theme.PartyWin.Text) do
- AddText(Theme.PartyWin.Text[I]);
+ LoadFromTheme(Theme.PartyWin);
end;
procedure TScreenPartyWin.onShow;
diff --git a/Game/Code/Screens/UScreenScore.pas b/Game/Code/Screens/UScreenScore.pas
index 72c42cb8..af1ccb59 100644
--- a/Game/Code/Screens/UScreenScore.pas
+++ b/Game/Code/Screens/UScreenScore.pas
@@ -40,7 +40,7 @@ type
Animation: real;
Fadeout: boolean;
- constructor Create(Back: String); override;
+ constructor Create; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
procedure onShow; override;
function Draw: boolean; override;
@@ -92,60 +92,14 @@ begin
end;
end;
-constructor TScreenScore.Create(Back: String);
+constructor TScreenScore.Create;
var
P: integer;
I, C: integer;
begin
- inherited Create(Back);
+ inherited Create;
- // background arrows sorted from farthest to nearest
-{ AddStatic(-2000 + 400, 100, 360, 60, 1, 1, 1, Skin.Arrow2, 'JPG', 'Arrow');
- AddStatic(-2000 + -50, 200, 420, 70, 1, 1, 1, Skin.Arrow, 'JPG', 'Arrow');
- AddStatic(-2000 + 90, 30, 500, 90, 1, 1, 1, Skin.Arrow, 'JPG', 'Arrow');
- AddStatic(-2000 + -250, 100, 800, 150, 1, 1, 1, Skin.Arrow, 'JPG', 'Arrow');
-
- Static[0].Texture.Rot := 100 * pi/180;
- Static[1].Texture.Rot := 7 * pi/180;
- Static[2].Texture.Rot := 35 * pi/180;
-
-
- // main arrow with text
- AddStatic(0, 340, 1000, 180, 1, 1, 1, Skin.Arrow2, 'JPG', 'Arrow');
-// AddText(450, 409, 4, 15, 1, 1, 1, 'Smile');
- AddText(450, 409, 4, 15, 1, 1, 1, 'Let''s see the results');
- Text[0].Y := 401;
-
- Static[4].Texture.Rot := -3 * pi/180;
-
-
- // two mid arrows
- AddStatic(-2000 + -250, 100, 800, 150, 1, 1, 1, Skin.Arrow, 'JPG', 'Arrow');
- AddStatic(-2000 + -250, 100, 800, 150, 1, 1, 1, Skin.Arrow, 'JPG', 'Arrow');
-
-
- // last arrow
- AddStatic(-2000, 340, 1100, 180, 1, 1, 1, Skin.Arrow2, 'JPG', 'Arrow');
-// AddText(-2000, 407, 4, 17, 1, 1, 1, 'SHUFFLE !');
- AddText(-2000, 407, 4, 15, 1, 1, 1, 'SHUFFLE !');
-
- Static[7].Texture.Rot := 184 * pi/180;
-
- // score text
- AddText(-2000, 407, 4, 17, 1, 1, 1, '10010 points');
- AddText(-2000, 407, 4, 17, 1, 1, 1, 'Cheater');
-
- Fadeout := false;}
-
-
- // Singstar Theme
- AddBackground(Theme.Score.Background.Tex);
-
- for I := 0 to High(Theme.Score.Static) do
- AddStatic(Theme.Score.Static[I]);
-
- for I := 0 to High(Theme.Score.Text) do
- AddText(Theme.Score.Text[I]);
+ LoadFromTheme(Theme.Score);
TextArtist := AddText(Theme.Score.TextArtist);
TextTitle := AddText(Theme.Score.TextTitle);
diff --git a/Game/Code/Screens/UScreenSing.pas b/Game/Code/Screens/UScreenSing.pas
index cca398a1..93c3ac48 100644
--- a/Game/Code/Screens/UScreenSing.pas
+++ b/Game/Code/Screens/UScreenSing.pas
@@ -163,13 +163,7 @@ var
begin
inherited Create;
- AddBackground(Theme.Sing.Background.Tex);
-
- for I := 0 to High(Theme.Sing.Static) do
- AddStatic(Theme.Sing.Static[I]);
-
- for I := 0 to High(Theme.Sing.Text) do
- AddText(Theme.Sing.Text[I]);
+ LoadFromTheme(Theme.Sing);
// time
TextTime := AddText(75, 14, 1, 8, 0.25, 0.25, 0.25, '00:00');
diff --git a/Game/Code/Screens/UScreenSong.pas b/Game/Code/Screens/UScreenSong.pas
index 16ac46ab..5c383168 100644
--- a/Game/Code/Screens/UScreenSong.pas
+++ b/Game/Code/Screens/UScreenSong.pas
@@ -630,13 +630,7 @@ begin
// AddStatic(200, 10, 400, 90, Skin.SelectSong);
// AddStatic(200-10, 140-5, 400+20, 50+10, Skin.Selection, 'JPG', 'Font Gray');
- AddBackground(Theme.Song.Background.Tex);
-
- for I := 0 to High(Theme.Song.Static) do
- AddStatic(Theme.Song.Static[I]);
-
- for I := 0 to High(Theme.Song.Text) do
- AddText(Theme.Song.Text[I]);
+ LoadFromTheme(Theme.Song);
TextArtist := AddText(Theme.Song.TextArtist);
TextTitle := AddText(Theme.Song.TextTitle);
diff --git a/Game/Code/Screens/UScreenSongJumpto.pas b/Game/Code/Screens/UScreenSongJumpto.pas
index 123146c7..b90c558b 100644
--- a/Game/Code/Screens/UScreenSongJumpto.pas
+++ b/Game/Code/Screens/UScreenSongJumpto.pas
@@ -154,7 +154,9 @@ var
begin
inherited Create;
- AddBackground(Theme.SongJumpto.Background.Tex);
+ AddText(Theme.SongJumpto.TextFound);
+
+ LoadFromTheme(Theme.SongJumpto);
AddButton(Theme.SongJumpto.ButtonSearchText);
if (Length(Button[0].Text) = 0) then
@@ -163,13 +165,6 @@ begin
SelectType := 0;
AddSelectSlide(Theme.SongJumpto.SelectSlideType, SelectType, Theme.SongJumpto.IType);
- AddText(Theme.SongJumpto.TextFound);
-
- for I := 0 to High(Theme.SongJumpto.Static) do
- AddStatic(Theme.SongJumpto.Static[I]);
-
- for I := 0 to High(Theme.SongJumpto.Text) do
- AddText(Theme.SongJumpto.Text[I]);
Interaction := 0;
LastPlayed := 0;
diff --git a/Game/Code/Screens/UScreenSongMenu.pas b/Game/Code/Screens/UScreenSongMenu.pas
index d4ad8016..fd875527 100644
--- a/Game/Code/Screens/UScreenSongMenu.pas
+++ b/Game/Code/Screens/UScreenSongMenu.pas
@@ -45,36 +45,6 @@ implementation
uses UGraphic, UMain, UIni, UTexture, ULanguage, UParty, UPlaylist;
function TScreenSongMenu.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
- function IsVisible: Boolean;
- begin
- Result := True;
- if (Interactions[Interaction].Typ = 0) then
- begin
- Result := Button[Interactions[Interaction].Num].Visible;
- end
- else if (Interactions[Interaction].Typ = 1) then
- begin
- //Result := Selects[Interactions[Interaction].Num].Visible;
- end
- else if (Interactions[Interaction].Typ = 3) then
- begin
- Result := SelectsS[Interactions[Interaction].Num].Visible;
- end;
- end;
-
- Procedure SelectNext;
- begin
- repeat
- InteractNext;
- until IsVisible;
- end;
-
- Procedure SelectPrev;
- begin
- repeat
- InteractPrev;
- until IsVisible;
- end;
begin
Result := true;
If (PressedDown) Then
@@ -113,8 +83,8 @@ begin
HandleReturn;
end;
- SDLK_DOWN: SelectNext;
- SDLK_UP: SelectPrev;
+ SDLK_DOWN: InteractNext;
+ SDLK_UP: InteractPrev;
SDLK_RIGHT:
begin
@@ -141,10 +111,15 @@ var
I: integer;
begin
inherited Create;
+
+ //Create Dummy SelectSlide Entrys
SetLength(ISelections, 1);
ISelections[0] := 'Dummy';
- AddBackground(Theme.SongMenu.Background.Tex);
+
+ AddText(Theme.SongMenu.TextMenu);
+
+ LoadFromTheme(Theme.SongMenu);
AddButton(Theme.SongMenu.Button1);
if (Length(Button[0].Text) = 0) then
@@ -164,13 +139,6 @@ begin
if (Length(Button[3].Text) = 0) then
AddButtonText(14, 20, 'Button 4');
- AddText(Theme.SongMenu.TextMenu);
-
- for I := 0 to High(Theme.SongMenu.Static) do
- AddStatic(Theme.SongMenu.Static[I]);
-
- for I := 0 to High(Theme.SongMenu.Text) do
- AddText(Theme.SongMenu.Text[I]);
Interaction := 0;
end;
diff --git a/Game/Code/Screens/UScreenStatDetail.pas b/Game/Code/Screens/UScreenStatDetail.pas
index dc4a0f1f..1461a9da 100644
--- a/Game/Code/Screens/UScreenStatDetail.pas
+++ b/Game/Code/Screens/UScreenStatDetail.pas
@@ -102,7 +102,15 @@ var
begin
inherited Create;
- AddBackground(Theme.StatDetail.Background.Tex);
+ for I := 0 to High(Theme.StatDetail.TextList) do
+ AddText(Theme.StatDetail.TextList[I]);
+
+ Count := Length(Theme.StatDetail.TextList);
+
+ AddText(Theme.StatDetail.TextDescription);
+ AddText(Theme.StatDetail.TextPage);
+
+ LoadFromTheme(Theme.StatDetail);
AddButton(Theme.StatDetail.ButtonNext);
if (Length(Button[0].Text)=0) then
@@ -120,22 +128,6 @@ begin
if (Length(Button[3].Text)=0) then
AddButtonText(14, 20, Theme.Options.Description[7]);
- for I := 0 to High(Theme.StatDetail.TextList) do
- AddText(Theme.StatDetail.TextList[I]);
-
- Count := Length(Theme.StatDetail.TextList);
-
- AddText(Theme.StatDetail.TextDescription);
- AddText(Theme.StatDetail.TextPage);
-
- for I := 0 to High(Theme.StatDetail.Static) do
- AddStatic(Theme.StatDetail.Static[I]);
-
- for I := 0 to High(Theme.StatDetail.Text) do
- AddText(Theme.StatDetail.Text[I]);
-
-
-
Interaction := 0;
Typ := 0;
end;
diff --git a/Game/Code/Screens/UScreenStatMain.pas b/Game/Code/Screens/UScreenStatMain.pas
index 337ed745..219ccd57 100644
--- a/Game/Code/Screens/UScreenStatMain.pas
+++ b/Game/Code/Screens/UScreenStatMain.pas
@@ -80,7 +80,9 @@ var
begin
inherited Create;
- AddBackground(Theme.StatMain.Background.Tex);
+ TextOverview := AddText(Theme.StatMain.TextOverview);
+
+ LoadFromTheme(Theme.StatMain);
AddButton(Theme.StatMain.ButtonScores);
if (Length(Button[0].Text)=0) then
@@ -102,16 +104,9 @@ begin
if (Length(Button[4].Text)=0) then
AddButtonText(14, 20, Theme.Options.Description[4]);
- TextOverview := AddText(Theme.StatMain.TextOverview);
-
- for I := 0 to High(Theme.StatMain.Static) do
- AddStatic(Theme.StatMain.Static[I]);
-
- for I := 0 to High(Theme.StatMain.Text) do
- AddText(Theme.StatMain.Text[I]);
-
Interaction := 0;
+ //Set Songs with Vid
SongswithVid := 0;
For I := 0 to high(Songs.Song) do
if (Songs.Song[I].Video <> '') AND FileExists(Songs.Song[I].Path + Songs.Song[I].Video) then
diff --git a/Game/Code/Screens/UScreenTop5.pas b/Game/Code/Screens/UScreenTop5.pas
index 94f3de1e..4d542bf0 100644
--- a/Game/Code/Screens/UScreenTop5.pas
+++ b/Game/Code/Screens/UScreenTop5.pas
@@ -58,13 +58,7 @@ var
begin
inherited Create;
- AddBackground(Theme.Top5.Background.Tex);
-
- for I := 0 to High(Theme.Top5.Static) do
- AddStatic(Theme.Top5.Static[I]);
-
- for I := 0 to High(Theme.Top5.Text) do
- AddText(Theme.Top5.Text[I]);
+ LoadFromTheme(Theme.Top5);
TextLevel := AddText(Theme.Top5.TextLevel);
diff --git a/Game/Code/UltraStar.dpr b/Game/Code/UltraStar.dpr
index 0db37635..b7466d84 100644
--- a/Game/Code/UltraStar.dpr
+++ b/Game/Code/UltraStar.dpr
@@ -6,6 +6,9 @@ program UltraStar;
{$R 'UltraStar.res' 'UltraStar.rc'}
uses
+ //------------------------------
+ //Includes - Menu System
+ //------------------------------
UDisplay in 'Menu\UDisplay.pas',
UMenu in 'Menu\UMenu.pas',
UMenuStatic in 'Menu\UMenuStatic.pas',
@@ -15,6 +18,11 @@ uses
UMenuSelect in 'Menu\UMenuSelect.pas',
UMenuSelectSlide in 'Menu\UMenuSelectSlide.pas',
UDrawTexture in 'Menu\UDrawTexture.pas',
+ UMenuButtonCollection in 'Menu\UMenuButtonCollection.pas',
+
+ //------------------------------
+ //Includes - Classes
+ //------------------------------
UGraphic in 'Classes\UGraphic.pas',
UTexture in 'Classes\UTexture.pas',
UMusic in 'Classes\UMusic.pas',
@@ -43,6 +51,10 @@ uses
UDLLManager in 'Classes\UDLLManager.pas',
UParty in 'Classes\UParty.pas',
UPlaylist in 'Classes\UPlaylist.pas',
+
+ //------------------------------
+ //Includes - Screens
+ //------------------------------
UScreenLoading in 'Screens\UScreenLoading.pas',
UScreenWelcome in 'Screens\UScreenWelcome.pas',
UScreenMain in 'Screens\UScreenMain.pas',
@@ -69,14 +81,26 @@ uses
UScreenSongJumpto in 'Screens\UScreenSongJumpto.pas',
UScreenStatMain in 'Screens\UScreenStatMain.pas',
UScreenStatDetail in 'Screens\UScreenStatDetail.pas',
+ UScreenCredits in 'Screens\UScreenCredits.pas',
+
+ //------------------------------
+ //Includes - Screens PartyMode
+ //------------------------------
UScreenSingModi in 'Screens\UScreenSingModi.pas',
UScreenPartyNewRound in 'Screens\UScreenPartyNewRound.pas',
UScreenPartyScore in 'Screens\UScreenPartyScore.pas',
UScreenPartyPlayer in 'Screens\UScreenPartyPlayer.pas',
UScreenPartyOptions in 'Screens\UScreenPartyOptions.pas',
UScreenPartyWin in 'Screens\UScreenPartyWin.pas',
+
+ //------------------------------
+ //Includes - Modi SDK
+ //------------------------------
ModiSDK in '..\..\Modis\SDK\ModiSDK.pas',
- UScreenCredits in 'Screens\UScreenCredits.pas',
+
+ //------------------------------
+ //Includes - Delphi
+ //------------------------------
Windows,
SDL,
SysUtils;
diff --git a/Languages/English.ini b/Languages/English.ini
index 14d6bb90..972e4ce4 100644
--- a/Languages/English.ini
+++ b/Languages/English.ini
@@ -1,9 +1,24 @@
[Text]
SING_LOADING=Loading...
+
+SING_CHOOSE_MODE=choose mode
SING_SING=sing
SING_SING_DESC=quick game: sing solo or duet
+
+SING_MULTI=party
+SING_MULTI_DESC=Sing in PartyMode
+
+SING_TOOLS=Tools
+
+SING_STATS=stats
+SING_STATS_DESC=View the Statistics
+
SING_EDITOR=editor
SING_EDITOR_DESC=create your own songs
+
+SING_GAME_OPTIONS=game options
+SING_GAME_OPTIONS_DESC=change game settings
+
SING_EXIT_DESC=quit game
SING_OPTIONS_GAME=game
@@ -62,10 +77,6 @@ SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Savety Questions
SING_OPTIONS_ADVANCED_LINEBONUS=Line Bonus
SING_OPTIONS_ADVANCED_ONSONGCLICK=after SongSelection
-SING_CHOOSE_MODE=choose mode
-SING_GAME_OPTIONS=game options
-SING_GAME_OPTIONS_DESC=change game settings
-
SING_LEGEND_SELECT=SELECT
SING_LEGEND_NAVIGATE=NAVIGATE
SING_LEGEND_CONTINUE=Continue
diff --git a/Languages/German.ini b/Languages/German.ini
index 7e9dcfbc..2ca72d4d 100644
--- a/Languages/German.ini
+++ b/Languages/German.ini
@@ -5,6 +5,14 @@ SING_CHOOSE_MODE=Modus wählen
SING_SING=Singen
SING_SING_DESC=Singen
+SING_MULTI=Party
+SING_MULTI_DESC=Ein rundenbasierendes Teamspiel spielen
+
+SING_TOOLS=Tools
+
+SING_STATS=Statistiken
+SING_STATS_DESC=Die Statisiken anschauen
+
SING_EDITOR=Editor
SING_EDITOR_DESC=Mach deinen eigenen Song
@@ -204,14 +212,14 @@ PLUGIN_BLIND_DESC=Erreiche Blind die höchste Punktzahl
STAT_MAIN_DESC=Statistiken
-STAT_OVERVIEW_INTRO=%0:s Statistiken. \n Letzter Reset am %1:.2d.%2:.2d.%3:d
-STAT_OVERVIEW_SONG=%0:d Songs(%3:d mit Video), davon wurden %1:d schon einmal gesungen und %2:d noch nicht.\n Der am häufigsten gesungene Song ist %5:s von %4:s.
-STAT_OVERVIEW_PLAYER=Seit dem letzten Reset haben %0:d verschiedene Spieler gesungen.\n Der Beste Spieler ist %1:s mit einer Score von %2:d Punkten.\n Die höchste Punktzahl, %4:d, wurde von %3:s erreicht.
+STAT_OVERVIEW_INTRO=%0:s Statistiken. \n Letzter Reset am %1:.2d.%2:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Songs(%3:d mit Video), davon wurden %1:d schon einmal gesungen und %2:d noch nicht. \n Der am häufigsten gesungene Song ist %5:s von %4:s.
+STAT_OVERVIEW_PLAYER=Seit dem letzten Reset haben %0:d verschiedene Spieler gesungen. \n Der Beste Spieler ist %1:s mit einer Score von %2:d Punkten. \n Die höchste Punktzahl, %4:d, wurde von %3:s erreicht.
STAT_NEXT=Nächste Seite
STAT_PREV=Vorherige Seite
STAT_REVERSE=Reihenfolge umkehren
-STAT_PAGE=Seite %0:d von %1:d\n (%2:d von %3:d Einträgen)
+STAT_PAGE=Seite %0:d von %1:d \n (%2:d von %3:d Einträgen)
STAT_DESC_SCORES=HighScores
STAT_DESC_SCORES_REVERSED=LowestScores
diff --git a/Languages/readme.txt b/Languages/readme.txt
index fce7c4e9..3c710036 100644
--- a/Languages/readme.txt
+++ b/Languages/readme.txt
@@ -2,8 +2,17 @@ To translate USD to a new language, take the English Language File, or another o
To port a LanguageFile from Ultrastar 0.5.2 or Higher add the following Texts to the end of the file:
+#Main Screen
SING_MENU=Main Menu
+SING_MULTI=party
+SING_MULTI_DESC=Sing in PartyMode
+
+SING_TOOLS=Tools
+
+SING_STATS=stats
+SING_STATS_DESC=View the Statistics
+
#Advanced Options Screen
SING_OPTIONS_ADVANCED=advanced
SING_OPTIONS_ADVANCED_DESC=advanced options
diff --git a/Themes/Deluxe.ini b/Themes/Deluxe.ini
index 79052cb2..40951ee5 100644
--- a/Themes/Deluxe.ini
+++ b/Themes/Deluxe.ini
@@ -147,7 +147,7 @@ Align=1
Text=SING_SING
Color=White
-[MainButtonEditor]
+[MainButtonMulti]
X =335
Y =270
W =150
@@ -166,16 +166,16 @@ SelectH=150
FadeTex=ButtonFade
FadeTexPos=0
-[MainButtonEditorText1]
+[MainButtonMultiText1]
X =75
Y =10
Font=0
Size=10
Align=1
-Text=SING_EDITOR
+Text=SING_MULTI
Color=White
-[MainButtonOptions]
+[MainButtonCollection1]
X =490
Y =270
W =150
@@ -189,17 +189,84 @@ Reflection=1
ReflectionSpacing=15
DeSelectReflectionSpacing=280
Fade=1
-FadeText=1
+FadeText=0
SelectH=150
FadeTex=ButtonFade
FadeTexPos=0
+FirstChild=3
-[MainButtonOptionsText1]
+[MainButtonCollection1Text1]
X =75
Y =10
Font=0
Size=10
Align=1
+Text=SING_TOOLS
+Color=White
+
+[MainButtonStats]
+X =495
+Y =310
+W =140
+H =30
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonStatsText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_STATS
+Color=White
+
+[MainButtonEditor]
+X =495
+Y =345
+W =140
+H =30
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonEditorText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_EDITOR
+Color=White
+
+[MainButtonOptions]
+X =495
+Y =380
+W =140
+H =30
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonOptionsText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
Text=SING_OPTIONS
Color=White