Subversion Repositories spacemission

Rev

Rev 45 | Rev 66 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 45 Rev 51
Line 39... Line 39...
39
    procedure DsFancyButton2Click(Sender: TObject);
39
    procedure DsFancyButton2Click(Sender: TObject);
40
    procedure AbbrechenBtnClick(Sender: TObject);
40
    procedure AbbrechenBtnClick(Sender: TObject);
41
    procedure FormHide(Sender: TObject);
41
    procedure FormHide(Sender: TObject);
42
    procedure LevelListBoxDblClick(Sender: TObject);
42
    procedure LevelListBoxDblClick(Sender: TObject);
43
  private
43
  private
-
 
44
    function GetSpielstandVerzeichnisSystem: string;
44
    function GetSpielstandVerzeichnis: string;
45
    function GetSpielstandVerzeichnisUser: string;
-
 
46
    function GetSaveGameFileName(SpielstandName: string; forceuserdir: boolean): string;
45
  public
47
  public
46
    procedure SearchSaves;
48
    procedure SearchSaves;
47
  end;
49
  end;
48
 
50
 
49
var
51
var
50
  SpeicherungForm: TSpeicherungForm;
52
  SpeicherungForm: TSpeicherungForm;
51
 
53
 
52
implementation
54
implementation
53
 
55
 
54
uses
56
uses
55
  Global, GamMain, ComLevelReader, ActiveX, ShlObj;
57
  Global, GamMain, ComLevelReader;
56
 
58
 
57
{$R *.DFM}
59
{$R *.DFM}
58
 
60
 
59
const
-
 
60
  FOLDERID_SavedGames: TGuid = '{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}';
-
 
61
 
-
 
62
function GetKnownFolderPath(const rfid: TGUID): string;
-
 
63
var
-
 
64
  OutPath: PWideChar;
-
 
65
begin
-
 
66
  // https://www.delphipraxis.net/135471-unit-zur-verwendung-von-shgetknownfolderpath.html
-
 
67
  if ShGetKnownFolderPath(rfid, 0, 0, OutPath) {>= 0} = S_OK then
-
 
68
  begin
-
 
69
    Result := OutPath;
-
 
70
    // From MSDN
-
 
71
    // ppszPath [out]
-
 
72
    // Type: PWSTR*
-
 
73
    // When this method returns, contains the address of a pointer to a null-terminated Unicode string that specifies the path of the known folder
-
 
74
    // The calling process is responsible for freeing this resource once it is no longer needed by calling CoTaskMemFree.
-
 
75
    // The returned path does not include a trailing backslash. For example, "C:\Users" is returned rather than "C:\Users\".
-
 
76
    CoTaskMemFree(OutPath);
-
 
77
  end
-
 
78
  else
-
 
79
  begin
-
 
80
    Result := '';
-
 
81
  end;
-
 
82
end;
-
 
83
 
-
 
84
{ TSpeicherungForm }
61
{ TSpeicherungForm }
85
 
62
 
86
procedure TSpeicherungForm.SearchSaves;
63
procedure TSpeicherungForm.SearchSaves;
87
var
64
var
88
  sr: TSearchRec;
65
  sr: TSearchRec;
Line 103... Line 80...
103
  li2b.caption := 'n/a';
80
  li2b.caption := 'n/a';
104
  li3b.caption := 'n/a';
81
  li3b.caption := 'n/a';
105
  li4b.caption := 'n/a';
82
  li4b.caption := 'n/a';
106
  LadenBtn.enabled := false;
83
  LadenBtn.enabled := false;
107
  LoeschenBtn.enabled := false;
84
  LoeschenBtn.enabled := false;
108
  res := FindFirst(IncludeTrailingPathDelimiter(GetSpielstandVerzeichnis)+'*.sav', 0, sr);
85
  res := FindFirst(IncludeTrailingPathDelimiter(GetSpielstandVerzeichnisSystem)+'*.sav', 0, sr);
109
  try
86
  try
110
    while (res = 0) do
87
    while (res = 0) do
111
    begin
88
    begin
112
      if (sr.name <> '.') and (sr.name <> '..') then
