Annotation of 43BSDTahoe/games/hack/hack.vault.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: /* hack.vault.c - version 1.0.2 */
        !             3: 
        !             4: #include       "hack.h"
        !             5: #ifdef QUEST
        !             6: setgd(/* mtmp */) /* struct monst *mtmp; */ {}
        !             7: gd_move() { return(2); }
        !             8: gddead(mtmp) struct monst *mtmp; {}
        !             9: replgd(mtmp,mtmp2) struct monst *mtmp, *mtmp2; {}
        !            10: invault(){}
        !            11: 
        !            12: #else
        !            13: 
        !            14: 
        !            15: #include "def.mkroom.h"
        !            16: extern struct monst *makemon();
        !            17: #define        FCSIZ   (ROWNO+COLNO)
        !            18: struct fakecorridor {
        !            19:        xchar fx,fy,ftyp;
        !            20: };
        !            21: 
        !            22: struct egd {
        !            23:        int fcbeg, fcend;       /* fcend: first unused pos */
        !            24:        xchar gdx, gdy;         /* goal of guard's walk */
        !            25:        unsigned gddone:1;
        !            26:        struct fakecorridor fakecorr[FCSIZ];
        !            27: };
        !            28: 
        !            29: static struct permonst pm_guard =
        !            30:        { "guard", '@', 12, 12, -1, 4, 10, sizeof(struct egd) };
        !            31: 
        !            32: static struct monst *guard;
        !            33: static int gdlevel;
        !            34: #define        EGD     ((struct egd *)(&(guard->mextra[0])))
        !            35: 
        !            36: static
        !            37: restfakecorr()
        !            38: {
        !            39:        register fcx,fcy,fcbeg;
        !            40:        register struct rm *crm;
        !            41: 
        !            42:        while((fcbeg = EGD->fcbeg) < EGD->fcend) {
        !            43:                fcx = EGD->fakecorr[fcbeg].fx;
        !            44:                fcy = EGD->fakecorr[fcbeg].fy;
        !            45:                if((u.ux == fcx && u.uy == fcy) || cansee(fcx,fcy) ||
        !            46:                   m_at(fcx,fcy))
        !            47:                        return;
        !            48:                crm = &levl[fcx][fcy];
        !            49:                crm->typ = EGD->fakecorr[fcbeg].ftyp;
        !            50:                if(!crm->typ) crm->seen = 0;
        !            51:                newsym(fcx,fcy);
        !            52:                EGD->fcbeg++;
        !            53:        }
        !            54:        /* it seems he left the corridor - let the guard disappear */
        !            55:        mondead(guard);
        !            56:        guard = 0;
        !            57: }
        !            58: 
        !            59: static
        !            60: goldincorridor()
        !            61: {
        !            62:        register int fci;
        !            63: 
        !            64:        for(fci = EGD->fcbeg; fci < EGD->fcend; fci++)
        !            65:                if(g_at(EGD->fakecorr[fci].fx, EGD->fakecorr[fci].fy))
        !            66:                        return(1);
        !            67:        return(0);
        !            68: }
        !            69: 
        !            70: setgd(){
        !            71: register struct monst *mtmp;
        !            72:        for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->isgd){
        !            73:                guard = mtmp;
        !            74:                gdlevel = dlevel;
        !            75:                return;
        !            76:        }
        !            77:        guard = 0;
        !            78: }
        !            79: 
        !            80: invault(){
        !            81: register tmp = inroom(u.ux, u.uy);
        !            82:     if(tmp < 0 || rooms[tmp].rtype != VAULT) {
        !            83:        u.uinvault = 0;
        !            84:        return;
        !            85:     }
        !            86:     if(++u.uinvault % 50 == 0 && (!guard || gdlevel != dlevel)) {
        !            87:        char buf[BUFSZ];
        !            88:        register x,y,dd,gx,gy;
        !            89: 
        !            90:        /* first find the goal for the guard */
        !            91:        for(dd = 1; (dd < ROWNO || dd < COLNO); dd++) {
        !            92:          for(y = u.uy-dd; y <= u.uy+dd; y++) {
        !            93:            if(y < 0 || y > ROWNO-1) continue;
        !            94:            for(x = u.ux-dd; x <= u.ux+dd; x++) {
        !            95:              if(y != u.uy-dd && y != u.uy+dd && x != u.ux-dd)
        !            96:                x = u.ux+dd;
        !            97:              if(x < 0 || x > COLNO-1) continue;
        !            98:              if(levl[x][y].typ == CORR) goto fnd;
        !            99:            }
        !           100:          }
        !           101:        }
        !           102:        impossible("Not a single corridor on this level??");
        !           103:        tele();
        !           104:        return;
        !           105: fnd:
        !           106:        gx = x; gy = y;
        !           107: 
        !           108:        /* next find a good place for a door in the wall */
        !           109:        x = u.ux; y = u.uy;
        !           110:        while(levl[x][y].typ == ROOM) {
        !           111:                register int dx,dy;
        !           112: 
        !           113:                dx = (gx > x) ? 1 : (gx < x) ? -1 : 0;
        !           114:                dy = (gy > y) ? 1 : (gy < y) ? -1 : 0;
        !           115:                if(abs(gx-x) >= abs(gy-y))
        !           116:                        x += dx;
        !           117:                else
        !           118:                        y += dy;
        !           119:        }
        !           120: 
        !           121:        /* make something interesting happen */
        !           122:        if(!(guard = makemon(&pm_guard,x,y))) return;
        !           123:        guard->isgd = guard->mpeaceful = 1;
        !           124:        EGD->gddone = 0;
        !           125:        gdlevel = dlevel;
        !           126:        if(!cansee(guard->mx, guard->my)) {
        !           127:                mondead(guard);
        !           128:                guard = 0;
        !           129:                return;
        !           130:        }
        !           131: 
        !           132:        pline("Suddenly one of the Vault's guards enters!");
        !           133:        pmon(guard);
        !           134:        do {
        !           135:                pline("\"Hello stranger, who are you?\" - ");
        !           136:                getlin(buf);
        !           137:        } while (!letter(buf[0]));
        !           138: 
        !           139:        if(!strcmp(buf, "Croesus") || !strcmp(buf, "Kroisos")) {
        !           140:                pline("\"Oh, yes - of course. Sorry to have disturbed you.\"");
        !           141:                mondead(guard);
        !           142:                guard = 0;
        !           143:                return;
        !           144:        }
        !           145:        clrlin();
        !           146:        pline("\"I don't know you.\"");
        !           147:        if(!u.ugold)
        !           148:            pline("\"Please follow me.\"");
        !           149:        else {
        !           150:            pline("\"Most likely all that gold was stolen from this vault.\"");
        !           151:            pline("\"Please drop your gold (say d$ ) and follow me.\"");
        !           152:        }
        !           153:        EGD->gdx = gx;
        !           154:        EGD->gdy = gy;
        !           155:        EGD->fcbeg = 0;
        !           156:        EGD->fakecorr[0].fx = x;
        !           157:        EGD->fakecorr[0].fy = y;
        !           158:        EGD->fakecorr[0].ftyp = levl[x][y].typ;
        !           159:        levl[x][y].typ = DOOR;
        !           160:        EGD->fcend = 1;
        !           161:     }
        !           162: }
        !           163: 
        !           164: gd_move(){
        !           165: register int x,y,dx,dy,gx,gy,nx,ny,typ;
        !           166: register struct fakecorridor *fcp;
        !           167: register struct rm *crm;
        !           168:        if(!guard || gdlevel != dlevel){
        !           169:                impossible("Where is the guard?");
        !           170:                return(2);      /* died */
        !           171:        }
        !           172:        if(u.ugold || goldincorridor())
        !           173:                return(0);      /* didnt move */
        !           174:        if(dist(guard->mx,guard->my) > 1 || EGD->gddone) {
        !           175:                restfakecorr();
        !           176:                return(0);      /* didnt move */
        !           177:        }
        !           178:        x = guard->mx;
        !           179:        y = guard->my;
        !           180:        /* look around (hor & vert only) for accessible places */
        !           181:        for(nx = x-1; nx <= x+1; nx++) for(ny = y-1; ny <= y+1; ny++) {
        !           182:            if(nx == x || ny == y) if(nx != x || ny != y)
        !           183:            if(isok(nx,ny))
        !           184:            if(!IS_WALL(typ = (crm = &levl[nx][ny])->typ) && typ != POOL) {
        !           185:                register int i;
        !           186:                for(i = EGD->fcbeg; i < EGD->fcend; i++)
        !           187:                        if(EGD->fakecorr[i].fx == nx &&
        !           188:                           EGD->fakecorr[i].fy == ny)
        !           189:                                goto nextnxy;
        !           190:                if((i = inroom(nx,ny)) >= 0 && rooms[i].rtype == VAULT)
        !           191:                        goto nextnxy;
        !           192:                /* seems we found a good place to leave him alone */
        !           193:                EGD->gddone = 1;
        !           194:                if(ACCESSIBLE(typ)) goto newpos;
        !           195:                crm->typ = (typ == SCORR) ? CORR : DOOR;
        !           196:                goto proceed;
        !           197:            }
        !           198:     nextnxy:   ;
        !           199:        }
        !           200:        nx = x;
        !           201:        ny = y;
        !           202:        gx = EGD->gdx;
        !           203:        gy = EGD->gdy;
        !           204:        dx = (gx > x) ? 1 : (gx < x) ? -1 : 0;
        !           205:        dy = (gy > y) ? 1 : (gy < y) ? -1 : 0;
        !           206:        if(abs(gx-x) >= abs(gy-y)) nx += dx; else ny += dy;
        !           207: 
        !           208:        while((typ = (crm = &levl[nx][ny])->typ) != 0) {
        !           209:        /* in view of the above we must have IS_WALL(typ) or typ == POOL */
        !           210:        /* must be a wall here */
        !           211:                if(isok(nx+nx-x,ny+ny-y) && typ != POOL &&
        !           212:                    ZAP_POS(levl[nx+nx-x][ny+ny-y].typ)){
        !           213:                        crm->typ = DOOR;
        !           214:                        goto proceed;
        !           215:                }
        !           216:                if(dy && nx != x) {
        !           217:                        nx = x; ny = y+dy;
        !           218:                        continue;
        !           219:                }
        !           220:                if(dx && ny != y) {
        !           221:                        ny = y; nx = x+dx; dy = 0;
        !           222:                        continue;
        !           223:                }
        !           224:                /* I don't like this, but ... */
        !           225:                crm->typ = DOOR;
        !           226:                goto proceed;
        !           227:        }
        !           228:        crm->typ = CORR;
        !           229: proceed:
        !           230:        if(cansee(nx,ny)) {
        !           231:                mnewsym(nx,ny);
        !           232:                prl(nx,ny);
        !           233:        }
        !           234:        fcp = &(EGD->fakecorr[EGD->fcend]);
        !           235:        if(EGD->fcend++ == FCSIZ) panic("fakecorr overflow");
        !           236:        fcp->fx = nx;
        !           237:        fcp->fy = ny;
        !           238:        fcp->ftyp = typ;
        !           239: newpos:
        !           240:        if(EGD->gddone) nx = ny = 0;
        !           241:        guard->mx = nx;
        !           242:        guard->my = ny;
        !           243:        pmon(guard);
        !           244:        restfakecorr();
        !           245:        return(1);
        !           246: }
        !           247: 
        !           248: gddead(){
        !           249:        guard = 0;
        !           250: }
        !           251: 
        !           252: replgd(mtmp,mtmp2)
        !           253: register struct monst *mtmp, *mtmp2;
        !           254: {
        !           255:        if(mtmp == guard)
        !           256:                guard = mtmp2;
        !           257: }
        !           258: 
        !           259: #endif QUEST

unix.superglobalmegacorp.com

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