Proof of concept for Section 3 report generator.
[open-adventure.git] / actions.c
index 2b30de9ad8a0e4dfce11a6b1d2104242295c1e2d..c1996f3c765b35f41a073987e28cc4fc081f15fb 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -44,8 +44,9 @@ static int attack(FILE *input, struct command_t *command)
         DESTROY(BIRD);
         spk = BIRD_DEAD;
     } else if (obj == VEND) {
-        pspeak(VEND, game.prop[VEND] + 2);
-        game.prop[VEND] = 3 - game.prop[VEND];
+       bool blocking = (game.prop[VEND] == VEND_BLOCKS);
+        game.prop[VEND] = blocking ? VEND_UNBLOCKS : VEND_BLOCKS;
+        rspeak(blocking ? MACHINE_SWINGOUT : MACHINE_SWINGBACK);
         return GO_CLEAROBJ;
     }
 
@@ -82,17 +83,17 @@ static int attack(FILE *input, struct command_t *command)
         GETIN(input, &command->wd1, &command->wd1x, &command->wd2, &command->wd2x);
         if (command->wd1 != MAKEWD(WORD_YINIT) && command->wd1 != MAKEWD(WORD_YES))
             return GO_CHECKFOO;
-        pspeak(DRAGON, 3);
+        pspeak(DRAGON, look, 3);
         game.prop[DRAGON] = 1;
         game.prop[RUG] = 0;
-        int k = (PLAC[DRAGON] + FIXD[DRAGON]) / 2;
+        int k = (object_descriptions[DRAGON].plac + object_descriptions[DRAGON].fixd) / 2;
         MOVE(DRAGON + NOBJECTS, -1);
         MOVE(RUG + NOBJECTS, 0);
         MOVE(DRAGON, k);
         MOVE(RUG, k);
         DROP(BLOOD, k);
         for (obj = 1; obj <= NOBJECTS; obj++) {
-            if (game.place[obj] == PLAC[DRAGON] || game.place[obj] == FIXD[DRAGON])
+            if (game.place[obj] == object_descriptions[DRAGON].plac || game.place[obj] == object_descriptions[DRAGON].fixd)
                 MOVE(obj, k);
         }
         game.loc = k;
@@ -121,7 +122,7 @@ static int bigwords(token_t foo)
             return GO_CLEAROBJ;
         }
         game.foobar = 0;
-        if (game.place[EGGS] == PLAC[EGGS] || (TOTING(EGGS) && game.loc == PLAC[EGGS])) {
+        if (game.place[EGGS] == object_descriptions[EGGS].plac || (TOTING(EGGS) && game.loc == object_descriptions[EGGS].plac)) {
             rspeak(spk);
             return GO_CLEAROBJ;
         } else {
@@ -131,9 +132,9 @@ static int bigwords(token_t foo)
                 game.prop[TROLL] = 1;
             k = 2;
             if (HERE(EGGS))k = 1;
-            if (game.loc == PLAC[EGGS])k = 0;
-            MOVE(EGGS, PLAC[EGGS]);
-            pspeak(EGGS, k);
+            if (game.loc == object_descriptions[EGGS].plac)k = 0;
+            MOVE(EGGS, object_descriptions[EGGS].plac);
+            pspeak(EGGS, look, k);
             return GO_CLEAROBJ;
         }
     }
@@ -304,7 +305,7 @@ static int chain(token_t verb)
     } else {
         spk = CHAIN_LOCKED;
         if (game.prop[CHAIN] != 0)spk = ALREADY_LOCKED;
-        if (game.loc != PLAC[CHAIN])spk = NO_LOCKSITE;
+        if (game.loc != object_descriptions[CHAIN].plac)spk = NO_LOCKSITE;
         if (spk != CHAIN_LOCKED) {
             rspeak(spk);
             return GO_CLEAROBJ;
@@ -349,14 +350,14 @@ static int discard(token_t verb, token_t obj, bool just_do_it)
                 if (spk != RUG_WIGGLES) {
                     int k = 2 - game.prop[RUG];
                     game.prop[RUG] = k;
-                    if (k == 2) k = PLAC[SAPPH];
+                    if (k == 2) k = object_descriptions[SAPPH].plac;
                     MOVE(RUG + NOBJECTS, k);
                 }
             }
         } else if (obj == COINS && HERE(VEND)) {
             DESTROY(COINS);
             DROP(BATTERY, game.loc);
-            pspeak(BATTERY, FRESH_BATTERIES);
+            pspeak(BATTERY, look, FRESH_BATTERIES);
             return GO_CLEAROBJ;
         } else if (obj == BIRD && AT(DRAGON) && game.prop[DRAGON] == 0) {
             rspeak(BIRD_BURNT);
@@ -366,16 +367,16 @@ static int discard(token_t verb, token_t obj, bool just_do_it)
             rspeak(TROLL_SCAMPERS);
             MOVE(TROLL, 0);
             MOVE(TROLL + NOBJECTS, 0);
-            MOVE(TROLL2, PLAC[TROLL]);
-            MOVE(TROLL2 + NOBJECTS, FIXD[TROLL]);
+            MOVE(TROLL2, object_descriptions[TROLL].plac);
+            MOVE(TROLL2 + NOBJECTS, object_descriptions[TROLL].fixd);
             JUGGLE(CHASM);
             game.prop[TROLL] = 2;
-        } else if (obj != VASE || game.loc == PLAC[PILLOW]) {
+        } else if (obj != VASE || game.loc == object_descriptions[PILLOW].plac) {
             rspeak(OK_MAN);
         } else {
             game.prop[VASE] = 2;
             if (AT(PILLOW))game.prop[VASE] = 0;
-            pspeak(VASE, game.prop[VASE] + 1);
+            pspeak(VASE, look, game.prop[VASE] + 1);
             if (game.prop[VASE] != 0)game.fixed[VASE] = -1;
         }
     }
