📄 hack.c
字号:
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 + -