Annotation of 43BSDReno/games/hack/hack.mkshop.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: /* hack.mkshop.c - version 1.0.3 */
        !             3: 
        !             4: #ifndef QUEST
        !             5: #include "hack.h"
        !             6: #include "def.mkroom.h"
        !             7: #include "def.eshk.h"
        !             8: #define        ESHK    ((struct eshk *)(&(shk->mextra[0])))
        !             9: extern struct monst *makemon();
        !            10: extern struct obj *mkobj_at();
        !            11: extern int nroom;
        !            12: extern char shtypes[]; /* = "=/)%?!["; 8 types: 7 specialized, 1 mixed */
        !            13: schar shprobs[] = { 3,3,5,5,10,10,14,50 };     /* their probabilities */
        !            14: 
        !            15: mkshop(){
        !            16: register struct mkroom *sroom;
        !            17: register int sh,sx,sy,i = -1;
        !            18: register char let;
        !            19: int roomno;
        !            20: register struct monst *shk;
        !            21: #ifdef WIZARD
        !            22:        /* first determine shoptype */
        !            23:        if(wizard){
        !            24:                extern char *getenv();
        !            25:                register char *ep = getenv("SHOPTYPE");
        !            26:                if(ep){
        !            27:                        if(*ep == 'z' || *ep == 'Z'){
        !            28:                                mkzoo(ZOO);
        !            29:                                return;
        !            30:                        }
        !            31:                        if(*ep == 'm' || *ep == 'M'){
        !            32:                                mkzoo(MORGUE);
        !            33:                                return;
        !            34:                        }
        !            35:                        if(*ep == 'b' || *ep == 'B'){
        !            36:                                mkzoo(BEEHIVE);
        !            37:                                return;
        !            38:                        }
        !            39:                        if(*ep == 's' || *ep == 'S'){
        !            40:                                mkswamp();
        !            41:                                return;
        !            42:                        }
        !            43:                        for(i=0; shtypes[i]; i++)
        !            44:                                if(*ep == shtypes[i]) break;
        !            45:                        goto gottype;
        !            46:                }
        !            47:        }
        !            48: gottype:
        !            49: #endif WIZARD
        !            50:        for(sroom = &rooms[0], roomno = 0; ; sroom++, roomno++){
        !            51:                if(sroom->hx < 0) return;
        !            52:                if(sroom - rooms >= nroom) {
        !            53:                        pline("rooms not closed by -1?");
        !            54:                        return;
        !            55:                }
        !            56:                if(sroom->rtype) continue;
        !            57:                if(!sroom->rlit || has_dnstairs(sroom) || has_upstairs(sroom))
        !            58:                        continue;
        !            59:                if(
        !            60: #ifdef WIZARD
        !            61:                   (wizard && getenv("SHOPTYPE") && sroom->doorct != 0) ||
        !            62: #endif WIZARD
        !            63:                        sroom->doorct <= 2 && sroom->doorct > 0) break;
        !            64:        }
        !            65: 
        !            66:        if(i < 0) {                     /* shoptype not yet determined */
        !            67:            register int j;
        !            68: 
        !            69:            for(j = rn2(100), i = 0; (j -= shprobs[i])>= 0; i++)
        !            70:                if(!shtypes[i]) break;                  /* superfluous */
        !            71:            if(isbig(sroom) && i + SHOPBASE == WANDSHOP)
        !            72:                i = GENERAL-SHOPBASE;
        !            73:        }
        !            74:        sroom->rtype = i + SHOPBASE;
        !            75:        let = shtypes[i];
        !            76:        sh = sroom->fdoor;
        !            77:        sx = doors[sh].x;
        !            78:        sy = doors[sh].y;
        !            79:        if(sx == sroom->lx-1) sx++; else
        !            80:        if(sx == sroom->hx+1) sx--; else
        !            81:        if(sy == sroom->ly-1) sy++; else
        !            82:        if(sy == sroom->hy+1) sy--; else {
        !            83: #ifdef WIZARD
        !            84:            /* This is said to happen sometimes, but I've never seen it. */
        !            85:            if(wizard) {
        !            86:                register int j = sroom->doorct;
        !            87:                extern int doorindex;
        !            88: 
        !            89:                pline("Where is shopdoor?");
        !            90:                pline("Room at (%d,%d),(%d,%d).", sroom->lx, sroom->ly,
        !            91:                        sroom->hx, sroom->hy);
        !            92:                pline("doormax=%d doorct=%d fdoor=%d",
        !            93:                        doorindex, sroom->doorct, sh);
        !            94:                while(j--) {
        !            95:                        pline("door [%d,%d]", doors[sh].x, doors[sh].y);
        !            96:                        sh++;
        !            97:                }
        !            98:                more();
        !            99:            }
        !           100: #endif WIZARD
        !           101:            return;
        !           102:        }
        !           103:        if(!(shk = makemon(PM_SHK,sx,sy))) return;
        !           104:        shk->isshk = shk->mpeaceful = 1;
        !           105:        shk->msleep = 0;
        !           106:        shk->mtrapseen = ~0;    /* we know all the traps already */
        !           107:        ESHK->shoproom = roomno;
        !           108:        ESHK->shoplevel = dlevel;
        !           109:        ESHK->shd = doors[sh];
        !           110:        ESHK->shk.x = sx;
        !           111:        ESHK->shk.y = sy;
        !           112:        ESHK->robbed = 0;
        !           113:        ESHK->visitct = 0;
        !           114:        ESHK->following = 0;
        !           115:        shk->mgold = 1000 + 30*rnd(100);        /* initial capital */
        !           116:        ESHK->billct = 0;
        !           117:        findname(ESHK->shknam, let);
        !           118:        for(sx = sroom->lx; sx <= sroom->hx; sx++)
        !           119:        for(sy = sroom->ly; sy <= sroom->hy; sy++){
        !           120:                register struct monst *mtmp;
        !           121:                if((sx == sroom->lx && doors[sh].x == sx-1) ||
        !           122:                   (sx == sroom->hx && doors[sh].x == sx+1) ||
        !           123:                   (sy == sroom->ly && doors[sh].y == sy-1) ||
        !           124:                   (sy == sroom->hy && doors[sh].y == sy+1)) continue;
        !           125:                if(rn2(100) < dlevel && !m_at(sx,sy) &&
        !           126:                   (mtmp = makemon(PM_MIMIC, sx, sy))){
        !           127:                        mtmp->mimic = 1;
        !           128:                        mtmp->mappearance =
        !           129:                            (let && rn2(10) < dlevel) ? let : ']';
        !           130:                        continue;
        !           131:                }
        !           132:                (void) mkobj_at(let, sx, sy);
        !           133:        }
        !           134: }
        !           135: 
        !           136: mkzoo(type)
        !           137: int type;
        !           138: {
        !           139:        register struct mkroom *sroom;
        !           140:        register struct monst *mon;
        !           141:        register int sh,sx,sy,i;
        !           142:        int goldlim = 500 * dlevel;
        !           143:        int moct = 0;
        !           144:        struct permonst *morguemon();
        !           145: 
        !           146:        i = nroom;
        !           147:        for(sroom = &rooms[rn2(nroom)]; ; sroom++) {
        !           148:                if(sroom == &rooms[nroom])
        !           149:                        sroom = &rooms[0];
        !           150:                if(!i-- || sroom->hx < 0)
        !           151:                        return;
        !           152:                if(sroom->rtype)
        !           153:                        continue;
        !           154:                if(type == MORGUE && sroom->rlit)
        !           155:                        continue;
        !           156:                if(has_upstairs(sroom) || (has_dnstairs(sroom) && rn2(3)))
        !           157:                        continue;
        !           158:                if(sroom->doorct == 1 || !rn2(5))
        !           159:                        break;
        !           160:        }
        !           161:        sroom->rtype = type;
        !           162:        sh = sroom->fdoor;
        !           163:        for(sx = sroom->lx; sx <= sroom->hx; sx++)
        !           164:        for(sy = sroom->ly; sy <= sroom->hy; sy++){
        !           165:                if((sx == sroom->lx && doors[sh].x == sx-1) ||
        !           166:                   (sx == sroom->hx && doors[sh].x == sx+1) ||
        !           167:                   (sy == sroom->ly && doors[sh].y == sy-1) ||
        !           168:                   (sy == sroom->hy && doors[sh].y == sy+1)) continue;
        !           169:                mon = makemon(
        !           170:                   (type == MORGUE) ? morguemon() :
        !           171:                   (type == BEEHIVE) ? PM_KILLER_BEE : (struct permonst *) 0,
        !           172:                   sx, sy);
        !           173:                if(mon) mon->msleep = 1;
        !           174:                switch(type) {
        !           175:                case ZOO:
        !           176:                   i = sq(dist2(sx,sy,doors[sh].x,doors[sh].y));
        !           177:                   if(i >= goldlim) i = 5*dlevel;
        !           178:                   goldlim -= i;
        !           179:                   mkgold((long)(10 + rn2(i)), sx, sy);
        !           180:                   break;
        !           181:                case MORGUE:
        !           182:                   /* Usually there is one dead body in the morgue */
        !           183:                   if(!moct && rn2(3)) {
        !           184:                        mksobj_at(CORPSE, sx, sy);
        !           185:                        moct++;
        !           186:                   }
        !           187:                   break;
        !           188:                case BEEHIVE:
        !           189:                   if(!rn2(3)) mksobj_at(LUMP_OF_ROYAL_JELLY, sx, sy);
        !           190:                   break;
        !           191:                }
        !           192:        }
        !           193: }
        !           194: 
        !           195: struct permonst *
        !           196: morguemon()
        !           197: {
        !           198:        extern struct permonst pm_ghost;
        !           199:        register int i = rn2(100), hd = rn2(dlevel);
        !           200: 
        !           201:        if(hd > 10 && i < 10) return(PM_DEMON);
        !           202:        if(hd > 8 && i > 85) return(PM_VAMPIRE);
        !           203:        return((i < 40) ? PM_GHOST : (i < 60) ? PM_WRAITH : PM_ZOMBIE);
        !           204: }
        !           205: 
        !           206: mkswamp()      /* Michiel Huisjes & Fred de Wilde */
        !           207: {
        !           208:        register struct mkroom *sroom;
        !           209:        register int sx,sy,i,eelct = 0;
        !           210:        extern struct permonst pm_eel;
        !           211: 
        !           212:        for(i=0; i<5; i++) {            /* 5 tries */
        !           213:                sroom = &rooms[rn2(nroom)];
        !           214:                if(sroom->hx < 0 || sroom->rtype ||
        !           215:                   has_upstairs(sroom) || has_dnstairs(sroom))
        !           216:                        continue;
        !           217: 
        !           218:                /* satisfied; make a swamp */
        !           219:                sroom->rtype = SWAMP;
        !           220:                for(sx = sroom->lx; sx <= sroom->hx; sx++)
        !           221:                for(sy = sroom->ly; sy <= sroom->hy; sy++)
        !           222:                if((sx+sy)%2 && !o_at(sx,sy) && !t_at(sx,sy)
        !           223:                             && !m_at(sx,sy) && !nexttodoor(sx,sy)){
        !           224:                        levl[sx][sy].typ = POOL;
        !           225:                        levl[sx][sy].scrsym = POOL_SYM;
        !           226:                        if(!eelct || !rn2(4)) {
        !           227:                                (void) makemon(PM_EEL, sx, sy);
        !           228:                                eelct++;
        !           229:                        }
        !           230:                }
        !           231:        }
        !           232: }
        !           233: 
        !           234: nexttodoor(sx,sy)
        !           235: register sx,sy;
        !           236: {
        !           237:        register dx,dy;
        !           238:        register struct rm *lev;
        !           239:        for(dx = -1; dx <= 1; dx++) for(dy = -1; dy <= 1; dy++)
        !           240:                if((lev = &levl[sx+dx][sy+dy])->typ == DOOR ||
        !           241:                    lev->typ == SDOOR || lev->typ == LDOOR)
        !           242:                        return(1);
        !           243:        return(0);
        !           244: }
        !           245: 
        !           246: has_dnstairs(sroom)
        !           247: register struct mkroom *sroom;
        !           248: {
        !           249:        return(sroom->lx <= xdnstair && xdnstair <= sroom->hx &&
        !           250:                   sroom->ly <= ydnstair && ydnstair <= sroom->hy);
        !           251: }
        !           252: 
        !           253: has_upstairs(sroom)
        !           254: register struct mkroom *sroom;
        !           255: {
        !           256:        return(sroom->lx <= xupstair && xupstair <= sroom->hx &&
        !           257:                   sroom->ly <= yupstair && yupstair <= sroom->hy);
        !           258: }
        !           259: 
        !           260: isbig(sroom)
        !           261: register struct mkroom *sroom;
        !           262: {
        !           263:        register int area = (sroom->hx - sroom->lx) * (sroom->hy - sroom->ly);
        !           264:        return( area > 20 );
        !           265: }
        !           266: 
        !           267: dist2(x0,y0,x1,y1){
        !           268:        return((x0-x1)*(x0-x1) + (y0-y1)*(y0-y1));
        !           269: }
        !           270: 
        !           271: sq(a) int a; {
        !           272:        return(a*a);
        !           273: }
        !           274: #endif QUEST

unix.superglobalmegacorp.com

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