aboutsummaryrefslogblamecommitdiffstats
path: root/src/screens/UScreenStatMain.pas
blob: ef756a438d2963b26c49320cac4d2c0df89056a3 (plain) (tree)
























                                                                        



                     



                
                 













                                                                
                             


                                                                       


                                   

                                                                                                             






                                                               







            



                                                                                                             

                 
                       
                   
                        

                                   






                          
                      



                      
                                                 




                               

                                 
                                                   



                                                 
                                                   
                                                           








































                                                           










                                                                         







                                                           


                                               






                                                        
                    
                                          
                                                  
                        

    
                                 
     

            



                      
                                                                                
   
                         
     
          
                          





                       
     

                                                                                      



                                                                                     
    
 
                                                                               
   
                                               
                                                  


                                        
          

                            
                              
                                  
                                       
 



                                                          
                                                             











                                                      
 

               
     


                                                                   



                                                                                    
    
 
                                                                                 
   
                      

                                           
                                          
                                      

                                 
          

                      
                           
                          
                    
 

                                                       
                                                               












                                                            
                                                              











                                                          
 
               

     


                                                



                                                                                      
    
 

                                      
                       




                                                                                         


                           
                                                               

             
     
                               



                                         
{* 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 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: UTF8String): UTF8String;
      function FormatSongOverview(FormatStr: UTF8String): UTF8String;
      function FormatPlayerOverview(FormatStr: UTF8String): UTF8String;
    public
      TextOverview:    integer;
      constructor Create; override;
      function ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean; override;
      procedure OnShow; override;
      procedure SetAnimationProgress(Progress: real); override;

      procedure SetOverview;
  end;

implementation

uses
  UGraphic,
  UDataBase,
  USongs,
  USong,
  ULanguage,
  UCommon,
  Classes,
  ULog,
  UUnicodeUtils;

function TScreenStatMain.ParseInput(PressedKey: cardinal; CharCode: UCS4Char; PressedDown: boolean): boolean;
begin
  Result := true;
  if (PressedDown) then
  begin // Key Down
    // check normal keys
    case UCS4UpperCase(CharCode) of
      Ord('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]);

// This fixes the size of the button texts for gaelic
// Maybe other languages, too.
// Could probably be extended for an automatic text size adjustment
// It simply takes the number of characters, neglecting the actual width.
// The actual width came back as 0. Maybe, it is not properly calculated.

  if (Length(Button[1].Text[0].Text) > 13) then
    Button[1].Text[0].Size := 21;
  if (Length(Button[1].Text[0].Text) > 22) then
    Button[1].Text[0].Size := 19;

  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]);

  if (Length(Button[3].Text[0].Text) > 22) then
    Button[3].Text[0].Size := 19;

  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.IsSet) then
      Inc(SongsWithVid);
end;

procedure TScreenStatMain.OnShow;
begin
  inherited;

  //Set Overview Text:
  SetOverview;
end;

function TScreenStatMain.FormatOverviewIntro(FormatStr: UTF8String): UTF8String;
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: UTF8String): UTF8String;
var
  CntSongs, CntSungSongs, CntVidSongs: integer;
  MostPopSongArtist, MostPopSongTitle: UTF8String;
  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: UTF8String): UTF8String;
var
  CntPlayers: integer;
  BestScoreStat:    TStatResultBestScores;
  BestSingerStat:   TStatResultBestSingers;
  BestPlayer, BestScorePlayer: UTF8String;
  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: UTF8String;
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.