|
|
1.1 ! root 1: /* ! 2: * save.c ! 3: * ! 4: * This source herein may be modified and/or distributed by anybody who ! 5: * so desires, with the following restrictions: ! 6: * 1.) No portion of this notice shall be removed. ! 7: * 2.) Credit shall not be taken for the creation of this source. ! 8: * 3.) This code is not to be traded, sold, or used for personal ! 9: * gain or profit. ! 10: * ! 11: */ ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)save.c 5.1 (Berkeley) 11/25/87"; ! 15: #endif /* not lint */ ! 16: ! 17: #include <stdio.h> ! 18: #include "rogue.h" ! 19: ! 20: short write_failed = 0; ! 21: char *save_file = (char *) 0; ! 22: ! 23: extern boolean detect_monster; ! 24: extern short cur_level, max_level; ! 25: extern char hunger_str[]; ! 26: extern char login_name[]; ! 27: extern short party_room; ! 28: extern short foods; ! 29: extern boolean is_wood[]; ! 30: extern short cur_room; ! 31: extern boolean being_held; ! 32: extern short bear_trap; ! 33: extern short halluc; ! 34: extern short blind; ! 35: extern short confused; ! 36: extern short levitate; ! 37: extern short haste_self; ! 38: extern boolean see_invisible; ! 39: extern boolean detect_monster; ! 40: extern boolean wizard; ! 41: extern boolean score_only; ! 42: extern short m_moves; ! 43: ! 44: extern boolean msg_cleared; ! 45: ! 46: save_game() ! 47: { ! 48: char fname[64]; ! 49: ! 50: if (!get_input_line("file name?", save_file, fname, "game not saved", ! 51: 0, 1)) { ! 52: return; ! 53: } ! 54: check_message(); ! 55: message(fname, 0); ! 56: save_into_file(fname); ! 57: } ! 58: ! 59: save_into_file(sfile) ! 60: char *sfile; ! 61: { ! 62: FILE *fp; ! 63: int file_id; ! 64: char name_buffer[80]; ! 65: char *hptr; ! 66: struct rogue_time rt_buf; ! 67: ! 68: if (sfile[0] == '~') { ! 69: if (hptr = md_getenv("HOME")) { ! 70: (void) strcpy(name_buffer, hptr); ! 71: (void) strcat(name_buffer, sfile+1); ! 72: sfile = name_buffer; ! 73: } ! 74: } ! 75: if ( ((fp = fopen(sfile, "w")) == NULL) || ! 76: ((file_id = md_get_file_id(sfile)) == -1)) { ! 77: message("problem accessing the save file", 0); ! 78: return; ! 79: } ! 80: md_ignore_signals(); ! 81: write_failed = 0; ! 82: (void) xxx(1); ! 83: r_write(fp, (char *) &detect_monster, sizeof(detect_monster)); ! 84: r_write(fp, (char *) &cur_level, sizeof(cur_level)); ! 85: r_write(fp, (char *) &max_level, sizeof(max_level)); ! 86: write_string(hunger_str, fp); ! 87: write_string(login_name, fp); ! 88: r_write(fp, (char *) &party_room, sizeof(party_room)); ! 89: write_pack(&level_monsters, fp); ! 90: write_pack(&level_objects, fp); ! 91: r_write(fp, (char *) &file_id, sizeof(file_id)); ! 92: rw_dungeon(fp, 1); ! 93: r_write(fp, (char *) &foods, sizeof(foods)); ! 94: r_write(fp, (char *) &rogue, sizeof(fighter)); ! 95: write_pack(&rogue.pack, fp); ! 96: rw_id(id_potions, fp, POTIONS, 1); ! 97: rw_id(id_scrolls, fp, SCROLS, 1); ! 98: rw_id(id_wands, fp, WANDS, 1); ! 99: rw_id(id_rings, fp, RINGS, 1); ! 100: r_write(fp, (char *) traps, (MAX_TRAPS * sizeof(trap))); ! 101: r_write(fp, (char *) is_wood, (WANDS * sizeof(boolean))); ! 102: r_write(fp, (char *) &cur_room, sizeof(cur_room)); ! 103: rw_rooms(fp, 1); ! 104: r_write(fp, (char *) &being_held, sizeof(being_held)); ! 105: r_write(fp, (char *) &bear_trap, sizeof(bear_trap)); ! 106: r_write(fp, (char *) &halluc, sizeof(halluc)); ! 107: r_write(fp, (char *) &blind, sizeof(blind)); ! 108: r_write(fp, (char *) &confused, sizeof(confused)); ! 109: r_write(fp, (char *) &levitate, sizeof(levitate)); ! 110: r_write(fp, (char *) &haste_self, sizeof(haste_self)); ! 111: r_write(fp, (char *) &see_invisible, sizeof(see_invisible)); ! 112: r_write(fp, (char *) &detect_monster, sizeof(detect_monster)); ! 113: r_write(fp, (char *) &wizard, sizeof(wizard)); ! 114: r_write(fp, (char *) &score_only, sizeof(score_only)); ! 115: r_write(fp, (char *) &m_moves, sizeof(m_moves)); ! 116: md_gct(&rt_buf); ! 117: rt_buf.second += 10; /* allow for some processing time */ ! 118: r_write(fp, (char *) &rt_buf, sizeof(rt_buf)); ! 119: fclose(fp); ! 120: ! 121: if (write_failed) { ! 122: (void) md_df(sfile); /* delete file */ ! 123: } else { ! 124: clean_up(""); ! 125: } ! 126: } ! 127: ! 128: restore(fname) ! 129: char *fname; ! 130: { ! 131: FILE *fp; ! 132: struct rogue_time saved_time, mod_time; ! 133: char buf[4]; ! 134: char tbuf[40]; ! 135: int new_file_id, saved_file_id; ! 136: ! 137: if ( ((new_file_id = md_get_file_id(fname)) == -1) || ! 138: ((fp = fopen(fname, "r")) == NULL)) { ! 139: clean_up("cannot open file"); ! 140: } ! 141: if (md_link_count(fname) > 1) { ! 142: clean_up("file has link"); ! 143: } ! 144: (void) xxx(1); ! 145: r_read(fp, (char *) &detect_monster, sizeof(detect_monster)); ! 146: r_read(fp, (char *) &cur_level, sizeof(cur_level)); ! 147: r_read(fp, (char *) &max_level, sizeof(max_level)); ! 148: read_string(hunger_str, fp); ! 149: ! 150: (void) strcpy(tbuf, login_name); ! 151: read_string(login_name, fp); ! 152: if (strcmp(tbuf, login_name)) { ! 153: clean_up("you're not the original player"); ! 154: } ! 155: ! 156: r_read(fp, (char *) &party_room, sizeof(party_room)); ! 157: read_pack(&level_monsters, fp, 0); ! 158: read_pack(&level_objects, fp, 0); ! 159: r_read(fp, (char *) &saved_file_id, sizeof(saved_file_id)); ! 160: if (new_file_id != saved_file_id) { ! 161: clean_up("sorry, saved game is not in the same file"); ! 162: } ! 163: rw_dungeon(fp, 0); ! 164: r_read(fp, (char *) &foods, sizeof(foods)); ! 165: r_read(fp, (char *) &rogue, sizeof(fighter)); ! 166: read_pack(&rogue.pack, fp, 1); ! 167: rw_id(id_potions, fp, POTIONS, 0); ! 168: rw_id(id_scrolls, fp, SCROLS, 0); ! 169: rw_id(id_wands, fp, WANDS, 0); ! 170: rw_id(id_rings, fp, RINGS, 0); ! 171: r_read(fp, (char *) traps, (MAX_TRAPS * sizeof(trap))); ! 172: r_read(fp, (char *) is_wood, (WANDS * sizeof(boolean))); ! 173: r_read(fp, (char *) &cur_room, sizeof(cur_room)); ! 174: rw_rooms(fp, 0); ! 175: r_read(fp, (char *) &being_held, sizeof(being_held)); ! 176: r_read(fp, (char *) &bear_trap, sizeof(bear_trap)); ! 177: r_read(fp, (char *) &halluc, sizeof(halluc)); ! 178: r_read(fp, (char *) &blind, sizeof(blind)); ! 179: r_read(fp, (char *) &confused, sizeof(confused)); ! 180: r_read(fp, (char *) &levitate, sizeof(levitate)); ! 181: r_read(fp, (char *) &haste_self, sizeof(haste_self)); ! 182: r_read(fp, (char *) &see_invisible, sizeof(see_invisible)); ! 183: r_read(fp, (char *) &detect_monster, sizeof(detect_monster)); ! 184: r_read(fp, (char *) &wizard, sizeof(wizard)); ! 185: r_read(fp, (char *) &score_only, sizeof(score_only)); ! 186: r_read(fp, (char *) &m_moves, sizeof(m_moves)); ! 187: r_read(fp, (char *) &saved_time, sizeof(saved_time)); ! 188: ! 189: if (fread(buf, sizeof(char), 1, fp) > 0) { ! 190: clear(); ! 191: clean_up("extra characters in file"); ! 192: } ! 193: ! 194: md_gfmt(fname, &mod_time); /* get file modification time */ ! 195: ! 196: if (has_been_touched(&saved_time, &mod_time)) { ! 197: clear(); ! 198: clean_up("sorry, file has been touched"); ! 199: } ! 200: if ((!wizard) && !md_df(fname)) { ! 201: clean_up("cannot delete file"); ! 202: } ! 203: msg_cleared = 0; ! 204: ring_stats(0); ! 205: fclose(fp); ! 206: } ! 207: ! 208: write_pack(pack, fp) ! 209: object *pack; ! 210: FILE *fp; ! 211: { ! 212: object t; ! 213: ! 214: while (pack = pack->next_object) { ! 215: r_write(fp, (char *) pack, sizeof(object)); ! 216: } ! 217: t.ichar = t.what_is = 0; ! 218: r_write(fp, (char *) &t, sizeof(object)); ! 219: } ! 220: ! 221: read_pack(pack, fp, is_rogue) ! 222: object *pack; ! 223: FILE *fp; ! 224: boolean is_rogue; ! 225: { ! 226: object read_obj, *new_obj; ! 227: ! 228: for (;;) { ! 229: r_read(fp, (char *) &read_obj, sizeof(object)); ! 230: if (read_obj.ichar == 0) { ! 231: pack->next_object = (object *) 0; ! 232: break; ! 233: } ! 234: new_obj = alloc_object(); ! 235: *new_obj = read_obj; ! 236: if (is_rogue) { ! 237: if (new_obj->in_use_flags & BEING_WORN) { ! 238: do_wear(new_obj); ! 239: } else if (new_obj->in_use_flags & BEING_WIELDED) { ! 240: do_wield(new_obj); ! 241: } else if (new_obj->in_use_flags & (ON_EITHER_HAND)) { ! 242: do_put_on(new_obj, ! 243: ((new_obj->in_use_flags & ON_LEFT_HAND) ? 1 : 0)); ! 244: } ! 245: } ! 246: pack->next_object = new_obj; ! 247: pack = new_obj; ! 248: } ! 249: } ! 250: ! 251: rw_dungeon(fp, rw) ! 252: FILE *fp; ! 253: boolean rw; ! 254: { ! 255: short i, j; ! 256: char buf[DCOLS]; ! 257: ! 258: for (i = 0; i < DROWS; i++) { ! 259: if (rw) { ! 260: r_write(fp, (char *) dungeon[i], (DCOLS * sizeof(dungeon[0][0]))); ! 261: for (j = 0; j < DCOLS; j++) { ! 262: buf[j] = mvinch(i, j); ! 263: } ! 264: r_write(fp, buf, DCOLS); ! 265: } else { ! 266: r_read(fp, (char *) dungeon[i], (DCOLS * sizeof(dungeon[0][0]))); ! 267: r_read(fp, buf, DCOLS); ! 268: for (j = 0; j < DCOLS; j++) { ! 269: mvaddch(i, j, buf[j]); ! 270: } ! 271: } ! 272: } ! 273: } ! 274: ! 275: rw_id(id_table, fp, n, wr) ! 276: struct id id_table[]; ! 277: FILE *fp; ! 278: int n; ! 279: boolean wr; ! 280: { ! 281: short i; ! 282: ! 283: for (i = 0; i < n; i++) { ! 284: if (wr) { ! 285: r_write(fp, (char *) &(id_table[i].value), sizeof(short)); ! 286: r_write(fp, (char *) &(id_table[i].id_status), ! 287: sizeof(unsigned short)); ! 288: write_string(id_table[i].title, fp); ! 289: } else { ! 290: r_read(fp, (char *) &(id_table[i].value), sizeof(short)); ! 291: r_read(fp, (char *) &(id_table[i].id_status), ! 292: sizeof(unsigned short)); ! 293: read_string(id_table[i].title, fp); ! 294: } ! 295: } ! 296: } ! 297: ! 298: write_string(s, fp) ! 299: char *s; ! 300: FILE *fp; ! 301: { ! 302: short n; ! 303: ! 304: n = strlen(s) + 1; ! 305: xxxx(s, n); ! 306: r_write(fp, (char *) &n, sizeof(short)); ! 307: r_write(fp, s, n); ! 308: } ! 309: ! 310: read_string(s, fp) ! 311: char *s; ! 312: FILE *fp; ! 313: { ! 314: short n; ! 315: ! 316: r_read(fp, (char *) &n, sizeof(short)); ! 317: r_read(fp, s, n); ! 318: xxxx(s, n); ! 319: } ! 320: ! 321: rw_rooms(fp, rw) ! 322: FILE *fp; ! 323: boolean rw; ! 324: { ! 325: short i; ! 326: ! 327: for (i = 0; i < MAXROOMS; i++) { ! 328: rw ? r_write(fp, (char *) (rooms + i), sizeof(room)) : ! 329: r_read(fp, (char *) (rooms + i), sizeof(room)); ! 330: } ! 331: } ! 332: ! 333: r_read(fp, buf, n) ! 334: FILE *fp; ! 335: char *buf; ! 336: int n; ! 337: { ! 338: if (fread(buf, sizeof(char), n, fp) != n) { ! 339: clean_up("read() failed, don't know why"); ! 340: } ! 341: } ! 342: ! 343: r_write(fp, buf, n) ! 344: FILE *fp; ! 345: char *buf; ! 346: int n; ! 347: { ! 348: if (!write_failed) { ! 349: if (fwrite(buf, sizeof(char), n, fp) != n) { ! 350: message("write() failed, don't know why", 0); ! 351: sound_bell(); ! 352: write_failed = 1; ! 353: } ! 354: } ! 355: } ! 356: ! 357: boolean ! 358: has_been_touched(saved_time, mod_time) ! 359: struct rogue_time *saved_time, *mod_time; ! 360: { ! 361: if (saved_time->year < mod_time->year) { ! 362: return(1); ! 363: } else if (saved_time->year > mod_time->year) { ! 364: return(0); ! 365: } ! 366: if (saved_time->month < mod_time->month) { ! 367: return(1); ! 368: } else if (saved_time->month > mod_time->month) { ! 369: return(0); ! 370: } ! 371: if (saved_time->day < mod_time->day) { ! 372: return(1); ! 373: } else if (saved_time->day > mod_time->day) { ! 374: return(0); ! 375: } ! 376: if (saved_time->hour < mod_time->hour) { ! 377: return(1); ! 378: } else if (saved_time->hour > mod_time->hour) { ! 379: return(0); ! 380: } ! 381: if (saved_time->minute < mod_time->minute) { ! 382: return(1); ! 383: } else if (saved_time->minute > mod_time->minute) { ! 384: return(0); ! 385: } ! 386: if (saved_time->second < mod_time->second) { ! 387: return(1); ! 388: } ! 389: return(0); ! 390: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.