Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
670 bw 1
unit LRLHighScores;
2
 
3
 
4
interface
5
 
6
 
7
uses
8
  LRLRoutines, LRLSprites, StrUnit;
9
 
10
 
11
procedure LRLLoadHighScores;
12
procedure LRLShowHighScores;
13
function LRLBestScore(Score: longint): boolean;
14
procedure LRLInsertScore(Name: string; Score: longint);
15
procedure LRLSaveHighScores;
16
function LRLEnterName: string;
17
 
18
 
19
implementation
20
 
21
 
22
const
23
  HighsFileName = 'LRL.HSR';
24
  HighsFileHeader: string[29] = 'Lode Runner Live High Scores'#26;
25
 
26
type
27
  TSupers = packed record
28
    Name:  string[20];
29
    Score: longint;
30
  end;
31
 
32
var
33
  MainScreen: POINTER;
34
  HighFrame:  POINTER;
35
  HighTable:  array[1..5] of TSupers;
36
 
37
procedure LoadData;
38
var
39
  j: word;
40
begin
41
  GETMEM(MainScreen, 64004);
42
  GETMEM(HighFrame, 45000);
43
  DFAFilePositionSet(ImageFile, LRLImagesFilePosition, DFASeekFromStart);
44
  DFAFileRead(ImageFile, MainScreen^, 7940, j);
45
  DecompressRepByte(MainScreen^, HighFrame^, 7940, j);
46
  DFAFileRead(ImageFile, MainScreen^, 64004, j);
47
end;
48
 
49
procedure DisposeData;
50
begin
51
  FREEMEM(MainScreen, 64004);
52
  FREEMEM(HighFrame, 45000);
53
end;
54
 
55
procedure LRLShowHighScores;
56
var
57
  p: POINTER;
58
  i: integer;
59
  s: string;
60
begin
61
  LRLLoadHighScores;
62
  GETMEM(p, 768);
63
  DataFill(p^, 768, 0, 0);
64
  Palette256Set(p^);
65
  FREEMEM(p, 768);
66
  LoadData;
67
  ImagePut(LRLScreen^, MainScreen^, 0, 0, 0, 0, 319, 199);
68
  ImagePut(LRLScreen^, HighFrame^, 6, 50, 0, 0, 319, 199);
69
  for i := 1 to 5 do
70
  begin
71
    ImageStringGet(CHR(i + 48) + '. ' + HighTable[i].Name, LRLFont^, LRLFontBuffer^, 110);
72
    ImagePut(LRLScreen^, LRLFontBuffer^, 55, 85 + i * 17, 8, 0, 319, 199);
73
    STR(HighTable[i].Score, s);
74
    ImageStringGet(s, LRLFont^, LRLFontBuffer^, 46);
75
    ImagePut(LRLScreen^, LRLFontBuffer^, 260 - ImageSizex(LRLFontBuffer^), 85 + i * 17, 8, 0, 319, 199);
76
  end;
77
  ScreenApply(LRLScreen^);
78
  FadeTo(LRLMenuPalette);
79
  READKEY;
80
  FadeClear;
81
  ImageClear(LRLScreen^);
82
  ScreenApply(LRLScreen^);
83
  DisposeData;
84
end;
85
 
86
procedure LRLLoadHighScores;
87
var
88
  InFile: TDFAFileHandle;
89
  i, j:  word;
90
  high:  TSupers;
91
  dummy: string[30];
92
begin
93
  high.Name := 'Lode Runner';
94
  DFAFileOpen(InFile, HighsFileName, DFAAccessReadWrite);
95
  if DFALastResult(InFile) <> 0 then
96
  begin
97
    DFAFileCreate(InFile, HighsFileName, DFAAttributeArchive);
98
    DFAFileWrite(InFile, HighsFileHeader[1], 29, i);
99
    for i := 1 to 5 do
100
    begin
101
      high.score := 60000 - i * 10000;
102
      DFAFileWrite(InFile, high, SIZEOF(high), j);
103
    end;
104
  end;
105
  DFAFilePositionSet(InFile, 0, DFASeekFromStart);
106
  DFAFileRead(InFile, dummy[1], 29, j);
107
  if (DFALastResult(InFile) <> 0) or
108
    (not DataIdentical(dummy[1], HighsFileHeader[1], 29, 0, 0)) then
109
  begin
110
    WRITELN('Error: Invalid file with high scores! (try to remove LRL.HSR file)');
111
    WRITELN('Ошибка: Неверный файл с рекордами! (попробуйте удалить файл LRL.HSR)');
