fix #H8769 - steed drowns on Plane of Water

Air bubble movement on the Plane of Water manipulated <u.ux,u.uy>
directly when changing hero's coordinates, leaving steed with old
coordinates, resulting in dunking it when the old spot switched from
air to water.  Switch to u_on_newpos() which moves the steed with
the hero and also handles clipping when the screen is too small to
show the whole map at once.
This commit is contained in:
PatR
2019-05-22 14:59:43 -07:00
parent 1e2e3bf492
commit d541f108f4
2 changed files with 18 additions and 26 deletions
+2 -1
View File
@@ -1,4 +1,4 @@
$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.10 $ $NHDT-Date: 1558355176 2019/05/20 12:26:16 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.12 $ $NHDT-Date: 1558562367 2019/05/22 21:59:27 $
This fixes36.3 file is here to capture information about updates in the 3.6.x This fixes36.3 file is here to capture information about updates in the 3.6.x
lineage following the release of 3.6.2 in May 2019. Please note, however, lineage following the release of 3.6.2 in May 2019. Please note, however,
@@ -16,6 +16,7 @@ when examining the map with '/' or ';', picking a symbol which is used for
billing and payment issue as a result of glob coalescing billing and payment issue as a result of glob coalescing
glob pricing did not consider weight properly glob pricing did not consider weight properly
glob shop interaction improved to handle more of the expected scenarios glob shop interaction improved to handle more of the expected scenarios
non-flying steed on Plane of Water would drown when air bubble moved hero
Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository
+16 -25
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 mkmaze.c $NHDT-Date: 1555022325 2019/04/11 22:38:45 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.68 $ */ /* NetHack 3.6 mkmaze.c $NHDT-Date: 1558562368 2019/05/22 21:59:28 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.70 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Pasi Kallinen, 2018. */ /*-Copyright (c) Pasi Kallinen, 2018. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -503,7 +503,7 @@ fixup_special()
case LR_UPSTAIR: case LR_UPSTAIR:
case LR_DOWNSTAIR: case LR_DOWNSTAIR:
place_it: place_it:
place_lregion(r->inarea.x1, r->inarea.y1, r->inarea.x2, place_lregion(r->inarea.x1, r->inarea.y1, r->inarea.x2,
r->inarea.y2, r->delarea.x1, r->delarea.y1, r->inarea.y2, r->delarea.x1, r->delarea.y1,
r->delarea.x2, r->delarea.y2, r->rtype, &lev); r->delarea.x2, r->delarea.y2, r->rtype, &lev);
@@ -1399,14 +1399,15 @@ STATIC_DCL void FDECL(mv_bubble, (struct bubble *, int, int, BOOLEAN_P));
void void
movebubbles() movebubbles()
{ {
static boolean up;
struct bubble *b;
int x, y, i, j;
struct trap *btrap;
static const struct rm water_pos = { cmap_to_glyph(S_water), WATER, 0, 0, static const struct rm water_pos = { cmap_to_glyph(S_water), WATER, 0, 0,
0, 0, 0, 0, 0, 0 }; 0, 0, 0, 0, 0, 0 };
static const struct rm air_pos = { cmap_to_glyph(S_cloud), AIR, 0, 0, 0, static const struct rm air_pos = { cmap_to_glyph(S_cloud), AIR, 0, 0, 0,
1, 0, 0, 0, 0 }; 1, 0, 0, 0, 0 };
static boolean up = FALSE;
struct bubble *b;
struct container *cons;
struct trap *btrap;
int x, y, i, j;
/* set up the portal the first time bubbles are moved */ /* set up the portal the first time bubbles are moved */
if (!wportal) if (!wportal)
@@ -1437,9 +1438,6 @@ movebubbles()
/* pick up objects, monsters, hero, and traps */ /* pick up objects, monsters, hero, and traps */
if (OBJ_AT(x, y)) { if (OBJ_AT(x, y)) {
struct obj *olist = (struct obj *) 0, *otmp; struct obj *olist = (struct obj *) 0, *otmp;
struct container *cons =
(struct container *) alloc(
sizeof(struct container));
while ((otmp = level.objects[x][y]) != 0) { while ((otmp = level.objects[x][y]) != 0) {
remove_object(otmp); remove_object(otmp);
@@ -1448,6 +1446,7 @@ movebubbles()
olist = otmp; olist = otmp;
} }
cons = (struct container *) alloc(sizeof *cons);
cons->x = x; cons->x = x;
cons->y = y; cons->y = y;
cons->what = CONS_OBJ; cons->what = CONS_OBJ;
@@ -1457,10 +1456,8 @@ movebubbles()
} }
if (MON_AT(x, y)) { if (MON_AT(x, y)) {
struct monst *mon = m_at(x, y); struct monst *mon = m_at(x, y);
struct container *cons =
(struct container *) alloc(
sizeof(struct container));
cons = (struct container *) alloc(sizeof *cons);
cons->x = x; cons->x = x;
cons->y = y; cons->y = y;
cons->what = CONS_MON; cons->what = CONS_MON;
@@ -1478,10 +1475,7 @@ movebubbles()
mon->mx = mon->my = 0; mon->mx = mon->my = 0;
} }
if (!u.uswallow && x == u.ux && y == u.uy) { if (!u.uswallow && x == u.ux && y == u.uy) {
struct container *cons = cons = (struct container *) alloc(sizeof *cons);
(struct container *) alloc(
sizeof(struct container));
cons->x = x; cons->x = x;
cons->y = y; cons->y = y;
cons->what = CONS_HERO; cons->what = CONS_HERO;
@@ -1491,10 +1485,7 @@ movebubbles()
b->cons = cons; b->cons = cons;
} }
if ((btrap = t_at(x, y)) != 0) { if ((btrap = t_at(x, y)) != 0) {
struct container *cons = cons = (struct container *) alloc(sizeof *cons);
(struct container *) alloc(
sizeof(struct container));
cons->x = x; cons->x = x;
cons->y = y; cons->y = y;
cons->what = CONS_TRAP; cons->what = CONS_TRAP;
@@ -1887,21 +1878,21 @@ boolean ini;
} }
case CONS_HERO: { case CONS_HERO: {
struct monst *mtmp = m_at(cons->x, cons->y);
int ux0 = u.ux, uy0 = u.uy; int ux0 = u.ux, uy0 = u.uy;
/* change u.ux0 and u.uy0? */ u_on_newpos(cons->x, cons->y);
u.ux = cons->x;
u.uy = cons->y;
newsym(ux0, uy0); /* clean up old position */ newsym(ux0, uy0); /* clean up old position */
if (MON_AT(cons->x, cons->y)) { if (mtmp) {
mnexto(m_at(cons->x, cons->y)); mnexto(mtmp);
} }
break; break;
} }
case CONS_TRAP: { case CONS_TRAP: {
struct trap *btrap = (struct trap *) cons->list; struct trap *btrap = (struct trap *) cons->list;
btrap->tx = cons->x; btrap->tx = cons->x;
btrap->ty = cons->y; btrap->ty = cons->y;
break; break;