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

📄 hack.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
		    continue;		  }		}		wt = inv_weight() + obj->owt;		if(wt > 0) {			if(obj->quan > 1) {				/* see how many we can lift */				extern struct obj *splitobj();				int savequan = obj->quan;				int iw = inv_weight();				int qq;				for(qq = 1; qq < savequan; qq++){					obj->quan = qq;					if(iw + weight(obj) > 0)						break;				}				obj->quan = savequan;				qq--;				/* we can carry qq of them */				if(!qq) goto too_heavy;			pline("You can only carry %s of the %s lying here.",					(qq == 1) ? "one" : "some",					doname(obj));				(void) splitobj(obj, qq);				/* note: obj2 is set already, so we'll never				 * encounter the other half; if it should be				 * otherwise then write				 *	obj2 = splitobj(obj,qq);				 */				goto lift_some;			}		too_heavy:			pline("There %s %s here, but %s.",				(obj->quan == 1) ? "is" : "are",				doname(obj),				!invent ? "it is too heavy for you to lift"					: "you cannot carry anymore");			break;		}	lift_some:		if(inv_cnt() >= 52) {		    pline("Your knapsack cannot accomodate anymore items.");		    break;		}		if(wt > -5) pline("You have a little trouble lifting");		freeobj(obj);		if(Invisible) newsym(u.ux,u.uy);		addtobill(obj);       /* sets obj->unpaid if necessary */		{ int pickquan = obj->quan;		  int mergquan;		if(!Blind) obj->dknown = 1;	/* this is done by prinv(),				 but addinv() needs it already for merging */		obj = addinv(obj);    /* might merge it with other objects */		  mergquan = obj->quan;		  obj->quan = pickquan;	/* to fool prinv() */		prinv(obj);		  obj->quan = mergquan;		}	    }	}}/* stop running if we see something interesting *//* turn around a corner if that is the only way we can proceed *//* do not turn left or right twice */lookaround(){register x,y,i,x0,y0,m0,i0 = 9;register int corrct = 0, noturn = 0;register struct monst *mtmp;#ifdef lint	/* suppress "used before set" message */	x0 = y0 = 0;#endif lint	if(Blind || flags.run == 0) return;	if(flags.run == 1 && levl[u.ux][u.uy].typ == ROOM) return;#ifdef QUEST	if(u.ux0 == u.ux+u.dx && u.uy0 == u.uy+u.dy) goto stop;#endif QUEST	for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++){		if(x == u.ux && y == u.uy) continue;		if(!levl[x][y].typ) continue;		if((mtmp = m_at(x,y)) && !mtmp->mimic &&		    (!mtmp->minvis || See_invisible)){			if(!mtmp->mtame || (x == u.ux+u.dx && y == u.uy+u.dy))				goto stop;		} else mtmp = 0; /* invisible M cannot influence us */		if(x == u.ux-u.dx && y == u.uy-u.dy) continue;		switch(levl[x][y].scrsym){		case '|':		case '-':		case '.':		case ' ':			break;		case '+':			if(x != u.ux && y != u.uy) break;			if(flags.run != 1) goto stop;			/* fall into next case */		case CORR_SYM:		corr:			if(flags.run == 1 || flags.run == 3) {				i = DIST(x,y,u.ux+u.dx,u.uy+u.dy);				if(i > 2) break;				if(corrct == 1 && DIST(x,y,x0,y0) != 1)					noturn = 1;				if(i < i0) {					i0 = i;					x0 = x;					y0 = y;					m0 = mtmp ? 1 : 0;				}			}			corrct++;			break;		case '^':			if(flags.run == 1) goto corr;	/* if you must */			if(x == u.ux+u.dx && y == u.uy+u.dy) goto stop;			break;		default:	/* e.g. objects or trap or stairs */			if(flags.run == 1) goto corr;			if(mtmp) break;		/* d */		stop:			nomul(0);			return;		}	}#ifdef QUEST	if(corrct > 0 && (flags.run == 4 || flags.run == 5)) goto stop;#endif QUEST	if(corrct > 1 && flags.run == 2) goto stop;	if((flags.run == 1 || flags.run == 3) && !noturn && !m0 && i0 &&		(corrct == 1 || (corrct == 2 && i0 == 1))) {		/* make sure that we do not turn too far */		if(i0 == 2) {		    if(u.dx == y0-u.uy && u.dy == u.ux-x0)			i = 2;		/* straight turn right */		    else			i = -2;		/* straight turn left */		} else if(u.dx && u.dy) {		    if((u.dx == u.dy && y0 == u.uy) ||			(u.dx != u.dy && y0 != u.uy))			i = -1;		/* half turn left */		    else			i = 1;		/* half turn right */		} else {		    if((x0-u.ux == y0-u.uy && !u.dy) ||			(x0-u.ux != y0-u.uy && u.dy))			i = 1;		/* half turn right */		    else			i = -1;		/* half turn left */		}		i += u.last_str_turn;		if(i <= 2 && i >= -2) {			u.last_str_turn = i;			u.dx = x0-u.ux, u.dy = y0-u.uy;		}	}}/* something like lookaround, but we are not running *//* react only to monsters that might hit us */monster_nearby() {register int x,y;register struct monst *mtmp;	if(!Blind)	for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++){		if(x == u.ux && y == u.uy) continue;		if((mtmp = m_at(x,y)) && !mtmp->mimic && !mtmp->mtame &&			!mtmp->mpeaceful && !index("Ea", mtmp->data->mlet) &&			!mtmp->mfroz && !mtmp->msleep &&  /* aplvax!jcn */			(!mtmp->minvis || See_invisible))			return(1);	}	return(0);}#ifdef QUESTcansee(x,y) xchar x,y; {register int dx,dy,adx,ady,sdx,sdy,dmax,d;	if(Blind) return(0);	if(!isok(x,y)) return(0);	d = dist(x,y);	if(d < 3) return(1);	if(d > u.uhorizon*u.uhorizon) return(0);	if(!levl[x][y].lit)		return(0);	dx = x - u.ux;	adx = abs(dx);	sdx = sgn(dx);	dy = y - u.uy;  ady = abs(dy);	sdy = sgn(dy);	if(dx == 0 || dy == 0 || adx == ady){		dmax = (dx == 0) ? ady : adx;		for(d = 1; d <= dmax; d++)			if(!rroom(sdx*d,sdy*d))				return(0);		return(1);	} else if(ady > adx){		for(d = 1; d <= ady; d++){			if(!rroom(sdx*( (d*adx)/ady ), sdy*d) ||			   !rroom(sdx*( (d*adx-1)/ady+1 ), sdy*d))				return(0);		}		return(1);	} else {		for(d = 1; d <= adx; d++){			if(!rroom(sdx*d, sdy*( (d*ady)/adx )) ||			   !rroom(sdx*d, sdy*( (d*ady-1)/adx+1 )))				return(0);		}		return(1);	}}rroom(x,y) register int x,y; {	return(IS_ROOM(levl[u.ux+x][u.uy+y].typ));}#elsecansee(x,y) xchar x,y; {	if(Blind || u.uswallow) return(0);	if(dist(x,y) < 3) return(1);	if(levl[x][y].lit && seelx <= x && x <= seehx && seely <= y &&		y <= seehy) return(1);	return(0);}#endif QUESTsgn(a) register int a; {	return((a > 0) ? 1 : (a == 0) ? 0 : -1);}#ifdef QUESTsetsee(){	register x,y;	if(Blind) {		pru();		return;	}	for(y = u.uy-u.uhorizon; y <= u.uy+u.uhorizon; y++)		for(x = u.ux-u.uhorizon; x <= u.ux+u.uhorizon; x++) {			if(cansee(x,y))				prl(x,y);	}}#elsesetsee(){	register x,y;	if(Blind) {		pru();		return;	}	if(!levl[u.ux][u.uy].lit) {		seelx = u.ux-1;		seehx = u.ux+1;		seely = u.uy-1;		seehy = u.uy+1;	} else {		for(seelx = u.ux; levl[seelx-1][u.uy].lit; seelx--);		for(seehx = u.ux; levl[seehx+1][u.uy].lit; seehx++);		for(seely = u.uy; levl[u.ux][seely-1].lit; seely--);		for(seehy = u.uy; levl[u.ux][seehy+1].lit; seehy++);	}	for(y = seely; y <= seehy; y++)		for(x = seelx; x <= seehx; x++) {			prl(x,y);	}	if(!levl[u.ux][u.uy].lit) seehx = 0; /* seems necessary elsewhere */	else {	    if(seely == u.uy) for(x = u.ux-1; x <= u.ux+1; x++) prl(x,seely-1);	    if(seehy == u.uy) for(x = u.ux-1; x <= u.ux+1; x++) prl(x,seehy+1);	    if(seelx == u.ux) for(y = u.uy-1; y <= u.uy+1; y++) prl(seelx-1,y);	    if(seehx == u.ux) for(y = u.uy-1; y <= u.uy+1; y++) prl(seehx+1,y);	}}#endif QUESTnomul(nval)register nval;{	if(multi < 0) return;	multi = nval;	flags.mv = flags.run = 0;}abon(){	if(u.ustr == 3) return(-3);	else if(u.ustr < 6) return(-2);	else if(u.ustr < 8) return(-1);	else if(u.ustr < 17) return(0);	else if(u.ustr < 69) return(1);	/* up to 18/50 */	else if(u.ustr < 118) return(2);	else return(3);}dbon(){	if(u.ustr < 6) return(-1);	else if(u.ustr < 16) return(0);	else if(u.ustr < 18) return(1);	else if(u.ustr == 18) return(2);	/* up to 18 */	else if(u.ustr < 94) return(3);		/* up to 18/75 */	else if(u.ustr < 109) return(4);	/* up to 18/90 */	else if(u.ustr < 118) return(5);	/* up to 18/99 */	else return(6);}losestr(num)	/* may kill you; cause may be poison or monster like 'A' */register num;{	u.ustr -= num;	while(u.ustr < 3) {		u.ustr++;		u.uhp -= 6;		u.uhpmax -= 6;	}	flags.botl = 1;}losehp(n,knam)register n;register char *knam;{	u.uhp -= n;	if(u.uhp > u.uhpmax)		u.uhpmax = u.uhp;	/* perhaps n was negative */	flags.botl = 1;	if(u.uhp < 1) {		killer = knam;	/* the thing that killed you */		done("died");	}}losehp_m(n,mtmp)register n;register struct monst *mtmp;{	u.uhp -= n;	flags.botl = 1;	if(u.uhp < 1)		done_in_by(mtmp);}losexp()	/* hit by V or W */{	register num;	extern long newuexp();	if(u.ulevel > 1)		pline("Goodbye level %u.", u.ulevel--);	else		u.uhp = -1;	num = rnd(10);	u.uhp -= num;	u.uhpmax -= num;	u.uexp = newuexp();	flags.botl = 1;}inv_weight(){register struct obj *otmp = invent;register int wt = (u.ugold + 500)/1000;register int carrcap;	if(Levitation)			/* pugh@cornell */		carrcap = MAX_CARR_CAP;	else {		carrcap = 5*(((u.ustr > 18) ? 20 : u.ustr) + u.ulevel);		if(carrcap > MAX_CARR_CAP) carrcap = MAX_CARR_CAP;		if(Wounded_legs & LEFT_SIDE) carrcap -= 10;		if(Wounded_legs & RIGHT_SIDE) carrcap -= 10;	}	while(otmp){		wt += otmp->owt;		otmp = otmp->nobj;	}	return(wt - carrcap);}inv_cnt(){register struct obj *otmp = invent;register int ct = 0;	while(otmp){		ct++;		otmp = otmp->nobj;	}	return(ct);}longnewuexp(){	return(10*(1L << (u.ulevel-1)));}

⌨️ 快捷键说明

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