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, either version 3 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *)
16 {$INCLUDE ../shared/a_modes.inc}
19 interface
21 uses
28 function g_SaveGameTo (const filename: AnsiString; const aname: AnsiString; deleteOnError: Boolean=true): Boolean;
38 implementation
40 uses
47 const
56 begin
58 // Ñèãíàòóðà îáúåêòà
61 // Ïîëîæåíèå ïî-ãîðèçîíòàëè
63 // Ïîëîæåíèå ïî-âåðòèêàëè
65 // Îãðàíè÷èâàþùèé ïðÿìîóãîëüíèê
70 // Ñêîðîñòü
73 // Óñêîðåíèå
80 begin
82 // Ñèãíàòóðà îáúåêòà:
85 // Ïîëîæåíèå ïî-ãîðèçîíòàëè
87 // Ïîëîæåíèå ïî-âåðòèêàëè
89 // Îãðàíè÷èâàþùèé ïðÿìîóãîëüíèê
94 // Ñêîðîñòü
97 // Óñêîðåíèå
104 begin
112 var
116 begin
120 try
121 // Îòêðûâàåì ôàéë ñîõðàíåíèé
123 try
124 if not utils.checkSign(st, 'DFSV') then raise XStreamError.Create('invalid save game signature');
127 begin
131 // Èìÿ ñýéâà
134 end
135 else
136 begin
137 // 7+
138 // Èìÿ ñýéâà
142 //if (utils.readByte(st) <> SAVE_VERSION) then raise XStreamError.Create('invalid save game version');
143 finally
146 except
148 begin
157 function g_SaveGameTo (const filename: AnsiString; const aname: AnsiString; deleteOnError: Boolean=true): Boolean;
158 var
162 begin
164 try
166 try
169 // Èìÿ ñýéâà
171 // Ïîëíûé ïóòü ê âàäó è êàðòà
172 //if (Length(gCurrentMapFileName) <> 0) then e_LogWritefln('SAVE: current map is ''%s''...', [gCurrentMapFileName]);
174 // Ïóòü ê êàðòå
176 // Èìÿ êàðòû
178 // Êîëè÷åñòâî èãðîêîâ
180 // Èãðîâîå âðåìÿ
182 // Òèï èãðû
184 // Ðåæèì èãðû
186 // Ëèìèò âðåìåíè
188 // Ëèìèò î÷êîâ
190 // Ëèìèò æèçíåé
192 // Èãðîâûå îïöèè
194 // Äëÿ êîîïà
202 ///// Ñîõðàíÿåì ñîñòîÿíèå îáëàñòåé ïðîñìîòðà /////
211 ///// /////
213 ///// Ñîñòîÿíèå êàðòû /////
215 ///// /////
217 ///// Ñîñòîÿíèå ïðåäìåòîâ /////
219 ///// /////
221 ///// Ñîñòîÿíèå òðèããåðîâ /////
223 ///// /////
225 ///// Ñîñòîÿíèå îðóæèÿ /////
227 ///// /////
229 ///// Ñîñòîÿíèå ìîíñòðîâ /////
231 ///// /////
233 ///// Ñîñòîÿíèå òðóïîâ /////
235 ///// /////
237 ///// Ñîõðàíÿåì èãðîêîâ (â òîì ÷èñëå áîòîâ) /////
239 begin
242 begin
244 begin
245 // Ñîñòîÿíèå èãðîêà
251 // Âñå ëè èãðîêè íà ìåñòå
254 ///// /////
256 ///// Ìàðêåð îêîí÷àíèÿ /////
259 ///// /////
261 finally
265 except
267 begin
280 var
287 Game_CoopMonstersKilled,
288 Game_CoopSecretsFound,
289 Game_CoopTotalMonstersKilled,
290 Game_CoopTotalSecretsFound,
291 Game_CoopTotalMonsters,
292 Game_CoopTotalSecrets,
297 {$IF DEFINED(D2F_DEBUG)}
299 {$ENDIF}
300 begin
303 try
305 try
306 if not utils.checkSign(st, 'DFSV') then raise XStreamError.Create('invalid save game signature');
307 if (utils.readByte(st) <> SAVE_VERSION) then raise XStreamError.Create('invalid save game version');
312 //g_Game_Free(false); // don't free textures for the same map
317 ///// Çàãðóæàåì ñîñòîÿíèå èãðû /////
318 // Èìÿ ñýéâà
321 // Ïîëíûé ïóòü ê âàäó è êàðòà
324 if (Length(gCurrentMapFileName) <> 0) then e_LogWritefln('LOAD: previous map was ''%s''...', [gCurrentMapFileName]);
326 // À âîò òóò, íàêîíåö, ÷èñòèì ðåñóðñû
330 // Ïóòü ê êàðòå
332 // Èìÿ êàðòû
334 // Êîëè÷åñòâî èãðîêîâ
336 // Èãðîâîå âðåìÿ
338 // Òèï èãðû
340 // Ðåæèì èãðû
342 // Ëèìèò âðåìåíè
344 // Ëèìèò î÷êîâ
346 // Ëèìèò æèçíåé
348 // Èãðîâûå îïöèè
350 // Äëÿ êîîïà
357 ///// /////
359 ///// Çàãðóæàåì ñîñòîÿíèå îáëàñòåé ïðîñìîòðà /////
360 if not utils.checkSign(st, 'PLVW') then raise XStreamError.Create('invalid viewport signature');
364 ///// /////
366 // Çàãðóæàåì êàðòó:
371 begin
372 // Íàñòðîéêè èãðû
379 end
380 else
381 begin
382 // Íàñòðîéêè èãðû
393 // Óñòàíîâêà ðàçìåðîâ îêîí èãðîêîâ
396 // Çàãðóçêà è çàïóñê êàðòû
398 begin
400 exit;
403 // Íàñòðîéêè èãðîêîâ è áîòîâ
406 // Óñòàíàâëèâàåì âðåìÿ
408 // Âîçâðàùàåì ñòàòû
416 ///// Çàãðóæàåì ñîñòîÿíèå êàðòû /////
418 ///// /////
420 ///// Çàãðóæàåì ñîñòîÿíèå ïðåäìåòîâ /////
422 ///// /////
424 ///// Çàãðóæàåì ñîñòîÿíèå òðèããåðîâ /////
426 ///// /////
428 ///// Çàãðóæàåì ñîñòîÿíèå îðóæèÿ /////
430 ///// /////
432 ///// Çàãðóæàåì ñîñòîÿíèå ìîíñòðîâ /////
434 ///// /////
436 ///// Çàãðóæàåì ñîñòîÿíèå òðóïîâ /////
438 ///// /////
440 ///// Çàãðóæàåì èãðîêîâ (â òîì ÷èñëå áîòîâ) /////
442 begin
443 // Çàãðóæàåì
447 // Ïðèâÿçûâàåì îñíîâíûõ èãðîêîâ ê îáëàñòÿì ïðîñìîòðà
452 begin
461 begin
468 ///// /////
470 ///// Ìàðêåð îêîí÷àíèÿ /////
473 ///// /////
475 // Èùåì òðèããåðû ñ óñëîâèåì ñìåðòè ìîíñòðîâ
478 // done
481 {$IF DEFINED(D2F_DEBUG)}
482 except
483 begin
488 {$ENDIF}
489 finally
492 except
494 begin
497 {$IF DEFINED(D2F_DEBUG)}e_LogWritefln('stream error position: 0x%08x', [errpos], MSG_WARNING);{$ENDIF}
508 begin
516 begin