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

Annotation of early-roguelike/arogue7/state.c, Revision 1.1.1.1

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

CVSweb