Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

unit app_game_highscore;

interface

uses sux_constant, sux_object, app_constant;

type
  TSScore = record
    name: SXStringL;
    score: SXInt;
  end;
  TSettings=record
    scores: array[0..SX_MAX_HIGHSCORE] of TSScore;
  end;
  SAGHighScore=class(SUXObject)
    settings:TSettings;

    function getPositionForScore(const score: SXInt): SXInt;
    procedure addEntry(const name: SXStringL; const score: SXInt);
    procedure reset;
    procedure save;
    procedure load;

    procedure initialize;
    constructor Create(const parent: TObject);
    destructor Destroy; override;
  end;

implementation

uses main, file_file;


// --- SAGHighScore


function SAGHighScore.getPositionForScore(const score: SXInt): SXInt;
var s: SXInt;
begin
  for s := 0 to SX_MAX_HIGHSCORE do
  if (score >= settings.scores[s].score) then
  begin
    result := s;
    exit;
  end;

  result := SX_NONE;
end;


procedure SAGHighScore.addEntry(const name: SXStringL; const score: SXInt);
var s, other: SXInt;
begin
  s := getPositionForScore(score);
  if (s = SX_NONE) then exit;

  // Move all following scores down one position.
  for other := SX_MAX_HIGHSCORE - 1 downto s do
  begin
    settings.scores[other + 1].name := settings.scores[other].name;
    settings.scores[other + 1].score := settings.scores[other].score;
  end;

  // Add new score at this position
  settings.scores[s].name := name;
  settings.scores[s].score := score;
end;


procedure SAGHighScore.reset;
var s: SXInt;
begin
  for s := 0 to SX_MAX_HIGHSCORE do
  begin
    settings.scores[s].name := 'empty';
    settings.scores[s].score := 0;
  end;

  addEntry('Meister', 9999999);
  addEntry('HAL', 1);
end;


procedure SAGHighScore.load;
var data: SUXFile;
    fullfilename: SXStringL;
    s: SXInt;
begin
  fullfilename := sx.fs.getFullFileName('data\highscore', 'data');

  // Generate a new highscore table if none exists so far.
  if (not sx.fs.exists(fullfilename, false)) then
  begin
    reset;
    save;
  end;

  data := SUXFile.Create(self, fullfilename, SX_FILE_BINARY, SX_FILE_ACCESS_READ);
  for s := 0 to SX_MAX_HIGHSCORE do
  begin
    data.readStringL(settings.scores[s].name);
    data.readInt(settings.scores[s].score);
  end;
  data.Free;
end;


procedure SAGHighScore.save;
var data: SUXFile;
    fullfilename: SXStringL;
    s: SXInt;
begin
  fullfilename := sx.fs.getFullFileName('data\highscore', 'data');

  data := SUXFile.Create(self, fullfilename, SX_FILE_BINARY, SX_FILE_ACCESS_WRITE);
  for s := 0 to SX_MAX_HIGHSCORE do
  begin
    data.writeStringL(settings.scores[s].name);
    data.writeInt(settings.scores[s].score);
  end;
  data.Free;
end;




procedure SAGHighScore.initialize;
begin
  load;
end;


constructor SAGHighScore.Create(const parent: TObject);
begin
  inherited Create(parent,'Game Highscore');
end;


destructor SAGHighScore.Destroy;
begin
  save;
 
  inherited;
end;


end.