@@ -623,7 +624,7 @@ static int inven(void)
         if (spk == NO_CARRY)
             rspeak(NOW_HOLDING);
         game.blklin = false;
-        pspeak(i, -1);
+        pspeak(i, touch, -1);
         game.blklin = true;
         spk = NO_MESSAGE;
     }
@@ -685,14 +686,15 @@ static int listen(void)
            spk = NO_MESSAGE;
     }
     for (int i = 1; i <= NOBJECTS; i++) {
-        if (!HERE(i) || OBJSND[i] == 0 || game.prop[i] < 0)
+        if (!HERE(i) || object_descriptions[i].sounds[0] == NULL || game.prop[i] < 0)
             continue;
-       int mi =  OBJSND[i] + game.prop[i];
+       int mi =  game.prop[i];
        if (i == BIRD)
            mi += 3 * game.blooded;
-        pspeak(i, mi, game.zzword);
+        pspeak(i, hear, mi, game.zzword);
         spk = NO_MESSAGE;
-        if (i == BIRD && OBJSND[i] + game.prop[i] == 8)
+       /* FIXME: Magic number, sensitive to bird state logic */
+       if (i == BIRD && game.prop[i] == 5)
             DESTROY(BIRD);
     }
     rspeak(spk);
@@ -775,7 +777,7 @@ static int pour(token_t verb, token_t obj)
             rspeak(spk);
             return GO_CLEAROBJ;
         }
-        pspeak(PLANT, game.prop[PLANT] + 3);
+        pspeak(PLANT, look, game.prop[PLANT] + 3);
         game.prop[PLANT] = MOD(game.prop[PLANT] + 1, 3);
         game.prop[PLANT2] = game.prop[PLANT];
         return GO_MOVE;
@@ -802,7 +804,7 @@ static int read(struct command_t command)
     if (command.obj == INTRANSITIVE) {
         command.obj = 0;
         for (int i = 1; i <= NOBJECTS; i++) {
-            if (HERE(i) && OBJTXT[i] != 0 && game.prop[i] >= 0)
+            if (HERE(i) && object_descriptions[i].texts[0] != NULL && game.prop[i] >= 0)
                 command.obj = command.obj * NOBJECTS + i;
         }
         if (command.obj > NOBJECTS || command.obj == 0 || DARK(game.loc))
@@ -813,10 +815,10 @@ static int read(struct command_t command)
         rspeak(NO_SEE, command.wd1, command.wd1x);
     } else if (command.obj == OYSTER && !game.clshnt && game.closed) {
         game.clshnt = YES(arbitrary_messages[CLUE_QUERY], arbitrary_messages[WAYOUT_CLUE], arbitrary_messages[OK_MAN]);
-    } else if (OBJTXT[command.obj] == 0 || game.prop[command.obj] < 0) {
+    } else if (object_descriptions[command.obj].texts[0] == NULL || game.prop[command.obj] < 0) {
         rspeak(ACTSPK[command.verb]);
     } else
-        pspeak(command.obj, OBJTXT[command.obj] + game.prop[command.obj]);
+        pspeak(command.obj, study, game.prop[command.obj]);
     return GO_CLEAROBJ;
 }
 
@@ -827,7 +829,7 @@ static int reservoir(void)
         rspeak(NOTHING_HAPPENS);
         return GO_CLEAROBJ;
     } else {
-        pspeak(RESER, game.prop[RESER] + 1);
+        pspeak(RESER, look, game.prop[RESER] + 1);
         game.prop[RESER] = 1 - game.prop[RESER];
         if (AT(RESER))
             return GO_CLEAROBJ;
@@ -897,14 +899,14 @@ static int throw (FILE *cmdin, struct command_t *command)
         rspeak(spk);
         return GO_CLEAROBJ;
     }
-    if (command->obj >= MINTRS && command->obj <= MAXTRS && AT(TROLL)) {
+    if (object_descriptions[command->obj].is_treasure && AT(TROLL)) {
         spk = TROLL_SATISFIED;
         /*  Snarf a treasure for the troll. */
         DROP(command->obj, 0);
         MOVE(TROLL, 0);
         MOVE(TROLL + NOBJECTS, 0);
-        DROP(TROLL2, PLAC[TROLL]);
-        DROP(TROLL2 + NOBJECTS, FIXD[TROLL]);
+        DROP(TROLL2, object_descriptions[TROLL].plac);
+        DROP(TROLL2 + NOBJECTS, object_descriptions[TROLL].fixd);
         JUGGLE(CHASM);
         rspeak(spk);
         return GO_CLEAROBJ;
@@ -993,7 +995,7 @@ static int wave(token_t verb, token_t obj)
         }
         if (HERE(BIRD))rspeak(spk);
         game.prop[FISSURE] = 1 - game.prop[FISSURE];
-        pspeak(FISSURE, 2 - game.prop[FISSURE]);
+        pspeak(FISSURE, look, 2 - game.prop[FISSURE]);
         return GO_CLEAROBJ;
     }
 }