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:
@@ -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;
|
||||
}
|
||||
|
||||
10
src/hack.c
10
src/hack.c
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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) */
|
||||
|
||||
46
src/trap.c
46
src/trap.c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user