89
      if (sr.name <> '.') and (sr.name <> '..') then
113
        LevelListBox.items.Add(ChangeFileExt(sr.Name, ''));
90
        LevelListBox.items.Add(ChangeFileExt(sr.Name, ''));
114
      res := FindNext(sr);
91
      res := FindNext(sr);
115
    end;
92
    end;
116
  finally
93
  finally
117
    FindClose(sr);
94
    FindClose(sr);
118
  end;
95
  end;
-
 
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;
119
end;
109
end;
120
 
110
 
121
procedure TSpeicherungForm.LoeschenBtnClick(Sender: TObject);
111
procedure TSpeicherungForm.LoeschenBtnClick(Sender: TObject);
-
 
112
var
-
 
113
  fil: string;
122
begin
114
begin
123
  if LevelListBox.ItemIndex = -1 then exit;
115
  if LevelListBox.ItemIndex = -1 then exit;
124
 
116
 
125
  if MessageDlg('Diesen Spielstand wirklich löschen?', mtConfirmation, mbYesNoCancel, 0) = mrYes then
117
  if MessageDlg('Diesen Spielstand wirklich löschen?', mtConfirmation, mbYesNoCancel, 0) = mrYes then
126
  begin
118
  begin
Line 137... Line 129...
137
    li2b.caption := 'n/a';
129
    li2b.caption := 'n/a';
138
    li3b.caption := 'n/a';
130
    li3b.caption := 'n/a';
139
    li4b.caption := 'n/a';
131
    li4b.caption := 'n/a';
140
    LadenBtn.enabled := false;
132
    LadenBtn.enabled := false;
141
    LoeschenBtn.enabled := false;
133
    LoeschenBtn.enabled := false;
142
    deletefile(IncludeTrailingPathDelimiter(GetSpielstandVerzeichnis)+LevelListBox.Items.strings[LevelListBox.itemindex]+'.sav');
134
    fil := GetSaveGameFileName(LevelListBox.Items.strings[LevelListBox.itemindex], false);
-
 
135
    if not fileexists(fil) then raise Exception.Create('Spielstandsdatei nicht gefunden');
-
 
136
    deletefile(fil);
143
    searchsaves;
137
    searchsaves;
144
  end;
138
  end;
145
end;
139
end;
146
 
140
 
-
 
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
 
147
procedure TSpeicherungForm.LadenBtnClick(Sender: TObject);
152
procedure TSpeicherungForm.LadenBtnClick(Sender: TObject);
148
var
153
var
149
  SavGame: TSaveData;
154
  SavGame: TSaveData;
-
 
155
  fil: string;
150
begin
156
begin
151
  if LevelListBox.ItemIndex = -1 then exit;
157
  if LevelListBox.ItemIndex = -1 then exit;
152
 
158
 
153
  if LevelListBox.items.count = 0 then
159
  if LevelListBox.items.count = 0 then
154
  begin
160
  begin
Line 170... Line 176...
170
  end;
176
  end;
171
  {if liu.visible or (LevelListBox.items.count=0) then
177
  {if liu.visible or (LevelListBox.items.count=0) then
172
    exit;}
178
    exit;}
173
  SavGame := TSaveData.Create;
179
  SavGame := TSaveData.Create;
174
  try
180
  try
175
    SavGame.LoadFromFile(IncludeTrailingPathDelimiter(GetSpielstandVerzeichnis)+LevelListBox.Items.strings[LevelListBox.itemindex]+'.sav');
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);
176
    mainform.FScore := SavGame.Score;
184
    mainform.FScore := SavGame.Score;
177
    mainform.FLife := SavGame.Life;
185
    mainform.FLife := SavGame.Life;
178
    mainform.FLevel := SavGame.Level;
186
    mainform.FLevel := SavGame.Level;
179
    mainform.FGameMode := SavGame.GameMode;
187
    mainform.FGameMode := SavGame.GameMode;
180
    MainForm.FLevelDataAlreadyLoaded := true; // do not call NewLevel() in StartSceneMain
188
    MainForm.FLevelDataAlreadyLoaded := true; // do not call NewLevel() in StartSceneMain
