⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hack.mklev.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	if(nroom >= MAXNROFROOMS) return(0);	if(lowx < XLIM) lowx = XLIM;	if(lowy < YLIM) lowy = YLIM;	if(hix > COLNO-XLIM-1) hix = COLNO-XLIM-1;	if(hiy > ROWNO-YLIM-1) hiy = ROWNO-YLIM-1;chk:	if(hix <= lowx || hiy <= lowy) return(0);	/* check area around room (and make room smaller if necessary) */	for(x = lowx - xlim; x <= hix + xlim; x++) {		for(y = lowy - ylim; y <= hiy + ylim; y++) {			if(levl[x][y].typ) {#ifdef WIZARD			    if(wizard && !secret)				pline("Strange area [%d,%d] in maker().",x,y);#endif WIZARD				if(!rn2(3)) return(0);				if(x < lowx)					lowx = x+xlim+1;				else					hix = x-xlim-1;				if(y < lowy)					lowy = y+ylim+1;				else					hiy = y-ylim-1;				goto chk;			}		}	}	croom = &rooms[nroom];	/* on low levels the room is lit (usually) */	/* secret vaults are always lit */	if((rnd(dlevel) < 10 && rn2(77)) || (ddx == 1 && ddy == 1)) {		for(x = lowx-1; x <= hix+1; x++)			for(y = lowy-1; y <= hiy+1; y++)				levl[x][y].lit = 1;		croom->rlit = 1;	} else		croom->rlit = 0;	croom->lx = lowx;	croom->hx = hix;	croom->ly = lowy;	croom->hy = hiy;	croom->rtype = croom->doorct = croom->fdoor = 0;	for(x = lowx-1; x <= hix+1; x++)	    for(y = lowy-1; y <= hiy+1; y += (hiy-lowy+2)) {		levl[x][y].scrsym = '-';		levl[x][y].typ = HWALL;	}	for(x = lowx-1; x <= hix+1; x += (hix-lowx+2))	    for(y = lowy; y <= hiy; y++) {		levl[x][y].scrsym = '|';		levl[x][y].typ = VWALL;	}	for(x = lowx; x <= hix; x++)	    for(y = lowy; y <= hiy; y++) {		levl[x][y].scrsym = '.';		levl[x][y].typ = ROOM;	}	smeq[nroom] = nroom;	croom++;	croom->hx = -1;	nroom++;	return(1);}makecorridors() {	register a,b;	nxcor = 0;	for(a = 0; a < nroom-1; a++)		join(a, a+1);	for(a = 0; a < nroom-2; a++)	    if(smeq[a] != smeq[a+2])		join(a, a+2);	for(a = 0; a < nroom; a++)	    for(b = 0; b < nroom; b++)		if(smeq[a] != smeq[b])		    join(a, b);	if(nroom > 2)	    for(nxcor = rn2(nroom) + 4; nxcor; nxcor--) {		a = rn2(nroom);		b = rn2(nroom-2);		if(b >= a) b += 2;		join(a, b);	    }}join(a,b)register a,b;{	coord cc,tt;	register tx, ty, xx, yy;	register struct rm *crm;	register struct mkroom *croom, *troom;	register dx, dy, dix, diy, cct;	croom = &rooms[a];	troom = &rooms[b];	/* find positions cc and tt for doors in croom and troom	   and direction for a corridor between them */	if(troom->hx < 0 || croom->hx < 0 || doorindex >= DOORMAX) return;	if(troom->lx > croom->hx) {		dx = 1;		dy = 0;		xx = croom->hx+1;		tx = troom->lx-1;		cc = finddpos(xx,croom->ly,xx,croom->hy);		tt = finddpos(tx,troom->ly,tx,troom->hy);	} else if(troom->hy < croom->ly) {		dy = -1;		dx = 0;		yy = croom->ly-1;		cc = finddpos(croom->lx,yy,croom->hx,yy);		ty = troom->hy+1;		tt = finddpos(troom->lx,ty,troom->hx,ty);	} else if(troom->hx < croom->lx) {		dx = -1;		dy = 0;		xx = croom->lx-1;		tx = troom->hx+1;		cc = finddpos(xx,croom->ly,xx,croom->hy);		tt = finddpos(tx,troom->ly,tx,troom->hy);	} else {		dy = 1;		dx = 0;		yy = croom->hy+1;		ty = troom->ly-1;		cc = finddpos(croom->lx,yy,croom->hx,yy);		tt = finddpos(troom->lx,ty,troom->hx,ty);	}	xx = cc.x;	yy = cc.y;	tx = tt.x - dx;	ty = tt.y - dy;	if(nxcor && levl[xx+dx][yy+dy].typ)		return;	dodoor(xx,yy,croom);	cct = 0;	while(xx != tx || yy != ty) {	    xx += dx;	    yy += dy;	    /* loop: dig corridor at [xx,yy] and find new [xx,yy] */	    if(cct++ > 500 || (nxcor && !rn2(35)))		return;	    if(xx == COLNO-1 || xx == 0 || yy == 0 || yy == ROWNO-1)		return;		/* impossible */	    crm = &levl[xx][yy];	    if(!(crm->typ)) {		if(rn2(100)) {			crm->typ = CORR;			crm->scrsym = CORR_SYM;			if(nxcor && !rn2(50))				(void) mkobj_at(ROCK_SYM, xx, yy);		} else {			crm->typ = SCORR;			crm->scrsym = ' ';		}	    } else	    if(crm->typ != CORR && crm->typ != SCORR) {		/* strange ... */		return;	    }	    /* find next corridor position */	    dix = abs(xx-tx);	    diy = abs(yy-ty);	    /* do we have to change direction ? */	    if(dy && dix > diy) {		register ddx = (xx > tx) ? -1 : 1;		crm = &levl[xx+ddx][yy];		if(!crm->typ || crm->typ == CORR || crm->typ == SCORR) {		    dx = ddx;		    dy = 0;		    continue;		}	    } else if(dx && diy > dix) {		register ddy = (yy > ty) ? -1 : 1;		crm = &levl[xx][yy+ddy];		if(!crm->typ || crm->typ == CORR || crm->typ == SCORR) {		    dy = ddy;		    dx = 0;		    continue;		}	    }	    /* continue straight on? */	    crm = &levl[xx+dx][yy+dy];	    if(!crm->typ || crm->typ == CORR || crm->typ == SCORR)		continue;	    /* no, what must we do now?? */	    if(dx) {		dx = 0;		dy = (ty < yy) ? -1 : 1;		crm = &levl[xx+dx][yy+dy];		if(!crm->typ || crm->typ == CORR || crm->typ == SCORR)		    continue;		dy = -dy;		continue;	    } else {		dy = 0;		dx = (tx < xx) ? -1 : 1;		crm = &levl[xx+dx][yy+dy];		if(!crm->typ || crm->typ == CORR || crm->typ == SCORR)		    continue;		dx = -dx;		continue;	    }	}	/* we succeeded in digging the corridor */	dodoor(tt.x, tt.y, troom);	if(smeq[a] < smeq[b])		smeq[b] = smeq[a];	else		smeq[a] = smeq[b];}make_niches(){	register int ct = rnd(nroom/2 + 1);	while(ct--) makeniche(FALSE);}makevtele(){	makeniche(TRUE);}makeniche(with_trap)boolean with_trap;{	register struct mkroom *aroom;	register struct rm *rm;	register int vct = 8;	coord dd;	register dy,xx,yy;	register struct trap *ttmp;	if(doorindex < DOORMAX)	  while(vct--) {	    aroom = &rooms[rn2(nroom-1)];	    if(aroom->rtype != 0) continue;	/* not an ordinary room */	    if(aroom->doorct == 1 && rn2(5)) continue;	    if(rn2(2)) {		dy = 1;		dd = finddpos(aroom->lx,aroom->hy+1,aroom->hx,aroom->hy+1);	    } else {		dy = -1;		dd = finddpos(aroom->lx,aroom->ly-1,aroom->hx,aroom->ly-1);	    }	    xx = dd.x;	    yy = dd.y;	    if((rm = &levl[xx][yy+dy])->typ) continue;	    if(with_trap || !rn2(4)) {		rm->typ = SCORR;		rm->scrsym = ' ';		if(with_trap) {		    ttmp = maketrap(xx, yy+dy, TELEP_TRAP);		    ttmp->once = 1;		    make_engr_at(xx, yy-dy, "ad ae?ar um");		}		dosdoor(xx, yy, aroom, SDOOR);	    } else {		rm->typ = CORR;		rm->scrsym = CORR_SYM;		if(rn2(7))		    dosdoor(xx, yy, aroom, rn2(5) ? SDOOR : DOOR);		else {		    mksobj_at(SCR_TELEPORTATION, xx, yy+dy);		    if(!rn2(3)) (void) mkobj_at(0, xx, yy+dy);		}	    }	    return;	}}/* make a trap somewhere (in croom if mazeflag = 0) */mktrap(num,mazeflag,croom)register num,mazeflag;register struct mkroom *croom;{	register struct trap *ttmp;	register int kind,nopierc,nomimic,fakedoor,fakegold,tryct = 0;	register xchar mx,my;	extern char fut_geno[];	if(!num || num >= TRAPNUM) {		nopierc = (dlevel < 4) ? 1 : 0;		nomimic = (dlevel < 9 || goldseen ) ? 1 : 0;		if(index(fut_geno, 'M')) nomimic = 1;		kind = rn2(TRAPNUM - nopierc - nomimic);		/* note: PIERC = 7, MIMIC = 8, TRAPNUM = 9 */	} else kind = num;	if(kind == MIMIC) {		register struct monst *mtmp;		fakedoor = (!rn2(3) && !mazeflag);		fakegold = (!fakedoor && !rn2(2));		if(fakegold) goldseen = TRUE;		do {			if(++tryct > 200) return;			if(fakedoor) {				/* note: fakedoor maybe on actual door */				if(rn2(2)){					if(rn2(2))						mx = croom->hx+1;					else mx = croom->lx-1;					my = somey();				} else {					if(rn2(2))						my = croom->hy+1;					else my = croom->ly-1;					mx = somex();				}			} else if(mazeflag) {				extern coord mazexy();				coord mm;				mm = mazexy();				mx = mm.x;				my = mm.y;			} else {				mx = somex();				my = somey();			}		} while(m_at(mx,my) || levl[mx][my].typ == STAIRS);		if(mtmp = makemon(PM_MIMIC,mx,my)) {		    mtmp->mimic = 1;		    mtmp->mappearance =			fakegold ? '$' : fakedoor ? '+' :			(mazeflag && rn2(2)) ? AMULET_SYM :			"=/)%?![<>" [ rn2(9) ];		}		return;	}	do {		if(++tryct > 200)			return;		if(mazeflag){			extern coord mazexy();			coord mm;			mm = mazexy();			mx = mm.x;			my = mm.y;		} else {			mx = somex();			my = somey();		}	} while(t_at(mx, my) || levl[mx][my].typ == STAIRS);	ttmp = maketrap(mx, my, kind);	if(mazeflag && !rn2(10) && ttmp->ttyp < PIERC)		ttmp->tseen = 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -