DEADSOFTWARE

sound: move sound/music configuration to sound driver
[flatwaifu.git] / src / save.c
1 #include "save.h"
3 #include "dots.h"
4 #include "fx.h"
5 #include "game.h"
6 #include "items.h"
7 #include "monster.h"
8 #include "player.h"
9 #include "smoke.h"
10 #include "switch.h"
11 #include "view.h"
12 #include "weapons.h"
14 #include "render.h"
15 #include "music.h"
17 #include <stdio.h> // FILE
18 #include <string.h>
19 #include <sys/stat.h>
20 #include "files.h"
21 #include "my.h"
23 char savname[SAVE_MAX][SAVE_MAXLEN];
24 char savok[SAVE_MAX];
26 static void DOT_savegame (FILE *h) {
27 int i, n;
28 for (i = n = 0; i < MAXDOT; ++i) {
29 if (dot[i].t) {
30 ++n;
31 }
32 }
33 myfwrite32(n, h);
34 for (i = 0; i < MAXDOT; ++i) {
35 if (dot[i].t) {
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);
46 }
47 }
48 }
50 static void DOT_loadgame (FILE *h) {
51 int i, n;
52 n = myfread32(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);
64 }
65 }
67 static void FX_savegame (FILE *h) {
68 int i, n;
69 for (i = n = 0; i < MAXFX; ++i) {
70 if (fx[i].t) {
71 ++n;
72 }
73 }
74 myfwrite32(n, h);
75 for (i = 0; i < MAXFX; ++i) {
76 if (fx[i].t) {
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);
83 }
84 }
85 }
87 static void FX_loadgame (FILE *h) {
88 int i, n;
89 n = myfread32(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);
97 }
98 }
100 static void G_savegame (FILE *h) {
101 myfwrite8(_2pl, h);
102 myfwrite8(g_dm, h);
103 myfwrite8(g_exit, h);
104 myfwrite8(g_map, h);
105 myfwrite32(g_time, h);
106 myfwrite32(dm_pl1p, h);
107 myfwrite32(dm_pl2p, h);
108 myfwrite32(dm_pnum, h);
109 int i = 0;
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);
114 i += 1;
116 myfwrite8(cheat, h);
117 myfwrite(g_music, 8, 1, h);
120 static void G_loadgame (FILE *h) {
121 _2pl = myfread8(h);
122 g_dm = myfread8(h);
123 g_exit = myfread8(h);
124 g_map = myfread8(h);
125 g_time = myfread32(h);
126 dm_pl1p = myfread32(h);
127 dm_pl2p = myfread32(h);
128 dm_pnum = myfread32(h);
129 int i = 0;
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);
134 i += 1;
136 cheat = myfread8(h);
137 myfread(g_music, 8, 1, h);
138 MUS_load(g_music);
141 static void IT_savegame (FILE *h) {
142 int i, n;
143 for (n = MAXITEM - 1; n >= 0 && it[n].t == 0; n--) {
144 // empty
146 n += 1;
147 myfwrite32(n, h);
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) {
164 int i, n;
165 n = myfread32(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) {
182 int i, n;
183 for (n = MAXMN - 1; n >= 0 && mn[n].t == 0; n--) {
184 // empty
186 n += 1;
187 myfwrite32(n, h);
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);
213 myfwrite32(mnum, h);
214 myfwrite32(gsndt, h);
217 static void MN_loadgame (FILE *h) {
218 int i, n, c;
219 n = myfread32(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);
245 mnum = myfread32(h);
246 gsndt = myfread32(h);
247 for (n = 0; n < MAXMN; n++) {
248 if (mn[n].t) {
249 c = mn[n].ac;
250 setst(n, mn[n].st);
251 mn[n].ac = c;
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);
267 myfwrite32(p->s, 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);
276 myfwrite8(p->d, 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);
291 myfwrite8(p->f, 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);
297 // k* not saved
300 static void PL_savegame (FILE *h) {
301 PL_save_player(&pl1, h);
302 if (_2pl) {
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);
321 p->s = 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);
330 p->d = myfread8(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);
345 p->f = 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);
351 // k* not saved
354 static void PL_loadgame (FILE *h) {
355 PL_load_player(&pl1, h);
356 if (_2pl) {
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) {
365 int i, n;
366 for (i = n = 0; i < MAXSMOK; ++i) {
367 if (sm[i].t) {
368 ++n;
371 myfwrite32(n, h);
372 for (i = 0; i < MAXSMOK; ++i) {
373 if (sm[i].t) {
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) {
386 int i, n;
387 n = myfread32(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) {
400 int i, n;
401 for (n = MAXSW - 1; n >= 0 && sw[n].t == 0; n--) {
402 // empty
404 n += 1;
405 myfwrite32(n, h);
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) {
421 int i, n;
422 n = myfread32(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) {
438 char s[8];
439 int i;
440 myfwrite32(sky_type, h);
441 for(i = 1; i < 256; ++i) {
442 R_get_name(i, s);
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) {
457 int i;
458 char s[8];
459 sky_type = myfread32(h);
460 R_loadsky(sky_type);
461 R_begin_load();
462 for (i = 1; i < 256; ++i) {
463 myfread(s, 8, 1, h);
464 if (s[0]) {
465 R_load(s);
468 R_end_load();
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) {
481 int i, n;
482 for (n = MAXWPN - 1; n >= 0 && wp[n].t == 0; n--) {
483 // empty
485 n += 1;
486 myfwrite32(n, h);
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) {
504 int i, n;
505 n = myfread32(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";
524 fn[7] = n + '0';
525 #ifndef WIN32
526 static char p[100];
527 char *e = getenv("HOME");
528 strncpy(p, e, 60);
529 strcat(p, "/.doom2d-rembo");
530 if (!ro) {
531 mkdir(p, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
533 strcat(p, "/");
534 strcat(p, fn);
535 #else
536 strcpy(p, fn);
537 #endif
538 return p;
541 void F_getsavnames (void) {
542 int i;
543 FILE *h;
544 short ver;
545 char *p;
546 for (i = 0; i < 7; ++i) {
547 p = getsavfpname(i, 1);
548 memset(savname[i], 0, 24);
549 savok[i] = 0;
550 h = fopen(p, "rb");
551 if (h != NULL) {
552 ver = -1;
553 myfread(savname[i], 24, 1, h);
554 ver = myfread16(h);
555 savname[i][23] = 0;
556 savok[i] = (ver == 3) ? 1 : 0;
557 fclose(h);
562 void F_savegame (int n, char *s) {
563 char *p = getsavfpname(n, 0);
564 FILE *h = fopen(p, "wb");
565 if (h != NULL) {
566 myfwrite(s, 24, 1, h); // slot name
567 myfwrite16(3, h); // version
568 G_savegame(h);
569 W_savegame(h);
570 DOT_savegame(h);
571 SMK_savegame(h);
572 FX_savegame(h);
573 IT_savegame(h);
574 MN_savegame(h);
575 PL_savegame(h);
576 SW_savegame(h);
577 WP_savegame(h);
578 fclose(h);
582 void F_loadgame (int n) {
583 short ver;
584 char *p = getsavfpname(n, 1);
585 FILE *h = fopen(p, "rb");
586 if (h != NULL) {
587 fseek(h, 24, SEEK_SET); // skip name
588 ver = myfread16(h); // version
589 if (ver == 3) {
590 G_loadgame(h);
591 W_loadgame(h);
592 DOT_loadgame(h);
593 SMK_loadgame(h);
594 FX_loadgame(h);
595 IT_loadgame(h);
596 MN_loadgame(h);
597 PL_loadgame(h);
598 SW_loadgame(h);
599 WP_loadgame(h);
601 fclose(h);