From: Pasi Kallinen Date: Thu, 26 Jan 2023 16:21:50 +0000 (+0200) Subject: Tiny chance of breaking iron bars with war hammer X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f61e1e8e23f48f670c5b7c465089effd7743aba9;p=nethack Tiny chance of breaking iron bars with war hammer Also add some different sounds to hitting the iron bars, and make it noisy. --- diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index 167e34fbc..1915cd325 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -1100,6 +1100,7 @@ kicking a headstone might summon a ghoul eating garlic makes nearby monsters flee giants occasionally get a battle axe or a two-handed sword give gremlin the property it stole, if possible +'F'orcefighting with a war hammer has a small chance of breaking iron bars Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/include/extern.h b/include/extern.h index bfa8e3617..b954e4662 100644 --- a/include/extern.h +++ b/include/extern.h @@ -643,6 +643,7 @@ extern void endmultishot(boolean); extern void hitfloor(struct obj *, boolean); extern void hurtle(int, int, int, boolean); extern void mhurtle(struct monst *, int, int, int); +extern boolean harmless_missile(struct obj *); extern boolean throwing_weapon(struct obj *); extern void throwit(struct obj *, long, boolean, struct obj *); extern int omon_adj(struct monst *, struct obj *, boolean); diff --git a/include/hack.h b/include/hack.h index bc86fc616..327849ac5 100644 --- a/include/hack.h +++ b/include/hack.h @@ -595,11 +595,12 @@ enum bodypart_types { /* flags for hero_breaks() and hits_bars(); BRK_KNOWN* let callers who have already called breaktest() prevent it from being called again since it has a random factor which makes it be non-deterministic */ -#define BRK_BY_HERO 1 -#define BRK_FROM_INV 2 -#define BRK_KNOWN2BREAK 4 -#define BRK_KNOWN2NOTBREAK 8 +#define BRK_BY_HERO 0x01 +#define BRK_FROM_INV 0x02 +#define BRK_KNOWN2BREAK 0x04 +#define BRK_KNOWN2NOTBREAK 0x08 #define BRK_KNOWN_OUTCOME (BRK_KNOWN2BREAK | BRK_KNOWN2NOTBREAK) +#define BRK_MELEE 0x10 /* extended command return values */ #define ECMD_OK 0x00 /* cmd done successfully */ diff --git a/src/dothrow.c b/src/dothrow.c index 84b16e099..528db9039 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -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; diff --git a/src/hack.c b/src/hack.c index 30cd2f7ec..bdf85aea1 100644 --- a/src/hack.c +++ b/src/hack.c @@ -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) diff --git a/src/mthrowu.c b/src/mthrowu.c index 2f664b869..a5f745b4e 100644 --- a/src/mthrowu.c +++ b/src/mthrowu.c @@ -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); } }