Subversion Repositories spacemission

Rev

Rev 45 | Rev 66 | Go to most recent revision | 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
 
26 daniel-mar 61
{ TSpeicherungForm }
62
 
3 daniel-mar 63
procedure TSpeicherungForm.SearchSaves;
64
var
65
  sr: TSearchRec;
66
  res: integer;
67
begin
68
  LevelName.text := '';
69
  LevelListBox.items.clear;
70
  li1.visible := false;
71
  li2a.visible := false;
72
  li2b.visible := false;
73
  li3a.visible := false;
74
  li3b.visible := false;
75
  li4a.visible := false;
76
  li4b.visible := false;
77
  liu.visible := false;
78
  liw.visible := true;
79
  li1.caption := 'n/a';
80
  li2b.caption := 'n/a';
81
  li3b.caption := 'n/a';
82
  li4b.caption := 'n/a';
83
  LadenBtn.enabled := false;
84
  LoeschenBtn.enabled := false;
51 daniel-mar 85
  res := FindFirst(IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisSystem)+'*.sav', 0, sr);
3 daniel-mar 86
  try
87
    while (res = 0) do
88
    begin
89
      if (sr.name <> '.') and (sr.name <> '..') then
24 daniel-mar 90
        LevelListBox.items.Add(ChangeFileExt(sr.Name, ''));
3 daniel-mar 91
      res := FindNext(sr);
92
    end;
93
  finally
94
    FindClose(sr);
95
  end;
51 daniel-mar 96
  res := FindFirst(IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisUser)+'*.sav', 0, sr);
97
  try
98
    while (res = 0) do
99
    begin
100
      // Anmerkung: Contains() ist nicht case-sensitive
101
      if (sr.name <> '.') and (sr.name <> '..') and not LevelListBox.Items.Contains(ChangeFileExt(sr.Name, '')) then
102
        LevelListBox.items.Add(ChangeFileExt(sr.Name, ''));
103
      res := FindNext(sr);
104
    end;
105
  finally
106
    FindClose(sr);
107
  end;
108
  LevelListBox.Sorted := true;
3 daniel-mar 109
end;
110
 
111
procedure TSpeicherungForm.LoeschenBtnClick(Sender: TObject);
51 daniel-mar 112
var
113
  fil: string;
3 daniel-mar 114
begin
28 daniel-mar 115
  if LevelListBox.ItemIndex = -1 then exit;
116
 
117
  if MessageDlg('Diesen Spielstand wirklich löschen?', mtConfirmation, mbYesNoCancel, 0) = mrYes then
3 daniel-mar 118
  begin
119
    li1.visible := false;
120
    li2a.visible := false;
121
    li2b.visible := false;
122
    li3a.visible := false;
123
    li3b.visible := false;
124
    li4a.visible := false;
125
    li4b.visible := false;
126
    liu.visible := false;
127
    liw.visible := false;
128
    li1.caption := 'n/a';
129
    li2b.caption := 'n/a';
130
    li3b.caption := 'n/a';
131
    li4b.caption := 'n/a';
132
    LadenBtn.enabled := false;
133
    LoeschenBtn.enabled := false;
51 daniel-mar 134
    fil := GetSaveGameFileName(LevelListBox.Items.strings[LevelListBox.itemindex], false);
135
    if not fileexists(fil) then raise Exception.Create('Spielstandsdatei nicht gefunden');
136
    deletefile(fil);
3 daniel-mar 137
    searchsaves;
138
  end;
139
end;
140
 
51 daniel-mar 141
function TSpeicherungForm.GetSaveGameFileName(SpielstandName: string; forceuserdir: boolean): string;
142
var
143
  usr, sys: string;
144
begin
145
  usr := IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisUser) + SpielstandName + '.sav'; // ab SpaceMission 1.2+
146
  sys := IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisSystem) + SpielstandName + '.sav'; // alte Versionen von SpaceMission <1.2
147
  if fileexists(usr) or forceuserdir then exit(usr);
148
  if fileexists(sys) then exit(sys);
149
  exit(usr);
150
end;
151
 
3 daniel-mar 152
procedure TSpeicherungForm.LadenBtnClick(Sender: TObject);
153
var
15 daniel-mar 154
  SavGame: TSaveData;
51 daniel-mar 155
  fil: string;
3 daniel-mar 156
begin
28 daniel-mar 157
  if LevelListBox.ItemIndex = -1 then exit;
158
 
3 daniel-mar 159
  if LevelListBox.items.count = 0 then
160
  begin
161
    li1.visible := false;
162
    li2a.visible := false;
163
    li2b.visible := false;
164
    li3a.visible := false;
165
    li3b.visible := false;
166
    li4a.visible := false;
167
    li4b.visible := false;
168
    liu.visible := false;
169
    liw.visible := false;
170
    li1.caption := 'n/a';
171
    li2b.caption := 'n/a';
172
    li3b.caption := 'n/a';
173
    li4b.caption := 'n/a';
174
    LadenBtn.enabled := false;
175
    LoeschenBtn.enabled := false;
176
  end;
177
  {if liu.visible or (LevelListBox.items.count=0) then
178
    exit;}
15 daniel-mar 179
  SavGame := TSaveData.Create;
180
  try
51 daniel-mar 181
    fil := GetSaveGameFileName(LevelListBox.Items.strings[LevelListBox.itemindex], false);
182
    if not fileexists(fil) then raise Exception.Create('Spielstandsdatei nicht gefunden');
183
    SavGame.LoadFromFile(fil);
40 daniel-mar 184
    mainform.FScore := SavGame.Score;
185
    mainform.FLife := SavGame.Life;
186
    mainform.FLevel := SavGame.Level;
187
    mainform.FGameMode := SavGame.GameMode;
45 daniel-mar 188
    MainForm.FLevelDataAlreadyLoaded := true; // do not call NewLevel() in StartSceneMain
40 daniel-mar 189
    if Assigned(SavGame.LevelData) then
190
    begin
191
      MainForm.LevelData.Assign(SavGame.LevelData);
192
    end;
15 daniel-mar 193
  finally
194
    FreeAndNil(SavGame);
195
  end;
31 daniel-mar 196
  mainform.playsound(smsSceneMov, false);
3 daniel-mar 197
  mainform.FNextScene := gsNewLevel;
198
  mainform.FCheat := false;
199
  close;
200
end;
201
 
202
procedure TSpeicherungForm.SpeichernBtnClick(Sender: TObject);
203
var
15 daniel-mar 204
  SavGame: TSaveData;
3 daniel-mar 205
  i: integer;
206
begin
207
  if Levelname.text = '' then
208
  begin
209
    MessageDlg('Dies ist kein gültiger Spielstandname!', mtError, [mbOK], 0);
210
    LevelName.setfocus;
211
    exit;
212
  end;
213
  for i := 0 to length(LevelName.text) do
214
  begin
215
    if (copy(LevelName.text, i, 1) = '\') or
216
      (copy(LevelName.text, i, 1) = '/') or
217
      (copy(LevelName.text, i, 1) = ':') or
218
      (copy(LevelName.text, i, 1) = '*') or
219
      (copy(LevelName.text, i, 1) = '?') or
220
      (copy(LevelName.text, i, 1) = '"') or
221
      (copy(LevelName.text, i, 1) = '<') or
222
      (copy(LevelName.text, i, 1) = '>') or
223
      (copy(LevelName.text, i, 1) = '|') then
224
    begin
225
      MessageDlg('Dies ist kein gültiger Spielstandname!', mtError, [mbOK], 0);
226
      LevelName.setfocus;
227
      exit;
228
    end;
229
  end;
230
  if LevelListBox.items.IndexOf(LevelName.text) > -1 then
231
  begin
28 daniel-mar 232
    if MessageDlg('Spielstand ist bereits vorhanden. Ersetzen?', mtConfirmation, mbYesNoCancel, 0) <> mrYes then
3 daniel-mar 233
      exit;
234
  end;
15 daniel-mar 235
 
236
  SavGame := TSaveData.Create;
237
  try
40 daniel-mar 238
    SavGame.Score := mainform.FScoreAtLevelStart;//mainform.FScore;
239
    SavGame.Life := mainform.FLifeAtLevelStart;//mainform.FLife;
240
    SavGame.Level := mainform.FLevel;
241
    SavGame.GameMode := mainform.FGameMode;
242
    if not Assigned(SavGame.LevelData) then SavGame.LevelData := TLevelData.Create;
243
    SavGame.LevelData.Assign(mainForm.LevelData);
51 daniel-mar 244
    SavGame.SaveToFile(GetSaveGameFileName(LevelName.text, true));
15 daniel-mar 245
  finally
246
    FreeAndNil(SavGame);
247
  end;
248
 
3 daniel-mar 249
  SearchSaves;
250
end;
251
 
252
procedure TSpeicherungForm.LevelListBoxClick(Sender: TObject);
253
var
15 daniel-mar 254
  SavGame: TSaveData;
255
  Punkte, Leben, Level: integer;
40 daniel-mar 256
  BeinhaltetLevelDaten: boolean;
15 daniel-mar 257
  Art: TGameMode;
51 daniel-mar 258
  fil: string;
3 daniel-mar 259
begin
260
  ladenbtn.enabled := true;
261
  loeschenbtn.enabled := true;
262
  li1.visible := false;
263
  li2a.visible := false;
264
  li2b.visible := false;
265
  li3a.visible := false;
266
  li3b.visible := false;
267
  li4a.visible := false;
268
  li4b.visible := false;
269
  liu.visible := false;
270
  liw.visible := false;
271
  li1.caption := 'n/a';
272
  li2b.caption := 'n/a';
273
  li3b.caption := 'n/a';
274
  li4b.caption := 'n/a';
275
  if (LevelListBox.items.count=0) or (LevelListBox.itemindex = -1) then
276
  begin
277
    ladenbtn.enabled := false;
278
    loeschenbtn.enabled := false;
279
    liw.visible := true;
280
    exit;
281
  end;
282
  LevelName.Text := LevelListBox.Items.strings[LevelListBox.itemindex];
15 daniel-mar 283
 
284
  SavGame := TSaveData.Create;
285
  try
286
    try
51 daniel-mar 287
      fil := GetSaveGameFileName(LevelListBox.Items.strings[LevelListBox.itemindex], false);
288
      if not fileexists(fil) then raise Exception.Create('Spielstandsdatei nicht gefunden');
289
      SavGame.LoadFromFile(fil);
40 daniel-mar 290
      Punkte := SavGame.Score;
291
      Leben := SavGame.Life;
292
      Level := SavGame.Level;
293
      Art := SavGame.GameMode;
294
      BeinhaltetLevelDaten := Assigned(SavGame.LevelData);
15 daniel-mar 295
    except
296
      liu.visible := true;
297
      ladenbtn.enabled := false;
298
      exit;
299
    end;
300
  finally
301
    FreeAndNil(SavGame);
3 daniel-mar 302
  end;
303
  li1.visible := true;
304
  li2a.visible := true;
305
  li2b.visible := true;
306
  li3a.visible := true;
307
  li3b.visible := true;
308
  li4a.visible := true;
309
  li4b.visible := true;
15 daniel-mar 310
  if Art = gmLevels then
40 daniel-mar 311
    li1.caption := 'Das Level ist ein norm. Level'
3 daniel-mar 312
  else
40 daniel-mar 313
    li1.caption := 'Das Level ist ein Zufallslevel';
314
  if BeinhaltetLevelDaten then
315
    li1.Caption := li1.Caption + ' mit Karte';
3 daniel-mar 316
  li3b.caption := inttostr(Level);
317
  li4b.caption := inttostr(Leben);
318
  li2b.caption := inttostr(Punkte);
319
end;
320
 
321
procedure TSpeicherungForm.LevelNameChange(Sender: TObject);
322
begin
323
  //listbox1.Items.indexof('Level '+spinedit1.text);
324
end;
325
 
326
procedure TSpeicherungForm.Button4Click(Sender: TObject);
327
begin
328
  mainform.dxtimer.enabled := not mainform.gamepause.checked;
329
  close;
330
end;
331
 
332
procedure TSpeicherungForm.FormShow(Sender: TObject);
333
begin
334
  mainform.dxtimer.enabled := false;
335
  SearchSaves;
336
  if mainform.FNotSave then
337
  begin
338
    label1.enabled := false;
339
    LevelName.enabled := false;
340
    SpeichernBtn.enabled := false;
341
  end
342
  else
343
  begin
344
    label1.enabled := true;
345
    LevelName.enabled := true;
346
    SpeichernBtn.enabled := true;
347
  end;
348
end;
349
 
51 daniel-mar 350
function TSpeicherungForm.GetSpielstandVerzeichnisSystem: string;
26 daniel-mar 351
begin
51 daniel-mar 352
  // nicht mehr verwendet seit version 1.2
353
  result := OwnDirectory + 'Spielstände';
354
end;
355
 
356
function TSpeicherungForm.GetSpielstandVerzeichnisUser: string;
357
begin
26 daniel-mar 358
  try
359
    result := GetKnownFolderPath(FOLDERID_SavedGames);
360
  except
361
    result := '';
362
  end;
363
  if result = '' then
364
  begin
365
    // Pre Vista
31 daniel-mar 366
    result := OwnDirectory + 'Spielstände';
26 daniel-mar 367
  end
368
  else
369
  begin
370
    result := IncludeTrailingPathDelimiter(result);
371
    result := result + 'SpaceMission';
372
  end;
373
  result := IncludeTrailingPathDelimiter(result);
374
  ForceDirectories(result);
375
end;
376
 
3 daniel-mar 377
procedure TSpeicherungForm.DsFancyButton2Click(Sender: TObject);
378
begin
379
  SearchSaves;
380
end;
381
 
382
procedure TSpeicherungForm.AbbrechenBtnClick(Sender: TObject);
383
begin
384
  close;
385
end;
386
 
387
procedure TSpeicherungForm.FormHide(Sender: TObject);
388
begin
389
  if not mainform.gamepause.checked then mainform.dxtimer.enabled := true;
390
end;
391
 
392
procedure TSpeicherungForm.LevelListBoxDblClick(Sender: TObject);
393
begin
394
  LadenBtn.click;
395
end;
396
 
397
end.
398