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