Annotation of early-roguelike/arogue7/state.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: state.c - Portable Rogue Save State Code
3:
4: Copyright (C) 1999, 2000, 2005 Nicholas J. Kisseberth
5: All rights reserved.
6:
7: Redistribution and use in source and binary forms, with or without
8: modification, are permitted provided that the following conditions
9: are met:
10: 1. Redistributions of source code must retain the above copyright
11: notice, this list of conditions and the following disclaimer.
12: 2. Redistributions in binary form must reproduce the above copyright
13: notice, this list of conditions and the following disclaimer in the
14: documentation and/or other materials provided with the distribution.
15: 3. Neither the name(s) of the author(s) nor the names of other contributors
16: may be used to endorse or promote products derived from this software
17: without specific prior written permission.
18:
19: THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTORS ``AS IS'' AND
20: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22: ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTORS BE LIABLE
23: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29: SUCH DAMAGE.
30: */
31:
32: /************************************************************************/
33: /* Save State Code */
34: /************************************************************************/
35:
36: #define RSID_STATS 0xABCD0001
37: #define RSID_MSTATS 0xABCD0002
38: #define RSID_THING 0xABCD0003
39: #define RSID_OBJECT 0xABCD0004
40: #define RSID_MAGICITEMS 0xABCD0005
41: #define RSID_KNOWS 0xABCD0006
42: #define RSID_GUESSES 0xABCD0007
43: #define RSID_OBJECTLIST 0xABCD0008
44: #define RSID_BAGOBJECT 0xABCD0009
45: #define RSID_MONSTERLIST 0xABCD000A
46: #define RSID_MONSTERSTATS 0xABCD000B
47: #define RSID_MONSTERS 0xABCD000C
48: #define RSID_TRAP 0xABCD000D
49: #define RSID_WINDOW 0xABCD000E
50: #define RSID_DAEMONS 0xABCD000F
51: #define RSID_STICKS 0xABCD0010
52: #define RSID_IARMOR 0xABCD0011
53: #define RSID_SPELLS 0xABCD0012
54: #define RSID_ILIST 0xABCD0013
55: #define RSID_HLIST 0xABCD0014
56: #define RSID_DEATHTYPE 0xABCD0015
57: #define RSID_CTYPES 0XABCD0016
58: #define RSID_COORDLIST 0XABCD0017
59: #define RSID_ROOMS 0XABCD0018
60:
61: #include <curses.h>
62: #include <stdio.h>
63: #include <stdlib.h>
64: #include <string.h>
65: #include "rogue.h"
66:
67: #define READSTAT (format_error || read_error )
68: #define WRITESTAT (write_error)
69:
70: static int read_error = FALSE;
71: static int write_error = FALSE;
72: static int format_error = FALSE;
73: static int endian = 0x01020304;
74: #define big_endian ( *((char *)&endian) == 0x01 )
75:
76: int list_size(struct linked_list *l);
77: int rs_write_int(FILE *savef, int c);
78: int rs_read_int(FILE *inf, int *i);
79: int rs_write_object_list(FILE *savef, struct linked_list *l);
80: int rs_read_object_list(FILE *inf, struct linked_list **list);
81:
82: int
83: rs_write(FILE *savef, void *ptr, size_t size)
84: {
85: if (write_error)
86: return(WRITESTAT);
87:
88: if (encwrite(ptr, size, savef) != size)
89: write_error = 1;
90:
91: return(WRITESTAT);
92: }
93:
94: int
95: rs_read(FILE *inf, void *ptr, size_t size)
96: {
97: if (read_error || format_error)
98: return(READSTAT);
99:
100: if (encread(ptr, size, inf) != size)
101: read_error = 1;
102:
103: return(READSTAT);
104: }
105:
106: int
107: rs_write_uchar(FILE *savef, unsigned char c)
108: {
109: if (write_error)
110: return(WRITESTAT);
111:
112: rs_write(savef, &c, 1);
113:
114: return(WRITESTAT);
115: }
116:
117: int
118: rs_read_uchar(FILE *inf, unsigned char *c)
119: {
120: if (read_error || format_error)
121: return(READSTAT);
122:
123: rs_read(inf, c, 1);
124:
125: return(READSTAT);
126: }
127:
128: int
129: rs_write_char(FILE *savef, char c)
130: {
131: if (write_error)
132: return(WRITESTAT);
133:
134: rs_write(savef, &c, 1);
135:
136: return(WRITESTAT);
137: }
138:
139: int
140: rs_read_char(FILE *inf, char *c)
141: {
142: if (read_error || format_error)
143: return(READSTAT);
144:
145: rs_read(inf, c, 1);
146:
147: return(READSTAT);
148: }
149:
150: int
151: rs_write_chars(FILE *savef, char *c, int count)
152: {
153: if (write_error)
154: return(WRITESTAT);
155:
156: rs_write_int(savef, count);
157: rs_write(savef, c, count);
158:
159: return(WRITESTAT);
160: }
161:
162: int
163: rs_read_chars(FILE *inf, char *i, int count)
164: {
165: int value = 0;
166:
167: if (read_error || format_error)
168: return(READSTAT);
169:
170: rs_read_int(inf, &value);
171:
172: if (value != count)
173: format_error = TRUE;
174:
175: rs_read(inf, i, count);
176:
177: return(READSTAT);
178: }
179:
180: int
181: rs_write_int(FILE *savef, int c)
182: {
183: unsigned char bytes[4];
184: unsigned char *buf = (unsigned char *) &c;
185:
186: if (write_error)
187: return(WRITESTAT);
188:
189: if (big_endian)
190: {
191: bytes[3] = buf[0];
192: bytes[2] = buf[1];
193: bytes[1] = buf[2];
194: bytes[0] = buf[3];
195: buf = bytes;
196: }
197:
198: rs_write(savef, buf, 4);
199:
200: return(WRITESTAT);
201: }
202:
203: int
204: rs_read_int(FILE *inf, int *i)
205: {
206: unsigned char bytes[4];
207: int input = 0;
208: unsigned char *buf = (unsigned char *)&input;
209:
210: if (read_error || format_error)
211: return(READSTAT);
212:
213: rs_read(inf, &input, 4);
214:
215: if (big_endian)
216: {
217: bytes[3] = buf[0];
218: bytes[2] = buf[1];
219: bytes[1] = buf[2];
220: bytes[0] = buf[3];
221: buf = bytes;
222: }
223:
224: *i = *((int *) buf);
225:
226: return(READSTAT);
227: }
228:
229: int
230: rs_write_ints(FILE *savef, int *c, int count)
231: {
232: int n = 0;
233:
234: if (write_error)
235: return(WRITESTAT);
236:
237: rs_write_int(savef, count);
238:
239: for(n = 0; n < count; n++)
240: if( rs_write_int(savef,c[n]) != 0)
241: break;
242:
243: return(WRITESTAT);
244: }
245:
246: int
247: rs_read_ints(FILE *inf, int *i, int count)
248: {
249: int n, value;
250:
251: if (read_error || format_error)
252: return(READSTAT);
253:
254: rs_read_int(inf,&value);
255:
256: if (value != count)
257: format_error = TRUE;
258:
259: for(n = 0; n < count; n++)
260: if (rs_read_int(inf, &i[n]) != 0)
261: break;
262:
263: return(READSTAT);
264: }
265:
266: int
267: rs_write_boolean(FILE *savef, bool c)
268: {
269: unsigned char buf = (c == 0) ? 0 : 1;
270:
271: if (write_error)
272: return(WRITESTAT);
273:
274: rs_write(savef, &buf, 1);
275:
276: return(WRITESTAT);
277: }
278:
279: int
280: rs_read_boolean(FILE *inf, bool *i)
281: {
282: unsigned char buf = 0;
283:
284: if (read_error || format_error)
285: return(READSTAT);
286:
287: rs_read(inf, &buf, 1);
288:
289: *i = (buf != 0);
290:
291: return(READSTAT);
292: }
293:
294: int
295: rs_write_booleans(FILE *savef, bool *c, int count)
296: {
297: int n = 0;
298:
299: if (write_error)
300: return(WRITESTAT);
301:
302: rs_write_int(savef, count);
303:
304: for(n = 0; n < count; n++)
305: if (rs_write_boolean(savef, c[n]) != 0)
306: break;
307:
308: return(WRITESTAT);
309: }
310:
311: int
312: rs_read_booleans(FILE *inf, bool *i, int count)
313: {
314: int n = 0, value = 0;
315:
316: if (read_error || format_error)
317: return(READSTAT);
318:
319: rs_read_int(inf,&value);
320:
321: if (value != count)
322: format_error = TRUE;
323:
324: for(n = 0; n < count; n++)
325: if (rs_read_boolean(inf, &i[n]) != 0)
326: break;
327:
328: return(READSTAT);
329: }
330:
331: int
332: rs_write_short(FILE *savef, short c)
333: {
334: unsigned char bytes[2];
335: unsigned char *buf = (unsigned char *) &c;
336:
337: if (write_error)
338: return(WRITESTAT);
339:
340: if (big_endian)
341: {
342: bytes[1] = buf[0];
343: bytes[0] = buf[1];
344: buf = bytes;
345: }
346:
347: rs_write(savef, buf, 2);
348:
349: return(WRITESTAT);
350: }
351:
352: int
353: rs_read_short(FILE *inf, short *i)
354: {
355: unsigned char bytes[2];
356: short input;
357: unsigned char *buf = (unsigned char *)&input;
358:
359: if (read_error || format_error)
360: return(READSTAT);
361:
362: rs_read(inf, &input, 2);
363:
364: if (big_endian)
365: {
366: bytes[1] = buf[0];
367: bytes[0] = buf[1];
368: buf = bytes;
369: }
370:
371: *i = *((short *) buf);
372:
373: return(READSTAT);
374: }
375:
376: int
377: rs_write_shorts(FILE *savef, short *c, int count)
378: {
379: int n = 0;
380:
381: if (write_error)
382: return(WRITESTAT);
383:
384: rs_write_int(savef, count);
385:
386: for(n = 0; n < count; n++)
387: if (rs_write_short(savef, c[n]) != 0)
388: break;
389:
390: return(WRITESTAT);
391: }
392:
393: int
394: rs_read_shorts(FILE *inf, short *i, int count)
395: {
396: int n = 0, value = 0;
397:
398: if (read_error || format_error)
399: return(READSTAT);
400:
401: rs_read_int(inf,&value);
402:
403: if (value != count)
404: format_error = TRUE;
405:
406: for(n = 0; n < value; n++)
407: if (rs_read_short(inf, &i[n]) != 0)
408: break;
409:
410: return(READSTAT);
411: }
412:
413: int
414: rs_write_ushort(FILE *savef, unsigned short c)
415: {
416: unsigned char bytes[2];
417: unsigned char *buf = (unsigned char *) &c;
418:
419: if (write_error)
420: return(WRITESTAT);
421:
422: if (big_endian)
423: {
424: bytes[1] = buf[0];
425: bytes[0] = buf[1];
426: buf = bytes;
427: }
428:
429: rs_write(savef, buf, 2);
430:
431: return(WRITESTAT);
432: }
433:
434: int
435: rs_read_ushort(FILE *inf, unsigned short *i)
436: {
437: unsigned char bytes[2];
438: unsigned short input;
439: unsigned char *buf = (unsigned char *)&input;
440:
441: if (read_error || format_error)
442: return(READSTAT);
443:
444: rs_read(inf, &input, 2);
445:
446: if (big_endian)
447: {
448: bytes[1] = buf[0];
449: bytes[0] = buf[1];
450: buf = bytes;
451: }
452:
453: *i = *((unsigned short *) buf);
454:
455: return(READSTAT);
456: }
457:
458: int
459: rs_write_uint(FILE *savef, unsigned int c)
460: {
461: unsigned char bytes[4];
462: unsigned char *buf = (unsigned char *) &c;
463:
464: if (write_error)
465: return(WRITESTAT);
466:
467: if (big_endian)
468: {
469: bytes[3] = buf[0];
470: bytes[2] = buf[1];
471: bytes[1] = buf[2];
472: bytes[0] = buf[3];
473: buf = bytes;
474: }
475:
476: rs_write(savef, buf, 4);
477:
478: return(WRITESTAT);
479: }
480:
481: int
482: rs_read_uint(FILE *inf, unsigned int *i)
483: {
484: unsigned char bytes[4];
485: int input;
486: unsigned char *buf = (unsigned char *)&input;
487:
488: if (read_error || format_error)
489: return(READSTAT);
490:
491: rs_read(inf, &input, 4);
492:
493: if (big_endian)
494: {
495: bytes[3] = buf[0];
496: bytes[2] = buf[1];
497: bytes[1] = buf[2];
498: bytes[0] = buf[3];
499: buf = bytes;
500: }
501:
502: *i = *((unsigned int *) buf);
503:
504: return(READSTAT);
505: }
506:
507: int
508: rs_write_long(FILE *savef, long c)
509: {
510: int c2;
511: unsigned char bytes[4];
512: unsigned char *buf = (unsigned char *)&c;
513:
514: if (write_error)
515: return(WRITESTAT);
516:
517: if (sizeof(long) == 8)
518: {
519: c2 = c;
520: buf = (unsigned char *) &c2;
521: }
522:
523: if (big_endian)
524: {
525: bytes[3] = buf[0];
526: bytes[2] = buf[1];
527: bytes[1] = buf[2];
528: bytes[0] = buf[3];
529: buf = bytes;
530: }
531:
532: rs_write(savef, buf, 4);
533:
534: return(WRITESTAT);
535: }
536:
537: int
538: rs_read_long(FILE *inf, long *i)
539: {
540: unsigned char bytes[4];
541: long input;
542: unsigned char *buf = (unsigned char *) &input;
543:
544: if (read_error || format_error)
545: return(READSTAT);
546:
547: rs_read(inf, &input, 4);
548:
549: if (big_endian)
550: {
551: bytes[3] = buf[0];
552: bytes[2] = buf[1];
553: bytes[1] = buf[2];
554: bytes[0] = buf[3];
555: buf = bytes;
556: }
557:
558: if (sizeof(long) == 8)
559: *i = *((int *) buf);
560: else
561: *i = *((long *) buf);
562:
563: return(READSTAT);
564: }
565:
566: int
567: rs_write_longs(FILE *savef, long *c, int count)
568: {
569: int n = 0;
570:
571: if (write_error)
572: return(WRITESTAT);
573:
574: rs_write_int(savef,count);
575:
576: for(n = 0; n < count; n++)
577: rs_write_long(savef, c[n]);
578:
579: return(WRITESTAT);
580: }
581:
582: int
583: rs_read_longs(FILE *inf, long *i, int count)
584: {
585: int n = 0, value = 0;
586:
587: if (read_error || format_error)
588: return(READSTAT);
589:
590: rs_read_int(inf,&value);
591:
592: if (value != count)
593: format_error = TRUE;
594:
595: for(n = 0; n < value; n++)
596: if (rs_read_long(inf, &i[n]) != 0)
597: break;
598:
599: return(READSTAT);
600: }
601:
602: int
603: rs_write_ulong(FILE *savef, unsigned long c)
604: {
605: unsigned int c2;
606: unsigned char bytes[4];
607: unsigned char *buf = (unsigned char *)&c;
608:
609: if (write_error)
610: return(WRITESTAT);
611:
612: if ( (sizeof(long) == 8) && (sizeof(int) == 4) )
613: {
614: c2 = c;
615: buf = (unsigned char *) &c2;
616: }
617:
618: if (big_endian)
619: {
620: bytes[3] = buf[0];
621: bytes[2] = buf[1];
622: bytes[1] = buf[2];
623: bytes[0] = buf[3];
624: buf = bytes;
625: }
626:
627: rs_write(savef, buf, 4);
628:
629: return(WRITESTAT);
630: }
631:
632: int
633: rs_read_ulong(FILE *inf, unsigned long *i)
634: {
635: unsigned char bytes[4];
636: unsigned long input;
637: unsigned char *buf = (unsigned char *) &input;
638:
639: if (read_error || format_error)
640: return(READSTAT);
641:
642: rs_read(inf, &input, 4);
643:
644: if (big_endian)
645: {
646: bytes[3] = buf[0];
647: bytes[2] = buf[1];
648: bytes[1] = buf[2];
649: bytes[0] = buf[3];
650: buf = bytes;
651: }
652:
653: if ( (sizeof(long) == 8) && (sizeof(int) == 4) )
654: *i = *((unsigned int *) buf);
655: else
656: *i = *((unsigned long *) buf);
657:
658: return(READSTAT);
659: }
660:
661: int
662: rs_write_ulongs(FILE *savef, unsigned long *c, int count)
663: {
664: int n = 0;
665:
666: if (write_error)
667: return(WRITESTAT);
668:
669: rs_write_int(savef,count);
670:
671: for(n = 0; n < count; n++)
672: if (rs_write_ulong(savef,c[n]) != 0)
673: break;
674:
675: return(WRITESTAT);
676: }
677:
678: int
679: rs_read_ulongs(FILE *inf, unsigned long *i, int count)
680: {
681: int n = 0, value = 0;
682:
683: if (read_error || format_error)
684: return(READSTAT);
685:
686: rs_read_int(inf,&value);
687:
688: if (value != count)
689: format_error = TRUE;
690:
691: for(n = 0; n < count; n++)
692: if (rs_read_ulong(inf, &i[n]) != 0)
693: break;
694:
695: return(READSTAT);
696: }
697:
698: int
699: rs_write_marker(FILE *savef, int id)
700: {
701: if (write_error)
702: return(WRITESTAT);
703:
704: rs_write_int(savef, id);
705:
706: return(WRITESTAT);
707: }
708:
709: int
710: rs_read_marker(FILE *inf, int id)
711: {
712: int nid;
713:
714: if (read_error || format_error)
715: return(READSTAT);
716:
717: if (rs_read_int(inf, &nid) == 0)
718: if (id != nid)
719: format_error = 1;
720:
721: return(READSTAT);
722: }
723:
724:
725:
726: /******************************************************************************/
727:
728: int
729: rs_write_string(FILE *savef, char *s)
730: {
731: int len = 0;
732:
733: if (write_error)
734: return(WRITESTAT);
735:
736: len = (s == NULL) ? 0 : (int) strlen(s) + 1;
737:
738: rs_write_int(savef, len);
739: rs_write_chars(savef, s, len);
740:
741: return(WRITESTAT);
742: }
743:
744: int
745: rs_read_string(FILE *inf, char *s, int max)
746: {
747: int len = 0;
748:
749: if (read_error || format_error)
750: return(READSTAT);
751:
752: rs_read_int(inf, &len);
753:
754: if (len > max)
755: format_error = TRUE;
756:
757: rs_read_chars(inf, s, len);
758:
759: return(READSTAT);
760: }
761:
762: int
763: rs_read_new_string(FILE *inf, char **s)
764: {
765: int len=0;
766: char *buf=0;
767:
768: if (read_error || format_error)
769: return(READSTAT);
770:
771: rs_read_int(inf, &len);
772:
773: if (len == 0)
774: buf = NULL;
775: else
776: {
777: buf = malloc(len);
778:
779: if (buf == NULL)
780: read_error = TRUE;
781: }
782:
783: rs_read_chars(inf, buf, len);
784:
785: *s = buf;
786:
787: return(READSTAT);
788: }
789:
790: int
791: rs_write_strings(FILE *savef, char *s[], int count)
792: {
793: int n = 0;
794:
795: if (write_error)
796: return(WRITESTAT);
797:
798: rs_write_int(savef, count);
799:
800: for(n = 0; n < count; n++)
801: if (rs_write_string(savef, s[n]) != 0)
802: break;
803:
804: return(WRITESTAT);
805: }
806:
807: int
808: rs_read_strings(FILE *inf, char **s, int count, int max)
809: {
810: int n = 0;
811: int value = 0;
812:
813: if (read_error || format_error)
814: return(READSTAT);
815:
816: rs_read_int(inf, &value);
817:
818: if (value != count)
819: format_error = TRUE;
820:
821: for(n = 0; n < count; n++)
822: if (rs_read_string(inf, s[n], max) != 0)
823: break;
824:
825: return(READSTAT);
826: }
827:
828: int
829: rs_read_new_strings(FILE *inf, char **s, int count)
830: {
831: int n = 0;
832: int value = 0;
833:
834: if (read_error || format_error)
835: return(READSTAT);
836:
837: rs_read_int(inf, &value);
838:
839: if (value != count)
840: format_error = TRUE;
841:
842: for(n = 0; n < count; n++)
843: if (rs_read_new_string(inf, &s[n]) != 0)
844: break;
845:
846: return(READSTAT);
847: }
848:
849: int
850: rs_write_string_index(FILE *savef, char *master[], int max, const char *str)
851: {
852: int i;
853:
854: if (write_error)
855: return(WRITESTAT);
856:
857: for(i = 0; i < max; i++)
858: if (str == master[i])
859: return( rs_write_int(savef, i) );
860:
861: return( rs_write_int(savef,-1) );
862: }
863:
864: int
865: rs_read_string_index(FILE *inf, char *master[], int maxindex, char **str)
866: {
867: int i;
868:
869: if (read_error || format_error)
870: return(READSTAT);
871:
872: rs_read_int(inf, &i);
873:
874: if (i > maxindex)
875: format_error = TRUE;
876: else if (i >= 0)
877: *str = master[i];
878: else
879: *str = NULL;
880:
881: return(READSTAT);
882: }
883:
884: int
885: rs_write_coord(FILE *savef, coord c)
886: {
887: if (write_error)
888: return(WRITESTAT);
889:
890: rs_write_int(savef, c.x);
891: rs_write_int(savef, c.y);
892:
893: return(WRITESTAT);
894: }
895:
896: int
897: rs_read_coord(FILE *inf, coord *c)
898: {
899: coord in;
900:
901: if (read_error || format_error)
902: return(READSTAT);
903:
904: rs_read_int(inf,&in.x);
905: rs_read_int(inf,&in.y);
906:
907: if (READSTAT == 0)
908: {
909: c->x = in.x;
910: c->y = in.y;
911: }
912:
913: return(READSTAT);
914: }
915:
916: int
917: rs_write_coord_list(FILE *savef, struct linked_list *l)
918: {
919: rs_write_marker(savef, RSID_COORDLIST);
920: rs_write_int(savef, list_size(l));
921:
922: while (l != NULL)
923: {
924: rs_write_coord(savef, *(coord *) l->l_data);
925: l = l->l_next;
926: }
927:
928: return(WRITESTAT);
929: }
930:
931: int
932: rs_read_coord_list(FILE *inf, struct linked_list **list)
933: {
934: int i, cnt;
935: struct linked_list *l = NULL, *previous = NULL, *head = NULL;
936:
937: rs_read_marker(inf, RSID_COORDLIST);
938:
939: if (rs_read_int(inf,&cnt) != 0)
940: return(READSTAT);
941:
942: for (i = 0; i < cnt; i++)
943: {
944: l = new_item(sizeof(coord));
945: l->l_prev = previous;
946:
947: if (previous != NULL)
948: previous->l_next = l;
949:
950: rs_read_coord(inf,(coord *) l->l_data);
951:
952: if (previous == NULL)
953: head = l;
954:
955: previous = l;
956: }
957:
958: if (l != NULL)
959: l->l_next = NULL;
960:
961: *list = head;
962:
963: return(READSTAT);
964: }
965:
966: int
967: rs_write_window(FILE *savef, WINDOW *win)
968: {
969: int row,col,height,width;
970:
971: if (write_error)
972: return(WRITESTAT);
973:
974: width = getmaxx(win);
975: height = getmaxy(win);
976:
977: rs_write_marker(savef,RSID_WINDOW);
978: rs_write_int(savef,height);
979: rs_write_int(savef,width);
980:
981: for(row=0;row<height;row++)
982: for(col=0;col<width;col++)
983: if (rs_write_int(savef, mvwinch(win,row,col)) != 0)
984: return(WRITESTAT);
985:
986: return(WRITESTAT);
987: }
988:
989: int
990: rs_read_window(FILE *inf, WINDOW *win)
991: {
992: int row,col,maxlines,maxcols,value,width,height;
993:
994: if (read_error || format_error)
995: return(READSTAT);
996:
997: width = getmaxx(win);
998: height = getmaxy(win);
999:
1000: rs_read_marker(inf, RSID_WINDOW);
1001:
1002: rs_read_int(inf, &maxlines);
1003: rs_read_int(inf, &maxcols);
1004:
1005: for(row = 0; row < maxlines; row++)
1006: for(col = 0; col < maxcols; col++)
1007: {
1008: if (rs_read_int(inf, &value) != 0)
1009: return(READSTAT);
1010:
1011: if ((row < height) && (col < width))
1012: mvwaddch(win,row,col,value);
1013: }
1014:
1015: return(READSTAT);
1016: }
1017:
1018: /******************************************************************************/
1019:
1020: void *
1021: get_list_item(struct linked_list *l, int i)
1022: {
1023: int count;
1024:
1025: for(count = 0; l != NULL; count++, l = l->l_next)
1026: if (count == i)
1027: return(l->l_data);
1028:
1029: return(NULL);
1030: }
1031:
1032: int
1033: find_list_ptr(struct linked_list *l, void *ptr)
1034: {
1035: int count;
1036:
1037: for(count = 0; l != NULL; count++, l = l->l_next)
1038: if (l->l_data == ptr)
1039: return(count);
1040:
1041: return(-1);
1042: }
1043:
1044: int
1045: list_size(struct linked_list *l)
1046: {
1047: int count;
1048:
1049: for(count = 0; l != NULL; count++, l = l->l_next)
1050: ;
1051:
1052: return(count);
1053: }
1054:
1055: /******************************************************************************/
1056:
1057: int
1058: rs_write_levtype(FILE *savef, LEVTYPE c)
1059: {
1060: int lt;
1061:
1062: switch(c)
1063: {
1064: case NORMLEV: lt = 1; break;
1065: case POSTLEV: lt = 2; break;
1066: case MAZELEV: lt = 3; break;
1067: case OUTSIDE: lt = 4; break;
1068: case STARTLEV: lt = 5; break;
1069: default: lt = -1; break;
1070: }
1071:
1072: rs_write_int(savef,lt);
1073:
1074: return(WRITESTAT);
1075: }
1076:
1077: int
1078: rs_read_levtype(FILE *inf, LEVTYPE *l)
1079: {
1080: int lt;
1081:
1082: rs_read_int(inf, <);
1083:
1084: switch(lt)
1085: {
1086: case 1: *l = NORMLEV; break;
1087: case 2: *l = POSTLEV; break;
1088: case 3: *l = MAZELEV; break;
1089: case 4: *l = OUTSIDE; break;
1090: case 5: *l = STARTLEV; break;
1091: default: *l = NORMLEV; break;
1092: }
1093:
1094: return(READSTAT);
1095: }
1096:
1097: int
1098: rs_write_stats(FILE *savef, struct stats *s)
1099: {
1100: if (write_error)
1101: return(WRITESTAT);
1102:
1103: rs_write_marker(savef, RSID_STATS);
1104: rs_write_short(savef, s->s_str);
1105: rs_write_short(savef, s->s_intel);
1106: rs_write_short(savef, s->s_wisdom);
1107: rs_write_short(savef, s->s_dext);
1108: rs_write_short(savef, s->s_const);
1109: rs_write_short(savef, s->s_charisma);
1110: rs_write_ulong(savef, s->s_exp);
1111: rs_write_int(savef, s->s_lvladj);
1112: rs_write_int(savef, s->s_lvl);
1113: rs_write_int(savef, s->s_arm);
1114: rs_write_int(savef, s->s_hpt);
1115: rs_write_int(savef, s->s_pack);
1116: rs_write_int(savef, s->s_carry);
1117: rs_write(savef, s->s_dmg, sizeof(s->s_dmg));
1118:
1119: return(WRITESTAT);
1120: }
1121:
1122: int
1123: rs_read_stats(FILE *inf, struct stats *s)
1124: {
1125: if (read_error || format_error)
1126: return(READSTAT);
1127:
1128: rs_read_marker(inf, RSID_STATS);
1129: rs_read_short(inf,&s->s_str);
1130: rs_read_short(inf,&s->s_intel);
1131: rs_read_short(inf,&s->s_wisdom);
1132: rs_read_short(inf,&s->s_dext);
1133: rs_read_short(inf,&s->s_const);
1134: rs_read_short(inf,&s->s_charisma);
1135: rs_read_ulong(inf,&s->s_exp);
1136: rs_read_int(inf,&s->s_lvladj);
1137: rs_read_int(inf,&s->s_lvl);
1138: rs_read_int(inf,&s->s_arm);
1139: rs_read_int(inf,&s->s_hpt);
1140: rs_read_int(inf,&s->s_pack);
1141: rs_read_int(inf,&s->s_carry);
1142: rs_read(inf,s->s_dmg,sizeof(s->s_dmg));
1143:
1144: return(READSTAT);
1145: }
1146:
1147: int
1148: rs_write_magic_items(FILE *savef, struct magic_item *i, int count)
1149: {
1150: int n;
1151:
1152: rs_write_marker(savef, RSID_MAGICITEMS);
1153: rs_write_int(savef, count);
1154:
1155: for(n=0;n<count;n++)
1156: {
1157: /* rs_write(savef,i[n].mi_name,sizeof(i[n].mi_name)); */
1158: rs_write_int(savef,i[n].mi_prob);
1159: /* rs_write_int(savef,i[n].mi_worth); */
1160: /* rs_write_int(savef,i[n].mi_curse); */
1161: /* rs_write_int(savef,i[n].mi_bless); */
1162: }
1163:
1164: return(WRITESTAT);
1165: }
1166:
1167: int
1168: rs_read_magic_items(FILE *inf, struct magic_item *mi, int count)
1169: {
1170: int n;
1171: int value;
1172:
1173: rs_read_marker(inf, RSID_MAGICITEMS);
1174:
1175: rs_read_int(inf, &value);
1176:
1177: if (value != count)
1178: format_error = 1;
1179: else
1180: {
1181: for(n = 0; n < value; n++)
1182: {
1183: /* rs_read(inf,mi[n].mi_name,sizeof(mi[n].mi_name)); */
1184: rs_read_int(inf,&mi[n].mi_prob);
1185: /* rs_read_int(inf,&mi[n].mi_worth); */
1186: /* rs_read_int(inf,&mi[n].mi_curse); */
1187: /* rs_read_int(inf,&mi[n].mi_bless); */
1188: }
1189: }
1190:
1191: return(READSTAT);
1192: }
1193:
1194: int
1195: rs_write_scrolls(FILE *savef)
1196: {
1197: int i;
1198:
1199: if (write_error)
1200: return(WRITESTAT);
1201:
1202: for(i = 0; i < MAXSCROLLS; i++)
1203: {
1204: rs_write_string(savef, s_names[i]);
1205: rs_write_boolean(savef,s_know[i]);
1206: rs_write_string(savef,s_guess[i]);
1207: }
1208:
1209: return(WRITESTAT);
1210: }
1211:
1212: int
1213: rs_read_scrolls(FILE *inf)
1214: {
1215: int i;
1216:
1217: if (read_error || format_error)
1218: return(READSTAT);
1219:
1220: for(i = 0; i < MAXSCROLLS; i++)
1221: {
1222: rs_read_new_string(inf,&s_names[i]);
1223: rs_read_boolean(inf,&s_know[i]);
1224: rs_read_new_string(inf,&s_guess[i]);
1225: }
1226:
1227: return(READSTAT);
1228: }
1229:
1230: int
1231: rs_write_potions(FILE *savef)
1232: {
1233: int i;
1234:
1235: if (write_error)
1236: return(WRITESTAT);
1237:
1238: for(i = 0; i < MAXPOTIONS; i++)
1239: {
1240: rs_write_string_index(savef,rainbow,cNCOLORS,p_colors[i]);
1241: rs_write_boolean(savef,p_know[i]);
1242: rs_write_string(savef,p_guess[i]);
1243: }
1244:
1245: return(WRITESTAT);
1246: }
1247:
1248: int
1249: rs_read_potions(FILE *inf)
1250: {
1251: int i;
1252:
1253: if (read_error || format_error)
1254: return(READSTAT);
1255:
1256: for(i = 0; i < MAXPOTIONS; i++)
1257: {
1258: rs_read_string_index(inf,rainbow,cNCOLORS,&p_colors[i]);
1259: rs_read_boolean(inf,&p_know[i]);
1260: rs_read_new_string(inf,&p_guess[i]);
1261: }
1262:
1263: return(READSTAT);
1264: }
1265:
1266: int
1267: rs_write_rings(FILE *savef)
1268: {
1269: int i;
1270:
1271: if (write_error)
1272: return(WRITESTAT);
1273:
1274: for(i = 0; i < MAXRINGS; i++)
1275: {
1276: rs_write_string_index(savef,stones,cNSTONES,r_stones[i]);
1277: rs_write_boolean(savef,r_know[i]);
1278: rs_write_string(savef,r_guess[i]);
1279: }
1280:
1281: return(WRITESTAT);
1282: }
1283:
1284: int
1285: rs_read_rings(FILE *inf)
1286: {
1287: int i;
1288:
1289: if (read_error || format_error)
1290: return(READSTAT);
1291:
1292: for(i = 0; i < MAXRINGS; i++)
1293: {
1294: rs_read_string_index(inf,stones,cNSTONES,&r_stones[i]);
1295: rs_read_boolean(inf,&r_know[i]);
1296: rs_read_new_string(inf,&r_guess[i]);
1297: }
1298:
1299: return(READSTAT);
1300: }
1301:
1302: int
1303: rs_write_misc(FILE *savef)
1304: {
1305: int i;
1306:
1307: if (read_error || format_error)
1308: return(READSTAT);
1309:
1310: for(i = 0; i < MAXMM; i++)
1311: {
1312: rs_write_boolean(savef,m_know[i]);
1313: rs_write_string(savef,m_guess[i]);
1314: }
1315:
1316: return(READSTAT);
1317: }
1318:
1319: int
1320: rs_read_misc(FILE *inf)
1321: {
1322: int i;
1323:
1324: if (write_error)
1325: return(WRITESTAT);
1326:
1327: for(i = 0; i < MAXMM; i++)
1328: {
1329: rs_read_boolean(inf,&m_know[i]);
1330: rs_read_new_string(inf,&m_guess[i]);
1331: }
1332:
1333: return(WRITESTAT);
1334: }
1335:
1336: int
1337: rs_write_sticks(FILE *savef)
1338: {
1339: int i;
1340:
1341: if (write_error)
1342: return(WRITESTAT);
1343:
1344: rs_write_marker(savef, RSID_STICKS);
1345:
1346: for (i = 0; i < MAXSTICKS; i++)
1347: {
1348: if (strcmp(ws_type[i],"staff") == 0)
1349: {
1350: rs_write_int(savef,0);
1351: rs_write_string_index(savef,wood,cNWOOD,ws_made[i]);
1352: }
1353: else
1354: {
1355: rs_write_int(savef,1);
1356: rs_write_string_index(savef,metal,cNMETAL,ws_made[i]);
1357: }
1358:
1359: rs_write_boolean(savef, ws_know[i]);
1360: rs_write_string(savef, ws_guess[i]);
1361: }
1362:
1363: return(WRITESTAT);
1364: }
1365:
1366: int
1367: rs_read_sticks(FILE *inf)
1368: {
1369: int i = 0, j = 0, list = 0;
1370:
1371: if (read_error || format_error)
1372: return(READSTAT);
1373:
1374: rs_read_marker(inf, RSID_STICKS);
1375:
1376: for(i = 0; i < MAXSTICKS; i++)
1377: {
1378: rs_read_int(inf,&list);
1379: ws_made[i] = NULL;
1380:
1381: if (list == 0)
1382: {
1383: rs_read_string_index(inf,wood,cNWOOD,&ws_made[i]);
1384: ws_type[i] = "staff";
1385: }
1386: else
1387: {
1388: rs_read_string_index(inf,metal,cNMETAL,&ws_made[i]);
1389: ws_type[i] = "wand";
1390: }
1391: rs_read_boolean(inf, &ws_know[i]);
1392: rs_read_new_string(inf, &ws_guess[i]);
1393: }
1394:
1395: return(READSTAT);
1396: }
1397:
1398: /* Assigns a number to an alchemy jug associated with a fuse, so it can be
1399: * found and reassociated when restoring.
1400: * 1 - 31: slot in pack
1401: * 32+ : on floor
1402: * Hopefully monsters do not pick them up.
1403: */
1404: int number_alchemy_jug(struct object *obj) {
1405: struct object *tobj = NULL;
1406: struct linked_list *item;
1407: int i = 1;
1408: for (item = pack; item != NULL; item = next(item), i++) {
1409: tobj = OBJPTR(item);
1410: if (tobj == obj &&
1411: tobj->o_type == MM &&
1412: tobj->o_which== MM_JUG)
1413: break;
1414: }
1415: if (item == NULL) {
1416: for (item = lvl_obj, i = 32; item != NULL; item = next(item), i++) {
1417: tobj = OBJPTR(item);
1418: if (tobj == obj &&
1419: tobj->o_type == MM &&
1420: tobj->o_which== MM_JUG)
1421: break;
1422: }
1423: }
1424: if (item == NULL)
1425: return 0;
1426: return i;
1427: }
1428:
1429: /* Takes an alchemy jug number and tracks down the object. */
1430: struct object *find_alchemy_jug(int n) {
1431: struct object *tobj;
1432: struct linked_list *item;
1433:
1434: if (n <= 0) {
1435: return NULL;
1436: }
1437: else if (n < 32) {
1438: item = pack;
1439: n -= 1;
1440: }
1441: else if (n < 1024) {
1442: item = lvl_obj;
1443: n -= 32;
1444: }
1445: else {
1446: /* This is likely a bug, not 1024 actual items on the floor. */
1447: return NULL;
1448: }
1449: while (item != NULL && n > 0) {
1450: item = next(item);
1451: n--;
1452: }
1453: if (item == NULL)
1454: return NULL;
1455: tobj = OBJPTR(item);
1456: if (tobj->o_type != MM || tobj->o_which != MM_JUG)
1457: return NULL;
1458: return tobj;
1459: }
1460:
1461: int
1462: rs_write_daemons(FILE *savef, struct delayed_action *d_list, int count)
1463: {
1464: int i = 0;
1465: int func = 0;
1466:
1467: if (write_error)
1468: return(WRITESTAT);
1469:
1470: rs_write_marker(savef, RSID_DAEMONS);
1471: rs_write_int(savef, count);
1472:
1473: for(i = 0; i < count; i++)
1474: {
1475: if (d_list[i].d_func == rollwand)
1476: func = 1;
1477: else if (d_list[i].d_func == doctor)
1478: func = 2;
1479: else if (d_list[i].d_func == stomach)
1480: func = 3;
1481: else if (d_list[i].d_func == trap_look)
1482: func = 4;
1483: else if (d_list[i].d_func == eat_gold)
1484: func = 5;
1485: else if (d_list[i].d_func == ring_search)
1486: func = 6;
1487: else if (d_list[i].d_func == ring_teleport)
1488: func = 7;
1489: else if (d_list[i].d_func == fumble)
1490: func = 8;
1491: else if (d_list[i].d_func == strangle)
1492: func = 9;
1493: else if (d_list[i].d_func == unconfuse)
1494: func = 10;
1495: else if (d_list[i].d_func == swander)
1496: func = 11;
1497: else if (d_list[i].d_func == spell_recovery)
1498: func = 12;
1499: else if (d_list[i].d_func == chant_recovery)
1500: func = 13;
1501: else if (d_list[i].d_func == prayer_recovery)
1502: func = 14;
1503: else if (d_list[i].d_func == cure_disease)
1504: func = 15;
1505: else if (d_list[i].d_func == unstink)
1506: func = 16;
1507: else if (d_list[i].d_func == res_strength)
1508: func = 17;
1509: else if (d_list[i].d_func == undance)
1510: func = 18;
1511: else if (d_list[i].d_func == suffocate)
1512: func = 19;
1513: else if (d_list[i].d_func == wghtchk)
1514: func = 20;
1515: else if (d_list[i].d_func == dust_appear)
1516: func = 21;
1517: else if (d_list[i].d_func == unchoke)
1518: func = 22;
1519: else if (d_list[i].d_func == sight)
1520: func = 23;
1521: else if (d_list[i].d_func == changeclass)
1522: func = 24;
1523: else if (d_list[i].d_func == cloak_charge)
1524: func = 25;
1525: else if (d_list[i].d_func == quill_charge)
1526: func = 26;
1527: else if (d_list[i].d_func == nohaste)
1528: func = 27;
1529: else if (d_list[i].d_func == noslow)
1530: func = 28;
1531: else if (d_list[i].d_func == unclrhead)
1532: func = 29;
1533: else if (d_list[i].d_func == unsee)
1534: func = 30;
1535: else if (d_list[i].d_func == unphase)
1536: func = 31;
1537: else if (d_list[i].d_func == land)
1538: func = 32;
1539: else if (d_list[i].d_func == appear)
1540: func = 33;
1541: else if (d_list[i].d_func == unskill)
1542: func = 34;
1543: else if (d_list[i].d_func == nofire)
1544: func = 35;
1545: else if (d_list[i].d_func == nocold)
1546: func = 36;
1547: else if (d_list[i].d_func == nobolt)
1548: func = 37;
1549: else if (d_list[i].d_func == alchemy)
1550: func = 38;
1551: else if (d_list[i].d_func == NULL)
1552: func = 0;
1553: else
1554: func = -1;
1555:
1556: rs_write_int(savef, d_list[i].d_type);
1557: rs_write_int(savef, func);
1558:
1559: if (d_list[i].d_func == doctor)
1560: rs_write_int(savef, 1);
1561: else if (d_list[i].d_func == eat_gold)
1562: {
1563: int index;
1564: index = find_list_ptr(player.t_pack, d_list[i].d_.varg);
1565: rs_write_int(savef,index);
1566: }
1567: else if (d_list[i].d_func == changeclass)
1568: {
1569: rs_write_int(savef, d_list[i].d_.arg);
1570: }
1571: else if (d_list[i].d_func == cloak_charge)
1572: {
1573: int index;
1574: index = find_list_ptr(player.t_pack, d_list[i].d_.varg);
1575: rs_write_int(savef,index);
1576: }
1577: else if (d_list[i].d_func == alchemy)
1578: {
1579: rs_write_int(savef, number_alchemy_jug(d_list[i].d_.varg));
1580: }
1581: else
1582: rs_write_int(savef, d_list[i].d_.arg);
1583:
1584: rs_write_int(savef, d_list[i].d_time);
1585: }
1586:
1587: return(WRITESTAT);
1588: }
1589:
1590: int
1591: rs_read_daemons(FILE *inf, struct delayed_action *d_list, int count)
1592: {
1593: int i = 0;
1594: int func = 0;
1595: int value = 0;
1596: int dummy = 0;
1597:
1598: if (read_error || format_error)
1599: return(READSTAT);
1600:
1601: rs_read_marker(inf, RSID_DAEMONS);
1602: rs_read_int(inf, &value);
1603:
1604: if (value > count)
1605: format_error = TRUE;
1606:
1607: for(i=0; i < count; i++)
1608: {
1609: func = 0;
1610: rs_read_int(inf, &d_list[i].d_type);
1611: rs_read_int(inf, &func);
1612:
1613: switch(func)
1614: {
1615: case 1: d_list[i].d_func = rollwand;
1616: break;
1617: case 2: d_list[i].d_func = doctor;
1618: break;
1619: case 3: d_list[i].d_func = stomach;
1620: break;
1621: case 4: d_list[i].d_func = trap_look;
1622: break;
1623: case 5: d_list[i].d_func = eat_gold;
1624: break;
1625: case 6: d_list[i].d_func = ring_search;
1626: break;
1627: case 7: d_list[i].d_func = ring_teleport;
1628: break;
1629: case 8: d_list[i].d_func = fumble;
1630: break;
1631: case 9: d_list[i].d_func = strangle;
1632: break;
1633: case 10: d_list[i].d_func = unconfuse;
1634: break;
1635: case 11: d_list[i].d_func = swander;
1636: break;
1637: case 12: d_list[i].d_func = spell_recovery;
1638: break;
1639: case 13: d_list[i].d_func = chant_recovery;
1640: break;
1641: case 14: d_list[i].d_func = prayer_recovery;
1642: break;
1643: case 15: d_list[i].d_func = cure_disease;
1644: break;
1645: case 16: d_list[i].d_func = unstink;
1646: break;
1647: case 17: d_list[i].d_func = res_strength;
1648: break;
1649: case 18: d_list[i].d_func = undance;
1650: break;
1651: case 19: d_list[i].d_func = suffocate;
1652: break;
1653: case 20: d_list[i].d_func = wghtchk;
1654: break;
1655: case 21: d_list[i].d_func = dust_appear;
1656: break;
1657: case 22: d_list[i].d_func = unchoke;
1658: break;
1659: case 23: d_list[i].d_func = sight;
1660: break;
1661: case 24: d_list[i].d_func = changeclass;
1662: break;
1663: case 25: d_list[i].d_func = cloak_charge;
1664: break;
1665: case 26: d_list[i].d_func = quill_charge;
1666: break;
1667: case 27: d_list[i].d_func = nohaste;
1668: break;
1669: case 28: d_list[i].d_func = noslow;
1670: break;
1671: case 29: d_list[i].d_func = unclrhead;
1672: break;
1673: case 30: d_list[i].d_func = unsee;
1674: break;
1675: case 31: d_list[i].d_func = unphase;
1676: break;
1677: case 32: d_list[i].d_func = land;
1678: break;
1679: case 33: d_list[i].d_func = appear;
1680: break;
1681: case 34: d_list[i].d_func = unskill;
1682: break;
1683: case 35: d_list[i].d_func = nofire;
1684: break;
1685: case 36: d_list[i].d_func = nocold;
1686: break;
1687: case 37: d_list[i].d_func = nobolt;
1688: break;
1689: case 38: d_list[i].d_func = alchemy;
1690: break;
1691: case 0:
1692: case -1:
1693: default: d_list[i].d_func = NULL;
1694: break;
1695: }
1696:
1697: if (d_list[i].d_func == doctor)
1698: {
1699: rs_read_int(inf, &dummy);
1700: d_list[i].d_.varg = &player;
1701: }
1702: else if (d_list[i].d_func == eat_gold)
1703: {
1704: rs_read_int(inf, &dummy);
1705: d_list[i].d_.varg = get_list_item(player.t_pack, dummy);
1706: if (d_list[i].d_.varg == NULL)
1707: d_list[i].d_type = 0;
1708: }
1709: else if (d_list[i].d_func == changeclass)
1710: {
1711: rs_read_int(inf, &d_list[i].d_.arg);
1712: }
1713: else if (d_list[i].d_func == cloak_charge)
1714: {
1715: rs_read_int(inf, &dummy);
1716: d_list[i].d_.varg = get_list_item(player.t_pack,dummy);
1717:
1718: if (d_list[i].d_.varg == NULL)
1719: d_list[i].d_type = 0;
1720: }
1721: else if (d_list[i].d_func == alchemy)
1722: {
1723: rs_read_int(inf, &dummy);
1724: d_list[i].d_.varg = find_alchemy_jug(dummy);
1725: if (d_list[i].d_.varg == NULL)
1726: d_list[i].d_type = 0;
1727: }
1728: else
1729: rs_read_int(inf, &d_list[i].d_.arg);
1730:
1731: rs_read_int(inf, &d_list[i].d_time);
1732:
1733: if (d_list[i].d_func == NULL)
1734: {
1735: d_list[i].d_time = 0;
1736: d_list[i].d_.varg = NULL;
1737: d_list[i].d_type = 0;
1738: }
1739:
1740: }
1741:
1742: return(READSTAT);
1743: }
1744:
1745: int
1746: rs_write_room(FILE *savef, struct room *r)
1747: {
1748: struct linked_list *l;
1749: int i;
1750:
1751: if (write_error)
1752: return(WRITESTAT);
1753:
1754: rs_write_coord(savef, r->r_pos);
1755: rs_write_coord(savef, r->r_max);
1756: rs_write_long(savef, r->r_flags);
1757:
1758: l = r->r_fires;
1759: i = list_size(l);
1760:
1761: rs_write_int(savef, i);
1762:
1763: if (i >0)
1764: while (l != NULL)
1765: {
1766: i = find_list_ptr(mlist, l->l_data);
1767: rs_write_int(savef,i);
1768: l = l->l_next;
1769: }
1770:
1771: rs_write_coord_list(savef, r->r_exit);
1772:
1773: return(WRITESTAT);
1774: }
1775:
1776: int
1777: rs_read_room(FILE *inf, struct room *r)
1778: {
1779: int value = 0, n = 0, i = 0, index = 0, id = 0;
1780: struct linked_list *fires=NULL, *item = NULL;
1781:
1782: if (read_error || format_error)
1783: return(READSTAT);
1784:
1785: rs_read_coord(inf,&r->r_pos);
1786: rs_read_coord(inf,&r->r_max);
1787: rs_read_long(inf,&r->r_flags);
1788:
1789: rs_read_int(inf, &i);
1790: fires = NULL;
1791:
1792: while (i>0)
1793: {
1794: rs_read_int(inf,&index);
1795:
1796: if (index >= 0)
1797: {
1798: void *data;
1799: data = get_list_item(mlist,index);
1800: item = creat_item();
1801: item->l_data = data;
1802: if (fires == NULL)
1803: fires = item;
1804: else
1805: attach(fires,item);
1806: }
1807: i--;
1808: }
1809:
1810: r->r_fires=fires;
1811:
1812: rs_read_coord_list(inf, &r->r_exit);
1813:
1814: return(READSTAT);
1815: }
1816:
1817: int
1818: rs_write_rooms(FILE *savef, struct room r[], int count)
1819: {
1820: int n = 0;
1821:
1822: if (write_error)
1823: return(WRITESTAT);
1824:
1825: rs_write_int(savef, count);
1826:
1827: for(n = 0; n < count; n++)
1828: rs_write_room(savef, &r[n]);
1829:
1830: return(WRITESTAT);
1831: }
1832:
1833: int
1834: rs_read_rooms(FILE *inf, struct room *r, int count)
1835: {
1836: int value = 0, n = 0;
1837:
1838: if (read_error || format_error)
1839: return(READSTAT);
1840:
1841: rs_read_int(inf,&value);
1842:
1843: if (value > count)
1844: format_error = TRUE;
1845:
1846: for(n = 0; n < value; n++)
1847: rs_read_room(inf,&r[n]);
1848:
1849: return(READSTAT);
1850: }
1851:
1852: int
1853: rs_write_room_reference(FILE *savef, struct room *rp)
1854: {
1855: int i, room = -1;
1856:
1857: if (write_error)
1858: return(WRITESTAT);
1859:
1860: for (i = 0; i < MAXROOMS; i++)
1861: if (&rooms[i] == rp)
1862: room = i;
1863:
1864: rs_write_int(savef, room);
1865:
1866: return(WRITESTAT);
1867: }
1868:
1869: int
1870: rs_read_room_reference(FILE *inf, struct room **rp)
1871: {
1872: int i;
1873:
1874: if (read_error || format_error)
1875: return(READSTAT);
1876:
1877: rs_read_int(inf, &i);
1878:
1879: *rp = &rooms[i];
1880:
1881: return(READSTAT);
1882: }
1883:
1884: int
1885: rs_write_door_reference(FILE *savef, coord *exit)
1886: {
1887: int i, idx;
1888:
1889: for (i = 0; i < MAXROOMS; i++)
1890: {
1891: idx = find_list_ptr(rooms[i].r_exit, exit);
1892:
1893: if (idx != -1)
1894: break;
1895: }
1896:
1897: if (i >= MAXROOMS)
1898: {
1899: rs_write_int(savef,-1);
1900: rs_write_int(savef,-1);
1901: if (exit != NULL)
1902: abort();
1903: }
1904: else
1905: {
1906: rs_write_int(savef,i);
1907: rs_write_int(savef,idx);
1908: }
1909:
1910: return(WRITESTAT);
1911: }
1912:
1913: int
1914: rs_read_door_reference(FILE *inf, coord **exit)
1915: {
1916: int i, idx;
1917:
1918: rs_read_int(inf, &i);
1919: rs_read_int(inf, &idx);
1920:
1921: if ( (i == -1) || (idx == -1) )
1922: *exit = NULL;
1923: else
1924: *exit = get_list_item(rooms[i].r_exit, idx);
1925:
1926: return(READSTAT);
1927: }
1928:
1929: int
1930: rs_write_traps(FILE *savef, struct trap *trap,int count)
1931: {
1932: int n;
1933:
1934: rs_write_int(savef, RSID_TRAP);
1935: rs_write_int(savef, count);
1936:
1937: for(n=0; n<count; n++)
1938: {
1939: rs_write_char(savef, trap[n].tr_type);
1940: rs_write_char(savef, trap[n].tr_show);
1941: rs_write_coord(savef, trap[n].tr_pos);
1942: rs_write_long(savef, trap[n].tr_flags);
1943: }
1944: return (WRITESTAT);
1945: }
1946:
1947: int
1948: rs_read_traps(FILE *inf, struct trap *trap, int count)
1949: {
1950: int id = 0, value = 0, n = 0;
1951:
1952: if (rs_read_int(inf,&id) != 0)
1953: format_error = TRUE;
1954: else if (rs_read_int(inf,&value) != 0)
1955: {
1956: if (value != count)
1957: format_error = TRUE;
1958: }
1959: else
1960: {
1961: for(n=0;n<value;n++)
1962: {
1963: rs_read_char(inf,&trap[n].tr_type);
1964: rs_read_char(inf,&trap[n].tr_show);
1965: rs_read_coord(inf,&trap[n].tr_pos);
1966: rs_read_long(inf,&trap[n].tr_flags);
1967: }
1968: }
1969:
1970: return(READSTAT);
1971: }
1972:
1973: int
1974: rs_write_monsters(FILE *savef, struct monster *m, int count)
1975: {
1976: int n;
1977:
1978: if (write_error)
1979: return(WRITESTAT);
1980:
1981: rs_write_marker(savef, RSID_MONSTERS);
1982: rs_write_int(savef, count);
1983:
1984: for(n=0;n<count;n++)
1985: {
1986: rs_write_boolean(savef, m[n].m_normal);
1987: rs_write_boolean(savef, m[n].m_wander);
1988: rs_write_short(savef, m[n].m_numsum);
1989: }
1990:
1991: return(WRITESTAT);
1992: }
1993:
1994: int
1995: rs_read_monsters(FILE *inf, struct monster *m, int count)
1996: {
1997: int value = 0, n = 0;
1998:
1999: if (read_error || format_error)
2000: return(READSTAT);
2001:
2002: rs_read_marker(inf, RSID_MONSTERS);
2003:
2004: rs_read_int(inf, &value);
2005:
2006: if (value != count)
2007: format_error = TRUE;
2008:
2009: for(n = 0; n < count; n++)
2010: {
2011: rs_read_boolean(inf, &m[n].m_normal);
2012: rs_read_boolean(inf, &m[n].m_wander);
2013: rs_read_short(inf, &m[n].m_numsum);
2014: }
2015:
2016: return(READSTAT);
2017: }
2018:
2019: int
2020: rs_write_object(FILE *savef, struct object *o)
2021: {
2022: if (write_error)
2023: return(WRITESTAT);
2024:
2025: rs_write_marker(savef, RSID_OBJECT);
2026: rs_write_int(savef, o->o_type);
2027: rs_write_coord(savef, o->o_pos);
2028: rs_write_char(savef, o->o_launch);
2029: rs_write(savef, o->o_damage, sizeof(o->o_damage));
2030: rs_write(savef, o->o_hurldmg, sizeof(o->o_hurldmg));
2031: rs_write_object_list(savef, o->contents);
2032: rs_write_int(savef, o->o_count);
2033: rs_write_int(savef, o->o_which);
2034: rs_write_int(savef, o->o_hplus);
2035: rs_write_int(savef, o->o_dplus);
2036: rs_write_int(savef, o->o_ac);
2037: rs_write_long(savef, o->o_flags);
2038: rs_write_int(savef, o->o_group);
2039: rs_write_int(savef, o->o_weight);
2040: rs_write(savef, o->o_mark, MARKLEN);
2041:
2042:
2043: return(WRITESTAT);
2044: }
2045:
2046: int
2047: rs_read_object(FILE *inf, struct object *o)
2048: {
2049: if (read_error || format_error)
2050: return(READSTAT);
2051:
2052: rs_read_marker(inf, RSID_OBJECT);
2053: rs_read_int(inf, &o->o_type);
2054: rs_read_coord(inf, &o->o_pos);
2055: rs_read_char(inf, &o->o_launch);
2056: rs_read(inf, o->o_damage, sizeof(o->o_damage));
2057: rs_read(inf, o->o_hurldmg, sizeof(o->o_hurldmg));
2058: rs_read_object_list(inf,&o->contents);
2059: rs_read_int(inf, &o->o_count);
2060: rs_read_int(inf, &o->o_which);
2061: rs_read_int(inf, &o->o_hplus);
2062: rs_read_int(inf, &o->o_dplus);
2063: rs_read_int(inf, &o->o_ac);
2064: rs_read_long(inf,&o->o_flags);
2065: rs_read_int(inf, &o->o_group);
2066: rs_read_int(inf, &o->o_weight);
2067: rs_read(inf, o->o_mark, MARKLEN);
2068:
2069: return(READSTAT);
2070: }
2071:
2072: int
2073: rs_write_object_list(FILE *savef, struct linked_list *l)
2074: {
2075: if (write_error)
2076: return(WRITESTAT);
2077:
2078: rs_write_marker(savef, RSID_OBJECTLIST);
2079: rs_write_int(savef, list_size(l));
2080:
2081: for( ;l != NULL; l = l->l_next)
2082: rs_write_object(savef, OBJPTR(l));
2083:
2084: return(WRITESTAT);
2085: }
2086:
2087: int
2088: rs_read_object_list(FILE *inf, struct linked_list **list)
2089: {
2090: int i, cnt;
2091: struct linked_list *l = NULL, *previous = NULL, *head = NULL;
2092:
2093: if (read_error || format_error)
2094: return(READSTAT);
2095:
2096: rs_read_marker(inf, RSID_OBJECTLIST);
2097: rs_read_int(inf, &cnt);
2098:
2099: for (i = 0; i < cnt; i++)
2100: {
2101: l = new_item(sizeof(struct object));
2102:
2103: l->l_prev = previous;
2104:
2105: if (previous != NULL)
2106: previous->l_next = l;
2107:
2108: rs_read_object(inf,OBJPTR(l));
2109:
2110: if (previous == NULL)
2111: head = l;
2112:
2113: previous = l;
2114: }
2115:
2116: if (l != NULL)
2117: l->l_next = NULL;
2118:
2119: *list = head;
2120:
2121: return(READSTAT);
2122: }
2123:
2124: int
2125: rs_write_object_reference(FILE *savef, struct linked_list *list, struct object *item)
2126: {
2127: int i;
2128:
2129: if (write_error)
2130: return(WRITESTAT);
2131:
2132: i = find_list_ptr(list, item);
2133:
2134: rs_write_int(savef, i);
2135:
2136: return(WRITESTAT);
2137: }
2138:
2139: int
2140: rs_read_object_reference(FILE *inf, struct linked_list *list, struct object **item)
2141: {
2142: int i;
2143:
2144: if (read_error || format_error)
2145: return(READSTAT);
2146:
2147: rs_read_int(inf, &i);
2148:
2149: *item = get_list_item(list,i);
2150:
2151: return(READSTAT);
2152: }
2153:
2154: int
2155: find_thing_coord(struct linked_list *monlist, coord *c)
2156: {
2157: struct linked_list *mitem;
2158: struct thing *tp;
2159: int i = 0;
2160:
2161: for(mitem = monlist; mitem != NULL; mitem = mitem->l_next)
2162: {
2163: tp = THINGPTR(mitem);
2164:
2165: if (c == &tp->t_pos)
2166: return(i);
2167:
2168: i++;
2169: }
2170:
2171: return(-1);
2172: }
2173:
2174: int
2175: find_object_coord(struct linked_list *objlist, coord *c)
2176: {
2177: struct linked_list *oitem;
2178: struct object *obj;
2179: int i = 0;
2180:
2181: for(oitem = objlist; oitem != NULL; oitem = oitem->l_next)
2182: {
2183: obj = OBJPTR(oitem);
2184:
2185: if (c == &obj->o_pos)
2186: return(i);
2187:
2188: i++;
2189: }
2190:
2191: return(-1);
2192: }
2193:
2194: int
2195: rs_write_thing(FILE *savef, struct thing *t)
2196: {
2197: int i = -1;
2198:
2199: if (write_error)
2200: return(WRITESTAT);
2201:
2202: rs_write_marker(savef, RSID_THING);
2203:
2204: if (t == NULL)
2205: {
2206: rs_write_int(savef, 0);
2207: return(WRITESTAT);
2208: }
2209:
2210: rs_write_int(savef, 1);
2211: rs_write_boolean(savef,t->t_wasshot);
2212: rs_write_char(savef, t->t_type);
2213: rs_write_char(savef, t->t_disguise);
2214: rs_write_char(savef, t->t_oldch);
2215: rs_write_short(savef, t->t_ctype);
2216: rs_write_short(savef, t->t_index);
2217: rs_write_short(savef, t->t_no_move);
2218: rs_write_short(savef, t->t_quiet);
2219: rs_write_short(savef, t->t_movement);
2220: rs_write_short(savef, t->t_action);
2221: rs_write_short(savef, t->t_artifact);
2222: rs_write_short(savef, t->t_wand);
2223: rs_write_short(savef, t->t_summon);
2224: rs_write_short(savef, t->t_cast);
2225: rs_write_short(savef, t->t_breathe);
2226:
2227: rs_write_string(savef,t->t_name);
2228: rs_write_door_reference(savef, t->t_doorgoal);
2229:
2230: if (t->t_dest == &hero)
2231: {
2232: rs_write_int(savef,0);
2233: rs_write_int(savef,1);
2234: }
2235: else if (t->t_dest != NULL)
2236: {
2237: i = find_thing_coord(mlist, t->t_dest);
2238:
2239: if (i >= 0)
2240: {
2241: rs_write_int(savef,1);
2242: rs_write_int(savef,i);
2243: }
2244: else
2245: {
2246: i = find_object_coord(lvl_obj, t->t_dest);
2247:
2248: if (i >= 0)
2249: {
2250: rs_write_int(savef,2);
2251: rs_write_int(savef,i);
2252: }
2253: else
2254: {
2255: rs_write_int(savef,0);
2256: rs_write_int(savef,1); /* chase the hero anyway */
2257: }
2258: }
2259: }
2260: else
2261: {
2262: rs_write_int(savef,0);
2263: rs_write_int(savef,0);
2264: }
2265:
2266: rs_write_coord(savef, t->t_pos);
2267: rs_write_coord(savef, t->t_oldpos);
2268: rs_write_coord(savef, t->t_newpos);
2269: rs_write_ulongs(savef, t->t_flags, 16);
2270: rs_write_object_list(savef, t->t_pack);
2271: i = -1;
2272: if (t->t_using != NULL)
2273: i = find_list_ptr(t->t_pack, t->t_using->l_data);
2274: rs_write_int(savef, i);
2275: rs_write_int(savef, t->t_selection);
2276: rs_write_stats(savef, &t->t_stats);
2277: rs_write_stats(savef, &t->maxstats);
2278:
2279: return(WRITESTAT);
2280: }
2281:
2282: int
2283: rs_read_thing(FILE *inf, struct thing *t)
2284: {
2285: int listid = 0, index = -1;
2286:
2287: if (read_error || format_error)
2288: return(READSTAT);
2289:
2290: rs_read_marker(inf, RSID_THING);
2291:
2292: rs_read_int(inf, &index);
2293:
2294: if (index == 0)
2295: return(READSTAT);
2296:
2297: rs_read_boolean(inf, &t->t_wasshot);
2298: rs_read_char(inf, &t->t_type);
2299: rs_read_char(inf, &t->t_disguise);
2300: rs_read_char(inf, &t->t_oldch);
2301: rs_read_short(inf, &t->t_ctype);
2302: rs_read_short(inf, &t->t_index);
2303: rs_read_short(inf, &t->t_no_move);
2304: rs_read_short(inf, &t->t_quiet);
2305: rs_read_short(inf, &t->t_movement);
2306: rs_read_short(inf, &t->t_action);
2307: rs_read_short(inf, &t->t_artifact);
2308: rs_read_short(inf, &t->t_wand);
2309: rs_read_short(inf, &t->t_summon);
2310: rs_read_short(inf, &t->t_cast);
2311: rs_read_short(inf, &t->t_breathe);
2312: rs_read_new_string(inf,&t->t_name);
2313: rs_read_door_reference(inf,&t->t_doorgoal);
2314:
2315: rs_read_int(inf,&listid);
2316: rs_read_int(inf,&index);
2317: t->t_reserved = -1;
2318: if (listid == 0)
2319: {
2320: if (index == 1)
2321: t->t_dest = &hero;
2322: else
2323: t->t_dest = NULL;
2324: }
2325: else if (listid == 1)
2326: {
2327: t->t_dest = NULL;
2328: t->t_reserved = index;
2329: }
2330: else if (listid == 2)
2331: {
2332: struct object *obj;
2333: obj = get_list_item(lvl_obj,index);
2334: if (obj != NULL)
2335: {
2336: t->t_dest = &obj->o_pos;
2337: }
2338: }
2339: else
2340: t->t_dest = NULL;
2341:
2342: rs_read_coord(inf,&t->t_pos);
2343: rs_read_coord(inf,&t->t_oldpos);
2344: rs_read_coord(inf,&t->t_newpos);
2345: rs_read_ulongs(inf,t->t_flags,16);
2346: rs_read_object_list(inf,&t->t_pack);
2347: rs_read_int(inf,&index);
2348: t->t_using = get_list_item(t->t_pack, index);
2349: rs_read_int(inf, &t->t_selection);
2350: rs_read_stats(inf,&t->t_stats);
2351: rs_read_stats(inf,&t->maxstats);
2352:
2353: return(READSTAT);
2354: }
2355:
2356: void
2357: rs_fix_thing(struct thing *t)
2358: {
2359: struct thing *tp;
2360:
2361: if (t->t_reserved < 0)
2362: return;
2363:
2364: tp = get_list_item(mlist,t->t_reserved);
2365:
2366: if (tp != NULL)
2367: {
2368: t->t_dest = &tp->t_pos;
2369: }
2370: }
2371:
2372: int
2373: rs_write_thing_list(FILE *savef, struct linked_list *l)
2374: {
2375: int cnt = 0;
2376:
2377: if (write_error)
2378: return(WRITESTAT);
2379:
2380: rs_write_marker(savef, RSID_MONSTERLIST);
2381:
2382: cnt = list_size(l);
2383:
2384: rs_write_int(savef, cnt);
2385:
2386: if (cnt < 1)
2387: return(WRITESTAT);
2388:
2389: while (l != NULL) {
2390: rs_write_thing(savef, (struct thing *)l->l_data);
2391: l = l->l_next;
2392: }
2393:
2394: return(WRITESTAT);
2395: }
2396:
2397: int
2398: rs_read_thing_list(FILE *inf, struct linked_list **list)
2399: {
2400: int i, cnt;
2401: struct linked_list *l = NULL, *previous = NULL, *head = NULL;
2402:
2403: if (read_error || format_error)
2404: return(READSTAT);
2405:
2406: rs_read_marker(inf, RSID_MONSTERLIST);
2407:
2408: rs_read_int(inf, &cnt);
2409:
2410: for (i = 0; i < cnt; i++)
2411: {
2412: l = new_item(sizeof(struct thing));
2413:
2414: l->l_prev = previous;
2415:
2416: if (previous != NULL)
2417: previous->l_next = l;
2418:
2419: rs_read_thing(inf,THINGPTR(l));
2420:
2421: if (previous == NULL)
2422: head = l;
2423:
2424: previous = l;
2425: }
2426:
2427: if (l != NULL)
2428: l->l_next = NULL;
2429:
2430: *list = head;
2431:
2432: return(READSTAT);
2433: }
2434:
2435: void
2436: rs_fix_thing_list(struct linked_list *list)
2437: {
2438: struct linked_list *item;
2439:
2440: for(item = list; item != NULL; item = item->l_next)
2441: rs_fix_thing(THINGPTR(item));
2442: }
2443:
2444: int
2445: rs_write_thing_reference(FILE *savef, struct linked_list *list, struct thing *item)
2446: {
2447: int i;
2448:
2449: if (write_error)
2450: return(WRITESTAT);
2451:
2452: if (item == NULL)
2453: rs_write_int(savef,-1);
2454: else
2455: {
2456: i = find_list_ptr(list, item);
2457:
2458: rs_write_int(savef, i);
2459: }
2460:
2461: return(WRITESTAT);
2462: }
2463:
2464: int
2465: rs_read_thing_reference(FILE *inf, struct linked_list *list, struct thing **item)
2466: {
2467: int i;
2468:
2469: if (read_error || format_error)
2470: return(READSTAT);
2471:
2472: rs_read_int(inf, &i);
2473:
2474: if (i == -1)
2475: *item = NULL;
2476: else
2477: *item = get_list_item(list,i);
2478:
2479: return(READSTAT);
2480: }
2481:
2482: int
2483: rs_write_thing_references(FILE *savef, struct linked_list *list, struct thing *items[], int count)
2484: {
2485: int i;
2486:
2487: if (write_error)
2488: return(WRITESTAT);
2489:
2490: for(i = 0; i < count; i++)
2491: rs_write_thing_reference(savef,list,items[i]);
2492:
2493: return(WRITESTAT);
2494: }
2495:
2496: int
2497: rs_read_thing_references(FILE *inf, struct linked_list *list, struct thing *items[], int count)
2498: {
2499: int i;
2500:
2501: if (read_error || format_error)
2502: return(READSTAT);
2503:
2504: for(i = 0; i < count; i++)
2505: rs_read_thing_reference(inf,list,&items[i]);
2506:
2507: return(WRITESTAT);
2508: }
2509:
2510: int
2511: rs_save_file(FILE *savef)
2512: {
2513: int i;
2514:
2515: if (write_error)
2516: return(WRITESTAT);
2517:
2518: rs_write_object_list(savef, lvl_obj);
2519: rs_write_thing(savef, &player);
2520: rs_write_thing_list(savef, mlist);
2521: rs_write_thing_list(savef, tlist);
2522: rs_write_thing_list(savef, monst_dead);
2523:
2524: rs_write_traps(savef, traps, MAXTRAPS);
2525: rs_write_rooms(savef, rooms, MAXROOMS);
2526: rs_write_room_reference(savef,oldrp);
2527:
2528: rs_write_object_reference(savef, player.t_pack, cur_armor);
2529:
2530: for (i = 0; i < NUM_FINGERS; i++)
2531: rs_write_object_reference(savef, player.t_pack, cur_ring[i]);
2532:
2533: for (i = 0; i < NUM_MM; i++)
2534: rs_write_object_reference(savef, player.t_pack, cur_misc[i]);
2535:
2536: rs_write_ints(savef, cur_relic, MAXRELIC);
2537:
2538: rs_write_object_reference(savef, player.t_pack, cur_weapon);
2539:
2540: rs_write_int(savef,char_type);
2541: rs_write_int(savef,foodlev);
2542: rs_write_int(savef,ntraps);
2543: rs_write_int(savef,trader);
2544: rs_write_int(savef,curprice);
2545: rs_write_int(savef,seed);
2546: rs_write_int(savef,dnum);
2547: rs_write_int(savef,max_level);
2548: rs_write_int(savef,cur_max);
2549: rs_write_int(savef,mpos);
2550: rs_write_int(savef,level);
2551: rs_write_int(savef,purse);
2552: rs_write_int(savef,inpack);
2553: rs_write_int(savef,total);
2554: rs_write_int(savef,no_food);
2555: rs_write_int(savef,foods_this_level);
2556: rs_write_int(savef,count);
2557: rs_write_int(savef,food_left);
2558: rs_write_int(savef,group);
2559: rs_write_int(savef,hungry_state);
2560: rs_write_int(savef,infest_dam);
2561: rs_write_int(savef,lost_str);
2562: rs_write_int(savef,lastscore);
2563: rs_write_int(savef,hold_count);
2564: rs_write_int(savef,trap_tries);
2565: rs_write_int(savef,chant_time);
2566: rs_write_int(savef,pray_time);
2567: rs_write_int(savef,spell_power);
2568: rs_write_int(savef,turns);
2569: rs_write_int(savef,quest_item);
2570: rs_write_int(savef,cols);
2571: rs_write_int(savef,lines);
2572: rs_write_char(savef,nfloors);
2573: rs_write(savef,curpurch,LINELEN);
2574: rs_write_char(savef,PLAYER);
2575: rs_write_char(savef,take);
2576: rs_write(savef,prbuf,LINELEN*2);
2577: rs_write(savef,outbuf,BUFSIZ);
2578: rs_write_char(savef,runch);
2579: rs_write_scrolls(savef);
2580: rs_write_potions(savef);
2581: rs_write_rings(savef);
2582: rs_write_sticks(savef);
2583: rs_write_misc(savef);
2584: rs_write(savef,whoami,LINELEN);
2585: rs_write(savef,huh,LINELEN);
2586: rs_write(savef,file_name,LINELEN);
2587: rs_write(savef,score_file,LINELEN);
2588: rs_write(savef,home,LINELEN);
2589: rs_write_window(savef, cw);
2590: rs_write_window(savef, hw);
2591: rs_write_window(savef, mw);
2592: rs_write_window(savef, msgw);
2593: rs_write_window(savef, stdscr);
2594: rs_write_boolean(savef, pool_teleport);
2595: rs_write_boolean(savef, inwhgt);
2596: rs_write_boolean(savef, after);
2597: rs_write_boolean(savef, waswizard);
2598: rs_write_boolean(savef, playing);
2599: rs_write_boolean(savef, running);
2600: rs_write_boolean(savef, wizard);
2601: rs_write_boolean(savef, notify);
2602: rs_write_boolean(savef, fight_flush);
2603: rs_write_boolean(savef, terse);
2604: rs_write_boolean(savef, auto_pickup);
2605: rs_write_boolean(savef, menu_overlay);
2606: rs_write_boolean(savef, door_stop);
2607: rs_write_boolean(savef, jump);
2608: rs_write_boolean(savef, slow_invent);
2609: rs_write_boolean(savef, firstmove);
2610: rs_write_boolean(savef, askme);
2611: rs_write_boolean(savef, in_shell);
2612: rs_write_boolean(savef, daytime);
2613: rs_write_levtype(savef, levtype);
2614: rs_write_magic_items(savef, things, MAXTHINGS);
2615: rs_write_magic_items(savef, s_magic, MAXSCROLLS);
2616: rs_write_magic_items(savef, p_magic, MAXPOTIONS);
2617: rs_write_magic_items(savef, r_magic, MAXRINGS);
2618: rs_write_magic_items(savef, ws_magic, MAXSTICKS);
2619: rs_write_magic_items(savef, m_magic, MAXMM);
2620: rs_write_magic_items(savef, rel_magic, MAXRELIC);
2621: rs_write_magic_items(savef, foods, MAXFOODS);
2622:
2623: rs_write_monsters(savef, monsters, NUMMONST+1);
2624:
2625: rs_write_daemons(savef, d_list, MAXDAEMONS);
2626: rs_write_daemons(savef, f_list, MAXFUSES);
2627: rs_write_int(savef, demoncnt);
2628: rs_write_int(savef, fusecnt);
2629:
2630: rs_write_int(savef, between);
2631:
2632: rs_write_int(savef, chance);
2633:
2634: return(WRITESTAT);
2635: }
2636:
2637: int
2638: rs_restore_file(FILE *inf)
2639: {
2640: int i;
2641:
2642: if (read_error || format_error)
2643: return(READSTAT);
2644:
2645: rs_read_object_list(inf, &lvl_obj);
2646: rs_read_thing(inf, &player);
2647: rs_read_thing_list(inf, &mlist);
2648: rs_read_thing_list(inf, &tlist);
2649: rs_read_thing_list(inf, &monst_dead);
2650:
2651: rs_fix_thing(&player);
2652: rs_fix_thing_list(mlist);
2653: rs_fix_thing_list(tlist);
2654: rs_fix_thing_list(monst_dead);
2655:
2656: rs_read_traps(inf, traps, MAXTRAPS);
2657: rs_read_rooms(inf, rooms, MAXROOMS);
2658: rs_read_room_reference(inf,&oldrp);
2659:
2660: rs_read_object_reference(inf, player.t_pack, &cur_armor);
2661:
2662: for(i = 0; i < NUM_FINGERS; i++)
2663: rs_read_object_reference(inf, player.t_pack, &cur_ring[i]);
2664:
2665: for(i = 0; i < NUM_MM; i++)
2666: rs_read_object_reference(inf, player.t_pack, &cur_misc[i]);
2667:
2668: rs_read_ints(inf, cur_relic, MAXRELIC);
2669:
2670: rs_read_object_reference(inf, player.t_pack, &cur_weapon);
2671:
2672: rs_read_int(inf,&char_type);
2673: rs_read_int(inf,&foodlev);
2674: rs_read_int(inf,&ntraps);
2675: rs_read_int(inf,&trader);
2676: rs_read_int(inf,&curprice);
2677: rs_read_int(inf,&seed);
2678: rs_read_int(inf,&dnum);
2679: rs_read_int(inf,&max_level);
2680: rs_read_int(inf,&cur_max);
2681: rs_read_int(inf,&mpos);
2682: rs_read_int(inf,&level);
2683: rs_read_int(inf,&purse);
2684: rs_read_int(inf,&inpack);
2685: rs_read_int(inf,&total);
2686: rs_read_int(inf,&no_food);
2687: rs_read_int(inf,&foods_this_level);
2688: rs_read_int(inf,&count);
2689: rs_read_int(inf,&food_left);
2690: rs_read_int(inf,&group);
2691: rs_read_int(inf,&hungry_state);
2692: rs_read_int(inf,&infest_dam);
2693: rs_read_int(inf,&lost_str);
2694: rs_read_int(inf,&lastscore);
2695: rs_read_int(inf,&hold_count);
2696: rs_read_int(inf,&trap_tries);
2697: rs_read_int(inf,&chant_time);
2698: rs_read_int(inf,&pray_time);
2699: rs_read_int(inf,&spell_power);
2700: rs_read_int(inf,&turns);
2701: rs_read_int(inf,&quest_item);
2702: rs_read_int(inf,&cols);
2703: rs_read_int(inf,&lines);
2704: rs_read_char(inf,&nfloors);
2705: rs_read(inf,curpurch,LINELEN);
2706: rs_read_char(inf,&PLAYER);
2707: rs_read_char(inf,&take);
2708: rs_read(inf,prbuf,LINELEN*2);
2709: rs_read(inf,outbuf,BUFSIZ);
2710: rs_read_char(inf,&runch);
2711: rs_read_scrolls(inf);
2712: rs_read_potions(inf);
2713: rs_read_rings(inf);
2714: rs_read_sticks(inf);
2715: rs_read_misc(inf);
2716: rs_read(inf,whoami,LINELEN);
2717: rs_read(inf,huh,LINELEN);
2718: rs_read(inf,file_name,LINELEN);
2719: rs_read(inf,score_file,LINELEN);
2720: rs_read(inf,home,LINELEN);
2721: rs_read_window(inf, cw);
2722: rs_read_window(inf, hw);
2723: rs_read_window(inf, mw);
2724: rs_read_window(inf, msgw);
2725: rs_read_window(inf, stdscr);
2726: rs_read_boolean(inf, &pool_teleport);
2727: rs_read_boolean(inf, &inwhgt);
2728: rs_read_boolean(inf, &after);
2729: rs_read_boolean(inf, &waswizard);
2730: rs_read_boolean(inf, &playing);
2731: rs_read_boolean(inf, &running);
2732: rs_read_boolean(inf, &wizard);
2733: rs_read_boolean(inf, ¬ify);
2734: rs_read_boolean(inf, &fight_flush);
2735: rs_read_boolean(inf, &terse);
2736: rs_read_boolean(inf, &auto_pickup);
2737: rs_read_boolean(inf, &menu_overlay);
2738: rs_read_boolean(inf, &door_stop);
2739: rs_read_boolean(inf, &jump);
2740: rs_read_boolean(inf, &slow_invent);
2741: rs_read_boolean(inf, &firstmove);
2742: rs_read_boolean(inf, &askme);
2743: rs_read_boolean(inf, &in_shell);
2744: rs_read_boolean(inf, &daytime);
2745: rs_read_levtype(inf, &levtype);
2746: rs_read_magic_items(inf, things, MAXTHINGS);
2747: rs_read_magic_items(inf, s_magic, MAXSCROLLS);
2748: rs_read_magic_items(inf, p_magic, MAXPOTIONS);
2749: rs_read_magic_items(inf, r_magic, MAXRINGS);
2750: rs_read_magic_items(inf, ws_magic, MAXSTICKS);
2751: rs_read_magic_items(inf, m_magic, MAXMM);
2752: rs_read_magic_items(inf, rel_magic, MAXRELIC);
2753: rs_read_magic_items(inf, foods, MAXFOODS);
2754: rs_read_monsters(inf, monsters, NUMMONST + 1);
2755:
2756: rs_read_daemons(inf, d_list, MAXDAEMONS);
2757: rs_read_daemons(inf, f_list, MAXFUSES);
2758: rs_read_int(inf, &demoncnt);
2759: rs_read_int(inf, &fusecnt);
2760:
2761: rs_read_int(inf, &between);
2762:
2763: rs_read_int(inf, &chance);
2764:
2765: return(READSTAT);
2766: }
CVSweb