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.>>> |