aboutsummaryrefslogblamecommitdiffstats
path: root/src/screens/UScreenStatMain.pas
blob: bec9d31240e51d5c900cd09ce471de6019325dda (plain) (tree)
1
2
3
4
5
6
7
8
9



                     



                
                 













                                                                



                                                               


                                   
                                                                                                             










                                                               
           

               
             






                   
                                                                                                             



                       
                        
                                          
          






                          
                      



                      
                                                 




                               

                                 
                                                   



                                                 
                                                   
                                                           























































                                                           
                    

                                                  
                        



                                 

            



                      
                                                                        
   
                         
     
          
                          





                       
     

                                                                                      



                                                                                     
    
 






                                                                       
          

                            
                              
                                  
                                       
 
















                                                             
 

               
     


                                                                   



                                                                                    
    
 








                                                                         
          

                      
                           
                          
                    
 




























                                                               
 
               

     


                                                



                                                                                      
    
 







                                                                                         











                                                               
unit UScreenStatMain;

interface

{$IFDEF FPC}
  {$MODE Delphi}
{$ENDIF}

{$I switches.inc}

uses
  UMenu,
  SDL,
  SysUtils,
  UDisplay,
  UMusic,
  UIni,
  UThemes;

type
  TScreenStatMain = class(TMenu)
    private
      //Some Stat Value that don't need to be calculated 2 times
      SongsWithVid: Cardinal;
      function FormatOverviewIntro(FormatStr: string): string;
      function FormatSongOverview(FormatStr: string): string;
      function FormatPlayerOverview(FormatStr: string): string;
    public
      TextOverview:    integer;
      constructor Create; override;
      function ParseInput(PressedKey: Cardinal; CharCode: WideChar; PressedDown: Boolean): Boolean; override;
      procedure onShow; override;
      procedure SetAnimationProgress(Progress: real); override;

      procedure SetOverview;
  end;

implementation

uses UGraphic,
     UDataBase,
     USongs,
     USong,
     ULanguage,
     UCommon,
     Classes,
     {$IFDEF win32}
     windows,
     {$ELSE}
     sysconst,
     {$ENDIF}
     ULog;

function TScreenStatMain.ParseInput(PressedKey: Cardinal; CharCode: WideChar; PressedDown: Boolean): Boolean;
begin
  Result := true;
  If (PressedDown) Then
  begin // Key Down
    // check normal keys
    case WideCharUpperCase(CharCode)[1] of
      'Q':
        begin
          Result := false;
          Exit;
        end;
    end;
    
    // check special keys
    case PressedKey of
      SDLK_ESCAPE,
      SDLK_BACKSPACE :
        begin
          Ini.Save;
          AudioPlayback.PlaySound(SoundLib.Back);
          FadeTo(@ScreenMain);
        end;
      SDLK_RETURN:
        begin
          //Exit Button Pressed
          if Interaction = 4 then
          begin
            AudioPlayback.PlaySound(SoundLib.Back);
            FadeTo(@ScreenMain);
          end
          else //One of the Stats Buttons Pressed
          begin
            AudioPlayback.PlaySound(SoundLib.Back);
            ScreenStatDetail.Typ := TStatType(Interaction);
            FadeTo(@ScreenStatDetail);
          end;
        end;
      SDLK_LEFT:
      begin
          InteractPrev;
      end;
      SDLK_RIGHT:
      begin
          InteractNext;
      end;
      SDLK_UP:
      begin
          InteractPrev;
      end;
      SDLK_DOWN:
      begin
          InteractNext;
      end;
    end;
  end;
end;

constructor TScreenStatMain.Create;
var
  I:    integer;
begin
  inherited Create;

  TextOverview := AddText(Theme.StatMain.TextOverview);

  LoadFromTheme(Theme.StatMain);

  AddButton(Theme.StatMain.ButtonScores);
  if (Length(Button[0].Text)=0) then
    AddButtonText(14, 20, Theme.StatDetail.Description[0]);

  AddButton(Theme.StatMain.ButtonSingers);
  if (Length(Button[1].Text)=0) then
    AddButtonText(14, 20, Theme.StatDetail.Description[1]);

  AddButton(Theme.StatMain.ButtonSongs);
  if (Length(Button[2].Text)=0) then
    AddButtonText(14, 20, Theme.StatDetail.Description[2]);

  AddButton(Theme.StatMain.ButtonBands);
  if (Length(Button[3].Text)=0) then
    AddButtonText(14, 20, Theme.StatDetail.Description[3]);

  AddButton(Theme.StatMain.ButtonExit);
  if (Length(Button[4].Text)=0) then
    AddButtonText(14, 20, Theme.Options.Description[4]);

  Interaction := 0;

  //Set Songs with Vid
  SongsWithVid := 0;
  For I := 0 to Songs.SongList.Count -1 do
    if (TSong(Songs.SongList[I]).Video <> '') then
      Inc(SongsWithVid);
