예제 #1
0
/* make and stock a room of a given type

   Note: must not use the level creation RNG if this is of a room type that's
   affected by genocide/extinction (LEPREHALL, BEEHIVE, BARRACKS, ANTHOLE,
   COCKNEST), or genocide/extinction would change the layout of the rest of the
   level. */
void
mkroom(struct level *lev, int roomtype)
{
    if (roomtype >= SHOPBASE)
        mkshop(lev);    /* someday, we should be able to specify shop type */
    else
        switch (roomtype) {
        case COURT:
            mkzoo(lev, COURT, rng_for_level(&lev->z));
            break;
        case ZOO:
            mkzoo(lev, ZOO, rng_for_level(&lev->z));
            break;
        case BEEHIVE:
            mkzoo(lev, BEEHIVE, rng_main);
            break;
        case MORGUE:
            mkzoo(lev, MORGUE, rng_for_level(&lev->z));
            break;
        case BARRACKS:
            mkzoo(lev, BARRACKS, rng_main);
            break;
        case SWAMP:
            mkswamp(lev);
            break;
        case TEMPLE:
            mktemple(lev);
            break;
        case LEPREHALL:
            mkzoo(lev, LEPREHALL, rng_main);
            break;
        case COCKNEST:
            mkzoo(lev, COCKNEST, rng_main);
            break;
        case ANTHOLE:
            mkzoo(lev, ANTHOLE, rng_main);
            break;
        default:
            impossible("Tried to make a room of type %d.", roomtype);
        }
}
예제 #2
0
void
mkroom (
/* make and stock a room of a given type */
    int roomtype
)
{
    if (roomtype >= SHOPBASE)
        mkshop();       /* someday, we should be able to specify shop type */
    else switch(roomtype) {
        case COURT:     mkzoo(COURT); break;
        case ZOO:       mkzoo(ZOO); break;
        case BEEHIVE:   mkzoo(BEEHIVE); break;
        case MORGUE:    mkzoo(MORGUE); break;
        case BARRACKS:  mkzoo(BARRACKS); break;
        case SWAMP:     mkswamp(); break;
        case TEMPLE:    mktemple(); break;
        case LEPREHALL: mkzoo(LEPREHALL); break;
        case COCKNEST:  mkzoo(COCKNEST); break;
        case ANTHOLE:   mkzoo(ANTHOLE); break;
        default:        impossible("Tried to make a room of type %d.", roomtype);
    }
}
예제 #3
0
파일: hack.mklev.c 프로젝트: blakeney/slack
void
makelevel(void)
{
	struct mkroom *croom, *troom;
	unsigned tryct;
	int x,y;

	nroom = 0;
	doorindex = 0;
	rooms[0].hx = -1;	/* in case we are in a maze */

	for(x=0; x<COLNO; x++) for(y=0; y<ROWNO; y++)
		levl[x][y] = zerorm;

	oinit();	/* assign level dependent obj probabilities */

	if(dlevel >= rn1(3, 26)) {	/* there might be several mazes */
		makemaz();
		return;
	}

	/* construct the rooms */
	nroom = 0;
	secret = FALSE;
	makerooms();

	/* construct stairs (up and down in different rooms if possible) */
	croom = &rooms[rn2(nroom)];
	xdnstair = somex();
	ydnstair = somey();
	levl[xdnstair][ydnstair].scrsym ='>';
	levl[xdnstair][ydnstair].typ = STAIRS;
	if(nroom > 1) {
		troom = croom;
		croom = &rooms[rn2(nroom-1)];
		if(croom >= troom) croom++;
	}
	xupstair = somex();	/* %% < and > might be in the same place */
	yupstair = somey();
	levl[xupstair][yupstair].scrsym ='<';
	levl[xupstair][yupstair].typ = STAIRS;

	/* for each room: put things inside */
	for(croom = rooms; croom->hx > 0; croom++) {

		/* put a sleeping monster inside */
		/* Note: monster may be on the stairs. This cannot be
		   avoided: maybe the player fell through a trapdoor
		   while a monster was on the stairs. Conclusion:
		   we have to check for monsters on the stairs anyway. */
		if(!rn2(3))
			makemon(NULL, somex(), somey());

		/* put traps and mimics inside */
		goldseen = FALSE;
		while(!rn2(8-(dlevel/6))) mktrap(0,0,croom);
		if(!goldseen && !rn2(3)) mkgold(0L,somex(),somey());
		if(!rn2(3)) {
			mkobj_at(0, somex(), somey());
			tryct = 0;
			while(!rn2(5)) {
				if(++tryct > 100){
					printf("tryct overflow4\n");
					break;
				}
				mkobj_at(0, somex(), somey());
			}
		}
	}

	qsort((char *) rooms, nroom, sizeof(struct mkroom), comp);
	makecorridors();
	make_niches();

	/* make a secret treasure vault, not connected to the rest */
	if(nroom <= (2*MAXNROFROOMS/3)) if(rn2(3)) {
		troom = &rooms[nroom];
		secret = TRUE;
		if(makerooms()) {
			troom->rtype = VAULT;		/* treasure vault */
			for(x = troom->lx; x <= troom->hx; x++)
			for(y = troom->ly; y <= troom->hy; y++)
				mkgold((long)(rnd(dlevel*100) + 50), x, y);
			if(!rn2(3))
				makevtele();
		}
	}

#ifndef QUEST
#ifdef WIZARD
	if(wizard && getenv("SHOPTYPE")) mkshop(); else
#endif /* WIZARD */
 	if(dlevel > 1 && dlevel < 20 && rn2(dlevel) < 3) mkshop();
	else
	if(dlevel > 6 && !rn2(7)) mkzoo(ZOO);
	else
	if(dlevel > 9 && !rn2(5)) mkzoo(BEEHIVE);
	else
	if(dlevel > 11 && !rn2(6)) mkzoo(MORGUE);
	else
	if(dlevel > 18 && !rn2(6)) mkswamp();
#endif /* QUEST */
}
예제 #4
0
mkshop(){
register struct mkroom *sroom;
register int sh,sx,sy,i = -1;
register char let;
int roomno;
register struct monst *shk;
#ifdef WIZARD
	/* first determine shoptype */
	if(wizard){
		extern char *getenv();
		register char *ep = getenv("SHOPTYPE");
		if(ep){
			if(*ep == 'z' || *ep == 'Z'){
				mkzoo(ZOO);
				return;
			}
			if(*ep == 'm' || *ep == 'M'){
				mkzoo(MORGUE);
				return;
			}
			if(*ep == 'b' || *ep == 'B'){
				mkzoo(BEEHIVE);
				return;
			}
			if(*ep == 's' || *ep == 'S'){
				mkswamp();
				return;
			}
			for(i=0; shtypes[i]; i++)
				if(*ep == shtypes[i]) break;
			goto gottype;
		}
	}
gottype:
#endif WIZARD
	for(sroom = &rooms[0], roomno = 0; ; sroom++, roomno++){
		if(sroom->hx < 0) return;
		if(sroom - rooms >= nroom) {
			pline("rooms not closed by -1?");
			return;
		}
		if(sroom->rtype) continue;
		if(!sroom->rlit || has_dnstairs(sroom) || has_upstairs(sroom))
			continue;
		if(
#ifdef WIZARD
		   (wizard && getenv("SHOPTYPE") && sroom->doorct != 0) ||
#endif WIZARD
			sroom->doorct == 1) break;
	}

	if(i < 0) {			/* shoptype not yet determined */
	    register int j;

	    for(j = rn2(100), i = 0; (j -= shprobs[i])>= 0; i++)
		if(!shtypes[i]) break;			/* superfluous */
	    if(isbig(sroom) && i + SHOPBASE == WANDSHOP)
		i = GENERAL-SHOPBASE;
	}
	sroom->rtype = i + SHOPBASE;
	let = shtypes[i];
	sh = sroom->fdoor;
	sx = doors[sh].x;
	sy = doors[sh].y;
	if(sx == sroom->lx-1) sx++; else
	if(sx == sroom->hx+1) sx--; else
	if(sy == sroom->ly-1) sy++; else
	if(sy == sroom->hy+1) sy--; else {
#ifdef WIZARD
	    /* This is said to happen sometimes, but I've never seen it. */
	    if(wizard) {
		register int j = sroom->doorct;
		extern int doorindex;

		pline("Where is shopdoor?");
		pline("Room at (%d,%d),(%d,%d).", sroom->lx, sroom->ly,
			sroom->hx, sroom->hy);
		pline("doormax=%d doorct=%d fdoor=%d",
			doorindex, sroom->doorct, sh);
		while(j--) {
			pline("door [%d,%d]", doors[sh].x, doors[sh].y);
			sh++;
		}
		more();
	    }
#endif WIZARD
	    return;
	}
	if(!(shk = makemon(PM_SHK,sx,sy))) return;
	shk->isshk = shk->mpeaceful = 1;
	shk->msleep = 0;
	shk->mtrapseen = ~0;	/* we know all the traps already */
	ESHK->shoproom = roomno;
	ESHK->shoplevel = dlevel;
	ESHK->shd = doors[sh];
	ESHK->shk.x = sx;
	ESHK->shk.y = sy;
	ESHK->robbed = 0;
	ESHK->visitct = 0;
	ESHK->following = 0;
	shk->mgold = 1000 + 30*rnd(100);	/* initial capital */
	ESHK->billct = 0;
	findname(ESHK->shknam, let);
	for(sx = sroom->lx; sx <= sroom->hx; sx++)
	for(sy = sroom->ly; sy <= sroom->hy; sy++){
		register struct monst *mtmp;
		if((sx == sroom->lx && doors[sh].x == sx-1) ||
		   (sx == sroom->hx && doors[sh].x == sx+1) ||
		   (sy == sroom->ly && doors[sh].y == sy-1) ||
		   (sy == sroom->hy && doors[sh].y == sy+1)) continue;
		if(rn2(100) < dlevel && !m_at(sx,sy) &&
		   (mtmp = makemon(PM_MIMIC, sx, sy))){
			mtmp->mimic = 1;
			mtmp->mappearance =
			    (let && rn2(10) < dlevel) ? let : ']';
			continue;
		}
		(void) mkobj_at(let, sx, sy);
	}
}
예제 #5
0
void mkshop()
{
    struct mkroom *sroom;
    int sh;
    int sx;
    int sy;
    int i;
    char let;
    int roomno;
    struct monst *shk;

    sroom = &rooms[0];
    roomno = 0;
    while(1) {
        if(sroom->hx < 0) {
            return;
        }

        if((sroom->lx <= xdnstair) 
           && (xdnstair <= sroom->hx)
           && (sroom->ly <= ydnstair)
           && (ydnstair <= sroom->hy)) {
            ++sroom;
            ++roomno;

            continue;
        }

        if((sroom->lx <= xupstair)
           && (xupstair <= sroom->hx)
           && (sroom->ly <= yupstair)
           && (yupstair <= sroom->hy)) {
            ++sroom;
            ++roomno;

            continue;
        }

#ifdef WIZARD
        if(wizard || (sroom->doorct == 1)) {
            break;
        }
#else
        if(sroom->doorct == 1) {
            break;
        }
#endif
    }

#ifdef WIZARD
    int flag = 0;

    if(wizard) {
        char *ep = getenv("SHOPTYPE");

        if(ep != NULL) {
            if((*ep == 'z') || (*ep == 'Z')) {
                mkzoo();
                    
                return;
            }

            for(i = 0; shtypes[i]; ++i) {
                if(*ep == shtypes[i]) {
                    break;
                }
            }
                 
            let = i;

            flag = 1;
        }
    }

    if(flag == 0) {
        let = 0;
        i = rn2(100) - shprobs[(int)let];
        while(i > 0) {
            if(shprobs[(int)let] == 0) {
                break; /* Superfluous */
            }
            
            ++let;
            i -= shprobs[(int)let];
        }
    }
#else
    let = 0;
    i = rn2(100) - shprobs[(int)let];
    while(i > 0) {
        if(shprobs[(int)let] == 0) {
            break; /* Superfluous */
        }
            
        ++let;
        i -= shprobs[(int)let];
    }
#endif

    sroom->rtype = 8 + let;
    let = shtypes[(int)let];
    sh = sroom->fdoor;
    sx = doors[sh].x;
    sy = doors[sh].y;

    if(sx == (sroom->lx - 1)) {
        ++sx;
    }
    else if(sx == (sroom->hx + 1)) {
        --sx;
    }
    else if(sy == (sroom->ly - 1)) {
        --sy;
    }
    else if(sy == (sroom->hy + 1)) {
        --sy;
    }
    else {
        printf("Where is shopdoor?");
            
        return;
    }

    shk = makemon(PM_SHK, sx, sy);

    if(shk == NULL) {
        return;
    }

    shk->mpeaceful = 1;
    shk->isshk = shk->mpeaceful;
    shk->msleep = 0;
    shk->mtrapseen = ~0; /* We know all the traps already */
    ESHK->shoproom = roomno;
    ESHK->shd = doors[sh];
    ESHK->shk.x = sx;
    ESHK->shk.y = sy;
    ESHK->robbed = 0;
    ESHK->visitct = 0;
    shk->mgold = 1000 + (30 * rnd(100)); /* Initial capital */
    ESHK->billct = 0;
        
    findname(ESHK->shknam, let);

    for(sx = sroom->lx; sx <= sroom->hx; ++sx) {
        for(sy = sroom->ly; sy <= sroom->hy; ++sy) {
            struct monst *mtmp;

            if(((sx == sroom->lx) && (doors[sh].x == (sx - 1)))
               || ((sx == sroom->hx) && (doors[sh].x == (sx + 1)))
               || ((sy == sroom->ly) && (doors[sh].y == (sy - 1)))
               || ((sy == sroom->hy) && (doors[sh].y == (sy + 1)))) {
                continue;
            }

            if((rn2(100) < dlevel) && !m_at(sx, sy)) {
                mtmp = makemon(PM_MIMIC, sx, sy);

                if(mtmp != NULL) {
                    if(let && (rn2(10) < dlevel)) {
                        mtmp->mimic = let;
                    }
                    else {
                        mtmp->mimic = ']';
                    }

                    continue;
                }
            }

            mkobj_at(let, sx, sy);
        }
    }

#ifdef WIZARD
    if(wizard) {
        if(let) {
            printf("I made a %c-shop.", let);
        }
        else {
            printf("I made a g-shop.");
        }
    }
#endif
    
    ++sroom;
    ++roomno;
}