1 (* Copyright (C) Doom 2D: Forever Developers
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, version 3 of the License ONLY.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 *)
15 {$INCLUDE ../shared/a_modes.inc}
18 interface
20 uses
26 function g_SaveGameTo (const filename: AnsiString; const aname: AnsiString; deleteOnError: Boolean=true): Boolean;
36 implementation
38 uses
39 {$IFDEF ENABLE_GIBS}
40 g_gibs,
41 {$ENDIF}
42 {$IFDEF ENABLE_CORPSES}
43 g_corpses,
44 {$ENDIF}
51 const
60 begin
62 // Ñèãíàòóðà îáúåêòà
65 // Ïîëîæåíèå ïî-ãîðèçîíòàëè
67 // Ïîëîæåíèå ïî-âåðòèêàëè
69 // Îãðàíè÷èâàþùèé ïðÿìîóãîëüíèê
74 // Ñêîðîñòü
77 // Óñêîðåíèå
84 begin
86 // Ñèãíàòóðà îáúåêòà:
89 // Ïîëîæåíèå ïî-ãîðèçîíòàëè
91 // Ïîëîæåíèå ïî-âåðòèêàëè
93 // Îãðàíè÷èâàþùèé ïðÿìîóãîëüíèê
98 // Ñêîðîñòü
101 // Óñêîðåíèå
108 begin
114 var
119 begin
123 try
124 // Îòêðûâàåì ôàéë ñîõðàíåíèé
127 try
129 begin
131 //raise XStreamError.Create('invalid save game signature');
132 exit;
136 begin
140 begin
142 //raise XStreamError.Create('invalid save game version');
143 exit;
145 // Èìÿ ñýéâà
148 end
149 else
150 begin
151 // 7+
152 // Èìÿ ñýéâà
156 //if (utils.readByte(st) <> SAVE_VERSION) then raise XStreamError.Create('invalid save game version');
157 finally
160 except
161 begin
162 //e_WriteLog('GetSaveName Error: '+e.message, MSG_WARNING);
163 //{$IF DEFINED(D2F_DEBUG)}e_WriteStackTrace(e.message);{$ENDIF}
170 {$IFDEF ENABLE_CORPSES}
172 {$ENDIF}
174 begin
176 {$IFDEF ENABLE_CORPSES}
180 {$ENDIF}
182 {$IFDEF ENABLE_CORPSES}
184 begin
186 begin
188 begin
195 {$ENDIF}
199 {$IFDEF ENABLE_CORPSES}
201 {$ENDIF}
203 begin
206 {$IFDEF ENABLE_GIBS}
207 g_Gibs_RemoveAll;
208 {$ENDIF}
209 {$IFDEF ENALBE_SHELLS}
211 {$ENDIF}
212 {$IFDEF ENABLE_CORPSES}
213 g_Corpses_RemoveAll;
214 {$ENDIF}
218 {$IFDEF ENABLE_CORPSES}
222 begin
228 {$ELSE}
231 {$ENDIF}
234 function g_SaveGameTo (const filename: AnsiString; const aname: AnsiString; deleteOnError: Boolean=true): Boolean;
235 var
239 begin
241 try
243 try
246 // Èìÿ ñýéâà
248 // Ïîëíûé ïóòü ê âàäó è êàðòà
249 //if (Length(gCurrentMapFileName) <> 0) then e_LogWritefln('SAVE: current map is ''%s''...', [gCurrentMapFileName]);
251 // Ïóòü ê êàðòå
253 // Èìÿ êàðòû
255 // Êîëè÷åñòâî èãðîêîâ
257 // Èãðîâîå âðåìÿ
259 // Òèï èãðû
261 // Ðåæèì èãðû
263 // Ëèìèò âðåìåíè
265 // Ëèìèò î÷êîâ
267 // Ëèìèò æèçíåé
269 // Èãðîâûå îïöèè
271 // Äëÿ êîîïà
279 ///// Ñîõðàíÿåì ñîñòîÿíèå îáëàñòåé ïðîñìîòðà /////
288 ///// /////
290 ///// Ñîñòîÿíèå êàðòû /////
292 ///// /////
294 ///// Ñîñòîÿíèå ïðåäìåòîâ /////
296 ///// /////
298 ///// Ñîñòîÿíèå òðèããåðîâ /////
300 ///// /////
302 ///// Ñîñòîÿíèå îðóæèÿ /////
304 ///// /////
306 ///// Ñîñòîÿíèå ìîíñòðîâ /////
308 ///// /////
310 ///// Ñîñòîÿíèå òðóïîâ /////
312 ///// /////
314 ///// Ñîõðàíÿåì èãðîêîâ (â òîì ÷èñëå áîòîâ) /////
316 begin
319 begin
321 begin
322 // Ñîñòîÿíèå èãðîêà
328 // Âñå ëè èãðîêè íà ìåñòå
331 ///// /////
333 ///// Ìàðêåð îêîí÷àíèÿ /////
336 ///// /////
338 finally
342 except
344 begin
358 var
365 Game_CoopMonstersKilled,
366 Game_CoopSecretsFound,
367 Game_CoopTotalMonstersKilled,
368 Game_CoopTotalSecretsFound,
369 Game_CoopTotalMonsters,
370 Game_CoopTotalSecrets,
375 {$IF DEFINED(D2F_DEBUG)}
377 {$ENDIF}
378 begin
381 try
383 try
384 if not utils.checkSign(st, 'DFSV') then raise XStreamError.Create('invalid save game signature');
385 if (utils.readByte(st) <> SAVE_VERSION) then raise XStreamError.Create('invalid save game version');
389 {$IF DEFINED(D2F_DEBUG)}
390 try
391 {$ENDIF}
392 //g_Game_Free(false); // don't free textures for the same map
397 ///// Çàãðóæàåì ñîñòîÿíèå èãðû /////
398 // Èìÿ ñýéâà
401 // Ïîëíûé ïóòü ê âàäó è êàðòà
404 if (Length(gCurrentMapFileName) <> 0) then e_LogWritefln('LOAD: previous map was ''%s''...', [gCurrentMapFileName]);
406 // À âîò òóò, íàêîíåö, ÷èñòèì ðåñóðñû
410 // Ïóòü ê êàðòå
412 // Èìÿ êàðòû
414 // Êîëè÷åñòâî èãðîêîâ
416 // Èãðîâîå âðåìÿ
418 // Òèï èãðû
420 // Ðåæèì èãðû
422 // Ëèìèò âðåìåíè
424 // Ëèìèò î÷êîâ
426 // Ëèìèò æèçíåé
428 // Èãðîâûå îïöèè
430 // Äëÿ êîîïà
437 ///// /////
439 ///// Çàãðóæàåì ñîñòîÿíèå îáëàñòåé ïðîñìîòðà /////
440 if not utils.checkSign(st, 'PLVW') then raise XStreamError.Create('invalid viewport signature');
444 ///// /////
446 // Çàãðóæàåì êàðòó:
451 begin
452 // Íàñòðîéêè èãðû
459 end
460 else
461 begin
462 // Íàñòðîéêè èãðû
473 // Çàãðóçêà è çàïóñê êàðòû
474 //FIXME: save/load `asMegawad`
478 // Íàñòðîéêè èãðîêîâ è áîòîâ
481 // Óñòàíàâëèâàåì âðåìÿ
483 // Âîçâðàùàåì ñòàòû
491 ///// Çàãðóæàåì ñîñòîÿíèå êàðòû /////
493 ///// /////
495 ///// Çàãðóæàåì ñîñòîÿíèå ïðåäìåòîâ /////
497 ///// /////
499 ///// Çàãðóæàåì ñîñòîÿíèå òðèããåðîâ /////
501 ///// /////
503 ///// Çàãðóæàåì ñîñòîÿíèå îðóæèÿ /////
505 ///// /////
507 ///// Çàãðóæàåì ñîñòîÿíèå ìîíñòðîâ /////
509 ///// /////
511 ///// Çàãðóæàåì ñîñòîÿíèå òðóïîâ /////
513 ///// /////
515 ///// Çàãðóæàåì èãðîêîâ (â òîì ÷èñëå áîòîâ) /////
517 begin
518 // Çàãðóæàåì
522 // Ïðèâÿçûâàåì îñíîâíûõ èãðîêîâ ê îáëàñòÿì ïðîñìîòðà
527 begin
536 begin
543 ///// /////
545 ///// Ìàðêåð îêîí÷àíèÿ /////
548 ///// /////
550 // Èùåì òðèããåðû ñ óñëîâèåì ñìåðòè ìîíñòðîâ
553 // done
556 {$IF DEFINED(D2F_DEBUG)}
557 except
558 begin
563 {$ENDIF}
564 finally
567 except
569 begin
577 begin
581 {$IF DEFINED(D2F_DEBUG)}e_LogWritefln('stream error position: 0x%08x', [errpos], TMsgType.Warning);{$ENDIF}
595 begin
601 begin