Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
762 bw 1
unit LRLHighScores;
2
 
3
{$mode objfpc}
4
{$i-}
5
 
6
 
7
interface
8
 
9
 
10
uses
11
  SysUtils,
12
  LRLRoutines, LRLSprites;
13
 
14
 
15
procedure LRLLoadHighScores;
16
procedure LRLShowHighScores;
17
function LRLBestScore(Score: Longint): Boolean;
18
procedure LRLInsertScore(Name: String; Score: Longint);
19
procedure LRLSaveHighScores;
20
function LRLEnterName: String;
21
 
22
 
23
implementation
24
 
25
 
26
const
27
  HighsFileName = 'LRL.HSR';
28
  HighsFileHeader: String[29] = 'Lode Runner Live High Scores'#26;
29
 
30
type
31
  TSupers = packed record
32
    Name:  String[20];
33
    Score: Longint;
34
  end;
35
 
36
var
37
  MainScreen: Pointer;
38
  HighFrame:  Pointer;
39
  HighTable:  array[1..5] of TSupers;
40
 
41
 
42
procedure LoadData;
43
var
44
  j: Word;
45
begin
46
  GetMem(MainScreen, 64004);
47
  GetMem(HighFrame, 45000);
48
  Seek(ImageFile, LRLImagesFilePosition);
49
  BlockRead(ImageFile, MainScreen^, 7940, j);
50
  DecompressRepByte(MainScreen^, HighFrame^, 7940, j);
51
  BlockRead(ImageFile, MainScreen^, 64004, j);
52
end;
53
 
54
 
55
procedure DisposeData;
56
begin
57
  FreeMem(MainScreen, 64004);
58
  FreeMem(HighFrame, 45000);
59
end;
60
 
61
 
62
procedure LRLShowHighScores;
63
var
64
  p: Pointer;
65
  i: Integer;
66
  s: String;
67
begin
68
  LRLLoadHighScores;
69
 
70
  GetMem(p, 768);
71
  DataFill(p^, 768, 0, 0);
72
  Palette256Set(p^);
73
  FreeMem(p, 768);
74
 
75
  LoadData;
76
  ImagePut(LRLScreen^, MainScreen^, 0, 0, 0, 0, 319, 199);
77
  ImagePut(LRLScreen^, HighFrame^, 6, 50, 0, 0, 319, 199);
78
 
79
  for i := 1 to 5 do
80
  begin
81
    ImageStringGet(Chr(i + 48) + '. ' + HighTable[i].Name, LRLFont^, LRLFontBuffer^, 110);
82
    ImagePut(LRLScreen^, LRLFontBuffer^, 55, 85 + i * 17, 8, 0, 319, 199);
83
    Str(HighTable[i].Score, s);
84
    ImageStringGet(s, LRLFont^, LRLFontBuffer^, 46);
85
    ImagePut(LRLScreen^, LRLFontBuffer^, 260 - ImageSizex(LRLFontBuffer^), 85 + i * 17, 8, 0, 319, 199);
86
  end;
87
 
88
  ScreenApply(LRLScreen^);
89
  FadeTo(LRLMenuPalette);
90
 
91
  ReadKey;
92
 
93
  FadeClear;
94
  ImageClear(LRLScreen^);
95
  ScreenApply(LRLScreen^);
96
 
97
  DisposeData;
98
end;
99
 
100
 
101
procedure LRLLoadHighScores;
102
var
103
  InFile: File;
104
  i, j:  Word;
105
  Dummy: String[30];
106
begin
107
  FileMode := 0;
108
  AssignFile(InFile, HighsFileName);
109
  Reset(InFile, 1);
110
 
111
  if IOResult <> 0 then
112
  begin
113
    for i := 1 to 5 do
114
    begin
115
      HighTable[i].Name := 'Lode Runner';
116
      HighTable[i].score := 60000 - i * 10000;
117
    end;
118
    AssignFile(InFile, HighsFileName);
119
    Rewrite(InFile, 1);
120
    BlockWrite(InFile, HighsFileHeader[1], 29, i);
121
    BlockWrite(InFile, HighTable, SizeOf(TSupers) * 5, j);
122
  end else
123
  begin
124
    Seek(InFile, 0);
125
    BlockRead(InFile, Dummy[1], 29, j);
126
    if (IOResult <> 0) or (not DataIdentical(Dummy[1], HighsFileHeader[1], 29, 0, 0)) then
127
  	  raise Exception.Create('Error: Invalid file with high scores! (try to remove LRL.HSR file)');
128
    BlockRead(InFile, HighTable, SizeOf(TSupers) * 5, j);
129
  end;
130
 
131
  Close(InFile);
132
end;
133
 
134
 
135
procedure LRLSaveHighScores;
136
var
137
  InFile: File;
138
  j: Word;
139
begin
140
  FileMode := 2;
141
  AssignFile(InFile, HighsFileName);
142
  Reset(InFile, 1);
143
  Seek(InFile, 29);
144
  BlockWrite(InFile, HighTable, SizeOf(TSupers) * 5, j);
145
  Close(InFile);
146
end;
147
 
148
 
149
function LRLBestScore(Score: Longint): Boolean;
150
var
151
  i: Integer;
152
begin
153
  LRLBestScore := True;
154
  LRLLoadHighScores;
155
  i := 1;
156
  while True do
157
  begin
158
    if Score >= HighTable[i].Score then
159
      Exit;
160
    Inc(i);
161
    if i > 5 then
162
    begin
163
      LRLBestScore := False;
164
      Exit;
165
    end;
166
  end;
167
end;
168
 
169
 
170
procedure LRLInsertScore(Name: String; Score: Longint);
171
var
172
  i, j: Word;
173
begin
174
  LRLLoadHighScores;
175
  i := 1;
176
  while True do
177
  begin
178
    if Score >= HighTable[i].Score then
179
    begin
180
      for j := 4 downto i do
181
      begin
182
        HighTable[j + 1].Name  := HighTable[j].Name;
183
        HighTable[j + 1].Score := HighTable[j].Score;
184
      end;
185
      HighTable[i].Name  := Name;
186
      HighTable[i].Score := Score;
187
      LRLSaveHighScores;
188
      Exit;
189
    end;
190
    Inc(i);
191
    if i > 5 then
192
    begin
193
      Exit;
194
    end;
195
  end;
196
end;
197
 
198
 
199
function LRLEnterName: String;
200
var
201
  p: Pointer;
202
  RedrawName: Boolean;
203
  Keypress: Word;
204
  Name: String;
205
  C: Char;
206
begin
207
  Name := '';
208
 
209
  GetMem(p, 768);
210
  DataFill(p^, 768, 0, 0);
211
  Palette256Set(p^);
212
  FreeMem(p, 768);
213
 
214
  ImageClear(LRLScreen^);
215
  ImagePut(LRLScreen^, LRLLogo^, 3, 3, 0, 0, 319, 199);
216
  ImageStringGet('Congratulations! You are in Top-Five!', LRLFont^, LRLFontBuffer^, 110);
217
  ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr 1, 85, 0, 0, 319, 199);
218
  ImageStringGet('Enter your name below, Champ', LRLFont^, LRLFontBuffer^, 111);
219
  ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr
220
    1, 110, 0, 0, 319, 199);
221
  ImageStringGet('---------------------------', LRLFont^, LRLFontBuffer^, 100);
222
  ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr
223
    1, 155, 0, 0, 319, 199);
224
  ScreenApply(LRLScreen^);
225
  FadeTo(LRLMenuPalette);
226
 
227
  RedrawName := True;
228
  repeat
229
    if RedrawName = True then
230
    begin
231
      ImageFill(LRLFontBuffer^, 320, 20, 0);
232
      ImagePut(LRLScreen^, LRLFontBuffer^, 0, 140, 0, 0, 319, 199);
233
      ImageStringGet(Name, LRLFont^, LRLFontBuffer^, 100);
234
      ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr 1, 140, 0, 0, 319, 199);
235
      ScreenApply(LRLScreen^);
236
      RedrawName := False;
237
    end;
238
 
239
    Keypress := ReadKey;
240
 
241
    if (Keypress = KEY_BACK) and (Length(Name) > 0) then
242
    begin
243
	  SetLength(Name, Length(Name) - 1);
244
      RedrawName := True;
245
    end;
246
 
247
    C := ScanToChar(Keypress);
248
    if (C > #31) and (Length(Name) < 20) then
249
    begin
250
      Name := Name + C;
251
      RedrawName := True;
252
    end;
253
 
254
  until Keypress = KEY_ENTER;
255
  FadeClear;
256
 
257
  Name := Trim(Name);
258
  if Length(Name) = 0 then
259
    Name := 'Anonymous';
260
  LRLEnterName := Name;
261
end;
262
 
263
 
264
end.