Make trap return values more consistent

Instead of returning monster's mtrapped-state, return specific
trap return values.
Add one extra trap return value, for when a monster was
moved by the trap.
This commit is contained in:
Pasi Kallinen
2022-02-24 16:23:56 +02:00
parent 547f6e9244
commit 9716f22851
6 changed files with 49 additions and 38 deletions

View File

@@ -922,7 +922,9 @@ mhurtle_step(genericptr_t arg, int x, int y)
if (is_waterwall(x, y))
return FALSE;
res = mintrap(mon);
if (res == Trap_Killed_Mon || res == Trap_Caught_Mon)
if (res == Trap_Killed_Mon
|| res == Trap_Caught_Mon
|| res == Trap_Moved_Mon)
return FALSE;
return TRUE;
}

View File

@@ -2138,16 +2138,16 @@ domove_core(void)
has_mgivenname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE));
/* check for displacing it into pools and traps */
switch (minliquid(mtmp) ? 2 : mintrap(mtmp)) {
case 0:
switch (minliquid(mtmp) ? Trap_Killed_Mon : mintrap(mtmp)) {
case Trap_Effect_Finished:
break;
case 1: /* trapped */
case 3: /* changed levels */
case Trap_Caught_Mon: /* trapped */
case Trap_Moved_Mon: /* changed levels */
/* there's already been a trap message, reinforce it */
abuse_dog(mtmp);
adjalign(-3);
break;
case 2:
case Trap_Killed_Mon:
/* drowned or died...
* you killed your pet by direct action, so get experience
* and possibly penalties;

View File

@@ -1023,11 +1023,11 @@ m_move(register struct monst* mtmp, register int after)
if (mtmp->mtrapped) {
int i = mintrap(mtmp);
if (i >= Trap_Killed_Mon) {
if (i == Trap_Killed_Mon) {
newsym(mtmp->mx, mtmp->my);
return 2;
} /* it died */
if (i == 1)
if (i == Trap_Caught_Mon)
return 0; /* still in trap, so didn't move */
}
ptr = mtmp->data; /* mintrap() can change mtmp->data -dlc */
@@ -1491,7 +1491,7 @@ m_move(register struct monst* mtmp, register int after)
}
newsym(omx, omy); /* update the old position */
if (mintrap(mtmp) >= Trap_Killed_Mon) {
if (mintrap(mtmp) == Trap_Killed_Mon) {
if (mtmp->mx)
newsym(mtmp->mx, mtmp->my);
return 2; /* it died */

View File

@@ -1430,7 +1430,7 @@ mtele_trap(struct monst* mtmp, struct trap* trap, int in_sight)
}
}
/* return 0 if still on level, 3 if not */
/* return Trap_Effect_Finished if still on level, Trap_Moved_Mon if not */
int
mlevel_tele_trap(
struct monst *mtmp,
@@ -1441,7 +1441,7 @@ mlevel_tele_trap(
int tt = (trap ? trap->ttyp : NO_TRAP);
if (mtmp == u.ustuck) /* probably a vortex */
return 0; /* temporary? kludge */
return Trap_Effect_Finished; /* temporary? kludge */
if (teleport_pet(mtmp, force_it)) {
d_level tolevel;
int migrate_typ = MIGR_RANDOM;
@@ -1453,7 +1453,7 @@ mlevel_tele_trap(
if (in_sight && trap->tseen)
pline("%s avoids the %s.", Monnam(mtmp),
(tt == HOLE) ? "hole" : "trap");
return 0;
return Trap_Effect_Finished;
} else {
get_level(&tolevel, depth(&u.uz) + 1);
}
@@ -1465,7 +1465,7 @@ mlevel_tele_trap(
pline("%s seems to shimmer for a moment.", Monnam(mtmp));
seetrap(trap);
}
return 0;
return Trap_Effect_Finished;
} else {
assign_level(&tolevel, &trap->dst);
migrate_typ = MIGR_PORTAL;
@@ -1482,7 +1482,7 @@ mlevel_tele_trap(
if (in_sight)
pline("%s seems very disoriented for a moment.",
Monnam(mtmp));
return 0;
return Trap_Effect_Finished;
}
if (tt == NO_TRAP) {
/* creature is being forced off the level to make room;
@@ -1495,13 +1495,13 @@ mlevel_tele_trap(
if (nlev == depth(&u.uz)) {
if (in_sight)
pline("%s shudders for a moment.", Monnam(mtmp));
return 0;
return Trap_Effect_Finished;
}
get_level(&tolevel, nlev);
}
} else {
impossible("mlevel_tele_trap: unexpected trap type (%d)", tt);
return 0;
return Trap_Effect_Finished;
}
if (in_sight) {
@@ -1510,9 +1510,9 @@ mlevel_tele_trap(
seetrap(trap);
}
migrate_to_level(mtmp, ledger_no(&tolevel), migrate_typ, (coord *) 0);
return 3; /* no longer on this level */
return Trap_Moved_Mon; /* no longer on this level */
}
return 0;
return Trap_Effect_Finished;
}
/* place object randomly, returns False if it's gone (eg broken) */

View File

@@ -981,7 +981,8 @@ trapeffect_arrow_trap(
if (thitm(8, mtmp, otmp, 0, FALSE))
trapkilled = TRUE;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped
? Trap_Caught_Mon : Trap_Effect_Finished;
}
return Trap_Effect_Finished;
}
@@ -1049,7 +1050,8 @@ trapeffect_dart_trap(
if (thitm(7, mtmp, otmp, 0, FALSE))
trapkilled = TRUE;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped
? Trap_Caught_Mon : Trap_Effect_Finished;
}
return Trap_Effect_Finished;
}
@@ -1126,7 +1128,8 @@ trapeffect_rocktrap(
if (thitm(0, mtmp, otmp, d(2, 6), FALSE))
trapkilled = TRUE;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped
? Trap_Caught_Mon : Trap_Effect_Finished;
}
return Trap_Effect_Finished;
}
@@ -1255,7 +1258,8 @@ trapeffect_bear_trap(
if (mtmp->mtrapped)
trapkilled = thitm(0, mtmp, (struct obj *) 0, d(2, 4), FALSE);
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped
? Trap_Caught_Mon : Trap_Effect_Finished;
}
return Trap_Effect_Finished;
}
@@ -1414,7 +1418,8 @@ trapeffect_rust_trap(
(void) split_mon(mtmp, (struct monst *) 0);
}
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped
? Trap_Caught_Mon : Trap_Effect_Finished;
}
return Trap_Effect_Finished;
}
@@ -1496,7 +1501,8 @@ trapeffect_fire_trap(
if (see_it && t_at(mtmp->mx, mtmp->my))
seetrap(trap);
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped
? Trap_Caught_Mon : Trap_Effect_Finished;
}
return Trap_Effect_Finished;
}
@@ -1669,7 +1675,8 @@ trapeffect_pit(
rnd((tt == PIT) ? 6 : 10), FALSE))
trapkilled = TRUE;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped
? Trap_Caught_Mon : Trap_Effect_Finished;
}
return Trap_Effect_Finished;
}
@@ -1745,6 +1752,7 @@ trapeffect_telep_trap(
boolean in_sight = canseemon(mtmp) || (mtmp == u.usteed);
mtele_trap(mtmp, trap, in_sight);
return Trap_Moved_Mon;
}
return Trap_Effect_Finished;
}
@@ -1759,16 +1767,13 @@ trapeffect_level_telep(
seetrap(trap);
level_tele_trap(trap, trflags);
} else {
int mlev_res;
int tt = trap->ttyp;
boolean in_sight = canseemon(mtmp) || (mtmp == u.usteed);
boolean inescapable = (g.force_mintrap
|| ((tt == HOLE || tt == PIT)
&& Sokoban && !trap->madeby_u));
mlev_res = mlevel_tele_trap(mtmp, trap, inescapable, in_sight);
if (mlev_res)
return mlev_res;
return mlevel_tele_trap(mtmp, trap, inescapable, in_sight);
}
return Trap_Effect_Finished;
}
@@ -1937,7 +1942,7 @@ trapeffect_web(
seetrap(trap);
}
}
return mtmp->mtrapped;
return mtmp->mtrapped ? Trap_Caught_Mon : Trap_Effect_Finished;
}
return Trap_Effect_Finished;
}
@@ -2076,7 +2081,8 @@ trapeffect_anti_magic(
if (see_it)
newsym(trap->tx, trap->ty);
}
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped
? Trap_Caught_Mon : Trap_Effect_Finished;
}
return Trap_Effect_Finished;
}
@@ -2248,7 +2254,8 @@ trapeffect_landmine(
g.multi = -1;
g.nomovemsg = "The explosion awakens you!";
}
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped
? Trap_Caught_Mon : Trap_Effect_Finished;
}
return Trap_Effect_Finished;
}
@@ -2296,7 +2303,8 @@ trapeffect_rolling_boulder_trap(
deltrap(trap);
newsym(mtmp->mx, mtmp->my);
}
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped;
return trapkilled ? Trap_Killed_Mon : mtmp->mtrapped
? Trap_Caught_Mon : Trap_Effect_Finished;
}
}
return Trap_Effect_Finished;
@@ -3065,7 +3073,7 @@ mintrap(register struct monst *mtmp)
{
register struct trap *trap = t_at(mtmp->mx, mtmp->my);
struct permonst *mptr = mtmp->data;
int trap_result = 0;
int trap_result = Trap_Effect_Finished;
if (!trap) {
mtmp->mtrapped = 0; /* perhaps teleported? */
@@ -3114,6 +3122,7 @@ mintrap(register struct monst *mtmp)
mtmp->meating = 5;
}
}
trap_result = mtmp->mtrapped ? Trap_Caught_Mon : Trap_Effect_Finished;
} else {
register int tt = trap->ttyp;
boolean inescapable = (g.force_mintrap
@@ -3139,8 +3148,7 @@ mintrap(register struct monst *mtmp)
trap_result = trapeffect_selector(mtmp, trap, 0);
}
return (trap_result == Trap_Killed_Mon) ? trap_result
: mtmp->mtrapped ? Trap_Caught_Mon : Trap_Effect_Finished;
return trap_result;
}
/* Combine cockatrice checks into single functions to avoid repeating code. */
@@ -5224,7 +5232,7 @@ closeholdingtrap(
or if you sense the monster who becomes trapped */
*noticed = cansee(t->tx, t->ty) || canspotmon(mon);
++g.force_mintrap;
result = (mintrap(mon) != 0);
result = (mintrap(mon) != Trap_Effect_Finished);
--g.force_mintrap;
}
return result;