Annotation of 43BSDReno/games/rogue/save.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.