forked from KolibriOS/kolibrios
4cc19614ca
git-svn-id: svn://kolibrios.org@670 a494cfbc-eb01-0410-851d-a64ba20cac60
235 lines
5.7 KiB
ObjectPascal
235 lines
5.7 KiB
ObjectPascal
unit LRLHighScores;
|
||
|
||
|
||
interface
|
||
|
||
|
||
uses
|
||
LRLRoutines, LRLSprites, StrUnit;
|
||
|
||
|
||
procedure LRLLoadHighScores;
|
||
procedure LRLShowHighScores;
|
||
function LRLBestScore(Score: longint): boolean;
|
||
procedure LRLInsertScore(Name: string; Score: longint);
|
||
procedure LRLSaveHighScores;
|
||
function LRLEnterName: string;
|
||
|
||
|
||
implementation
|
||
|
||
|
||
const
|
||
HighsFileName = 'LRL.HSR';
|
||
HighsFileHeader: string[29] = 'Lode Runner Live High Scores'#26;
|
||
|
||
type
|
||
TSupers = packed record
|
||
Name: string[20];
|
||
Score: longint;
|
||
end;
|
||
|
||
var
|
||
MainScreen: POINTER;
|
||
HighFrame: POINTER;
|
||
HighTable: array[1..5] of TSupers;
|
||
|
||
procedure LoadData;
|
||
var
|
||
j: word;
|
||
begin
|
||
GETMEM(MainScreen, 64004);
|
||
GETMEM(HighFrame, 45000);
|
||
DFAFilePositionSet(ImageFile, LRLImagesFilePosition, DFASeekFromStart);
|
||
DFAFileRead(ImageFile, MainScreen^, 7940, j);
|
||
DecompressRepByte(MainScreen^, HighFrame^, 7940, j);
|
||
DFAFileRead(ImageFile, MainScreen^, 64004, j);
|
||
end;
|
||
|
||
procedure DisposeData;
|
||
begin
|
||
FREEMEM(MainScreen, 64004);
|
||
FREEMEM(HighFrame, 45000);
|
||
end;
|
||
|
||
procedure LRLShowHighScores;
|
||
var
|
||
p: POINTER;
|
||
i: integer;
|
||
s: string;
|
||
begin
|
||
LRLLoadHighScores;
|
||
GETMEM(p, 768);
|
||
DataFill(p^, 768, 0, 0);
|
||
Palette256Set(p^);
|
||
FREEMEM(p, 768);
|
||
LoadData;
|
||
ImagePut(LRLScreen^, MainScreen^, 0, 0, 0, 0, 319, 199);
|
||
ImagePut(LRLScreen^, HighFrame^, 6, 50, 0, 0, 319, 199);
|
||
for i := 1 to 5 do
|
||
begin
|
||
ImageStringGet(CHR(i + 48) + '. ' + HighTable[i].Name, LRLFont^, LRLFontBuffer^, 110);
|
||
ImagePut(LRLScreen^, LRLFontBuffer^, 55, 85 + i * 17, 8, 0, 319, 199);
|
||
STR(HighTable[i].Score, s);
|
||
ImageStringGet(s, LRLFont^, LRLFontBuffer^, 46);
|
||
ImagePut(LRLScreen^, LRLFontBuffer^, 260 - ImageSizex(LRLFontBuffer^), 85 + i * 17, 8, 0, 319, 199);
|
||
end;
|
||
ScreenApply(LRLScreen^);
|
||
FadeTo(LRLMenuPalette);
|
||
READKEY;
|
||
FadeClear;
|
||
ImageClear(LRLScreen^);
|
||
ScreenApply(LRLScreen^);
|
||
DisposeData;
|
||
end;
|
||
|
||
procedure LRLLoadHighScores;
|
||
var
|
||
InFile: TDFAFileHandle;
|
||
i, j: word;
|
||
high: TSupers;
|
||
dummy: string[30];
|
||
begin
|
||
high.Name := 'Lode Runner';
|
||
DFAFileOpen(InFile, HighsFileName, DFAAccessReadWrite);
|
||
if DFALastResult(InFile) <> 0 then
|
||
begin
|
||
DFAFileCreate(InFile, HighsFileName, DFAAttributeArchive);
|
||
DFAFileWrite(InFile, HighsFileHeader[1], 29, i);
|
||
for i := 1 to 5 do
|
||
begin
|
||
high.score := 60000 - i * 10000;
|
||
DFAFileWrite(InFile, high, SIZEOF(high), j);
|
||
end;
|
||
end;
|
||
DFAFilePositionSet(InFile, 0, DFASeekFromStart);
|
||
DFAFileRead(InFile, dummy[1], 29, j);
|
||
if (DFALastResult(InFile) <> 0) or
|
||
(not DataIdentical(dummy[1], HighsFileHeader[1], 29, 0, 0)) then
|
||
begin
|
||
WRITELN('Error: Invalid file with high scores! (try to remove LRL.HSR file)');
|
||
WRITELN('<27>訡<EFBFBD><E8A8A1>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 䠩<> <20> ४<>ठ<EFBFBD><E0A4A0>! (<28><><EFBFBD><EFBFBD><E0AEA1><EFBFBD><EFBFBD> 㤠<><E3A4A0><EFBFBD><EFBFBD> 䠩<> LRL.HSR)');
|
||
Halt(1);
|
||
end;
|
||
DFAFileRead(InFile, HighTable, SIZEOF(TSupers) * 5, j);
|
||
DFAFileClose(InFile);
|
||
end;
|
||
|
||
procedure LRLSaveHighScores;
|
||
var
|
||
InFile: TDFAFileHandle;
|
||
i, j: word;
|
||
begin
|
||
DFAFileOpen(InFile, HighsFileName, DFAAccessReadWrite);
|
||
DFAFilePositionSet(InFile, 29, DFASeekFromStart);
|
||
DFAFileWrite(InFile, HighTable, SIZEOF(TSupers) * 5, j);
|
||
DFAFileClose(InFile);
|
||
end;
|
||
|
||
function LRLBestScore(Score: longint): boolean;
|
||
var
|
||
i: integer;
|
||
begin
|
||
LRLBestScore := True;
|
||
LRLLoadHighScores;
|
||
i := 1;
|
||
while True do
|
||
begin
|
||
if Score >= HighTable[i].Score then
|
||
EXIT;
|
||
Inc(i);
|
||
if i > 5 then
|
||
begin
|
||
LRLBestScore := False;
|
||
EXIT;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure LRLInsertScore(Name: string; Score: longint);
|
||
var
|
||
i, j: word;
|
||
begin
|
||
LRLLoadHighScores;
|
||
i := 1;
|
||
while True do
|
||
begin
|
||
if Score >= HighTable[i].Score then
|
||
begin
|
||
for j := 4 downto i do
|
||
begin
|
||
HighTable[j + 1].Name := HighTable[j].Name;
|
||
HighTable[j + 1].Score := HighTable[j].Score;
|
||
end;
|
||
HighTable[i].Name := Name;
|
||
HighTable[i].Score := Score;
|
||
LRLSaveHighScores;
|
||
EXIT;
|
||
end;
|
||
Inc(i);
|
||
if i > 5 then
|
||
begin
|
||
EXIT;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
function LRLEnterName: string;
|
||
var
|
||
p: POINTER;
|
||
i: integer;
|
||
RedrawName: boolean;
|
||
Keypress: word;
|
||
Name: string;
|
||
begin
|
||
Name := '';
|
||
GETMEM(p, 768);
|
||
DataFill(p^, 768, 0, 0);
|
||
Palette256Set(p^);
|
||
FREEMEM(p, 768);
|
||
ImageClear(LRLScreen^);
|
||
ImagePut(LRLScreen^, LRLLogo^, 3, 3, 0, 0, 319, 199);
|
||
ImageStringGet('Congratulations! You are in Top-Five!', LRLFont^, LRLFontBuffer^, 110);
|
||
ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr 1, 85, 0, 0, 319, 199);
|
||
ImageStringGet('Enter your name below, Champ', LRLFont^, LRLFontBuffer^, 111);
|
||
ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr
|
||
1, 110, 0, 0, 319, 199);
|
||
ImageStringGet('---------------------------', LRLFont^, LRLFontBuffer^, 100);
|
||
ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr
|
||
1, 155, 0, 0, 319, 199);
|
||
ScreenApply(LRLScreen^);
|
||
FadeTo(LRLMenuPalette);
|
||
RedrawName := True;
|
||
repeat
|
||
if RedrawName = True then
|
||
begin
|
||
ImageFill(LRLFontBuffer^, 320, 20, 0);
|
||
ImagePut(LRLScreen^, LRLFontBuffer^, 0, 140, 0, 0, 319, 199);
|
||
ImageStringGet(Name, LRLFont^, LRLFontBuffer^, 100);
|
||
ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr
|
||
1, 140, 0, 0, 319, 199);
|
||
ScreenApply(LRLScreen^);
|
||
RedrawName := False;
|
||
end;
|
||
Keypress := READKEY;
|
||
if (LO(Keypress) = 8) and (LENGTH(Name) > 0) then
|
||
begin
|
||
Name[0] := char(Ord(Name[0]) - 1);
|
||
RedrawName := True;
|
||
end;
|
||
if (LO(Keypress) > 31) and (LENGTH(Name) < 20) then
|
||
begin
|
||
Name := Name + char(LO(Keypress));
|
||
RedrawName := True;
|
||
end;
|
||
until LO(Keypress) = 13;
|
||
FadeClear;
|
||
Name := StringTrimAll(Name, ' ');
|
||
if LENGTH(Name) = 0 then
|
||
Name := 'Anonymous';
|
||
LRLEnterName := Name;
|
||
end;
|
||
|
||
|
||
end.
|