From 5d492abf6f3d1f2e9241bf1e3b47dd1f1974f320 Mon Sep 17 00:00:00 2001 From: cohrs Date: Wed, 21 Aug 2002 23:06:58 +0000 Subject: [PATCH] R1049 - various wand of digging bugs - Breaking wand of digging dug through rock which should be undiggable. Checks assumed pits would never show up in solid rock. - Breaking wand of digging near shop walls wouldn't anger the shopkeeper Checks assumed pits would never show up in walls, also, added a special case to pay_for_damage to handle the case where you're falling thru and can't be asked to pay. - Shop walls wouldn't be restored if there are pits in the way. Checks assumed pits would never show up in walls. - If there was a hole outside the shop, you could kick stuff out of the door into the hole without shopkeeper noticing. Added the missing check. --- doc/fixes34.1 | 5 +++++ include/extern.h | 2 +- src/apply.c | 10 +++++++++- src/dig.c | 17 ++++++++++------- src/dokick.c | 11 +++++++++-- src/explode.c | 3 ++- src/hack.c | 2 +- src/shk.c | 9 +++++---- src/trap.c | 6 ++++-- src/zap.c | 4 ++-- 10 files changed, 48 insertions(+), 21 deletions(-) diff --git a/doc/fixes34.1 b/doc/fixes34.1 index 42ee888ae..4f25e6390 100644 --- a/doc/fixes34.1 +++ b/doc/fixes34.1 @@ -212,6 +212,11 @@ don't see chest trap gas colors while Blind adjust fruit name in potion juice messages if it has the form "foo of bar" wielded camera passes harmlessly through shade reading spellbooks while confused should allow tearing the book +Breaking wand of digging dug through rock which should be undiggable. +Breaking wand of digging near shop walls wouldn't anger the shopkeeper +Shop walls wouldn't be restored if there were pits in the way. +If there were a hole outside a shop, you could kick stuff out of the door + into the hole without the shopkeeper noticing. Platform- and/or Interface-Specific Fixes diff --git a/include/extern.h b/include/extern.h index 0915fe706..cbc02543c 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1779,7 +1779,7 @@ E int FDECL(shk_move, (struct monst *)); E void FDECL(after_shk_move, (struct monst *)); E boolean FDECL(is_fshk, (struct monst *)); E void FDECL(shopdig, (int)); -E void FDECL(pay_for_damage, (const char *)); +E void FDECL(pay_for_damage, (const char *,BOOLEAN_P)); E boolean FDECL(costly_spot, (XCHAR_P,XCHAR_P)); E struct obj *FDECL(shop_object, (XCHAR_P,XCHAR_P)); E void FDECL(price_quote, (struct obj *)); diff --git a/src/apply.c b/src/apply.c index c432f24d8..6e1e645dc 100644 --- a/src/apply.c +++ b/src/apply.c @@ -2556,6 +2556,7 @@ do_break_wand(obj) register struct monst *mon; int dmg, damage; boolean affects_objects; + boolean shop_damage = FALSE; int expltype = EXPL_MAGICAL; char confirm[QBUFSZ], the_wand[BUFSZ], buf[BUFSZ]; @@ -2643,10 +2644,13 @@ do_break_wand(obj) if (!isok(x,y)) continue; if (obj->otyp == WAN_DIGGING) { - if(dig_check(BY_OBJECT, FALSE, x, y)) + if(dig_check(BY_OBJECT, FALSE, x, y)) { + if ((IS_WALL(levl[x][y].typ) || IS_DOOR(levl[x][y].typ)) && + *in_rooms(x,y,SHOPBASE)) shop_damage = TRUE; digactualhole(x, y, BY_OBJECT, (rn2(obj->spe) < 3 || !Can_dig_down(&u.uz)) ? PIT : HOLE); + } continue; } else if(obj->otyp == WAN_CREATE_MONSTER) { /* u.ux,u.uy creates it near you--x,y might create it in rock */ @@ -2679,6 +2683,10 @@ do_break_wand(obj) } } + /* Note: if player fell thru, this call is a no-op. + Damage is handled in digactualhole in that case */ + if (shop_damage) pay_for_damage("dig into", FALSE); + if (obj->otyp == WAN_LIGHT) litroom(TRUE, obj); /* only needs to be done once */ diff --git a/src/dig.c b/src/dig.c index 7016de891..48fa80258 100644 --- a/src/dig.c +++ b/src/dig.c @@ -186,7 +186,7 @@ dig_check(madeby, verbose, x, y) } else if (Is_waterlevel(&u.uz)) { if(verbose) pline_The("water splashes and subsides."); return(FALSE); - } else if ((IS_WALL(levl[x][y].typ) && + } else if ((IS_ROCK(levl[x][y].typ) && levl[x][y].typ != SDOOR && (levl[x][y].wall_info & W_NONDIGGABLE) != 0) || (ttmp && (ttmp->ttyp == MAGIC_PORTAL || !Can_dig_down(&u.uz)))) { @@ -381,7 +381,7 @@ dig() newsym(dpx, dpy); if(digtxt && !digging.quiet) pline(digtxt); /* after newsym */ if(dmgtxt) - pay_for_damage(dmgtxt); + pay_for_damage(dmgtxt, FALSE); if(Is_earthlevel(&u.uz) && !rn2(3)) { register struct monst *mtmp; @@ -531,7 +531,7 @@ int ttyp; if(madeby_u) { You("dig a pit in the %s.", surface_type); - if (shopdoor) pay_for_damage("ruin"); + if (shopdoor) pay_for_damage("ruin", FALSE); } else if (!madeby_obj && canseemon(madeby)) pline("%s digs a pit in the %s.", Monnam(madeby), surface_type); else if (cansee(x, y) && flags.verbose) @@ -580,13 +580,15 @@ int ttyp; impact_drop((struct obj *)0, x, y, 0); if (oldobjs != newobjs) (void) pickup(1); - if (shopdoor && madeby_u) pay_for_damage("ruin"); + if (shopdoor && madeby_u) pay_for_damage("ruin", FALSE); } else { d_level newlevel; if (*u.ushops && madeby_u) shopdig(1); /* shk might snatch pack */ + /* handle earlier damage, eg breaking wand of digging */ + else if (!madeby_u) pay_for_damage("dig into", TRUE); You("fall through..."); /* Earlier checks must ensure that the destination @@ -599,7 +601,7 @@ int ttyp; spoteffects(FALSE); } } else { - if (shopdoor && madeby_u) pay_for_damage("ruin"); + if (shopdoor && madeby_u) pay_for_damage("ruin", FALSE); if (newobjs) impact_drop((struct obj *)0, x, y, 0); if (mtmp) { @@ -643,7 +645,8 @@ boolean pit_only; boolean nohole = !Can_dig_down(&u.uz); if ((ttmp && (ttmp->ttyp == MAGIC_PORTAL || nohole)) || - (IS_WALL(lev->typ) && (lev->wall_info & W_NONDIGGABLE) != 0)) { + (IS_ROCK(lev->typ) && lev->typ != SDOOR && + (lev->wall_info & W_NONDIGGABLE) != 0)) { pline_The("%s here is too hard to dig in.", surface(u.ux,u.uy)); } else if (is_pool(u.ux, u.uy) || is_lava(u.ux, u.uy)) { @@ -1261,7 +1264,7 @@ zap_dig() } /* while */ tmp_at(DISP_END,0); /* closing call */ if (shopdoor || shopwall) - pay_for_damage(shopdoor ? "destroy" : "dig into"); + pay_for_damage(shopdoor ? "destroy" : "dig into", FALSE); return; } diff --git a/src/dokick.c b/src/dokick.c index 5de4508b2..a37fe27e7 100644 --- a/src/dokick.c +++ b/src/dokick.c @@ -541,8 +541,15 @@ xchar x, y; } /* the object might have fallen down a hole */ - if (kickobj->where == OBJ_MIGRATING) + if (kickobj->where == OBJ_MIGRATING) { + if (costly) { + if(isgold) + costly_gold(x, y, kickobj->quan); + else (void)stolen_value(kickobj, x, y, + (boolean)shkp->mpeaceful, FALSE); + } return 1; + } bhitroom = *in_rooms(bhitpos.x, bhitpos.y, SHOPBASE); if (costly && (!costly_spot(bhitpos.x, bhitpos.y) || @@ -1014,7 +1021,7 @@ dumb: unblock_point(x,y); /* vision */ if (shopdoor) { add_damage(x, y, 400L); - pay_for_damage("break"); + pay_for_damage("break", FALSE); } if (in_town(x, y)) for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { diff --git a/src/explode.c b/src/explode.c index 543b199d0..5413bdf8f 100644 --- a/src/explode.c +++ b/src/explode.c @@ -367,7 +367,8 @@ int expltype; if (shopdamage) { pay_for_damage(adtyp == AD_FIRE ? "burn away" : adtyp == AD_COLD ? "shatter" : - adtyp == AD_DISN ? "disintegrate" : "destroy"); + adtyp == AD_DISN ? "disintegrate" : "destroy", + FALSE); } /* explosions are noisy */ diff --git a/src/hack.c b/src/hack.c index 9afbb169b..0e366318a 100644 --- a/src/hack.c +++ b/src/hack.c @@ -422,7 +422,7 @@ still_chewing(x,y) unblock_point(x, y); /* vision */ newsym(x, y); if (digtxt) You(digtxt); /* after newsym */ - if (dmgtxt) pay_for_damage(dmgtxt); + if (dmgtxt) pay_for_damage(dmgtxt, FALSE); (void) memset((genericptr_t)&digging, 0, sizeof digging); return 0; } diff --git a/src/shk.c b/src/shk.c index caf38a3c7..15429ec35 100644 --- a/src/shk.c +++ b/src/shk.c @@ -3410,8 +3410,9 @@ coord *mm; #endif /* KOPS */ void -pay_for_damage(dmgstr) +pay_for_damage(dmgstr, cant_mollify) const char *dmgstr; +boolean cant_mollify; { register struct monst *shkp = (struct monst *)0; char shops_affected[5]; @@ -3521,11 +3522,11 @@ const char *dmgstr; (void) mnearto(shkp, x, y, TRUE); } - if((um_dist(x, y, 1) && !uinshp) || + if((um_dist(x, y, 1) && !uinshp) || cant_mollify || #ifndef GOLDOBJ - (u.ugold + ESHK(shkp)->credit) < cost_of_damage + (u.ugold + ESHK(shkp)->credit) < cost_of_damage #else - (money_cnt(invent) + ESHK(shkp)->credit) < cost_of_damage + (money_cnt(invent) + ESHK(shkp)->credit) < cost_of_damage #endif || !rn2(50)) { if(um_dist(x, y, 1) && !uinshp) { diff --git a/src/trap.c b/src/trap.c index f26a300da..062c2136b 100644 --- a/src/trap.c +++ b/src/trap.c @@ -283,9 +283,11 @@ register int x, y, typ; case TRAPDOOR: lev = &levl[x][y]; if (*in_rooms(x, y, SHOPBASE) && - ((typ == HOLE || typ == TRAPDOOR) || IS_DOOR(lev->typ))) + ((typ == HOLE || typ == TRAPDOOR) || + IS_DOOR(lev->typ) || IS_WALL(lev->typ))) add_damage(x, y, /* schedule repair */ - (IS_DOOR(lev->typ) && !flags.mon_moving) ? 200L : 0L); + ((IS_DOOR(lev->typ) || IS_WALL(lev->typ)) + && !flags.mon_moving) ? 200L : 0L); lev->doormask = 0; /* subsumes altarmask, icedpool... */ if (IS_ROOM(lev->typ)) /* && !IS_AIR(lev->typ) */ lev->typ = ROOM; diff --git a/src/zap.c b/src/zap.c index cabaf61c9..bab3b5a02 100644 --- a/src/zap.c +++ b/src/zap.c @@ -2783,7 +2783,7 @@ struct obj *obj; /* object tossed/used */ if (weapon != ZAPPED_WAND && weapon != INVIS_BEAM) tmp_at(DISP_END, 0); if(shopdoor) - pay_for_damage("destroy"); + pay_for_damage("destroy", FALSE); return (struct monst *)0; } @@ -3456,7 +3456,7 @@ register int dx,dy; if (shopdamage) pay_for_damage(abstype == ZT_FIRE ? "burn away" : abstype == ZT_COLD ? "shatter" : - abstype == ZT_DEATH ? "disintegrate" : "destroy"); + abstype == ZT_DEATH ? "disintegrate" : "destroy", FALSE); bhitpos = save_bhitpos; } #endif /*OVLB*/