17 #include <stdio.h> // FILE
23 char savname
[SAVE_MAX
][SAVE_MAXLEN
];
26 static void DOT_savegame (FILE *h
) {
28 for (i
= n
= 0; i
< MAXDOT
; ++i
) {
34 for (i
= 0; i
< MAXDOT
; ++i
) {
36 myfwrite32(dot
[i
].o
.x
, h
);
37 myfwrite32(dot
[i
].o
.y
, h
);
38 myfwrite32(dot
[i
].o
.xv
, h
);
39 myfwrite32(dot
[i
].o
.yv
, h
);
40 myfwrite32(dot
[i
].o
.vx
, h
);
41 myfwrite32(dot
[i
].o
.vy
, h
);
42 myfwrite32(dot
[i
].o
.r
, h
);
43 myfwrite32(dot
[i
].o
.h
, h
);
44 myfwrite8(dot
[i
].c
, h
);
45 myfwrite8(dot
[i
].t
, h
);
50 static void DOT_loadgame (FILE *h
) {
53 for (i
= 0; i
< n
; i
++) {
54 dot
[i
].o
.x
= myfread32(h
);
55 dot
[i
].o
.y
= myfread32(h
);
56 dot
[i
].o
.xv
= myfread32(h
);
57 dot
[i
].o
.yv
= myfread32(h
);
58 dot
[i
].o
.vx
= myfread32(h
);
59 dot
[i
].o
.vy
= myfread32(h
);
60 dot
[i
].o
.r
= myfread32(h
);
61 dot
[i
].o
.h
= myfread32(h
);
62 dot
[i
].c
= myfread8(h
);
63 dot
[i
].t
= myfread8(h
);
67 static void FX_savegame (FILE *h
) {
69 for (i
= n
= 0; i
< MAXFX
; ++i
) {
75 for (i
= 0; i
< MAXFX
; ++i
) {
77 myfwrite32(fx
[i
].x
, h
);
78 myfwrite32(fx
[i
].y
, h
);
79 myfwrite32(fx
[i
].xv
, h
);
80 myfwrite32(fx
[i
].yv
, h
);
81 myfwrite8(fx
[i
].t
, h
);
82 myfwrite8(fx
[i
].s
, h
);
87 static void FX_loadgame (FILE *h
) {
90 for (i
= 0; i
< n
; i
++) {
91 fx
[i
].x
= myfread32(h
);
92 fx
[i
].y
= myfread32(h
);
93 fx
[i
].xv
= myfread32(h
);
94 fx
[i
].yv
= myfread32(h
);
95 fx
[i
].t
= myfread8(h
);
96 fx
[i
].s
= myfread8(h
);
100 static void G_savegame (FILE *h
) {
103 myfwrite8(g_exit
, h
);
105 myfwrite32(g_time
, h
);
106 myfwrite32(dm_pl1p
, h
);
107 myfwrite32(dm_pl2p
, h
);
108 myfwrite32(dm_pnum
, h
);
110 while (i
< dm_pnum
) {
111 myfwrite32(dm_pos
[i
].x
, h
);
112 myfwrite32(dm_pos
[i
].y
, h
);
113 myfwrite8(dm_pos
[i
].d
, h
);
117 myfwrite(g_music
, 8, 1, h
);
120 static void G_loadgame (FILE *h
) {
123 g_exit
= myfread8(h
);
125 g_time
= myfread32(h
);
126 dm_pl1p
= myfread32(h
);
127 dm_pl2p
= myfread32(h
);
128 dm_pnum
= myfread32(h
);
130 while (i
< dm_pnum
) {
131 dm_pos
[i
].x
= myfread32(h
);
132 dm_pos
[i
].y
= myfread32(h
);
133 dm_pos
[i
].d
= myfread8(h
);
137 myfread(g_music
, 8, 1, h
);
141 static void IT_savegame (FILE *h
) {
143 for (n
= MAXITEM
- 1; n
>= 0 && it
[n
].t
== 0; n
--) {
148 for (i
= 0; i
< n
; i
++) {
149 myfwrite32(it
[i
].o
.x
, h
);
150 myfwrite32(it
[i
].o
.y
, h
);
151 myfwrite32(it
[i
].o
.xv
, h
);
152 myfwrite32(it
[i
].o
.yv
, h
);
153 myfwrite32(it
[i
].o
.vx
, h
);
154 myfwrite32(it
[i
].o
.vy
, h
);
155 myfwrite32(it
[i
].o
.r
, h
);
156 myfwrite32(it
[i
].o
.h
, h
);
157 myfwrite32(it
[i
].t
, h
);
158 myfwrite32(it
[i
].s
, h
);
160 myfwrite32(itm_rtime
, h
);
163 static void IT_loadgame (FILE *h
) {
166 for (i
= 0; i
< n
; i
++) {
167 it
[i
].o
.x
= myfread32(h
);
168 it
[i
].o
.y
= myfread32(h
);
169 it
[i
].o
.xv
= myfread32(h
);
170 it
[i
].o
.yv
= myfread32(h
);
171 it
[i
].o
.vx
= myfread32(h
);
172 it
[i
].o
.vy
= myfread32(h
);
173 it
[i
].o
.r
= myfread32(h
);
174 it
[i
].o
.h
= myfread32(h
);
175 it
[i
].t
= myfread32(h
);
176 it
[i
].s
= myfread32(h
);
178 itm_rtime
= myfread32(h
);
181 static void MN_savegame (FILE *h
) {
183 for (n
= MAXMN
- 1; n
>= 0 && mn
[n
].t
== 0; n
--) {
188 for (i
= 0; i
< n
; i
++) {
189 myfwrite32(mn
[i
].o
.x
, h
);
190 myfwrite32(mn
[i
].o
.y
, h
);
191 myfwrite32(mn
[i
].o
.xv
, h
);
192 myfwrite32(mn
[i
].o
.yv
, h
);
193 myfwrite32(mn
[i
].o
.vx
, h
);
194 myfwrite32(mn
[i
].o
.vy
, h
);
195 myfwrite32(mn
[i
].o
.r
, h
);
196 myfwrite32(mn
[i
].o
.h
, h
);
197 myfwrite8(mn
[i
].t
, h
);
198 myfwrite8(mn
[i
].d
, h
);
199 myfwrite8(mn
[i
].st
, h
);
200 myfwrite8(mn
[i
].ftime
, h
);
201 myfwrite32(mn
[i
].fobj
, h
);
202 myfwrite32(mn
[i
].s
, h
);
203 myfwrite32(0, h
); // mn[i].ap useless, changed after load
204 myfwrite32(mn
[i
].aim
, h
);
205 myfwrite32(mn
[i
].life
, h
);
206 myfwrite32(mn
[i
].pain
, h
);
207 myfwrite32(mn
[i
].ac
, h
);
208 myfwrite32(mn
[i
].tx
, h
);
209 myfwrite32(mn
[i
].ty
, h
);
210 myfwrite32(mn
[i
].ammo
, h
);
211 myfwrite16(mn
[i
].atm
, h
);
214 myfwrite32(gsndt
, h
);
217 static void MN_loadgame (FILE *h
) {
220 for (i
= 0; i
< n
; i
++) {
221 mn
[i
].o
.x
= myfread32(h
);
222 mn
[i
].o
.y
= myfread32(h
);
223 mn
[i
].o
.xv
= myfread32(h
);
224 mn
[i
].o
.yv
= myfread32(h
);
225 mn
[i
].o
.vx
= myfread32(h
);
226 mn
[i
].o
.vy
= myfread32(h
);
227 mn
[i
].o
.r
= myfread32(h
);
228 mn
[i
].o
.h
= myfread32(h
);
229 mn
[i
].t
= myfread8(h
);
230 mn
[i
].d
= myfread8(h
);
231 mn
[i
].st
= myfread8(h
);
232 mn
[i
].ftime
= myfread8(h
);
233 mn
[i
].fobj
= myfread32(h
);
234 mn
[i
].s
= myfread32(h
);
235 mn
[i
].ap
= NULL
; myfread32(h
); // useless, changed after loading
236 mn
[i
].aim
= myfread32(h
);
237 mn
[i
].life
= myfread32(h
);
238 mn
[i
].pain
= myfread32(h
);
239 mn
[i
].ac
= myfread32(h
);
240 mn
[i
].tx
= myfread32(h
);
241 mn
[i
].ty
= myfread32(h
);
242 mn
[i
].ammo
= myfread32(h
);
243 mn
[i
].atm
= myfread16(h
);
246 gsndt
= myfread32(h
);
247 for (n
= 0; n
< MAXMN
; n
++) {
256 static void PL_save_player (player_t
*p
, FILE *h
) {
257 myfwrite32(p
->o
.x
, h
);
258 myfwrite32(p
->o
.y
, h
);
259 myfwrite32(p
->o
.xv
, h
);
260 myfwrite32(p
->o
.yv
, h
);
261 myfwrite32(p
->o
.vx
, h
);
262 myfwrite32(p
->o
.vy
, h
);
263 myfwrite32(p
->o
.r
, h
);
264 myfwrite32(p
->o
.h
, h
);
265 myfwrite32(p
->looky
, h
);
266 myfwrite32(p
->st
, h
);
268 myfwrite32(p
->life
, h
);
269 myfwrite32(p
->armor
, h
);
270 myfwrite32(p
->hit
, h
);
271 myfwrite32(p
->hito
, h
);
272 myfwrite32(p
->pain
, h
);
273 myfwrite32(p
->air
, h
);
274 myfwrite32(p
->invl
, h
);
275 myfwrite32(p
->suit
, h
);
277 myfwrite32(p
->frag
, h
);
278 myfwrite32(p
->ammo
, h
);
279 myfwrite32(p
->shel
, h
);
280 myfwrite32(p
->rock
, h
);
281 myfwrite32(p
->cell
, h
);
282 myfwrite32(p
->fuel
, h
);
283 myfwrite32(p
->kills
, h
);
284 myfwrite32(p
->secrets
, h
);
285 myfwrite8(p
->fire
, h
);
286 myfwrite8(p
->cwpn
, h
);
287 myfwrite8(p
->csnd
, h
);
288 myfwrite8(p
->amul
, h
);
289 myfwrite16(p
->wpns
, h
);
290 myfwrite8(p
->wpn
, h
);
292 myfwrite8(p
->drawst
, h
);
293 myfwrite8(p
->color
, h
);
294 myfwrite32(p
->id
, h
);
295 myfwrite8(p
->keys
, h
);
296 myfwrite8(p
->lives
, h
);
300 static void PL_savegame (FILE *h
) {
301 PL_save_player(&pl1
, h
);
303 PL_save_player(&pl2
, h
);
305 myfwrite32(PL_JUMP
, h
);
306 myfwrite32(PL_RUN
, h
);
307 myfwrite8(p_immortal
, h
);
310 static void PL_load_player (player_t
*p
, FILE *h
) {
311 p
->o
.x
= myfread32(h
);
312 p
->o
.y
= myfread32(h
);
313 p
->o
.xv
= myfread32(h
);
314 p
->o
.yv
= myfread32(h
);
315 p
->o
.vx
= myfread32(h
);
316 p
->o
.vy
= myfread32(h
);
317 p
->o
.r
= myfread32(h
);
318 p
->o
.h
= myfread32(h
);
319 p
->looky
= myfread32(h
);
320 p
->st
= myfread32(h
);
322 p
->life
= myfread32(h
);
323 p
->armor
= myfread32(h
);
324 p
->hit
= myfread32(h
);
325 p
->hito
= myfread32(h
);
326 p
->pain
= myfread32(h
);
327 p
->air
= myfread32(h
);
328 p
->invl
= myfread32(h
);
329 p
->suit
= myfread32(h
);
331 p
->frag
= myfread32(h
);
332 p
->ammo
= myfread32(h
);
333 p
->shel
= myfread32(h
);
334 p
->rock
= myfread32(h
);
335 p
->cell
= myfread32(h
);
336 p
->fuel
= myfread32(h
);
337 p
->kills
= myfread32(h
);
338 p
->secrets
= myfread32(h
);
339 p
->fire
= myfread8(h
);
340 p
->cwpn
= myfread8(h
);
341 p
->csnd
= myfread8(h
);
342 p
->amul
= myfread8(h
);
343 p
->wpns
= myfread16(h
);
344 p
->wpn
= myfread8(h
);
346 p
->drawst
= myfread8(h
);
347 p
->color
= myfread8(h
);
348 p
->id
= myfread32(h
);
349 p
->keys
= myfread8(h
);
350 p
->lives
= myfread8(h
);
354 static void PL_loadgame (FILE *h
) {
355 PL_load_player(&pl1
, h
);
357 PL_load_player(&pl2
, h
);
359 PL_JUMP
= myfread32(h
);
360 PL_RUN
= myfread32(h
);
361 p_immortal
= myfread8(h
);
364 static void SMK_savegame (FILE *h
) {
366 for (i
= n
= 0; i
< MAXSMOK
; ++i
) {
372 for (i
= 0; i
< MAXSMOK
; ++i
) {
374 myfwrite32(sm
[i
].x
, h
);
375 myfwrite32(sm
[i
].y
, h
);
376 myfwrite32(sm
[i
].xv
, h
);
377 myfwrite32(sm
[i
].xv
, h
);
378 myfwrite8(sm
[i
].t
, h
);
379 myfwrite8(sm
[i
].s
, h
);
380 myfwrite16(sm
[i
].o
, h
);
385 static void SMK_loadgame (FILE *h
) {
388 for (i
= 0; i
< n
; ++i
) {
389 sm
[i
].x
= myfread32(h
);
390 sm
[i
].y
= myfread32(h
);
391 sm
[i
].xv
= myfread32(h
);
392 sm
[i
].xv
= myfread32(h
);
393 sm
[i
].t
= myfread8(h
);
394 sm
[i
].s
= myfread8(h
);
395 sm
[i
].o
= myfread16(h
);
399 static void SW_savegame (FILE *h
) {
401 for (n
= MAXSW
- 1; n
>= 0 && sw
[n
].t
== 0; n
--) {
406 for (i
= 0; i
< n
; i
++) {
407 myfwrite8(sw
[i
].x
, h
);
408 myfwrite8(sw
[i
].y
, h
);
409 myfwrite8(sw
[i
].t
, h
);
410 myfwrite8(sw
[i
].tm
, h
);
411 myfwrite8(sw
[i
].a
, h
);
412 myfwrite8(sw
[i
].b
, h
);
413 myfwrite8(sw
[i
].c
, h
);
414 myfwrite8(sw
[i
].d
, h
);
415 myfwrite8(sw
[i
].f
, h
);
417 myfwrite32(sw_secrets
, h
);
420 static void SW_loadgame (FILE *h
) {
423 for (i
= 0; i
< n
; i
++) {
424 sw
[i
].x
= myfread8(h
);
425 sw
[i
].y
= myfread8(h
);
426 sw
[i
].t
= myfread8(h
);
427 sw
[i
].tm
= myfread8(h
);
428 sw
[i
].a
= myfread8(h
);
429 sw
[i
].b
= myfread8(h
);
430 sw
[i
].c
= myfread8(h
);
431 sw
[i
].d
= myfread8(h
);
432 sw
[i
].f
= myfread8(h
);
434 sw_secrets
= myfread32(h
);
437 static void W_savegame (FILE* h
) {
440 myfwrite32(sky_type
, h
);
441 for(i
= 1; i
< 256; ++i
) {
443 myfwrite(s
, 8, 1, h
);
445 for (i
= 0; i
< 256; i
++) {
446 myfwrite32(walf
[i
], h
);
448 for (i
= 0; i
< 256; i
++) {
449 myfwrite8(R_get_swp(i
), h
);
451 myfwrite(fldb
, FLDW
*FLDH
, 1, h
);
452 myfwrite(fld
, FLDW
*FLDH
, 1, h
);
453 myfwrite(fldf
, FLDW
*FLDH
, 1, h
);
456 static void W_loadgame (FILE* h
) {
459 sky_type
= myfread32(h
);
462 for (i
= 1; i
< 256; ++i
) {
469 for (i
= 0; i
< 256; i
++) {
470 myfread32(h
); // useless
472 for (i
= 0; i
< 256; i
++) {
473 walf
[i
] = myfread8(h
);
475 myfread(fldb
, FLDW
*FLDH
, 1, h
);
476 myfread(fld
, FLDW
*FLDH
, 1, h
);
477 myfread(fldf
, FLDW
*FLDH
, 1, h
);
480 static void WP_savegame (FILE *h
) {
482 for (n
= MAXWPN
- 1; n
>= 0 && wp
[n
].t
== 0; n
--) {
487 for (i
= 0; i
< n
; i
++) {
488 myfwrite32(wp
[i
].o
.x
, h
);
489 myfwrite32(wp
[i
].o
.y
, h
);
490 myfwrite32(wp
[i
].o
.xv
, h
);
491 myfwrite32(wp
[i
].o
.yv
, h
);
492 myfwrite32(wp
[i
].o
.vx
, h
);
493 myfwrite32(wp
[i
].o
.vy
, h
);
494 myfwrite32(wp
[i
].o
.r
, h
);
495 myfwrite32(wp
[i
].o
.h
, h
);
496 myfwrite8(wp
[i
].t
, h
);
497 myfwrite8(wp
[i
].s
, h
);
498 myfwrite32(wp
[i
].own
, h
);
499 myfwrite16(wp
[i
].target
, h
);
503 static void WP_loadgame (FILE *h
) {
506 for (i
= 0; i
< n
; i
++) {
507 wp
[i
].o
.x
= myfread32(h
);
508 wp
[i
].o
.y
= myfread32(h
);
509 wp
[i
].o
.xv
= myfread32(h
);
510 wp
[i
].o
.yv
= myfread32(h
);
511 wp
[i
].o
.vx
= myfread32(h
);
512 wp
[i
].o
.vy
= myfread32(h
);
513 wp
[i
].o
.r
= myfread32(h
);
514 wp
[i
].o
.h
= myfread32(h
);
515 wp
[i
].t
= myfread8(h
);
516 wp
[i
].s
= myfread8(h
);
517 wp
[i
].own
= myfread32(h
);
518 wp
[i
].target
= myfread16(h
);
522 static char *getsavfpname (int n
, int ro
) {
523 static char fn
[] = "savgame0.dat";
527 char *e
= getenv("HOME");
529 strcat(p
, "/.doom2d-rembo");
531 mkdir(p
, S_IRWXU
| S_IRWXG
| S_IROTH
| S_IXOTH
);
541 void F_getsavnames (void) {
546 for (i
= 0; i
< 7; ++i
) {
547 p
= getsavfpname(i
, 1);
548 memset(savname
[i
], 0, 24);
553 myfread(savname
[i
], 24, 1, h
);
556 savok
[i
] = (ver
== 3) ? 1 : 0;
562 void F_savegame (int n
, char *s
) {
563 char *p
= getsavfpname(n
, 0);
564 FILE *h
= fopen(p
, "wb");
566 myfwrite(s
, 24, 1, h
); // slot name
567 myfwrite16(3, h
); // version
582 void F_loadgame (int n
) {
584 char *p
= getsavfpname(n
, 1);
585 FILE *h
= fopen(p
, "rb");
587 fseek(h
, 24, SEEK_SET
); // skip name
588 ver
= myfread16(h
); // version