Replace magic MINTRS/MAXTRS with a treasure attribute in YAML.
authorEric S. Raymond <esr@thyrsus.com>
Sat, 24 Jun 2017 14:42:23 +0000 (10:42 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Sat, 24 Jun 2017 14:47:59 +0000 (10:47 -0400)
actions.c
advent.h
adventure.yaml
init.c
main.c
newdungeon.py
score.c

index b059e8228622e506c9a36b51a013cb9c5aaafd63..c5f06e59f2b96d16039caa78defd156fae6e7b02 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -899,7 +899,7 @@ 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);
index 379bb53190e9d0419ea61d1d405658259df0f2e3..ba37940b53d26b14ebe777119051414c1c65e50e 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -9,8 +9,6 @@
 #define NDWARVES       6               /* number of dwarves */
 #define PIRATE         NDWARVES        /* must be NDWARVES-1 when zero-origin */
 #define DALTLC         LOC_NUGGET      /* alternate dwarf location */
-#define MINTRS         50              /* index of lowest reasure */
-#define MAXTRS         79              /* index of highest reasure */
 #define MAXPARMS       25              /* Max parameters for speak() */
 #define INVLIMIT       7               /* inverntory limit (# of objects) */
 #define INTRANSITIVE   -1              /* illegal object number */
index 44c71fdc0be501370cc449c3498f8f325823b138..60177932c5514b59a0795ff6ec2730d922c344d7 100644 (file)
@@ -64,6 +64,7 @@
 #
 # objects: Each item contains a description for use in the inventory command
 #    and one or more messages describing the object in different states.
+#    There is also a boolean "treasure" attribute, deaykting to false.
 #    If a state message is a tuple then the first element is made the name
 #    of a #define viible to the code for the associayed state, numbered
 #    from zero upwards. If the inventory desription begins with "*" the
@@ -1749,40 +1750,49 @@ object_descriptions: !!omap
     - '"Treasure Vault.  Keys in main office."'
 - OBJ_50:
     inventory: 'Large gold nugget'
+    treasure: true
     longs:
     - 'There is a large sparkling nugget of gold here!'
 - OBJ_51:
     inventory: 'Several diamonds'
+    treasure: true
     longs:
     - 'There are diamonds here!'
 - OBJ_52:
     inventory: 'Bars of silver'
+    treasure: true
     longs:
     - 'There are bars of silver here!'
 - OBJ_53:
     inventory: 'Precious jewelry'
+    treasure: true
     longs:
     - 'There is precious jewelry here!'
 - OBJ_54:
     inventory: 'Rare coins'
+    treasure: true
     longs:
     - 'There are many coins here!'
 - OBJ_55:
     inventory: 'Treasure chest'
+    treasure: true
     longs:
     - 'The pirate''s treasure chest is here!'
 - OBJ_56:
     inventory: 'Golden eggs'
+    treasure: true
     longs:
     - 'There is a large nest here, full of golden eggs!'
     - 'The nest of golden eggs has vanished!'
     - 'Done!'
 - OBJ_57:
     inventory: 'Jeweled trident'
+    treasure: true
     longs:
     - 'There is a jewel-encrusted trident here!'
 - OBJ_58:
     inventory: 'Ming vase'
+    treasure: true
     longs:
     - [VASE_WHOLE, 'There is a delicate, precious, ming vase here!']
     - [VASE_RESTING, 'The vase is now resting, delicately, on a velvet pillow.']
@@ -1790,149 +1800,67 @@ object_descriptions: !!omap
     - [VASE_DROPS, 'The ming vase drops with a delicate crash.']
 - OBJ_59:
     inventory: 'Egg-sized emerald'
+    treasure: true
     longs:
     - 'There is an emerald here the size of a plover''s egg!'
     - 'There is an emerald resting in a small cavity in the rock!'
 - OBJ_60:
     inventory: 'Platinum pyramid'
+    treasure: true
     longs:
     - 'There is a platinum pyramid here, 8 inches on a side!'
 - OBJ_61:
     inventory: 'Glistening pearl'
+    treasure: true
     longs:
     - 'Off to one side lies a glistening pearl!'
 - OBJ_62:
     inventory: 'Persian rug'
+    treasure: true
     longs:
     - 'There is a persian rug spread out on the floor!'
     - 'The dragon is sprawled out on a persian rug!!'
     - 'There is a persian rug here, hovering in mid-air!'
 - OBJ_63:
     inventory: 'Rare spices'
+    treasure: true
     longs:
     - 'There are rare spices here!'
 - OBJ_64:
     inventory: 'Golden chain'
+    treasure: true
     longs:
     - 'There is a golden chain lying in a heap on the floor!'
     - 'The bear is locked to the wall with a golden chain!'
     - 'There is a golden chain locked to the wall!'
 - OBJ_65:
     inventory: 'Giant ruby'
+    treasure: true
     longs:
     - 'There is an enormous ruby here!'
     - 'There is a ruby resting in a small cavity in the rock!'
 - OBJ_66:
     inventory: 'Jade necklace'
+    treasure: true
     longs:
     - 'A precious jade necklace has been dropped here!'
 - OBJ_67:
     inventory: 'Amber gemstone'
+    treasure: true
     longs:
     - 'There is a rare amber gemstone here!'
     - 'There is an amber gemstone resting in a small cavity in the rock!'
 - OBJ_68:
     inventory: 'Star sapphire'
+    treasure: true
     longs:
     - 'A brilliant blue star sapphire is here!'
     - 'There is a star sapphire resting in a small cavity in the rock!'
 - OBJ_69:
     inventory: 'Ebony statuette'
+    treasure: true
     longs:
     - 'There is a richly-carved ebony statuette here!'
-- OBJ_70:
-    inventory: !!null
-    longs: !!null
-- OBJ_71:
-    inventory: !!null
-    longs: !!null
-- OBJ_72:
-    inventory: !!null
-    longs: !!null
-- OBJ_73:
-    inventory: !!null
-    longs: !!null
-- OBJ_74:
-    inventory: !!null
-    longs: !!null
-- OBJ_75:
-    inventory: !!null
-    longs: !!null
-- OBJ_76:
-    inventory: !!null
-    longs: !!null
-- OBJ_77:
-    inventory: !!null
-    longs: !!null
-- OBJ_78:
-    inventory: !!null
-    longs: !!null
-- OBJ_79:
-    inventory: !!null
-    longs: !!null
-- OBJ_80:
-    inventory: !!null
-    longs: !!null
-- OBJ_81:
-    inventory: !!null
-    longs: !!null
-- OBJ_82:
-    inventory: !!null
-    longs: !!null
-- OBJ_83:
-    inventory: !!null
-    longs: !!null
-- OBJ_84:
-    inventory: !!null
-    longs: !!null
-- OBJ_85:
-    inventory: !!null
-    longs: !!null
-- OBJ_86:
-    inventory: !!null
-    longs: !!null
-- OBJ_87:
-    inventory: !!null
-    longs: !!null
-- OBJ_88:
-    inventory: !!null
-    longs: !!null
-- OBJ_89:
-    inventory: !!null
-    longs: !!null
-- OBJ_90:
-    inventory: !!null
-    longs: !!null
-- OBJ_91:
-    inventory: !!null
-    longs: !!null
-- OBJ_92:
-    inventory: !!null
-    longs: !!null
-- OBJ_93:
-    inventory: !!null
-    longs: !!null
-- OBJ_94:
-    inventory: !!null
-    longs: !!null
-- OBJ_95:
-    inventory: !!null
-    longs: !!null
-- OBJ_96:
-    inventory: !!null
-    longs: !!null
-- OBJ_97:
-    inventory: !!null
-    longs: !!null
-- OBJ_98:
-    inventory: !!null
-    longs: !!null
-- OBJ_99:
-    inventory: !!null
-    longs: !!null
-- OBJ_100:
-    inventory: !!null
-    longs: !!null
 
 obituaries:
   - query: 'Oh dear, you seem to have gotten yourself killed.  I might be able to\nhelp you out, but I''ve never really done this before.  Do you want me\nto try to reincarnate you?'
diff --git a/init.c b/init.c
index 3d77a9cfb515804ed7ceb6ae82d2bb78caf7ced1..b19e422fd5a9dc7dd5033ba985ec8048d32b957f 100644 (file)
--- a/init.c
+++ b/init.c
@@ -199,15 +199,16 @@ void initialise(void)
             DROP(k, PLAC[k]);
     }
 
-    /*  Treasures, as noted earlier, are objects MINTRS through MAXTRS
-     *  Their props are initially -1, and are set to 0 the first time
+    /*  Treasure props are initially -1, and are set to 0 the first time
      *  they are described.  game.tally keeps track of how many are
      *  not yet found, so we know when to close the cave. */
     game.tally = 0;
