Forcing floating point division for % coverage, so we don't show 0%
[open-adventure.git] / actions.c
index 31fc18691aa60bdeab380933a46b1be2a4fd2824..64b5c20aa0f77b3db94e1ce170d80a1e95401637 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -205,11 +205,13 @@ static int bigwords(long id)
              *  crossing. */
             if (game.place[EGGS] == LOC_NOWHERE && game.place[TROLL] == LOC_NOWHERE && game.prop[TROLL] == TROLL_UNPAID)
                 game.prop[TROLL] = TROLL_PAIDONCE;
-            int k = EGGS_DONE;
+            int k;
             if (HERE(EGGS))
                 k = EGGS_VANISHED;
-            if (game.loc == objects[EGGS].plac)
+            else if (game.loc == objects[EGGS].plac)
                 k = EGGS_HERE;
+            else
+                k = EGGS_DONE;
             move(EGGS, objects[EGGS].plac);
             pspeak(EGGS, look, k, true);
             return GO_CLEAROBJ;
@@ -417,8 +419,13 @@ static int chain(verb_t verb)
 
         switch (game.prop[BEAR]) {
         case BEAR_DEAD:
+            // LCOV_EXCL_START
+            /* Can't be reached as long as the only way for the bear to die
+             * is from a bridge collapse. Leave in in case this changes, but
+             * exclude from coverage testing. */
             game.fixed[BEAR] = IS_FIXED;
             break;
+        // LCOV_EXCL_STOP
         default:
             game.fixed[BEAR] = IS_FREE;
         }
@@ -470,11 +477,13 @@ static int discard(verb_t verb, obj_t obj)
         game.prop[CAVITY] = CAVITY_FULL;
         if (HERE(RUG) && ((obj == EMERALD && game.prop[RUG] != RUG_HOVER) ||
                           (obj == RUBY && game.prop[RUG] == RUG_HOVER))) {
-            int spk = RUG_RISES;
-            if (TOTING(RUG))
-                spk = RUG_WIGGLES;
+            int spk;
             if (obj == RUBY)
                 spk = RUG_SETTLES;
+            else if (TOTING(RUG))
+                spk = RUG_WIGGLES;
+            else
+                spk = RUG_RISES;
             rspeak(spk);
             if (spk != RUG_WIGGLES) {
                 int k = (game.prop[RUG] == RUG_HOVER) ? RUG_FLOOR : RUG_HOVER;
@@ -894,7 +903,11 @@ static int listen(void)
             game.prop[i] < 0)
             continue;
         int mi =  game.prop[i];
-        /* FIXME: Weird magic on object states */
+        /* (ESR) Some unpleasant magic on object states here. Ideally
+         * we'd have liked the bird to be a normal object that we can
+         * use state_change() on; can't do it, because there are
+         * actually two different series of per-state birdsounds
+         * depending on whether player has drunk dragon's blood. */
         if (i == BIRD)
             mi += 3 * game.blooded;
         long packed_zzword = token_to_packed(game.zzword);
@@ -1110,7 +1123,7 @@ static int say(struct command_t *command)
 {
     if (command->wd2 > 0) {
         command->wd1 = command->wd2;
-        strcpy(command->raw1, command->raw2);
+        strncpy(command->raw1, command->raw2, LINESIZE - 1);
     }
     char word1[TOKLEN + 1];
     packed_to_token(command->wd1, word1);