]> granicus.if.org Git - nethack/commitdiff
B02005 - Boulder and vision
authorcohrs <cohrs>
Sun, 18 May 2003 21:04:49 +0000 (21:04 +0000)
committercohrs <cohrs>
Sun, 18 May 2003 21:04:49 +0000 (21:04 +0000)
add another bit to the flags passed to launch_obj so it can print
the initial "rumbling" message at the appropriate time rather than
having the caller print the message, possibly out of order.

doc/fixes34.2
include/hack.h
src/trap.c

index b46790a3d8428e0b4e863800be86f4557b46564d..f80ba3b72cd04b0c9b544160c5938312b724e40a 100644 (file)
@@ -67,6 +67,7 @@ poison missiles were unintentionally more likely to inflict "deadly poison"
        than in pre-3.4.1 releases
 provide feedback when going invisible after eating a stalker
 killer on tombstone had no prefix for starvation/exhaustion case
+ensure proper message ordering for boulder trap messages
 
 
 Platform- and/or Interface-Specific Fixes
index a2b79e8573bbe358823841ce69f32bd73c560a6c..a9e0dc67af37325d93ab4638eadd8ce44306236f 100644 (file)
@@ -203,6 +203,7 @@ NEARDATA extern coord bhitpos;      /* place where throw or zap hits or stops */
 /* Macros for launching objects */
 #define ROLL           0x01    /* the object is rolling */
 #define FLING          0x02    /* the object is flying thru the air */
+#define LAUNCH_UNSEEN  0x40    /* hero neither caused nor saw it */
 #define LAUNCH_KNOWN   0x80    /* the hero caused this by explicit action */
 
 /* Macros for explosion types */
index 7c66c6a9e5196627c7c9b8d46a45a90281e652ce..cb9999d241349adc478abb3bc2a2350bfb972d78 100644 (file)
@@ -1274,11 +1274,19 @@ int style;
        dx = sgn(x2 - x1);
        dy = sgn(y2 - y1);
        switch (style) {
+           case ROLL|LAUNCH_UNSEEN:
+                       if (otyp == BOULDER) {
+                           You_hear(Hallucination ?
+                                    "someone bowling." :
+                                    "rumbling in the distance.");
+                       }
+                       goto roll;
            case ROLL|LAUNCH_KNOWN:
                        /* use otrapped as a flag to ohitmon */
                        singleobj->otrapped = 1;
                        style &= ~LAUNCH_KNOWN;
                        /* fall through */
+           roll:
            case ROLL:
                        delaycnt = 2;
                        /* fall through */
@@ -2035,24 +2043,23 @@ glovecheck:                 target = which_armor(mtmp, W_ARMG);
 
                case ROLLING_BOULDER_TRAP:
                    if (!is_flyer(mptr)) {
+                       int style = ROLL | (in_sight ? 0 : LAUNCH_UNSEEN);
+
                        newsym(mtmp->mx,mtmp->my);
                        if (in_sight)
-                         pline("Click! %s triggers %s.", Monnam(mtmp),
+                           pline("Click! %s triggers %s.", Monnam(mtmp),
                                  trap->tseen ?
                                  "a rolling boulder trap" :
                                  something);
                        if (launch_obj(BOULDER, trap->launch.x, trap->launch.y,
-                                      trap->launch2.x, trap->launch2.y, ROLL)) {
-                         if (in_sight) trap->tseen = TRUE;
-                         else You_hear(Hallucination ?
-                                       "someone bowling." :
-                                       "rumbling in the distance.");
-                         if (mtmp->mhp <= 0) trapkilled = TRUE;
+                               trap->launch2.x, trap->launch2.y, style)) {
+                           if (in_sight) trap->tseen = TRUE;
+                           if (mtmp->mhp <= 0) trapkilled = TRUE;
                        } else {
-                         deltrap(trap);
-                         newsym(mtmp->mx,mtmp->my);
+                           deltrap(trap);
+                           newsym(mtmp->mx,mtmp->my);
                        }
-                     }
+                   }
                    break;
 
                default: