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

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

1.1       rubenllo    1: /*
                      2:     state.c - Portable Rogue Save State Code
                      3:
                      4:     Copyright (C) 1999, 2000, 2005 Nicholas J. Kisseberth
                      5:     All rights reserved.
                      6:
                      7:     Redistribution and use in source and binary forms, with or without
                      8:     modification, are permitted provided that the following conditions
                      9:     are met:
                     10:     1. Redistributions of source code must retain the above copyright
                     11:        notice, this list of conditions and the following disclaimer.
                     12:     2. Redistributions in binary form must reproduce the above copyright
                     13:        notice, this list of conditions and the following disclaimer in the
                     14:        documentation and/or other materials provided with the distribution.
                     15:     3. Neither the name(s) of the author(s) nor the names of other contributors
                     16:        may be used to endorse or promote products derived from this software
                     17:        without specific prior written permission.
                     18:
                     19:     THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTORS ``AS IS'' AND
                     20:     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     21:     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     22:     ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTORS BE LIABLE
                     23:     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     24:     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     25:     OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     26:     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     27:     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     28:     OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     29:     SUCH DAMAGE.
                     30: */
                     31:
                     32: #include <stdlib.h>
                     33: #include <string.h>
                     34: #include <curses.h>
                     35: #include <errno.h>
                     36: #include "rogue.h"
                     37:
                     38: /************************************************************************/
                     39: /* Save State Code                                                      */
                     40: /************************************************************************/
                     41:
                     42: #define RSID_STATS        0xABCD0001
                     43: #define RSID_THING        0xABCD0002
                     44: #define RSID_THING_NULL   0xDEAD0002
                     45: #define RSID_OBJECT       0xABCD0003
                     46: #define RSID_MAGICITEMS   0xABCD0004
                     47: #define RSID_KNOWS        0xABCD0005
                     48: #define RSID_GUESSES      0xABCD0006
                     49: #define RSID_OBJECTLIST   0xABCD0007
                     50: #define RSID_BAGOBJECT    0xABCD0008
                     51: #define RSID_MONSTERLIST  0xABCD0009
                     52: #define RSID_MONSTERSTATS 0xABCD000A
                     53: #define RSID_MONSTERS     0xABCD000B
                     54: #define RSID_TRAP         0xABCD000C
                     55: #define RSID_WINDOW       0xABCD000D
                     56: #define RSID_DAEMONS      0xABCD000E
                     57: #define RSID_IWEAPS       0xABCD000F
                     58: #define RSID_IARMOR       0xABCD0010
                     59: #define RSID_SPELLS       0xABCD0011
                     60: #define RSID_ILIST        0xABCD0012
                     61: #define RSID_HLIST        0xABCD0013
                     62: #define RSID_DEATHTYPE    0xABCD0014
                     63: #define RSID_CTYPES       0XABCD0015
                     64: #define RSID_COORDLIST    0XABCD0016
                     65: #define RSID_ROOMS        0XABCD0017
                     66:
                     67: #define READSTAT (format_error || read_error )
                     68: #define WRITESTAT (write_error)
                     69:
                     70: static int read_error   = FALSE;
                     71: static int write_error  = FALSE;
                     72: static int format_error = FALSE;
                     73: static int endian = 0x01020304;
                     74: #define  big_endian ( *((char *)&endian) == 0x01 )
                     75:
                     76: void
                     77: rs_write(FILE *savef, const void *ptr, size_t size)
                     78: {
                     79:     encwrite(ptr, size, savef);
                     80: }
                     81:
                     82: void
                     83: rs_read(FILE *savef, void *ptr, size_t size)
                     84: {
                     85:     encread(ptr, size, savef);
                     86: }
                     87:
                     88: void
                     89: rs_write_int(FILE *savef, int c)
                     90: {
                     91:     char bytes[4];
                     92:     char *buf = (char *) &c;
                     93:
                     94:     if (big_endian)
                     95:     {
                     96:         bytes[3] = buf[0];
                     97:         bytes[2] = buf[1];
                     98:         bytes[1] = buf[2];
                     99:         bytes[0] = buf[3];
                    100:         buf = bytes;
                    101:     }
                    102:
                    103:     rs_write(savef, buf, 4);
                    104: }
                    105:
                    106: void
                    107: rs_read_int(FILE *savef, int *i)
                    108: {
                    109:     char bytes[4];
                    110:     int input = 0;
                    111:     char *buf = (char *)&input;
                    112:
                    113:     rs_read(savef, &input, 4);
                    114:
                    115:     if (encerror())
                    116:        return;
                    117:
                    118:     if (big_endian)
                    119:     {
                    120:         bytes[3] = buf[0];
                    121:         bytes[2] = buf[1];
                    122:         bytes[1] = buf[2];
                    123:         bytes[0] = buf[3];
                    124:         buf = bytes;
                    125:     }
                    126:
                    127:     *i = *((int *) buf);
                    128: }
                    129:
                    130: void
                    131: rs_write_uint(FILE *savef, unsigned int c)
                    132: {
                    133:     char bytes[4];
                    134:     char *buf = (char *) &c;
                    135:
                    136:     if (big_endian)
                    137:     {
                    138:         bytes[3] = buf[0];
                    139:         bytes[2] = buf[1];
                    140:         bytes[1] = buf[2];
                    141:         bytes[0] = buf[3];
                    142:         buf = bytes;
                    143:     }
                    144:
                    145:     rs_write(savef, buf, 4);
                    146: }
                    147:
                    148: void
                    149: rs_read_uint(FILE *savef, unsigned int *i)
                    150: {
                    151:     char bytes[4];
                    152:     int input = 0;
                    153:     char *buf = (char *)&input;
                    154:
                    155:     rs_read(savef, &input, 4);
                    156:
                    157:     if (encerror())
                    158:        return;
                    159:
                    160:     if (big_endian)
                    161:     {
                    162:         bytes[3] = buf[0];
                    163:         bytes[2] = buf[1];
                    164:         bytes[1] = buf[2];
                    165:         bytes[0] = buf[3];
                    166:         buf = bytes;
                    167:     }
                    168:
                    169:     *i = *((unsigned int *) buf);
                    170: }
                    171:
                    172: void
                    173: rs_write_chars(FILE *savef, const char *c, int cnt)
                    174: {
                    175:     rs_write_int(savef, cnt);
                    176:     rs_write(savef, c, cnt);
                    177: }
                    178:
                    179: void
                    180: rs_read_chars(FILE *savef, char *i, int cnt)
                    181: {
                    182:     int value = 0;
                    183:
                    184:     rs_read_int(savef, &value);
                    185:
                    186:     if (!encerror() && (value != cnt))
                    187:        encseterr(EILSEQ);
                    188:
                    189:     rs_read(savef, i, cnt);
                    190: }
                    191:
                    192: void
                    193: rs_write_ints(FILE *savef, int *c, int cnt)
                    194: {
                    195:     int n = 0;
                    196:
                    197:     rs_write_int(savef, cnt);
                    198:
                    199:     for(n = 0; n < cnt; n++)
                    200:         rs_write_int(savef,c[n]);
                    201: }
                    202:
                    203: void
                    204: rs_read_ints(FILE *savef, int *i, int cnt)
                    205: {
                    206:     int n, value;
                    207:
                    208:     rs_read_int(savef,&value);
                    209:
                    210:     if (!encerror() && (value != cnt))
                    211:        encseterr(EILSEQ);
                    212:
                    213:     for(n = 0; n < cnt; n++)
                    214:         rs_read_int(savef, &i[n]);
                    215: }
                    216:
                    217: void
                    218: rs_write_marker(FILE *savef, int id)
                    219: {
                    220:     rs_write_int(savef, id);
                    221: }
                    222:
                    223: void
                    224: rs_read_marker(FILE *savef, int id)
                    225: {
                    226:     int nid;
                    227:
                    228:     rs_read_int(savef, &nid);
                    229:
                    230:     if (!encerror() && (id != nid))
                    231:        encseterr(EILSEQ);
                    232: }
                    233:
                    234: /******************************************************************************/
                    235:
                    236: void
                    237: rs_write_string(FILE *savef, const char *s)
                    238: {
                    239:     int len = 0;
                    240:
                    241:     len = (s == NULL) ? 0 : (int) strlen(s) + 1;
                    242:
                    243:     rs_write_int(savef, len);
                    244:     rs_write_chars(savef, s, len);
                    245: }
                    246:
                    247: void
                    248: rs_read_string(FILE *savef, char *s, int max)
                    249: {
                    250:     int len = 0;
                    251:
                    252:     rs_read_int(savef, &len);
                    253:
                    254:     if (!encerror() && (len > max))
                    255:        encseterr(EILSEQ);
                    256:
                    257:     rs_read_chars(savef, s, len);
                    258: }
                    259:
                    260: void
                    261: rs_read_new_string(FILE *savef, char **s)
                    262: {
                    263:     int len=0;
                    264:     char *buf=0;
                    265:
                    266:     rs_read_int(savef, &len);
                    267:
                    268:     if (encerror())
                    269:        return;
                    270:
                    271:     if (len == 0)
                    272:         buf = NULL;
                    273:     else
                    274:     {
                    275:         buf = malloc(len);
                    276:
                    277:         if (buf == NULL)
                    278:             encseterr(ENOMEM);
                    279:     }
                    280:
                    281:     rs_read_chars(savef, buf, len);
                    282:
                    283:     *s = buf;
                    284: }
                    285:
                    286: void
                    287: rs_write_string_index(FILE *savef, const char *master[], int max, const char *str)
                    288: {
                    289:     int i;
                    290:
                    291:     for(i = 0; i < max; i++)
                    292:         if (str == master[i])
                    293:        {
                    294:             rs_write_int(savef, i);
                    295:            return;
                    296:        }
                    297:
                    298:     rs_write_int(savef,-1);
                    299: }
                    300:
                    301: void
                    302: rs_read_string_index(FILE *savef, const char *master[], int maxindex, const char **str)
                    303: {
                    304:     int i;
                    305:
                    306:     rs_read_int(savef, &i);
                    307:
                    308:     if (!encerror() && (i > maxindex))
                    309:         encseterr(EILSEQ);
                    310:     else if (i >= 0)
                    311:         *str = master[i];
                    312:     else
                    313:         *str = NULL;
                    314: }
                    315:
                    316: void
                    317: rs_write_coord(FILE *savef, coord c)
                    318: {
                    319:     rs_write_int(savef, c.x);
                    320:     rs_write_int(savef, c.y);
                    321: }
                    322:
                    323: void
                    324: rs_read_coord(FILE *savef, coord *c)
                    325: {
                    326:     coord in;
                    327:
                    328:     rs_read_int(savef,&in.x);
                    329:     rs_read_int(savef,&in.y);
                    330:
                    331:     if (!encerror())
                    332:     {
                    333:         c->x = in.x;
                    334:         c->y = in.y;
                    335:     }
                    336: }
                    337:
                    338: void
                    339: rs_write_window(FILE *savef, WINDOW *win)
                    340: {
                    341:     int row,col,height,width;
                    342:
                    343:     width  = getmaxx(win);
                    344:     height = getmaxy(win);
                    345:
                    346:     rs_write_marker(savef,RSID_WINDOW);
                    347:     rs_write_int(savef,height);
                    348:     rs_write_int(savef,width);
                    349:
                    350:     for(row=0;row<height;row++)
                    351:         for(col=0;col<width;col++)
                    352:             rs_write_int(savef, mvwinch(win,row,col));
                    353: }
                    354:
                    355: void
                    356: rs_read_window(FILE *savef, WINDOW *win)
                    357: {
                    358:     int row,col,maxlines,maxcols,value,width,height;
                    359:
                    360:     width  = getmaxx(win);
                    361:     height = getmaxy(win);
                    362:
                    363:     rs_read_marker(savef, RSID_WINDOW);
                    364:
                    365:     rs_read_int(savef, &maxlines);
                    366:     rs_read_int(savef, &maxcols);
                    367:
                    368:     if (encerror())
                    369:        return;
                    370:
                    371:     for(row = 0; row < maxlines; row++)
                    372:         for(col = 0; col < maxcols; col++)
                    373:         {
                    374:             rs_read_int(savef, &value);
                    375:
                    376:             if ((row < height) && (col < width))
                    377:                 mvwaddch(win,row,col,value);
                    378:         }
                    379: }
                    380:
                    381: /******************************************************************************/
                    382:
                    383: void *
                    384: get_list_item(THING *l, int i)
                    385: {
                    386:     int cnt;
                    387:
                    388:     for(cnt = 0; l != NULL; cnt++, l = l->l_next)
                    389:         if (cnt == i)
                    390:             return(l);
                    391:
                    392:     return(NULL);
                    393: }
                    394:
                    395: int
                    396: find_list_ptr(THING *l, void *ptr)
                    397: {
                    398:     int cnt;
                    399:
                    400:     for(cnt = 0; l != NULL; cnt++, l = l->l_next)
                    401:         if (l == ptr)
                    402:             return(cnt);
                    403:
                    404:     return(-1);
                    405: }
                    406:
                    407: int
                    408: list_size(THING *l)
                    409: {
                    410:     int cnt;
                    411:
                    412:     for(cnt = 0; l != NULL; cnt++, l = l->l_next)
                    413:         ;
                    414:
                    415:     return(cnt);
                    416: }
                    417:
                    418: /******************************************************************************/
                    419:
                    420: void
                    421: rs_write_stats(FILE *savef, struct stats *s)
                    422: {
                    423:     rs_write_marker(savef, RSID_STATS);
                    424:     rs_write_int(savef, s->s_str);
                    425:     rs_write_int(savef, s->s_exp);
                    426:     rs_write_int(savef, s->s_lvl);
                    427:     rs_write_int(savef, s->s_arm);
                    428:     rs_write_int(savef, s->s_hpt);
                    429:     rs_write_chars(savef, s->s_dmg, sizeof(s->s_dmg));
                    430:     rs_write_int(savef,s->s_maxhp);
                    431: }
                    432:
                    433: void
                    434: rs_read_stats(FILE *savef, struct stats *s)
                    435: {
                    436:     rs_read_marker(savef, RSID_STATS);
                    437:     rs_read_int(savef,&s->s_str);
                    438:     rs_read_int(savef,&s->s_exp);
                    439:     rs_read_int(savef,&s->s_lvl);
                    440:     rs_read_int(savef,&s->s_arm);
                    441:     rs_read_int(savef,&s->s_hpt);
                    442:     rs_read_chars(savef,s->s_dmg,sizeof(s->s_dmg));
                    443:     rs_read_int(savef,&s->s_maxhp);
                    444: }
                    445:
                    446: void
                    447: rs_write_stone_index(FILE *savef, const STONE master[], int max, const char *str)
                    448: {
                    449:     int i;
                    450:
                    451:     for(i = 0; i < max; i++)
                    452:         if (str == master[i].st_name)
                    453:        {
                    454:             rs_write_int(savef,i);
                    455:            return;
                    456:        }
                    457:
                    458:     rs_write_int(savef,-1);
                    459: }
                    460:
                    461: void
                    462: rs_read_stone_index(FILE *savef, const STONE master[], int maxindex, const char **str)
                    463: {
                    464:     int i = 0;
                    465:
                    466:     rs_read_int(savef,&i);
                    467:
                    468:     if (!encerror() && (i > maxindex))
                    469:         encseterr(EILSEQ);
                    470:     else if (i >= 0)
                    471:         *str = master[i].st_name;
                    472:     else
                    473:         *str = NULL;
                    474: }
                    475:
                    476: void
                    477: rs_write_scrolls(FILE *savef)
                    478: {
                    479:     int i;
                    480:
                    481:     for(i = 0; i < MAXSCROLLS; i++)
                    482:         rs_write_string(savef, s_names[i]);
                    483: }
                    484:
                    485: void
                    486: rs_read_scrolls(FILE *savef)
                    487: {
                    488:     int i;
                    489:
                    490:     for(i = 0; i < MAXSCROLLS; i++)
                    491:         rs_read_new_string(savef, &s_names[i]);
                    492: }
                    493:
                    494: void
                    495: rs_write_potions(FILE *savef)
                    496: {
                    497:     int i;
                    498:
                    499:     for(i = 0; i < MAXPOTIONS; i++)
                    500:         rs_write_string_index(savef, rainbow, cNCOLORS, p_colors[i]);
                    501: }
                    502:
                    503: void
                    504: rs_read_potions(FILE *savef)
                    505: {
                    506:     int i;
                    507:
                    508:     for(i = 0; i < MAXPOTIONS; i++)
                    509:         rs_read_string_index(savef, rainbow, cNCOLORS, &p_colors[i]);
                    510: }
                    511:
                    512: void
                    513: rs_write_rings(FILE *savef)
                    514: {
                    515:     int i;
                    516:
                    517:     for(i = 0; i < MAXRINGS; i++)
                    518:         rs_write_stone_index(savef, stones, cNSTONES, r_stones[i]);
                    519: }
                    520:
                    521: void
                    522: rs_read_rings(FILE *savef)
                    523: {
                    524:     int i;
                    525:
                    526:     for(i = 0; i < MAXRINGS; i++)
                    527:         rs_read_stone_index(savef, stones, cNSTONES, &r_stones[i]);
                    528: }
                    529:
                    530: void
                    531: rs_write_sticks(FILE *savef)
                    532: {
                    533:     int i;
                    534:
                    535:     for (i = 0; i < MAXSTICKS; i++)
                    536:     {
                    537:         if (strcmp(ws_type[i],"staff") == 0)
                    538:         {
                    539:             rs_write_int(savef,0);
                    540:             rs_write_string_index(savef, wood, cNWOOD, ws_made[i]);
                    541:         }
                    542:         else
                    543:         {
                    544:             rs_write_int(savef,1);
                    545:             rs_write_string_index(savef, metal, cNMETAL, ws_made[i]);
                    546:         }
                    547:     }
                    548: }
                    549:
                    550: void
                    551: rs_read_sticks(FILE *savef)
                    552: {
                    553:     int i = 0, list = 0;
                    554:
                    555:     for(i = 0; i < MAXSTICKS; i++)
                    556:     {
                    557:         rs_read_int(savef,&list);
                    558:
                    559:         if (list == 0)
                    560:         {
                    561:             rs_read_string_index(savef, wood, cNWOOD, &ws_made[i]);
                    562:             ws_type[i] = "staff";
                    563:         }
                    564:         else
                    565:         {
                    566:             rs_read_string_index(savef, metal, cNMETAL, &ws_made[i]);
                    567:             ws_type[i] = "wand";
                    568:         }
                    569:     }
                    570: }
                    571:
                    572: void
                    573: rs_write_daemons(FILE *savef, struct delayed_action *dlist, int cnt)
                    574: {
                    575:     int i = 0;
                    576:     int func = 0;
                    577:
                    578:     rs_write_marker(savef, RSID_DAEMONS);
                    579:     rs_write_int(savef, cnt);
                    580:
                    581:     for(i = 0; i < cnt; i++)
                    582:     {
                    583:         if (dlist[i].d_func == rollwand)
                    584:             func = 1;
                    585:         else if (dlist[i].d_func == doctor)
                    586:             func = 2;
                    587:         else if (dlist[i].d_func == stomach)
                    588:             func = 3;
                    589:         else if (dlist[i].d_func == runners)
                    590:             func = 4;
                    591:         else if (dlist[i].d_func == swander)
                    592:             func = 5;
                    593:         else if (dlist[i].d_func == nohaste)
                    594:             func = 6;
                    595:         else if (dlist[i].d_func == unconfuse)
                    596:             func = 7;
                    597:         else if (dlist[i].d_func == unsee)
                    598:             func = 8;
                    599:         else if (dlist[i].d_func == sight)
                    600:             func = 9;
                    601:         else if (dlist[i].d_func == turn_see_off)
                    602:             func = 10;
                    603:         else if (dlist[i].d_func == land)
                    604:             func = 11;
                    605:         else if (dlist[i].d_func == come_down)
                    606:             func = 12;
                    607:         else if (dlist[i].d_func == visuals)
                    608:             func = 13;
                    609:         else if (dlist[i].d_func == NULL)
                    610:             func = 0;
                    611:         else
                    612:             func = -1;
                    613:
                    614:         rs_write_int(savef, dlist[i].d_type);
                    615:         rs_write_int(savef, func);
                    616:         rs_write_int(savef, dlist[i].d_arg);
                    617:         rs_write_int(savef, dlist[i].d_time);
                    618:     }
                    619: }
                    620:
                    621: void
                    622: rs_read_daemons(FILE *savef, struct delayed_action *dlist, int cnt)
                    623: {
                    624:     int i = 0;
                    625:     int func = 0;
                    626:     int value = 0;
                    627:
                    628:     rs_read_marker(savef, RSID_DAEMONS);
                    629:     rs_read_int(savef, &value);
                    630:
                    631:     if (!encerror() && (value > cnt))
                    632:     {
                    633:        encseterr(EILSEQ);
                    634:        return;
                    635:     }
                    636:
                    637:     for(i=0; i < cnt; i++)
                    638:     {
                    639:         func = 0;
                    640:         rs_read_int(savef, &dlist[i].d_type);
                    641:         rs_read_int(savef, &func);
                    642:         rs_read_int(savef, &dlist[i].d_arg);
                    643:         rs_read_int(savef, &dlist[i].d_time);
                    644:
                    645:        if (encerror())
                    646:            return;
                    647:
                    648:         switch(func)
                    649:         {
                    650:             case 1: dlist[i].d_func = rollwand;
                    651:                     break;
                    652:             case 2: dlist[i].d_func = doctor;
                    653:                     break;
                    654:             case 3: dlist[i].d_func = stomach;
                    655:                     break;
                    656:             case 4: dlist[i].d_func = runners;
                    657:                     break;
                    658:             case 5: dlist[i].d_func = swander;
                    659:                     break;
                    660:             case 6: dlist[i].d_func = nohaste;
                    661:                     break;
                    662:             case 7: dlist[i].d_func = unconfuse;
                    663:                     break;
                    664:             case 8: dlist[i].d_func = unsee;
                    665:                     break;
                    666:             case 9: dlist[i].d_func = sight;
                    667:                     break;
                    668:             case 10: dlist[i].d_func = turn_see_off;
                    669:                     break;
                    670:             case 11: dlist[i].d_func = land;
                    671:                     break;
                    672:             case 12: dlist[i].d_func = come_down;
                    673:                     break;
                    674:             case 13: dlist[i].d_func = visuals;
                    675:                     break;
                    676:             default:dlist[i].d_func = NULL;
                    677:                     break;
                    678:         }
                    679:
                    680:         if (dlist[i].d_func == NULL)
                    681:         {
                    682:             dlist[i].d_type = 0;
                    683:             dlist[i].d_arg = 0;
                    684:             dlist[i].d_time = 0;
                    685:         }
                    686:     }
                    687:
                    688: }
                    689:
                    690: void
                    691: rs_write_obj_info(FILE *savef, struct obj_info *i, int cnt)
                    692: {
                    693:     int n;
                    694:
                    695:     rs_write_marker(savef, RSID_MAGICITEMS);
                    696:     rs_write_int(savef, cnt);
                    697:
                    698:     for(n = 0; n < cnt; n++)
                    699:     {
                    700:         /* oi_name is constant, defined at compile time in all cases */
                    701:         rs_write_int(savef,i[n].oi_prob);
                    702:         rs_write_int(savef,i[n].oi_worth);
                    703:         rs_write_string(savef,i[n].oi_guess);
                    704:         rs_write_int(savef,i[n].oi_know);
                    705:     }
                    706: }
                    707:
                    708: void
                    709: rs_read_obj_info(FILE *savef, struct obj_info *mi, int cnt)
                    710: {
                    711:     int n;
                    712:     int value;
                    713:
                    714:     rs_read_marker(savef, RSID_MAGICITEMS);
                    715:
                    716:     rs_read_int(savef, &value);
                    717:
                    718:     if (!encerror() && (value > cnt))
                    719:     {
                    720:        encseterr(EILSEQ);
                    721:        return;
                    722:     }
                    723:
                    724:     for(n = 0; n < value; n++)
                    725:     {
                    726:         /* mi_name is const, defined at compile time in all cases */
                    727:         rs_read_int(savef,&mi[n].oi_prob);
                    728:         rs_read_int(savef,&mi[n].oi_worth);
                    729:         rs_read_new_string(savef,&mi[n].oi_guess);
                    730:         rs_read_int(savef,&mi[n].oi_know);
                    731:     }
                    732: }
                    733:
                    734: void
                    735: rs_write_room(FILE *savef, struct room *r)
                    736: {
                    737:     rs_write_coord(savef, r->r_pos);
                    738:     rs_write_coord(savef, r->r_max);
                    739:     rs_write_coord(savef, r->r_gold);
                    740:     rs_write_int(savef,   r->r_goldval);
                    741:     rs_write_int(savef, r->r_flags);
                    742:     rs_write_int(savef, r->r_nexits);
                    743:     rs_write_coord(savef, r->r_exit[0]);
                    744:     rs_write_coord(savef, r->r_exit[1]);
                    745:     rs_write_coord(savef, r->r_exit[2]);
                    746:     rs_write_coord(savef, r->r_exit[3]);
                    747:     rs_write_coord(savef, r->r_exit[4]);
                    748:     rs_write_coord(savef, r->r_exit[5]);
                    749:     rs_write_coord(savef, r->r_exit[6]);
                    750:     rs_write_coord(savef, r->r_exit[7]);
                    751:     rs_write_coord(savef, r->r_exit[8]);
                    752:     rs_write_coord(savef, r->r_exit[9]);
                    753:     rs_write_coord(savef, r->r_exit[10]);
                    754:     rs_write_coord(savef, r->r_exit[11]);
                    755: }
                    756:
                    757: void
                    758: rs_read_room(FILE *savef, struct room *r)
                    759: {
                    760:     rs_read_coord(savef,&r->r_pos);
                    761:     rs_read_coord(savef,&r->r_max);
                    762:     rs_read_coord(savef,&r->r_gold);
                    763:     rs_read_int(savef,&r->r_goldval);
                    764:     rs_read_int(savef,&r->r_flags);
                    765:     rs_read_int(savef,&r->r_nexits);
                    766:     rs_read_coord(savef,&r->r_exit[0]);
                    767:     rs_read_coord(savef,&r->r_exit[1]);
                    768:     rs_read_coord(savef,&r->r_exit[2]);
                    769:     rs_read_coord(savef,&r->r_exit[3]);
                    770:     rs_read_coord(savef,&r->r_exit[4]);
                    771:     rs_read_coord(savef,&r->r_exit[5]);
                    772:     rs_read_coord(savef,&r->r_exit[6]);
                    773:     rs_read_coord(savef,&r->r_exit[7]);
                    774:     rs_read_coord(savef,&r->r_exit[8]);
                    775:     rs_read_coord(savef,&r->r_exit[9]);
                    776:     rs_read_coord(savef,&r->r_exit[10]);
                    777:     rs_read_coord(savef,&r->r_exit[11]);
                    778: }
                    779:
                    780: void
                    781: rs_write_rooms(FILE *savef, struct room r[], int cnt)
                    782: {
                    783:     int n = 0;
                    784:
                    785:     rs_write_int(savef, cnt);
                    786:
                    787:     for(n = 0; n < cnt; n++)
                    788:         rs_write_room(savef, &r[n]);
                    789: }
                    790:
                    791: void
                    792: rs_read_rooms(FILE *savef, struct room *r, int cnt)
                    793: {
                    794:     int value = 0, n = 0;
                    795:
                    796:     rs_read_int(savef,&value);
                    797:
                    798:     if (!encerror() && (value > cnt))
                    799:         encseterr(EILSEQ);
                    800:     else
                    801:        for(n = 0; n < value; n++)
                    802:            rs_read_room(savef,&r[n]);
                    803: }
                    804:
                    805: void
                    806: rs_write_room_reference(FILE *savef, struct room *rp)
                    807: {
                    808:     int i, room = -1;
                    809:
                    810:     for (i = 0; i < MAXROOMS; i++)
                    811:         if (&rooms[i] == rp)
                    812:             room = i;
                    813:
                    814:     rs_write_int(savef, room);
                    815: }
                    816:
                    817: void
                    818: rs_read_room_reference(FILE *savef, struct room **rp)
                    819: {
                    820:     int i;
                    821:
                    822:     rs_read_int(savef, &i);
                    823:
                    824:     if (!encerror()) {
                    825:         if (i >= 0 && i < MAXROOMS)
                    826:            *rp = &rooms[i];
                    827:         else
                    828:             *rp = NULL;
                    829:     }
                    830: }
                    831:
                    832: void
                    833: rs_write_monsters(FILE *savef, struct monster *m, int cnt)
                    834: {
                    835:     int n;
                    836:
                    837:     rs_write_marker(savef, RSID_MONSTERS);
                    838:     rs_write_int(savef, cnt);
                    839:
                    840:     for(n=0;n<cnt;n++)
                    841:         rs_write_stats(savef, &m[n].m_stats);
                    842: }
                    843:
                    844: void
                    845: rs_read_monsters(FILE *savef, struct monster *m, int cnt)
                    846: {
                    847:     int value = 0, n = 0;
                    848:
                    849:     rs_read_marker(savef, RSID_MONSTERS);
                    850:
                    851:     rs_read_int(savef, &value);
                    852:
                    853:     if (!encerror() && (value != cnt))
                    854:        encseterr(EILSEQ);
                    855:     else
                    856:        for(n = 0; n < cnt; n++)
                    857:            rs_read_stats(savef, &m[n].m_stats);
                    858: }
                    859:
                    860: void
                    861: rs_write_object(FILE *savef, THING *o)
                    862: {
                    863:     rs_write_marker(savef, RSID_OBJECT);
                    864:     rs_write_int(savef, o->_o._o_type);
                    865:     rs_write_coord(savef, o->_o._o_pos);
                    866:     rs_write_int(savef, o->_o._o_launch);
                    867:     rs_write_int(savef, o->_o._o_packch);
                    868:     rs_write_chars(savef, o->_o._o_damage, sizeof(o->_o._o_damage));
                    869:     rs_write_chars(savef, o->_o._o_hurldmg, sizeof(o->_o._o_hurldmg));
                    870:     rs_write_int(savef, o->_o._o_count);
                    871:     rs_write_int(savef, o->_o._o_which);
                    872:     rs_write_int(savef, o->_o._o_hplus);
                    873:     rs_write_int(savef, o->_o._o_dplus);
                    874:     rs_write_int(savef, o->_o._o_arm);
                    875:     rs_write_int(savef, o->_o._o_flags);
                    876:     rs_write_int(savef, o->_o._o_group);
                    877:     rs_write_string(savef, o->_o._o_label);
                    878: }
                    879:
                    880: void
                    881: rs_read_object(FILE *savef, THING *o)
                    882: {
                    883:     rs_read_marker(savef, RSID_OBJECT);
                    884:     rs_read_int(savef, &o->_o._o_type);
                    885:     rs_read_coord(savef, &o->_o._o_pos);
                    886:     rs_read_int(savef, &o->_o._o_launch);
                    887:     rs_read_int(savef, &o->_o._o_packch);
                    888:     rs_read_chars(savef, o->_o._o_damage, sizeof(o->_o._o_damage));
                    889:     rs_read_chars(savef, o->_o._o_hurldmg, sizeof(o->_o._o_hurldmg));
                    890:     rs_read_int(savef, &o->_o._o_count);
                    891:     rs_read_int(savef, &o->_o._o_which);
                    892:     rs_read_int(savef, &o->_o._o_hplus);
                    893:     rs_read_int(savef, &o->_o._o_dplus);
                    894:     rs_read_int(savef, &o->_o._o_arm);
                    895:     rs_read_int(savef, &o->_o._o_flags);
                    896:     rs_read_int(savef, &o->_o._o_group);
                    897:     rs_read_new_string(savef, &o->_o._o_label);
                    898: }
                    899:
                    900: void
                    901: rs_write_object_list(FILE *savef, THING *l)
                    902: {
                    903:     rs_write_marker(savef, RSID_OBJECTLIST);
                    904:     rs_write_int(savef, list_size(l));
                    905:
                    906:     for( ;l != NULL; l = l->l_next)
                    907:         rs_write_object(savef, l);
                    908: }
                    909:
                    910: void
                    911: rs_read_object_list(FILE *savef, THING **list)
                    912: {
                    913:     int i, cnt;
                    914:     THING *l = NULL, *previous = NULL, *head = NULL;
                    915:
                    916:     rs_read_marker(savef, RSID_OBJECTLIST);
                    917:     rs_read_int(savef, &cnt);
                    918:
                    919:     if (encerror())
                    920:        return;
                    921:
                    922:     for (i = 0; i < cnt; i++)
                    923:     {
                    924:         l = new_item();
                    925:
                    926:         l->l_prev = previous;
                    927:
                    928:         if (previous != NULL)
                    929:             previous->l_next = l;
                    930:
                    931:         rs_read_object(savef,l);
                    932:
                    933:         if (previous == NULL)
                    934:             head = l;
                    935:
                    936:         previous = l;
                    937:     }
                    938:
                    939:     if (l != NULL)
                    940:         l->l_next = NULL;
                    941:
                    942:     *list = head;
                    943: }
                    944:
                    945: void
                    946: rs_write_object_reference(FILE *savef, THING *list, THING *item)
                    947: {
                    948:     int i;
                    949:
                    950:     i = find_list_ptr(list, item);
                    951:
                    952:     rs_write_int(savef, i);
                    953: }
                    954:
                    955: void
                    956: rs_read_object_reference(FILE *savef, THING *list, THING **item)
                    957: {
                    958:     int i;
                    959:
                    960:     rs_read_int(savef, &i);
                    961:
                    962:     if (!encerror())
                    963:        *item = get_list_item(list,i);
                    964:     else
                    965:        *item = NULL;
                    966: }
                    967:
                    968: int
                    969: find_room_coord(const struct room *rmlist,const coord *c, int n)
                    970: {
                    971:     int i = 0;
                    972:
                    973:     for(i = 0; i < n; i++)
                    974:         if(&rmlist[i].r_gold == c)
                    975:             return(i);
                    976:
                    977:     return(-1);
                    978: }
                    979:
                    980: int
                    981: find_thing_coord(THING *monlist, const coord *c)
                    982: {
                    983:     THING *mitem;
                    984:     THING *tp;
                    985:     int i = 0;
                    986:
                    987:     for(mitem = monlist; mitem != NULL; mitem = mitem->l_next)
                    988:     {
                    989:         tp = mitem;
                    990:
                    991:         if (c == &tp->t_pos)
                    992:             return(i);
                    993:
                    994:         i++;
                    995:     }
                    996:
                    997:     return(-1);
                    998: }
                    999:
                   1000: int
                   1001: find_object_coord(THING *objlist, const coord *c)
                   1002: {
                   1003:     THING *oitem;
                   1004:     THING *obj;
                   1005:     int i = 0;
                   1006:
                   1007:     for(oitem = objlist; oitem != NULL; oitem = oitem->l_next)
                   1008:     {
                   1009:         obj = oitem;
                   1010:
                   1011:         if (c == &obj->o_pos)
                   1012:             return(i);
                   1013:
                   1014:         i++;
                   1015:     }
                   1016:
                   1017:     return(-1);
                   1018: }
                   1019:
                   1020: void
                   1021: rs_write_thing(FILE *savef, THING *t)
                   1022: {
                   1023:     int i = -1;
                   1024:
                   1025:     rs_write_marker(savef, RSID_THING);
                   1026:
                   1027:     if (t == NULL)
                   1028:     {
                   1029:         rs_write_int(savef, 0);
                   1030:         return;
                   1031:     }
                   1032:
                   1033:     rs_write_int(savef, 1);
                   1034:     rs_write_coord(savef, t->_t._t_pos);
                   1035:     rs_write_int(savef, t->_t._t_turn);
                   1036:     rs_write_int(savef, t->_t._t_type);
                   1037:     rs_write_int(savef, t->_t._t_disguise);
                   1038:     rs_write_int(savef, t->_t._t_oldch);
                   1039:
                   1040:     /*
                   1041:         t_dest can be:
                   1042:         0,0: NULL
                   1043:         0,1: location of hero
                   1044:         1,i: location of a thing (monster)
                   1045:         2,i: location of an object
                   1046:         3,i: location of gold in a room
                   1047:
                   1048:         We need to remember what we are chasing rather than
                   1049:         the current location of what we are chasing.
                   1050:     */
                   1051:
                   1052:     if (t->t_dest == &hero)
                   1053:     {
                   1054:         rs_write_int(savef,0);
                   1055:         rs_write_int(savef,1);
                   1056:     }
                   1057:     else if (t->t_dest != NULL)
                   1058:     {
                   1059:         i = find_thing_coord(mlist, t->t_dest);
                   1060:
                   1061:         if (i >=0 )
                   1062:         {
                   1063:             rs_write_int(savef,1);
                   1064:             rs_write_int(savef,i);
                   1065:         }
                   1066:         else
                   1067:         {
                   1068:             i = find_object_coord(lvl_obj, t->t_dest);
                   1069:
                   1070:             if (i >= 0)
                   1071:             {
                   1072:                 rs_write_int(savef,2);
                   1073:                 rs_write_int(savef,i);
                   1074:             }
                   1075:             else
                   1076:             {
                   1077:                 i = find_room_coord(rooms, t->t_dest, MAXROOMS);
                   1078:
                   1079:                 if (i >= 0)
                   1080:                 {
                   1081:                     rs_write_int(savef,3);
                   1082:                     rs_write_int(savef,i);
                   1083:                 }
                   1084:                 else
                   1085:                 {
                   1086:                     rs_write_int(savef, 0);
                   1087:                     rs_write_int(savef,1); /* chase the hero anyway */
                   1088:                 }
                   1089:             }
                   1090:         }
                   1091:     }
                   1092:     else
                   1093:     {
                   1094:         rs_write_int(savef,0);
                   1095:         rs_write_int(savef,0);
                   1096:     }
                   1097:
                   1098:     rs_write_int(savef, t->_t._t_flags);
                   1099:     rs_write_stats(savef, &t->_t._t_stats);
                   1100:     rs_write_room_reference(savef, t->_t._t_room);
                   1101:     rs_write_object_list(savef, t->_t._t_pack);
                   1102: }
                   1103:
                   1104: void
                   1105: rs_read_thing(FILE *savef, THING *t)
                   1106: {
                   1107:     int listid = 0, index = -1;
                   1108:     THING *item;
                   1109:
                   1110:     rs_read_marker(savef, RSID_THING);
                   1111:     rs_read_int(savef, &index);
                   1112:
                   1113:     if (encerror())
                   1114:        return;
                   1115:
                   1116:     if (index == 0)
                   1117:         return;
                   1118:
                   1119:     rs_read_coord(savef,&t->_t._t_pos);
                   1120:     rs_read_int(savef,&t->_t._t_turn);
                   1121:     rs_read_int(savef,&t->_t._t_type);
                   1122:     rs_read_int(savef,&t->_t._t_disguise);
                   1123:     rs_read_int(savef,&t->_t._t_oldch);
                   1124:
                   1125:     /*
                   1126:         t_dest can be (listid,index):
                   1127:         0,0: NULL
                   1128:         0,1: location of hero
                   1129:         1,i: location of a thing (monster)
                   1130:         2,i: location of an object
                   1131:         3,i: location of gold in a room
                   1132:
                   1133:         We need to remember what we are chasing rather than
                   1134:         the current location of what we are chasing.
                   1135:     */
                   1136:
                   1137:     rs_read_int(savef, &listid);
                   1138:     rs_read_int(savef, &index);
                   1139:     t->_t._t_reserved = -1;
                   1140:
                   1141:     if (encerror())
                   1142:        return;
                   1143:
                   1144:     if (listid == 0) /* hero or NULL */
                   1145:     {
                   1146:         if (index == 1)
                   1147:             t->_t._t_dest = &hero;
                   1148:         else
                   1149:             t->_t._t_dest = NULL;
                   1150:     }
                   1151:     else if (listid == 1) /* monster/thing */
                   1152:     {
                   1153:         t->_t._t_dest     = NULL;
                   1154:         t->_t._t_reserved = index;
                   1155:     }
                   1156:     else if (listid == 2) /* object */
                   1157:     {
                   1158:         THING *obj;
                   1159:
                   1160:         item = get_list_item(lvl_obj, index);
                   1161:
                   1162:         if (item != NULL)
                   1163:         {
                   1164:             obj = item;
                   1165:             t->_t._t_dest = &obj->o_pos;
                   1166:         }
                   1167:     }
                   1168:     else if (listid == 3) /* gold */
                   1169:     {
                   1170:         t->_t._t_dest = &rooms[index].r_gold;
                   1171:     }
                   1172:     else
                   1173:         t->_t._t_dest = NULL;
                   1174:
                   1175:     rs_read_int(savef,&t->_t._t_flags);
                   1176:     rs_read_stats(savef,&t->_t._t_stats);
                   1177:     rs_read_room_reference(savef, &t->_t._t_room);
                   1178:     rs_read_object_list(savef,&t->_t._t_pack);
                   1179: }
                   1180:
                   1181: void
                   1182: rs_fix_thing(THING *t)
                   1183: {
                   1184:     THING *item;
                   1185:     THING *tp;
                   1186:
                   1187:     if (t->t_reserved < 0)
                   1188:         return;
                   1189:
                   1190:     item = get_list_item(mlist,t->t_reserved);
                   1191:
                   1192:     if (item != NULL)
                   1193:     {
                   1194:         tp = item;
                   1195:         t->t_dest = &tp->t_pos;
                   1196:     }
                   1197: }
                   1198:
                   1199: void
                   1200: rs_write_thing_list(FILE *savef, THING *l)
                   1201: {
                   1202:     int cnt = 0;
                   1203:
                   1204:     rs_write_marker(savef, RSID_MONSTERLIST);
                   1205:
                   1206:     cnt = list_size(l);
                   1207:
                   1208:     rs_write_int(savef, cnt);
                   1209:
                   1210:     if (cnt < 1)
                   1211:         return;
                   1212:
                   1213:     while (l != NULL) {
                   1214:         rs_write_thing(savef, l);
                   1215:         l = l->l_next;
                   1216:     }
                   1217: }
                   1218:
                   1219: void
                   1220: rs_read_thing_list(FILE *savef, THING **list)
                   1221: {
                   1222:     int i, cnt;
                   1223:     THING *l = NULL, *previous = NULL, *head = NULL;
                   1224:
                   1225:     rs_read_marker(savef, RSID_MONSTERLIST);
                   1226:     rs_read_int(savef, &cnt);
                   1227:
                   1228:     if (encerror())
                   1229:        return;
                   1230:
                   1231:     for (i = 0; i < cnt; i++)
                   1232:     {
                   1233:         l = new_item();
                   1234:
                   1235:         l->l_prev = previous;
                   1236:
                   1237:         if (previous != NULL)
                   1238:             previous->l_next = l;
                   1239:
                   1240:         rs_read_thing(savef,l);
                   1241:
                   1242:         if (previous == NULL)
                   1243:             head = l;
                   1244:
                   1245:         previous = l;
                   1246:     }
                   1247:
                   1248:     if (l != NULL)
                   1249:         l->l_next = NULL;
                   1250:
                   1251:     *list = head;
                   1252: }
                   1253:
                   1254: void
                   1255: rs_fix_thing_list(THING *list)
                   1256: {
                   1257:     THING *item;
                   1258:
                   1259:     for(item = list; item != NULL; item = item->l_next)
                   1260:         rs_fix_thing(item);
                   1261: }
                   1262:
                   1263: void
                   1264: rs_write_thing_reference(FILE *savef, THING *list, THING *item)
                   1265: {
                   1266:     int i;
                   1267:
                   1268:     if (item == NULL)
                   1269:         rs_write_int(savef,-1);
                   1270:     else
                   1271:     {
                   1272:         i = find_list_ptr(list, item);
                   1273:
                   1274:         rs_write_int(savef, i);
                   1275:     }
                   1276: }
                   1277:
                   1278: void
                   1279: rs_read_thing_reference(FILE *savef, THING *list, THING **item)
                   1280: {
                   1281:     int i;
                   1282:
                   1283:     rs_read_int(savef, &i);
                   1284:
                   1285:     if (encerror())
                   1286:        return;
                   1287:
                   1288:     if (i == -1)
                   1289:         *item = NULL;
                   1290:     else
                   1291:         *item = get_list_item(list,i);
                   1292:
                   1293: }
                   1294:
                   1295: void
                   1296: rs_write_thing_references(FILE *savef, THING *list, THING *items[], int cnt)
                   1297: {
                   1298:     int i;
                   1299:
                   1300:     for(i = 0; i < cnt; i++)
                   1301:         rs_write_thing_reference(savef,list,items[i]);
                   1302: }
                   1303:
                   1304: void
                   1305: rs_read_thing_references(FILE *savef, THING *list, THING *items[], int cnt)
                   1306: {
                   1307:     int i;
                   1308:
                   1309:     for(i = 0; i < cnt; i++)
                   1310:         rs_read_thing_reference(savef,list,&items[i]);
                   1311: }
                   1312:
                   1313: void
                   1314: rs_write_places(FILE *savef, PLACE *p, int cnt)
                   1315: {
                   1316:     int i = 0;
                   1317:
                   1318:     for(i = 0; i < cnt; i++)
                   1319:     {
                   1320:         rs_write_int(savef, p[i].p_ch);
                   1321:         rs_write_int(savef, p[i].p_flags);
                   1322:         rs_write_thing_reference(savef, mlist, p[i].p_monst);
                   1323:     }
                   1324: }
                   1325:
                   1326: void
                   1327: rs_read_places(FILE *savef, PLACE *p, int cnt)
                   1328: {
                   1329:     int i = 0;
                   1330:
                   1331:     for(i = 0; i < cnt; i++)
                   1332:     {
                   1333:         rs_read_int(savef,&p[i].p_ch);
                   1334:         rs_read_int(savef,&p[i].p_flags);
                   1335:         rs_read_thing_reference(savef, mlist, &p[i].p_monst);
                   1336:     }
                   1337: }
                   1338:
                   1339: int
                   1340: rs_save_file(FILE *savef)
                   1341: {
                   1342:     encclearerr();
                   1343:
                   1344:     rs_write_int(savef, noscore);
                   1345:     rs_write_int(savef, seenstairs);
                   1346:     rs_write_int(savef, amulet);
                   1347:     rs_write_int(savef, fight_flush);
                   1348:     rs_write_int(savef, jump);
                   1349:     rs_write_int(savef, passgo);
                   1350:     rs_write_int(savef, see_floor);
                   1351:     rs_write_int(savef, terse);
                   1352:     rs_write_int(savef, tombstone);
                   1353:     rs_write_ints(savef, pack_used, 26);
                   1354:     rs_write_chars(savef, file_name, MAXSTR);
                   1355:     rs_write_chars(savef, huh, MAXSTR);
                   1356:     rs_write_potions(savef);
                   1357:     rs_write_rings(savef);
                   1358:     rs_write_scrolls(savef);
                   1359:     rs_write_chars(savef, whoami, MAXSTR);
                   1360:     rs_write_sticks(savef);
                   1361:     rs_write_chars(savef, fruit, MAXSTR);
                   1362:     rs_write_int(savef,n_objs);
                   1363:     rs_write_int(savef, ntraps);
                   1364:     rs_write_int(savef, hungry_state);
                   1365:     rs_write_int(savef, inpack);
                   1366:     rs_write_int(savef, inv_type);
                   1367:     rs_write_int(savef, level);
                   1368:     rs_write_int(savef, max_level);
                   1369:     rs_write_int(savef, no_food);
                   1370:     rs_write_int(savef, food_left);
                   1371:     rs_write_int(savef, lastscore);
                   1372:     rs_write_int(savef, no_move);
                   1373:     rs_write_int(savef, purse);
                   1374:     rs_write_int(savef, quiet);
                   1375:     rs_write_int(savef, vf_hit);
                   1376:     rs_write_uint(savef, seed);
                   1377:     rs_write_coord(savef, stairs);
                   1378:     rs_write_thing(savef, &player);
                   1379:     rs_write_object_reference(savef, player.t_pack, cur_armor);
                   1380:     rs_write_object_reference(savef, player.t_pack, cur_ring[0]);
                   1381:     rs_write_object_reference(savef, player.t_pack, cur_ring[1]);
                   1382:     rs_write_object_reference(savef, player.t_pack, cur_weapon);
                   1383:     rs_write_object_list(savef, lvl_obj);
                   1384:     rs_write_thing_list(savef, mlist);
                   1385:     rs_write_places(savef,places,MAXLINES*MAXCOLS);
                   1386:     rs_write_stats(savef,&max_stats);
                   1387:     rs_write_rooms(savef, rooms, MAXROOMS);
                   1388:     rs_write_rooms(savef, passages, MAXPASS);
                   1389:     rs_write_monsters(savef,monsters,26);
                   1390:     rs_write_obj_info(savef, things,  NUMTHINGS);
                   1391:     rs_write_obj_info(savef, arm_info,  MAXARMORS);
                   1392:     rs_write_obj_info(savef, pot_info,  MAXPOTIONS);
                   1393:     rs_write_obj_info(savef, ring_info,  MAXRINGS);
                   1394:     rs_write_obj_info(savef, scr_info,  MAXSCROLLS);
                   1395:     rs_write_obj_info(savef, weap_info,  MAXWEAPONS+1);
                   1396:     rs_write_obj_info(savef, ws_info, MAXSTICKS);
                   1397:     rs_write_daemons(savef, &d_list[0], 20);
                   1398:     rs_write_int(savef,between);
                   1399:     rs_write_int(savef, group);
                   1400:     rs_write_window(savef,stdscr);
                   1401:
                   1402:     return( encclearerr() );
                   1403: }
                   1404:
                   1405: int
                   1406: rs_restore_file(FILE *savef)
                   1407: {
                   1408:     char fake_file_name[MAXSTR];
                   1409:     THING *mitem;
                   1410:     encclearerr();
                   1411:
                   1412:     rs_read_int(savef, &noscore);
                   1413:     rs_read_int(savef, &seenstairs);
                   1414:     rs_read_int(savef, &amulet);
                   1415:     rs_read_int(savef, &fight_flush);
                   1416:     rs_read_int(savef, &jump);
                   1417:     rs_read_int(savef, &passgo);
                   1418:     rs_read_int(savef, &see_floor);
                   1419:     rs_read_int(savef, &terse);
                   1420:     rs_read_int(savef, &tombstone);
                   1421:     rs_read_ints(savef, pack_used, 26);
                   1422:     rs_read_chars(savef, fake_file_name, MAXSTR);
                   1423:     rs_read_chars(savef, huh, MAXSTR);
                   1424:     rs_read_potions(savef);
                   1425:     rs_read_rings(savef);
                   1426:     rs_read_scrolls(savef);
                   1427:     rs_read_chars(savef, whoami, MAXSTR);
                   1428:     rs_read_sticks(savef);
                   1429:     rs_read_chars(savef, fruit, MAXSTR);
                   1430:     rs_read_int(savef, &n_objs);
                   1431:     rs_read_int(savef, &ntraps);
                   1432:     rs_read_int(savef, &hungry_state);
                   1433:     rs_read_int(savef, &inpack);
                   1434:     rs_read_int(savef, &inv_type);
                   1435:     rs_read_int(savef, &level);
                   1436:     rs_read_int(savef, &max_level);
                   1437:     rs_read_int(savef, &no_food);
                   1438:     rs_read_int(savef, &food_left);
                   1439:     rs_read_int(savef, &lastscore);
                   1440:     rs_read_int(savef, &no_move);
                   1441:     rs_read_int(savef, &purse);
                   1442:     rs_read_int(savef, &quiet);
                   1443:     rs_read_int(savef, &vf_hit);
                   1444:     rs_read_uint(savef, &seed);
                   1445:     rs_read_coord(savef, &stairs);
                   1446:     rs_read_thing(savef, &player);
                   1447:     rs_read_object_reference(savef, player.t_pack, &cur_armor);
                   1448:     rs_read_object_reference(savef, player.t_pack, &cur_ring[0]);
                   1449:     rs_read_object_reference(savef, player.t_pack, &cur_ring[1]);
                   1450:     rs_read_object_reference(savef, player.t_pack, &cur_weapon);
                   1451:     rs_read_object_list(savef, &lvl_obj);
                   1452:     rs_read_thing_list(savef, &mlist);
                   1453:     rs_fix_thing(&player);
                   1454:     rs_fix_thing_list(mlist);
                   1455:     rs_read_places(savef,places,MAXLINES*MAXCOLS);
                   1456:     rs_read_stats(savef, &max_stats);
                   1457:     rs_read_rooms(savef, rooms, MAXROOMS);
                   1458:     rs_read_rooms(savef, passages, MAXPASS);
                   1459:     rs_read_monsters(savef,monsters,26);
                   1460:     rs_read_obj_info(savef, things,  NUMTHINGS);
                   1461:     rs_read_obj_info(savef, arm_info,   MAXARMORS);
                   1462:     rs_read_obj_info(savef, pot_info,  MAXPOTIONS);
                   1463:     rs_read_obj_info(savef, ring_info,  MAXRINGS);
                   1464:     rs_read_obj_info(savef, scr_info,  MAXSCROLLS);
                   1465:     rs_read_obj_info(savef, weap_info, MAXWEAPONS+1);
                   1466:     rs_read_obj_info(savef, ws_info, MAXSTICKS);
                   1467:     rs_read_daemons(savef, d_list, 20);
                   1468:     rs_read_int(savef,&between);
                   1469:     rs_read_int(savef,&group);
                   1470:     rs_read_window(savef,stdscr);
                   1471:
                   1472:     if (player.t_room == NULL)
                   1473:         player.t_room = roomin(&hero);
                   1474:     for (mitem = mlist; mitem != NULL; mitem = mitem->l_next) {
                   1475:         if (mitem->t_room == NULL)
                   1476:             mitem->t_room = roomin(&(mitem->t_pos));
                   1477:     }
                   1478:
                   1479:     return( encclearerr() );
                   1480: }

CVSweb