Annotation of 43BSDReno/games/hack/hack.lev.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                      2: /* hack.lev.c - version 1.0.3 */
                      3: 
                      4: #include "hack.h"
                      5: #include "def.mkroom.h"
                      6: #include <stdio.h>
                      7: extern struct monst *restmonchn();
                      8: extern struct obj *restobjchn();
                      9: extern struct obj *billobjs;
                     10: extern char *itoa();
                     11: extern char SAVEF[];
                     12: extern int hackpid;
                     13: extern xchar dlevel;
                     14: extern char nul[];
                     15: 
                     16: #ifndef NOWORM
                     17: #include       "def.wseg.h"
                     18: extern struct wseg *wsegs[32], *wheads[32];
                     19: extern long wgrowtime[32];
                     20: #endif NOWORM
                     21: 
                     22: boolean level_exists[MAXLEVEL+1];
                     23: 
                     24: savelev(fd,lev)
                     25: int fd;
                     26: xchar lev;
                     27: {
                     28: #ifndef NOWORM
                     29:        register struct wseg *wtmp, *wtmp2;
                     30:        register tmp;
                     31: #endif NOWORM
                     32: 
                     33:        if(fd < 0) panic("Save on bad file!");  /* impossible */
                     34:        if(lev >= 0 && lev <= MAXLEVEL)
                     35:                level_exists[lev] = TRUE;
                     36: 
                     37:        bwrite(fd,(char *) &hackpid,sizeof(hackpid));
                     38:        bwrite(fd,(char *) &lev,sizeof(lev));
                     39:        bwrite(fd,(char *) levl,sizeof(levl));
                     40:        bwrite(fd,(char *) &moves,sizeof(long));
                     41:        bwrite(fd,(char *) &xupstair,sizeof(xupstair));
                     42:        bwrite(fd,(char *) &yupstair,sizeof(yupstair));
                     43:        bwrite(fd,(char *) &xdnstair,sizeof(xdnstair));
                     44:        bwrite(fd,(char *) &ydnstair,sizeof(ydnstair));
                     45:        savemonchn(fd, fmon);
                     46:        savegoldchn(fd, fgold);
                     47:        savetrapchn(fd, ftrap);
                     48:        saveobjchn(fd, fobj);
                     49:        saveobjchn(fd, billobjs);
                     50:        billobjs = 0;
                     51:        save_engravings(fd);
                     52: #ifndef QUEST
                     53:        bwrite(fd,(char *) rooms,sizeof(rooms));
                     54:        bwrite(fd,(char *) doors,sizeof(doors));
                     55: #endif QUEST
                     56:        fgold = 0;
                     57:        ftrap = 0;
                     58:        fmon = 0;
                     59:        fobj = 0;
                     60: #ifndef NOWORM
                     61:        bwrite(fd,(char *) wsegs,sizeof(wsegs));
                     62:        for(tmp=1; tmp<32; tmp++){
                     63:                for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2){
                     64:                        wtmp2 = wtmp->nseg;
                     65:                        bwrite(fd,(char *) wtmp,sizeof(struct wseg));
                     66:                }
                     67:                wsegs[tmp] = 0;
                     68:        }
                     69:        bwrite(fd,(char *) wgrowtime,sizeof(wgrowtime));
                     70: #endif NOWORM
                     71: }
                     72: 
                     73: bwrite(fd,loc,num)
                     74: register fd;
                     75: register char *loc;
                     76: register unsigned num;
                     77: {
                     78: /* lint wants the 3rd arg of write to be an int; lint -p an unsigned */
                     79:        if(write(fd, loc, (int) num) != num)
                     80:                panic("cannot write %u bytes to file #%d", num, fd);
                     81: }
                     82: 
                     83: saveobjchn(fd,otmp)
                     84: register fd;
                     85: register struct obj *otmp;
                     86: {
                     87:        register struct obj *otmp2;
                     88:        unsigned xl;
                     89:        int minusone = -1;
                     90: 
                     91:        while(otmp) {
                     92:                otmp2 = otmp->nobj;
                     93:                xl = otmp->onamelth;
                     94:                bwrite(fd, (char *) &xl, sizeof(int));
                     95:                bwrite(fd, (char *) otmp, xl + sizeof(struct obj));
                     96:                free((char *) otmp);
                     97:                otmp = otmp2;
                     98:        }
                     99:        bwrite(fd, (char *) &minusone, sizeof(int));
                    100: }
                    101: 
                    102: savemonchn(fd,mtmp)
                    103: register fd;
                    104: register struct monst *mtmp;
                    105: {
                    106:        register struct monst *mtmp2;
                    107:        unsigned xl;
                    108:        int minusone = -1;
                    109:        struct permonst *monbegin = &mons[0];
                    110: 
                    111:        bwrite(fd, (char *) &monbegin, sizeof(monbegin));
                    112: 
                    113:        while(mtmp) {
                    114:                mtmp2 = mtmp->nmon;
                    115:                xl = mtmp->mxlth + mtmp->mnamelth;
                    116:                bwrite(fd, (char *) &xl, sizeof(int));
                    117:                bwrite(fd, (char *) mtmp, xl + sizeof(struct monst));
                    118:                if(mtmp->minvent) saveobjchn(fd,mtmp->minvent);
                    119:                free((char *) mtmp);
                    120:                mtmp = mtmp2;
                    121:        }
                    122:        bwrite(fd, (char *) &minusone, sizeof(int));
                    123: }
                    124: 
                    125: savegoldchn(fd,gold)
                    126: register fd;
                    127: register struct gold *gold;
                    128: {
                    129:        register struct gold *gold2;
                    130:        while(gold) {
                    131:                gold2 = gold->ngold;
                    132:                bwrite(fd, (char *) gold, sizeof(struct gold));
                    133:                free((char *) gold);
                    134:                gold = gold2;
                    135:        }
                    136:        bwrite(fd, nul, sizeof(struct gold));
                    137: }
                    138: 
                    139: savetrapchn(fd,trap)
                    140: register fd;
                    141: register struct trap *trap;
                    142: {
                    143:        register struct trap *trap2;
                    144:        while(trap) {
                    145:                trap2 = trap->ntrap;
                    146:                bwrite(fd, (char *) trap, sizeof(struct trap));
                    147:                free((char *) trap);
                    148:                trap = trap2;
                    149:        }
                    150:        bwrite(fd, nul, sizeof(struct trap));
                    151: }
                    152: 
                    153: getlev(fd,pid,lev)
                    154: int fd,pid;
                    155: xchar lev;
                    156: {
                    157:        register struct gold *gold;
                    158:        register struct trap *trap;
                    159: #ifndef NOWORM
                    160:        register struct wseg *wtmp;
                    161: #endif NOWORM
                    162:        register tmp;
                    163:        long omoves;
                    164:        int hpid;
                    165:        xchar dlvl;
                    166: 
                    167:        /* First some sanity checks */
                    168:        mread(fd, (char *) &hpid, sizeof(hpid));
                    169:        mread(fd, (char *) &dlvl, sizeof(dlvl));
                    170:        if((pid && pid != hpid) || (lev && dlvl != lev)) {
                    171:                pline("Strange, this map is not as I remember it.");
                    172:                pline("Somebody is trying some trickery here ...");
                    173:                pline("This game is void ...");
                    174:                done("tricked");
                    175:        }
                    176: 
                    177:        fgold = 0;
                    178:        ftrap = 0;
                    179:        mread(fd, (char *) levl, sizeof(levl));
                    180:        mread(fd, (char *)&omoves, sizeof(omoves));
                    181:        mread(fd, (char *)&xupstair, sizeof(xupstair));
                    182:        mread(fd, (char *)&yupstair, sizeof(yupstair));
                    183:        mread(fd, (char *)&xdnstair, sizeof(xdnstair));
                    184:        mread(fd, (char *)&ydnstair, sizeof(ydnstair));
                    185: 
                    186:        fmon = restmonchn(fd);
                    187: 
                    188:        /* regenerate animals while on another level */
                    189:        { long tmoves = (moves > omoves) ? moves-omoves : 0;
                    190:          register struct monst *mtmp, *mtmp2;
                    191:          extern char genocided[];
                    192: 
                    193:          for(mtmp = fmon; mtmp; mtmp = mtmp2) {
                    194:                long newhp;             /* tmoves may be very large */
                    195: 
                    196:                mtmp2 = mtmp->nmon;
                    197:                if(index(genocided, mtmp->data->mlet)) {
                    198:                        mondead(mtmp);
                    199:                        continue;
                    200:                }
                    201: 
                    202:                if(mtmp->mtame && tmoves > 250) {
                    203:                        mtmp->mtame = 0;
                    204:                        mtmp->mpeaceful = 0;
                    205:                }
                    206: 
                    207:                newhp = mtmp->mhp +
                    208:                        (index(MREGEN, mtmp->data->mlet) ? tmoves : tmoves/20);
                    209:                if(newhp > mtmp->mhpmax)
                    210:                        mtmp->mhp = mtmp->mhpmax;
                    211:                else
                    212:                        mtmp->mhp = newhp;
                    213:          }
                    214:        }
                    215: 
                    216:        setgd();
                    217:        gold = newgold();
                    218:        mread(fd, (char *)gold, sizeof(struct gold));
                    219:        while(gold->gx) {
                    220:                gold->ngold = fgold;
                    221:                fgold = gold;
                    222:                gold = newgold();
                    223:                mread(fd, (char *)gold, sizeof(struct gold));
                    224:        }
                    225:        free((char *) gold);
                    226:        trap = newtrap();
                    227:        mread(fd, (char *)trap, sizeof(struct trap));
                    228:        while(trap->tx) {
                    229:                trap->ntrap = ftrap;
                    230:                ftrap = trap;
                    231:                trap = newtrap();
                    232:                mread(fd, (char *)trap, sizeof(struct trap));
                    233:        }
                    234:        free((char *) trap);
                    235:        fobj = restobjchn(fd);
                    236:        billobjs = restobjchn(fd);
                    237:        rest_engravings(fd);
                    238: #ifndef QUEST
                    239:        mread(fd, (char *)rooms, sizeof(rooms));
                    240:        mread(fd, (char *)doors, sizeof(doors));
                    241: #endif QUEST
                    242: #ifndef NOWORM
                    243:        mread(fd, (char *)wsegs, sizeof(wsegs));
                    244:        for(tmp = 1; tmp < 32; tmp++) if(wsegs[tmp]){
                    245:                wheads[tmp] = wsegs[tmp] = wtmp = newseg();
                    246:                while(1) {
                    247:                        mread(fd, (char *)wtmp, sizeof(struct wseg));
                    248:                        if(!wtmp->nseg) break;
                    249:                        wheads[tmp]->nseg = wtmp = newseg();
                    250:                        wheads[tmp] = wtmp;
                    251:                }
                    252:        }
                    253:        mread(fd, (char *)wgrowtime, sizeof(wgrowtime));
                    254: #endif NOWORM
                    255: }
                    256: 
                    257: mread(fd, buf, len)
                    258: register fd;
                    259: register char *buf;
                    260: register unsigned len;
                    261: {
                    262:        register int rlen;
                    263:        extern boolean restoring;
                    264: 
                    265:        rlen = read(fd, buf, (int) len);
                    266:        if(rlen != len){
                    267:                pline("Read %d instead of %u bytes.\n", rlen, len);
                    268:                if(restoring) {
                    269:                        (void) unlink(SAVEF);
                    270:                        error("Error restoring old game.");
                    271:                }
                    272:                panic("Error reading level file.");
                    273:        }
                    274: }
                    275: 
                    276: mklev()
                    277: {
                    278:        extern boolean in_mklev;
                    279: 
                    280:        if(getbones()) return;
                    281: 
                    282:        in_mklev = TRUE;
                    283:        makelevel();
                    284:        in_mklev = FALSE;
                    285: }

unix.superglobalmegacorp.com

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