aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorb1indy <b1indy@b956fd51-792f-4845-bead-9b4dfca2ff2c>2007-05-03 00:19:52 +0000
committerb1indy <b1indy@b956fd51-792f-4845-bead-9b4dfca2ff2c>2007-05-03 00:19:52 +0000
commit5bf0ebf274fef28811ab952338bd261bd1dd0fa8 (patch)
treef6271ebd739455d74a7e6e4abd535c7ad3413b33
parent28b809432bd8064400bbc9a52a4e354debf86bb6 (diff)
downloadusdx-5bf0ebf274fef28811ab952338bd261bd1dd0fa8.tar.gz
usdx-5bf0ebf274fef28811ab952338bd261bd1dd0fa8.tar.xz
usdx-5bf0ebf274fef28811ab952338bd261bd1dd0fa8.zip
added "popups" to ask for confirmation when leaving party mode or game or to display messages (like minor errors)
still ugly, needs some theme work git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@157 b956fd51-792f-4845-bead-9b4dfca2ff2c
Diffstat (limited to '')
-rw-r--r--Game/Code/Classes/UGraphic.pas11
-rw-r--r--Game/Code/Classes/UMain.pas9
-rw-r--r--Game/Code/Classes/UThemes.pas28
-rw-r--r--Game/Code/Menu/UDisplay.pas40
-rw-r--r--Game/Code/Menu/UMenu.pas19
-rw-r--r--Game/Code/Screens/UScreenMain.pas10
-rw-r--r--Game/Code/Screens/UScreenPartyNewRound.pas2
-rw-r--r--Game/Code/Screens/UScreenPopup.pas204
-rw-r--r--Game/Code/UltraStar.dpr3
-rw-r--r--Languages/English.ini6
-rw-r--r--Languages/readme.txt7
-rw-r--r--Themes/Deluxe.ini163
12 files changed, 449 insertions, 53 deletions
diff --git a/Game/Code/Classes/UGraphic.pas b/Game/Code/Classes/UGraphic.pas
index 39eea53d..8b17a73d 100644
--- a/Game/Code/Classes/UGraphic.pas
+++ b/Game/Code/Classes/UGraphic.pas
@@ -9,7 +9,8 @@ uses
UScreenEdit, UScreenEditConvert, UScreenEditHeader, UScreenOpen, UThemes, USkins, UScreenSongMenu, UScreenSongJumpto,
{Party Screens} UScreenSingModi, UScreenPartyNewRound, UScreenPartyScore, UScreenPartyOptions, UScreenPartyWin, UScreenPartyPlayer,
{Stats Screens} UScreenStatMain, UScreenStatDetail,
- {CreditsScreen} UScreenCredits;
+ {CreditsScreen} UScreenCredits,
+ {Popup for errors, etc.} UScreenPopup;
type
TRecR = record
@@ -71,6 +72,10 @@ var
//CreditsScreen
ScreenCredits: TScreenCredits;
+ //popup mod
+ ScreenPopupCheck: TScreenPopupCheck;
+ ScreenPopupError: TScreenPopupError;
+
//Notes
Tex_Left: array[0..6] of TTexture;
Tex_Mid: array[0..6] of TTexture;
@@ -433,6 +438,10 @@ begin
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen SongMenu', 3); Log.BenchmarkStart(3);
ScreenSongJumpto := TScreenSongJumpto.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen SongJumpto', 3); Log.BenchmarkStart(3);
+ ScreenPopupCheck := TScreenPopupCheck.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Popup (Check)', 3); Log.BenchmarkStart(3);
+ ScreenPopupError := TScreenPopupError.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Popup (Error)', 3); Log.BenchmarkStart(3);
ScreenPartyNewRound := TScreenPartyNewRound.Create;
Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen PartyNewRound', 3); Log.BenchmarkStart(3);
ScreenPartyScore := TScreenPartyScore.Create;
diff --git a/Game/Code/Classes/UMain.pas b/Game/Code/Classes/UMain.pas
index c9002a36..69eca419 100644
--- a/Game/Code/Classes/UMain.pas
+++ b/Game/Code/Classes/UMain.pas
@@ -2,7 +2,7 @@ unit UMain;
interface
uses SDL, UGraphic, UMusic, URecord, UTime, SysUtils, UDisplay, UIni, ULog, ULyrics, UScreenSing,
- OpenGL12, zlportio {you can disable it and all PortWriteB calls}, ULCD, ULight, UThemes;
+ OpenGL12, zlportio {you can disable it and all PortWriteB calls}, ULCD, ULight, UThemes{, UScreenPopup};
type
TPlayer = record
@@ -112,7 +112,7 @@ begin
CheckEvents;
// display
- Display.Draw;
+ done:=not Display.Draw;
SwapBuffers;
// light
@@ -156,6 +156,11 @@ Begin
End; // With}
SDL_KEYDOWN:
begin
+ // popup hack... if there is a visible popup then let it handle input instead of underlying screen
+ // shoud be done in a way to be sure the topmost popup has preference (maybe error, then check)
+ if ScreenPopupError <> NIL then if ScreenPopupError.Visible then ScreenPopupError.ParseInput(Event.key.keysym.sym, Event.key.keysym.unicode, True) else
+ if ScreenPopupCheck <> NIL then if ScreenPopupCheck.Visible then ScreenPopupCheck.ParseInput(Event.key.keysym.sym, Event.key.keysym.unicode, True) else
+ // end of popup hack
if (Not Display.ActualScreen^.ParseInput(Event.key.keysym.sym, Event.key.keysym.unicode, True)) then
// if (Not Display.ActualScreen^.ParseInput(Event.key.keysym.scancode, True)) then
done := true; // exit game
diff --git a/Game/Code/Classes/UThemes.pas b/Game/Code/Classes/UThemes.pas
index 6004502e..ee88ca9c 100644
--- a/Game/Code/Classes/UThemes.pas
+++ b/Game/Code/Classes/UThemes.pas
@@ -460,6 +460,19 @@ type
ButtonExit: TThemeButton;
end;
+ //Error- and Check-Popup
+ TThemeError = class(TThemeBasic)
+ Button1: TThemeButton;
+ TextError: TThemeText;
+ end;
+
+ TThemeCheck = class(TThemeBasic)
+ Button1: TThemeButton;
+ Button2: TThemeButton;
+ TextCheck: TThemeText;
+ end;
+
+
//ScreenSong Menue
TThemeSongMenu = class(TThemeBasic)
Button1: TThemeButton;
@@ -656,6 +669,9 @@ type
OptionsThemes: TThemeOptionsThemes;
OptionsRecord: TThemeOptionsRecord;
OptionsAdvanced: TThemeOptionsAdvanced;
+ //error and check popup
+ ErrorPopup: TThemeError;
+ CheckPopup: TThemeCheck;
//ScreenSong extensions
SongMenu: TThemeSongMenu;
SongJumpto: TThemeSongJumpTo;
@@ -750,6 +766,9 @@ begin
OptionsRecord := TThemeOptionsRecord.Create;
OptionsAdvanced := TThemeOptionsAdvanced.Create;
+ ErrorPopup := TThemeError.Create;
+ CheckPopup := TThemeCheck.Create;
+
SongMenu := TThemeSongMenu.Create;
SongJumpto := TThemeSongJumpto.Create;
//Party Screens
@@ -1157,6 +1176,15 @@ begin
ThemeLoadSelect (OptionsAdvanced.SelectAskbeforeDel, 'OptionsAdvancedSelectAskbeforeDel');
ThemeLoadButton (OptionsAdvanced.ButtonExit, 'OptionsAdvancedButtonExit');
+ //error and check popup
+ ThemeLoadBasic (ErrorPopup, 'ErrorPopup');
+ ThemeLoadButton(ErrorPopup.Button1, 'ErrorPopupButton1');
+ ThemeLoadText (ErrorPopup.TextError,'ErrorPopupText');
+ ThemeLoadBasic (CheckPopup, 'CheckPopup');
+ ThemeLoadButton(CheckPopup.Button1, 'CheckPopupButton1');
+ ThemeLoadButton(CheckPopup.Button2, 'CheckPopupButton2');
+ ThemeLoadText(CheckPopup.TextCheck , 'CheckPopupText');
+
//Song Menu
ThemeLoadBasic (SongMenu, 'SongMenu');
ThemeLoadButton(SongMenu.Button1, 'SongMenuButton1');
diff --git a/Game/Code/Menu/UDisplay.pas b/Game/Code/Menu/UDisplay.pas
index 19266414..428cc6c7 100644
--- a/Game/Code/Menu/UDisplay.pas
+++ b/Game/Code/Menu/UDisplay.pas
@@ -2,12 +2,15 @@ unit UDisplay;
interface
-uses Windows, SDL, UMenu, OpenGL12, SysUtils, dialogs;
+uses Windows, SDL, UMenu, OpenGL12, SysUtils;
type
TDisplay = class
ActualScreen: PMenu;
NextScreen: PMenu;
+ //popup hack
+ NextScreenWithCheck: Pmenu;
+ CheckOK: Boolean;
h_DC: HDC;
h_RC: HGLRC;
@@ -45,6 +48,11 @@ var i: integer;
begin
inherited Create;
+ //popup hack
+ CheckOK:=False;
+ NextScreen:=NIL;
+ NextScreenWithCheck:=NIL;
+
// fade mod
myfade:=0;
@@ -75,10 +83,6 @@ begin
canFade:=False;
end;
FreeMem(pTexData);
- if not canFade then begin
- showmessage('Fehler beim Initialisieren der Fading-Textur... Fading deaktiviert');
- doFade:=False;
- end
// end
end;
@@ -120,9 +124,26 @@ begin
if S = 2 then TimeSkip := 0 else;
glViewPort((S-1) * ScreenW div Screens, 0, ScreenW div Screens, ScreenH);
+ //popup hack
+ // check was successful... move on
+ if CheckOK then
+ if assigned (NextScreenWithCheck)then
+ begin
+ NextScreen:=NextScreenWithCheck;
+ NextScreenWithCheck := NIL;
+ CheckOk:=False;
+ end
+ else
+ Result:=False;
+ //end popup hack
+
// ActualScreen.SetAnimationProgress(1);
if not assigned (NextScreen) then begin
- Result := ActualScreen.Draw;
+ ActualScreen.Draw;
+ //popup mod
+ if ScreenPopupError <> NIL then if ScreenPopupError.Visible then ScreenPopupError.Draw else
+ if ScreenPopupCheck <> NIL then if ScreenPopupCheck.Visible then ScreenPopupCheck.Draw;
+ //popup end
// fade mod
myfade:=0;
if (Ini.ScreenFade=1) and canFade then
@@ -133,6 +154,11 @@ begin
end
else
begin
+ // check if we had an initialization error (canfade=false, dofade=true)
+ if doFade and not canFade then begin
+ doFade:=False; //disable fading
+ ScreenPopupError.ShowPopup(['Error initializing','fade texture','','fading','disabled']); //show error message
+ end;
if doFade and canFade then
begin
// fade mod
@@ -146,7 +172,7 @@ begin
if glGetError <> GL_NO_ERROR then
begin
canFade := False;
- showmessage('Fehler beim Kopieren der Fade-Textur... Fading deaktiviert');
+ ScreenPopupError.ShowPopup(['Error copying','fade texture','','fading','disabled']); //show error message
end;
glViewPort((S-1) * ScreenW div Screens, 0, ScreenW div Screens, ScreenH);
NextScreen.onShow;
diff --git a/Game/Code/Menu/UMenu.pas b/Game/Code/Menu/UMenu.pas
index 4ad8270a..c9d3c726 100644
--- a/Game/Code/Menu/UMenu.pas
+++ b/Game/Code/Menu/UMenu.pas
@@ -12,7 +12,7 @@ type
TMenu = class
protected
ButtonPos: Integer;
-
+
Interactions: array of TInteract;
SelInteraction: integer;
Button: array of TButton;
@@ -29,7 +29,7 @@ type
mY: integer; // mouse Y
Fade: integer; // fade type
- ShowFinish: boolean; // true if there is no fade
+ ShowFinish: boolean; // true if there is no fade
destructor Destroy; override;
@@ -47,7 +47,7 @@ type
procedure PrepareButtonCollections(const Collections: AThemeButtonCollection);
procedure AddButtonCollection(const ThemeCollection: TThemeButtonCollection; Const Num: Byte);
-
+
// background
procedure AddBackground(Name: string);
@@ -68,7 +68,7 @@ type
function AddText(X, Y, W: real; Style: integer; Size, ColR, ColG, ColB: real; Align: integer; Tekst: string): integer; overload;
// button
- Procedure SetButtonLength(Length: Cardinal); //Function that Set Length of Button Array in one Step instead of register new Memory for every Button
+ Procedure SetButtonLength(Length: Cardinal); //Function that Set Length of Button Array in one Step instead of register new Memory for every Button
function AddButton(ThemeButton: TThemeButton): integer; overload;
function AddButton(X, Y, W, H: real; Name: String): integer; overload;
function AddButton(X, Y, W, H: real; Name, Format, Typ: String; Reflection: Boolean): integer; overload;
@@ -107,6 +107,8 @@ type
// function AddWidget(X, Y : UInt16; WidgetSrc : PSDL_Surface): Int16;
// procedure ClearWidgets(MinNumber : Int16);
procedure FadeTo(Screen: PMenu);
+ //popup hack
+ procedure CheckFadeTo(Screen: PMenu; msg: String);
function DrawBG: boolean; virtual;
function DrawFG: boolean; virtual;
@@ -873,6 +875,15 @@ begin
Display.NextScreen := Screen;
end;
+//popup hack
+procedure TMenu.CheckFadeTo(Screen: PMenu; msg: String);
+begin
+ Display.Fade := 0;
+ Display.NextScreenWithCheck := Screen;
+ Display.CheckOK:=False;
+ ScreenPopupCheck.ShowPopup(msg);
+end;
+
procedure TMenu.AddButtonText(AddX, AddY: real; AddText: string);
begin
AddButtonText(AddX, AddY, 1, 1, 1, AddText);
diff --git a/Game/Code/Screens/UScreenMain.pas b/Game/Code/Screens/UScreenMain.pas
index 78c98218..f339fa04 100644
--- a/Game/Code/Screens/UScreenMain.pas
+++ b/Game/Code/Screens/UScreenMain.pas
@@ -55,7 +55,9 @@ begin
SDLK_ESCAPE :
begin
- Result := False;
+ //popup hack
+ CheckFadeTo(NIL,'MSG_QUIT_USDX');
+// Result := False;
end;
SDLK_C:
@@ -116,7 +118,7 @@ begin
Music.PlayStart;
FadeTo(@ScreenStatMain);
end;
-
+
//Editor
if Interaction = 3 then begin
Music.PlayStart;
@@ -131,7 +133,9 @@ begin
//Exit
if Interaction = 5 then begin
- Result := false;
+ //popup hack
+ CheckFadeTo(NIL,'MSG_QUIT_USDX');
+// Result := false;
end;
end;
// Up and Down could be done at the same time,
diff --git a/Game/Code/Screens/UScreenPartyNewRound.pas b/Game/Code/Screens/UScreenPartyNewRound.pas
index 22f76218..894e96d2 100644
--- a/Game/Code/Screens/UScreenPartyNewRound.pas
+++ b/Game/Code/Screens/UScreenPartyNewRound.pas
@@ -86,7 +86,7 @@ begin
SDLK_ESCAPE :
begin
Music.PlayBack;
- FadeTo(@ScreenMain);
+ CheckFadeTo(@ScreenMain,'MSG_END_PARTY');
end;
SDLK_RETURN:
diff --git a/Game/Code/Screens/UScreenPopup.pas b/Game/Code/Screens/UScreenPopup.pas
index 41279197..25f647a2 100644
--- a/Game/Code/Screens/UScreenPopup.pas
+++ b/Game/Code/Screens/UScreenPopup.pas
@@ -3,10 +3,10 @@ unit UScreenPopup;
interface
uses
- UMenu, SDL, UMusic, UPliki, SysUtils, UThemes, dialogs, Messages;
+ UMenu, SDL, UMusic, UPliki, SysUtils, UThemes;
type
- TScreenPopup = class(TMenu)
+ TScreenPopupCheck = class(TMenu)
private
CurMenu: Byte; //Num of the cur. Shown Menu
public
@@ -15,24 +15,35 @@ type
constructor Create; override;
function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
procedure onShow; override;
- procedure ShowPopup(sPopup: Byte);
+ procedure ShowPopup(msg: String);
function Draw: boolean; override;
end;
-const
- PU_Error = 1;
+type
+ TScreenPopupError = class(TMenu)
+ private
+ CurMenu: Byte; //Num of the cur. Shown Menu
+ public
+ Visible: Boolean; //Whether the Menu should be Drawn
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure onHide; override;
+ procedure ShowPopup(msg: array of String);
+ function Draw: boolean; override;
+ end;
var
- ISelections: Array of String;
+// ISelections: Array of String;
SelectValue: Integer;
implementation
-uses UGraphic, UMain, UIni, UTexture, ULanguage, UParty, UPlaylist;
+uses UGraphic, UMain, UIni, UTexture, ULanguage, UParty, UPlaylist, UDisplay;
-function TScreenPopup.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+function TScreenPopupCheck.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
function IsVisible: Boolean;
begin
Result := True;
@@ -81,6 +92,15 @@ begin
SDLK_RETURN:
begin
+ case Interaction of
+ 0: begin
+ Display.CheckOK:=True;
+ end;
+ 1: begin
+ Display.CheckOK:=False;
+ Display.NextScreenWithCheck:=NIL;
+ end;
+ end;
Visible:=False;
Result := false;
end;
@@ -100,13 +120,11 @@ begin
end;
end;
-constructor TScreenPopup.Create;
+constructor TScreenPopupCheck.Create;
var
I: integer;
begin
inherited Create;
- SetLength(ISelections, 1);
- ISelections[0] := 'Dummy';
AddBackground(Theme.CheckPopup.Background.Tex);
@@ -129,37 +147,161 @@ begin
Interaction := 0;
end;
-function TScreenPopup.Draw: boolean;
+function TScreenPopupCheck.Draw: boolean;
begin
inherited Draw;
end;
-procedure TScreenPopup.onShow;
+procedure TScreenPopupCheck.onShow;
begin
end;
-procedure TScreenPopup.ShowPopup(sPopup: Byte);
+procedure TScreenPopupCheck.ShowPopup(msg: String);
begin
Interaction := 0; //Reset Interaction
Visible := True; //Set Visible
- Case sPopup of
- PU_Error:
- begin
- Text[0].Text := 'Wirklich beenden?';{Language.Translate('SONG_MENU_NAME_MAIN');}
-
- Button[0].Visible := True;
- Button[1].Visible := True;
-// Button[2].Visible := True;
-// Button[3].Visible := True;
-// SelectsS[0].Visible := False;
-
- Button[0].Text[0].Text := 'JA';
- Button[1].Text[0].Text := 'NEIN';
-// Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_ADD');
-// Button[3].Text[0].Text := Language.Translate('SONG_MENU_EDIT');
- end;
+
+ Text[0].Text := Language.Translate(msg);
+
+ Button[0].Visible := True;
+ Button[1].Visible := True;
+
+ Button[0].Text[0].Text := Language.Translate('SONG_MENU_YES');
+ Button[1].Text[0].Text := Language.Translate('SONG_MENU_NO');
+end;
+
+// error popup
+
+function TScreenPopupError.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
+ begin // Key Down
+
+ case PressedKey of
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE :
+ begin
+ Result := false;
+ end;
+
+ SDLK_RETURN:
+ begin
+ Visible:=False;
+ Result := false;
+ end;
+
+ SDLK_DOWN: SelectNext;
+ SDLK_UP: SelectPrev;
+
+ SDLK_RIGHT: SelectNext;
+ SDLK_LEFT: SelectPrev;
+ end;
+ end
+ else // Key Up
+ case PressedKey of
+ SDLK_RETURN :
+ begin
+ end;
+ end;
+end;
+
+constructor TScreenPopupError.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ AddBackground(Theme.CheckPopup.Background.Tex);
+
+ AddButton(Theme.ErrorPopup.Button1);
+ if (Length(Button[0].Text) = 0) then
+ AddButtonText(14, 20, 'Button 1');
+
+ AddText(Theme.ErrorPopup.TextError);
+
+ for I := 0 to High(Theme.ErrorPopup.Static) do
+ AddStatic(Theme.ErrorPopup.Static[I]);
+
+ for I := 0 to High(Theme.ErrorPopup.Text) do
+ AddText(Theme.ErrorPopup.Text[I]);
+
+ Interaction := 0;
+end;
+
+function TScreenPopupError.Draw: boolean;
+begin
+ inherited Draw;
+end;
+
+procedure TScreenPopupError.onShow;
+begin
+
+end;
+
+procedure TScreenPopupError.onHide;
+var i: integer;
+begin
+ for i:=0 to high(Text) do
+ Text[i].Text:='';
+end;
+
+procedure TScreenPopupError.ShowPopup(msg: array of String);
+var i: integer;
+begin
+ Interaction := 0; //Reset Interaction
+ Visible := True; //Set Visible
+
+ //dirty hack... Text[0] is invisible for some strange reason
+ for i:=1 to high(Text) do
+ if i-1 <= high(msg) then
+ begin
+ Text[i].Visible:=True;
+ Text[i].Text := msg[i-1];
+ end
+ else
+ begin
+ Text[i].Visible:=False;
+ end;
+
+ Button[0].Visible := True;
+
+ Button[0].Text[0].Text := 'OK';
end;
-end. \ No newline at end of file
+end.
diff --git a/Game/Code/UltraStar.dpr b/Game/Code/UltraStar.dpr
index b7466d84..5f19c1d4 100644
--- a/Game/Code/UltraStar.dpr
+++ b/Game/Code/UltraStar.dpr
@@ -82,6 +82,7 @@ uses
UScreenStatMain in 'Screens\UScreenStatMain.pas',
UScreenStatDetail in 'Screens\UScreenStatDetail.pas',
UScreenCredits in 'Screens\UScreenCredits.pas',
+ UScreenPopup in 'Screens\UScreenPopup.pas',
//------------------------------
//Includes - Screens PartyMode
@@ -313,4 +314,4 @@ begin
if Ini.LPT = 2 then Light.TurnOff;
Log.Free;
-end. \ No newline at end of file
+end.
diff --git a/Languages/English.ini b/Languages/English.ini
index 972e4ce4..f9ebaa9c 100644
--- a/Languages/English.ini
+++ b/Languages/English.ini
@@ -151,6 +151,7 @@ SONG_MENU_PLAYLIST_NEW_UNNAMED=Unnamed
SONG_MENU_NAME_PLAYLIST_DEL=Really Delete?
SONG_MENU_YES=Yes
+SONG_MENU_NO=No
SONG_MENU_NAME_PLAYLIST_LOAD=Open Playlist
SONG_MENU_PLAYLIST_LOAD=open
@@ -223,4 +224,7 @@ STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx sung
STAT_DESC_BANDS=Most popular Bands
STAT_DESC_BANDS_REVERSED=Least popular Bands
-STAT_FORMAT_BANDS=%0:s \n %1:dx Sung \ No newline at end of file
+STAT_FORMAT_BANDS=%0:s \n %1:dx Sung
+
+MSG_QUIT_USDX=Leave UltraStar?
+MSG_END_PARTY=End Party Mode? \ No newline at end of file
diff --git a/Languages/readme.txt b/Languages/readme.txt
index 3c710036..247539bc 100644
--- a/Languages/readme.txt
+++ b/Languages/readme.txt
@@ -71,6 +71,7 @@ SONG_MENU_PLAYLIST_NEW_UNNAMED=Unnamed
SONG_MENU_NAME_PLAYLIST_DEL=Really Delete?
SONG_MENU_YES=Yes
+SONG_MENU_NO=No
SONG_MENU_NAME_PLAYLIST_LOAD=Open Playlist
SONG_MENU_PLAYLIST_LOAD=open
@@ -146,4 +147,8 @@ STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx sung
STAT_DESC_BANDS=Most popular Bands
STAT_DESC_BANDS_REVERSED=Least popular Bands
-STAT_FORMAT_BANDS=%0:s \n %1:dx Sung \ No newline at end of file
+STAT_FORMAT_BANDS=%0:s \n %1:dx Sung
+
+#Messages for Popup Message Boxes
+MSG_QUIT_USDX=Leave UltraStar?
+MSG_END_PARTY=End Party Mode? \ No newline at end of file
diff --git a/Themes/Deluxe.ini b/Themes/Deluxe.ini
index f278491d..6e4376aa 100644
--- a/Themes/Deluxe.ini
+++ b/Themes/Deluxe.ini
@@ -27,6 +27,8 @@ GrayLight = 191 191 191
Gray = 127 127 127
GrayDark = 63 63 63
Black = 0 0 0
+GrayPopup = 51 51 51
+
[Loading]
Texts =2
@@ -6272,4 +6274,163 @@ ColG = 0.3
ColB = 0.3
Font = 0
Size = 8
-Text= \ No newline at end of file
+Text=
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 294
+Y = 280
+W = 100
+H = 25
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 426
+Y = 280
+W = 100
+H = 25
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =125
+Color=White
+Font =0
+Size =14
+Text=blabla
+Align=1
+Z=1
+
+[CheckPopupStatic1]
+Tex =SongMenuBG
+X =250
+Y =120
+W =300
+H =200
+Z =1
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 280
+W = 100
+H = 25
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =400
+Y =125
+Color=White
+Font =0
+Size =14
+Text=error text line 1
+Align=1
+Z=1
+
+[ErrorPopupText2]
+X =400
+Y =150
+Color=White
+Font =0
+Size =14
+Text=error text line 2
+Align=1
+Z=1
+
+[ErrorPopupText3]
+X =400
+Y =175
+Color=White
+Font =0
+Size =14
+Text=error text line 3
+Align=1
+Z=1
+
+[ErrorPopupText4]
+X =400
+Y =200
+Color=White
+Font =0
+Size =14
+Text=error text line 4
+Align=1
+Z=1
+
+[ErrorPopupText5]
+X =400
+Y =225
+Color=White
+Font =0
+Size =14
+Text=error text line 5
+Align=1
+Z=1
+
+[ErrorPopupStatic1]
+Tex =SongMenuBG
+X =250
+Y =120
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black \ No newline at end of file