Tiny chance of breaking iron bars with war hammer

Also add some different sounds to hitting the iron bars,
and make it noisy.
This commit is contained in:
Pasi Kallinen
2023-01-26 18:21:50 +02:00
parent 7f4e69f885
commit f61e1e8e23
6 changed files with 30 additions and 8 deletions

View File

@@ -13,7 +13,6 @@ static int throw_ok(struct obj *);
static void autoquiver(void);
static struct obj *find_launcher(struct obj *);
static int gem_accept(struct monst *, struct obj *);
static boolean harmless_missile(struct obj *);
static boolean toss_up(struct obj *, boolean);
static void sho_obj_return_to_u(struct obj * obj);
static struct obj *return_throw_to_inv(struct obj *, long, boolean,
@@ -1184,7 +1183,7 @@ check_shop_obj(struct obj *obj, coordxy x, coordxy y, boolean broken)
/* Will 'obj' cause damage if it falls on hero's head when thrown upward?
Not used to handle things which break when they hit.
Stone missile hitting hero w/ Passes_walls attribute handled separately. */
static boolean
boolean
harmless_missile(struct obj *obj)
{
int otyp = obj->otyp;

View File

@@ -1755,7 +1755,7 @@ domove_fight_ironbars(coordxy x, coordxy y)
{
if (gc.context.forcefight && levl[x][y].typ == IRONBARS && uwep) {
struct obj *obj = uwep;
unsigned breakflags = (BRK_BY_HERO | BRK_FROM_INV);
unsigned breakflags = (BRK_BY_HERO | BRK_FROM_INV | BRK_MELEE);
if (breaktest(obj)) {
if (obj->quan > 1L)

View File

@@ -1213,7 +1213,9 @@ hit_bars(
struct obj *otmp = *objp;
int obj_type = otmp->otyp;
boolean nodissolve = (levl[barsx][barsy].wall_info & W_NONDIGGABLE) != 0,
your_fault = (breakflags & BRK_BY_HERO) != 0;
your_fault = (breakflags & BRK_BY_HERO) != 0,
melee_attk = (breakflags & BRK_MELEE) != 0;
int noise = 0;
if (your_fault
? hero_breaks(otmp, objx, objy, breakflags)
@@ -1235,11 +1237,29 @@ hit_bars(
if (!Deaf)
pline("%s!", (obj_type == BOULDER || obj_type == HEAVY_IRON_BALL)
? "Whang"
: harmless_missile(otmp) ? "Whap"
: is_flimsy(otmp) ? "Flapp"
: (otmp->oclass == COIN_CLASS
|| objects[obj_type].oc_material == GOLD
|| objects[obj_type].oc_material == SILVER)
? "Clink"
: "Clonk");
if (!(harmless_missile(otmp) || is_flimsy(otmp)))
noise = 4 * 4;
if (your_fault && otmp->otyp == WAR_HAMMER) {
int chance = (melee_attk ? 40 : 60) - ACURR(A_STR) - otmp->spe;
if (!rn2(max(2, chance))) {
You("break the bars apart!");
dissolve_bars(barsx, barsy);
noise = noise * 2;
}
}
if (noise)
wake_nearto(barsx, barsy, noise);
}
}