[BACK]Return to state.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / arogue5

Annotation of early-roguelike/arogue5/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: int rs_read_int(FILE *inf, int *i);
                     68: int rs_write_int(FILE *savef, int c);
                     69: int list_size(struct linked_list *l);
                     70: int rs_write_object_list(FILE *savef, struct linked_list *l);
                     71: int rs_read_object_list(FILE *inf, struct linked_list **list);
                     72:
                     73: #define READSTAT (format_error || read_error )
                     74: #define WRITESTAT (write_error)
                     75:
                     76: static int read_error   = FALSE;
                     77: static int write_error  = FALSE;
                     78: static int format_error = FALSE;
                     79: static int endian = 0x01020304;
                     80: #define  big_endian ( *((char *)&endian) == 0x01 )
                     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:     *i = *((long *) buf);
                    559:
                    560:     return(READSTAT);
                    561: }
                    562:
                    563: int
                    564: rs_write_longs(FILE *savef, long *c, int count)
                    565: {
                    566:     int n = 0;
                    567:
                    568:     if (write_error)
                    569:         return(WRITESTAT);
                    570:
                    571:     rs_write_int(savef,count);
                    572:
                    573:     for(n = 0; n < count; n++)
                    574:         rs_write_long(savef, c[n]);
                    575:
                    576:     return(WRITESTAT);
                    577: }
                    578:
                    579: int
                    580: rs_read_longs(FILE *inf, long *i, int count)
                    581: {
                    582:     int n = 0, value = 0;
                    583:
                    584:     if (read_error || format_error)
                    585:         return(READSTAT);
                    586:
                    587:     rs_read_int(inf,&value);
                    588:
                    589:     if (value != count)
                    590:         format_error = TRUE;
                    591:
                    592:     for(n = 0; n < value; n++)
                    593:         if (rs_read_long(inf, &i[n]) != 0)
                    594:             break;
                    595:
                    596:     return(READSTAT);
                    597: }
                    598:
                    599: int
                    600: rs_write_ulong(FILE *savef, unsigned long c)
                    601: {
                    602:     unsigned int c2;
                    603:     unsigned char bytes[4];
                    604:     unsigned char *buf = (unsigned char *)&c;
                    605:
                    606:     if (write_error)
                    607:         return(WRITESTAT);
                    608:
                    609:     if ( (sizeof(long) == 8) && (sizeof(int) == 4) )
                    610:     {
                    611:         c2 = c;
                    612:         buf = (unsigned char *) &c2;
                    613:     }
                    614:
                    615:     if (big_endian)
                    616:     {
                    617:         bytes[3] = buf[0];
                    618:         bytes[2] = buf[1];
                    619:         bytes[1] = buf[2];
                    620:         bytes[0] = buf[3];
                    621:         buf = bytes;
                    622:     }
                    623:
                    624:     rs_write(savef, buf, 4);
                    625:
                    626:     return(WRITESTAT);
                    627: }
                    628:
                    629: int
                    630: rs_read_ulong(FILE *inf, unsigned long *i)
                    631: {
                    632:     unsigned char bytes[4];
                    633:     unsigned long input;
                    634:     unsigned char *buf = (unsigned char *) &input;
                    635:
                    636:     if (read_error || format_error)
                    637:         return(READSTAT);
                    638:
                    639:     rs_read(inf, &input, 4);
                    640:
                    641:     if (big_endian)
                    642:     {
                    643:         bytes[3] = buf[0];
                    644:         bytes[2] = buf[1];
                    645:         bytes[1] = buf[2];
                    646:         bytes[0] = buf[3];
                    647:         buf = bytes;
                    648:     }
                    649:
                    650:     if ( (sizeof(long) == 8) && (sizeof(int) == 4) )
                    651:       *i = *((unsigned int *) buf);
                    652:     else
                    653:       *i = *((unsigned long *) buf);
                    654:
                    655:     return(READSTAT);
                    656: }
                    657:
                    658: int
                    659: rs_write_ulongs(FILE *savef, unsigned long *c, int count)
                    660: {
                    661:     int n = 0;
                    662:
                    663:     if (write_error)
                    664:         return(WRITESTAT);
                    665:
                    666:     rs_write_int(savef,count);
                    667:
                    668:     for(n = 0; n < count; n++)
                    669:         if (rs_write_ulong(savef,c[n]) != 0)
                    670:             break;
                    671:
                    672:     return(WRITESTAT);
                    673: }
                    674:
                    675: int
                    676: rs_read_ulongs(FILE *inf, unsigned long *i, int count)
                    677: {
                    678:     int n = 0, value = 0;
                    679:
                    680:     if (read_error || format_error)
                    681:         return(READSTAT);
                    682:
                    683:     rs_read_int(inf,&value);
                    684:
                    685:     if (value != count)
                    686:         format_error = TRUE;
                    687:
                    688:     for(n = 0; n < count; n++)
                    689:         if (rs_read_ulong(inf, &i[n]) != 0)
                    690:             break;
                    691:
                    692:     return(READSTAT);
                    693: }
                    694:
                    695: int
                    696: rs_write_marker(FILE *savef, int id)
                    697: {
                    698:     if (write_error)
                    699:         return(WRITESTAT);
                    700:
                    701:     rs_write_int(savef, id);
                    702:
                    703:     return(WRITESTAT);
                    704: }
                    705:
                    706: int
                    707: rs_read_marker(FILE *inf, int id)
                    708: {
                    709:     int nid;
                    710:
                    711:     if (read_error || format_error)
                    712:         return(READSTAT);
                    713:
                    714:     if (rs_read_int(inf, &nid) == 0)
                    715:         if (id != nid)
                    716:             format_error = 1;
                    717:
                    718:     return(READSTAT);
                    719: }
                    720:
                    721:
                    722:
                    723: /******************************************************************************/
                    724:
                    725: int
                    726: rs_write_string(FILE *savef, char *s)
                    727: {
                    728:     int len = 0;
                    729:
                    730:     if (write_error)
                    731:         return(WRITESTAT);
                    732:
                    733:     len = (s == NULL) ? 0 : (int) strlen(s) + 1;
                    734:
                    735:     rs_write_int(savef, len);
                    736:     rs_write_chars(savef, s, len);
                    737:
                    738:     return(WRITESTAT);
                    739: }
                    740:
                    741: int
                    742: rs_read_string(FILE *inf, char *s, int max)
                    743: {
                    744:     int len = 0;
                    745:
                    746:     if (read_error || format_error)
                    747:         return(READSTAT);
                    748:
                    749:     rs_read_int(inf, &len);
                    750:
                    751:     if (len > max)
                    752:         format_error = TRUE;
                    753:
                    754:     rs_read_chars(inf, s, len);
                    755:
                    756:     return(READSTAT);
                    757: }
                    758:
                    759: int
                    760: rs_read_new_string(FILE *inf, char **s)
                    761: {
                    762:     int len=0;
                    763:     char *buf=0;
                    764:
                    765:     if (read_error || format_error)
                    766:         return(READSTAT);
                    767:
                    768:     rs_read_int(inf, &len);
                    769:
                    770:     if (len == 0)
                    771:         buf = NULL;
                    772:     else
                    773:     {
                    774:         buf = malloc(len);
                    775:
                    776:         if (buf == NULL)
                    777:             read_error = TRUE;
                    778:     }
                    779:
                    780:     rs_read_chars(inf, buf, len);
                    781:
                    782:     *s = buf;
                    783:
                    784:     return(READSTAT);
                    785: }
                    786:
                    787: int
                    788: rs_write_strings(FILE *savef, char *s[], int count)
                    789: {
                    790:     int n = 0;
                    791:
                    792:     if (write_error)
                    793:         return(WRITESTAT);
                    794:
                    795:     rs_write_int(savef, count);
                    796:
                    797:     for(n = 0; n < count; n++)
                    798:         if (rs_write_string(savef, s[n]) != 0)
                    799:             break;
                    800:
                    801:     return(WRITESTAT);
                    802: }
                    803:
                    804: int
                    805: rs_read_strings(FILE *inf, char **s, int count, int max)
                    806: {
                    807:     int n     = 0;
                    808:     int value = 0;
                    809:
                    810:     if (read_error || format_error)
                    811:         return(READSTAT);
                    812:
                    813:     rs_read_int(inf, &value);
                    814:
                    815:     if (value != count)
                    816:         format_error = TRUE;
                    817:
                    818:     for(n = 0; n < count; n++)
                    819:         if (rs_read_string(inf, s[n], max) != 0)
                    820:             break;
                    821:
                    822:     return(READSTAT);
                    823: }
                    824:
                    825: int
                    826: rs_read_new_strings(FILE *inf, char **s, int count)
                    827: {
                    828:     int n     = 0;
                    829:     int value = 0;
                    830:
                    831:     if (read_error || format_error)
                    832:         return(READSTAT);
                    833:
                    834:     rs_read_int(inf, &value);
                    835:
                    836:     if (value != count)
                    837:         format_error = TRUE;
                    838:
                    839:     for(n = 0; n < count; n++)
                    840:         if (rs_read_new_string(inf, &s[n]) != 0)
                    841:             break;
                    842:
                    843:     return(READSTAT);
                    844: }
                    845:
                    846: int
                    847: rs_write_string_index(FILE *savef, char *master[], int max, const char *str)
                    848: {
                    849:     int i;
                    850:
                    851:     if (write_error)
                    852:         return(WRITESTAT);
                    853:
                    854:     for(i = 0; i < max; i++)
                    855:         if (str == master[i])
                    856:             return( rs_write_int(savef, i) );
                    857:
                    858:     return( rs_write_int(savef,-1) );
                    859: }
                    860:
                    861: int
                    862: rs_read_string_index(FILE *inf, char *master[], int maxindex, char **str)
                    863: {
                    864:     int i;
                    865:
                    866:     if (read_error || format_error)
                    867:         return(READSTAT);
                    868:
                    869:     rs_read_int(inf, &i);
                    870:
                    871:     if (i > maxindex)
                    872:         format_error = TRUE;
                    873:     else if (i >= 0)
                    874:         *str = master[i];
                    875:     else
                    876:         *str = NULL;
                    877:
                    878:     return(READSTAT);
                    879: }
                    880:
                    881: int
                    882: rs_write_coord(FILE *savef, coord c)
                    883: {
                    884:     if (write_error)
                    885:         return(WRITESTAT);
                    886:
                    887:     rs_write_int(savef, c.x);
                    888:     rs_write_int(savef, c.y);
                    889:
                    890:     return(WRITESTAT);
                    891: }
                    892:
                    893: int
                    894: rs_read_coord(FILE *inf, coord *c)
                    895: {
                    896:     coord in;
                    897:
                    898:     if (read_error || format_error)
                    899:         return(READSTAT);
                    900:
                    901:     rs_read_int(inf,&in.x);
                    902:     rs_read_int(inf,&in.y);
                    903:
                    904:     if (READSTAT == 0)
                    905:     {
                    906:         c->x = in.x;
                    907:         c->y = in.y;
                    908:     }
                    909:
                    910:     return(READSTAT);
                    911: }
                    912:
                    913: int
                    914: rs_write_coord_list(FILE *savef, struct linked_list *l)
                    915: {
                    916:     rs_write_marker(savef, RSID_COORDLIST);
                    917:     rs_write_int(savef, list_size(l));
                    918:
                    919:     while (l != NULL)
                    920:     {
                    921:         rs_write_coord(savef, *(coord *) l->l_data);
                    922:         l = l->l_next;
                    923:     }
                    924:
                    925:     return(WRITESTAT);
                    926: }
                    927:
                    928: int
                    929: rs_read_coord_list(FILE *inf, struct linked_list **list)
                    930: {
                    931:     int i, cnt;
                    932:     struct linked_list *l = NULL, *previous = NULL, *head = NULL;
                    933:
                    934:     rs_read_marker(inf, RSID_COORDLIST);
                    935:
                    936:     if (rs_read_int(inf,&cnt) != 0)
                    937:        return(READSTAT);
                    938:
                    939:     for (i = 0; i < cnt; i++)
                    940:     {
                    941:        l = new_item(sizeof(coord));
                    942:         l->l_prev = previous;
                    943:
                    944:         if (previous != NULL)
                    945:            previous->l_next = l;
                    946:
                    947:         rs_read_coord(inf,(coord *) l->l_data);
                    948:
                    949:        if (previous == NULL)
                    950:            head = l;
                    951:
                    952:        previous = l;
                    953:     }
                    954:
                    955:     if (l != NULL)
                    956:        l->l_next = NULL;
                    957:
                    958:     *list = head;
                    959:
                    960:     return(READSTAT);
                    961: }
                    962:
                    963: int
                    964: rs_write_window(FILE *savef, WINDOW *win)
                    965: {
                    966:     int row,col,height,width;
                    967:
                    968:     if (write_error)
                    969:         return(WRITESTAT);
                    970:
                    971:     width  = getmaxx(win);
                    972:     height = getmaxy(win);
                    973:
                    974:     rs_write_marker(savef,RSID_WINDOW);
                    975:     rs_write_int(savef,height);
                    976:     rs_write_int(savef,width);
                    977:
                    978:     for(row=0;row<height;row++)
                    979:         for(col=0;col<width;col++)
                    980:             if (rs_write_int(savef, mvwinch(win,row,col)) != 0)
                    981:                 return(WRITESTAT);
                    982:
                    983:     return(WRITESTAT);
                    984: }
                    985:
                    986: int
                    987: rs_read_window(FILE *inf, WINDOW *win)
                    988: {
                    989:     int row,col,maxlines,maxcols,value,width,height;
                    990:
                    991:     if (read_error || format_error)
                    992:         return(READSTAT);
                    993:
                    994:     width  = getmaxx(win);
                    995:     height = getmaxy(win);
                    996:
                    997:     rs_read_marker(inf, RSID_WINDOW);
                    998:
                    999:     rs_read_int(inf, &maxlines);
                   1000:     rs_read_int(inf, &maxcols);
                   1001:
                   1002:     for(row = 0; row < maxlines; row++)
                   1003:         for(col = 0; col < maxcols; col++)
                   1004:         {
                   1005:             if (rs_read_int(inf, &value) != 0)
                   1006:                 return(READSTAT);
                   1007:
                   1008:             if ((row < height) && (col < width))
                   1009:                 mvwaddch(win,row,col,value);
                   1010:         }
                   1011:
                   1012:     return(READSTAT);
                   1013: }
                   1014:
                   1015: /******************************************************************************/
                   1016:
                   1017: void *
                   1018: get_list_item(struct linked_list *l, int i)
                   1019: {
                   1020:     int count;
                   1021:
                   1022:     for(count = 0; l != NULL; count++, l = l->l_next)
                   1023:         if (count == i)
                   1024:            return(l->l_data);
                   1025:
                   1026:     return(NULL);
                   1027: }
                   1028:
                   1029: int
                   1030: find_list_ptr(struct linked_list *l, void *ptr)
                   1031: {
                   1032:     int count;
                   1033:
                   1034:     for(count = 0; l != NULL; count++, l = l->l_next)
                   1035:         if (l->l_data == ptr)
                   1036:             return(count);
                   1037:
                   1038:     return(-1);
                   1039: }
                   1040:
                   1041: int
                   1042: list_size(struct linked_list *l)
                   1043: {
                   1044:     int count;
                   1045:
                   1046:     for(count = 0; l != NULL; count++, l = l->l_next)
                   1047:         ;
                   1048:
                   1049:     return(count);
                   1050: }
                   1051:
                   1052: /******************************************************************************/
                   1053:
                   1054: int
                   1055: rs_write_levtype(FILE *savef, LEVTYPE c)
                   1056: {
                   1057:     int lt;
                   1058:
                   1059:     switch(c)
                   1060:     {
                   1061:         case NORMLEV: lt = 1; break;
                   1062:         case POSTLEV: lt = 2; break;
                   1063:         case MAZELEV: lt = 3; break;
                   1064:         case OUTSIDE: lt = 4; break;
                   1065:         default: lt = -1; break;
                   1066:     }
                   1067:
                   1068:     rs_write_int(savef,lt);
                   1069:
                   1070:     return(WRITESTAT);
                   1071: }
                   1072:
                   1073: int
                   1074: rs_read_levtype(FILE *inf, LEVTYPE *l)
                   1075: {
                   1076:     int lt;
                   1077:
                   1078:     rs_read_int(inf, &lt);
                   1079:
                   1080:     switch(lt)
                   1081:     {
                   1082:         case 1: *l = NORMLEV; break;
                   1083:         case 2: *l = POSTLEV; break;
                   1084:         case 3: *l = MAZELEV; break;
                   1085:         case 4: *l = OUTSIDE; break;
                   1086:         default: *l = NORMLEV; break;
                   1087:     }
                   1088:
                   1089:     return(READSTAT);
                   1090: }
                   1091:
                   1092: int
                   1093: rs_write_stats(FILE *savef, struct stats *s)
                   1094: {
                   1095:     if (write_error)
                   1096:         return(WRITESTAT);
                   1097:
                   1098:     rs_write_marker(savef, RSID_STATS);
                   1099:     rs_write_short(savef, s->s_str);
                   1100:     rs_write_short(savef, s->s_intel);
                   1101:     rs_write_short(savef, s->s_wisdom);
                   1102:     rs_write_short(savef, s->s_dext);
                   1103:     rs_write_short(savef, s->s_const);
                   1104:     rs_write_short(savef, s->s_charisma);
                   1105:     rs_write_ulong(savef, s->s_exp);
                   1106:     rs_write_int(savef, s->s_lvl);
                   1107:     rs_write_int(savef, s->s_arm);
                   1108:     rs_write_int(savef, s->s_hpt);
                   1109:     rs_write_int(savef, s->s_pack);
                   1110:     rs_write_int(savef, s->s_carry);
                   1111:     rs_write(savef, s->s_dmg, sizeof(s->s_dmg));
                   1112:
                   1113:     return(WRITESTAT);
                   1114: }
                   1115:
                   1116: int
                   1117: rs_read_stats(FILE *inf, struct stats *s)
                   1118: {
                   1119:     if (read_error || format_error)
                   1120:         return(READSTAT);
                   1121:
                   1122:     rs_read_marker(inf, RSID_STATS);
                   1123:     rs_read_short(inf,&s->s_str);
                   1124:     rs_read_short(inf,&s->s_intel);
                   1125:     rs_read_short(inf,&s->s_wisdom);
                   1126:     rs_read_short(inf,&s->s_dext);
                   1127:     rs_read_short(inf,&s->s_const);
                   1128:     rs_read_short(inf,&s->s_charisma);
                   1129:     rs_read_ulong(inf,&s->s_exp);
                   1130:     rs_read_int(inf,&s->s_lvl);
                   1131:     rs_read_int(inf,&s->s_arm);
                   1132:     rs_read_int(inf,&s->s_hpt);
                   1133:     rs_read_int(inf,&s->s_pack);
                   1134:     rs_read_int(inf,&s->s_carry);
                   1135:
                   1136:     rs_read(inf,s->s_dmg,sizeof(s->s_dmg));
                   1137:
                   1138:     return(READSTAT);
                   1139: }
                   1140:
                   1141: int
                   1142: rs_write_magic_items(FILE *savef, struct magic_item *i, int count)
                   1143: {
                   1144:     int n;
                   1145:
                   1146:     rs_write_marker(savef, RSID_MAGICITEMS);
                   1147:     rs_write_int(savef, count);
                   1148:
                   1149:     for(n = 0; n < count; n++)
                   1150:     {
                   1151:         rs_write_int(savef,i[n].mi_prob);
                   1152:     }
                   1153:
                   1154:     return(WRITESTAT);
                   1155: }
                   1156:
                   1157: int
                   1158: rs_read_magic_items(FILE *inf, struct magic_item *mi, int count)
                   1159: {
                   1160:     int n;
                   1161:     int value;
                   1162:
                   1163:     rs_read_marker(inf, RSID_MAGICITEMS);
                   1164:
                   1165:     rs_read_int(inf, &value);
                   1166:
                   1167:     if (value != count)
                   1168:        format_error = 1;
                   1169:     else
                   1170:     {
                   1171:        for(n = 0; n < value; n++)
                   1172:         {
                   1173:            rs_read_int(inf,&mi[n].mi_prob);
                   1174:         }
                   1175:     }
                   1176:
                   1177:     return(READSTAT);
                   1178: }
                   1179:
                   1180: int
                   1181: rs_write_scrolls(FILE *savef)
                   1182: {
                   1183:     int i;
                   1184:
                   1185:     if (write_error)
                   1186:         return(WRITESTAT);
                   1187:
                   1188:     for(i = 0; i < MAXSCROLLS; i++)
                   1189:     {
                   1190:         rs_write_string(savef, s_names[i]);
                   1191:        rs_write_boolean(savef,s_know[i]);
                   1192:         rs_write_string(savef,s_guess[i]);
                   1193:     }
                   1194:
                   1195:     return(WRITESTAT);
                   1196: }
                   1197:
                   1198: int
                   1199: rs_read_scrolls(FILE *inf)
                   1200: {
                   1201:     int i;
                   1202:
                   1203:     if (read_error || format_error)
                   1204:         return(READSTAT);
                   1205:
                   1206:     for(i = 0; i < MAXSCROLLS; i++)
                   1207:     {
                   1208:         rs_read_new_string(inf,&s_names[i]);
                   1209:         rs_read_boolean(inf,&s_know[i]);
                   1210:         rs_read_new_string(inf,&s_guess[i]);
                   1211:     }
                   1212:
                   1213:     return(READSTAT);
                   1214: }
                   1215:
                   1216: int
                   1217: rs_write_potions(FILE *savef)
                   1218: {
                   1219:     int i;
                   1220:
                   1221:     if (write_error)
                   1222:         return(WRITESTAT);
                   1223:
                   1224:     for(i = 0; i < MAXPOTIONS; i++)
                   1225:     {
                   1226:        rs_write_string_index(savef,rainbow,NCOLORS,p_colors[i]);
                   1227:         rs_write_boolean(savef,p_know[i]);
                   1228:         rs_write_string(savef,p_guess[i]);
                   1229:     }
                   1230:
                   1231:     return(WRITESTAT);
                   1232: }
                   1233:
                   1234: int
                   1235: rs_read_potions(FILE *inf)
                   1236: {
                   1237:     int i;
                   1238:
                   1239:     if (read_error || format_error)
                   1240:         return(READSTAT);
                   1241:
                   1242:     for(i = 0; i < MAXPOTIONS; i++)
                   1243:     {
                   1244:         rs_read_string_index(inf,rainbow,NCOLORS,&p_colors[i]);
                   1245:        rs_read_boolean(inf,&p_know[i]);
                   1246:         rs_read_new_string(inf,&p_guess[i]);
                   1247:     }
                   1248:
                   1249:     return(READSTAT);
                   1250: }
                   1251:
                   1252: int
                   1253: rs_write_rings(FILE *savef)
                   1254: {
                   1255:     int i;
                   1256:
                   1257:     if (write_error)
                   1258:         return(WRITESTAT);
                   1259:
                   1260:     for(i = 0; i < MAXRINGS; i++)
                   1261:     {
                   1262:        rs_write_string_index(savef,stones,NSTONES,r_stones[i]);
                   1263:         rs_write_boolean(savef,r_know[i]);
                   1264:         rs_write_string(savef,r_guess[i]);
                   1265:     }
                   1266:
                   1267:     return(WRITESTAT);
                   1268: }
                   1269:
                   1270: int
                   1271: rs_read_rings(FILE *inf)
                   1272: {
                   1273:     int i;
                   1274:
                   1275:     if (read_error || format_error)
                   1276:         return(READSTAT);
                   1277:
                   1278:     for(i = 0; i < MAXRINGS; i++)
                   1279:     {
                   1280:         rs_read_string_index(inf,stones,NSTONES,&r_stones[i]);
                   1281:        rs_read_boolean(inf,&r_know[i]);
                   1282:         rs_read_new_string(inf,&r_guess[i]);
                   1283:     }
                   1284:
                   1285:     return(READSTAT);
                   1286: }
                   1287:
                   1288: int
                   1289: rs_write_sticks(FILE *savef)
                   1290: {
                   1291:     int i;
                   1292:
                   1293:     if (write_error)
                   1294:         return(WRITESTAT);
                   1295:
                   1296:     rs_write_marker(savef, RSID_STICKS);
                   1297:
                   1298:     for (i = 0; i < MAXSTICKS; i++)
                   1299:     {
                   1300:         if (strcmp(ws_type[i],"staff") == 0)
                   1301:         {
                   1302:             rs_write_int(savef,0);
                   1303:            rs_write_string_index(savef,wood,NWOOD,ws_made[i]);
                   1304:         }
                   1305:         else
                   1306:         {
                   1307:             rs_write_int(savef,1);
                   1308:            rs_write_string_index(savef,metal,NMETAL,ws_made[i]);
                   1309:         }
                   1310:
                   1311:        rs_write_boolean(savef, ws_know[i]);
                   1312:         rs_write_string(savef, ws_guess[i]);
                   1313:     }
                   1314:
                   1315:     return(WRITESTAT);
                   1316: }
                   1317:
                   1318: int
                   1319: rs_read_sticks(FILE *inf)
                   1320: {
                   1321:     int i = 0, j = 0, list = 0;
                   1322:
                   1323:     if (read_error || format_error)
                   1324:         return(READSTAT);
                   1325:
                   1326:     rs_read_marker(inf, RSID_STICKS);
                   1327:
                   1328:     for(i = 0; i < MAXSTICKS; i++)
                   1329:     {
                   1330:         rs_read_int(inf,&list);
                   1331:         ws_made[i] = NULL;
                   1332:
                   1333:         if (list == 0)
                   1334:         {
                   1335:            rs_read_string_index(inf,wood,NWOOD,&ws_made[i]);
                   1336:             ws_type[i] = "staff";
                   1337:         }
                   1338:         else
                   1339:         {
                   1340:            rs_read_string_index(inf,metal,NMETAL,&ws_made[i]);
                   1341:            ws_type[i] = "wand";
                   1342:         }
                   1343:        rs_read_boolean(inf, &ws_know[i]);
                   1344:         rs_read_new_string(inf, &ws_guess[i]);
                   1345:     }
                   1346:
                   1347:     return(READSTAT);
                   1348: }
                   1349:
                   1350: /* Assigns a number to an alchemy jug associated with a fuse, so it can be
                   1351:  * found and reassociated when restoring.
                   1352:  * 1 - 31: slot in pack
                   1353:  * 32+   : on floor
                   1354:  * Hopefully monsters do not pick them up.
                   1355:  */
                   1356: int number_alchemy_jug(struct object *obj) {
                   1357:     struct object *tobj = NULL;
                   1358:     struct linked_list *item;
                   1359:     int i = 1;
                   1360:     for (item = player.t_pack; item != NULL; item = next(item), i++) {
                   1361:        tobj = OBJPTR(item);
                   1362:        if (tobj         == obj         &&
                   1363:            tobj->o_type == MM          &&
                   1364:            tobj->o_which== MM_JUG)
                   1365:                break;
                   1366:     }
                   1367:     if (item == NULL) {
                   1368:        for (item = lvl_obj, i = 32; item != NULL; item = next(item), i++) {
                   1369:            tobj = OBJPTR(item);
                   1370:            if (tobj         == obj             &&
                   1371:                tobj->o_type == MM              &&
                   1372:                tobj->o_which== MM_JUG)
                   1373:                    break;
                   1374:        }
                   1375:     }
                   1376:     if (item == NULL)
                   1377:       return 0;
                   1378:     return i;
                   1379: }
                   1380:
                   1381: /* Takes an alchemy jug number and tracks down the object. */
                   1382: struct object *find_alchemy_jug(int n) {
                   1383:     struct object *tobj;
                   1384:     struct linked_list *item;
                   1385:
                   1386:     if (n <= 0) {
                   1387:         return NULL;
                   1388:     }
                   1389:     else if (n < 32) {
                   1390:         item = player.t_pack;
                   1391:         n -= 1;
                   1392:     }
                   1393:     else if (n < 1024) {
                   1394:         item = lvl_obj;
                   1395:         n -= 32;
                   1396:     }
                   1397:     else {
                   1398:         /* This is likely a bug, not 1024 actual items on the floor. */
                   1399:         return NULL;
                   1400:     }
                   1401:     while (item != NULL && n > 0) {
                   1402:         item = next(item);
                   1403:         n--;
                   1404:     }
                   1405:     if (item == NULL)
                   1406:         return NULL;
                   1407:     tobj = OBJPTR(item);
                   1408:     if (tobj->o_type != MM || tobj->o_which != MM_JUG)
                   1409:         return NULL;
                   1410:     return tobj;
                   1411: }
                   1412:
                   1413: int
                   1414: rs_write_daemons(FILE *savef, struct delayed_action *d_list, int count)
                   1415: {
                   1416:     int i = 0;
                   1417:     int func = 0;
                   1418:
                   1419:     if (write_error)
                   1420:         return(WRITESTAT);
                   1421:
                   1422:     rs_write_marker(savef, RSID_DAEMONS);
                   1423:     rs_write_int(savef, count);
                   1424:
                   1425:     for(i = 0; i < count; i++)
                   1426:     {
                   1427:         if ( d_list[i].d_func == rollwand)
                   1428:             func = 1;
                   1429:         else if ( d_list[i].d_func == doctor)
                   1430:             func = 2;
                   1431:         else if ( d_list[i].d_func == stomach)
                   1432:             func = 3;
                   1433:         else if ( d_list[i].d_func == runners)
                   1434:             func = 4;
                   1435:         else if ( d_list[i].d_func == swander)
                   1436:             func = 5;
                   1437:         else if ( d_list[i].d_func == trap_look)
                   1438:             func = 6;
                   1439:         else if ( d_list[i].d_func == ring_search)
                   1440:             func = 7;
                   1441:         else if ( d_list[i].d_func == ring_teleport)
                   1442:             func = 8;
                   1443:         else if ( d_list[i].d_func == strangle)
                   1444:             func = 9;
                   1445:         else if ( d_list[i].d_func == fumble)
                   1446:             func = 10;
                   1447:         else if ( d_list[i].d_func == wghtchk)
                   1448:             func = 11;
                   1449:         else if ( d_list[i].d_func == unstink)
                   1450:             func = 12;
                   1451:         else if ( d_list[i].d_func == res_strength)
                   1452:             func = 13;
                   1453:         else if ( d_list[i].d_func == un_itch)
                   1454:             func = 14;
                   1455:         else if ( d_list[i].d_func == cure_disease)
                   1456:             func = 15;
                   1457:         else if ( d_list[i].d_func == unconfuse)
                   1458:             func = 16;
                   1459:         else if ( d_list[i].d_func == suffocate)
                   1460:             func = 17;
                   1461:         else if ( d_list[i].d_func == undance)
                   1462:             func = 18;
                   1463:         else if ( d_list[i].d_func == alchemy)
                   1464:             func = 19;
                   1465:         else if ( d_list[i].d_func == dust_appear)
                   1466:             func = 20;
                   1467:         else if ( d_list[i].d_func == unchoke)
                   1468:             func = 21;
                   1469:         else if ( d_list[i].d_func == sight)
                   1470:             func = 22;
                   1471:         else if ( d_list[i].d_func == noslow)
                   1472:             func = 23;
                   1473:         else if ( d_list[i].d_func == nohaste)
                   1474:             func = 24;
                   1475:         else if ( d_list[i].d_func == unclrhead)
                   1476:             func = 25;
                   1477:         else if ( d_list[i].d_func == unsee)
                   1478:             func = 26;
                   1479:         else if ( d_list[i].d_func == unphase)
                   1480:             func = 27;
                   1481:         else if ( d_list[i].d_func == land)
                   1482:             func = 28;
                   1483:         else if ( d_list[i].d_func == appear)
                   1484:             func = 29;
                   1485:         else if (d_list[i].d_func == NULL)
                   1486:             func = 0;
                   1487:         else
                   1488:             func = -1;
                   1489:
                   1490:         rs_write_int(savef, d_list[i].d_type);
                   1491:         rs_write_int(savef, func);
                   1492:         /* d_arg is a pointer and can't actually be saved and restored. */
                   1493:         if (func == 19)
                   1494:             rs_write_int(savef, number_alchemy_jug(d_list[i].d_arg));
                   1495:         else
                   1496:             rs_write_int(savef, 0);
                   1497:         rs_write_int(savef, d_list[i].d_time);
                   1498:     }
                   1499:
                   1500:     return(WRITESTAT);
                   1501: }
                   1502:
                   1503: int
                   1504: rs_read_daemons(FILE *inf, struct delayed_action *d_list, int count)
                   1505: {
                   1506:     int i = 0;
                   1507:     int func = 0;
                   1508:     int value = 0;
                   1509:     int dummy = 0;
                   1510:
                   1511:     if (read_error || format_error)
                   1512:         return(READSTAT);
                   1513:
                   1514:     rs_read_marker(inf, RSID_DAEMONS);
                   1515:     rs_read_int(inf, &value);
                   1516:
                   1517:     if (value > count)
                   1518:         format_error = TRUE;
                   1519:
                   1520:
                   1521:     for(i=0; i < count; i++)
                   1522:     {
                   1523:        func = 0;
                   1524:         rs_read_int(inf, &d_list[i].d_type);
                   1525:         rs_read_int(inf, &func);
                   1526:
                   1527:         switch(func)
                   1528:         {
                   1529:            case  1: d_list[i].d_func = rollwand;
                   1530:                     break;
                   1531:             case  2: d_list[i].d_func = doctor;
                   1532:                     break;
                   1533:             case 3: d_list[i].d_func = stomach;
                   1534:                     break;
                   1535:             case  4: d_list[i].d_func = runners;
                   1536:                      break;
                   1537:             case  5: d_list[i].d_func = swander;
                   1538:                      break;
                   1539:             case  6: d_list[i].d_func = trap_look;
                   1540:                      break;
                   1541:             case  7: d_list[i].d_func = ring_search;
                   1542:                      break;
                   1543:             case  8: d_list[i].d_func = ring_teleport;
                   1544:                      break;
                   1545:             case  9: d_list[i].d_func = strangle;
                   1546:                      break;
                   1547:             case 10: d_list[i].d_func = fumble;
                   1548:                      break;
                   1549:             case 11: d_list[i].d_func = wghtchk;
                   1550:                      break;
                   1551:             case 12: d_list[i].d_func = unstink;
                   1552:                      break;
                   1553:             case 13: d_list[i].d_func = res_strength;
                   1554:                      break;
                   1555:             case 14: d_list[i].d_func = un_itch;
                   1556:                      break;
                   1557:             case 15: d_list[i].d_func = cure_disease;
                   1558:                      break;
                   1559:             case 16: d_list[i].d_func = unconfuse;
                   1560:                      break;
                   1561:             case 17: d_list[i].d_func = suffocate;
                   1562:                      break;
                   1563:             case 18: d_list[i].d_func = undance;
                   1564:                      break;
                   1565:             case 19: d_list[i].d_func = alchemy;
                   1566:                      break;
                   1567:             case 20: d_list[i].d_func = dust_appear;
                   1568:                      break;
                   1569:             case 21: d_list[i].d_func = unchoke;
                   1570:                      break;
                   1571:             case 22: d_list[i].d_func = sight;
                   1572:                      break;
                   1573:             case 23: d_list[i].d_func = noslow;
                   1574:                      break;
                   1575:             case 24: d_list[i].d_func = nohaste;
                   1576:                      break;
                   1577:             case 25: d_list[i].d_func = unclrhead;
                   1578:                      break;
                   1579:             case 26: d_list[i].d_func = unsee;
                   1580:                      break;
                   1581:             case 27: d_list[i].d_func = unphase;
                   1582:                      break;
                   1583:             case 28: d_list[i].d_func = land;
                   1584:                      break;
                   1585:             case 29: d_list[i].d_func = appear;
                   1586:                      break;
                   1587:            case  0:
                   1588:             case -1:
                   1589:             default: d_list[i].d_func = NULL;
                   1590:                      break;
                   1591:         }
                   1592:
                   1593:         /* Most functions don't use the argument. */
                   1594:         rs_read_int(inf, &dummy);
                   1595:         if (func == 2)
                   1596:             d_list[i].d_arg = &player;
                   1597:         else if (func == 19)
                   1598:             d_list[i].d_arg = find_alchemy_jug(dummy);
                   1599:         else
                   1600:             d_list[i].d_arg = NULL;
                   1601:
                   1602:         rs_read_int(inf, &d_list[i].d_time);
                   1603:
                   1604:        if (d_list[i].d_func == NULL)
                   1605:        {
                   1606:            d_list[i].d_time = 0;
                   1607:            d_list[i].d_type = 0;
                   1608:        }
                   1609:     }
                   1610:
                   1611:     return(READSTAT);
                   1612: }
                   1613:
                   1614: int
                   1615: rs_write_room(FILE *savef, struct room *r)
                   1616: {
                   1617:     struct linked_list *l;
                   1618:     int i;
                   1619:
                   1620:     if (write_error)
                   1621:         return(WRITESTAT);
                   1622:
                   1623:     rs_write_coord(savef, r->r_pos);
                   1624:     rs_write_coord(savef, r->r_max);
                   1625:     rs_write_long(savef, r->r_flags);
                   1626:
                   1627:     l = r->r_fires;
                   1628:     i = list_size(l);
                   1629:
                   1630:     rs_write_int(savef, i);
                   1631:
                   1632:     if (i >0)
                   1633:        while (l != NULL)
                   1634:         {
                   1635:            i = find_list_ptr(mlist, l->l_data);
                   1636:             rs_write_int(savef,i);
                   1637:             l = l->l_next;
                   1638:         }
                   1639:
                   1640:     rs_write_coord_list(savef, r->r_exit);
                   1641:
                   1642:     return(WRITESTAT);
                   1643: }
                   1644:
                   1645: int
                   1646: rs_read_room(FILE *inf, struct room *r)
                   1647: {
                   1648:     int value = 0, n = 0, i = 0, index = 0, id = 0;
                   1649:     struct linked_list *fires=NULL, *item = NULL;
                   1650:
                   1651:     if (read_error || format_error)
                   1652:         return(READSTAT);
                   1653:
                   1654:     rs_read_coord(inf,&r->r_pos);
                   1655:     rs_read_coord(inf,&r->r_max);
                   1656:     rs_read_long(inf,&r->r_flags);
                   1657:
                   1658:     rs_read_int(inf, &i);
                   1659:     fires = NULL;
                   1660:
                   1661:     while (i>0)
                   1662:     {
                   1663:        rs_read_int(inf,&index);
                   1664:
                   1665:         if (index >= 0)
                   1666:         {
                   1667:            void *data;
                   1668:             data = get_list_item(mlist,index);
                   1669:             item = creat_item();
                   1670:             item->l_data = data;
                   1671:             if (fires == NULL)
                   1672:                fires = item;
                   1673:             else
                   1674:                attach(fires,item);
                   1675:         }
                   1676:         i--;
                   1677:     }
                   1678:
                   1679:     r->r_fires=fires;
                   1680:
                   1681:     rs_read_coord_list(inf, &r->r_exit);
                   1682:
                   1683:     return(READSTAT);
                   1684: }
                   1685:
                   1686: int
                   1687: rs_write_rooms(FILE *savef, struct room r[], int count)
                   1688: {
                   1689:     int n = 0;
                   1690:
                   1691:     if (write_error)
                   1692:         return(WRITESTAT);
                   1693:
                   1694:     rs_write_int(savef, count);
                   1695:
                   1696:     for(n = 0; n < count; n++)
                   1697:         rs_write_room(savef, &r[n]);
                   1698:
                   1699:     return(WRITESTAT);
                   1700: }
                   1701:
                   1702: int
                   1703: rs_read_rooms(FILE *inf, struct room *r, int count)
                   1704: {
                   1705:     int value = 0, n = 0;
                   1706:
                   1707:     if (read_error || format_error)
                   1708:         return(READSTAT);
                   1709:
                   1710:     rs_read_int(inf,&value);
                   1711:
                   1712:     if (value > count)
                   1713:         format_error = TRUE;
                   1714:
                   1715:     for(n = 0; n < value; n++)
                   1716:         rs_read_room(inf,&r[n]);
                   1717:
                   1718:     return(READSTAT);
                   1719: }
                   1720:
                   1721: int
                   1722: rs_write_room_reference(FILE *savef, struct room *rp)
                   1723: {
                   1724:     int i, room = -1;
                   1725:
                   1726:     if (write_error)
                   1727:         return(WRITESTAT);
                   1728:
                   1729:     for (i = 0; i < MAXROOMS; i++)
                   1730:         if (&rooms[i] == rp)
                   1731:             room = i;
                   1732:
                   1733:     rs_write_int(savef, room);
                   1734:
                   1735:     return(WRITESTAT);
                   1736: }
                   1737:
                   1738: int
                   1739: rs_read_room_reference(FILE *inf, struct room **rp)
                   1740: {
                   1741:     int i;
                   1742:
                   1743:     if (read_error || format_error)
                   1744:         return(READSTAT);
                   1745:
                   1746:     rs_read_int(inf, &i);
                   1747:
                   1748:     if (i >= 0 && i < MAXROOMS)
                   1749:         *rp = &rooms[i];
                   1750:     else
                   1751:         *rp = NULL;
                   1752:
                   1753:     return(READSTAT);
                   1754: }
                   1755:
                   1756: int
                   1757: rs_write_door_reference(FILE *savef, coord *exit)
                   1758: {
                   1759:     int i, idx;
                   1760:
                   1761:     for (i = 0; i < MAXROOMS; i++)
                   1762:     {
                   1763:        idx = find_list_ptr(rooms[i].r_exit, exit);
                   1764:
                   1765:        if (idx != -1)
                   1766:            break;
                   1767:     }
                   1768:
                   1769:     if (i >= MAXROOMS)
                   1770:     {
                   1771:         rs_write_int(savef,-1);
                   1772:        rs_write_int(savef,-1);
                   1773:        if (exit != NULL)
                   1774:            abort();
                   1775:     }
                   1776:     else
                   1777:     {
                   1778:        rs_write_int(savef,i);
                   1779:        rs_write_int(savef,idx);
                   1780:     }
                   1781:
                   1782:     return(WRITESTAT);
                   1783: }
                   1784:
                   1785: int
                   1786: rs_read_door_reference(FILE *inf, coord **exit)
                   1787: {
                   1788:     int i, idx;
                   1789:
                   1790:     rs_read_int(inf, &i);
                   1791:     rs_read_int(inf, &idx);
                   1792:
                   1793:     if ( (i == -1) || (idx == -1) )
                   1794:        *exit = NULL;
                   1795:     else
                   1796:        *exit = get_list_item(rooms[i].r_exit, idx);
                   1797:
                   1798:     return(READSTAT);
                   1799: }
                   1800:
                   1801: int
                   1802: rs_write_traps(FILE *savef, struct trap *trap,int count)
                   1803: {
                   1804:     int n;
                   1805:
                   1806:     rs_write_int(savef, RSID_TRAP);
                   1807:     rs_write_int(savef, count);
                   1808:
                   1809:     for(n=0; n<count; n++)
                   1810:     {
                   1811:         rs_write_char(savef, trap[n].tr_type);
                   1812:         rs_write_char(savef, trap[n].tr_show);
                   1813:         rs_write_coord(savef, trap[n].tr_pos);
                   1814:         rs_write_long(savef, trap[n].tr_flags);
                   1815:     }
                   1816:
                   1817:     return (WRITESTAT);
                   1818: }
                   1819:
                   1820: int
                   1821: rs_read_traps(FILE *inf, struct trap *trap, int count)
                   1822: {
                   1823:     int id = 0, value = 0, n = 0;
                   1824:
                   1825:     if (rs_read_int(inf,&id) != 0)
                   1826:         format_error = TRUE;
                   1827:     else if (rs_read_int(inf,&value) != 0)
                   1828:     {
                   1829:         if (value != count)
                   1830:            format_error = TRUE;
                   1831:     }
                   1832:     else
                   1833:     {
                   1834:        for(n=0;n<value;n++)
                   1835:         {
                   1836:            rs_read_char(inf,&trap[n].tr_type);
                   1837:             rs_read_char(inf,&trap[n].tr_show);
                   1838:             rs_read_coord(inf,&trap[n].tr_pos);
                   1839:             rs_read_long(inf,&trap[n].tr_flags);
                   1840:        }
                   1841:     }
                   1842:
                   1843:     return(READSTAT);
                   1844: }
                   1845:
                   1846: int
                   1847: rs_write_monsters(FILE *savef, struct monster *m, int count)
                   1848: {
                   1849:     int n;
                   1850:
                   1851:     if (write_error)
                   1852:         return(WRITESTAT);
                   1853:
                   1854:     rs_write_marker(savef, RSID_MONSTERS);
                   1855:     rs_write_int(savef, count);
                   1856:
                   1857:     for(n=0;n<count;n++)
                   1858:     {
                   1859:         rs_write_boolean(savef, m[n].m_normal);
                   1860:         rs_write_boolean(savef, m[n].m_wander);
                   1861:         rs_write_short(savef, m[n].m_numsum);
                   1862:     }
                   1863:
                   1864:     return(WRITESTAT);
                   1865: }
                   1866:
                   1867: int
                   1868: rs_read_monsters(FILE *inf, struct monster *m, int count)
                   1869: {
                   1870:     int value = 0, n = 0;
                   1871:
                   1872:     if (read_error || format_error)
                   1873:         return(READSTAT);
                   1874:
                   1875:     rs_read_marker(inf, RSID_MONSTERS);
                   1876:
                   1877:     rs_read_int(inf, &value);
                   1878:
                   1879:     if (value != count)
                   1880:         format_error = TRUE;
                   1881:
                   1882:     for(n = 0; n < count; n++)
                   1883:     {
                   1884:         rs_read_boolean(inf, &m[n].m_normal);
                   1885:         rs_read_boolean(inf, &m[n].m_wander);
                   1886:        rs_read_short(inf, &m[n].m_numsum);
                   1887:     }
                   1888:
                   1889:     return(READSTAT);
                   1890: }
                   1891:
                   1892: int
                   1893: rs_write_object(FILE *savef, struct object *o)
                   1894: {
                   1895:     if (write_error)
                   1896:         return(WRITESTAT);
                   1897:
                   1898:     rs_write_marker(savef, RSID_OBJECT);
                   1899:     rs_write_int(savef, o->o_type);
                   1900:     rs_write_coord(savef, o->o_pos);
                   1901:     rs_write_char(savef, o->o_launch);
                   1902:     rs_write(savef, o->o_damage, sizeof(o->o_damage));
                   1903:     rs_write(savef, o->o_hurldmg, sizeof(o->o_hurldmg));
                   1904:     rs_write_object_list(savef, o->contents);
                   1905:     rs_write_int(savef, o->o_count);
                   1906:     rs_write_int(savef, o->o_which);
                   1907:     rs_write_int(savef, o->o_hplus);
                   1908:     rs_write_int(savef, o->o_dplus);
                   1909:     rs_write_int(savef, o->o_ac);
                   1910:     rs_write_long(savef, o->o_flags);
                   1911:     rs_write_int(savef, o->o_group);
                   1912:     rs_write_int(savef, o->o_weight);
                   1913:     rs_write(savef, o->o_mark, MARKLEN);
                   1914:
                   1915:
                   1916:     return(WRITESTAT);
                   1917: }
                   1918:
                   1919: int
                   1920: rs_read_object(FILE *inf, struct object *o)
                   1921: {
                   1922:     if (read_error || format_error)
                   1923:         return(READSTAT);
                   1924:
                   1925:     rs_read_marker(inf, RSID_OBJECT);
                   1926:     rs_read_int(inf, &o->o_type);
                   1927:     rs_read_coord(inf, &o->o_pos);
                   1928:     rs_read_char(inf, &o->o_launch);
                   1929:     rs_read(inf, o->o_damage, sizeof(o->o_damage));
                   1930:     rs_read(inf, o->o_hurldmg, sizeof(o->o_hurldmg));
                   1931:     rs_read_object_list(inf,&o->contents);
                   1932:     rs_read_int(inf, &o->o_count);
                   1933:     rs_read_int(inf, &o->o_which);
                   1934:     rs_read_int(inf, &o->o_hplus);
                   1935:     rs_read_int(inf, &o->o_dplus);
                   1936:     rs_read_int(inf, &o->o_ac);
                   1937:     rs_read_long(inf,&o->o_flags);
                   1938:     rs_read_int(inf, &o->o_group);
                   1939:     rs_read_int(inf, &o->o_weight);
                   1940:     rs_read(inf, o->o_mark, MARKLEN);
                   1941:
                   1942:     return(READSTAT);
                   1943: }
                   1944:
                   1945: int
                   1946: rs_write_object_list(FILE *savef, struct linked_list *l)
                   1947: {
                   1948:     if (write_error)
                   1949:         return(WRITESTAT);
                   1950:
                   1951:     rs_write_marker(savef, RSID_OBJECTLIST);
                   1952:     rs_write_int(savef, list_size(l));
                   1953:
                   1954:     for( ;l != NULL; l = l->l_next)
                   1955:         rs_write_object(savef, OBJPTR(l));
                   1956:
                   1957:     return(WRITESTAT);
                   1958: }
                   1959:
                   1960: int
                   1961: rs_read_object_list(FILE *inf, struct linked_list **list)
                   1962: {
                   1963:     int i, cnt;
                   1964:     struct linked_list *l = NULL, *previous = NULL, *head = NULL;
                   1965:
                   1966:     if (read_error || format_error)
                   1967:         return(READSTAT);
                   1968:
                   1969:     rs_read_marker(inf, RSID_OBJECTLIST);
                   1970:     rs_read_int(inf, &cnt);
                   1971:
                   1972:     for (i = 0; i < cnt; i++)
                   1973:     {
                   1974:         l = new_item(sizeof(struct object));
                   1975:
                   1976:        l->l_prev = previous;
                   1977:
                   1978:         if (previous != NULL)
                   1979:             previous->l_next = l;
                   1980:
                   1981:         rs_read_object(inf,OBJPTR(l));
                   1982:
                   1983:         if (previous == NULL)
                   1984:             head = l;
                   1985:
                   1986:         previous = l;
                   1987:     }
                   1988:
                   1989:     if (l != NULL)
                   1990:         l->l_next = NULL;
                   1991:
                   1992:     *list = head;
                   1993:
                   1994:     return(READSTAT);
                   1995: }
                   1996:
                   1997: int
                   1998: rs_write_object_reference(FILE *savef, struct linked_list *list, struct object *item)
                   1999: {
                   2000:     int i;
                   2001:
                   2002:     if (write_error)
                   2003:         return(WRITESTAT);
                   2004:
                   2005:     i = find_list_ptr(list, item);
                   2006:
                   2007:     rs_write_int(savef, i);
                   2008:
                   2009:     return(WRITESTAT);
                   2010: }
                   2011:
                   2012: int
                   2013: rs_read_object_reference(FILE *inf, struct linked_list *list, struct object **item)
                   2014: {
                   2015:     int i;
                   2016:
                   2017:     if (read_error || format_error)
                   2018:         return(READSTAT);
                   2019:
                   2020:     rs_read_int(inf, &i);
                   2021:
                   2022:     *item = get_list_item(list,i);
                   2023:
                   2024:     return(READSTAT);
                   2025: }
                   2026:
                   2027: int
                   2028: find_thing_coord(struct linked_list *monlist, coord *c)
                   2029: {
                   2030:     struct linked_list *mitem;
                   2031:     struct thing *tp;
                   2032:     int i = 0;
                   2033:
                   2034:     for(mitem = monlist; mitem != NULL; mitem = mitem->l_next)
                   2035:     {
                   2036:         tp = THINGPTR(mitem);
                   2037:
                   2038:         if (c == &tp->t_pos)
                   2039:             return(i);
                   2040:
                   2041:         i++;
                   2042:     }
                   2043:
                   2044:     return(-1);
                   2045: }
                   2046:
                   2047: int
                   2048: find_object_coord(struct linked_list *objlist, coord *c)
                   2049: {
                   2050:     struct linked_list *oitem;
                   2051:     struct object *obj;
                   2052:     int i = 0;
                   2053:
                   2054:     for(oitem = objlist; oitem != NULL; oitem = oitem->l_next)
                   2055:     {
                   2056:         obj = OBJPTR(oitem);
                   2057:
                   2058:         if (c == &obj->o_pos)
                   2059:             return(i);
                   2060:
                   2061:         i++;
                   2062:     }
                   2063:
                   2064:     return(-1);
                   2065: }
                   2066:
                   2067: int
                   2068: rs_write_thing(FILE *savef, struct thing *t)
                   2069: {
                   2070:     int i = -1;
                   2071:
                   2072:     if (write_error)
                   2073:         return(WRITESTAT);
                   2074:
                   2075:     rs_write_marker(savef, RSID_THING);
                   2076:
                   2077:     if (t == NULL)
                   2078:     {
                   2079:         rs_write_int(savef, 0);
                   2080:         return(WRITESTAT);
                   2081:     }
                   2082:
                   2083:     rs_write_int(savef, 1);
                   2084:
                   2085:     rs_write_boolean(savef, t->t_turn);
                   2086:     rs_write_boolean(savef, t->t_wasshot);
                   2087:     rs_write_char(savef, t->t_type);
                   2088:     rs_write_char(savef, t->t_disguise);
                   2089:     rs_write_char(savef, t->t_oldch);
                   2090:
                   2091:     rs_write_short(savef, t->t_ctype);
                   2092:     rs_write_short(savef, t->t_index);
                   2093:     rs_write_short(savef, t->t_no_move);
                   2094:     rs_write_short(savef, t->t_quiet);
                   2095:
                   2096:     rs_write_door_reference(savef, t->t_doorgoal);
                   2097:
                   2098:     rs_write_coord(savef, t->t_pos);
                   2099:     rs_write_coord(savef, t->t_oldpos);
                   2100:
                   2101:     /*
                   2102:         t_dest can be:
                   2103:         0,0: NULL
                   2104:         0,1: location of hero
                   2105:         0,3: global coord 'delta'
                   2106:         1,i: location of a thing (monster)
                   2107:         2,i: location of an object
                   2108:         3,i: location of gold in a room
                   2109:
                   2110:         We need to remember what we are chasing rather than
                   2111:         the current location of what we are chasing.
                   2112:     */
                   2113:
                   2114:     if (t->t_dest == &hero)
                   2115:     {
                   2116:         rs_write_int(savef,0);
                   2117:         rs_write_int(savef,1);
                   2118:     }
                   2119:     else if (t->t_dest != NULL)
                   2120:     {
                   2121:         i = find_thing_coord(mlist, t->t_dest);
                   2122:
                   2123:         if (i >=0 )
                   2124:         {
                   2125:             rs_write_int(savef,1);
                   2126:             rs_write_int(savef,i);
                   2127:         }
                   2128:         else
                   2129:         {
                   2130:             i = find_object_coord(lvl_obj, t->t_dest);
                   2131:
                   2132:             if (i >= 0)
                   2133:             {
                   2134:                 rs_write_int(savef,2);
                   2135:                 rs_write_int(savef,i);
                   2136:             }
                   2137:             else
                   2138:             {
                   2139:                 rs_write_int(savef, 0);
                   2140:                 rs_write_int(savef,1); /* chase the hero anyway */
                   2141:             }
                   2142:         }
                   2143:     }
                   2144:     else
                   2145:     {
                   2146:         rs_write_int(savef,0);
                   2147:         rs_write_int(savef,0);
                   2148:     }
                   2149:
                   2150:     rs_write_ulongs(savef, t->t_flags, 16);
                   2151:     rs_write_object_list(savef, t->t_pack);
                   2152:     rs_write_stats(savef, &t->t_stats);
                   2153:     rs_write_stats(savef, &t->maxstats);
                   2154:
                   2155:     return(WRITESTAT);
                   2156: }
                   2157:
                   2158: int
                   2159: rs_read_thing(FILE *inf, struct thing *t)
                   2160: {
                   2161:     int listid = 0, index = -1;
                   2162:
                   2163:     if (read_error || format_error)
                   2164:         return(READSTAT);
                   2165:
                   2166:     rs_read_marker(inf, RSID_THING);
                   2167:
                   2168:     rs_read_int(inf, &index);
                   2169:
                   2170:     if (index == 0)
                   2171:         return(READSTAT);
                   2172:
                   2173:     rs_read_boolean(inf, &t->t_turn);
                   2174:     rs_read_boolean(inf, &t->t_wasshot);
                   2175:     rs_read_char(inf, &t->t_type);
                   2176:     rs_read_char(inf, &t->t_disguise);
                   2177:     rs_read_char(inf, &t->t_oldch);
                   2178:     rs_read_short(inf, &t->t_ctype);
                   2179:     rs_read_short(inf, &t->t_index);
                   2180:     rs_read_short(inf, &t->t_no_move);
                   2181:     rs_read_short(inf, &t->t_quiet);
                   2182:     rs_read_door_reference(inf,&t->t_doorgoal);
                   2183:     rs_read_coord(inf, &t->t_pos);
                   2184:     rs_read_coord(inf, &t->t_oldpos);
                   2185:
                   2186:     /*
                   2187:        t_dest can be (listid,index):
                   2188:            0,0: NULL
                   2189:             0,1: location of hero
                   2190:             1,i: location of a thing (monster)
                   2191:             2,i: location of an object
                   2192:             3,i: location of gold in a room
                   2193:
                   2194:        We need to remember what we are chasing rather than
                   2195:         the current location of what we are chasing.
                   2196:     */
                   2197:
                   2198:     rs_read_int(inf, &listid);
                   2199:     rs_read_int(inf, &index);
                   2200:     t->t_reserved = -1;
                   2201:
                   2202:     if (listid == 0) /* hero or NULL */
                   2203:     {
                   2204:        if (index == 1)
                   2205:            t->t_dest = &hero;
                   2206:         else
                   2207:            t->t_dest = NULL;
                   2208:     }
                   2209:     else if (listid == 1) /* monster/thing */
                   2210:     {
                   2211:        t->t_dest     = NULL;
                   2212:         t->t_reserved = index;
                   2213:     }
                   2214:     else if (listid == 2) /* object */
                   2215:     {
                   2216:        struct object *obj;
                   2217:
                   2218:         obj = get_list_item(lvl_obj, index);
                   2219:
                   2220:         if (obj != NULL)
                   2221:         {
                   2222:             t->t_dest = &obj->o_pos;
                   2223:         }
                   2224:     }
                   2225:     else
                   2226:        t->t_dest = NULL;
                   2227:
                   2228:     rs_read_ulongs(inf, t->t_flags, 16);
                   2229:     rs_read_object_list(inf, &t->t_pack);
                   2230:     rs_read_stats(inf, &t->t_stats);
                   2231:     rs_read_stats(inf, &t->maxstats);
                   2232:
                   2233:     return(READSTAT);
                   2234: }
                   2235:
                   2236: void
                   2237: rs_fix_thing(struct thing *t)
                   2238: {
                   2239:     struct thing *tp;
                   2240:
                   2241:     if (t->t_reserved < 0)
                   2242:         return;
                   2243:
                   2244:     tp = get_list_item(mlist,t->t_reserved);
                   2245:
                   2246:     if (tp != NULL)
                   2247:     {
                   2248:         t->t_dest = &tp->t_pos;
                   2249:     }
                   2250: }
                   2251:
                   2252: int
                   2253: rs_write_thing_list(FILE *savef, struct linked_list *l)
                   2254: {
                   2255:     int cnt = 0;
                   2256:
                   2257:     if (write_error)
                   2258:         return(WRITESTAT);
                   2259:
                   2260:     rs_write_marker(savef, RSID_MONSTERLIST);
                   2261:
                   2262:     cnt = list_size(l);
                   2263:
                   2264:     rs_write_int(savef, cnt);
                   2265:
                   2266:     if (cnt < 1)
                   2267:         return(WRITESTAT);
                   2268:
                   2269:     while (l != NULL) {
                   2270:         rs_write_thing(savef, (struct thing *)l->l_data);
                   2271:         l = l->l_next;
                   2272:     }
                   2273:
                   2274:     return(WRITESTAT);
                   2275: }
                   2276:
                   2277: int
                   2278: rs_read_thing_list(FILE *inf, struct linked_list **list)
                   2279: {
                   2280:     int i, cnt;
                   2281:     struct linked_list *l = NULL, *previous = NULL, *head = NULL;
                   2282:
                   2283:     if (read_error || format_error)
                   2284:         return(READSTAT);
                   2285:
                   2286:     rs_read_marker(inf, RSID_MONSTERLIST);
                   2287:
                   2288:     rs_read_int(inf, &cnt);
                   2289:
                   2290:     for (i = 0; i < cnt; i++)
                   2291:     {
                   2292:         l = new_item(sizeof(struct thing));
                   2293:
                   2294:         l->l_prev = previous;
                   2295:
                   2296:         if (previous != NULL)
                   2297:             previous->l_next = l;
                   2298:
                   2299:         rs_read_thing(inf,THINGPTR(l));
                   2300:
                   2301:         if (previous == NULL)
                   2302:             head = l;
                   2303:
                   2304:         previous = l;
                   2305:     }
                   2306:
                   2307:     if (l != NULL)
                   2308:         l->l_next = NULL;
                   2309:
                   2310:     *list = head;
                   2311:
                   2312:     return(READSTAT);
                   2313: }
                   2314:
                   2315: void
                   2316: rs_fix_thing_list(struct linked_list *list)
                   2317: {
                   2318:     struct linked_list *item;
                   2319:
                   2320:     for(item = list; item != NULL; item = item->l_next)
                   2321:         rs_fix_thing(THINGPTR(item));
                   2322: }
                   2323:
                   2324: int
                   2325: rs_save_file(FILE *savef)
                   2326: {
                   2327:     int i;
                   2328:
                   2329:     if (write_error)
                   2330:         return(WRITESTAT);
                   2331:
                   2332:     rs_write_object_list(savef, lvl_obj);
                   2333:     rs_write_thing(savef, &player);
                   2334:     rs_write_thing_list(savef, mlist);
                   2335:     rs_write_thing_list(savef, tlist);
                   2336:     rs_write_thing_list(savef, monst_dead);
                   2337:
                   2338:     rs_write_traps(savef, traps, MAXTRAPS);
                   2339:     rs_write_rooms(savef, rooms, MAXROOMS);
                   2340:     rs_write_room_reference(savef, oldrp);
                   2341:
                   2342:     rs_write_object_reference(savef, player.t_pack, cur_armor);
                   2343:
                   2344:     for(i = 0; i < NUM_FINGERS; i++)
                   2345:         rs_write_object_reference(savef, player.t_pack, cur_ring[i]);
                   2346:
                   2347:     for(i = 0; i < NUM_MM; i++)
                   2348:         rs_write_object_reference(savef, player.t_pack, cur_misc[i]);
                   2349:
                   2350:     rs_write_ints(savef, cur_relic, MAXRELIC);
                   2351:
                   2352:     rs_write_object_reference(savef, player.t_pack, cur_weapon);
                   2353:
                   2354:     rs_write_int(savef, char_type);
                   2355:     rs_write_int(savef, foodlev);
                   2356:     rs_write_int(savef, ntraps);
                   2357:     rs_write_int(savef, trader);
                   2358:     rs_write_int(savef, curprice);
                   2359:     rs_write_int(savef, no_move);
                   2360:     rs_write_int(savef, seed);
                   2361:     rs_write_int(savef, dnum);
                   2362:     rs_write_int(savef, max_level);
                   2363:     rs_write_int(savef, cur_max);
                   2364:     rs_write_int(savef, lost_dext);
                   2365:     rs_write_int(savef, no_command);
                   2366:     rs_write_int(savef, level);
                   2367:     rs_write_int(savef, purse);
                   2368:     rs_write_int(savef, inpack);
                   2369:     rs_write_int(savef, total);
                   2370:     rs_write_int(savef, no_food);
                   2371:     rs_write_int(savef, foods_this_level);
                   2372:     rs_write_int(savef, count);
                   2373:     rs_write_int(savef, food_left);
                   2374:     rs_write_int(savef, group);
                   2375:     rs_write_int(savef, hungry_state);
                   2376:     rs_write_int(savef, infest_dam);
                   2377:     rs_write_int(savef, lost_str);
                   2378:     rs_write_int(savef, lastscore);
                   2379:     rs_write_int(savef, hold_count);
                   2380:     rs_write_int(savef, trap_tries);
                   2381:     rs_write_int(savef, pray_time);
                   2382:     rs_write_int(savef, spell_power);
                   2383:     rs_write_int(savef, turns);
                   2384:     rs_write_int(savef, quest_item);
                   2385:     rs_write_char(savef, nfloors);
                   2386:     rs_write(savef, curpurch, LINELEN*2);
                   2387:     rs_write_char(savef, PLAYER);
                   2388:     rs_write_char(savef, take);
                   2389:     rs_write(savef, prbuf, LINELEN);
                   2390:     rs_write_char(savef, runch);
                   2391:     rs_write(savef, whoami, LINELEN);
                   2392:     rs_write(savef, fruit, LINELEN);
                   2393:     rs_write_scrolls(savef);
                   2394:     rs_write_potions(savef);
                   2395:     rs_write_rings(savef);
                   2396:     rs_write_sticks(savef);
                   2397:     for(i = 0; i < MAXMM; i++)
                   2398:         rs_write_string(savef, m_guess[i]);
                   2399:     rs_write_window(savef, cw);
                   2400:     rs_write_window(savef, mw);
                   2401:     rs_write_window(savef, stdscr);
                   2402:     rs_write_boolean(savef, pool_teleport);
                   2403:     rs_write_boolean(savef, inwhgt);
                   2404:     rs_write_boolean(savef, after);
                   2405:     rs_write_boolean(savef, waswizard);
                   2406:     rs_write_booleans(savef, m_know, MAXMM);
                   2407:     rs_write_boolean(savef, playing);
                   2408:     rs_write_boolean(savef, running);
                   2409:     rs_write_boolean(savef, wizard);
                   2410:     rs_write_boolean(savef, notify);
                   2411:     rs_write_boolean(savef, fight_flush);
                   2412:     rs_write_boolean(savef, terse);
                   2413:     rs_write_boolean(savef, auto_pickup);
                   2414:     rs_write_boolean(savef, door_stop);
                   2415:     rs_write_boolean(savef, jump);
                   2416:     rs_write_boolean(savef, slow_invent);
                   2417:     rs_write_boolean(savef, firstmove);
                   2418:     rs_write_boolean(savef, askme);
                   2419:     rs_write_boolean(savef, in_shell);
                   2420:     rs_write_boolean(savef, daytime);
                   2421:     rs_write_coord(savef, delta);
                   2422:     rs_write_levtype(savef, levtype);
                   2423:
                   2424:     rs_write_monsters(savef, monsters, NUMMONST+1);
                   2425:
                   2426:     rs_write_magic_items(savef, things, NUMTHINGS);
                   2427:     rs_write_magic_items(savef, s_magic, MAXSCROLLS);
                   2428:     rs_write_magic_items(savef, p_magic, MAXPOTIONS);
                   2429:     rs_write_magic_items(savef, r_magic, MAXRINGS);
                   2430:     rs_write_magic_items(savef, ws_magic, MAXSTICKS);
                   2431:     rs_write_magic_items(savef, m_magic, MAXMM);
                   2432:
                   2433:
                   2434:     rs_write_coord(savef, ch_ret);
                   2435:     rs_write_int(savef, demoncnt);
                   2436:     rs_write_int(savef, fusecnt);
                   2437:     rs_write_daemons(savef, d_list, MAXDAEMONS);
                   2438:     rs_write_daemons(savef, f_list, MAXFUSES);
                   2439:     rs_write_int(savef, between);
                   2440:
                   2441:     fflush(savef);
                   2442:
                   2443:     return(WRITESTAT);
                   2444: }
                   2445:
                   2446: int
                   2447: rs_restore_file(FILE *inf)
                   2448: {
                   2449:     int i;
                   2450:
                   2451:     if (read_error || format_error)
                   2452:         return(READSTAT);
                   2453:
                   2454:     rs_read_object_list(inf, &lvl_obj);
                   2455:     rs_read_thing(inf, &player);
                   2456:     rs_read_thing_list(inf, &mlist);
                   2457:     rs_read_thing_list(inf, &tlist);
                   2458:     rs_read_thing_list(inf, &monst_dead);
                   2459:
                   2460:     rs_fix_thing(&player);
                   2461:     rs_fix_thing_list(mlist);
                   2462:     rs_fix_thing_list(tlist);
                   2463:     rs_fix_thing_list(monst_dead);
                   2464:
                   2465:     rs_read_traps(inf, traps, MAXTRAPS);
                   2466:     rs_read_rooms(inf, rooms, MAXROOMS);
                   2467:     rs_read_room_reference(inf, &oldrp);
                   2468:
                   2469:     rs_read_object_reference(inf, player.t_pack, &cur_armor);
                   2470:
                   2471:     for(i = 0; i < NUM_FINGERS; i++)
                   2472:         rs_read_object_reference(inf, player.t_pack, &cur_ring[i]);
                   2473:
                   2474:     for(i = 0; i < NUM_MM; i++)
                   2475:         rs_read_object_reference(inf, player.t_pack, &cur_misc[i]);
                   2476:
                   2477:     rs_read_ints(inf, cur_relic, MAXRELIC);
                   2478:
                   2479:     rs_read_object_reference(inf, player.t_pack, &cur_weapon);
                   2480:
                   2481:     rs_read_int(inf, &char_type);
                   2482:     rs_read_int(inf, &foodlev);
                   2483:     rs_read_int(inf, &ntraps);
                   2484:     rs_read_int(inf, &trader);
                   2485:     rs_read_int(inf, &curprice);
                   2486:     rs_read_int(inf, &no_move);
                   2487:     rs_read_int(inf, &seed);
                   2488:     rs_read_int(inf, &dnum);
                   2489:     rs_read_int(inf, &max_level);
                   2490:     rs_read_int(inf, &cur_max);
                   2491:     rs_read_int(inf, &lost_dext);
                   2492:     rs_read_int(inf, &no_command);
                   2493:     rs_read_int(inf, &level);
                   2494:     rs_read_int(inf, &purse);
                   2495:     rs_read_int(inf, &inpack);
                   2496:     rs_read_int(inf, &total);
                   2497:     rs_read_int(inf, &no_food);
                   2498:     rs_read_int(inf, &foods_this_level);
                   2499:     rs_read_int(inf, &count);
                   2500:     rs_read_int(inf, &food_left);
                   2501:     rs_read_int(inf, &group);
                   2502:     rs_read_int(inf, &hungry_state);
                   2503:     rs_read_int(inf, &infest_dam);
                   2504:     rs_read_int(inf, &lost_str);
                   2505:     rs_read_int(inf, &lastscore);
                   2506:     rs_read_int(inf, &hold_count);
                   2507:     rs_read_int(inf, &trap_tries);
                   2508:     rs_read_int(inf, &pray_time);
                   2509:     rs_read_int(inf, &spell_power);
                   2510:     rs_read_int(inf, &turns);
                   2511:     rs_read_int(inf, &quest_item);
                   2512:     rs_read_char(inf, &nfloors);
                   2513:     rs_read(inf, &curpurch, LINELEN*2);
                   2514:     rs_read_char(inf, &PLAYER);
                   2515:     rs_read_char(inf, &take);
                   2516:     rs_read(inf, &prbuf, LINELEN);
                   2517:     rs_read_char(inf, &runch);
                   2518:     rs_read(inf, &whoami, LINELEN);
                   2519:     rs_read(inf, &fruit, LINELEN);
                   2520:     rs_read_scrolls(inf);
                   2521:     rs_read_potions(inf);
                   2522:     rs_read_rings(inf);
                   2523:     rs_read_sticks(inf);
                   2524:     for(i = 0; i < MAXMM; i++)
                   2525:         rs_read_new_string(inf, &m_guess[i]);
                   2526:     rs_read_window(inf, cw);
                   2527:     rs_read_window(inf, mw);
                   2528:     rs_read_window(inf, stdscr);
                   2529:     rs_read_boolean(inf, &pool_teleport);
                   2530:     rs_read_boolean(inf, &inwhgt);
                   2531:     rs_read_boolean(inf, &after);
                   2532:     rs_read_boolean(inf, &waswizard);
                   2533:     rs_read_booleans(inf, m_know, MAXMM);
                   2534:     rs_read_boolean(inf, &playing);
                   2535:     rs_read_boolean(inf, &running);
                   2536:     rs_read_boolean(inf, &wizard);
                   2537:     rs_read_boolean(inf, &notify);
                   2538:     rs_read_boolean(inf, &fight_flush);
                   2539:     rs_read_boolean(inf, &terse);
                   2540:     rs_read_boolean(inf, &auto_pickup);
                   2541:     rs_read_boolean(inf, &door_stop);
                   2542:     rs_read_boolean(inf, &jump);
                   2543:     rs_read_boolean(inf, &slow_invent);
                   2544:     rs_read_boolean(inf, &firstmove);
                   2545:     rs_read_boolean(inf, &askme);
                   2546:     rs_read_boolean(inf, &in_shell);
                   2547:     rs_read_boolean(inf, &daytime);
                   2548:     rs_read_coord(inf, &delta);
                   2549:     rs_read_levtype(inf, &levtype);
                   2550:
                   2551:     rs_read_monsters(inf, monsters, NUMMONST+1);
                   2552:
                   2553:     rs_read_magic_items(inf, things, NUMTHINGS);
                   2554:     rs_read_magic_items(inf, s_magic, MAXSCROLLS);
                   2555:     rs_read_magic_items(inf, p_magic, MAXPOTIONS);
                   2556:     rs_read_magic_items(inf, r_magic, MAXRINGS);
                   2557:     rs_read_magic_items(inf, ws_magic, MAXSTICKS);
                   2558:     rs_read_magic_items(inf, m_magic, MAXMM);
                   2559:
                   2560:     rs_read_coord(inf, &ch_ret);
                   2561:     rs_read_int(inf, &demoncnt);
                   2562:     rs_read_int(inf, &fusecnt);
                   2563:     rs_read_daemons(inf, d_list, MAXDAEMONS);
                   2564:     rs_read_daemons(inf, f_list, MAXFUSES);
                   2565:     rs_read_int(inf, &between);
                   2566:
                   2567:     return(READSTAT);
                   2568: }

CVSweb