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.
This commit is contained in:
@@ -390,6 +390,7 @@ typedef struct sortloot_item Loot;
|
|||||||
#define TOOKPLUNGE 0x10 /* used '>' to enter pit below you */
|
#define TOOKPLUNGE 0x10 /* used '>' to enter pit below you */
|
||||||
#define VIASITTING 0x20 /* #sit while at trap location (affects message) */
|
#define VIASITTING 0x20 /* #sit while at trap location (affects message) */
|
||||||
#define FAILEDUNTRAP 0x40 /* trap activated by failed untrap attempt */
|
#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 */
|
/* Flags to control test_move in hack.c */
|
||||||
#define DO_MOVE 0 /* really doing the move */
|
#define DO_MOVE 0 /* really doing the move */
|
||||||
|
|||||||
@@ -921,7 +921,7 @@ mhurtle_step(genericptr_t arg, int x, int y)
|
|||||||
set_apparxy(mon);
|
set_apparxy(mon);
|
||||||
if (is_waterwall(x, y))
|
if (is_waterwall(x, y))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
res = mintrap(mon, NO_TRAP_FLAGS); /* TODO: TEMPFLIGHT? */
|
res = mintrap(mon, HURTLING);
|
||||||
if (res == Trap_Killed_Mon
|
if (res == Trap_Killed_Mon
|
||||||
|| res == Trap_Caught_Mon
|
|| res == Trap_Caught_Mon
|
||||||
|| res == Trap_Moved_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.x = mon->mx + (dx * range);
|
||||||
cc.y = mon->my + (dy * range);
|
cc.y = mon->my + (dy * range);
|
||||||
(void) walk_path(&mc, &cc, mhurtle_step, (genericptr_t) mon);
|
(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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -965,6 +965,7 @@ check_in_air(struct monst *mtmp, unsigned trflags)
|
|||||||
|
|
||||||
return (is_floater(mtmp->data)
|
return (is_floater(mtmp->data)
|
||||||
|| (is_flyer(mtmp->data) && !plunged)
|
|| (is_flyer(mtmp->data) && !plunged)
|
||||||
|
|| (trflags & HURTLING) != 0
|
||||||
|| (mtmp == &g.youmonst ?
|
|| (mtmp == &g.youmonst ?
|
||||||
(Levitation || (Flying && !plunged)) : 0));
|
(Levitation || (Flying && !plunged)) : 0));
|
||||||
}
|
}
|
||||||
@@ -3171,6 +3172,7 @@ mintrap(register struct monst *mtmp, long mintrapflags)
|
|||||||
} else {
|
} else {
|
||||||
register int tt = trap->ttyp;
|
register int tt = trap->ttyp;
|
||||||
boolean forcetrap = ((mintrapflags & FORCETRAP) != 0);
|
boolean forcetrap = ((mintrapflags & FORCETRAP) != 0);
|
||||||
|
boolean forcebungle = (mintrapflags & FORCEBUNGLE) != 0;
|
||||||
/* monster has seen such a trap before */
|
/* monster has seen such a trap before */
|
||||||
boolean already_seen = ((mtmp->mtrapseen & (1 << (tt - 1))) != 0
|
boolean already_seen = ((mtmp->mtrapseen & (1 << (tt - 1))) != 0
|
||||||
|| (tt == HOLE && !mindless(mptr)));
|
|| (tt == HOLE && !mindless(mptr)));
|
||||||
@@ -3183,7 +3185,7 @@ mintrap(register struct monst *mtmp, long mintrapflags)
|
|||||||
if (floor_trigger(tt) && check_in_air(mtmp, mintrapflags)) {
|
if (floor_trigger(tt) && check_in_air(mtmp, mintrapflags)) {
|
||||||
return Trap_Effect_Finished;
|
return Trap_Effect_Finished;
|
||||||
}
|
}
|
||||||
if (already_seen && rn2(4))
|
if (already_seen && rn2(4) && !forcebungle)
|
||||||
return Trap_Effect_Finished;
|
return Trap_Effect_Finished;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user