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}
45 {$IFDEF ENABLE_SHELLS}
46 g_shells,
47 {$ENDIF}
54 const
63 begin
65 // Ñèãíàòóðà îáúåêòà
68 // Ïîëîæåíèå ïî-ãîðèçîíòàëè
70 // Ïîëîæåíèå ïî-âåðòèêàëè
72 // Îãðàíè÷èâàþùèé ïðÿìîóãîëüíèê
77 // Ñêîðîñòü
80 // Óñêîðåíèå
87 begin
89 // Ñèãíàòóðà îáúåêòà:
92 // Ïîëîæåíèå ïî-ãîðèçîíòàëè
94 // Ïîëîæåíèå ïî-âåðòèêàëè
96 // Îãðàíè÷èâàþùèé ïðÿìîóãîëüíèê
101 // Ñêîðîñòü
104 // Óñêîðåíèå
111 begin
117 var
122 begin
126 try
127 // Îòêðûâàåì ôàéë ñîõðàíåíèé
130 try
132 begin
134 //raise XStreamError.Create('invalid save game signature');
135 exit;
139 begin
143 begin
145 //raise XStreamError.Create('invalid save game version');
146 exit;
148 // Èìÿ ñýéâà
151 end
152 else
153 begin
154 // 7+
155 // Èìÿ ñýéâà
159 //if (utils.readByte(st) <> SAVE_VERSION) then raise XStreamError.Create('invalid save game version');
160 finally
163 except
164 begin
165 //e_WriteLog('GetSaveName Error: '+e.message, MSG_WARNING);
166 //{$IF DEFINED(D2F_DEBUG)}e_WriteStackTrace(e.message);{$ENDIF}
173 {$IFDEF ENABLE_CORPSES}
175 {$ENDIF}
177 begin
179 {$IFDEF ENABLE_CORPSES}
183 {$ENDIF}
185 {$IFDEF ENABLE_CORPSES}
187 begin
189 begin
191 begin
198 {$ENDIF}
202 {$IFDEF ENABLE_CORPSES}
204 {$ENDIF}
206 begin
209 {$IFDEF ENABLE_GIBS}
210 g_Gibs_RemoveAll;
211 {$ENDIF}
212 {$IFDEF ENABLE_SHELLS}
214 {$ENDIF}
215 {$IFDEF ENABLE_CORPSES}
216 g_Corpses_RemoveAll;
217 {$ENDIF}
221 {$IFDEF ENABLE_CORPSES}
225 begin
231 {$ELSE}
234 {$ENDIF}
237 function g_SaveGameTo (const filename: AnsiString; const aname: AnsiString; deleteOnError: Boolean=true): Boolean;
238 var
242 begin
244 try
246 try
249 // Èìÿ ñýéâà
251 // Ïîëíûé ïóòü ê âàäó è êàðòà
252 //if (Length(gCurrentMapFileName) <> 0) then e_LogWritefln('SAVE: current map is ''%s''...', [gCurrentMapFileName]);
254 // Ïóòü ê êàðòå
256 // Èìÿ êàðòû
258 // Êîëè÷åñòâî èãðîêîâ
260 // Èãðîâîå âðåìÿ
262 // Òèï èãðû
264 // Ðåæèì èãðû
266 // Ëèìèò âðåìåíè
268 // Ëèìèò î÷êîâ
270 // Ëèìèò æèçíåé
272 // Èãðîâûå îïöèè
274 // Äëÿ êîîïà
282 ///// Ñîõðàíÿåì ñîñòîÿíèå îáëàñòåé ïðîñìîòðà /////
291 ///// /////
293 ///// Ñîñòîÿíèå êàðòû /////
295 ///// /////
297 ///// Ñîñòîÿíèå ïðåäìåòîâ /////
299 ///// /////
301 ///// Ñîñòîÿíèå òðèããåðîâ /////
303 ///// /////
305 ///// Ñîñòîÿíèå îðóæèÿ /////
307 ///// /////
309 ///// Ñîñòîÿíèå ìîíñòðîâ /////
311 ///// /////
313 ///// Ñîñòîÿíèå òðóïîâ /////
315 ///// /////
317 ///// Ñîõðàíÿåì èãðîêîâ (â òîì ÷èñëå áîòîâ) /////
319 begin
322 begin
324 begin
325 // Ñîñòîÿíèå èãðîêà
331 // Âñå ëè èãðîêè íà ìåñòå
334 ///// /////
336 ///// Ìàðêåð îêîí÷àíèÿ /////
339 ///// /////
341 finally
345 except
347 begin
361 var
368 Game_CoopMonstersKilled,
369 Game_CoopSecretsFound,
370 Game_CoopTotalMonstersKilled,
371 Game_CoopTotalSecretsFound,
372 Game_CoopTotalMonsters,
373 Game_CoopTotalSecrets,
378 {$IF DEFINED(D2F_DEBUG)}
380 {$ENDIF}
381 begin
384 try
386 try
387 if not utils.checkSign(st, 'DFSV') then raise XStreamError.Create('invalid save game signature');
388 if (utils.readByte(st) <> SAVE_VERSION) then raise XStreamError.Create('invalid save game version');
392 {$IF DEFINED(D2F_DEBUG)}
393 try
394 {$ENDIF}
395 //g_Game_Free(false); // don't free textures for the same map
400 ///// Çàãðóæàåì ñîñòîÿíèå èãðû /////
401 // Èìÿ ñýéâà
404 // Ïîëíûé ïóòü ê âàäó è êàðòà
407 if (Length(gCurrentMapFileName) <> 0) then e_LogWritefln('LOAD: previous map was ''%s''...', [gCurrentMapFileName]);
409 // À âîò òóò, íàêîíåö, ÷èñòèì ðåñóðñû
413 // Ïóòü ê êàðòå
415 // Èìÿ êàðòû
417 // Êîëè÷åñòâî èãðîêîâ
419 // Èãðîâîå âðåìÿ
421 // Òèï èãðû
423 // Ðåæèì èãðû
425 // Ëèìèò âðåìåíè
427 // Ëèìèò î÷êîâ
429 // Ëèìèò æèçíåé
431 // Èãðîâûå îïöèè
433 // Äëÿ êîîïà
440 ///// /////
442 ///// Çàãðóæàåì ñîñòîÿíèå îáëàñòåé ïðîñìîòðà /////
443 if not utils.checkSign(st, 'PLVW') then raise XStreamError.Create('invalid viewport signature');
447 ///// /////
449 // Çàãðóæàåì êàðòó:
454 begin
455 // Íàñòðîéêè èãðû
462 end
463 else
464 begin
465 // Íàñòðîéêè èãðû
476 // Çàãðóçêà è çàïóñê êàðòû
477 //FIXME: save/load `asMegawad`
481 // Íàñòðîéêè èãðîêîâ è áîòîâ
484 // Óñòàíàâëèâàåì âðåìÿ
486 // Âîçâðàùàåì ñòàòû
494 ///// Çàãðóæàåì ñîñòîÿíèå êàðòû /////
496 ///// /////
498 ///// Çàãðóæàåì ñîñòîÿíèå ïðåäìåòîâ /////
500 ///// /////
502 ///// Çàãðóæàåì ñîñòîÿíèå òðèããåðîâ /////
504 ///// /////
506 ///// Çàãðóæàåì ñîñòîÿíèå îðóæèÿ /////
508 ///// /////
510 ///// Çàãðóæàåì ñîñòîÿíèå ìîíñòðîâ /////
512 ///// /////
514 ///// Çàãðóæàåì ñîñòîÿíèå òðóïîâ /////
516 ///// /////
518 ///// Çàãðóæàåì èãðîêîâ (â òîì ÷èñëå áîòîâ) /////
520 begin
521 // Çàãðóæàåì
525 // Ïðèâÿçûâàåì îñíîâíûõ èãðîêîâ ê îáëàñòÿì ïðîñìîòðà
530 begin
539 begin
546 ///// /////
548 ///// Ìàðêåð îêîí÷àíèÿ /////
551 ///// /////
553 // Èùåì òðèããåðû ñ óñëîâèåì ñìåðòè ìîíñòðîâ
556 // done
559 {$IF DEFINED(D2F_DEBUG)}
560 except
561 begin
566 {$ENDIF}
567 finally
570 except
572 begin
580 begin
584 {$IF DEFINED(D2F_DEBUG)}e_LogWritefln('stream error position: 0x%08x', [errpos], TMsgType.Warning);{$ENDIF}
598 begin
604 begin