From: Pasi Kallinen Date: Thu, 24 Feb 2022 14:23:56 +0000 (+0200) Subject: Make trap return values more consistent X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9716f2285118f947b50c22f819e914e754bed43b;p=nethack 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. --- diff --git a/include/trap.h b/include/trap.h index a0390b73c..5710802ab 100644 --- a/include/trap.h +++ b/include/trap.h @@ -86,7 +86,8 @@ enum trap_types { enum { Trap_Effect_Finished = 0, Trap_Is_Gone = 0, Trap_Caught_Mon = 1, - Trap_Killed_Mon = 2 + Trap_Killed_Mon = 2, + Trap_Moved_Mon = 3, /* new location, or new level */ }; #define is_pit(ttyp) ((ttyp) == PIT || (ttyp) == SPIKED_PIT) diff --git a/src/dothrow.c b/src/dothrow.c index 281861b0a..939a69673 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -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; } diff --git a/src/hack.c b/src/hack.c index 5dbb7ebc7..3397233ae 100644 --- a/src/hack.c +++ b/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; diff --git a/src/monmove.c b/src/monmove.c index 79222263e..7e901d45f 100644 --- a/src/monmove.c +++ b/src/monmove.c @@ -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 */ diff --git a/src/teleport.c b/src/teleport.c index 0f2a0ec3e..c39421dfa 100644 --- a/src/teleport.c +++ b/src/teleport.c @@ -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) */ diff --git a/src/trap.c b/src/trap.c index 224a9651c..e42f363ea 100644 --- a/src/trap.c +++ b/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;