|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.