Rev 85 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3 | daniel-mar | 1 | unit GamSpeicherung; |
2 | |||
3 | interface |
||
4 | |||
5 | uses |
||
6 | Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, |
||
6 | daniel-mar | 7 | StdCtrls, ExtCtrls, Spin{$IF CompilerVersion >= 23.0}, System.UITypes{$IFEND}; |
3 | daniel-mar | 8 | |
9 | type |
||
10 | TSpeicherungForm = class(TForm) |
||
11 | Bevel1: TBevel; |
||
12 | LadenBtn: TButton; |
||
13 | LoeschenBtn: TButton; |
||
14 | AktualisierenBtn: TButton; |
||
15 | SpeichernBtn: TButton; |
||
16 | AbbrechenBtn: TButton; |
||
17 | LevelListBox: TListBox; |
||
18 | Label2: TLabel; |
||
19 | Label3: TLabel; |
||
20 | Label1: TLabel; |
||
21 | LevelName: TEdit; |
||
22 | ElPanel1: TPanel; |
||
23 | li4a: TLabel; |
||
24 | li1: TLabel; |
||
25 | li3b: TLabel; |
||
26 | li3a: TLabel; |
||
27 | li4b: TLabel; |
||
28 | liu: TLabel; |
||
29 | liw: TLabel; |
||
30 | li2a: TLabel; |
||
31 | li2b: TLabel; |
||
32 | procedure LoeschenBtnClick(Sender: TObject); |
||
33 | procedure LadenBtnClick(Sender: TObject); |
||
34 | procedure SpeichernBtnClick(Sender: TObject); |
||
35 | procedure LevelListBoxClick(Sender: TObject); |
||
36 | procedure LevelNameChange(Sender: TObject); |
||
37 | procedure Button4Click(Sender: TObject); |
||
38 | procedure FormShow(Sender: TObject); |
||
39 | procedure DsFancyButton2Click(Sender: TObject); |
||
40 | procedure AbbrechenBtnClick(Sender: TObject); |
||
41 | procedure FormHide(Sender: TObject); |
||
42 | procedure LevelListBoxDblClick(Sender: TObject); |
||
26 | daniel-mar | 43 | private |
51 | daniel-mar | 44 | function GetSpielstandVerzeichnisSystem: string; |
45 | function GetSpielstandVerzeichnisUser: string; |
||
46 | function GetSaveGameFileName(SpielstandName: string; forceuserdir: boolean): string; |
||
3 | daniel-mar | 47 | public |
48 | procedure SearchSaves; |
||
49 | end; |
||
50 | |||
51 | var |
||
52 | SpeicherungForm: TSpeicherungForm; |
||
53 | |||
54 | implementation |
||
55 | |||
56 | uses |
||
51 | daniel-mar | 57 | Global, GamMain, ComLevelReader; |
3 | daniel-mar | 58 | |
59 | {$R *.DFM} |
||
60 | |||
79 | daniel-mar | 61 | resourcestring |
62 | SSaveGameFileNotFound = 'Spielstandsdatei nicht gefunden'; |
||
63 | SNa = 'n/a'; |
||
64 | SSaveGameFolder = 'Spielstände'; |
||
65 | SSaveGameSubFolder = 'SpaceMission'; |
||
66 | |||
26 | daniel-mar | 67 | { TSpeicherungForm } |
68 | |||
3 | daniel-mar | 69 | procedure TSpeicherungForm.SearchSaves; |
70 | var |
||
71 | sr: TSearchRec; |
||
72 | res: integer; |
||
73 | begin |
||
74 | LevelName.text := ''; |
||
75 | LevelListBox.items.clear; |
||
76 | li1.visible := false; |
||
77 | li2a.visible := false; |
||
78 | li2b.visible := false; |
||
79 | li3a.visible := false; |
||
80 | li3b.visible := false; |
||
81 | li4a.visible := false; |
||
82 | li4b.visible := false; |
||
83 | liu.visible := false; |
||
84 | liw.visible := true; |
||
79 | daniel-mar | 85 | li1.caption := SNa; |
86 | li2b.caption := SNa; |
||
87 | li3b.caption := SNa; |
||
88 | li4b.caption := SNa; |
||
3 | daniel-mar | 89 | LadenBtn.enabled := false; |
90 | LoeschenBtn.enabled := false; |
||
51 | daniel-mar | 91 | res := FindFirst(IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisSystem)+'*.sav', 0, sr); |
3 | daniel-mar | 92 | try |
93 | while (res = 0) do |
||
94 | begin |
||
95 | if (sr.name <> '.') and (sr.name <> '..') then |
||
24 | daniel-mar | 96 | LevelListBox.items.Add(ChangeFileExt(sr.Name, '')); |
3 | daniel-mar | 97 | res := FindNext(sr); |
98 | end; |
||
99 | finally |
||
100 | FindClose(sr); |
||
101 | end; |
||
51 | daniel-mar | 102 | res := FindFirst(IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisUser)+'*.sav', 0, sr); |
103 | try |
||
104 | while (res = 0) do |
||
105 | begin |
||
70 | daniel-mar | 106 | // Anmerkung: Contains() oder IndexOf() sind nicht case-sensitive |
107 | if (sr.name <> '.') and (sr.name <> '..') and (LevelListBox.Items.IndexOf(ChangeFileExt(sr.Name, ''))=-1) then |
||
51 | daniel-mar | 108 | LevelListBox.items.Add(ChangeFileExt(sr.Name, '')); |
109 | res := FindNext(sr); |
||
110 | end; |
||
111 | finally |
||
112 | FindClose(sr); |
||
113 | end; |
||
114 | LevelListBox.Sorted := true; |
||
3 | daniel-mar | 115 | end; |
116 | |||
117 | procedure TSpeicherungForm.LoeschenBtnClick(Sender: TObject); |
||
79 | daniel-mar | 118 | resourcestring |
119 | SDeleteSaveGame = 'Diesen Spielstand wirklich löschen?'; |
||
51 | daniel-mar | 120 | var |
121 | fil: string; |
||
3 | daniel-mar | 122 | begin |
28 | daniel-mar | 123 | if LevelListBox.ItemIndex = -1 then exit; |
124 | |||
79 | daniel-mar | 125 | if MessageDlg(SDeleteSaveGame, mtConfirmation, mbYesNoCancel, 0) = mrYes then |
3 | daniel-mar | 126 | begin |
127 | li1.visible := false; |
||
128 | li2a.visible := false; |
||
129 | li2b.visible := false; |
||
130 | li3a.visible := false; |
||
131 | li3b.visible := false; |
||
132 | li4a.visible := false; |
||
133 | li4b.visible := false; |
||
134 | liu.visible := false; |
||
135 | liw.visible := false; |
||
79 | daniel-mar | 136 | li1.caption := SNa; |
137 | li2b.caption := SNa; |
||
138 | li3b.caption := SNa; |
||
139 | li4b.caption := SNa; |
||
3 | daniel-mar | 140 | LadenBtn.enabled := false; |
141 | LoeschenBtn.enabled := false; |
||
51 | daniel-mar | 142 | fil := GetSaveGameFileName(LevelListBox.Items.strings[LevelListBox.itemindex], false); |
79 | daniel-mar | 143 | if not fileexists(fil) then raise Exception.Create(SSaveGameFileNotFound); |
51 | daniel-mar | 144 | deletefile(fil); |
3 | daniel-mar | 145 | searchsaves; |
146 | end; |
||
147 | end; |
||
148 | |||
51 | daniel-mar | 149 | function TSpeicherungForm.GetSaveGameFileName(SpielstandName: string; forceuserdir: boolean): string; |
150 | var |
||
151 | usr, sys: string; |
||
152 | begin |
||
79 | daniel-mar | 153 | usr := IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisUser) + SpielstandName + '.sav'; // ab SpaceMission 1.2+ // do not localize |
154 | sys := IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisSystem) + SpielstandName + '.sav'; // alte Versionen von SpaceMission <1.2 // do not localize |
||
51 | daniel-mar | 155 | if fileexists(usr) or forceuserdir then exit(usr); |
156 | if fileexists(sys) then exit(sys); |
||
157 | exit(usr); |
||
158 | end; |
||
159 | |||
3 | daniel-mar | 160 | procedure TSpeicherungForm.LadenBtnClick(Sender: TObject); |
161 | var |
||
15 | daniel-mar | 162 | SavGame: TSaveData; |
51 | daniel-mar | 163 | fil: string; |
3 | daniel-mar | 164 | begin |
28 | daniel-mar | 165 | if LevelListBox.ItemIndex = -1 then exit; |
166 | |||
3 | daniel-mar | 167 | if LevelListBox.items.count = 0 then |
168 | begin |
||
169 | li1.visible := false; |
||
170 | li2a.visible := false; |
||
171 | li2b.visible := false; |
||
172 | li3a.visible := false; |
||
173 | li3b.visible := false; |
||
174 | li4a.visible := false; |
||
175 | li4b.visible := false; |
||
176 | liu.visible := false; |
||
177 | liw.visible := false; |
||
79 | daniel-mar | 178 | li1.caption := SNa; |
179 | li2b.caption := SNa; |
||
180 | li3b.caption := SNa; |
||
181 | li4b.caption := SNa; |
||
3 | daniel-mar | 182 | LadenBtn.enabled := false; |
183 | LoeschenBtn.enabled := false; |
||
184 | end; |
||
185 | {if liu.visible or (LevelListBox.items.count=0) then |
||
186 | exit;} |
||
15 | daniel-mar | 187 | SavGame := TSaveData.Create; |
188 | try |
||
51 | daniel-mar | 189 | fil := GetSaveGameFileName(LevelListBox.Items.strings[LevelListBox.itemindex], false); |
79 | daniel-mar | 190 | if not fileexists(fil) then raise Exception.Create(SSaveGameFileNotFound); |
51 | daniel-mar | 191 | SavGame.LoadFromFile(fil); |
40 | daniel-mar | 192 | mainform.FScore := SavGame.Score; |
193 | mainform.FLife := SavGame.Life; |
||
194 | mainform.FLevel := SavGame.Level; |
||
195 | mainform.FGameMode := SavGame.GameMode; |
||
45 | daniel-mar | 196 | MainForm.FLevelDataAlreadyLoaded := true; // do not call NewLevel() in StartSceneMain |
40 | daniel-mar | 197 | if Assigned(SavGame.LevelData) then |
198 | begin |
||
199 | MainForm.LevelData.Assign(SavGame.LevelData); |
||
200 | end; |
||
15 | daniel-mar | 201 | finally |
202 | FreeAndNil(SavGame); |
||
203 | end; |
||
31 | daniel-mar | 204 | mainform.playsound(smsSceneMov, false); |
3 | daniel-mar | 205 | mainform.FNextScene := gsNewLevel; |
89 | daniel-mar | 206 | mainform.FCheats := []; |
3 | daniel-mar | 207 | close; |
208 | end; |
||
209 | |||
210 | procedure TSpeicherungForm.SpeichernBtnClick(Sender: TObject); |
||
79 | daniel-mar | 211 | resourcestring |
212 | SNoValidSaveGameName = 'Dies ist kein gültiger Spielstandname!'; |
||
213 | SEmptySaveGameName = 'Bitte geben Sie einen Namen für den Spielstand ein'; |
||
214 | SReplaceSaveGame = 'Spielstand ist bereits vorhanden. Ersetzen?'; |
||
3 | daniel-mar | 215 | var |
15 | daniel-mar | 216 | SavGame: TSaveData; |
3 | daniel-mar | 217 | i: integer; |
218 | begin |
||
219 | if Levelname.text = '' then |
||
220 | begin |
||
79 | daniel-mar | 221 | MessageDlg(SEmptySaveGameName, mtError, [mbOK], 0); |
3 | daniel-mar | 222 | LevelName.setfocus; |
223 | exit; |
||
224 | end; |
||
66 | daniel-mar | 225 | for i := 1 to length(LevelName.text) do |
3 | daniel-mar | 226 | begin |
227 | if (copy(LevelName.text, i, 1) = '\') or |
||
228 | (copy(LevelName.text, i, 1) = '/') or |
||
229 | (copy(LevelName.text, i, 1) = ':') or |
||
230 | (copy(LevelName.text, i, 1) = '*') or |
||
231 | (copy(LevelName.text, i, 1) = '?') or |
||
232 | (copy(LevelName.text, i, 1) = '"') or |
||
233 | (copy(LevelName.text, i, 1) = '<') or |
||
234 | (copy(LevelName.text, i, 1) = '>') or |
||
235 | (copy(LevelName.text, i, 1) = '|') then |
||
236 | begin |
||
79 | daniel-mar | 237 | MessageDlg(SNoValidSaveGameName, mtError, [mbOK], 0); |
3 | daniel-mar | 238 | LevelName.setfocus; |
239 | exit; |
||
240 | end; |
||
241 | end; |
||
242 | if LevelListBox.items.IndexOf(LevelName.text) > -1 then |
||
243 | begin |
||
79 | daniel-mar | 244 | if MessageDlg(SReplaceSaveGame, mtConfirmation, mbYesNoCancel, 0) <> mrYes then |
3 | daniel-mar | 245 | exit; |
246 | end; |
||
15 | daniel-mar | 247 | |
248 | SavGame := TSaveData.Create; |
||
249 | try |
||
40 | daniel-mar | 250 | SavGame.Score := mainform.FScoreAtLevelStart;//mainform.FScore; |
251 | SavGame.Life := mainform.FLifeAtLevelStart;//mainform.FLife; |
||
252 | SavGame.Level := mainform.FLevel; |
||
253 | SavGame.GameMode := mainform.FGameMode; |
||
254 | if not Assigned(SavGame.LevelData) then SavGame.LevelData := TLevelData.Create; |
||
255 | SavGame.LevelData.Assign(mainForm.LevelData); |
||
51 | daniel-mar | 256 | SavGame.SaveToFile(GetSaveGameFileName(LevelName.text, true)); |
15 | daniel-mar | 257 | finally |
258 | FreeAndNil(SavGame); |
||
259 | end; |
||
260 | |||
3 | daniel-mar | 261 | SearchSaves; |
262 | end; |
||
263 | |||
264 | procedure TSpeicherungForm.LevelListBoxClick(Sender: TObject); |
||
79 | daniel-mar | 265 | resourcestring |
266 | SNoNA = 'n/a'; |
||
267 | SIsNormalLevel = 'Das Level ist ein norm. Level'; |
||
268 | SIsRandomLevel = 'Das Level ist ein Zufallslevel'; |
||
269 | SHasAttachedLevel = '%s mit Karte'; |
||
3 | daniel-mar | 270 | var |
15 | daniel-mar | 271 | SavGame: TSaveData; |
272 | Punkte, Leben, Level: integer; |
||
40 | daniel-mar | 273 | BeinhaltetLevelDaten: boolean; |
15 | daniel-mar | 274 | Art: TGameMode; |
51 | daniel-mar | 275 | fil: string; |
3 | daniel-mar | 276 | begin |
277 | ladenbtn.enabled := true; |
||
278 | loeschenbtn.enabled := true; |
||
279 | li1.visible := false; |
||
280 | li2a.visible := false; |
||
281 | li2b.visible := false; |
||
282 | li3a.visible := false; |
||
283 | li3b.visible := false; |
||
284 | li4a.visible := false; |
||
285 | li4b.visible := false; |
||
286 | liu.visible := false; |
||
287 | liw.visible := false; |
||
79 | daniel-mar | 288 | li1.caption := SNoNA; |
289 | li2b.caption := SNoNA; |
||
290 | li3b.caption := SNoNA; |
||
291 | li4b.caption := SNoNA; |
||
3 | daniel-mar | 292 | if (LevelListBox.items.count=0) or (LevelListBox.itemindex = -1) then |
293 | begin |
||
294 | ladenbtn.enabled := false; |
||
295 | loeschenbtn.enabled := false; |
||
296 | liw.visible := true; |
||
297 | exit; |
||
298 | end; |
||
299 | LevelName.Text := LevelListBox.Items.strings[LevelListBox.itemindex]; |
||
15 | daniel-mar | 300 | |
301 | SavGame := TSaveData.Create; |
||
302 | try |
||
303 | try |
||
51 | daniel-mar | 304 | fil := GetSaveGameFileName(LevelListBox.Items.strings[LevelListBox.itemindex], false); |
79 | daniel-mar | 305 | if not fileexists(fil) then raise Exception.Create(SSaveGameFileNotFound); |
51 | daniel-mar | 306 | SavGame.LoadFromFile(fil); |
40 | daniel-mar | 307 | Punkte := SavGame.Score; |
308 | Leben := SavGame.Life; |
||
309 | Level := SavGame.Level; |
||
310 | Art := SavGame.GameMode; |
||
311 | BeinhaltetLevelDaten := Assigned(SavGame.LevelData); |
||
15 | daniel-mar | 312 | except |
313 | liu.visible := true; |
||
314 | ladenbtn.enabled := false; |
||
315 | exit; |
||
316 | end; |
||
317 | finally |
||
318 | FreeAndNil(SavGame); |
||
3 | daniel-mar | 319 | end; |
320 | li1.visible := true; |
||
321 | li2a.visible := true; |
||
322 | li2b.visible := true; |
||
323 | li3a.visible := true; |
||
324 | li3b.visible := true; |
||
325 | li4a.visible := true; |
||
326 | li4b.visible := true; |
||
15 | daniel-mar | 327 | if Art = gmLevels then |
79 | daniel-mar | 328 | li1.caption := SIsNormalLevel |
3 | daniel-mar | 329 | else |
79 | daniel-mar | 330 | li1.caption := SIsRandomLevel; |
40 | daniel-mar | 331 | if BeinhaltetLevelDaten then |
79 | daniel-mar | 332 | li1.Caption := Format(SHasAttachedLevel, [li1.Caption]); |
85 | daniel-mar | 333 | li2b.caption := FloatToStrF(Punkte,ffNumber,14,0); |
3 | daniel-mar | 334 | li3b.caption := inttostr(Level); |
335 | li4b.caption := inttostr(Leben); |
||
336 | end; |
||
337 | |||
338 | procedure TSpeicherungForm.LevelNameChange(Sender: TObject); |
||
339 | begin |
||
340 | //listbox1.Items.indexof('Level '+spinedit1.text); |
||
341 | end; |
||
342 | |||
343 | procedure TSpeicherungForm.Button4Click(Sender: TObject); |
||
344 | begin |
||
345 | mainform.dxtimer.enabled := not mainform.gamepause.checked; |
||
346 | close; |
||
347 | end; |
||
348 | |||
349 | procedure TSpeicherungForm.FormShow(Sender: TObject); |
||
350 | begin |
||
351 | mainform.dxtimer.enabled := false; |
||
352 | SearchSaves; |
||
353 | if mainform.FNotSave then |
||
354 | begin |
||
355 | label1.enabled := false; |
||
356 | LevelName.enabled := false; |
||
357 | SpeichernBtn.enabled := false; |
||
358 | end |
||
359 | else |
||
360 | begin |
||
361 | label1.enabled := true; |
||
362 | LevelName.enabled := true; |
||
363 | SpeichernBtn.enabled := true; |
||
364 | end; |
||
365 | end; |
||
366 | |||
51 | daniel-mar | 367 | function TSpeicherungForm.GetSpielstandVerzeichnisSystem: string; |
26 | daniel-mar | 368 | begin |
51 | daniel-mar | 369 | // nicht mehr verwendet seit version 1.2 |
79 | daniel-mar | 370 | result := OwnDirectory + SSaveGameFolder; |
51 | daniel-mar | 371 | end; |
372 | |||
373 | function TSpeicherungForm.GetSpielstandVerzeichnisUser: string; |
||
374 | begin |
||
26 | daniel-mar | 375 | try |
376 | result := GetKnownFolderPath(FOLDERID_SavedGames); |
||
377 | except |
||
378 | result := ''; |
||
379 | end; |
||
380 | if result = '' then |
||
381 | begin |
||
382 | // Pre Vista |
||
79 | daniel-mar | 383 | result := OwnDirectory + SSaveGameFolder; |
26 | daniel-mar | 384 | end |
385 | else |
||
386 | begin |
||
387 | result := IncludeTrailingPathDelimiter(result); |
||
79 | daniel-mar | 388 | result := result + SSaveGameSubFolder; |
26 | daniel-mar | 389 | end; |
390 | result := IncludeTrailingPathDelimiter(result); |
||
391 | ForceDirectories(result); |
||
392 | end; |
||
393 | |||
3 | daniel-mar | 394 | procedure TSpeicherungForm.DsFancyButton2Click(Sender: TObject); |
395 | begin |
||
396 | SearchSaves; |
||
397 | end; |
||
398 | |||
399 | procedure TSpeicherungForm.AbbrechenBtnClick(Sender: TObject); |
||
400 | begin |
||
401 | close; |
||
402 | end; |
||
403 | |||
404 | procedure TSpeicherungForm.FormHide(Sender: TObject); |
||
405 | begin |
||
406 | if not mainform.gamepause.checked then mainform.dxtimer.enabled := true; |
||
407 | end; |
||
408 | |||
409 | procedure TSpeicherungForm.LevelListBoxDblClick(Sender: TObject); |
||
410 | begin |
||
411 | LadenBtn.click; |
||
412 | end; |
||
413 | |||
414 | end. |
||
415 |