Subversion Repositories spacemission

Rev

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