Rev 45 | Rev 66 | Go to most recent revision | Show entire file | Ignore 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 := ''; |