From: Pasi Kallinen Date: Thu, 24 Feb 2022 17:27:56 +0000 (+0200) Subject: Moving a monster with telekinesis hurles it through the air X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0c20bf116c779101e3810d673bd87ea8c2cae84e;p=nethack Moving a monster with telekinesis hurles it through the air ... and at the end of the flight, it can't avoid a trap, if it lands on one. --- diff --git a/include/hack.h b/include/hack.h index 037751b8e..4b2a094cf 100644 --- a/include/hack.h +++ b/include/hack.h @@ -390,6 +390,7 @@ typedef struct sortloot_item Loot; #define TOOKPLUNGE 0x10 /* used '>' to enter pit below you */ #define VIASITTING 0x20 /* #sit while at trap location (affects message) */ #define FAILEDUNTRAP 0x40 /* trap activated by failed untrap attempt */ +#define HURTLING 0x80 /* monster is hurtling through air */ /* Flags to control test_move in hack.c */ #define DO_MOVE 0 /* really doing the move */ diff --git a/src/dothrow.c b/src/dothrow.c index 874e3b20b..d71b42e12 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -921,7 +921,7 @@ mhurtle_step(genericptr_t arg, int x, int y) set_apparxy(mon); if (is_waterwall(x, y)) return FALSE; - res = mintrap(mon, NO_TRAP_FLAGS); /* TODO: TEMPFLIGHT? */ + res = mintrap(mon, HURTLING); if (res == Trap_Killed_Mon || res == Trap_Caught_Mon || res == Trap_Moved_Mon) @@ -1039,7 +1039,10 @@ mhurtle(struct monst *mon, int dx, int dy, int range) cc.x = mon->mx + (dx * range); cc.y = mon->my + (dy * range); (void) walk_path(&mc, &cc, mhurtle_step, (genericptr_t) mon); - (void) minliquid(mon); + if (!DEADMONSTER(mon) && t_at(mon->mx, mon->my)) + mintrap(mon, FORCEBUNGLE); + else + (void) minliquid(mon); return; } diff --git a/src/trap.c b/src/trap.c index d3127dfd0..3f365bddd 100644 --- a/src/trap.c +++ b/src/trap.c @@ -965,6 +965,7 @@ check_in_air(struct monst *mtmp, unsigned trflags) return (is_floater(mtmp->data) || (is_flyer(mtmp->data) && !plunged) + || (trflags & HURTLING) != 0 || (mtmp == &g.youmonst ? (Levitation || (Flying && !plunged)) : 0)); } @@ -3171,6 +3172,7 @@ mintrap(register struct monst *mtmp, long mintrapflags) } else { register int tt = trap->ttyp; boolean forcetrap = ((mintrapflags & FORCETRAP) != 0); + boolean forcebungle = (mintrapflags & FORCEBUNGLE) != 0; /* monster has seen such a trap before */ boolean already_seen = ((mtmp->mtrapseen & (1 << (tt - 1))) != 0 || (tt == HOLE && !mindless(mptr))); @@ -3183,7 +3185,7 @@ mintrap(register struct monst *mtmp, long mintrapflags) if (floor_trigger(tt) && check_in_air(mtmp, mintrapflags)) { return Trap_Effect_Finished; } - if (already_seen && rn2(4)) + if (already_seen && rn2(4) && !forcebungle) return Trap_Effect_Finished; }