end;

procedure TScreenStatMain.onShow;
begin
  inherited;

  //Set Overview Text:
  SetOverview;
end;

function TScreenStatMain.FormatOverviewIntro(FormatStr: string): string;
var
  Year, Month, Day: Word;
begin
  {Format:
    %0:d Ultrastar Version
    %1:d Day of Reset
    %2:d Month of Reset
    %3:d Year of Reset}

  Result := '';

  try
    DecodeDate(Database.GetStatReset(), Year, Month, Day);
    Result := Format(FormatStr, [Language.Translate('US_VERSION'), Day, Month, Year]);
  except
    on E: EConvertError do
      Log.LogError('Error Parsing FormatString "STAT_OVERVIEW_INTRO": ' + E.Message);
  end;
end;

function TScreenStatMain.FormatSongOverview(FormatStr: string): string;
var
  CntSongs, CntSungSongs, CntVidSongs: Integer;
  MostPopSongArtist, MostPopSongTitle: String;
  StatList: TList;
  MostSungSong: TStatResultMostSungSong;
begin
  {Format:
    %0:d Count Songs
    %1:d Count of Sung Songs
    %2:d Count of UnSung Songs
    %3:d Count of Songs with Video
    %4:s Name of the most popular Song}

  CntSongs := Songs.SongList.Count;
  CntSungSongs := Database.GetTotalEntrys(stMostSungSong);
  CntVidSongs := SongsWithVid;

  StatList := Database.GetStats(stMostSungSong, 1, 0, False);
  if ((StatList <> nil) and (StatList.Count > 0)) then
  begin
    MostSungSong := StatList[0];
    MostPopSongArtist := MostSungSong.Artist;
    MostPopSongTitle := MostSungSong.Title;
  end
  else
  begin
    MostPopSongArtist := '-';
    MostPopSongTitle := '-';
  end;
  Database.FreeStats(StatList);

  Result := '';
  
  try
    Result := Format(FormatStr, [
        CntSongs, CntSungSongs, CntSongs-CntSungSongs, CntVidSongs,
        MostPopSongArtist, MostPopSongTitle]);
  except
    on E: EConvertError do
      Log.LogError('Error Parsing FormatString "STAT_OVERVIEW_SONG": ' + E.Message);
  end;
end;

function TScreenStatMain.FormatPlayerOverview(FormatStr: string): string;
var
  CntPlayers: Integer;
  BestScoreStat:    TStatResultBestScores;
  BestSingerStat:   TStatResultBestSingers;
  BestPlayer, BestScorePlayer: String;
  BestPlayerScore, BestScore: Integer;
  SingerStats, ScoreStats: TList;
begin
  {Format:
    %0:d Count Players
    %1:s Best Player
    %2:d Best Players Score
    %3:s Best Score Player
    %4:d Best Score}

  CntPlayers := Database.GetTotalEntrys(stBestSingers);

  SingerStats := Database.GetStats(stBestSingers, 1, 0, False);
  if ((SingerStats <> nil) and (SingerStats.Count > 0)) then
  begin
    BestSingerStat := SingerStats[0];
    BestPlayer := BestSingerStat.Player;
    BestPlayerScore := BestSingerStat.AverageScore;
  end
  else
  begin
    BestPlayer := '-';
    BestPlayerScore := 0;
  end;
  Database.FreeStats(SingerStats);

  ScoreStats  := Database.GetStats(stBestScores, 1, 0, False);
  if ((ScoreStats <> nil) and (ScoreStats.Count > 0)) then
  begin
    BestScoreStat := ScoreStats[0];
    BestScorePlayer := BestScoreStat.Singer;
    BestScore := BestScoreStat.Score;
  end
  else
  begin
    BestScorePlayer := '-';
    BestScore := 0;
  end;
  Database.FreeStats(ScoreStats);

  Result := '';

  try
    Result := Format(Formatstr, [
        CntPlayers, BestPlayer, BestPlayerScore,
        BestScorePlayer, BestScore]);
  except
    on E: EConvertError do
      Log.LogError('Error Parsing FormatString "STAT_OVERVIEW_PLAYER": ' + E.Message);
  end;
end;

procedure TScreenStatMain.SetOverview;
var
  Overview: String;
begin
  // Format overview
  Overview := FormatOverviewIntro(Language.Translate('STAT_OVERVIEW_INTRO')) + '\n \n' + 
              FormatSongOverview(Language.Translate('STAT_OVERVIEW_SONG')) + '\n \n' + 
              FormatPlayerOverview(Language.Translate('STAT_OVERVIEW_PLAYER'));
  Text[0].Text := Overview;
end;


procedure TScreenStatMain.SetAnimationProgress(Progress: real);
var I: Integer;
begin
  For I := 0 to high(Button) do
    Button[I].Texture.ScaleW := Progress;
end;

end.