112
    Halt(1);
113
  end;
114
  DFAFileRead(InFile, HighTable, SIZEOF(TSupers) * 5, j);
115
  DFAFileClose(InFile);
116
end;
117
 
118
procedure LRLSaveHighScores;
119
var
120
  InFile: TDFAFileHandle;
121
  i, j: word;
122
begin
123
  DFAFileOpen(InFile, HighsFileName, DFAAccessReadWrite);
124
  DFAFilePositionSet(InFile, 29, DFASeekFromStart);
125
  DFAFileWrite(InFile, HighTable, SIZEOF(TSupers) * 5, j);
126
  DFAFileClose(InFile);
127
end;
128
 
129
function LRLBestScore(Score: longint): boolean;
130
var
131
  i: integer;
132
begin
133
  LRLBestScore := True;
134
  LRLLoadHighScores;
135
  i := 1;
136
  while True do
137
  begin
138
    if Score >= HighTable[i].Score then
139
      EXIT;
140
    Inc(i);
141
    if i > 5 then
142
    begin
143
      LRLBestScore := False;
144
      EXIT;
145
    end;
146
  end;
147
end;
148
 
149
procedure LRLInsertScore(Name: string; Score: longint);
150
var
151
  i, j: word;
152
begin
153
  LRLLoadHighScores;
154
  i := 1;
155
  while True do
156
  begin
157
    if Score >= HighTable[i].Score then
158
    begin
159
      for j := 4 downto i do
160
      begin
161
        HighTable[j + 1].Name  := HighTable[j].Name;
162
        HighTable[j + 1].Score := HighTable[j].Score;
163
      end;
164
      HighTable[i].Name  := Name;
165
      HighTable[i].Score := Score;
166
      LRLSaveHighScores;
167
      EXIT;
168
    end;
169
    Inc(i);
170
    if i > 5 then
171
    begin
172
      EXIT;
173
    end;
174
  end;
175
end;
176
 
177
function LRLEnterName: string;
178
var
179
  p: POINTER;
180
  i: integer;
181
  RedrawName: boolean;
182
  Keypress: word;
183
  Name: string;
184
begin
185
  Name := '';
186
  GETMEM(p, 768);
187
  DataFill(p^, 768, 0, 0);
188
  Palette256Set(p^);
189
  FREEMEM(p, 768);
190
  ImageClear(LRLScreen^);
191
  ImagePut(LRLScreen^, LRLLogo^, 3, 3, 0, 0, 319, 199);
192
  ImageStringGet('Congratulations! You are in Top-Five!', LRLFont^, LRLFontBuffer^, 110);
193
  ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr 1, 85, 0, 0, 319, 199);
194
  ImageStringGet('Enter your name below, Champ', LRLFont^, LRLFontBuffer^, 111);
195
  ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr
196
    1, 110, 0, 0, 319, 199);
197
  ImageStringGet('---------------------------', LRLFont^, LRLFontBuffer^, 100);
198
  ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr
199
    1, 155, 0, 0, 319, 199);
200
  ScreenApply(LRLScreen^);
201
  FadeTo(LRLMenuPalette);
202
  RedrawName := True;
203
  repeat
204
    if RedrawName = True then
205
    begin
206
      ImageFill(LRLFontBuffer^, 320, 20, 0);
207
      ImagePut(LRLScreen^, LRLFontBuffer^, 0, 140, 0, 0, 319, 199);
208
      ImageStringGet(Name, LRLFont^, LRLFontBuffer^, 100);
209
      ImagePut(LRLScreen^, LRLFontBuffer^, 160 - ImageSizex(LRLFontBuffer^) shr
210
        1, 140, 0, 0, 319, 199);
211
      ScreenApply(LRLScreen^);
212
      RedrawName := False;
213
    end;
214
    Keypress := READKEY;
215
    if (LO(Keypress) = 8) and (LENGTH(Name) > 0) then
216
    begin
217
      Name[0] := char(Ord(Name[0]) - 1);
218
      RedrawName := True;
219
    end;
220
    if (LO(Keypress) > 31) and (LENGTH(Name) < 20) then
221
    begin
222
      Name := Name + char(LO(Keypress));
223
      RedrawName := True;
224
    end;
225
  until LO(Keypress) = 13;
226
  FadeClear;
227
  Name := StringTrimAll(Name, ' ');
228
  if LENGTH(Name) = 0 then
229
    Name := 'Anonymous';
230
  LRLEnterName := Name;
231
end;
232
 
233
 
234
end.