Annotation of early-roguelike/urogue/state.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: state.c - Portable Rogue Save State Code
! 3:
! 4: Copyright (C) 1993, 1995 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: Notes
! 33:
! 34: Should move all game variables into one place
! 35: Should move save/restore code into save.c or some such
! 36: */
! 37:
! 38: #include <assert.h>
! 39: #include <stdlib.h>
! 40: #include <string.h>
! 41: #include "rogue.h"
! 42:
! 43: /*
! 44: Variables for global game state.
! 45:
! 46: All variables that need to get saved when saving a game
! 47: are defined in this file. Long term goal is to move many
! 48: of these variables into a "struct level" data type of some
! 49: kind... perhaps not, maybe struct game...
! 50:
! 51: Other global variables that don't need to get saved are
! 52: kept in main.c.
! 53:
! 54: Other global variables that don't change during the course
! 55: of a game are kept in urogue.c, monsdata.c, data.c.
! 56: */
! 57:
! 58: #define _X_ { 0, 0, 0, 0, 0 }
! 59:
! 60: struct delayed_action
! 61: d_list[MAXDAEMONS] = /* daemon/fuse list */
! 62: {
! 63: _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_,
! 64: _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_,
! 65: _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_,
! 66: _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_,
! 67: _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_,
! 68: _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_,
! 69: };
! 70:
! 71: #undef _X_
! 72:
! 73: char *s_names[MAXSCROLLS]; /* Names of the scrolls */
! 74: char *p_colors[MAXPOTIONS]; /* Colors of the potions */
! 75: char *r_stones[MAXRINGS]; /* Stone settings of the rings */
! 76: char *ws_made[MAXSTICKS]; /* What sticks are made of */
! 77: char *ws_type[MAXSTICKS]; /* Is it a wand or a staff */
! 78:
! 79: char *guess_items[MAXMAGICTYPES][MAXMAGICITEMS]; /* guess magic is */
! 80: int know_items[MAXMAGICTYPES][MAXMAGICITEMS]; /* flag knowlede of magic */
! 81: /* object data */
! 82:
! 83: struct trap traps[2 * MAXTRAPS]; /* 2x for special effects */
! 84: struct room rooms[MAXROOMS]; /* One for each room -- A level */
! 85: struct room *oldrp = NULL; /* Roomin(&player.t_oldpos) */
! 86: struct thing player; /* The rogue */
! 87: struct linked_list *lvl_obj = NULL; /* Treasure on this level */
! 88: struct linked_list *fam_ptr = NULL; /* A ptr to the familiar */
! 89: struct linked_list *mlist = NULL; /* Monsters on this level */
! 90: struct thing *beast; /* The last beast that attacked */
! 91: struct object *cur_armor = NULL; /* what rogue wears */
! 92: struct object *cur_weapon = NULL; /* ... and wields */
! 93: struct object *cur_ring[10]; /* His rings */
! 94: struct linked_list *curr_mons = NULL; /* The mons. currently moving */
! 95: struct linked_list *next_mons = NULL; /* The mons. after curr_mons */
! 96:
! 97: /* Misc. game state info */
! 98: char dummybuf1[50000];
! 99: char dummybuf2[50000];
! 100: char msgbuf[10][2*LINELEN]; /* message buffer history */
! 101: int msg_index = 0; /* index in msg history buffer for nxt msg */
! 102: int foodlev = 1; /* how fast he eats food */
! 103: int ntraps = 0; /* Number of traps on this level */
! 104: int dnum = 0; /* Dungeon number */
! 105: int max_level = 0; /* Deepest player has gone */
! 106: int lost_dext = 0; /* amount of lost dexterity */
! 107: int no_command = 0;
! 108: int level = 0;
! 109: int see_dist = 3;
! 110: int no_food = 0;
! 111: int count = 0;
! 112: int food_left = HUNGERTIME;
! 113: int group = 1;
! 114: int hungry_state = F_OK;
! 115: int infest_dam = 0;
! 116: int lost_str = 0;
! 117: int hold_count = 0;
! 118: int trap_tries = 0;
! 119: int has_artifact = 0;
! 120: int picked_artifact = 0;
! 121: int luck = 0;
! 122: int resurrect = 0;
! 123: int fam_type = 0; /* The type of familiar */
! 124: int mons_summoned = 0; /* Number of summoned monsters */
! 125: char PLAYER = VPLAYER; /* what the player looks like */
! 126: char take = 0; /* Thing the rogue is taking */
! 127: char runch = 0; /* Direction player is running */
! 128: int char_type = C_NOTSET; /* what type of character is player */
! 129: int inv_type = INV_CLEAR; /* Overwrite style of inventory */
! 130: int pool_teleport = FALSE; /* just teleported from a pool */
! 131: int inwhgt = FALSE; /* true if from wghtchk() */
! 132: int after = 0; /* True if we want after daemons */
! 133: int waswizard = 0; /* Was a wizard sometime */
! 134: int canwizard = 1; /* Will be permitted to do this */
! 135: int playing = TRUE;
! 136: int running = FALSE;
! 137: int fighting = FALSE;
! 138: int wizard = FALSE;
! 139: int wiz_verbose = TRUE;
! 140: int moving = FALSE;
! 141: int use_savedir = FALSE;
! 142: coord delta; /* Change indicated to get_dir() */
! 143: LEVTYPE levtype; /* type of level i'm on */
! 144: long purse = 0;
! 145: unsigned long total = 0;
! 146:
! 147: WINDOW *cw; /* Window that the player sees */
! 148: WINDOW *hw; /* Used for the help command */
! 149: WINDOW *mw; /* Used to store mosnters */
! 150:
! 151: /* options.o */
! 152: /* game options */
! 153:
! 154: int terse = FALSE;
! 155: int door_stop = FALSE;
! 156: int jump = TRUE;
! 157: int doorstop = TRUE;
! 158: int firstmove = FALSE;
! 159: int askme = TRUE;
! 160: char whoami[2 * LINELEN]; /* Name of player */
! 161: char fruit[2 * LINELEN]; /* Favorite fruit */
! 162: char file_name[2 * LINELEN]; /* Save file name */
! 163: char score_file[2 * LINELEN]; /* Score file name */
! 164:
! 165: /****************************************************************************/
! 166: /* Portable Save State Code */
! 167: /* */
! 168: /* UltraRogue v1.04 */
! 169: /****************************************************************************/
! 170:
! 171: #define URS_STATS 0xABCD0001
! 172: #define URS_THING 0xABCD0002
! 173: #define URS_OBJECT 0xABCD0003
! 174: #define URS_MAGIC 0xABCD0004
! 175: #define URS_KNOWS 0xABCD0005
! 176: #define URS_GUESSES 0xABCD0006
! 177: #define URS_STACKOBJECT 0xABCD0007
! 178: #define URS_BAGOBJECT 0xABCD0008
! 179: #define URS_MONSTERLIST 0xABCD0009
! 180: #define URS_MONSTERSTATS 0xABCD000A
! 181: #define URS_MONSTER 0xABCD000B
! 182: #define URS_TRAP 0xABCD000C
! 183: #define URS_WINDOW 0xABCD000D
! 184: #define URS_DAEMONS 0xABCD000E
! 185:
! 186: void
! 187: ur_write(FILE *savef, void *ptr, size_t size)
! 188: {
! 189: if (size == 0)
! 190: return;
! 191:
! 192: fwrite(ptr,size,1,savef);
! 193: }
! 194:
! 195: void
! 196: ur_read(FILE *savef, void *ptr, size_t size)
! 197: {
! 198: if (size == 0)
! 199: return;
! 200:
! 201: fread(ptr,size,1,savef);
! 202: }
! 203:
! 204: void
! 205: ur_write_int(FILE *savef, int c)
! 206: {
! 207: ur_write(savef,&c,sizeof(int));
! 208: }
! 209:
! 210: int
! 211: ur_read_int(FILE *savef)
! 212: {
! 213: int i;
! 214:
! 215: ur_read(savef, &i, sizeof(int));
! 216:
! 217: return(i);
! 218: }
! 219:
! 220: void
! 221: ur_write_short(FILE *savef, short c)
! 222: {
! 223: ur_write(savef,&c,sizeof(short));
! 224: }
! 225:
! 226: short
! 227: ur_read_short(FILE *savef)
! 228: {
! 229: short s;
! 230:
! 231: ur_read(savef, &s, sizeof(short));
! 232:
! 233: return(s);
! 234: }
! 235:
! 236: void
! 237: ur_write_long(FILE *savef, long c)
! 238: {
! 239: ur_write(savef,&c,sizeof(long));
! 240: }
! 241:
! 242: long
! 243: ur_read_long(FILE *savef)
! 244: {
! 245: long l;
! 246:
! 247: ur_read(savef, &l, sizeof(long));
! 248:
! 249: return(l);
! 250: }
! 251:
! 252: void
! 253: ur_write_ulong(FILE *savef, unsigned long c)
! 254: {
! 255: ur_write(savef,&c,sizeof(unsigned long));
! 256: }
! 257:
! 258: unsigned long
! 259: ur_read_ulong(FILE *savef)
! 260: {
! 261: long l;
! 262:
! 263: ur_read(savef, &l, sizeof(unsigned long));
! 264:
! 265: return(l);
! 266: }
! 267:
! 268: void
! 269: ur_unread_long(FILE *savef)
! 270: {
! 271: fseek(savef, -(long)sizeof(long), SEEK_CUR);
! 272: }
! 273:
! 274: void
! 275: ur_write_char(FILE *savef, char c)
! 276: {
! 277: ur_write(savef,&c,sizeof(char));
! 278: }
! 279:
! 280: char
! 281: ur_read_char(FILE *savef)
! 282: {
! 283: char c;
! 284:
! 285: ur_read(savef, &c, sizeof(char));
! 286:
! 287: return(c);
! 288: }
! 289:
! 290: void
! 291: ur_write_string(FILE *savef, char *s)
! 292: {
! 293: size_t len;
! 294:
! 295: len = (s == NULL) ? 0L : strlen(s) + 1 ;
! 296:
! 297: ur_write_long(savef, (long) len);
! 298: ur_write(savef,s,len);
! 299: }
! 300:
! 301:
! 302: char *
! 303: ur_read_string(FILE *savef)
! 304: {
! 305: size_t len;
! 306: char *buf;
! 307:
! 308: len = ur_read_long(savef);
! 309:
! 310: if (len == 0)
! 311: return(NULL);
! 312:
! 313: buf = ur_alloc(len);
! 314:
! 315: if (buf == NULL) /* Should flag a global error condition... */
! 316: return(NULL);
! 317:
! 318: ur_read(savef,buf,len);
! 319:
! 320: return(buf);
! 321: }
! 322:
! 323: void
! 324: ur_write_coord(FILE *savef, coord c)
! 325: {
! 326: ur_write_int(savef, c.x);
! 327: ur_write_int(savef, c.y);
! 328: }
! 329:
! 330: coord
! 331: ur_read_coord(FILE *savef)
! 332: {
! 333: coord c;
! 334:
! 335: c.x = ur_read_int(savef);
! 336: c.y = ur_read_int(savef);
! 337:
! 338: return(c);
! 339: }
! 340:
! 341: void
! 342: ur_write_room(FILE *savef, struct room *r)
! 343: {
! 344: int i;
! 345:
! 346: ur_write_coord(savef, r->r_pos);
! 347: ur_write_coord(savef, r->r_max);
! 348:
! 349: for(i=0; i<MAXDOORS; i++)
! 350: ur_write_coord(savef, r->r_exit[i]);
! 351:
! 352: ur_write_int(savef, r->r_flags);
! 353: ur_write_int(savef, r->r_nexits);
! 354: ur_write_short(savef, r->r_fires);
! 355: }
! 356:
! 357: struct room *
! 358: ur_read_room(FILE *savef)
! 359: {
! 360: struct room *r;
! 361: int i;
! 362:
! 363: r = ur_alloc( sizeof(struct room) );
! 364:
! 365: r->r_pos = ur_read_coord(savef);
! 366: r->r_max = ur_read_coord(savef);
! 367:
! 368: for(i=0; i<MAXDOORS; i++)
! 369: r->r_exit[i] = ur_read_coord(savef);
! 370:
! 371: r->r_flags = ur_read_int(savef);
! 372: r->r_nexits = ur_read_int(savef);
! 373: r->r_fires = ur_read_short(savef);
! 374:
! 375: return(r);
! 376: }
! 377:
! 378: void
! 379: ur_write_object(FILE *savef, struct object *o)
! 380: {
! 381: int other;
! 382:
! 383: ur_write_long(savef, URS_OBJECT);
! 384: ur_write_coord(savef, o->o_pos);
! 385: ur_write_string(savef, o->o_text);
! 386: ur_write_string(savef, o->o_damage);
! 387: ur_write_string(savef, o->o_hurldmg);
! 388: ur_write_long(savef, o->o_flags);
! 389: ur_write_long(savef, o->ar_flags);
! 390: ur_write_char(savef, o->o_type);
! 391: ur_write_int(savef, o->o_ident);
! 392: ur_write_int(savef, o->o_count);
! 393: ur_write_int(savef, o->o_which);
! 394: ur_write_int(savef, o->o_hplus);
! 395: ur_write_int(savef, o->o_dplus);
! 396: ur_write_int(savef, o->o_ac);
! 397: ur_write_int(savef, o->o_group);
! 398: ur_write_int(savef, o->o_weight);
! 399: ur_write_char(savef, o->o_launch);
! 400: ur_write(savef, &o->o_mark[0], MARKLEN);
! 401: ur_write_long(savef, o->o_worth);
! 402:
! 403: other = 0;
! 404:
! 405: if (o->o_bag)
! 406: other = 1;
! 407: else if (o->next_obj)
! 408: other |= 2;
! 409:
! 410: ur_write_int(savef,other);
! 411:
! 412: if (o->o_bag)
! 413: ur_write_bag(savef,o->o_bag);
! 414: if (o->next_obj && (o->next_obj->l_prev == NULL) )
! 415: ur_write_object_stack(savef, o->next_obj);
! 416: }
! 417:
! 418: /*
! 419: * Puts objects with identifiers into the global ident_list, keeping it sorted
! 420: * by type and identifier.
! 421: */
! 422: void
! 423: add_to_ident(struct object *o)
! 424: {
! 425: extern linked_list *ident_list;
! 426: linked_list *obj_ll;
! 427: linked_list *list_p, *prev_p = NULL;
! 428: struct object *list_o;
! 429:
! 430: obj_ll = new_list();
! 431: obj_ll->data.obj = o;
! 432:
! 433: for (list_p = ident_list; list_p != NULL; list_p = next(list_p))
! 434: {
! 435: list_o = list_p->data.obj;
! 436: if (list_o->o_type == o->o_type)
! 437: {
! 438: if (list_o->o_ident > o->o_ident)
! 439: {
! 440: prev_p = list_p->l_prev;
! 441: break;
! 442: }
! 443: else if (next(list_p) &&
! 444: next(list_p)->data.obj->o_type != o->o_type)
! 445: {
! 446: prev_p = list_p;
! 447: break;
! 448: }
! 449: }
! 450: if (!next(list_p))
! 451: prev_p = list_p;
! 452: }
! 453: _attach_after(&ident_list, prev_p, obj_ll);
! 454: return;
! 455: }
! 456:
! 457: struct object *
! 458: ur_read_object(FILE *savef)
! 459: {
! 460: struct object *o;
! 461: long id;
! 462: int other;
! 463:
! 464: o = ur_alloc(sizeof(struct object));
! 465:
! 466: if (o == NULL)
! 467: return(NULL);
! 468:
! 469: memset(o,0,sizeof(struct object));
! 470:
! 471: id = ur_read_long(savef);
! 472:
! 473: assert(id == URS_OBJECT);
! 474:
! 475: o->o_pos = ur_read_coord(savef);
! 476: o->o_text = ur_read_string(savef);
! 477: o->o_damage = ur_read_string(savef);
! 478: o->o_hurldmg = ur_read_string(savef);
! 479: o->o_flags = ur_read_long(savef);
! 480: o->ar_flags = ur_read_long(savef);
! 481: o->o_type = ur_read_char(savef);
! 482: o->o_ident = ur_read_int(savef);
! 483: o->o_count = ur_read_int(savef);
! 484: o->o_which = ur_read_int(savef);
! 485: o->o_hplus = ur_read_int(savef);
! 486: o->o_dplus = ur_read_int(savef);
! 487: o->o_ac = ur_read_int(savef);
! 488: o->o_group = ur_read_int(savef);
! 489: o->o_weight = ur_read_int(savef);
! 490: o->o_launch = ur_read_char(savef);
! 491: ur_read(savef, &o->o_mark[0], MARKLEN);
! 492: o->o_worth = ur_read_long(savef);
! 493:
! 494: other = ur_read_int(savef);
! 495:
! 496: if (o->o_ident != 0) {
! 497: /* The object needs to be placed in the identifiers list. */
! 498: add_to_ident(o);
! 499: }
! 500:
! 501: if (other & 1)
! 502: o->o_bag = ur_read_bag(savef);
! 503: if (other & 2)
! 504: o->next_obj = ur_read_object_stack(savef);
! 505:
! 506: return(o);
! 507: }
! 508:
! 509: int
! 510: list_size(struct linked_list *l)
! 511: {
! 512: int cnt=0;
! 513:
! 514: if (l == NULL)
! 515: return(0);
! 516:
! 517: while(l != NULL)
! 518: {
! 519: cnt++;
! 520: l = l->l_next;
! 521: }
! 522:
! 523: return(cnt);
! 524: }
! 525:
! 526: int
! 527: find_thing_index(struct linked_list *l, struct thing *item)
! 528: {
! 529: int cnt=0;
! 530:
! 531: if (l == NULL)
! 532: return(-1);
! 533:
! 534: while(l != NULL)
! 535: {
! 536: if (item == l->data.th)
! 537: return(cnt+1);
! 538:
! 539: cnt++;
! 540: l = l->l_next;
! 541: }
! 542:
! 543: return(0);
! 544: }
! 545:
! 546:
! 547: int
! 548: find_list_index(struct linked_list *l, struct object *item)
! 549: {
! 550: int cnt=0;
! 551:
! 552: if (l == NULL)
! 553: return(-1);
! 554:
! 555: while(l != NULL)
! 556: {
! 557: if (item == l->data.obj)
! 558: return(cnt+1);
! 559:
! 560: cnt++;
! 561: l = l->l_next;
! 562: }
! 563:
! 564: return(0);
! 565: }
! 566:
! 567: struct object *
! 568: find_object(struct linked_list *list, int num)
! 569: {
! 570: int cnt = 0;
! 571: struct linked_list *l = list;
! 572:
! 573: if ( (num < 1) || (list == NULL) )
! 574: return(NULL);
! 575:
! 576: num--;
! 577:
! 578: for(cnt = 0; cnt < num; cnt++)
! 579: {
! 580: if ( l == NULL )
! 581: return(NULL);
! 582:
! 583: l = l->l_next;
! 584: }
! 585:
! 586: return(l->data.obj);
! 587: }
! 588:
! 589: struct thing *
! 590: find_thing(struct linked_list *list, int num)
! 591: {
! 592: int cnt = 0;
! 593: struct linked_list *l = list;
! 594:
! 595: if ( (num < 1) || (list == NULL) )
! 596: return(NULL);
! 597: num--;
! 598:
! 599: for(cnt = 0; cnt < num; cnt++)
! 600: {
! 601: if (l == NULL)
! 602: return(NULL);
! 603:
! 604: l = l->l_next;
! 605: }
! 606:
! 607: return(l->data.th);
! 608: }
! 609:
! 610:
! 611: void
! 612: ur_write_object_stack(FILE *savef, struct linked_list *l)
! 613: {
! 614: int cnt;
! 615:
! 616: ur_write_long(savef, URS_STACKOBJECT);
! 617:
! 618: ur_write_int(savef, cnt = list_size(l) );
! 619:
! 620: if (cnt == 0)
! 621: return;
! 622:
! 623: while(l != NULL)
! 624: {
! 625: ur_write_object(savef, l->data.obj);
! 626: l = l->l_next;
! 627: }
! 628: }
! 629:
! 630: void
! 631: ur_write_bag(FILE *savef, struct linked_list *l)
! 632: {
! 633: int cnt;
! 634:
! 635: ur_write_long(savef, URS_BAGOBJECT);
! 636:
! 637: ur_write_int(savef, cnt = list_size(l) );
! 638:
! 639: if (cnt == 0)
! 640: return;
! 641:
! 642: while(l != NULL)
! 643: {
! 644: ur_write_object(savef, l->data.obj);
! 645: l = l->l_next;
! 646: }
! 647: }
! 648:
! 649: struct linked_list *
! 650: ur_read_object_stack(FILE *savef)
! 651: {
! 652: long id;
! 653: int i,cnt;
! 654: struct linked_list *l = NULL, *previous = NULL, *head = NULL;
! 655:
! 656: id = ur_read_long(savef);
! 657:
! 658: assert(id == URS_STACKOBJECT);
! 659:
! 660: cnt = ur_read_int(savef);
! 661:
! 662: for(i = 0; i < cnt; i++)
! 663: {
! 664: l = new_list();
! 665: l->l_prev = previous;
! 666:
! 667: if (previous != NULL)
! 668: previous->l_next = l;
! 669:
! 670: l->data.obj = ur_read_object(savef);
! 671:
! 672: if (previous == NULL)
! 673: head = l;
! 674:
! 675: previous = l;
! 676: }
! 677:
! 678: if (l != NULL)
! 679: l->l_next = NULL;
! 680:
! 681: return(head);
! 682: }
! 683:
! 684:
! 685: struct linked_list *
! 686: ur_read_bag(FILE *savef)
! 687: {
! 688: long id;
! 689: int i,cnt;
! 690: struct linked_list *l = NULL, *previous = NULL, *head = NULL;
! 691:
! 692: id = ur_read_long(savef);
! 693:
! 694: assert( id == URS_BAGOBJECT );
! 695:
! 696: cnt = ur_read_int(savef);
! 697:
! 698: for(i = 0; i < cnt; i++)
! 699: {
! 700: l = new_list();
! 701: l->l_prev = previous;
! 702:
! 703: if (previous != NULL)
! 704: previous->l_next = l;
! 705:
! 706: l->data.obj = ur_read_object(savef);
! 707:
! 708: if (previous == NULL)
! 709: head = l;
! 710:
! 711: previous = l;
! 712: }
! 713:
! 714: if (l != NULL)
! 715: l->l_next = NULL;
! 716:
! 717: return(head);
! 718: }
! 719:
! 720: void
! 721: ur_fixup_monsters(struct linked_list *l)
! 722: {
! 723: while(l != NULL)
! 724: {
! 725: if (l->data.th->chasee_index == -1L)
! 726: l->data.th->t_chasee = &player;
! 727: else
! 728: l->data.th->t_chasee = find_thing(mlist, l->data.th->chasee_index);
! 729:
! 730: l->data.th->t_horde = find_object(lvl_obj, l->data.th->horde_index);
! 731:
! 732: l = l->l_next;
! 733: }
! 734: }
! 735:
! 736: void
! 737: ur_write_monsters(FILE *savef, struct linked_list *l)
! 738: {
! 739: int cnt;
! 740:
! 741: ur_write_long(savef, URS_MONSTERLIST);
! 742:
! 743: cnt = list_size(l);
! 744:
! 745: ur_write_int(savef, cnt);
! 746:
! 747: if (cnt < 1)
! 748: return;
! 749:
! 750: while(l != NULL)
! 751: {
! 752: ur_write_thing(savef, l->data.th);
! 753: l = l->l_next;
! 754: }
! 755: }
! 756:
! 757: struct linked_list *
! 758: ur_read_monsters(FILE *savef)
! 759: {
! 760: long id;
! 761: int i,cnt;
! 762: struct linked_list *l=NULL, *previous = NULL, *head = NULL;
! 763:
! 764: id = ur_read_long(savef);
! 765:
! 766: assert(id == URS_MONSTERLIST);
! 767:
! 768: cnt = ur_read_int(savef);
! 769:
! 770: if (cnt == 0)
! 771: return(NULL);
! 772:
! 773: for(i = 0; i < cnt; i++)
! 774: {
! 775: l = new_list();
! 776:
! 777: l->l_prev = previous;
! 778:
! 779: if (previous != NULL)
! 780: previous->l_next = l;
! 781:
! 782: l->data.th = ur_read_thing(savef);
! 783:
! 784: if (previous == NULL)
! 785: head = l;
! 786:
! 787: previous = l;
! 788: }
! 789:
! 790: if (l != NULL)
! 791: l->l_next = NULL;
! 792:
! 793: return(head);
! 794: }
! 795:
! 796: void
! 797: ur_write_monster_stats(FILE *savef, struct mstats *m)
! 798: {
! 799: ur_write_long(savef, URS_MONSTERSTATS);
! 800: ur_write_short(savef, m->s_str);
! 801: ur_write_long(savef, m->s_exp);
! 802: ur_write_int(savef, m->s_lvl);
! 803: ur_write_int(savef, m->s_arm);
! 804: ur_write_string(savef, m->s_hpt);
! 805: ur_write_string(savef, m->s_dmg);
! 806: }
! 807:
! 808: struct mstats *
! 809: ur_read_monster_stats(FILE *savef)
! 810: {
! 811: long id;
! 812: struct mstats *m;
! 813:
! 814: id = ur_read_long(savef);
! 815:
! 816: assert(id == URS_MONSTERSTATS);
! 817:
! 818: m = ur_alloc( sizeof(struct mstats) );
! 819:
! 820: m->s_str = ur_read_short(savef);
! 821: m->s_exp = ur_read_long(savef);
! 822: m->s_lvl = ur_read_int(savef);
! 823: m->s_arm = ur_read_int(savef);
! 824: m->s_hpt = ur_read_string(savef);
! 825: m->s_dmg = ur_read_string(savef);
! 826:
! 827: return(m);
! 828: }
! 829:
! 830: void
! 831: ur_write_monster(FILE *savef, struct monster *m)
! 832: {
! 833: int i;
! 834:
! 835: ur_write_long(savef, URS_MONSTER);
! 836: ur_write_string(savef, m->m_name);
! 837: ur_write_short(savef, m->m_carry);
! 838: ur_write_int(savef, m->m_normal);
! 839: ur_write_int(savef, m->m_wander);
! 840: ur_write_char(savef, m->m_appear);
! 841: ur_write_string(savef, m->m_intel);
! 842:
! 843: for(i = 0; i < 10; i++)
! 844: ur_write_long(savef, m->m_flags[i]);
! 845:
! 846: ur_write_string(savef, m->m_typesum);
! 847: ur_write_short(savef, m->m_numsum);
! 848: ur_write_short(savef, m->m_add_exp);
! 849: ur_write_monster_stats(savef, &m->m_stats);
! 850: }
! 851:
! 852: struct monster *
! 853: ur_read_monster(FILE *savef)
! 854: {
! 855: struct monster *m;
! 856: struct mstats *mstats;
! 857:
! 858: m = ur_alloc( sizeof(struct monster) );
! 859:
! 860: m->m_name = ur_read_string(savef);
! 861: m->m_carry = ur_read_short(savef);
! 862: m->m_normal = ur_read_int(savef);
! 863: m->m_wander = ur_read_int(savef);
! 864: m->m_appear = ur_read_char(savef);
! 865: m->m_intel = ur_read_string(savef);
! 866: ur_read(savef, &m->m_flags[0], 10*sizeof(long));
! 867: m->m_typesum = ur_read_string(savef);
! 868: m->m_numsum = ur_read_short(savef);
! 869: m->m_add_exp = ur_read_short(savef);
! 870:
! 871: mstats = ur_read_monster_stats(savef);
! 872:
! 873: m->m_stats = *mstats;
! 874: ur_free(mstats);
! 875:
! 876: return(m);
! 877: }
! 878:
! 879: void
! 880: ur_write_trap(FILE *savef, struct trap *t)
! 881: {
! 882: ur_write_long(savef, URS_TRAP);
! 883: ur_write_coord(savef, t->tr_pos);
! 884: ur_write_long(savef, t->tr_flags);
! 885: ur_write_char(savef, t->tr_type);
! 886: ur_write_char(savef, t->tr_show);
! 887: }
! 888:
! 889: struct trap *
! 890: ur_read_trap(FILE *savef)
! 891: {
! 892: struct trap *t;
! 893: long id;
! 894:
! 895: id = ur_read_long(savef);
! 896:
! 897: assert(id == URS_TRAP);
! 898:
! 899: t = ur_alloc( sizeof(struct trap));
! 900:
! 901: t->tr_pos = ur_read_coord(savef);
! 902: t->tr_flags = ur_read_long(savef);
! 903: t->tr_type = ur_read_char(savef);
! 904: t->tr_show = ur_read_char(savef);
! 905:
! 906: return(t);
! 907: }
! 908:
! 909: void
! 910: ur_write_stats(FILE *savef, struct stats *s)
! 911: {
! 912: ur_write_long(savef, URS_STATS);
! 913: ur_write_string(savef, s->s_dmg);
! 914: ur_write_long(savef, s->s_exp);
! 915: ur_write_int(savef, s->s_hpt);
! 916: ur_write_int(savef, s->s_pack);
! 917: ur_write_int(savef, s->s_carry);
! 918: ur_write_int(savef, s->s_lvl);
! 919: ur_write_int(savef, s->s_arm);
! 920: ur_write_int(savef, s->s_acmod);
! 921: ur_write_int(savef, s->s_power);
! 922: ur_write_int(savef, s->s_str);
! 923: ur_write_int(savef, s->s_intel);
! 924: ur_write_int(savef, s->s_wisdom);
! 925: ur_write_int(savef, s->s_dext);
! 926: ur_write_int(savef, s->s_const);
! 927: ur_write_int(savef, s->s_charisma);
! 928: }
! 929:
! 930: struct stats *
! 931: ur_read_stats(FILE *savef)
! 932: {
! 933: struct stats *s;
! 934: long id;
! 935:
! 936: id = ur_read_long(savef);
! 937:
! 938: assert(id == URS_STATS);
! 939:
! 940: s = ur_alloc(sizeof(struct stats));
! 941:
! 942: s->s_dmg = ur_read_string(savef);
! 943: s->s_exp = ur_read_long(savef);
! 944: s->s_hpt = ur_read_int(savef);
! 945: s->s_pack = ur_read_int(savef);
! 946: s->s_carry = ur_read_int(savef);
! 947: s->s_lvl = ur_read_int(savef);
! 948: s->s_arm = ur_read_int(savef);
! 949: s->s_acmod = ur_read_int(savef);
! 950: s->s_power = ur_read_int(savef);
! 951: s->s_str = ur_read_int(savef);
! 952: s->s_intel = ur_read_int(savef);
! 953: s->s_wisdom = ur_read_int(savef);
! 954: s->s_dext = ur_read_int(savef);
! 955: s->s_const = ur_read_int(savef);
! 956: s->s_charisma = ur_read_int(savef);
! 957:
! 958: return(s);
! 959: }
! 960:
! 961: void
! 962: ur_write_thing(FILE *savef, struct thing *t)
! 963: {
! 964: int i;
! 965:
! 966: ur_write_long(savef, URS_THING);
! 967: ur_write_bag(savef, t->t_pack);
! 968: ur_write_stats(savef, &t->t_stats);
! 969: ur_write_stats(savef, &t->maxstats);
! 970: ur_write_int(savef, t->t_ischasing);
! 971:
! 972: if (t->t_chasee == &player)
! 973: ur_write_long(savef, -1L);
! 974: else if (t->t_chasee == NULL)
! 975: ur_write_long(savef, 0L);
! 976: else
! 977: {
! 978: long m;
! 979:
! 980: m = find_thing_index(mlist, t->t_chasee);
! 981:
! 982: ur_write_long(savef,m);
! 983: }
! 984:
! 985: ur_write_long(savef, find_list_index(lvl_obj, t->t_horde));
! 986: ur_write_coord(savef, t->t_pos);
! 987: ur_write_coord(savef, t->t_oldpos);
! 988: ur_write_coord(savef, t->t_nxtpos);
! 989:
! 990: for(i = 0; i < 16; i++)
! 991: ur_write_long(savef, t->t_flags[i]);
! 992:
! 993: ur_write_int(savef, t->t_praycnt);
! 994: ur_write_int(savef, t->t_trans);
! 995: ur_write_int(savef, t->t_turn);
! 996: ur_write_int(savef, t->t_wasshot);
! 997: ur_write_int(savef, t->t_ctype);
! 998: ur_write_int(savef, t->t_index);
! 999: ur_write_int(savef, t->t_no_move);
! 1000: ur_write_int(savef, t->t_rest_hpt);
! 1001: ur_write_int(savef, t->t_rest_pow);
! 1002: ur_write_int(savef, t->t_doorgoal);
! 1003: ur_write_char(savef, t->t_type);
! 1004: ur_write_char(savef, t->t_disguise);
! 1005: ur_write_char(savef, t->t_oldch);
! 1006: }
! 1007:
! 1008: struct thing *
! 1009: ur_read_thing(FILE *savef)
! 1010: {
! 1011: long id;
! 1012: int i;
! 1013: struct thing *t;
! 1014: struct stats *s;
! 1015:
! 1016: id = ur_read_long(savef);
! 1017:
! 1018: assert(id == URS_THING);
! 1019:
! 1020: t = ur_alloc( sizeof(struct thing) );
! 1021:
! 1022: t->t_pack = ur_read_bag(savef);
! 1023:
! 1024: s = ur_read_stats(savef);
! 1025: t->t_stats = *s;
! 1026: ur_free(s);
! 1027:
! 1028: s = ur_read_stats(savef);
! 1029: t->maxstats = *s;
! 1030: ur_free(s);
! 1031:
! 1032: t->t_ischasing = ur_read_int(savef);
! 1033: t->chasee_index = ur_read_long(savef);
! 1034: t->horde_index = ur_read_long(savef);
! 1035: t->t_pos = ur_read_coord(savef);
! 1036: t->t_oldpos = ur_read_coord(savef);
! 1037: t->t_nxtpos = ur_read_coord(savef);
! 1038:
! 1039: for(i = 0; i < 16; i++)
! 1040: t->t_flags[i] = ur_read_long(savef);
! 1041:
! 1042: t->t_praycnt = ur_read_int(savef);
! 1043: t->t_trans = ur_read_int(savef);
! 1044: t->t_turn = ur_read_int(savef);
! 1045: t->t_wasshot = ur_read_int(savef);
! 1046: t->t_ctype = ur_read_int(savef);
! 1047: t->t_index = ur_read_int(savef);
! 1048: t->t_no_move = ur_read_int(savef);
! 1049: t->t_rest_hpt = ur_read_int(savef);
! 1050: t->t_rest_pow = ur_read_int(savef);
! 1051: t->t_doorgoal = ur_read_int(savef);
! 1052: t->t_type = ur_read_char(savef);
! 1053: t->t_disguise = ur_read_char(savef);
! 1054: t->t_oldch = ur_read_char(savef);
! 1055:
! 1056: return(t);
! 1057: }
! 1058:
! 1059: void
! 1060: ur_write_window(FILE *savef, WINDOW *win)
! 1061: {
! 1062: int i,j;
! 1063:
! 1064: ur_write_long(savef, URS_WINDOW);
! 1065:
! 1066: ur_write_int(savef, win->_maxy);
! 1067: ur_write_int(savef, win->_maxx);
! 1068:
! 1069: for(i=0; i < win->_maxy; i++)
! 1070: for(j = 0; j < win->_maxx; j++)
! 1071: ur_write_ulong(savef, mvwinch(win,i,j));
! 1072: }
! 1073:
! 1074: void
! 1075: ur_read_window(FILE *savef, WINDOW *win)
! 1076: {
! 1077: int i,j;
! 1078: int maxy, maxx;
! 1079: long id;
! 1080:
! 1081: id = ur_read_long(savef);
! 1082:
! 1083: assert(id == URS_WINDOW);
! 1084:
! 1085: maxy = ur_read_int(savef);
! 1086: maxx = ur_read_int(savef);
! 1087:
! 1088: for(i=0; i < maxy; i++)
! 1089: for(j = 0; j < maxx; j++)
! 1090: mvwaddch(win,i,j,ur_read_long(savef));
! 1091: }
! 1092:
! 1093: void
! 1094: ur_write_daemons(FILE *savef)
! 1095: {
! 1096: int i;
! 1097: int id=0;
! 1098:
! 1099: ur_write_long(savef, URS_DAEMONS);
! 1100:
! 1101: for(i = 0; i < MAXDAEMONS; i++)
! 1102: {
! 1103: ur_write_int(savef, d_list[i].d_type );
! 1104: ur_write_int(savef, d_list[i].d_when );
! 1105: ur_write_int(savef, d_list[i].d_id);
! 1106:
! 1107: if (d_list[i].d_id == FUSE_UNSUMMON)
! 1108: id = find_thing_index(mlist, d_list[i].d_arg);
! 1109:
! 1110: if (d_list[i].d_id == DAEMON_DOCTOR)
! 1111: id = find_thing_index(mlist, d_list[i].d_arg);
! 1112:
! 1113: ur_write_int(savef, id);
! 1114: ur_write_int(savef, d_list[i].d_time );
! 1115: }
! 1116: }
! 1117:
! 1118: void
! 1119: ur_read_daemons(FILE *savef)
! 1120: {
! 1121: long id;
! 1122: int i;
! 1123: demoncnt = 0;
! 1124:
! 1125: id = ur_read_long(savef);
! 1126:
! 1127: assert(id == URS_DAEMONS);
! 1128:
! 1129: for(i = 0; i < MAXDAEMONS; i++)
! 1130: {
! 1131: d_list[i].d_type = ur_read_int(savef);
! 1132: d_list[i].d_when = ur_read_int(savef);
! 1133: d_list[i].d_id = ur_read_int(savef);
! 1134: id = ur_read_int(savef);
! 1135: d_list[i].d_time = ur_read_int(savef);
! 1136:
! 1137: if ((d_list[i].d_type != EMPTY) && (d_list[i].d_id == FUSE_UNSUMMON))
! 1138: {
! 1139: d_list[i].d_arg = find_thing(mlist,id);
! 1140:
! 1141: if (d_list[i].d_arg == NULL)
! 1142: d_list[i].d_type = EMPTY;
! 1143: }
! 1144:
! 1145: if ((d_list[i].d_type != EMPTY) && (d_list[i].d_id == DAEMON_DOCTOR) )
! 1146: {
! 1147: if (id == 0)
! 1148: d_list[i].d_arg = &player;
! 1149: else
! 1150: d_list[i].d_arg = find_thing(mlist, id);
! 1151:
! 1152: if (d_list[i].d_arg == NULL)
! 1153: d_list[i].d_type = EMPTY;
! 1154: }
! 1155:
! 1156: if (d_list[i].d_type != EMPTY)
! 1157: demoncnt++;
! 1158: }
! 1159: }
! 1160:
! 1161: void
! 1162: save_file(FILE *savef)
! 1163: {
! 1164: int i,weapon,armor,ring=0,room= -1,monster;
! 1165:
! 1166: ur_write_string(savef, save_format);
! 1167:
! 1168: ur_write_string(savef,"\nScroll Names\n");
! 1169: for(i = 0; i < MAXSCROLLS; i++)
! 1170: ur_write_string(savef,s_names[i]);
! 1171:
! 1172: ur_write_string(savef,"\nPotion Colors\n");
! 1173: for(i = 0; i < MAXPOTIONS; i++)
! 1174: ur_write_string(savef,p_colors[i]);
! 1175:
! 1176: ur_write_string(savef,"\nRing Stones\n");
! 1177: for(i = 0; i < MAXRINGS; i++)
! 1178: ur_write_string(savef,r_stones[i]);
! 1179:
! 1180: ur_write_string(savef,"\nStick types\n");
! 1181: for(i = 0; i < MAXSTICKS; i++)
! 1182: ur_write_string(savef,ws_made[i]);
! 1183:
! 1184: ur_write_string(savef,"\nStick types\n");
! 1185: for(i = 0; i < MAXSTICKS; i++)
! 1186: ur_write_string(savef,ws_type[i]);
! 1187:
! 1188: ur_write_string(savef, "\nTraps on this level\n");
! 1189: ur_write_int(savef, MAXTRAPS);
! 1190: for(i = 0; i < MAXTRAPS; i++)
! 1191: ur_write_trap(savef, &traps[i]);
! 1192:
! 1193: ur_write_string(savef,"\nRooms on this level\n");
! 1194: ur_write_int(savef, MAXROOMS);
! 1195: for(i = 0; i < MAXROOMS; i++)
! 1196: {
! 1197: ur_write_room(savef, &rooms[i]);
! 1198:
! 1199: if (&rooms[i] == oldrp)
! 1200: room = i;
! 1201: }
! 1202: ur_write_int(savef,room); /* save for recovery of oldrp */
! 1203:
! 1204: ur_write_string(savef,"\nThe Rogue\n");
! 1205: ur_write_thing(savef, &player);
! 1206:
! 1207: ur_write_string(savef,"\nObjects on this level\n");
! 1208: ur_write_bag(savef, lvl_obj);
! 1209:
! 1210: ur_write_string(savef,"\nRogue's Familiar, if any \n");
! 1211: ur_write_monsters(savef, fam_ptr);
! 1212:
! 1213: ur_write_string(savef,"\nMonsters on this level\n");
! 1214: ur_write_monsters(savef, mlist);
! 1215:
! 1216: monster = find_thing_index(mlist, beast);
! 1217: ur_write_int(savef, monster);
! 1218:
! 1219: ur_write_string(savef,"\nItems in use by rogue\n");
! 1220: weapon = find_list_index(player.t_pack, cur_weapon);
! 1221: armor = find_list_index(player.t_pack, cur_armor);
! 1222: ur_write_int(savef, weapon);
! 1223: ur_write_int(savef, armor);
! 1224:
! 1225: for(i=0; i < 10; i++)
! 1226: {
! 1227: if (cur_ring[i] == NULL)
! 1228: ring = find_list_index(player.t_pack, cur_ring[i]);
! 1229:
! 1230: ur_write_int(savef, ring);
! 1231: }
! 1232:
! 1233: ur_write_string(savef,"\nActive Daemons and Fuses\n");
! 1234: ur_write_daemons(savef);
! 1235:
! 1236: ur_write_string(savef, "\nMisc\n");
! 1237:
! 1238: for(i = 0; i < 10; i++)
! 1239: ur_write_string(savef, msgbuf[i]);
! 1240:
! 1241: ur_write_int(savef, msg_index);
! 1242: ur_write_int(savef, foodlev);
! 1243: ur_write_int(savef, ntraps);
! 1244: ur_write_int(savef, dnum);
! 1245: ur_write_int(savef, max_level);
! 1246: ur_write_int(savef, lost_dext);
! 1247: ur_write_int(savef, no_command);
! 1248: ur_write_int(savef, level);
! 1249: ur_write_int(savef, see_dist);
! 1250: ur_write_int(savef, no_food);
! 1251: ur_write_int(savef, count);
! 1252: ur_write_int(savef, food_left);
! 1253: ur_write_int(savef, group);
! 1254: ur_write_int(savef, hungry_state);
! 1255: ur_write_int(savef, infest_dam);
! 1256: ur_write_int(savef, lost_str);
! 1257: ur_write_int(savef, hold_count);
! 1258: ur_write_int(savef, trap_tries);
! 1259: ur_write_int(savef, has_artifact);
! 1260: ur_write_int(savef, picked_artifact);
! 1261: ur_write_int(savef, luck);
! 1262: ur_write_int(savef, resurrect);
! 1263: ur_write_int(savef, fam_type);
! 1264: ur_write_int(savef, mons_summoned);
! 1265: ur_write_char(savef, PLAYER);
! 1266: ur_write_char(savef, take);
! 1267: ur_write_char(savef, runch);
! 1268: ur_write_int(savef, char_type);
! 1269: ur_write_int(savef, inv_type);
! 1270: ur_write_int(savef, pool_teleport);
! 1271: ur_write_int(savef, inwhgt);
! 1272: ur_write_int(savef, after);
! 1273: ur_write_int(savef, waswizard);
! 1274: ur_write_int(savef, canwizard);
! 1275: ur_write_int(savef, playing);
! 1276: ur_write_int(savef, running);
! 1277: ur_write_int(savef, fighting);
! 1278: ur_write_int(savef, wizard);
! 1279: ur_write_int(savef, wiz_verbose);
! 1280: ur_write_int(savef, moving);
! 1281: ur_write_coord(savef, delta);
! 1282: ur_write_int(savef, levtype);
! 1283: ur_write_int(savef, purse);
! 1284: ur_write_int(savef, total);
! 1285: ur_write_window(savef, cw);
! 1286: ur_write_window(savef, hw);
! 1287: ur_write_window(savef, mw);
! 1288: ur_write_window(savef, stdscr);
! 1289:
! 1290: ur_write_string(savef,"\nGame Options\n");
! 1291: ur_write_int(savef, terse);
! 1292: ur_write_int(savef, door_stop);
! 1293: ur_write_int(savef, doorstop);
! 1294: ur_write_int(savef, jump);
! 1295: ur_write_int(savef, firstmove);
! 1296: ur_write_int(savef, askme);
! 1297: ur_write_string(savef,whoami);
! 1298: ur_write_string(savef,fruit);
! 1299: ur_write_string(savef,file_name);
! 1300: ur_write_string(savef,score_file);
! 1301:
! 1302: ur_write_string(savef,"\nEnd of UltraRogue Game State\n");
! 1303: }
! 1304:
! 1305: #define DUMPSTRING { str = ur_read_string(savef); /*printf("%s",str);*/ ur_free(str); }
! 1306:
! 1307: int
! 1308: restore_file(FILE *savef)
! 1309: {
! 1310: int i,j;
! 1311: char *str;
! 1312: struct trap *t;
! 1313: struct room *r;
! 1314: struct thing *p;
! 1315:
! 1316: str = ur_read_string(savef);
! 1317:
! 1318: if (strcmp(str, save_format) != 0)
! 1319: {
! 1320: printf("Save Game Version: %s\n", str);
! 1321: printf("Real Game Version: %s\n", save_format);
! 1322: printf("Sorry, versions don't match.\n");
! 1323: return(FALSE);
! 1324: }
! 1325:
! 1326: DUMPSTRING
! 1327: for(i=0; i < MAXSCROLLS; i++)
! 1328: s_names[i] = ur_read_string(savef);
! 1329:
! 1330: DUMPSTRING
! 1331: for(i=0; i < MAXPOTIONS; i++)
! 1332: p_colors[i] = ur_read_string(savef);
! 1333:
! 1334: DUMPSTRING
! 1335: for(i=0; i < MAXRINGS; i++)
! 1336: r_stones[i] = ur_read_string(savef);
! 1337:
! 1338: DUMPSTRING
! 1339: for(i=0; i < MAXSTICKS; i++)
! 1340: ws_made[i] = ur_read_string(savef);
! 1341:
! 1342: DUMPSTRING
! 1343: for(i=0; i < MAXSTICKS; i++)
! 1344: ws_type[i] = ur_read_string(savef);
! 1345:
! 1346: DUMPSTRING
! 1347: i = ur_read_int(savef);
! 1348: assert(i == MAXTRAPS);
! 1349:
! 1350: for(i=0;i<MAXTRAPS;i++)
! 1351: {
! 1352: t = ur_read_trap(savef);
! 1353: traps[i] = *t;
! 1354: ur_free(t);
! 1355: }
! 1356:
! 1357: DUMPSTRING
! 1358: i = ur_read_int(savef);
! 1359: assert(i == MAXROOMS);
! 1360:
! 1361: for(i=0;i<MAXROOMS;i++)
! 1362: {
! 1363: r = ur_read_room(savef);
! 1364: rooms[i] = *r;
! 1365: ur_free(r);
! 1366: }
! 1367: i = ur_read_int(savef);
! 1368: oldrp = &rooms[i];
! 1369:
! 1370: DUMPSTRING
! 1371: p = ur_read_thing(savef);
! 1372: player = *p;
! 1373: ur_free(p);
! 1374:
! 1375: DUMPSTRING
! 1376: lvl_obj = ur_read_bag(savef);
! 1377:
! 1378: DUMPSTRING
! 1379: fam_ptr = ur_read_monsters(savef);
! 1380:
! 1381: DUMPSTRING
! 1382: mlist = ur_read_monsters(savef);
! 1383: i = ur_read_int(savef);
! 1384: beast = find_thing(mlist, i);
! 1385:
! 1386: ur_fixup_monsters(fam_ptr);
! 1387: ur_fixup_monsters(mlist);
! 1388:
! 1389: DUMPSTRING
! 1390: i = ur_read_int(savef);
! 1391: cur_weapon = find_object(player.t_pack, i);
! 1392:
! 1393: i = ur_read_int(savef);
! 1394: cur_armor = find_object(player.t_pack, i);
! 1395:
! 1396: for(j=0; j < 10; j++)
! 1397: {
! 1398: i = ur_read_int(savef);
! 1399: if (i == -1)
! 1400: cur_ring[j] = NULL;
! 1401: else
! 1402: cur_ring[j] = find_object(player.t_pack, i);
! 1403: }
! 1404:
! 1405: DUMPSTRING
! 1406: ur_read_daemons(savef);
! 1407:
! 1408: DUMPSTRING
! 1409: for(i = 0; i < 10; i++)
! 1410: {
! 1411: str = ur_read_string(savef);
! 1412: strcpy(&msgbuf[i][0],str);
! 1413: ur_free(str);
! 1414: }
! 1415:
! 1416: msg_index = ur_read_int(savef);
! 1417:
! 1418: foodlev = ur_read_int(savef);
! 1419: ntraps = ur_read_int(savef);
! 1420: dnum = ur_read_int(savef);
! 1421: max_level = ur_read_int(savef);
! 1422: lost_dext = ur_read_int(savef);
! 1423: no_command = ur_read_int(savef);
! 1424: level = ur_read_int(savef);
! 1425: see_dist = ur_read_int(savef);
! 1426: no_food = ur_read_int(savef);
! 1427: count = ur_read_int(savef);
! 1428: food_left = ur_read_int(savef);
! 1429: group = ur_read_int(savef);
! 1430: hungry_state = ur_read_int(savef);
! 1431: infest_dam = ur_read_int(savef);
! 1432: lost_str = ur_read_int(savef);
! 1433: hold_count = ur_read_int(savef);
! 1434: trap_tries = ur_read_int(savef);
! 1435: has_artifact = ur_read_int(savef);
! 1436: picked_artifact = ur_read_int(savef);
! 1437: luck = ur_read_int(savef);
! 1438: resurrect = ur_read_int(savef);
! 1439: fam_type = ur_read_int(savef);
! 1440: mons_summoned = ur_read_int(savef);
! 1441: PLAYER = ur_read_char(savef);
! 1442: take = ur_read_char(savef);
! 1443: runch = ur_read_char(savef);
! 1444: char_type = ur_read_int(savef);
! 1445: inv_type = ur_read_int(savef);
! 1446: pool_teleport = ur_read_int(savef);
! 1447: inwhgt = ur_read_int(savef);
! 1448: after = ur_read_int(savef);
! 1449: waswizard = ur_read_int(savef);
! 1450: canwizard = ur_read_int(savef);
! 1451: playing = ur_read_int(savef);
! 1452: running = ur_read_int(savef);
! 1453: fighting = ur_read_int(savef);
! 1454: wizard = ur_read_int(savef);
! 1455: wiz_verbose = ur_read_int(savef);
! 1456: moving = ur_read_int(savef);
! 1457: delta = ur_read_coord(savef);
! 1458: levtype = ur_read_int(savef);
! 1459: purse = ur_read_int(savef);
! 1460: total = ur_read_int(savef);
! 1461: ur_read_window(savef, cw);
! 1462: ur_read_window(savef, hw);
! 1463: ur_read_window(savef, mw);
! 1464: ur_read_window(savef, stdscr);
! 1465:
! 1466: DUMPSTRING
! 1467: terse = ur_read_int(savef);
! 1468: door_stop = ur_read_int(savef);
! 1469: doorstop = ur_read_int(savef);
! 1470: jump = ur_read_int(savef);
! 1471: firstmove = ur_read_int(savef);
! 1472: askme = ur_read_int(savef);
! 1473: str = ur_read_string(savef);
! 1474: strcpy(whoami,str);
! 1475: ur_free(str);
! 1476: str = ur_read_string(savef);
! 1477: strcpy(fruit,str);
! 1478: ur_free(str);
! 1479: str = ur_read_string(savef);
! 1480: // The file_name stored in the file no longer replaces its actual name.
! 1481: ur_free(str);
! 1482: str = ur_read_string(savef);
! 1483: if (!use_savedir)
! 1484: strcpy(score_file,str);
! 1485: ur_free(str);
! 1486:
! 1487: DUMPSTRING
! 1488: return(TRUE);
! 1489: }
! 1490:
! 1491:
CVSweb