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

Annotation of early-roguelike/rogue4/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:
                      6:     Redistribution and use in source and binary forms, with or without
                      7:     modification, are permitted provided that the following conditions
                      8:     are met:
                      9:     1. Redistributions of source code must retain the above copyright
                     10:        notice, this list of conditions and the following disclaimer.
                     11:     2. Redistributions in binary form must reproduce the above copyright
                     12:        notice, this list of conditions and the following disclaimer in the
                     13:        documentation and/or other materials provided with the distribution.
                     14:     3. Neither the name(s) of the author(s) nor the names of other contributors
                     15:        may be used to endorse or promote products derived from this software
                     16:        without specific prior written permission.
                     17:
                     18:     THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTORS ``AS IS'' AND
                     19:     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     20:     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     21:     ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTORS BE LIABLE
                     22:     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     23:     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     24:     OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     25:     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     26:     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     27:     OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     28:     SUCH DAMAGE.
                     29: */
                     30:
                     31: /************************************************************************/
                     32: /* Save State Code                                                      */
                     33: /************************************************************************/
                     34:
                     35: #define RSID_STATS        0xABCD0001
                     36: #define RSID_THING        0xABCD0002
                     37: #define RSID_THING_NULL   0xDEAD0002
                     38: #define RSID_OBJECT       0xABCD0003
                     39: #define RSID_MAGICITEMS   0xABCD0004
                     40: #define RSID_KNOWS        0xABCD0005
                     41: #define RSID_GUESSES      0xABCD0006
                     42: #define RSID_OBJECTLIST   0xABCD0007
                     43: #define RSID_BAGOBJECT    0xABCD0008
                     44: #define RSID_MONSTERLIST  0xABCD0009
                     45: #define RSID_MONSTERSTATS 0xABCD000A
                     46: #define RSID_MONSTERS     0xABCD000B
                     47: #define RSID_TRAP         0xABCD000C
                     48: #define RSID_WINDOW       0xABCD000D
                     49: #define RSID_DAEMONS      0xABCD000E
                     50: #define RSID_IWEAPS       0xABCD000F
                     51: #define RSID_IARMOR       0xABCD0010
                     52: #define RSID_SPELLS       0xABCD0011
                     53: #define RSID_ILIST        0xABCD0012
                     54: #define RSID_HLIST        0xABCD0013
                     55: #define RSID_DEATHTYPE    0xABCD0014
                     56: #define RSID_CTYPES       0XABCD0015
                     57: #define RSID_COORDLIST    0XABCD0016
                     58: #define RSID_ROOMS        0XABCD0017
                     59:
                     60:
                     61:
                     62: #include <curses.h>
                     63: #include <sys/stat.h>
                     64: #include <stdio.h>
                     65: #include <stdlib.h>
                     66: #include <assert.h>
                     67: #include <string.h>
                     68: #include "rogue.h"
                     69:
                     70: #define READSTAT ((format_error == 0) && (read_error == 0))
                     71: #define WRITESTAT (write_error == 0)
                     72:
                     73: int rs_write_int(FILE *savef, int c);
                     74: int rs_read_int(FILE *inf, int *i);
                     75:
                     76: int read_error   = FALSE;
                     77: int write_error  = FALSE;
                     78: int format_error = FALSE;
                     79: int end_of_file  = FALSE;
                     80: int big_endian   = 0;
                     81:
                     82: void *
                     83: get_list_item(THING *l, int i)
                     84: {
                     85:     int count = 0;
                     86:
                     87:     while(l != NULL)
                     88:     {
                     89:         if (count == i)
                     90:             return(l);
                     91:
                     92:         l = l->l_next;
                     93:
                     94:         count++;
                     95:     }
                     96:
                     97:     return(NULL);
                     98: }
                     99:
                    100: int
                    101: find_list_ptr(THING *l, void *ptr)
                    102: {
                    103:     int count = 0;
                    104:
                    105:     while(l != NULL)
                    106:     {
                    107:         if (l == ptr)
                    108:             return(count);
                    109:
                    110:         l = l->l_next;
                    111:         count++;
                    112:     }
                    113:
                    114:     return(-1);
                    115: }
                    116:
                    117: int
                    118: list_size(THING *l)
                    119: {
                    120:     int count = 0;
                    121:
                    122:     while(l != NULL)
                    123:     {
                    124:         if (l == NULL)
                    125:             return(count);
                    126:
                    127:         count++;
                    128:
                    129:         l = l->l_next;
                    130:     }
                    131:
                    132:     return(count);
                    133: }
                    134:
                    135: int
                    136: rs_write(FILE *savef, void *ptr, int size)
                    137: {
                    138:     if (!write_error)
                    139:         encwrite(ptr,size,savef);
                    140:
                    141:     if (0)
                    142:         write_error = TRUE;
                    143:
                    144:     assert(write_error == 0);
                    145:
                    146:     return(WRITESTAT);
                    147: }
                    148:
                    149: int
                    150: rs_write_char(FILE *savef, char c)
                    151: {
                    152:     rs_write(savef, &c, 1);
                    153:
                    154:     return(WRITESTAT);
                    155: }
                    156:
                    157: int
                    158: rs_write_boolean(FILE *savef, bool c)
                    159: {
                    160:     unsigned char buf = (c == 0) ? 0 : 1;
                    161:
                    162:     rs_write(savef, &buf, 1);
                    163:
                    164:     return(WRITESTAT);
                    165: }
                    166:
                    167: int
                    168: rs_write_booleans(FILE *savef, bool *c, int count)
                    169: {
                    170:     int n = 0;
                    171:
                    172:     rs_write_int(savef,count);
                    173:
                    174:     for(n = 0; n < count; n++)
                    175:         rs_write_boolean(savef,c[n]);
                    176:
                    177:     return(WRITESTAT);
                    178: }
                    179:
                    180: int
                    181: rs_write_shint(FILE *savef, shint c)
                    182: {
                    183:     unsigned char buf = c;
                    184:
                    185:     rs_write(savef, &buf, 1);
                    186:
                    187:     return(WRITESTAT);
                    188: }
                    189:
                    190: int
                    191: rs_write_short(FILE *savef, short c)
                    192: {
                    193:     unsigned char bytes[2];
                    194:     unsigned char *buf = (unsigned char *) &c;
                    195:
                    196:     if (big_endian)
                    197:     {
                    198:         bytes[1] = buf[0];
                    199:         bytes[0] = buf[1];
                    200:         buf = bytes;
                    201:     }
                    202:
                    203:     rs_write(savef, buf, 2);
                    204:
                    205:     return(WRITESTAT);
                    206: }
                    207:
                    208: int
                    209: rs_write_shorts(FILE *savef, short *c, int count)
                    210: {
                    211:     int n = 0;
                    212:
                    213:     rs_write_int(savef,count);
                    214:
                    215:     for(n = 0; n < count; n++)
                    216:         rs_write_short(savef,c[n]);
                    217:
                    218:     return(WRITESTAT);
                    219: }
                    220:
                    221: int
                    222: rs_write_ushort(FILE *savef, unsigned short c)
                    223: {
                    224:     unsigned char bytes[2];
                    225:     unsigned char *buf = (unsigned char *) &c;
                    226:
                    227:     if (big_endian)
                    228:     {
                    229:         bytes[1] = buf[0];
                    230:         bytes[0] = buf[1];
                    231:         buf = bytes;
                    232:     }
                    233:
                    234:     rs_write(savef, buf, 2);
                    235:
                    236:     return(WRITESTAT);
                    237: }
                    238:
                    239: int
                    240: rs_write_int(FILE *savef, int c)
                    241: {
                    242:     unsigned char bytes[4];
                    243:     unsigned char *buf = (unsigned char *) &c;
                    244:
                    245:     if (big_endian)
                    246:     {
                    247:         bytes[3] = buf[0];
                    248:         bytes[2] = buf[1];
                    249:         bytes[1] = buf[2];
                    250:         bytes[0] = buf[3];
                    251:         buf = bytes;
                    252:     }
                    253:
                    254:     rs_write(savef, buf, 4);
                    255:
                    256:     return(WRITESTAT);
                    257: }
                    258:
                    259: int
                    260: rs_write_ints(FILE *savef, int *c, int count)
                    261: {
                    262:     int n = 0;
                    263:
                    264:     rs_write_int(savef,count);
                    265:
                    266:     for(n = 0; n < count; n++)
                    267:         rs_write_int(savef,c[n]);
                    268:
                    269:     return(WRITESTAT);
                    270: }
                    271:
                    272: int
                    273: rs_write_uint(FILE *savef, unsigned int c)
                    274: {
                    275:     unsigned char bytes[4];
                    276:     unsigned char *buf = (unsigned char *) &c;
                    277:
                    278:     if (big_endian)
                    279:     {
                    280:         bytes[3] = buf[0];
                    281:         bytes[2] = buf[1];
                    282:         bytes[1] = buf[2];
                    283:         bytes[0] = buf[3];
                    284:         buf = bytes;
                    285:     }
                    286:
                    287:     rs_write(savef, buf, 4);
                    288:
                    289:     return(WRITESTAT);
                    290: }
                    291:
                    292: int
                    293: rs_write_long(FILE *savef, long c)
                    294: {
                    295:     int c2;
                    296:     unsigned char bytes[4];
                    297:     unsigned char *buf = (unsigned char *)&c;
                    298:
                    299:     if (sizeof(long) == 8)
                    300:     {
                    301:         c2 = c;
                    302:         buf = (unsigned char *) &c2;
                    303:     }
                    304:
                    305:     if (big_endian)
                    306:     {
                    307:         bytes[3] = buf[0];
                    308:         bytes[2] = buf[1];
                    309:         bytes[1] = buf[2];
                    310:         bytes[0] = buf[3];
                    311:         buf = bytes;
                    312:     }
                    313:
                    314:     rs_write(savef, buf, 4);
                    315:
                    316:     return(WRITESTAT);
                    317: }
                    318:
                    319: int
                    320: rs_write_longs(FILE *savef, long *c, int count)
                    321: {
                    322:     int n = 0;
                    323:
                    324:     rs_write_int(savef,count);
                    325:
                    326:     for(n = 0; n < count; n++)
                    327:         rs_write_long(savef,c[n]);
                    328:
                    329:     return(WRITESTAT);
                    330: }
                    331:
                    332: int
                    333: rs_write_ulong(FILE *savef, unsigned long c)
                    334: {
                    335:     unsigned int c2;
                    336:     unsigned char bytes[4];
                    337:     unsigned char *buf = (unsigned char *)&c;
                    338:
                    339:     if ( (sizeof(long) == 8) && (sizeof(int) == 4) )
                    340:     {
                    341:         c2 = c;
                    342:         buf = (unsigned char *) &c2;
                    343:     }
                    344:
                    345:     if (big_endian)
                    346:     {
                    347:         bytes[3] = buf[0];
                    348:         bytes[2] = buf[1];
                    349:         bytes[1] = buf[2];
                    350:         bytes[0] = buf[3];
                    351:         buf = bytes;
                    352:     }
                    353:
                    354:     rs_write(savef, buf, 4);
                    355:
                    356:     return(WRITESTAT);
                    357: }
                    358:
                    359: int
                    360: rs_write_ulongs(FILE *savef, unsigned long *c, int count)
                    361: {
                    362:     int n = 0;
                    363:
                    364:     rs_write_int(savef,count);
                    365:
                    366:     for(n = 0; n < count; n++)
                    367:         rs_write_ulong(savef,c[n]);
                    368:
                    369:     return(WRITESTAT);
                    370: }
                    371:
                    372: int
                    373: rs_write_string(FILE *savef, char *s)
                    374: {
                    375:     int len = 0;
                    376:
                    377:     len = (s == NULL) ? 0 : strlen(s) + 1;
                    378:
                    379:     rs_write_int(savef, len);
                    380:     rs_write(savef, s, len);
                    381:
                    382:     return(WRITESTAT);
                    383: }
                    384:
                    385: int
                    386: rs_write_string_index(FILE *savef, const char *master[], int max,
                    387:                       const char *str)
                    388: {
                    389:     int i;
                    390:
                    391:     for(i = 0; i < max; i++)
                    392:     {
                    393:         if (str == master[i])
                    394:         {
                    395:             rs_write_int(savef,i);
                    396:             return(WRITESTAT);
                    397:         }
                    398:     }
                    399:
                    400:     rs_write_int(savef,-1);
                    401:
                    402:     return(WRITESTAT);
                    403: }
                    404:
                    405: int
                    406: rs_write_strings(FILE *savef, char *s[], int count)
                    407: {
                    408:     int len = 0;
                    409:     int n = 0;
                    410:
                    411:     rs_write_int(savef,count);
                    412:
                    413:     for(n = 0; n < count; n++)
                    414:     {
                    415:         len = (s[n] == NULL) ? 0L : strlen(s[n]) + 1;
                    416:         rs_write_int(savef, len);
                    417:         rs_write(savef, s[n], len);
                    418:     }
                    419:
                    420:     return(WRITESTAT);
                    421: }
                    422:
                    423: int
                    424: rs_read(FILE *inf, void *ptr, int size)
                    425: {
                    426:     int actual;
                    427:
                    428:     end_of_file = FALSE;
                    429:
                    430:     if (!read_error && !format_error)
                    431:     {
                    432:         actual = encread(ptr, size, inf);
                    433:
                    434:         if ((actual == 0) && (size != 0))
                    435:            end_of_file = TRUE;
                    436:     }
                    437:
                    438:     if (read_error)
                    439:     {
                    440:         printf("read error has occurred. restore short-circuited.\n");
                    441:         abort();
                    442:     }
                    443:
                    444:     if (format_error)
                    445:     {
                    446:         printf("game format invalid. restore short-circuited.\n");
                    447:         abort();
                    448:     }
                    449:
                    450:     return(READSTAT);
                    451: }
                    452:
                    453: int
                    454: rs_read_char(FILE *inf, char *c)
                    455: {
                    456:     rs_read(inf, c, 1);
                    457:
                    458:     return(READSTAT);
                    459: }
                    460: int
                    461: rs_read_uchar(FILE *inf, unsigned char *c)
                    462: {
                    463:     rs_read(inf, c, 1);
                    464:
                    465:     return(READSTAT);
                    466: }
                    467:
                    468: int
                    469: rs_read_boolean(FILE *inf, bool *i)
                    470: {
                    471:     unsigned char buf;
                    472:
                    473:     rs_read(inf, &buf, 1);
                    474:
                    475:     *i = (bool) buf;
                    476:
                    477:     return(READSTAT);
                    478: }
                    479:
                    480: int
                    481: rs_read_booleans(FILE *inf, bool *i, int count)
                    482: {
                    483:     int n = 0, value = 0;
                    484:
                    485:     if (rs_read_int(inf,&value) != 0)
                    486:     {
                    487:         if (value != count)
                    488:         {
                    489:             printf("Invalid booleans block. %d != requested %d\n",value,count);
                    490:             format_error = TRUE;
                    491:         }
                    492:         else
                    493:         {
                    494:             for(n = 0; n < value; n++)
                    495:                 rs_read_boolean(inf, &i[n]);
                    496:         }
                    497:     }
                    498:
                    499:     return(READSTAT);
                    500: }
                    501:
                    502: int
                    503: rs_read_shint(FILE *inf, shint *i)
                    504: {
                    505:     unsigned char buf;
                    506:
                    507:     rs_read(inf, &buf, 1);
                    508:
                    509:     *i = (shint) buf;
                    510:
                    511:     return(READSTAT);
                    512: }
                    513:
                    514: int
                    515: rs_read_short(FILE *inf, short *i)
                    516: {
                    517:     unsigned char bytes[2];
                    518:     short  input;
                    519:     unsigned char *buf = (unsigned char *)&input;
                    520:
                    521:     rs_read(inf, &input, 2);
                    522:
                    523:     if (big_endian)
                    524:     {
                    525:         bytes[1] = buf[0];
                    526:         bytes[0] = buf[1];
                    527:         buf = bytes;
                    528:     }
                    529:
                    530:     *i = *((short *) buf);
                    531:
                    532:     return(READSTAT);
                    533: }
                    534:
                    535: int
                    536: rs_read_shorts(FILE *inf, short *i, int count)
                    537: {
                    538:     int n = 0, value = 0;
                    539:
                    540:     if (rs_read_int(inf,&value) != 0)
                    541:     {
                    542:         if (value != count)
                    543:             format_error = TRUE;
                    544:         else
                    545:         {
                    546:             for(n = 0; n < value; n++)
                    547:                 rs_read_short(inf, &i[n]);
                    548:         }
                    549:     }
                    550:
                    551:     return(READSTAT);
                    552: }
                    553:
                    554: int
                    555: rs_read_ushort(FILE *inf, unsigned short *i)
                    556: {
                    557:     unsigned char bytes[2];
                    558:     unsigned short  input;
                    559:     unsigned char *buf = (unsigned char *)&input;
                    560:
                    561:     rs_read(inf, &input, 2);
                    562:
                    563:     if (big_endian)
                    564:     {
                    565:         bytes[1] = buf[0];
                    566:         bytes[0] = buf[1];
                    567:         buf = bytes;
                    568:     }
                    569:
                    570:     *i = *((unsigned short *) buf);
                    571:
                    572:     return(READSTAT);
                    573: }
                    574:
                    575: int
                    576: rs_read_int(FILE *inf, int *i)
                    577: {
                    578:     unsigned char bytes[4];
                    579:     int  input;
                    580:     unsigned char *buf = (unsigned char *)&input;
                    581:
                    582:     rs_read(inf, &input, 4);
                    583:
                    584:     if (big_endian)
                    585:     {
                    586:         bytes[3] = buf[0];
                    587:         bytes[2] = buf[1];
                    588:         bytes[1] = buf[2];
                    589:         bytes[0] = buf[3];
                    590:         buf = bytes;
                    591:     }
                    592:
                    593:     *i = *((int *) buf);
                    594:
                    595:     return(READSTAT);
                    596: }
                    597:
                    598: int
                    599: rs_read_ints(FILE *inf, int *i, int count)
                    600: {
                    601:     int n = 0, value = 0;
                    602:
                    603:     if (rs_read_int(inf,&value) != 0)
                    604:     {
                    605:         if (value != count)
                    606:             format_error = TRUE;
                    607:         else
                    608:         {
                    609:             for(n = 0; n < value; n++)
                    610:                 rs_read_int(inf, &i[n]);
                    611:         }
                    612:     }
                    613:
                    614:     return(READSTAT);
                    615: }
                    616:
                    617: int
                    618: rs_read_uint(FILE *inf, unsigned int *i)
                    619: {
                    620:     unsigned char bytes[4];
                    621:     int  input;
                    622:     unsigned char *buf = (unsigned char *)&input;
                    623:
                    624:     rs_read(inf, &input, 4);
                    625:
                    626:     if (big_endian)
                    627:     {
                    628:         bytes[3] = buf[0];
                    629:         bytes[2] = buf[1];
                    630:         bytes[1] = buf[2];
                    631:         bytes[0] = buf[3];
                    632:         buf = bytes;
                    633:     }
                    634:
                    635:     *i = *((unsigned int *) buf);
                    636:
                    637:     return(READSTAT);
                    638: }
                    639:
                    640: int
                    641: rs_read_long(FILE *inf, long *i)
                    642: {
                    643:     unsigned char bytes[4];
                    644:     long input;
                    645:     unsigned char *buf = (unsigned char *) &input;
                    646:
                    647:     rs_read(inf, &input, 4);
                    648:
                    649:     if (big_endian)
                    650:     {
                    651:         bytes[3] = buf[0];
                    652:         bytes[2] = buf[1];
                    653:         bytes[1] = buf[2];
                    654:         bytes[0] = buf[3];
                    655:         buf = bytes;
                    656:     }
                    657:
                    658:     *i = *((long *) buf);
                    659:
                    660:     return(READSTAT);
                    661: }
                    662:
                    663: int
                    664: rs_read_longs(FILE *inf, long *i, int count)
                    665: {
                    666:     int n = 0, value = 0;
                    667:
                    668:     if (rs_read_int(inf,&value) != 0)
                    669:     {
                    670:         if (value != count)
                    671:             format_error = TRUE;
                    672:         else
                    673:         {
                    674:             for(n = 0; n < value; n++)
                    675:                 rs_read_long(inf, &i[n]);
                    676:         }
                    677:     }
                    678:
                    679:     return(READSTAT);
                    680: }
                    681:
                    682: int
                    683: rs_read_ulong(FILE *inf, unsigned long *i)
                    684: {
                    685:     unsigned char bytes[4];
                    686:     unsigned long input;
                    687:     unsigned char *buf = (unsigned char *) &input;
                    688:
                    689:     rs_read(inf, &input, 4);
                    690:
                    691:     if (big_endian)
                    692:     {
                    693:         bytes[3] = buf[0];
                    694:         bytes[2] = buf[1];
                    695:         bytes[1] = buf[2];
                    696:         bytes[0] = buf[3];
                    697:         buf = bytes;
                    698:     }
                    699:
                    700:     *i = *((unsigned long *) buf);
                    701:
                    702:     return(READSTAT);
                    703: }
                    704:
                    705: int
                    706: rs_read_ulongs(FILE *inf, unsigned long *i, int count)
                    707: {
                    708:     int n = 0, value = 0;
                    709:
                    710:     if (rs_read_int(inf,&value) != 0)
                    711:     {
                    712:         if (value != count)
                    713:             format_error = TRUE;
                    714:         else
                    715:         {
                    716:             for(n = 0; n < value; n++)
                    717:                 rs_read_ulong(inf, &i[n]);
                    718:         }
                    719:     }
                    720:
                    721:     return(READSTAT);
                    722: }
                    723:
                    724: int
                    725: rs_read_string(FILE *inf, char *s, int max)
                    726: {
                    727:     int len = 0;
                    728:
                    729:     if (rs_read_int(inf, &len) != FALSE)
                    730:     {
                    731:         if (len > max)
                    732:         {
                    733:             printf("String too long to restore. %d > %d\n",len,max);
                    734:             printf("Sorry, invalid save game format\n");
                    735:             format_error = TRUE;
                    736:         }
                    737:
                    738:         rs_read(inf, s, len);
                    739:     }
                    740:
                    741:     return(READSTAT);
                    742: }
                    743:
                    744: int
                    745: rs_read_new_string(FILE *inf, char **s)
                    746: {
                    747:     int len=0;
                    748:     char *buf=0;
                    749:
                    750:     if (rs_read_int(inf, &len) != 0)
                    751:     {
                    752:         if (len == 0)
                    753:             *s = NULL;
                    754:         else
                    755:         {
                    756:             buf = malloc(len);
                    757:
                    758:             if (buf == NULL)
                    759:                 read_error = TRUE;
                    760:             else
                    761:             {
                    762:                 rs_read(inf, buf, len);
                    763:                 *s = buf;
                    764:             }
                    765:         }
                    766:     }
                    767:
                    768:     return(READSTAT);
                    769: }
                    770:
                    771: int
                    772: rs_read_string_index(FILE *inf, const char *master[], int maxindex,
                    773:                      const char **str)
                    774: {
                    775:     int i;
                    776:
                    777:     if (rs_read_int(inf,&i) != 0)
                    778:     {
                    779:         if (i > maxindex)
                    780:         {
                    781:             printf("String index is out of range. %d > %d\n", i, maxindex);
                    782:             printf("Sorry, invalid save game format\n");
                    783:             format_error = TRUE;
                    784:         }
                    785:         else if (i >= 0)
                    786:             *str = master[i];
                    787:         else
                    788:             *str = NULL;
                    789:     }
                    790:
                    791:     return(READSTAT);
                    792: }
                    793:
                    794: int
                    795: rs_read_strings(FILE *inf, char **s, int count, int max)
                    796: {
                    797:     int n     = 0;
                    798:     int value = 0;
                    799:
                    800:     if (rs_read_int(inf,&value) != 0)
                    801:     {
                    802:         if (value != count)
                    803:         {
                    804:             printf("Incorrect number of strings in block. %d > %d.",
                    805:                 value, count);
                    806:             printf("Sorry, invalid save game format");
                    807:             format_error = TRUE;
                    808:         }
                    809:         else
                    810:         {
                    811:             for(n = 0; n < value; n++)
                    812:             {
                    813:                 rs_read_string(inf, s[n], max);
                    814:             }
                    815:         }
                    816:     }
                    817:
                    818:     return(READSTAT);
                    819: }
                    820:
                    821: int
                    822: rs_read_new_strings(FILE *inf, char **s, int count)
                    823: {
                    824:     int len   = 0;
                    825:     int n     = 0;
                    826:     int value = 0;
                    827:
                    828:     if (rs_read_int(inf,&value) != 0)
                    829:     {
                    830:         if (value != count)
                    831:         {
                    832:             printf("Incorrect number of new strings in block. %d > %d.",
                    833:                 value,count);abort();
                    834:             printf("Sorry, invalid save game format");
                    835:             format_error = TRUE;
                    836:         }
                    837:         else
                    838:             for(n=0; n<value; n++)
                    839:             {
                    840:                 rs_read_int(inf, &len);
                    841:
                    842:                 if (len == 0)
                    843:                     s[n]=0;
                    844:                 else
                    845:                 {
                    846:                     s[n] = malloc(len);
                    847:                     rs_read(inf,s[n],len);
                    848:                 }
                    849:             }
                    850:     }
                    851:
                    852:     return(READSTAT);
                    853: }
                    854:
                    855: /******************************************************************************/
                    856:
                    857: int
                    858: rs_write_str_t(FILE *savef, str_t st)
                    859: {
                    860:     rs_write_uint(savef,st);
                    861:
                    862:     return(WRITESTAT);
                    863: }
                    864:
                    865: int
                    866: rs_read_str_t(FILE *inf, str_t *st)
                    867: {
                    868:     rs_read_uint(inf,st);
                    869:
                    870:     return(READSTAT);
                    871: }
                    872:
                    873: int
                    874: rs_write_coord(FILE *savef, coord c)
                    875: {
                    876:     rs_write_shint(savef, c.x);
                    877:     rs_write_shint(savef, c.y);
                    878:
                    879:     return(WRITESTAT);
                    880: }
                    881:
                    882: int
                    883: rs_read_coord(FILE *inf, coord *c)
                    884: {
                    885:     rs_read_shint(inf,&c->x);
                    886:     rs_read_shint(inf,&c->y);
                    887:
                    888:     return(READSTAT);
                    889: }
                    890:
                    891: int
                    892: rs_write_window(FILE *savef, WINDOW *win)
                    893: {
                    894:     int row,col,height,width;
                    895:     width = getmaxx(win);
                    896:     height = getmaxy(win);
                    897:
                    898:     rs_write_int(savef,RSID_WINDOW);
                    899:     rs_write_int(savef,height);
                    900:     rs_write_int(savef,width);
                    901:
                    902:     for(row=0;row<height;row++)
                    903:         for(col=0;col<width;col++)
                    904:             rs_write_int(savef, mvwinch(win,row,col));
                    905:
                    906:     return(WRITESTAT);
                    907: }
                    908:
                    909: int
                    910: rs_read_window(FILE *inf, WINDOW *win)
                    911: {
                    912:     int id,row,col,maxlines,maxcols,value,width,height;
                    913:
                    914:     width = getmaxx(win);
                    915:     height = getmaxy(win);
                    916:
                    917:     if (rs_read_int(inf, &id) != 0)
                    918:     {
                    919:         if (id != RSID_WINDOW)
                    920:         {
                    921:             printf("Invalid head id. %x != %x(RSID_WINDOW)\n", id, RSID_WINDOW);
                    922:             printf("Sorry, invalid save game format");
                    923:             format_error = TRUE;
                    924:         }
                    925:         else
                    926:         {
                    927:             rs_read_int(inf,&maxlines);
                    928:             rs_read_int(inf,&maxcols);
                    929:             if (maxlines > height)
                    930:                abort();
                    931:             if (maxcols > width)
                    932:                abort();
                    933:
                    934:             for(row=0;row<maxlines;row++)
                    935:                 for(col=0;col<maxcols;col++)
                    936:                 {
                    937:                     rs_read_int(inf, &value);
                    938:                     mvwaddch(win,row,col,value);
                    939:                 }
                    940:         }
                    941:     }
                    942:
                    943:     return(READSTAT);
                    944: }
                    945:
                    946: int
                    947: rs_write_daemons(FILE *savef, struct delayed_action *d_list, int count)
                    948: {
                    949:     int i = 0;
                    950:     int func = 0;
                    951:
                    952:     rs_write_int(savef, RSID_DAEMONS);
                    953:     rs_write_int(savef, count);
                    954:
                    955:     for(i = 0; i < count; i++)
                    956:     {
                    957:         if (d_list[i].d_func == rollwand)
                    958:             func = 1;
                    959:         else if (d_list[i].d_func == doctor)
                    960:             func = 2;
                    961:         else if (d_list[i].d_func == stomach)
                    962:             func = 3;
                    963:         else if (d_list[i].d_func == runners)
                    964:             func = 4;
                    965:         else if (d_list[i].d_func == swander)
                    966:             func = 5;
                    967:         else if (d_list[i].d_func == nohaste)
                    968:             func = 6;
                    969:         else if (d_list[i].d_func == unconfuse)
                    970:             func = 7;
                    971:         else if (d_list[i].d_func == unsee)
                    972:             func = 8;
                    973:         else if (d_list[i].d_func == sight)
                    974:             func = 9;
                    975:         else if (d_list[i].d_func == turn_see_off)
                    976:             func = 10;
                    977:         else
                    978:             func = 0;
                    979:
                    980:         rs_write_int(savef, d_list[i].d_type);
                    981:         rs_write_int(savef, func);
                    982:         rs_write_int(savef, d_list[i].d_arg);
                    983:         rs_write_int(savef, d_list[i].d_time);
                    984:     }
                    985:
                    986:     return(WRITESTAT);
                    987: }
                    988:
                    989: int
                    990: rs_read_daemons(FILE *inf, struct delayed_action *d_list, int count)
                    991: {
                    992:     int i = 0;
                    993:     int func = 0;
                    994:     int value = 0;
                    995:     int id = 0;
                    996:
                    997:     if (d_list == NULL)
                    998:         printf("HELP THERE ARE NO DAEMONS\n");
                    999:
                   1000:     if (rs_read_int(inf, &id) != 0)
                   1001:     {
                   1002:         if (id != RSID_DAEMONS)
                   1003:         {
                   1004:             printf("Invalid id. %x != %x(RSID_DAEMONS)\n", id, RSID_DAEMONS);
                   1005:             printf("Sorry, invalid save game format");
                   1006:             format_error = TRUE;
                   1007:         }
                   1008:         else if (rs_read_int(inf, &value) != 0)
                   1009:         {
                   1010:             if (value > count)
                   1011:             {
                   1012:                 printf("Incorrect number of daemons in block. %d > %d.",
                   1013:                     value, count);
                   1014:                 printf("Sorry, invalid save game format");
                   1015:                 format_error = TRUE;
                   1016:             }
                   1017:             else
                   1018:             {
                   1019:                 for(i=0; i < value; i++)
                   1020:                 {
                   1021:                     func = 0;
                   1022:                     rs_read_int(inf, &d_list[i].d_type);
                   1023:                     rs_read_int(inf, &func);
                   1024:                     rs_read_int(inf, &d_list[i].d_arg);
                   1025:                     rs_read_int(inf, &d_list[i].d_time);
                   1026:
                   1027:                     switch(func)
                   1028:                     {
                   1029:                         case 1: d_list[i].d_func = rollwand;
                   1030:                                 break;
                   1031:                         case 2: d_list[i].d_func = doctor;
                   1032:                                 break;
                   1033:                         case 3: d_list[i].d_func = stomach;
                   1034:                                 break;
                   1035:                         case 4: d_list[i].d_func = runners;
                   1036:                                 break;
                   1037:                         case 5: d_list[i].d_func = swander;
                   1038:                                 break;
                   1039:                         case 6: d_list[i].d_func = nohaste;
                   1040:                                 break;
                   1041:                         case 7: d_list[i].d_func = unconfuse;
                   1042:                                 break;
                   1043:                         case 8: d_list[i].d_func = unsee;
                   1044:                                 break;
                   1045:                         case 9: d_list[i].d_func = sight;
                   1046:                                 break;
                   1047:                         case 10: d_list[i].d_func = turn_see_off;
                   1048:                                 break;
                   1049:                         default:d_list[i].d_func = NULL;
                   1050:                                 break;
                   1051:                     }
                   1052:
                   1053:                     if (d_list[i].d_func == NULL)
                   1054:                     {
                   1055:                         d_list[i].d_type = 0;
                   1056:                         d_list[i].d_arg = 0;
                   1057:                         d_list[i].d_time = 0;
                   1058:                     }
                   1059:                 }
                   1060:             }
                   1061:         }
                   1062:     }
                   1063:
                   1064:     return(READSTAT);
                   1065: }
                   1066:
                   1067: int
                   1068: rs_write_magic_items(FILE *savef, struct magic_item *i, int count)
                   1069: {
                   1070:     int n;
                   1071:
                   1072:     rs_write_int(savef, RSID_MAGICITEMS);
                   1073:     rs_write_int(savef, count);
                   1074:
                   1075:     for(n = 0; n < count; n++)
                   1076:     {
                   1077:         /* mi_name is constant, defined at compile time in all cases */
                   1078:         rs_write_shint(savef,i[n].mi_prob);
                   1079:         rs_write_short(savef,i[n].mi_worth);
                   1080:     }
                   1081:
                   1082:     return(WRITESTAT);
                   1083: }
                   1084:
                   1085: int
                   1086: rs_read_magic_items(FILE *inf, struct magic_item *mi, int count)
                   1087: {
                   1088:     int id;
                   1089:     int n;
                   1090:     int value;
                   1091:
                   1092:     if (rs_read_int(inf, &id) != 0)
                   1093:     {
                   1094:         if (id != RSID_MAGICITEMS)
                   1095:         {
                   1096:             printf("Invalid id. %x != %x(RSID_MAGICITEMS)\n",
                   1097:                 id, RSID_MAGICITEMS);
                   1098:             printf("Sorry, invalid save game format");
                   1099:             format_error = TRUE;
                   1100:         }
                   1101:         else if (rs_read_int(inf, &value) != 0)
                   1102:         {
                   1103:             if (value > count)
                   1104:             {
                   1105:                 printf("Incorrect number of magic items in block. %d > %d.",
                   1106:                     value, count);
                   1107:                 printf("Sorry, invalid save game format");
                   1108:                 format_error = TRUE;
                   1109:             }
                   1110:             else
                   1111:             {
                   1112:                 for(n = 0; n < value; n++)
                   1113:                 {
                   1114:                     /* mi_name is constant, defined at compile time in all cases */
                   1115:                     rs_read_shint(inf,&mi[n].mi_prob);
                   1116:                     rs_read_short(inf,&mi[n].mi_worth);
                   1117:                 }
                   1118:             }
                   1119:         }
                   1120:     }
                   1121:
                   1122:     return(READSTAT);
                   1123: }
                   1124:
                   1125: int
                   1126: rs_write_room(FILE *savef, struct room *r)
                   1127: {
                   1128:     rs_write_coord(savef, r->r_pos);
                   1129:     rs_write_coord(savef, r->r_max);
                   1130:     rs_write_coord(savef, r->r_gold);
                   1131:     rs_write_int(savef,   r->r_goldval);
                   1132:     rs_write_short(savef, r->r_flags);
                   1133:     rs_write_shint(savef, r->r_nexits);
                   1134:     rs_write_coord(savef, r->r_exit[0]);
                   1135:     rs_write_coord(savef, r->r_exit[1]);
                   1136:     rs_write_coord(savef, r->r_exit[2]);
                   1137:     rs_write_coord(savef, r->r_exit[3]);
                   1138:     rs_write_coord(savef, r->r_exit[4]);
                   1139:     rs_write_coord(savef, r->r_exit[5]);
                   1140:     rs_write_coord(savef, r->r_exit[6]);
                   1141:     rs_write_coord(savef, r->r_exit[7]);
                   1142:     rs_write_coord(savef, r->r_exit[8]);
                   1143:     rs_write_coord(savef, r->r_exit[9]);
                   1144:     rs_write_coord(savef, r->r_exit[10]);
                   1145:     rs_write_coord(savef, r->r_exit[11]);
                   1146:
                   1147:     return(WRITESTAT);
                   1148: }
                   1149:
                   1150: int
                   1151: rs_write_rooms(FILE *savef, struct room r[], int count)
                   1152: {
                   1153:     int n = 0;
                   1154:
                   1155:     rs_write_int(savef, count);
                   1156:
                   1157:     for(n=0; n<count; n++)
                   1158:         rs_write_room(savef, &r[n]);
                   1159:
                   1160:     return(WRITESTAT);
                   1161: }
                   1162:
                   1163: int
                   1164: rs_read_room(FILE *inf, struct room *r)
                   1165: {
                   1166:     rs_read_coord(inf,&r->r_pos);
                   1167:     rs_read_coord(inf,&r->r_max);
                   1168:     rs_read_coord(inf,&r->r_gold);
                   1169:     rs_read_int(inf,&r->r_goldval);
                   1170:     rs_read_short(inf,&r->r_flags);
                   1171:     rs_read_shint(inf,&r->r_nexits);
                   1172:     rs_read_coord(inf,&r->r_exit[0]);
                   1173:     rs_read_coord(inf,&r->r_exit[1]);
                   1174:     rs_read_coord(inf,&r->r_exit[2]);
                   1175:     rs_read_coord(inf,&r->r_exit[3]);
                   1176:     rs_read_coord(inf,&r->r_exit[4]);
                   1177:     rs_read_coord(inf,&r->r_exit[5]);
                   1178:     rs_read_coord(inf,&r->r_exit[6]);
                   1179:     rs_read_coord(inf,&r->r_exit[7]);
                   1180:     rs_read_coord(inf,&r->r_exit[8]);
                   1181:     rs_read_coord(inf,&r->r_exit[9]);
                   1182:     rs_read_coord(inf,&r->r_exit[10]);
                   1183:     rs_read_coord(inf,&r->r_exit[11]);
                   1184:
                   1185:     return(READSTAT);
                   1186: }
                   1187:
                   1188: int
                   1189: rs_read_rooms(FILE *inf, struct room *r, int count)
                   1190: {
                   1191:     int value = 0, n = 0;
                   1192:
                   1193:     if (rs_read_int(inf,&value) != 0)
                   1194:     {
                   1195:         if (value > count)
                   1196:         {
                   1197:             printf("Incorrect number of rooms in block. %d > %d.",
                   1198:                 value,count);
                   1199:             printf("Sorry, invalid save game format");
                   1200:             format_error = TRUE;
                   1201:         }
                   1202:         else
                   1203:             for(n = 0; n < value; n++)
                   1204:                 rs_read_room(inf,&r[n]);
                   1205:     }
                   1206:
                   1207:     return(READSTAT);
                   1208: }
                   1209:
                   1210: int
                   1211: rs_write_room_reference(FILE *savef, struct room *rp)
                   1212: {
                   1213:     int i, room = -1;
                   1214:
                   1215:     for (i = 0; i < MAXROOMS; i++)
                   1216:         if (&rooms[i] == rp)
                   1217:             room = i;
                   1218:
                   1219:     rs_write_int(savef, room);
                   1220:
                   1221:     return(WRITESTAT);
                   1222: }
                   1223:
                   1224: int
                   1225: rs_read_room_reference(FILE *inf, struct room **rp)
                   1226: {
                   1227:     int i;
                   1228:
                   1229:     rs_read_int(inf, &i);
                   1230:
                   1231:     if (i >= 0 && i < MAXROOMS)
                   1232:         *rp = &rooms[i];
                   1233:     else
                   1234:         *rp = NULL;
                   1235:
                   1236:     return(READSTAT);
                   1237: }
                   1238:
                   1239: int
                   1240: rs_write_stats(FILE *savef, struct stats *s)
                   1241: {
                   1242:     rs_write_int(savef, RSID_STATS);
                   1243:     rs_write_str_t(savef, s->s_str);
                   1244:     rs_write_long(savef, s->s_exp);
                   1245:     rs_write_shint(savef, s->s_lvl);
                   1246:     rs_write_shint(savef, s->s_arm);
                   1247:     rs_write_short(savef, s->s_hpt);
                   1248:     rs_write(savef, s->s_dmg, sizeof(s->s_dmg));
                   1249:     rs_write_shint(savef,s->s_maxhp);
                   1250:
                   1251:     return(WRITESTAT);
                   1252: }
                   1253:
                   1254: int
                   1255: rs_read_stats(FILE *inf, struct stats *s)
                   1256: {
                   1257:     int id;
                   1258:
                   1259:     rs_read_int(inf, &id);
                   1260:
                   1261:     rs_read_str_t(inf,&s->s_str);
                   1262:     rs_read_long(inf,&s->s_exp);
                   1263:     rs_read_shint(inf,&s->s_lvl);
                   1264:     rs_read_shint(inf,&s->s_arm);
                   1265:     rs_read_short(inf,&s->s_hpt);
                   1266:     rs_read(inf,s->s_dmg,sizeof(s->s_dmg));
                   1267:     rs_read_shint(inf,&s->s_maxhp);
                   1268:
                   1269:     return(READSTAT);
                   1270: }
                   1271:
                   1272: int
                   1273: rs_write_object(FILE *savef, THING *o)
                   1274: {
                   1275:     rs_write_int(savef, RSID_OBJECT);
                   1276:     rs_write_shint(savef, o->_o._o_type);
                   1277:     rs_write_coord(savef, o->_o._o_pos);
                   1278:     rs_write_char(savef, o->_o._o_launch);
                   1279:     rs_write(savef, o->_o._o_damage, sizeof(o->_o._o_damage));
                   1280:     rs_write(savef, o->_o._o_hurldmg, sizeof(o->_o._o_hurldmg));
                   1281:     rs_write_shint(savef, o->_o._o_count);
                   1282:     rs_write_shint(savef, o->_o._o_which);
                   1283:     rs_write_shint(savef, o->_o._o_hplus);
                   1284:     rs_write_shint(savef, o->_o._o_dplus);
                   1285:     rs_write_short(savef, o->_o._o_ac);
                   1286:     rs_write_short(savef, o->_o._o_flags);
                   1287:     rs_write_shint(savef, o->_o._o_group);
                   1288:
                   1289:     return(WRITESTAT);
                   1290: }
                   1291:
                   1292: int
                   1293: rs_read_object(FILE *inf, THING *o)
                   1294: {
                   1295:     int id;
                   1296:
                   1297:     if (rs_read_int(inf, &id) != 0)
                   1298:     {
                   1299:         if (id != RSID_OBJECT)
                   1300:         {
                   1301:             printf("Invalid id. %x != %x(RSID_OBJECT)\n",
                   1302:                 id,RSID_OBJECT);
                   1303:             printf("Sorry, invalid save game format");
                   1304:             format_error = TRUE;
                   1305:         }
                   1306:         else
                   1307:         {
                   1308:             rs_read_shint(inf, &o->_o._o_type);
                   1309:             rs_read_coord(inf, &o->_o._o_pos);
                   1310:             rs_read_char(inf, &o->_o._o_launch);
                   1311:             rs_read(inf, &o->_o._o_damage, sizeof(o->_o._o_damage));
                   1312:             rs_read(inf, &o->_o._o_hurldmg, sizeof(o->_o._o_hurldmg));
                   1313:             rs_read_shint(inf, &o->_o._o_count);
                   1314:             rs_read_shint(inf, &o->_o._o_which);
                   1315:             rs_read_shint(inf, &o->_o._o_hplus);
                   1316:             rs_read_shint(inf, &o->_o._o_dplus);
                   1317:             rs_read_short(inf, &o->_o._o_ac);
                   1318:             rs_read_short(inf, &o->_o._o_flags);
                   1319:             rs_read_shint(inf, &o->_o._o_group);
                   1320:         }
                   1321:     }
                   1322:
                   1323:     return(READSTAT);
                   1324: }
                   1325:
                   1326: int
                   1327: rs_write_object_list(FILE *savef, THING *l)
                   1328: {
                   1329:     rs_write_int(savef, RSID_OBJECTLIST);
                   1330:     rs_write_int(savef, list_size(l));
                   1331:
                   1332:     while (l != NULL)
                   1333:     {
                   1334:         rs_write_object(savef, l);
                   1335:         l = l->l_next;
                   1336:     }
                   1337:
                   1338:     return(WRITESTAT);
                   1339: }
                   1340:
                   1341: int
                   1342: rs_read_object_list(FILE *inf, THING **list)
                   1343: {
                   1344:     int id;
                   1345:     int i, cnt;
                   1346:     THING *l = NULL, *previous = NULL, *head = NULL;
                   1347:
                   1348:     if (rs_read_int(inf,&id) != 0)
                   1349:     {
                   1350:         if (rs_read_int(inf,&cnt) != 0)
                   1351:         {
                   1352:             for (i = 0; i < cnt; i++)
                   1353:             {
                   1354:                 l = new_item();
                   1355:                 memset(l,0,sizeof(THING));
                   1356:                 l->l_prev = previous;
                   1357:                 if (previous != NULL)
                   1358:                     previous->l_next = l;
                   1359:                 rs_read_object(inf,l);
                   1360:                 if (previous == NULL)
                   1361:                     head = l;
                   1362:                 previous = l;
                   1363:             }
                   1364:
                   1365:             if (l != NULL)
                   1366:                 l->l_next = NULL;
                   1367:
                   1368:             *list = head;
                   1369:         }
                   1370:         else
                   1371:             format_error = TRUE;
                   1372:     }
                   1373:     else
                   1374:         format_error = TRUE;
                   1375:
                   1376:
                   1377:     return(READSTAT);
                   1378: }
                   1379:
                   1380: int
                   1381: rs_write_object_reference(FILE *savef, THING *list, THING *item)
                   1382: {
                   1383:     int i;
                   1384:
                   1385:     i = find_list_ptr(list, item);
                   1386:
                   1387:     rs_write_int(savef, i);
                   1388:
                   1389:     return(WRITESTAT);
                   1390: }
                   1391:
                   1392: int
                   1393: rs_read_object_reference(FILE *inf, THING *list, THING **item)
                   1394: {
                   1395:     int i;
                   1396:
                   1397:     rs_read_int(inf, &i);
                   1398:
                   1399:     *item = get_list_item(list,i);
                   1400:
                   1401:     return(READSTAT);
                   1402: }
                   1403:
                   1404: int
                   1405: find_thing_coord(THING *monlist, coord *c)
                   1406: {
                   1407:     THING *mitem;
                   1408:     THING *tp;
                   1409:     int i = 0;
                   1410:
                   1411:     for(mitem = monlist; mitem != NULL; mitem = mitem->l_next)
                   1412:     {
                   1413:         tp = mitem;
                   1414:
                   1415:         if (c == &tp->t_pos)
                   1416:             return(i);
                   1417:
                   1418:         i++;
                   1419:     }
                   1420:
                   1421:     return(-1);
                   1422: }
                   1423:
                   1424: int
                   1425: find_room_coord(struct room *rmlist, coord *c, int n)
                   1426: {
                   1427:     int i = 0;
                   1428:
                   1429:     for(i = 0; i < n; i++)
                   1430:         if(&rmlist[i].r_gold == c)
                   1431:             return(i);
                   1432:
                   1433:     return(-1);
                   1434: }
                   1435:
                   1436: int
                   1437: find_object_coord(THING *objlist, coord *c)
                   1438: {
                   1439:     THING *oitem;
                   1440:     THING *obj;
                   1441:     int i = 0;
                   1442:
                   1443:     for(oitem = objlist; oitem != NULL; oitem = oitem->l_next)
                   1444:     {
                   1445:         obj = oitem;
                   1446:
                   1447:         if (c == &obj->o_pos)
                   1448:             return(i);
                   1449:
                   1450:         i++;
                   1451:     }
                   1452:
                   1453:     return(-1);
                   1454: }
                   1455:
                   1456: int
                   1457: rs_write_thing(FILE *savef, THING *t)
                   1458: {
                   1459:     int i = -1;
                   1460:
                   1461:     if (t == NULL)
                   1462:     {
                   1463:         rs_write_int(savef, RSID_THING_NULL);
                   1464:         return(WRITESTAT);
                   1465:     }
                   1466:
                   1467:     rs_write_int(savef, RSID_THING);
                   1468:
                   1469:     rs_write_coord(savef, t->_t._t_pos);
                   1470:     rs_write_boolean(savef, t->_t._t_turn);
                   1471:     rs_write_char(savef, t->_t._t_type);
                   1472:     rs_write_char(savef, t->_t._t_disguise);
                   1473:     rs_write_char(savef, t->_t._t_oldch);
                   1474:
                   1475:     /*
                   1476:         t_dest can be:
                   1477:         0,0: NULL
                   1478:         0,1: location of hero
                   1479:         1,i: location of a thing (monster)
                   1480:         2,i: location of an object
                   1481:         3,i: location of gold in a room
                   1482:
                   1483:         We need to remember what we are chasing rather than
                   1484:         the current location of what we are chasing.
                   1485:     */
                   1486:
                   1487:     if (t->t_dest == &hero)
                   1488:     {
                   1489:         rs_write_int(savef,0);
                   1490:         rs_write_int(savef,1);
                   1491:     }
                   1492:     else if (t->t_dest != NULL)
                   1493:     {
                   1494:         i = find_thing_coord(mlist, t->t_dest);
                   1495:
                   1496:         if (i >=0 )
                   1497:         {
                   1498:             rs_write_int(savef,1);
                   1499:             rs_write_int(savef,i);
                   1500:         }
                   1501:         else
                   1502:         {
                   1503:             i = find_object_coord(lvl_obj, t->t_dest);
                   1504:
                   1505:             if (i >= 0)
                   1506:             {
                   1507:                 rs_write_int(savef,2);
                   1508:                 rs_write_int(savef,i);
                   1509:             }
                   1510:             else
                   1511:             {
                   1512:                 i = find_room_coord(rooms, t->t_dest, MAXROOMS);
                   1513:
                   1514:                 if (i >= 0)
                   1515:                 {
                   1516:                     rs_write_int(savef,3);
                   1517:                     rs_write_int(savef,i);
                   1518:                 }
                   1519:                 else
                   1520:                 {
                   1521:                     rs_write_int(savef, 0);
                   1522:                     rs_write_int(savef,1); /* chase the hero anyway */
                   1523:                 }
                   1524:             }
                   1525:         }
                   1526:     }
                   1527:     else
                   1528:     {
                   1529:         rs_write_int(savef,0);
                   1530:         rs_write_int(savef,0);
                   1531:     }
                   1532:
                   1533:     rs_write_short(savef, t->_t._t_flags);
                   1534:     rs_write_stats(savef, &t->_t._t_stats);
                   1535:     rs_write_room_reference(savef, t->_t._t_room);
                   1536:     rs_write_object_list(savef, t->_t._t_pack);
                   1537:
                   1538:     return(WRITESTAT);
                   1539: }
                   1540:
                   1541: void
                   1542: rs_fix_thing(THING *t)
                   1543: {
                   1544:     THING *item;
                   1545:     THING *tp;
                   1546:
                   1547:     if (t->t_reserved < 0)
                   1548:         return;
                   1549:
                   1550:     item = get_list_item(mlist,t->t_reserved);
                   1551:
                   1552:     if (item != NULL)
                   1553:     {
                   1554:         tp = item;
                   1555:         t->t_dest = &tp->t_pos;
                   1556:     }
                   1557: }
                   1558:
                   1559: void
                   1560: rs_fix_thing_list(THING *list)
                   1561: {
                   1562:     THING *item;
                   1563:
                   1564:     for(item = list; item != NULL; item = item->l_next)
                   1565:         rs_fix_thing(item);
                   1566: }
                   1567:
                   1568: int
                   1569: rs_read_thing(FILE *inf, THING *t)
                   1570: {
                   1571:     int id;
                   1572:     int listid = 0, index = -1;
                   1573:     THING *item;
                   1574:
                   1575:     if (rs_read_int(inf, &id) != 0)
                   1576:     {
                   1577:         if (id != RSID_THING)
                   1578:             format_error = TRUE;
                   1579:         else
                   1580:         {
                   1581:             rs_read_coord(inf,&t->_t._t_pos);
                   1582:             rs_read_boolean(inf,&t->_t._t_turn);
                   1583:             rs_read_uchar(inf,&t->_t._t_type);
                   1584:             rs_read_char(inf,&t->_t._t_disguise);
                   1585:             rs_read_char(inf,&t->_t._t_oldch);
                   1586:
                   1587:             /*
                   1588:                 t_dest can be (listid,index):
                   1589:                 0,0: NULL
                   1590:                 0,1: location of hero
                   1591:                 1,i: location of a thing (monster)
                   1592:                 2,i: location of an object
                   1593:                 3,i: location of gold in a room
                   1594:
                   1595:                 We need to remember what we are chasing rather than
                   1596:                 the current location of what we are chasing.
                   1597:             */
                   1598:
                   1599:             rs_read_int(inf, &listid);
                   1600:             rs_read_int(inf, &index);
                   1601:             t->_t._t_reserved = -1;
                   1602:
                   1603:             if (listid == 0) /* hero or NULL */
                   1604:             {
                   1605:                 if (index == 1)
                   1606:                     t->_t._t_dest = &hero;
                   1607:                 else
                   1608:                     t->_t._t_dest = NULL;
                   1609:             }
                   1610:             else if (listid == 1) /* monster/thing */
                   1611:             {
                   1612:                 t->_t._t_dest     = NULL;
                   1613:                 t->_t._t_reserved = index;
                   1614:             }
                   1615:             else if (listid == 2) /* object */
                   1616:             {
                   1617:                 THING *obj;
                   1618:
                   1619:                 item = get_list_item(lvl_obj, index);
                   1620:
                   1621:                 if (item != NULL)
                   1622:                 {
                   1623:                     obj = item;
                   1624:                     t->_t._t_dest = &obj->o_pos;
                   1625:                 }
                   1626:             }
                   1627:             else if (listid == 3) /* gold */
                   1628:             {
                   1629:                 t->_t._t_dest = &rooms[index].r_gold;
                   1630:             }
                   1631:             else
                   1632:                 t->_t._t_dest = NULL;
                   1633:
                   1634:             rs_read_short(inf,&t->_t._t_flags);
                   1635:             rs_read_stats(inf,&t->_t._t_stats);
                   1636:             rs_read_room_reference(inf, &t->_t._t_room);
                   1637:             rs_read_object_list(inf,&t->_t._t_pack);
                   1638:         }
                   1639:     }
                   1640:     else
                   1641:         format_error = TRUE;
                   1642:
                   1643:     return(READSTAT);
                   1644: }
                   1645:
                   1646: int
                   1647: rs_write_thing_list(FILE *savef, THING *l)
                   1648: {
                   1649:     int cnt = 0;
                   1650:
                   1651:     rs_write_int(savef, RSID_MONSTERLIST);
                   1652:
                   1653:     cnt = list_size(l);
                   1654:
                   1655:     rs_write_int(savef, cnt);
                   1656:
                   1657:     if (cnt < 1)
                   1658:         return(WRITESTAT);
                   1659:
                   1660:     while (l != NULL) {
                   1661:         rs_write_thing(savef, l);
                   1662:         l = l->l_next;
                   1663:     }
                   1664:
                   1665:     return(WRITESTAT);
                   1666: }
                   1667:
                   1668: int
                   1669: rs_read_thing_list(FILE *inf, THING **list)
                   1670: {
                   1671:     int id;
                   1672:     int i, cnt;
                   1673:     THING *l = NULL, *previous = NULL, *head = NULL;
                   1674:
                   1675:     if (rs_read_int(inf,&id) != 0)
                   1676:     {
                   1677:         if (id != RSID_MONSTERLIST)
                   1678:         {
                   1679:             printf("Invalid id. %x != %x(RSID_MONSTERLIST)\n",
                   1680:                 id,RSID_MONSTERLIST);
                   1681:             printf("Sorry, invalid save game format");
                   1682:             format_error = TRUE;
                   1683:         }
                   1684:         else if (rs_read_int(inf,&cnt) != 0)
                   1685:         {
                   1686:             for (i = 0; i < cnt; i++)
                   1687:             {
                   1688:                 l = new_item();
                   1689:                 l->l_prev = previous;
                   1690:                 if (previous != NULL)
                   1691:                     previous->l_next = l;
                   1692:                 rs_read_thing(inf,l);
                   1693:                 if (previous == NULL)
                   1694:                     head = l;
                   1695:                 previous = l;
                   1696:             }
                   1697:
                   1698:
                   1699:             if (l != NULL)
                   1700:                 l->l_next = NULL;
                   1701:
                   1702:             *list = head;
                   1703:         }
                   1704:     }
                   1705:     else
                   1706:         format_error = TRUE;
                   1707:
                   1708:     return(READSTAT);
                   1709: }
                   1710:
                   1711: int
                   1712: rs_write_monsters(FILE *savef, struct monster *m, int count)
                   1713: {
                   1714:     int n;
                   1715:
                   1716:     rs_write_int(savef, RSID_MONSTERS);
                   1717:     rs_write_int(savef, count);
                   1718:
                   1719:     for(n=0;n<count;n++)
                   1720:     {
                   1721:         /*
                   1722:         rs_write(savef, m[n].m_name, sizeof(m[n].m_name));
                   1723:         rs_write_char(savef, m[n].m_carry);
                   1724:         rs_write_short(savef, m[n].m_flags);
                   1725:         */
                   1726:         rs_write_stats(savef, &m[n].m_stats);
                   1727:     }
                   1728:
                   1729:     return(WRITESTAT);
                   1730: }
                   1731:
                   1732: int
                   1733: rs_read_monsters(FILE *inf, struct monster *m, int count)
                   1734: {
                   1735:     int id = 0, value = 0, n = 0;
                   1736:
                   1737:     if (rs_read_int(inf, &id) != 0)
                   1738:     {
                   1739:         if (id != RSID_MONSTERS)
                   1740:         {
                   1741:             printf("Invalid id. %x != %x(RSID_MONSTERS)\n",
                   1742:                 id,RSID_MONSTERS);
                   1743:             printf("Sorry, invalid save game format");
                   1744:             format_error = TRUE;
                   1745:         }
                   1746:         else if (rs_read_int(inf, &value) != 0)
                   1747:         {
                   1748:             for(n=0;n<value;n++)
                   1749:             {
                   1750:                 /*
                   1751:                 rs_read(inf,m[n].m_name,sizeof(m[n].m_name));
                   1752:                 rs_read_char(inf, &m[n].m_carry);
                   1753:                 rs_read_short(inf, &m[n].m_flags);
                   1754:                 */
                   1755:                 rs_read_stats(inf, &m[n].m_stats);
                   1756:             }
                   1757:         }
                   1758:         else
                   1759:             format_error = TRUE;
                   1760:     }
                   1761:
                   1762:     return(READSTAT);
                   1763: }
                   1764:
                   1765: int
                   1766: rs_write_scrolls(FILE *savef)
                   1767: {
                   1768:     int i;
                   1769:
                   1770:     for(i = 0; i < MAXSCROLLS; i++)
                   1771:     {
                   1772:         rs_write_string(savef,s_names[i]);
                   1773:         rs_write_boolean(savef,s_know[i]);
                   1774:         rs_write_string(savef,s_guess[i]);
                   1775:     }
                   1776:
                   1777:     return(WRITESTAT);
                   1778: }
                   1779:
                   1780: int
                   1781: rs_read_scrolls(FILE *inf)
                   1782: {
                   1783:     int i;
                   1784:
                   1785:     for(i = 0; i < MAXSCROLLS; i++)
                   1786:     {
                   1787:         rs_read_new_string(inf,&s_names[i]);
                   1788:         rs_read_boolean(inf,&s_know[i]);
                   1789:         rs_read_new_string(inf,&s_guess[i]);
                   1790:     }
                   1791:
                   1792:     return(READSTAT);
                   1793: }
                   1794:
                   1795: int
                   1796: rs_write_potions(FILE *savef)
                   1797: {
                   1798:     int i;
                   1799:
                   1800:     for(i = 0; i < MAXPOTIONS; i++)
                   1801:     {
                   1802:         rs_write_string_index(savef,rainbow,NCOLORS,p_colors[i]);
                   1803:         rs_write_boolean(savef,p_know[i]);
                   1804:         rs_write_string(savef,p_guess[i]);
                   1805:     }
                   1806:
                   1807:     return(WRITESTAT);
                   1808: }
                   1809:
                   1810: int
                   1811: rs_read_potions(FILE *inf)
                   1812: {
                   1813:     int i;
                   1814:
                   1815:     for(i = 0; i < MAXPOTIONS; i++)
                   1816:     {
                   1817:         rs_read_string_index(inf,rainbow,NCOLORS,&p_colors[i]);
                   1818:         rs_read_boolean(inf,&p_know[i]);
                   1819:         rs_read_new_string(inf,&p_guess[i]);
                   1820:     }
                   1821:
                   1822:     return(READSTAT);
                   1823: }
                   1824:
                   1825:
                   1826: int
                   1827: rs_write_rings(FILE *savef)
                   1828: {
                   1829:     int i;
                   1830:     const char *stones_list[NSTONES];
                   1831:
                   1832:     for(i = 0; i < NSTONES; i++)
                   1833:         stones_list[i] = stones[i].st_name;
                   1834:
                   1835:     for(i = 0; i < MAXRINGS; i++)
                   1836:     {
                   1837:         rs_write_string_index(savef,stones_list,NSTONES,r_stones[i]);
                   1838:         rs_write_boolean(savef,r_know[i]);
                   1839:         rs_write_string(savef,r_guess[i]);
                   1840:     }
                   1841:
                   1842:     return(WRITESTAT);
                   1843: }
                   1844:
                   1845: int
                   1846: rs_read_rings(FILE *inf)
                   1847: {
                   1848:     int i;
                   1849:     const char *stones_list[NSTONES];
                   1850:
                   1851:     for(i = 0; i < NSTONES; i++)
                   1852:         stones_list[i] = stones[i].st_name;
                   1853:
                   1854:     for(i = 0; i < MAXRINGS; i++)
                   1855:     {
                   1856:         rs_read_string_index(inf,stones_list,NSTONES,&r_stones[i]);
                   1857:         rs_read_boolean(inf,&r_know[i]);
                   1858:         rs_read_new_string(inf,&r_guess[i]);
                   1859:     }
                   1860:
                   1861:     return(READSTAT);
                   1862: }
                   1863:
                   1864: int
                   1865: rs_write_sticks(FILE *savef)
                   1866: {
                   1867:     int i;
                   1868:
                   1869:     for (i = 0; i < MAXSTICKS; i++)
                   1870:     {
                   1871:         if (strcmp(ws_type[i],"staff") == 0)
                   1872:         {
                   1873:             rs_write_int(savef,0);
                   1874:             rs_write_string_index(savef, wood, NWOOD, ws_made[i]);
                   1875:         }
                   1876:         else
                   1877:         {
                   1878:             rs_write_int(savef,1);
                   1879:             rs_write_string_index(savef, metal, NMETAL, ws_made[i]);
                   1880:         }
                   1881:         rs_write_boolean(savef, ws_know[i]);
                   1882:         rs_write_string(savef, ws_guess[i]);
                   1883:     }
                   1884:
                   1885:     return(WRITESTAT);
                   1886: }
                   1887:
                   1888: int
                   1889: rs_read_sticks(FILE *inf)
                   1890: {
                   1891:     int i = 0, list = 0;
                   1892:
                   1893:     for(i = 0; i < MAXSTICKS; i++)
                   1894:     {
                   1895:         rs_read_int(inf,&list);
                   1896:         if (list == 0)
                   1897:         {
                   1898:             rs_read_string_index(inf,wood,NWOOD,&ws_made[i]);
                   1899:             ws_type[i] = "staff";
                   1900:         }
                   1901:         else
                   1902:         {
                   1903:             rs_read_string_index(inf,metal,NMETAL,&ws_made[i]);
                   1904:             ws_type[i] = "wand";
                   1905:         }
                   1906:         rs_read_boolean(inf, &ws_know[i]);
                   1907:         rs_read_new_string(inf, &ws_guess[i]);
                   1908:     }
                   1909:
                   1910:     return(READSTAT);
                   1911: }
                   1912:
                   1913: /******************************************************************************/
                   1914: int
                   1915: rs_write_thing_reference(FILE *savef, THING *list, THING *item)
                   1916: {
                   1917:     int i;
                   1918:
                   1919:     if (item == NULL)
                   1920:         rs_write_int(savef,-1);
                   1921:     else
                   1922:     {
                   1923:         i = find_list_ptr(list, item);
                   1924:
                   1925:         assert(i >= 0);
                   1926:
                   1927:         rs_write_int(savef, i);
                   1928:     }
                   1929:
                   1930:     return(WRITESTAT);
                   1931: }
                   1932:
                   1933: int
                   1934: rs_read_thing_reference(FILE *inf, THING *list, THING **item)
                   1935: {
                   1936:     int i;
                   1937:
                   1938:     rs_read_int(inf, &i);
                   1939:
                   1940:     if (i == -1)
                   1941:         *item = NULL;
                   1942:     else
                   1943:     {
                   1944:         *item = get_list_item(list,i);
                   1945:
                   1946:         assert(item != NULL);
                   1947:     }
                   1948:
                   1949:     return(READSTAT);
                   1950: }
                   1951:
                   1952: int
                   1953: rs_write_thing_references(FILE *savef, THING *list, THING *items[], int count)
                   1954: {
                   1955:     int i;
                   1956:
                   1957:     for(i = 0; i < count; i++)
                   1958:         rs_write_thing_reference(savef,list,items[i]);
                   1959:
                   1960:     return(WRITESTAT);
                   1961: }
                   1962:
                   1963: int
                   1964: rs_read_thing_references(FILE *inf, THING *list, THING *items[], int count)
                   1965: {
                   1966:     int i;
                   1967:
                   1968:     for(i = 0; i < count; i++)
                   1969:         rs_read_thing_reference(inf,list,&items[i]);
                   1970:
                   1971:     return(WRITESTAT);
                   1972: }
                   1973:
                   1974: int
                   1975: rs_save_file(FILE *savef)
                   1976: {
                   1977:     int endian = 0x01020304;
                   1978:     big_endian = ( *((char *)&endian) == 0x01 );
                   1979:
                   1980:     rs_write_boolean(savef, after);
                   1981:     rs_write_boolean(savef, noscore);
                   1982:     rs_write_boolean(savef, amulet);
                   1983:     rs_write_boolean(savef, askme);
                   1984:     rs_write_boolean(savef, door_stop);
                   1985:     rs_write_boolean(savef, fight_flush);
                   1986:     rs_write_boolean(savef, firstmove);
                   1987:     rs_write_boolean(savef, in_shell);
                   1988:     rs_write_boolean(savef, jump);
                   1989:     rs_write_boolean(savef, passgo);
                   1990:     rs_write_boolean(savef, playing);
                   1991:     rs_write_boolean(savef, running);
                   1992:     rs_write_boolean(savef, save_msg);
                   1993:     rs_write_boolean(savef, slow_invent);
                   1994:     rs_write_boolean(savef, terse);
                   1995: #ifdef WIZARD
                   1996:     rs_write_boolean(savef, wizard);
                   1997: #else
                   1998:     rs_write_boolean(savef, 0);
                   1999: #endif
                   2000:     rs_write_char(savef, take);
                   2001:     rs_write(savef, prbuf, MAXSTR);
                   2002:     rs_write_char(savef, runch);
                   2003:
                   2004:     rs_write_scrolls(savef);
                   2005:     rs_write_potions(savef);
                   2006:     rs_write_rings(savef);
                   2007:     rs_write_sticks(savef);
                   2008:
                   2009:     rs_write_string(savef, release);
                   2010:     rs_write(savef, whoami, MAXSTR);
                   2011:     rs_write(savef, fruit, MAXSTR);
                   2012:
                   2013:     rs_write(savef, _level, MAXLINES*MAXCOLS);
                   2014:     rs_write(savef, _flags, MAXLINES*MAXCOLS);
                   2015:
                   2016:     rs_write_int(savef, max_level);
                   2017:     rs_write_int(savef, ntraps);
                   2018:     rs_write_int(savef, dnum);
                   2019:     rs_write_int(savef, level);
                   2020:     rs_write_int(savef, purse);
                   2021:     rs_write_int(savef, no_move);
                   2022:     rs_write_int(savef, no_command);
                   2023:     rs_write_int(savef, inpack);
                   2024:     rs_write_int(savef, lastscore);
                   2025:     rs_write_int(savef, no_food);
                   2026:     rs_write_int(savef, count);
                   2027:     rs_write_int(savef, fung_hit);
                   2028:     rs_write_int(savef, quiet);
                   2029:     rs_write_int(savef, food_left);
                   2030:     rs_write_int(savef, group);
                   2031:     rs_write_int(savef, hungry_state);
                   2032:
                   2033:     /* rs_write_ints(savef, a_chances, MAXARMORS); *//* constant */
                   2034:     /* rs_write_ints(savef, a_class, MAXARMORS);   *//* constant */
                   2035:
                   2036:     rs_write_long(savef, seed);
                   2037:     rs_write_coord(savef, oldpos);
                   2038:     rs_write_coord(savef, delta);
                   2039:
                   2040:     rs_write_thing(savef, &player);
                   2041:     rs_write_object_reference(savef, player.t_pack, cur_armor);
                   2042:        rs_write_object_reference(savef, player.t_pack, cur_weapon);
                   2043:     rs_write_object_reference(savef, player.t_pack, cur_ring[0]);
                   2044:     rs_write_object_reference(savef, player.t_pack, cur_ring[1]);
                   2045:
                   2046:     rs_write_object_list(savef, lvl_obj);
                   2047:     rs_write_thing_list(savef, mlist);
                   2048:     rs_write_thing_references(savef, mlist, _monst, MAXLINES*MAXCOLS);
                   2049:
                   2050:     rs_write_window(savef, stdscr);
                   2051:     rs_write_stats(savef,&max_stats);
                   2052:
                   2053:     rs_write_rooms(savef, rooms, MAXROOMS);
                   2054:     rs_write_room_reference(savef, oldrp);
                   2055:     rs_write_rooms(savef, passages, MAXPASS);
                   2056:
                   2057:     rs_write_monsters(savef,monsters,26);
                   2058:     rs_write_magic_items(savef, things,   NUMTHINGS);
                   2059:     rs_write_magic_items(savef, s_magic,  MAXSCROLLS);
                   2060:     rs_write_magic_items(savef, p_magic,  MAXPOTIONS);
                   2061:     rs_write_magic_items(savef, r_magic,  MAXRINGS);
                   2062:     rs_write_magic_items(savef, ws_magic, MAXSTICKS);
                   2063:
                   2064:     rs_write_coord(savef, ch_ret);                      /* 5.2-chase.c  */
                   2065:     rs_write_char(savef,countch);                       /* 5.2-command.c*/
                   2066:     rs_write_char(savef,direction);                     /* 5.2-command.c*/
                   2067:     rs_write_char(savef,newcount);                      /* 5.2-command.c*/
                   2068:     rs_write_daemons(savef, &d_list[0], 20);            /* 5.2-daemon.c */
                   2069:     rs_write_int(savef,between);                        /* 5.2-daemons.c*/
                   2070:     rs_write(savef,lvl_mons,sizeof(lvl_mons));          /* 5.2-monsters.c*/
                   2071:     rs_write(savef,wand_mons,sizeof(wand_mons));        /* 5.2-monsters.c*/
                   2072:     rs_write_coord(savef, nh);                          /* 5.2-move.c    */
                   2073:     rs_write_boolean(savef, got_genocide);              /* 5.2-things.c  */
                   2074:
                   2075:     return(WRITESTAT);
                   2076: }
                   2077:
                   2078: int
                   2079: rs_restore_file(FILE *inf)
                   2080: {
                   2081:     bool junk;
                   2082:     THING *mitem;
                   2083:     int endian = 0x01020304;
                   2084:     big_endian = ( *((char *)&endian) == 0x01 );
                   2085:
                   2086:     rs_read_boolean(inf, &after);
                   2087:     rs_read_boolean(inf, &noscore);
                   2088:     rs_read_boolean(inf, &amulet);
                   2089:     rs_read_boolean(inf, &askme);
                   2090:     rs_read_boolean(inf, &door_stop);
                   2091:     rs_read_boolean(inf, &fight_flush);
                   2092:     rs_read_boolean(inf, &firstmove);
                   2093:     rs_read_boolean(inf, &in_shell);
                   2094:     rs_read_boolean(inf, &jump);
                   2095:     rs_read_boolean(inf, &passgo);
                   2096:     rs_read_boolean(inf, &playing);
                   2097:     rs_read_boolean(inf, &running);
                   2098:     rs_read_boolean(inf, &save_msg);
                   2099:     rs_read_boolean(inf, &slow_invent);
                   2100:     rs_read_boolean(inf, &terse);
                   2101: #ifdef WIZARD
                   2102:     rs_read_boolean(inf, &wizard);
                   2103: #else
                   2104:     rs_read_boolean(inf, &junk);
                   2105: #endif
                   2106:     rs_read_char(inf, &take);
                   2107:     rs_read(inf, prbuf, MAXSTR);
                   2108:     rs_read_char(inf, &runch);
                   2109:
                   2110:     rs_read_scrolls(inf);
                   2111:     rs_read_potions(inf);
                   2112:     rs_read_rings(inf);
                   2113:     rs_read_sticks(inf);
                   2114:
                   2115:     rs_read_new_string(inf, &release);
                   2116:     rs_read(inf, whoami, MAXSTR);
                   2117:     rs_read(inf, fruit, MAXSTR);
                   2118:
                   2119:     rs_read(inf, _level, MAXLINES*MAXCOLS);
                   2120:     rs_read(inf, _flags, MAXLINES*MAXCOLS);
                   2121:
                   2122:     rs_read_int(inf, &max_level);
                   2123:     rs_read_int(inf, &ntraps);
                   2124:     rs_read_int(inf, &dnum);
                   2125:     rs_read_int(inf, &level);
                   2126:     rs_read_int(inf, &purse);
                   2127:     rs_read_int(inf, &no_move);
                   2128:     rs_read_int(inf, &no_command);
                   2129:     rs_read_int(inf, &inpack);
                   2130:     rs_read_int(inf, &lastscore);
                   2131:     rs_read_int(inf, &no_food);
                   2132:     rs_read_int(inf, &count);
                   2133:     rs_read_int(inf, &fung_hit);
                   2134:     rs_read_int(inf, &quiet);
                   2135:     rs_read_int(inf, &food_left);
                   2136:     rs_read_int(inf, &group);
                   2137:     rs_read_int(inf, &hungry_state);
                   2138:
                   2139:     rs_read_long(inf, &seed);
                   2140:     rs_read_coord(inf, &oldpos);
                   2141:     rs_read_coord(inf, &delta);
                   2142:
                   2143:     rs_read_thing(inf, &player);
                   2144:     rs_read_object_reference(inf, player.t_pack, &cur_armor);
                   2145:     rs_read_object_reference(inf, player.t_pack, &cur_weapon);
                   2146:     rs_read_object_reference(inf, player.t_pack, &cur_ring[0]);
                   2147:     rs_read_object_reference(inf, player.t_pack, &cur_ring[1]);
                   2148:
                   2149:     rs_read_object_list(inf, &lvl_obj);
                   2150:     rs_read_thing_list(inf, &mlist);
                   2151:     rs_fix_thing(&player);
                   2152:     rs_fix_thing_list(mlist);
                   2153:     rs_read_thing_references(inf,mlist,_monst,MAXLINES*MAXCOLS);
                   2154:
                   2155:     rs_read_window(inf, stdscr);
                   2156:     rs_read_stats(inf, &max_stats);
                   2157:
                   2158:     rs_read_rooms(inf, rooms, MAXROOMS);
                   2159:     rs_read_room_reference(inf, &oldrp);
                   2160:     rs_read_rooms(inf, passages, MAXPASS);
                   2161:
                   2162:     rs_read_monsters(inf,monsters,26);
                   2163:     rs_read_magic_items(inf, things,   NUMTHINGS);
                   2164:     rs_read_magic_items(inf, s_magic,  MAXSCROLLS);
                   2165:     rs_read_magic_items(inf, p_magic,  MAXPOTIONS);
                   2166:     rs_read_magic_items(inf, r_magic,  MAXRINGS);
                   2167:     rs_read_magic_items(inf, ws_magic, MAXSTICKS);
                   2168:
                   2169:     rs_read_coord(inf, &ch_ret);                        /* 5.2-chase.c      */
                   2170:     rs_read_char(inf,&countch);                         /* 5.2-command.c    */
                   2171:     rs_read_char(inf,&direction);                       /* 5.2-command.c    */
                   2172:     rs_read_char(inf,&newcount);                        /* 5.2-command.c    */
                   2173:     rs_read_daemons(inf, d_list, 20);                   /* 5.2-daemon.c     */
                   2174:     rs_read_int(inf,&between);                          /* 5.2-daemons.c    */
                   2175:     rs_read(inf, lvl_mons, sizeof(lvl_mons));           /* 5.2-monsters.c   */
                   2176:     rs_read(inf, wand_mons, sizeof(wand_mons));         /* 5.2-monsters.c   */
                   2177:     rs_read_coord(inf, &nh);                            /* 5.2-move.c       */
                   2178:     rs_read_boolean(inf, &got_genocide);                /* 5.2-things.c     */
                   2179:
                   2180:     if (proom == NULL)
                   2181:         proom = roomin(&hero);
                   2182:     for (mitem = mlist; mitem != NULL; mitem = mitem->l_next) {
                   2183:         if (mitem->t_room == NULL)
                   2184:             mitem->t_room = roomin(&(mitem->t_pos));
                   2185:     }
                   2186:
                   2187:     return(READSTAT);
                   2188: }

CVSweb