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.