"you observe a fog cloud where a vampire/bat was" if an unseen vampire on the
far side of a closed door shifted shape to pass under that door
fix mention_walls reporting secret doors as solid stone
+jumping over water unintentionally moved hero through that water, causing
+ drowning if not able to water walk or fly
Platform- and/or Interface-Specific Fixes
E int FDECL(hero_breaks, (struct obj *, XCHAR_P, XCHAR_P, BOOLEAN_P));
E int FDECL(breaks, (struct obj *, XCHAR_P, XCHAR_P));
E void FDECL(release_camera_demon, (struct obj *, XCHAR_P, XCHAR_P));
-E void FDECL(breakobj,
- (struct obj *, XCHAR_P, XCHAR_P, BOOLEAN_P, BOOLEAN_P));
+E void FDECL(breakobj, (struct obj *, XCHAR_P, XCHAR_P, BOOLEAN_P, BOOLEAN_P));
E boolean FDECL(breaktest, (struct obj *));
E boolean FDECL(walk_path, (coord *, coord *,
boolean (*)(genericptr, int, int), genericptr_t));
+E boolean FDECL(hurtle_jump, (genericptr_t, int, int));
E boolean FDECL(hurtle_step, (genericptr_t, int, int));
/* ### drawing.c ### */
&& !BFlying)
/* May touch surface; does not override any others */
-#define Wwalking (u.uprops[WWALKING].extrinsic && !Is_waterlevel(&u.uz))
+#define EWwalking u.uprops[WWALKING].extrinsic
+#define Wwalking (EWwalking && !Is_waterlevel(&u.uz))
/* Don't get wet, can't go under water; overrides others except levitation */
/* Wwalking is meaningless on water level */
temp = -temp;
if (range < temp)
range = temp;
- (void) walk_path(&uc, &cc, hurtle_step, (genericptr_t) &range);
- /* hurtle_step results in (u.ux, u.uy) == (cc.x, cc.y) and usually
- * moves the ball if punished, but does not handle all the effects
- * of landing on the final position.
+ (void) walk_path(&uc, &cc, hurtle_jump, (genericptr_t) &range);
+ /* hurtle_jump -> hurtle_step results in <u.ux,u.uy> == <cc.x,cc.y>
+ * and usually moves the ball if punished, but does not handle all
+ * the effects of landing on the final position.
*/
teleds(cc.x, cc.y, FALSE);
sokoban_guilt();
return FALSE;
}
+/* hack for hurtle_step() -- it ought to be changed to take an argument
+ indicating lev/fly-to-dest vs lev/fly-to-dest-minus-one-land-on-dest
+ vs drag-to-dest; original callers use first mode, jumping wants second,
+ grappling hook backfire and thrown chained ball need third */
+boolean
+hurtle_jump(arg, x, y)
+genericptr_t arg;
+int x, y;
+{
+ boolean res;
+ long save_EWwalking = EWwalking;
+
+ /* prevent jumping over water from being placed in that water */
+ EWwalking |= I_SPECIAL;
+ res = hurtle_step(arg, x, y);
+ EWwalking = save_EWwalking;
+ return res;
+}
+
/*
* Single step for the hero flying through the air from jumping, flying,
* etc. Called from hurtle() and jump() via walk_path(). We expect the