Annotation of 43BSDTahoe/games/hack/hack.save.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                      2: /* hack.save.c - version 1.0.3 */
                      3: 
                      4: #include "hack.h"
                      5: extern char genocided[60];     /* defined in Decl.c */
                      6: extern char fut_geno[60];      /* idem */
                      7: #include <signal.h>
                      8: 
                      9: extern char SAVEF[], nul[];
                     10: extern char pl_character[PL_CSIZ];
                     11: extern long lseek();
                     12: extern struct obj *restobjchn();
                     13: extern struct monst *restmonchn();
                     14: 
                     15: dosave(){
                     16:        if(dosave0(0)) {
                     17:                settty("Be seeing you ...\n");
                     18:                exit(0);
                     19:        }
                     20: #ifdef lint
                     21:        return(0);
                     22: #endif lint
                     23: }
                     24: 
                     25: #ifndef NOSAVEONHANGUP
                     26: hangup(){
                     27:        (void) dosave0(1);
                     28:        exit(1);
                     29: }
                     30: #endif NOSAVEONHANGUP
                     31: 
                     32: /* returns 1 if save successful */
                     33: dosave0(hu) int hu; {
                     34:        register fd, ofd;
                     35:        int tmp;                /* not register ! */
                     36: 
                     37:        (void) signal(SIGHUP, SIG_IGN);
                     38:        (void) signal(SIGINT, SIG_IGN);
                     39:        if((fd = creat(SAVEF, FMASK)) < 0) {
                     40:                if(!hu) pline("Cannot open save file. (Continue or Quit)");
                     41:                (void) unlink(SAVEF);           /* ab@unido */
                     42:                return(0);
                     43:        }
                     44:        if(flags.moonphase == FULL_MOON)        /* ut-sally!fletcher */
                     45:                u.uluck--;                      /* and unido!ab */
                     46:        savelev(fd,dlevel);
                     47:        saveobjchn(fd, invent);
                     48:        saveobjchn(fd, fcobj);
                     49:        savemonchn(fd, fallen_down);
                     50:        tmp = getuid();
                     51:        bwrite(fd, (char *) &tmp, sizeof tmp);
                     52:        bwrite(fd, (char *) &flags, sizeof(struct flag));
                     53:        bwrite(fd, (char *) &dlevel, sizeof dlevel);
                     54:        bwrite(fd, (char *) &maxdlevel, sizeof maxdlevel);
                     55:        bwrite(fd, (char *) &moves, sizeof moves);
                     56:        bwrite(fd, (char *) &u, sizeof(struct you));
                     57:        if(u.ustuck)
                     58:                bwrite(fd, (char *) &(u.ustuck->m_id), sizeof u.ustuck->m_id);
                     59:        bwrite(fd, (char *) pl_character, sizeof pl_character);
                     60:        bwrite(fd, (char *) genocided, sizeof genocided);
                     61:        bwrite(fd, (char *) fut_geno, sizeof fut_geno);
                     62:        savenames(fd);
                     63:        for(tmp = 1; tmp <= maxdlevel; tmp++) {
                     64:                extern int hackpid;
                     65:                extern boolean level_exists[];
                     66: 
                     67:                if(tmp == dlevel || !level_exists[tmp]) continue;
                     68:                glo(tmp);
                     69:                if((ofd = open(lock, 0)) < 0) {
                     70:                    if(!hu) pline("Error while saving: cannot read %s.", lock);
                     71:                    (void) close(fd);
                     72:                    (void) unlink(SAVEF);
                     73:                    if(!hu) done("tricked");
                     74:                    return(0);
                     75:                }
                     76:                getlev(ofd, hackpid, tmp);
                     77:                (void) close(ofd);
                     78:                bwrite(fd, (char *) &tmp, sizeof tmp);  /* level number */
                     79:                savelev(fd,tmp);                        /* actual level */
                     80:                (void) unlink(lock);
                     81:        }
                     82:        (void) close(fd);
                     83:        glo(dlevel);
                     84:        (void) unlink(lock);    /* get rid of current level --jgm */
                     85:        glo(0);
                     86:        (void) unlink(lock);
                     87:        return(1);
                     88: }
                     89: 
                     90: dorecover(fd)
                     91: register fd;
                     92: {
                     93:        register nfd;
                     94:        int tmp;                /* not a register ! */
                     95:        unsigned mid;           /* idem */
                     96:        struct obj *otmp;
                     97:        extern boolean restoring;
                     98: 
                     99:        restoring = TRUE;
                    100:        getlev(fd, 0, 0);
                    101:        invent = restobjchn(fd);
                    102:        for(otmp = invent; otmp; otmp = otmp->nobj)
                    103:                if(otmp->owornmask)
                    104:                        setworn(otmp, otmp->owornmask);
                    105:        fcobj = restobjchn(fd);
                    106:        fallen_down = restmonchn(fd);
                    107:        mread(fd, (char *) &tmp, sizeof tmp);
                    108:        if(tmp != getuid()) {           /* strange ... */
                    109:                (void) close(fd);
                    110:                (void) unlink(SAVEF);
                    111:                puts("Saved game was not yours.");
                    112:                restoring = FALSE;
                    113:                return(0);
                    114:        }
                    115:        mread(fd, (char *) &flags, sizeof(struct flag));
                    116:        mread(fd, (char *) &dlevel, sizeof dlevel);
                    117:        mread(fd, (char *) &maxdlevel, sizeof maxdlevel);
                    118:        mread(fd, (char *) &moves, sizeof moves);
                    119:        mread(fd, (char *) &u, sizeof(struct you));
                    120:        if(u.ustuck)
                    121:                mread(fd, (char *) &mid, sizeof mid);
                    122:        mread(fd, (char *) pl_character, sizeof pl_character);
                    123:        mread(fd, (char *) genocided, sizeof genocided);
                    124:        mread(fd, (char *) fut_geno, sizeof fut_geno);
                    125:        restnames(fd);
                    126:        while(1) {
                    127:                if(read(fd, (char *) &tmp, sizeof tmp) != sizeof tmp)
                    128:                        break;
                    129:                getlev(fd, 0, tmp);
                    130:                glo(tmp);
                    131:                if((nfd = creat(lock, FMASK)) < 0)
                    132:                        panic("Cannot open temp file %s!\n", lock);
                    133:                savelev(nfd,tmp);
                    134:                (void) close(nfd);
                    135:        }
                    136:        (void) lseek(fd, 0L, 0);
                    137:        getlev(fd, 0, 0);
                    138:        (void) close(fd);
                    139:        (void) unlink(SAVEF);
                    140:        if(Punished) {
                    141:                for(otmp = fobj; otmp; otmp = otmp->nobj)
                    142:                        if(otmp->olet == CHAIN_SYM) goto chainfnd;
                    143:                panic("Cannot find the iron chain?");
                    144:        chainfnd:
                    145:                uchain = otmp;
                    146:                if(!uball){
                    147:                        for(otmp = fobj; otmp; otmp = otmp->nobj)
                    148:                                if(otmp->olet == BALL_SYM && otmp->spe)
                    149:                                        goto ballfnd;
                    150:                        panic("Cannot find the iron ball?");
                    151:                ballfnd:
                    152:                        uball = otmp;
                    153:                }
                    154:        }
                    155:        if(u.ustuck) {
                    156:                register struct monst *mtmp;
                    157: 
                    158:                for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
                    159:                        if(mtmp->m_id == mid) goto monfnd;
                    160:                panic("Cannot find the monster ustuck.");
                    161:        monfnd:
                    162:                u.ustuck = mtmp;
                    163:        }
                    164: #ifndef QUEST
                    165:        setsee();  /* only to recompute seelx etc. - these weren't saved */
                    166: #endif QUEST
                    167:        docrt();
                    168:        restoring = FALSE;
                    169:        return(1);
                    170: }
                    171: 
                    172: struct obj *
                    173: restobjchn(fd)
                    174: register fd;
                    175: {
                    176:        register struct obj *otmp, *otmp2;
                    177:        register struct obj *first = 0;
                    178:        int xl;
                    179: #ifdef lint
                    180:        /* suppress "used before set" warning from lint */
                    181:        otmp2 = 0;
                    182: #endif lint
                    183:        while(1) {
                    184:                mread(fd, (char *) &xl, sizeof(xl));
                    185:                if(xl == -1) break;
                    186:                otmp = newobj(xl);
                    187:                if(!first) first = otmp;
                    188:                else otmp2->nobj = otmp;
                    189:                mread(fd, (char *) otmp, (unsigned) xl + sizeof(struct obj));
                    190:                if(!otmp->o_id) otmp->o_id = flags.ident++;
                    191:                otmp2 = otmp;
                    192:        }
                    193:        if(first && otmp2->nobj){
                    194:                impossible("Restobjchn: error reading objchn.");
                    195:                otmp2->nobj = 0;
                    196:        }
                    197:        return(first);
                    198: }
                    199: 
                    200: struct monst *
                    201: restmonchn(fd)
                    202: register fd;
                    203: {
                    204:        register struct monst *mtmp, *mtmp2;
                    205:        register struct monst *first = 0;
                    206:        int xl;
                    207: 
                    208:        struct permonst *monbegin;
                    209:        long differ;
                    210: 
                    211:        mread(fd, (char *)&monbegin, sizeof(monbegin));
                    212:        differ = (char *)(&mons[0]) - (char *)(monbegin);
                    213: 
                    214: #ifdef lint
                    215:        /* suppress "used before set" warning from lint */
                    216:        mtmp2 = 0;
                    217: #endif lint
                    218:        while(1) {
                    219:                mread(fd, (char *) &xl, sizeof(xl));
                    220:                if(xl == -1) break;
                    221:                mtmp = newmonst(xl);
                    222:                if(!first) first = mtmp;
                    223:                else mtmp2->nmon = mtmp;
                    224:                mread(fd, (char *) mtmp, (unsigned) xl + sizeof(struct monst));
                    225:                if(!mtmp->m_id)
                    226:                        mtmp->m_id = flags.ident++;
                    227:                mtmp->data = (struct permonst *)
                    228:                        ((char *) mtmp->data + differ);
                    229:                if(mtmp->minvent)
                    230:                        mtmp->minvent = restobjchn(fd);
                    231:                mtmp2 = mtmp;
                    232:        }
                    233:        if(first && mtmp2->nmon){
                    234:                impossible("Restmonchn: error reading monchn.");
                    235:                mtmp2->nmon = 0;
                    236:        }
                    237:        return(first);
                    238: }

unix.superglobalmegacorp.com

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