-    for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
-        if (object_descriptions[treasure].inventory != 0)
-            game.prop[treasure] = -1;
-        game.tally = game.tally - game.prop[treasure];
+    for (int treasure = 1; treasure <= NOBJECTS; treasure++) {
+       if (object_descriptions[treasure].is_treasure) {
+           if (object_descriptions[treasure].inventory != 0)
+               game.prop[treasure] = -1;
+           game.tally = game.tally - game.prop[treasure];
+       }
     }
 
     /*  Clear the hint stuff.  game.hintlc[i] is how long he's been at LOC
@@ -260,7 +261,7 @@ void initialise(void)
     VOLCANO = VOCWRD(WORD_VOLCANO, 1);
     WATER = VOCWRD(WORD_WATER, 1);
 
-    /* Objects from MINTRS through MAXTRS are treasures.  Here are a few. */
+    /* Vocabulary for treasures */
     AMBER = VOCWRD(WORD_AMBER, 1);
     CHAIN = VOCWRD(WORD_CHAIN, 1);
     CHEST = VOCWRD(WORD_CHEST, 1);
diff --git a/main.c b/main.c
index 6fa2ddcbc7c954f53fd111b5ce4bfbd386208586..069c8651c808ea312a150a4b9246713226a7a52a 100644 (file)
--- a/main.c
+++ b/main.c
@@ -289,7 +289,9 @@ static bool spotted_by_pirate(int i)
         return true;
     int snarfed = 0;
     bool movechest = false, robplayer = false;
-    for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
+    for (int treasure = 1; treasure <= NOBJECTS; treasure++) {
+       if (!object_descriptions[treasure].is_treasure)
+           continue;
         /*  Pirate won't take pyramid from plover room or dark
          *  room (too easy!). */
         if (treasure == PYRAMID && (game.loc == PLAC[PYRAMID] || game.loc == PLAC[EMERALD])) {
@@ -323,7 +325,9 @@ static bool spotted_by_pirate(int i)
     }
     if (robplayer) {
         rspeak(PIRATE_POUNCES);
-        for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
+       for (int treasure = 1; treasure <= NOBJECTS; treasure++) {
+           if (!object_descriptions[treasure].is_treasure)
+               continue;
             if (!(treasure == PYRAMID && (game.loc == PLAC[PYRAMID] || game.loc == PLAC[EMERALD]))) {
                 if (AT(treasure) && game.fixed[treasure] == 0)
                     CARRY(treasure, game.loc);
index 3b801da6d50ba0df2e554a971f86837a3b81a981..21ac9e64aa223cb1030b1a153dd5875c62ea72d0 100755 (executable)
@@ -21,6 +21,7 @@ h_template = """/* Generated from adventure.yaml - do not hand-hack! */
 
 typedef struct {{
   const char* inventory;
+  bool is_treasure;
   const char** longs;
   const char** sounds;
   const char** texts;
@@ -216,6 +217,7 @@ def get_locations(loc):
 def get_object_descriptions(obj):
     template = """    {{
         .inventory = {},
+        .is_treasure = {},
         .longs = (const char* []) {{
 {}
         }},
@@ -263,7 +265,8 @@ def get_object_descriptions(obj):
              for l_msg in item[1]["texts"]:
                  texts_str += " " * 12 + make_c_string(l_msg) + ",\n"
              texts_str = texts_str[:-1] # trim trailing newline
-        obj_str += template.format(i_msg, longs_str, sounds_str, texts_str)
+        treasure = "true" if item[1].get("treasure") else "false"
+        obj_str += template.format(i_msg, treasure, longs_str, sounds_str, texts_str)
     obj_str = obj_str[:-1] # trim trailing newline
     return obj_str
 
diff --git a/score.c b/score.c
index 95efe2c512236166cda0ac3122c07ea2ef122595..4c4cb9e666e27cead873528271cd7181773dff53 100644 (file)
--- a/score.c
+++ b/score.c
@@ -37,7 +37,9 @@ long score(enum termination mode)
     /*  First tally up the treasures.  Must be in building and not broken.
      *  Give the poor guy 2 points just for finding each treasure. */
     mxscor = 0;
-    for (long i = MINTRS; i <= MAXTRS; i++) {
+    for (int i = 1; i <= NOBJECTS; i++) {
+       if (!object_descriptions[i].is_treasure)
+           continue;
         if (object_descriptions[i].inventory != 0) {
             long k = 12;
             if (i == CHEST)k = 14;