{* UltraStar Deluxe - Karaoke Game
*
* UltraStar Deluxe is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* $URL$
* $Id$
*}
unit UScreenPopup;
interface
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
{$I switches.inc}
uses
SDL,
SysUtils,
UMenu,
UMusic,
UFiles,
UThemes;
type
TPopupCheckHandler = procedure(Value: boolean; Data: Pointer);
TScreenPopupCheck = class(TMenu)
private
fHandler: TPopupCheckHandler;
fHandlerData: Pointer;
public
Visible: boolean; // whether the menu should be drawn
constructor Create; override;
function ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean; override;
procedure OnShow; override;
procedure ShowPopup(const Msg: UTF8String; Handler: TPopupCheckHandler;
HandlerData: Pointer; DefaultValue: boolean = false);
function Draw: boolean; override;
end;
{ for later addition
type
TPopupInsertUserHandler = procedure(Value: boolean; Data: pointer);
TScreenPopupInsertUser = class(TMenu)
private
fHandler: TPopupInsertUserHandler;
fHandlerData: Pointer;
public
Visible: boolean; // whether the menu should be drawn
Username: UTF8String;
Password: UTF8String;
InteractionTmp: integer;
constructor Create; override;
function ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean; override;
procedure OnShow; override;
procedure ShowPopup(const Title: UTF8String; Msg: UTF8String; Handler: TPopupInsertUserHandler;
HandlerData: Pointer);
function Draw: boolean; override;
end;
type
TPopupSendScoreHandler = procedure(Value: integer; Data: pointer);
TScreenPopupSendScore = class(TMenu)
private
fHandler: TPopupSendScoreHandler;
fHandlerData: pointer;
TColorR: real;
TColorG: real;
TColorB: real;
TDColorR: real;
TDColorG: real;
TDColorB: real;
public
Visible: boolean; // whether the menu should be drawn
IWebsite: array of UTF8String;
IUsername: array of UTF8String;
IPlayersPlay: array of UTF8String;
Password: UTF8String;
Username: UTF8String;
SelectValueP: integer;
SelectValueW: integer;
SelectValueU: integer;
constructor Create; override;
function ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean; override;
procedure OnShow; override;
procedure ShowPopup(const Title: UTF8String; Handler: TPopupSendScoreHandler;
HandlerData: Pointer);
function Draw: boolean; override;
end;
}
type
TScreenPopup = 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; CharCode: UCS4Char; PressedDown: boolean): boolean; override;
procedure OnShow; override;
procedure OnHide; override;
procedure ShowPopup(const Msg: UTF8String);
function Draw: boolean; override;
end;
TScreenPopupError = class(TScreenPopup)
public
constructor Create;
end;
TScreenPopupInfo = class(TScreenPopup)
public
constructor Create;
end;
{ for later addition
type
TScreenPopupScoreDownload = class(TMenu)
public
Visible: boolean; // whether the menu should be drawn
Actual_Song: integer;
Actual_Web: integer;
Index_Song: integer;
Num_Songs: integer;
Num_Webs: integer;
CountSongsUpdate: integer;
OpScoreFile: boolean;
ScoreFile: TextFile;
Download_Phase: integer;
Text_SongSituation: UTF8String;
Text_WebSituation: UTF8String;
Texture_ProgressBar: TTexture;
List_MD5Song: widestring;
Receive_List: array[0..2] of widestring;
Actual_Level: integer;
Position_Receive_List: array[0..2] of integer;
constructor Create; override;
function ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean; override;
procedure OnShow; override;
procedure ShowPopup(optmode: integer; optsong: integer; optweb: integer);
procedure DownloadTimeBarSong();
procedure DownloadTimeBarWeb();
function Draw: boolean; override;
procedure ReadMD5FileSong();
procedure ReceiveListScore();
procedure SaveScoreSong();
procedure FileSaveScoreSong();
procedure LogSongUpdate(Artist, Title, WebName: UTF8String);
procedure OpenFile();
end;
}
var
//ISelections: array of string;
SelectValue: integer;
implementation
uses
UGraphic,
UMain,
UIni,
UTexture,
ULanguage,
UParty,
UPlaylist,
UDisplay,
UUnicodeUtils;
{ TScreenPopupCheck }
function TScreenPopupCheck.ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean;
var
Value: boolean;
begin
Result := true;
if (PressedDown) then
begin // Key Down
// check special keys
case PressedKey of
SDLK_ESCAPE,
SDLK_BACKSPACE :
begin
Value := false;
Visible := false;
Result := false;
end;
SDLK_RETURN:
begin
Value := (Interaction = 0);
Visible := false;
Result := false;
end;
SDLK_DOWN: InteractNext;
SDLK_UP: InteractPrev;
SDLK_RIGHT: InteractNext;
SDLK_LEFT: InteractPrev;
end;
end;
if (not Result) then
begin
if (@fHandler <> nil) then
fHandler(Value, fHandlerData);
end;
end;
constructor TScreenPopupCheck.Create;
begin
inherited Create;
fHandler := nil;
fHandlerData := nil;
AddText(Theme.CheckPopup.TextCheck);
LoadFromTheme(Theme.CheckPopup);
AddButton(Theme.CheckPopup.Button1);
if (Length(Button[0].Text) = 0) then
AddButtonText(14, 20, 'Button 1');
AddButton(Theme.CheckPopup.Button2);
if (Length(Button[1].Text) = 0) then
AddButtonText(14, 20, 'Button 2');
Interaction := 0;
end;
function TScreenPopupCheck.Draw: boolean;
begin
Result := inherited Draw;
end;
procedure TScreenPopupCheck.OnShow;
begin
inherited;
end;
procedure TScreenPopupCheck.ShowPopup(const Msg: UTF8String; Handler: TPopupCheckHandler;
HandlerData: Pointer; DefaultValue: boolean);
begin
if (DefaultValue) then
Interaction := 0
else
Interaction := 1;
Visible := true; //Set Visible
fHandler := Handler;
fHandlerData := HandlerData;
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');
Background.OnShow
end;
{ TScreenPopupInsertUser }
{for later addition
function TScreenPopupInsertUser.ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean;
var
Value: boolean;
I: integer;
Password_TMP: UTF8String;
begin
Result := true;
if (PressedDown) then
begin // Key Down
// check normal keys
if (IsPrintableChar(CharCode)) then
begin
if (Interaction = 0) or (Interaction = 1) then
begin
if (Interaction = 0) then
begin
Button[0].Text[0].Text := Button[0].Text[0].Text + UCS4ToUTF8String(CharCode);
Username := Username + UCS4ToUTF8String(CharCode);
end
else
begin
Password := Password + UCS4ToUTF8String(CharCode);
Button[1].Text[0].Text := Button[1].Text[0].Text + '*';
end;
end;
end;
// check special keys
case PressedKey of
SDLK_ESCAPE:
begin
Value := false;
Visible := false;
Result := false;
end;
SDLK_BACKSPACE :
begin
if (Interaction = 0) or (Interaction = 1) then
begin
Button[Interaction].Text[0].DeleteLastLetter();
if (Interaction = 0) then
Username := Button[Interaction].Text[0].Text;
if (Interaction = 1) then
begin
Password_TMP := '';
for I := 1 to Length(Password)-1 do
Password_TMP := Password_TMP + Password[I];
Password := Password_TMP;
end;
end;
end;
SDLK_RETURN:
begin
InteractionTmp := Interaction;
if (Interaction <> 3) then
Interaction := 2;
Value := (Interaction = 2);
if (Interaction = 3) then
Visible := false;
Result := false;
end;
SDLK_TAB: InteractNext;
SDLK_DOWN: InteractNext;
SDLK_UP: InteractPrev;
SDLK_RIGHT: InteractNext;
SDLK_LEFT: InteractPrev;
end;
end;
if (not Result) then
begin
if (@fHandler <> nil) then
fHandler(Value, fHandlerData);
end;
end;
constructor TScreenPopupInsertUser.Create;
begin
inherited Create;
fHandler := nil;
fHandlerData := nil;
AddText(Theme.InsertUserPopup.TextInsertUser);
LoadFromTheme(Theme.InsertUserPopup);
AddButton(Theme.InsertUserPopup.ButtonUsername);
if (Length(Button[0].Text) = 0) then
AddButtonText(14, 20, '');
AddButton(Theme.InsertUserPopup.ButtonPassword);
if (Length(Button[1].Text) = 0) then
AddButtonText(14, 20, '');
AddButton(Theme.InsertUserPopup.Button1);
if (Length(Button[2].Text) = 0) then
AddButtonText(14, 20, 'Add');
AddButton(Theme.InsertUserPopup.Button2);
if (Length(Button[3].Text) = 0) then
AddButtonText(14, 20, 'Cancel');
Button[0].Text[0].Writable := true;
Button[1].Text[0].Writable := true;
Interaction := 0;
end;
function TScreenPopupInsertUser.Draw: boolean;
begin
Result := inherited Draw;
end;
procedure TScreenPopupInsertUser.OnShow;
begin
inherited;
end;
procedure TScreenPopupInsertUser.ShowPopup(const Title: UTF8String; Msg: UTF8String; Handler: TPopupInsertUserHandler;
HandlerData: Pointer);
begin
Visible := true; //Set Visible
fHandler := Handler;
fHandlerData := HandlerData;
Text[0].Text := Language.Translate(Msg);
Text[1].Text := Title;
Button[0].Visible := true;
Button[1].Visible := true;
Button[2].Visible := true;
Button[3].Visible := true;
Password := '';
Username := '';
Button[0].Text[0].Text := '';
Button[1].Text[0].Text := '';
Button[2].Text[0].Text := Language.Translate('MSG_INSERT_USER_ADD');
Button[3].Text[0].Text := Language.Translate('MSG_INSERT_USER_CANCEL');
Interaction := 0;
Background.OnShow
end;
}
{ TScreenPopupSendScore }
{
function TScreenPopupSendScore.ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean;
var
New_User: boolean;
I, Value: integer;
Password_TMP: UTF8String;
begin
Result := true;
if (PressedDown) then
begin // Key Down
// check normal keys
if (IsPrintableChar(CharCode)) then
begin
if (Interaction = 3) or (Interaction = 4) then
begin
if (Interaction = 3) then
begin
Button[0].Text[0].Text := Button[0].Text[0].Text + UCS4ToUTF8String(CharCode);
Username := Username + UCS4ToUTF8String(CharCode);
end;
if (Interaction = 4) then
begin
Button[1].Text[0].Text := Button[1].Text[0].Text + '*';
Password := Password + UCS4ToUTF8String(CharCode);
end;
end
end;
// check special keys
case PressedKey of
SDLK_ESCAPE:
begin
Value := 0;
Visible := false;
Result := false;
end;
SDLK_BACKSPACE:
begin
if (Interaction = 3) or (Interaction = 4) then
begin
Button[Interaction - 3].Text[0].DeleteLastLetter;
if (Interaction = 3) then
Username := Button[Interaction - 3].Text[0].Text;
if (Interaction = 4) then
begin
Password_TMP := '';
for I := 1 to Length(Password)-1 do
Password_TMP := Password_TMP + Password[I];
Password := Password_TMP;
end;
end
else
begin
Value := 0;
Visible := false;
Result := false;
end;
end;
SDLK_RETURN:
begin
if (Interaction = 5) then
begin
Value := 1;
Visible := false;
end;
if (Interaction = 6) then
begin
Value := 2;
Visible := false;
end;
Result := false;
end;
SDLK_DOWN: InteractNext;
SDLK_UP: InteractPrev;
SDLK_TAB: InteractNext;
SDLK_RIGHT:
begin
if (Interaction < 3) then
InteractInc;
if (Interaction = 1) and (SelectValueW <= High(IWebsite)) then
begin
New_User := false;
if (SelectValueU <> High(IUsername)) then
SelectValueU := 0
else
New_User := true;
SetLength(IUsername, Length(DataBase.NetworkUser[SelectValueW].UserList));
for I := 0 to High(DataBase.NetworkUser[SelectValueW].UserList) do
IUsername[I] := DataBase.NetworkUser[SelectValueW].UserList[I].Username;
SetLength(IUsername, Length(IUsername) + 1);
IUsername[High(IUsername)] := Language.Translate('SCORE_SEND_OTHER_USER');
if (New_User = true) then
SelectValueU := High(IUsername);
UpdateSelectSlideOptions(Theme.SendScorePopup.SelectSlide3, 2, IUsername, SelectValueU);
end;
if (SelectValueU = High(IUsername)) then
begin
Button[0].Text[1].ColR := TColorR;
Button[0].Text[1].ColG := TColorG;
Button[0].Text[1].ColB := TColorB;
Button[1].Text[1].ColR := TColorR;
Button[1].Text[1].ColG := TColorG;
Button[1].Text[1].ColB := TColorB;
Button[0].Selectable := true;
Button[1].Selectable := true;
end
else
begin
Button[0].Text[1].ColR := TDColorR;
Button[0].Text[1].ColG := TDColorG;
Button[0].Text[1].ColB := TDColorB;
Button[1].Text[1].ColR := TDColorR;
Button[1].Text[1].ColG := TDColorG;
Button[1].Text[1].ColB := TDColorB;
Button[0].Selectable := false;
Button[1].Selectable := false;
end;
end;
SDLK_LEFT:
begin
if (Interaction < 3) then
InteractDec;
if (Interaction = 1) then
begin
New_User := false;
SetLength(IUsername, Length(DataBase.NetworkUser[SelectValueW].UserList));
for I := 0 to High(DataBase.NetworkUser[SelectValueW].UserList) do
IUsername[I] := DataBase.NetworkUser[SelectValueW].UserList[I].Username;
SetLength(IUsername, Length(IUsername) + 1);
IUsername[High(IUsername)] := Language.Translate('SCORE_SEND_OTHER_USER');
if ((SelectValueU <> High(IUsername)) and (High(IUsername) <> 0)) then
SelectValueU := 0
else
New_User := true;
if (New_User = true) then
SelectValueU := High(IUsername);
UpdateSelectSlideOptions(Theme.SendScorePopup.SelectSlide3, 2, IUsername, SelectValueU);
end;
if (SelectValueU = High(IUsername)) then
begin
Button[0].Text[1].ColR := TColorR;
Button[0].Text[1].ColG := TColorG;
Button[0].Text[1].ColB := TColorB;
Button[1].Text[1].ColR := TColorR;
Button[1].Text[1].ColG := TColorG;
Button[1].Text[1].ColB := TColorB;
Button[0].Selectable := true;
Button[1].Selectable := true;
end
else
begin
Button[0].Text[1].ColR := TDColorR;
Button[0].Text[1].ColG := TDColorG;
Button[0].Text[1].ColB := TDColorB;
Button[1].Text[1].ColR := TDColorR;
Button[1].Text[1].ColG := TDColorG;
Button[1].Text[1].ColB := TDColorB;
Button[0].Selectable := false;
Button[1].Selectable := false;
end;
end;
end;
end;
if (not Result) then
begin
if (@fHandler <> nil) then
fHandler(Value, fHandlerData);
end;
end;
constructor TScreenPopupSendScore.Create;
var
I: integer;
begin
inherited Create;
fHandler := nil;
fHandlerData := nil;
SelectValueP := 0;
SelectValueW := 0;
SelectValueU := 0;
LoadFromTheme(Theme.SendScorePopup);
SetLength(IWebsite, 0);
for I := 0 to High(DataBase.NetworkUser) do
begin
SetLength(IWebsite, Length(IWebsite) + 1);
IWebsite[High(IWebsite)] := DataBase.NetworkUser[I].Website;
end;
AddSelectSlide(Theme.SendScorePopup.SelectSlide1, SelectValueP, IPlayersPlay);
AddSelectSlide(Theme.SendScorePopup.SelectSlide2, SelectValueW, IWebsite);
AddSelectSlide(Theme.SendScorePopup.SelectSlide3, SelectValueU, IUsername);
TColorR := Theme.SendScorePopup.ButtonUsername.ColR;
TColorG := Theme.SendScorePopup.ButtonUsername.ColG;
TColorB := Theme.SendScorePopup.ButtonUsername.ColB;
TDColorR := Theme.SendScorePopup.ButtonUsername.DColR;
TDColorG := Theme.SendScorePopup.ButtonUsername.DColG;
TDColorB := Theme.SendScorePopup.ButtonUsername.DColB;
AddButton(Theme.SendScorePopup.ButtonUsername);
AddButton(Theme.SendScorePopup.ButtonPassword);
AddButton(Theme.SendScorePopup.Button1);
AddButton(Theme.SendScorePopup.Button2);
Interaction := 0;
end;
function TScreenPopupSendScore.Draw: boolean;
begin
Result := inherited Draw;
end;
procedure TScreenPopupSendScore.OnShow;
begin
inherited;
end;
procedure TScreenPopupSendScore.ShowPopup(const Title: UTF8String; Handler: TPopupSendScoreHandler;
HandlerData: Pointer);
var
I: integer;
begin
Visible := true; //Set Visible
fHandler := Handler;
fHandlerData := HandlerData;
Password := '';
Username := '';
SelectValueP := 0;
SelectValueW := 0;
SelectValueU := 0;
Interaction := 0;
Text[0].Text := Language.Translate(Title);
for I := 0 to 3 do
Button[I].Visible := true;
Button[0].Text[0].Text := '';
Button[1].Text[0].Text := '';
Button[2].Text[0].Text := Language.Translate('SCORE_SEND');
Button[3].Text[0].Text := Language.Translate('SCORE_SAVE');
SetLength(IPlayersPlay, PlayersPlay);
for I := 0 to PlayersPlay - 1 do
IPlayersPlay[I] := Ini.Name[I];
UpdateSelectSlideOptions(Theme.SendScorePopup.SelectSlide1, 0, IPlayersPlay, SelectValueP);
//UpdateSelectSlideOptions(Theme.SendScorePopup.SelectSlide2, 1, IWebsite, SelectValueW);
SetLength(IUsername, Length(DataBase.NetworkUser[SelectValueW].UserList));
for I := 0 to High(DataBase.NetworkUser[SelectValueW].UserList) do
IUsername[I] := DataBase.NetworkUser[SelectValueW].UserList[I].Username;
SetLength(IUsername, Length(IUsername) + 1);
IUsername[High(IUsername)] := Language.Translate('SCORE_SEND_OTHER_USER');
UpdateSelectSlideOptions(Theme.SendScorePopup.SelectSlide3, 2, IUsername, SelectValueU);
if (SelectValueU = High(IUsername)) then
begin
Button[0].Text[1].ColR := TColorR;
Button[0].Text[1].ColG := TColorG;
Button[0].Text[1].ColB := TColorB;
Button[1].Text[1].ColR := TColorR;
Button[1].Text[1].ColG := TColorG;
Button[1].Text[1].ColB := TColorB;
Button[0].Selectable := true;
Button[1].Selectable := true;
end
else
begin
Button[0].Selectable := false;
Button[1].Selectable := false;
Button[0].Text[1].ColR := TDColorR;
Button[0].Text[1].ColG := TDColorG;
Button[0].Text[1].ColB := TDColorB;
Button[1].Text[1].ColR := TDColorR;
Button[1].Text[1].ColG := TDColorG;
Button[1].Text[1].ColB := TDColorB;
end;
SelectsS[0].Visible := true;
SelectsS[1].Visible := true;
SelectsS[2].Visible := true;
Interaction := 0;
Background.OnShow
end;
}
{ TScreenPopupScoreDownload }
{
function TScreenPopupScoreDownload.ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean;
var
Value: boolean;
begin
Result := true;
if (PressedDown) then
begin // Key Down
// check special keys
case PressedKey of
SDLK_ESCAPE,
SDLK_BACKSPACE :
begin
Value := false;
Visible := false;
Result := false;
Text[0].Text := Language.Translate('SCORE_DOWNLOAD_RECEIVE_LIST');
Text[1].Text := '';
end;
SDLK_RETURN:
begin
Value := (Interaction = 0);
if (Interaction = 0) then
begin
Visible := false;
Result := false;
Text[0].Text := Language.Translate('SCORE_DOWNLOAD_RECEIVE_LIST');
Text[1].Text := '';
end;
end;
SDLK_DOWN: Interaction := -1;
SDLK_UP: Interaction := -1;
SDLK_RIGHT: InteractNext;
SDLK_LEFT: InteractPrev;
end;
end;
end;
constructor TScreenPopupScoreDownload.Create;
begin
inherited Create;
Texture_ProgressBar := Texture.LoadTexture(Skin.GetTextureFileName('ProgressBar'));
Theme.ScoreDownloadPopup.TextSongScoreDownload.Text := Language.Translate('SCORE_DOWNLOAD_RECEIVE_LIST');
Theme.ScoreDownloadPopup.TextWebScoreDownload.Text := '';
AddText(Theme.ScoreDownloadPopup.TextSongScoreDownload);
AddText(Theme.ScoreDownloadPopup.TextWebScoreDownload);
LoadFromTheme(Theme.ScoreDownloadPopup);
AddButton(Theme.ScoreDownloadPopup.Button1);
if (Length(Button[0].Text) = 0) then
AddButtonText(14, 20, 'Button 1');
Interaction := 0;
end;
procedure TScreenPopupScoreDownload.LogSongUpdate(Artist, Title, WebName: UTF8String);
var
UpdateFile: TextFile;
begin
AssignFile(UpdateFile, WebScoresPath.Append(WebName + ' [Song Update].txt').ToNative);
if FileExists(WebScoresPath.Append(WebName + ' [Song Update].txt').ToNative) then
Append(UpdateFile)
else
Rewrite(UpdateFile);
WriteLn(UpdateFile, Artist + ' - ' + Title);
Flush(UpdateFile);
Close(UpdateFile);
end;
procedure TScreenPopupScoreDownload.SaveScoreSong();
var
String_Text, User_Score, Max_Score, Media_Score: string;
I, J, Update: integer;
DeleteSongLevel: array [0..2] of boolean;
begin
if not(CatSongs.Song[Index_Song].Main) then
begin
Actual_Song := Actual_Song + 1;
Text_SongSituation := Language.Translate('SCORE_DOWNLOAD_SONG') + ' ' + IntToStr(Actual_Song) + '/' + IntToStr(Num_Songs);
Text_WebSituation := IntToStr(Actual_Web) + '/' + IntToStr(Num_Webs);
for J := 0 to 2 do
begin
if (Position_Receive_List[J] <= Length(Receive_List[J])) then
begin
String_Text := '';
while (Receive_List[J][Position_Receive_List[J]] <> #10) and (Position_Receive_List[J] <= Length(Receive_List[J])) do
begin
String_Text := String_Text + Receive_List[J][Position_Receive_List[J]];
Position_Receive_List[J] := Position_Receive_List[J] + 1;
end;
// E -> Error song no exist in web
if (String_Text <> 'ERROR') then
begin
DeleteSongLevel[J] := false;
DataBase.AddSong(CatSongs.Song[Index_Song]);
Max_Score := Copy(String_Text, 0, 5);
Media_Score := Copy(String_Text, 6, 5);
User_Score := Copy(String_Text, 11, Length(String_Text) - 10);
DataBase.AddMax_Score(CatSongs.Song[Index_Song], DllMan.Websites[Actual_Web - 1].ID, StrToInt(Max_Score), J);
DataBase.AddMedia_Score(CatSongs.Song[Index_Song], DllMan.Websites[Actual_Web - 1].ID, StrToInt(Media_Score), J);
DataBase.AddUser_Score(CatSongs.Song[Index_Song], DllMan.Websites[Actual_Web - 1].ID, User_Score, J);
end
else
DeleteSongLevel[J] := true;
Position_Receive_List[J] := Position_Receive_List[J] + 1;
end;
end;
if (DeleteSongLevel[0]) and (DeleteSongLevel[1]) and (DeleteSongLevel[2]) then
begin
Update := DataBase.Delete_Score(CatSongs.Song[Index_Song], DllMan.Websites[Actual_Web - 1].ID);
if (Update <> 0) then
begin
LogSongUpdate(CatSongs.Song[Index_Song].Artist, CatSongs.Song[Index_Song].Title, DllMan.Websites[Actual_Web - 1].Name);
CountSongsUpdate := CountSongsUpdate + 1;
end;
end;
end;
Index_Song := Index_Song + 1;
end;
procedure TScreenPopupScoreDownload.FileSaveScoreSong();
var
String_Text, User_Score, Max_Score, Media_Score, MD5_Song: string;
Level: byte;
Update: integer;
SongExist: boolean;
begin
if not(CatSongs.Song[Index_Song].Main) then
begin
Actual_Song := Actual_Song + 1;
Text_SongSituation := Language.Translate('SCORE_DOWNLOAD_SONG') + ' ' + IntToStr(Actual_Song) + '/' + IntToStr(Num_Songs);
Text_WebSituation := IntToStr(Actual_Web) + '/' + IntToStr(Num_Webs);
SongExist := false;
while not (EOF(ScoreFile)) do
begin
ReadLn(ScoreFile, String_Text);
MD5_Song := Copy(String_Text, 0, 32);
if (CatSongs.Song[Index_Song].MD5 = MD5_Song) then
begin
SongExist := true;
DataBase.AddSong(CatSongs.Song[Index_Song]);
Level := StrToInt(Copy(String_Text, 33, 1)) - 1;
Max_Score := Copy(String_Text, 34, 5);
Media_Score := Copy(String_Text, 39, 5);
User_Score := Copy(String_Text, 44, Length(String_Text) - 43);
DataBase.AddMax_Score(CatSongs.Song[Index_Song], DllMan.Websites[Actual_Web - 1].ID, StrToInt(Max_Score), Level);
DataBase.AddMedia_Score(CatSongs.Song[Index_Song], DllMan.Websites[Actual_Web - 1].ID, StrToInt(Media_Score), Level);
DataBase.AddUser_Score(CatSongs.Song[Index_Song], DllMan.Websites[Actual_Web - 1].ID, User_Score, Level);
end;
end;
if not(SongExist) then
begin
Update := DataBase.Delete_Score(CatSongs.Song[Index_Song], DllMan.Websites[Actual_Web - 1].ID);
if (Update <> 0) then
begin
LogSongUpdate(CatSongs.Song[Index_Song].Artist, CatSongs.Song[Index_Song].Title, DllMan.Websites[Actual_Web - 1].Name);
CountSongsUpdate := CountSongsUpdate + 1;
end;
end;
Reset(ScoreFile);
end;
Index_Song := Index_Song + 1;
end;
procedure TScreenPopupScoreDownload.ReadMD5FileSong();
var
I: integer;
begin
if (Num_Songs = 1) then
begin
Index_Song := ScreenSong.Interaction;
List_MD5Song := CatSongs.Song[ScreenSong.Interaction].MD5;
end
else
begin
for I := 0 to High(CatSongs.Song) do
begin
if not (CatSongs.Song[I].Main) then
List_MD5Song := List_MD5Song + CatSongs.Song[I].MD5;
end;
end;
ScreenPopupScoreDownload.Download_Phase := 1;
end;
procedure TScreenPopupScoreDownload.ReceiveListScore();
begin
Text_WebSituation := IntToStr(Actual_Web) + '/' + IntToStr(Num_Webs);
Text_SongSituation := Language.Translate('SCORE_DOWNLOAD_RECEIVE_LIST');
Receive_List[Actual_Level] := '';
Receive_List[Actual_Level] := DllMan.WebsiteDownloadScore(List_MD5Song, Actual_Level + 1);
if (Receive_List[Actual_Level] = '0') then
begin
ScreenPopupError.ShowPopup(Format(Language.Translate('SONG_MENU_REFRESH_SCORES_ERROR_CONNECTION'), [UTF8Encode(DllMan.Websites[Actual_Web -1].Name)]));
Text_SongSituation := Language.Translate('WEBSITE_NO_CONNECTION');
Actual_Song := Num_Songs;
Actual_Level := 2;
if (Num_Webs = 1) then
Visible := false
end;
Actual_Level := Actual_Level + 1;
end;
procedure TScreenPopupScoreDownload.OpenFile;
var
Filename: string;
begin
Filename := WebScoresPath.Append(DataBase.NetworkUser[Actual_Web - 1].Website + ' [Download Scores].txt').ToNative;
if (FileExists(Filename)) then
begin
AssignFile(ScoreFile, Filename);
Reset(ScoreFile);
end
else
begin
ScreenPopupError.ShowPopup(Format(Language.Translate('SONG_MENU_REFRESH_SCORES_ERROR_FILE'), [UTF8Encode(DllMan.Websites[Actual_Web -1].Name)]));
Actual_Song := Num_Songs;
Actual_Level := 2;
if (Num_Webs = 1) then
Visible := false
end;
end;
function TScreenPopupScoreDownload.Draw: boolean;
var
I: integer;
begin
inherited Draw;
Text[0].Text := Text_SongSituation;
Text[1].Text := Text_WebSituation;
DownloadTimeBarSong();
if (Num_Webs > 1) then
DownloadTimeBarWeb();
if (Download_Phase = 0) then
begin
if (OpScoreFile) then
begin
OpenFile;
Download_Phase := 1;
end
else
ReadMD5FileSong();
end
else
begin
// ONLINE DOWNLOAD SCORE
if not (OpScoreFile) then
begin
if (Download_Phase = 1) then
begin
if (Actual_Level <= 2) then
begin
DLLMan.LoadWebsite(Actual_Web - 1);
ReceiveListScore();
end
else
Download_Phase := 2;
end
else
begin
if (Actual_Song < Num_Songs) then
begin
SaveScoreSong();
end
else
begin
if ((Actual_Web < Num_Webs) and (Num_Webs > 1)) then
begin
for I:= 0 to 2 do
begin
Receive_List[I] := '';
Position_Receive_List[I] := 1;
end;
Download_Phase := 1;
Actual_Song := 0;
Index_Song := 0;
Actual_Level := 0;
Actual_Web := Actual_Web + 1;
end
else
begin
Button[0].Text[0].Text := Language.Translate('SCORE_DOWNLOAD_OK');
if (CountSongsUpdate > 0) then
begin
Visible := false;
ScreenPopupInfo.ShowPopup(Format(Language.Translate('SCORE_DOWNLOAD_SONG_UPDATE'), [CountSongsUpdate]));
end
else
Interaction := 0;
end;
end;
end;
end
else
begin
// FILE DOWNLOAD
if (Actual_Song < Num_Songs) then
begin
FileSaveScoreSong();
end
else
begin
if ((Actual_Web < Num_Webs) and (Num_Webs > 1)) then
begin
//Download_Phase := 1;
Actual_Song := 0;
Index_Song := 0;
Actual_Level := 0;
Actual_Web := Actual_Web + 1;
OpenFile;
end
else
begin
Button[0].Text[0].Text := Language.Translate('SCORE_DOWNLOAD_OK');
if (CountSongsUpdate > 0) then
begin
Visible := false;
ScreenPopupInfo.ShowPopup(Format(Language.Translate('SCORE_DOWNLOAD_SONG_UPDATE'), [CountSongsUpdate]));
end
else
Interaction := 0;
end;
end;
end;
end;
Result := true;
end;
procedure TScreenPopupScoreDownload.OnShow;
begin
inherited;
end;
procedure TScreenPopupScoreDownload.DownloadTimeBarSong();
var
x, y: real;
width, height: real;
Progress: real;
CurProgress: real;
begin
x := Theme.ScoreDownloadPopup.DownloadProgressSong.X;
y := Theme.ScoreDownloadPopup.DownloadProgressSong.Y;
width := Theme.ScoreDownloadPopup.DownloadProgressSong.W;
height := Theme.ScoreDownloadPopup.DownloadProgressSong.H;
glColor4f(Theme.ScoreDownloadPopup.DownloadProgressSong.ColR, Theme.ScoreDownloadPopup.DownloadProgressSong.ColG, Theme.ScoreDownloadPopup.DownloadProgressSong.ColB, 1); //Set Color
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, Texture_ProgressBar.TexNum);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(x, y);
CurProgress := Actual_Song;
if (CurProgress > 0) then
begin
Progress := CurProgress / Num_Songs;
glTexCoord2f((width * Progress) / 8, 0);
glVertex2f(x + width * Progress, y);
glTexCoord2f((width * Progress) / 8, 1);
glVertex2f(x + width * Progress, y + height);
end;
glTexCoord2f(0, 1);
glVertex2f(x, y + height);
glEnd;
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glcolor4f(1, 0, 0, 1);
end;
procedure TScreenPopupScoreDownload.DownloadTimeBarWeb();
var
x, y: real;
width, height: real;
Progress: real;
CurProgress: real;
begin
x := Theme.ScoreDownloadPopup.DownloadProgressWeb.X;
y := Theme.ScoreDownloadPopup.DownloadProgressWeb.Y;
width := Theme.ScoreDownloadPopup.DownloadProgressWeb.W;
height := Theme.ScoreDownloadPopup.DownloadProgressWeb.H;
glColor4f(Theme.ScoreDownloadPopup.DownloadProgressWeb.ColR, Theme.ScoreDownloadPopup.DownloadProgressWeb.ColG, Theme.ScoreDownloadPopup.DownloadProgressWeb.ColB, 1); //Set Color
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, Texture_ProgressBar.TexNum);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(x, y);
CurProgress := Actual_Song + ((Actual_Web - 1) * Num_Songs);
if (CurProgress > 0) then
begin
Progress := CurProgress / (Num_Songs * Num_Webs);
glTexCoord2f((width * Progress) / 8, 0);
glVertex2f(x + width * Progress, y);
glTexCoord2f((width * Progress) / 8, 1);
glVertex2f(x + width * Progress, y + height);
end;
glTexCoord2f(0, 1);
glVertex2f(x, y + height);
glEnd;
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glcolor4f(1, 0, 0, 1);
end;
procedure TScreenPopupScoreDownload.ShowPopup(optmode: integer; optsong: integer; optweb: integer);
var
I: integer;
begin
Background.OnShow;
//reset vars
Actual_Song := 0;
Actual_Web := 1;
Actual_Level := 0;
Index_Song := 0;
Download_Phase := 0;
List_MD5Song := '';
OpScoreFile := false;
CountSongsUpdate := 0;
if (optmode = 1) then
OpScoreFile := true;
for I := 0 to 2 do
begin
Receive_List[I] := '';
Position_Receive_List[I] := 1;
end;
Text_SongSituation := Language.Translate('SCORE_DOWNLOAD_CREATE_LIST');
Text_WebSituation := '';
if (optsong = 0) then
Num_Songs := 1
else
Num_Songs := Songs.SongList.Count;
if (optweb = 0) then
begin
Num_Webs := High(DataBase.NetworkUser) + 1;
if (Num_Webs > 1) then
begin
Statics[2].Visible := true;
Text[1].Visible := true;
end
else
begin
Text[1].Visible := false;
Statics[2].Visible := false;
end;
end
else
begin
Num_Webs := 1;
Actual_Web := optweb;
Text[1].Visible := false;
Statics[2].Visible := false;
end;
Visible := true; //Set Visible
Button[0].Visible := true;
Button[0].Text[0].Text := Language.Translate('SCORE_DOWNLOAD_CANCEL');
Interaction := -1;
end;
}
{ TScreenPopup }
function TScreenPopup.ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean;
begin
Result := true;
if (PressedDown) then
begin // Key Down
case PressedKey of
SDLK_Q:
begin
Result := false;
end;
SDLK_ESCAPE,
SDLK_BACKSPACE :
begin
Visible := false;
Result := false;
end;
SDLK_RETURN:
begin
Visible := false;
Result := false;
end;
SDLK_DOWN: InteractNext;
SDLK_UP: InteractPrev;
SDLK_RIGHT: InteractNext;
SDLK_LEFT: InteractPrev;
end;
end;
end;
constructor TScreenPopup.Create;
begin
inherited Create;
AddText(Theme.ErrorPopup.TextError);
LoadFromTheme(Theme.ErrorPopup);
AddButton(Theme.ErrorPopup.Button1);
if (Length(Button[0].Text) = 0) then
AddButtonText(14, 20, 'Button 1');
Interaction := 0;
end;
function TScreenPopup.Draw: boolean;
begin
Draw := inherited Draw;
end;
procedure TScreenPopup.OnShow;
begin
inherited;
end;
procedure TScreenPopup.OnHide;
begin
end;
procedure TScreenPopup.ShowPopup(const Msg: UTF8String);
begin
Interaction := 0; //Reset Interaction
Visible := true; //Set Visible
Background.OnShow;
{ //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;}
Text[0].Text := msg;
Button[0].Visible := true;
Button[0].Text[0].Text := 'OK';
end;
{ TScreenPopupError }
constructor TScreenPopupError.Create;
begin
inherited;
Text[1].Text := Language.Translate('MSG_ERROR_TITLE');
end;
{ TScreenPopupInfo }
constructor TScreenPopupInfo.Create;
begin
inherited;
Text[1].Text := Language.Translate('MSG_INFO_TITLE');
end;
end.