Annotation of 43BSDReno/games/hack/hack.save.c, revision 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.