Line 231... Line 239...
231
    SavGame.Life := mainform.FLifeAtLevelStart;//mainform.FLife;
239
    SavGame.Life := mainform.FLifeAtLevelStart;//mainform.FLife;
232
    SavGame.Level := mainform.FLevel;
240
    SavGame.Level := mainform.FLevel;
233
    SavGame.GameMode := mainform.FGameMode;
241
    SavGame.GameMode := mainform.FGameMode;
234
    if not Assigned(SavGame.LevelData) then SavGame.LevelData := TLevelData.Create;
242
    if not Assigned(SavGame.LevelData) then SavGame.LevelData := TLevelData.Create;
235
    SavGame.LevelData.Assign(mainForm.LevelData);
243
    SavGame.LevelData.Assign(mainForm.LevelData);
236
    SavGame.SaveToFile(IncludeTrailingPathDelimiter(GetSpielstandVerzeichnis)+LevelName.text+'.sav');
244
    SavGame.SaveToFile(GetSaveGameFileName(LevelName.text, true));
237
  finally
245
  finally
238
    FreeAndNil(SavGame);
246
    FreeAndNil(SavGame);
239
  end;
247
  end;
240
 
248
 
241
  SearchSaves;
249
  SearchSaves;
Line 245... Line 253...
245
var
253
var
246
  SavGame: TSaveData;
254
  SavGame: TSaveData;
247
  Punkte, Leben, Level: integer;
255
  Punkte, Leben, Level: integer;
248
  BeinhaltetLevelDaten: boolean;
256
  BeinhaltetLevelDaten: boolean;
249
  Art: TGameMode;
257
  Art: TGameMode;
-
 
258
  fil: string;
250
begin
259
begin
251
  ladenbtn.enabled := true;
260
  ladenbtn.enabled := true;
252
  loeschenbtn.enabled := true;
261
  loeschenbtn.enabled := true;
253
  li1.visible := false;
262
  li1.visible := false;
254
  li2a.visible := false;
263
  li2a.visible := false;
Line 273... Line 282...
273
  LevelName.Text := LevelListBox.Items.strings[LevelListBox.itemindex];
282
  LevelName.Text := LevelListBox.Items.strings[LevelListBox.itemindex];
274
 
283
 
275
  SavGame := TSaveData.Create;
284
  SavGame := TSaveData.Create;
276
  try
285
  try
277
    try
286
    try
278
      SavGame.LoadFromFile(IncludeTrailingPathDelimiter(GetSpielstandVerzeichnis)+LevelListBox.Items.strings[LevelListBox.itemindex]+'.sav');
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);
279
      Punkte := SavGame.Score;
290
      Punkte := SavGame.Score;
280
      Leben := SavGame.Life;
291
      Leben := SavGame.Life;
281
      Level := SavGame.Level;
292
      Level := SavGame.Level;
282
      Art := SavGame.GameMode;
293
      Art := SavGame.GameMode;
283
      BeinhaltetLevelDaten := Assigned(SavGame.LevelData);
294
      BeinhaltetLevelDaten := Assigned(SavGame.LevelData);
Line 334... Line 345...
334
    LevelName.enabled := true;
345
    LevelName.enabled := true;
335
    SpeichernBtn.enabled := true;
346
    SpeichernBtn.enabled := true;
336
  end;
347
  end;
337
end;
348
end;
338
 
349
 
-
 
350
function TSpeicherungForm.GetSpielstandVerzeichnisSystem: string;
-
 
351
begin
-
 
352
  // nicht mehr verwendet seit version 1.2
-
 
353
  result := OwnDirectory + 'Spielstände';
-
 
354
end;
-
 
355
 
339
function TSpeicherungForm.GetSpielstandVerzeichnis: string;
356
function TSpeicherungForm.GetSpielstandVerzeichnisUser: string;
340
begin
357
begin
341
  try
358
  try
342
    result := GetKnownFolderPath(FOLDERID_SavedGames);
359
    result := GetKnownFolderPath(FOLDERID_SavedGames);
343
  except
360
  except
344
    result := '';
361
    result := '';