covetous fixe(es)
Extracted from a larger pending commit. While trying to make sure that bhitpos and notonhead are up to date when attacks are processed, I noticed that covetous monster handling was buggy. For dist2(), a value of 1 means adjacent in an orthogonal direction, so testing for less than 2 unintentionally excluded diagonal adjacency.
This commit is contained in:
+3
-1
@@ -1,4 +1,4 @@
|
|||||||
HDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1177 $ $NHDT-Date: 1683710637 2023/05/10 09:23:57 $
|
HDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1181 $ $NHDT-Date: 1684621591 2023/05/20 22:26:31 $
|
||||||
|
|
||||||
General Fixes and Modified Features
|
General Fixes and Modified Features
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
@@ -1185,6 +1185,8 @@ avoid sanity_check warning if statue in water or lava gets polymorphed into a
|
|||||||
werewolf or werejackal howling and purple worm burping wakes up monsters
|
werewolf or werejackal howling and purple worm burping wakes up monsters
|
||||||
don't exclude map column 1 from consideration when rloc() picks a random spot
|
don't exclude map column 1 from consideration when rloc() picks a random spot
|
||||||
for destination of a teleported monster
|
for destination of a teleported monster
|
||||||
|
covetous monster attacking another monster to acquire special item would not
|
||||||
|
do so if positioned diagonally adjacent
|
||||||
|
|
||||||
|
|
||||||
Fixes to 3.7.0-x General Problems Exposed Via git Repository
|
Fixes to 3.7.0-x General Problems Exposed Via git Repository
|
||||||
|
|||||||
+40
-24
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.7 monmove.c $NHDT-Date: 1651886999 2022/05/07 01:29:59 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.179 $ */
|
/* NetHack 3.7 monmove.c $NHDT-Date: 1684621592 2023/05/20 22:26:32 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.218 $ */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/*-Copyright (c) Michael Allison, 2006. */
|
/*-Copyright (c) Michael Allison, 2006. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -1274,7 +1274,7 @@ finish_search:
|
|||||||
* 3: did not move, and can't do anything else either.
|
* 3: did not move, and can't do anything else either.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
m_move(register struct monst* mtmp, register int after)
|
m_move(register struct monst *mtmp, int after)
|
||||||
{
|
{
|
||||||
int appr, etmp;
|
int appr, etmp;
|
||||||
coordxy ggx, ggy, nix, niy;
|
coordxy ggx, ggy, nix, niy;
|
||||||
@@ -1332,22 +1332,30 @@ m_move(register struct monst* mtmp, register int after)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* and the acquisitive monsters get special treatment */
|
/* and the acquisitive monsters get special treatment */
|
||||||
if (is_covetous(ptr)) {
|
if (is_covetous(ptr)) { /* [should this include
|
||||||
|
* '&& mtmp->mstrategy != STRAT_NONE'?] */
|
||||||
|
int covetousattack;
|
||||||
coordxy tx = STRAT_GOALX(mtmp->mstrategy),
|
coordxy tx = STRAT_GOALX(mtmp->mstrategy),
|
||||||
ty = STRAT_GOALY(mtmp->mstrategy);
|
ty = STRAT_GOALY(mtmp->mstrategy);
|
||||||
struct monst *intruder = m_at(tx, ty);
|
struct monst *intruder = isok(tx, ty) ? m_at(tx, ty) : NULL;
|
||||||
/*
|
/*
|
||||||
* if there's a monster on the object or in possession of it,
|
* if there's a monster on the object or in possession of it,
|
||||||
* attack it.
|
* attack it.
|
||||||
*/
|
*/
|
||||||
if ((dist2(mtmp->mx, mtmp->my, tx, ty) < 2) && intruder
|
if (intruder && intruder != mtmp
|
||||||
&& (intruder != mtmp)) {
|
/* 3.7: this used to use 'dist2() < 2' which meant that intended
|
||||||
|
attack was disallowed if they were adjacent diagonally */
|
||||||
|
&& dist2(mtmp->mx, mtmp->my, tx, ty) <= 2) {
|
||||||
|
gb.bhitpos.x = tx, gb.bhitpos.y = ty;
|
||||||
gn.notonhead = (intruder->mx != tx || intruder->my != ty);
|
gn.notonhead = (intruder->mx != tx || intruder->my != ty);
|
||||||
if (mattackm(mtmp, intruder) == 2)
|
covetousattack = mattackm(mtmp, intruder);
|
||||||
|
/* 3.7: this used to erroneously use '== 2' (M_ATTK_DEF_DIED) */
|
||||||
|
if (covetousattack & M_ATTK_AGR_DIED)
|
||||||
return MMOVE_DIED;
|
return MMOVE_DIED;
|
||||||
mmoved = MMOVE_MOVED;
|
mmoved = MMOVE_MOVED;
|
||||||
} else
|
} else {
|
||||||
mmoved = MMOVE_NOTHING;
|
mmoved = MMOVE_NOTHING;
|
||||||
|
}
|
||||||
goto postmov;
|
goto postmov;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1559,16 +1567,18 @@ m_move(register struct monst* mtmp, register int after)
|
|||||||
* Pets get taken care of above and shouldn't reach this code.
|
* Pets get taken care of above and shouldn't reach this code.
|
||||||
* Conflict gets handled even farther away (movemon()).
|
* Conflict gets handled even farther away (movemon()).
|
||||||
*/
|
*/
|
||||||
if ((info[chi] & ALLOW_M) || (nix == mtmp->mux && niy == mtmp->muy))
|
if ((info[chi] & ALLOW_M) != 0
|
||||||
|
|| (nix == mtmp->mux && niy == mtmp->muy))
|
||||||
return m_move_aggress(mtmp, nix, niy);
|
return m_move_aggress(mtmp, nix, niy);
|
||||||
|
|
||||||
if ((info[chi] & ALLOW_MDISP)) {
|
if ((info[chi] & ALLOW_MDISP) != 0) {
|
||||||
struct monst *mtmp2;
|
struct monst *mtmp2;
|
||||||
int mstatus;
|
int mstatus;
|
||||||
|
|
||||||
mtmp2 = m_at(nix, niy);
|
mtmp2 = m_at(nix, niy); /* ALLOW_MDISP implies m_at() is !Null */
|
||||||
mstatus = mdisplacem(mtmp, mtmp2, FALSE);
|
mstatus = mdisplacem(mtmp, mtmp2, FALSE);
|
||||||
if ((mstatus & M_ATTK_AGR_DIED) || (mstatus & M_ATTK_DEF_DIED))
|
/*[if either dies, this reports mtmp has died; is that correct?]*/
|
||||||
|
if (mstatus & (M_ATTK_AGR_DIED | M_ATTK_DEF_DIED))
|
||||||
return MMOVE_DIED;
|
return MMOVE_DIED;
|
||||||
if (mstatus & M_ATTK_HIT)
|
if (mstatus & M_ATTK_HIT)
|
||||||
return MMOVE_MOVED;
|
return MMOVE_MOVED;
|
||||||
@@ -1850,25 +1860,31 @@ m_move(register struct monst* mtmp, register int after)
|
|||||||
* (mtmp died) or 3 (mtmp made its move).
|
* (mtmp died) or 3 (mtmp made its move).
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
m_move_aggress(struct monst* mtmp, coordxy x, coordxy y)
|
m_move_aggress(struct monst *mtmp, coordxy x, coordxy y)
|
||||||
{
|
{
|
||||||
struct monst *mtmp2;
|
struct monst *mtmp2;
|
||||||
int mstatus;
|
int mstatus = 0; /* M_ATTK_MISS */
|
||||||
|
|
||||||
mtmp2 = m_at(x, y);
|
mtmp2 = m_at(x, y);
|
||||||
|
if (mtmp2) {
|
||||||
gn.notonhead = mtmp2 && (x != mtmp2->mx || y != mtmp2->my);
|
gb.bhitpos.x = x, gb.bhitpos.y = y;
|
||||||
/* note: mstatus returns 0 if mtmp2 is nonexistent */
|
gn.notonhead = (x != mtmp2->mx || y != mtmp2->my);
|
||||||
mstatus = mattackm(mtmp, mtmp2);
|
mstatus = mattackm(mtmp, mtmp2);
|
||||||
|
}
|
||||||
|
|
||||||
if (mstatus & M_ATTK_AGR_DIED) /* aggressor died */
|
if (mstatus & M_ATTK_AGR_DIED) /* aggressor died */
|
||||||
return MMOVE_DIED;
|
return MMOVE_DIED;
|
||||||
|
|
||||||
if ((mstatus & M_ATTK_HIT) && !(mstatus & M_ATTK_DEF_DIED) && rn2(4)
|
if ((mstatus & (M_ATTK_HIT | M_ATTK_DEF_DIED)) == M_ATTK_HIT
|
||||||
&& mtmp2->movement >= NORMAL_SPEED) {
|
&& rn2(4) && mtmp2->movement > rn2(NORMAL_SPEED)) {
|
||||||
mtmp2->movement -= NORMAL_SPEED;
|
if (mtmp2->movement > NORMAL_SPEED)
|
||||||
gn.notonhead = 0;
|
mtmp2->movement -= NORMAL_SPEED;
|
||||||
|
else
|
||||||
|
mtmp2->movement = 0;
|
||||||
|
gb.bhitpos.x = mtmp->mx, gb.bhitpos.y = mtmp->my;
|
||||||
|
gn.notonhead = FALSE;
|
||||||
mstatus = mattackm(mtmp2, mtmp); /* return attack */
|
mstatus = mattackm(mtmp2, mtmp); /* return attack */
|
||||||
|
/* note: at this point, defender is the original (moving) aggressor */
|
||||||
if (mstatus & M_ATTK_DEF_DIED)
|
if (mstatus & M_ATTK_DEF_DIED)
|
||||||
return MMOVE_DIED;
|
return MMOVE_DIED;
|
||||||
}
|
}
|
||||||
@@ -1903,7 +1919,7 @@ accessible(coordxy x, coordxy y)
|
|||||||
|
|
||||||
/* decide where the monster thinks you are standing */
|
/* decide where the monster thinks you are standing */
|
||||||
void
|
void
|
||||||
set_apparxy(register struct monst* mtmp)
|
set_apparxy(register struct monst *mtmp)
|
||||||
{
|
{
|
||||||
boolean notseen, notthere, gotu;
|
boolean notseen, notthere, gotu;
|
||||||
int disp;
|
int disp;
|
||||||
|
|||||||
Reference in New Issue
Block a user