]> granicus.if.org Git - nethack/commitdiff
Make trap return values more consistent
authorPasi Kallinen <paxed@alt.org>
Thu, 24 Feb 2022 14:23:56 +0000 (16:23 +0200)
committerPasi Kallinen <paxed@alt.org>
Thu, 24 Feb 2022 14:24:02 +0000 (16:24 +0200)
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.

include/trap.h
src/dothrow.c
src/hack.c
src/monmove.c
src/teleport.c
src/trap.c

index a0390b73c51c4b49d76c454487ddf83b11084b5f..5710802ab0550455774fb541a413c5e9f412db0b 100644 (file)
@@ -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)
index 281861b0a2af4e260c4e12328900ac921b286c1f..939a69673de6c646ca5be73f2384249c15b6e1f8 100644 (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;
     }
index 5dbb7ebc7354cef44c711a7c34eeff1ba1f71178..3397233ae473ac2eebeae6b914eb2977c0fe57ad 100644 (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;
index 79222263eea5d691bbaeee62c4d177a08bc48803..7e901d45f8535a5b90ed28116d3489c28b70a2cb 100644 (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 */
index 0f2a0ec3ecb4090e48142650c022f3baf836f896..c39421dfa0aee3fe747d50f3c96425323821d3d9 100644 (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) */
index 224a9651c74a06641ef1b5629481b71152a03279..e42f363ea9d4b7b14587e9dbc7fcd6e1d8224e3b 100644 (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;