Fully subsume section 7 into YAML.
authorEric S. Raymond <esr@thyrsus.com>
Sun, 25 Jun 2017 00:05:14 +0000 (20:05 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Sun, 25 Jun 2017 00:28:22 +0000 (20:28 -0400)
actions.c
adventure.yaml
dungeon.c
init.c
main.c
newdungeon.py

index c5f06e59f2b96d16039caa78defd156fae6e7b02..c1996f3c765b35f41a073987e28cc4fc081f15fb 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -86,14 +86,14 @@ static int attack(FILE *input, struct command_t *command)
         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;
@@ -122,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 {
@@ -132,8 +132,8 @@ 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]);
+            if (game.loc == object_descriptions[EGGS].plac)k = 0;
+            MOVE(EGGS, object_descriptions[EGGS].plac);
             pspeak(EGGS, look, k);
             return GO_CLEAROBJ;
         }
@@ -305,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;
@@ -350,7 +350,7 @@ 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);
                 }
             }
@@ -367,11 +367,11 @@ 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;
@@ -905,8 +905,8 @@ static int throw (FILE *cmdin, struct command_t *command)
         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;
index 629060a40bc2b4868e194cfa845e033c0adffd48..622b3198013ba1ce5584867da91be709df566f9f 100644 (file)
 #
 # 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.
+#    There is also a boolean "treasure" attribute, defaulting to false.
+#    An pbject may have one or two start locations (the gate is an example
+#    of a two-location object; it can be accessed from above or below).
+#    An object may also be flagged immovable, meaning it cannot be carried.
 #    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
@@ -74,9 +77,9 @@
 #    significant, they're used in succession as the player racks up
 #    deaths.
 #
-# These correspond to sections 1, 2, 5, 6, 9, 10, 11, 13, and 14 in the old
-# adventure.text format.  Sections 3, 4, 7, and 8 haven't moved yet.
-# Section 12 was obsolete.
+# These correspond to sections 1, 2, 5, 6, 7, 9, 10, 11, 13, and 14 in
+# the old adventure.text format.  Sections 3, 4, and 8 haven't moved
+# yet.  Section 12 was obsolete.
 #
 # Message strings may include certain special character sequences to
 # denote that the program must provide parameters to insert into a
@@ -1500,37 +1503,47 @@ object_descriptions: !!omap
     longs: !!null
 - OBJ_1:
     inventory: 'Set of keys'
+    locations: LOC_BUILDING
     longs:
     - 'There are some keys on the ground here.'
 - OBJ_2:
     inventory: 'Brass lantern'
+    locations: LOC_BUILDING
     longs:
     - [LAMP_DARK, 'There is a shiny brass lamp nearby.']
     - [LAMP_BRIGHT, 'There is a lamp shining nearby.']
 - OBJ_3:
     inventory: '*grate'
+    locations: [LOC_GRATE, LOC_BELOWGRATE]
+    immovable: true
     longs:
     - [GRATE_CLOSED, 'The grate is locked.']
     - [GRATE_OPEN, 'The grate is open.']
 - OBJ_4:
     inventory: 'Wicker cage'
+    locations: LOC_COBBLE
     longs:
     - 'There is a small wicker cage discarded nearby.'
 - OBJ_5:
     inventory: 'Black rod'
+    locations: LOC_DEBRIS
     longs:
     - 'A three foot black rod with a rusty star on an end lies nearby.'
 - OBJ_6:
     inventory: 'Black rod'
+    locations: LOC_NOWHERE
     longs:
     - 'A three foot black rod with a rusty mark on an end lies nearby.'
 - OBJ_7:
     inventory: '*steps'
+    locations: [LOC_PITTOP, LOC_MISTHALL]
+    immovable: true
     longs:
     - 'Rough stone steps lead down the pit.'
     - 'Rough stone steps lead up the dome.'
 - OBJ_8:
     inventory: 'Little bird in cage'
+    locations: LOC_BIRD
     longs:
     - [BIRD_UNCAGED, 'A cheerful little bird is sitting here singing.']
     - [BIRD_CAGED, 'There is a little bird in the cage.']
@@ -1544,15 +1557,20 @@ object_descriptions: !!omap
     - 'The bird is singing to you in gratitude for your having returned it to\nits home.  In return, it informs you of a magic word which it thinks\nyou may find useful somewhere near the Hall of Mists.  The magic word\nchanges frequently, but for now the bird believes it is "%s".  You\nthank the bird for this information, and it flies off into the forest.'
 - OBJ_9:
     inventory: '*rusty door'
+    locations: LOC_IMMENSE
+    immovable: true
     longs:
     - 'The way north is barred by a massive, rusty, iron door.'
     - 'The way north leads through a massive, rusty, iron door.'
 - OBJ_10:
     inventory: 'Velvet pillow'
+    locations: LOC_SOFTROOM
     longs:
     - 'A small velvet pillow lies on the floor.'
 - OBJ_11:
     inventory: '*snake'
+    locations: LOC_KINGHALL
+    immovable: true
     longs:
     - 'A huge green fierce snake bars the way!'
     - '' # chased away
@@ -1560,24 +1578,30 @@ object_descriptions: !!omap
     - 'The snake is hissing venomously.'
 - OBJ_12:
     inventory: '*fissure'
+    locations: [LOC_EASTBANK, LOC_WESTBANK]
+    immovable: true
     longs:
     - ''
     - 'A crystal bridge now spans the fissure.'
     - 'The crystal bridge has vanished!'
 - OBJ_13:
     inventory: '*stone tablet'
+    locations: LOC_DARKROOM
+    immovable: true
     longs:
     - 'A massive stone tablet imbedded in the wall reads:\n"Congratulations on bringing light into the dark-room!"'
     texts:
     - '"Congratulations on bringing light into the dark-room!"'
 - OBJ_14:
     inventory: 'Giant clam  >GRUNT!<'
+    locations: LOC_SHELLROOM
     longs:
     - 'There is an enormous clam here with its shell tightly closed.'
     sounds:
     - 'The clam is as tight-mouthed as a, er, clam.'
 - OBJ_15:
     inventory: 'Giant oyster  >GROAN!<'
+    locations: LOC_NOWHERE
     longs:
     - 'There is an enormous oyster here with its shell tightly closed.'
     - 'Interesting.  There seems to be something written on the underside of\nthe oyster.'
@@ -1586,37 +1610,49 @@ object_descriptions: !!omap
     - 'It says the same thing it did before.  Hm, maybe it''s a pun?'
 - OBJ_16:
     inventory: '"Spelunker Today"'
+    locations: LOC_ANTEROOM
     longs:
     - 'There are a few recent issues of "Spelunker Today" magazine here.'
     texts:
     - 'I''m afraid the magazine is written in dwarvish.  But pencilled on one\ncover you see, "Please leave the magazines at the construction site."'
 - OBJ_17:
     inventory: !!null
+    locations: LOC_NOWHERE
+    immovable: true
     longs: !!null
 - OBJ_18:
     inventory: !!null
+    locations: LOC_NOWHERE
     longs: !!null
 - OBJ_19:
     inventory: 'Tasty food'
+    locations: LOC_BUILDING
     longs:
     - 'There is food here.'
 - OBJ_20:
     inventory: 'Small bottle'
+    locations: LOC_BUILDING
     longs:
     - [WATER_BOTTLE, 'There is a bottle of water here.']
     - [EMPTY_BOTTLE, 'There is an empty bottle here.']
     - [OIL_BOTTLE, 'There is a bottle of oil here.']
 - OBJ_21:
     inventory: 'Water in the bottle'
+    locations: LOC_NOWHERE
     longs: !!null
 - OBJ_22:
     inventory: 'Oil in the bottle'
+    locations: LOC_NOWHERE
     longs: !!null
 - OBJ_23:
     inventory: '*mirror'
+    locations: LOC_MIRRORCANYON
+    immovable: true
     longs: !!null
 - OBJ_24:
     inventory: '*plant'
+    locations: LOC_WESTPIT
+    immovable: true
     longs:
     - 'There is a tiny little plant in the pit, murmuring "water, water, ..."'
     - 'There is a 12-foot-tall beanstalk stretching up out of the pit,\nbellowing "WATER!! WATER!!"'
@@ -1630,31 +1666,44 @@ object_descriptions: !!omap
     - 'The plant now maintains a contented silence.'
 - OBJ_25:
     inventory: '*phony plant' # seen in Twopit Room only when tall enough
+    locations: [LOC_WESTEND, LOC_EASTEND]
+    immovable: true
     longs:
     - ''
     - 'The top of a 12-foot-tall beanstalk is poking out of the west pit.'
     - 'There is a huge beanstalk growing out of the west pit up to the hole.'
 - OBJ_26:
     inventory: '*stalactite'
+    locations: LOC_TOPSTALACTITE
+    immovable: true
     longs:
     - ''
 - OBJ_27:
     inventory: '*shadowy figure and/or window'
+    locations: [LOC_WINDOW1, LOC_WINDOW2]
+    immovable: true
     longs:
     - 'The shadowy figure seems to be trying to attract your attention.'
 - OBJ_28:
     inventory: 'Dwarf''s axe'
+    locations: LOC_NOWHERE
     longs:
     - 'There is a little axe here.'
     - 'There is a little axe lying beside the bear.'
 - OBJ_29:
     inventory: '*cave drawings'
+    locations: LOC_ORIENTAL
+    immovable: true
     longs: !!null
 - OBJ_30:
     inventory: '*pirate/genie'
+    locations: LOC_NOWHERE
+    immovable: true
     longs: !!null # never present
 - OBJ_31:
     inventory: '*dragon'
+    locations: [LOC_SECRET4, LOC_SECRET6]
+    immovable: true
     longs:
     - 'A huge green fierce dragon bars the way!'
     - 'The blood-specked body of a huge green dead dragon lies to one side.'
@@ -1666,11 +1715,15 @@ object_descriptions: !!omap
     - 'The dragon is, not surprisingly, silent.'
 - OBJ_32:
     inventory: '*chasm'
+    locations: [LOC_SWCHASM, LOC_NECHASM]
+    immovable: true
     longs:
     - 'A rickety wooden bridge extends across the chasm, vanishing into the\nmist.  A notice posted on the bridge reads, "Stop! Pay troll!"'
     - 'The wreckage of a bridge (and a dead bear) can be seen at the bottom\nof the chasm.'
 - OBJ_33:
     inventory: '*troll'
+    locations: [LOC_SWCHASM, LOC_NECHASM]
+    immovable: true
     longs:
     - 'A burly troll stands by the bridge and insists you throw him a\ntreasure before you may cross.'
     - 'The troll steps out from beneath the bridge and blocks your way.'
@@ -1679,10 +1732,14 @@ object_descriptions: !!omap
     - 'The troll sounds quite adamant in his demand for a treasure.'
 - OBJ_34:
     inventory: '*phony troll'
+    locations: [LOC_NOWHERE, LOC_NOWHERE]
+    immovable: true
     longs:
     - 'The troll is nowhere to be seen.'
 - OBJ_35:
     inventory: !!null # bear uses rtext 141
+    locations: LOC_BARRENROOM
+    immovable: true
     longs:
     - 'There is a ferocious cave bear eying you from the far end of the room!'
     - 'There is a gentle cave bear sitting placidly in one corner.'
@@ -1690,15 +1747,21 @@ object_descriptions: !!omap
     - '' # dead
 - OBJ_36:
     inventory: '*message in second maze'
+    locations: LOC_NOWHERE
+    immovable: true
     longs:
     - 'There is a message scrawled in the dust in a flowery script, reading:\n"This is not the maze where the pirate leaves his treasure chest."'
     texts:
     - '"This is not the maze where the pirate leaves his treasure chest."'
 - OBJ_37:
     inventory: '*volcano and/or geyser'
+    locations: LOC_BREATHTAKING
+    immovable: true
     longs: !!null
 - OBJ_38:
     inventory: '*vending machine'
+    locations: LOC_DEADEND13
+    immovable: true
     longs:
     - [VEND_BLOCKS, 'There is a massive and somewhat battered vending machine here.  The\ninstructions on it read: "Drop coins here to receive fresh batteries."']
     - [VEND_UNBLOCKS, 'There is a massive vending machine here, swung back to reveal a\nsouthward passage.']
@@ -1707,57 +1770,77 @@ object_descriptions: !!omap
     - '"Drop coins here to receive fresh batteries."'
 - OBJ_39:
     inventory: 'Batteries'
+    locations: LOC_NOWHERE
     longs:
     - [FRESH_BATTERIES, 'There are fresh batteries here.']
     - [DEAD_BATTERIES, 'Some worn-out batteries have been discarded nearby.']
 - OBJ_40:
     inventory: '*carpet and/or moss and/or curtains'
+    locations: LOC_SOFTROOM
+    immovable: true
     longs: !!null
 - OBJ_41:
     inventory: '*ogre'
+    locations: LOC_LARGE
+    immovable: true
     longs:
     - 'A formidable ogre bars the northern exit.'
     sounds:
     - 'The ogre is apparently the strong, silent type.'
 - OBJ_42:
     inventory: '*urn'
+    locations: LOC_CLIFF
+    immovable: true
     longs:
     - 'A small urn is embedded in the rock.'
     - 'A small urn full of oil is embedded in the rock.'
     - 'A small oil flame extrudes from an urn embedded in the rock.'
 - OBJ_43:
     inventory: '*cavity'
+    locations: LOC_NOWHERE
+    immovable: true
     longs:
     - '' # something in it
     - 'There is a small urn-shaped cavity in the rock.'
 - OBJ_44:
     inventory: '*blood'
+    locations: LOC_NOWHERE
+    immovable: true
     longs:
     - '' # described with dragon
 - OBJ_45:
     inventory: '*reservoir'
+    locations: [LOC_RESERVOIR, LOC_RESNORTH]
+    immovable: true
     longs:
     - ''
     - 'The waters have parted to form a narrow path across the reservoir.'
     - 'The waters crash together again.'
 - OBJ_46:
     inventory: 'Leporine appendage'
+    locations: LOC_FOREST22
     longs:
     - 'Your keen eye spots a severed leporine appendage lying on the ground.'
 - OBJ_47:
     inventory: '*mud'
+    locations: LOC_DEBRIS
+    immovable: true
     longs:
     - ''
     texts:
     - '"MAGIC WORD XYZZY"'
 - OBJ_48:
     inventory: '*note'
+    locations: LOC_NUGGET
+    immovable: true
     longs:
     - ''
     texts:
     - '"You won''t get it up the steps"'
 - OBJ_49:
     inventory: '*sign'
+    locations: LOC_ANTEROOM
+    immovable: true
     longs:
     - [INGAME_SIGN, '']
     - [ENDGAME_SIGN, '']
@@ -1766,36 +1849,43 @@ object_descriptions: !!omap
     - '"Treasure Vault.  Keys in main office."'
 - OBJ_50:
     inventory: 'Large gold nugget'
+    locations: LOC_NUGGET
     treasure: true
     longs:
     - 'There is a large sparkling nugget of gold here!'
 - OBJ_51:
     inventory: 'Several diamonds'
+    locations: LOC_WESTBANK
     treasure: true
     longs:
     - 'There are diamonds here!'
 - OBJ_52:
     inventory: 'Bars of silver'
+    locations: LOC_FLOORHOLE
     treasure: true
     longs:
     - 'There are bars of silver here!'
 - OBJ_53:
     inventory: 'Precious jewelry'
+    locations: LOC_SOUTHSIDE
     treasure: true
     longs:
     - 'There is precious jewelry here!'
 - OBJ_54:
     inventory: 'Rare coins'
+    locations: LOC_WESTSIDE
     treasure: true
     longs:
     - 'There are many coins here!'
 - OBJ_55:
     inventory: 'Treasure chest'
+    locations: LOC_NOWHERE
     treasure: true
     longs:
     - 'The pirate''s treasure chest is here!'
 - OBJ_56:
     inventory: 'Golden eggs'
+    locations: LOC_GIANTROOM
     treasure: true
     longs:
     - 'There is a large nest here, full of golden eggs!'
@@ -1803,11 +1893,13 @@ object_descriptions: !!omap
     - 'Done!'
 - OBJ_57:
     inventory: 'Jeweled trident'
+    locations: LOC_WATERFALL
     treasure: true
     longs:
     - 'There is a jewel-encrusted trident here!'
 - OBJ_58:
     inventory: 'Ming vase'
+    locations: LOC_ORIENTAL
     treasure: true
     longs:
     - [VASE_WHOLE, 'There is a delicate, precious, ming vase here!']
@@ -1816,22 +1908,27 @@ object_descriptions: !!omap
     - [VASE_DROPS, 'The ming vase drops with a delicate crash.']
 - OBJ_59:
     inventory: 'Egg-sized emerald'
+    locations: LOC_PLOVER
     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'
+    locations: LOC_DARKROOM
     treasure: true
     longs:
     - 'There is a platinum pyramid here, 8 inches on a side!'
 - OBJ_61:
     inventory: 'Glistening pearl'
+    locations: LOC_NOWHERE
     treasure: true
     longs:
     - 'Off to one side lies a glistening pearl!'
 - OBJ_62:
     inventory: 'Persian rug'
+    locations: [LOC_SECRET4, LOC_SECRET6]
+    immovable: true
     treasure: true
     longs:
     - 'There is a persian rug spread out on the floor!'
@@ -1839,11 +1936,14 @@ object_descriptions: !!omap
     - 'There is a persian rug here, hovering in mid-air!'
 - OBJ_63:
     inventory: 'Rare spices'
+    locations: LOC_BOULDERS2
     treasure: true
     longs:
     - 'There are rare spices here!'
 - OBJ_64:
     inventory: 'Golden chain'
+    locations: LOC_BARRENROOM
+    immovable: true
     treasure: true
     longs:
     - 'There is a golden chain lying in a heap on the floor!'
@@ -1851,29 +1951,34 @@ object_descriptions: !!omap
     - 'There is a golden chain locked to the wall!'
 - OBJ_65:
     inventory: 'Giant ruby'
+    locations: LOC_STOREROOM
     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'
+    locations: LOC_NOWHERE
     treasure: true
     longs:
     - 'A precious jade necklace has been dropped here!'
 - OBJ_67:
     inventory: 'Amber gemstone'
+    locations: LOC_NOWHERE
     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'
+    locations: LOC_LEDGE
     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'
+    locations: LOC_REACHDEAD
     treasure: true
     longs:
     - 'There is a richly-carved ebony statuette here!'
index 6c6fcfdf1e9639116c52fce8f3a78a28a64af24a..35ffbd4aa878e2e269551dd7b37499053d9abbe0 100644 (file)
--- a/dungeon.c
+++ b/dungeon.c
  *     or "attack").  Else, if M=3, the word is a special case verb (such as
  *     "dig") and N % 1000 is an index into section 6.  Objects from 50 to
  *     (currently, anyway) 79 are considered treasures (for pirate, closeout).
- *  Section 7: Object locations.  Each line contains an object number and its
- *     initial location (zero (or omitted) if none).  If the object is
- *     immovable, the location is followed by a "-1".  If it has two locations
- *     (e.g. the grate) the first location is followed with the second, and
- *     the object is assumed to be immovable.
  *  Section 8: Action defaults.  Each line contains an "action-verb" number and
  *     the index (in section 6) of the default message for the verb.
  *  Section 0: End of database.
@@ -104,8 +99,6 @@ long LINES[LINSIZ + 1];
 long TRAVEL[TRVSIZ + 1];
 long KTAB[TABSIZ + 1];
 long ATAB[TABSIZ + 1];
-long PLAC[NOBJECTS + 1];
-long FIXD[NOBJECTS + 1];
 long ACTSPK[VRBSIZ + 1];
 
 static long GETTXT(long SKIP, long ONEWRD, long UPPER)
@@ -301,8 +294,7 @@ static void read_initial_locations(FILE* database)
 {
     long OBJ;
     while ((OBJ = GETNUM(database)) != -1) {
-        PLAC[OBJ] = GETNUM(NULL);
-        FIXD[OBJ] = GETNUM(NULL);
+       /* all done from YAML now */
     }
 }
 
@@ -476,8 +468,6 @@ static void write_file(FILE* header_file)
     write_1d(header_file, TRAVEL, TRVSIZ + 1, "TRAVEL");
     write_1d(header_file, KTAB, TABSIZ + 1, "KTAB");
     write_1d(header_file, ATAB, TABSIZ + 1, "ATAB");
-    write_1d(header_file, PLAC, NOBJECTS + 1, "PLAC");
-    write_1d(header_file, FIXD, NOBJECTS + 1, "FIXD");
     write_1d(header_file, ACTSPK, VRBSIZ + 1, "ACTSPK");
 
     fprintf(header_file, "#undef LOCATION\n");
diff --git a/init.c b/init.c
index fe373f37fbd078ecbd6251bc8d08f8ae91868252..03a574f13eb5dd3f7126cfcdb7488d3131a240af 100644 (file)
--- a/init.c
+++ b/init.c
@@ -40,17 +40,17 @@ void initialise(void)
      *  described last, we'll drop them first. */
     for (int i = 1; i <= NOBJECTS; i++) {
         int k = NOBJECTS + 1 - i;
-        if (FIXD[k] > 0) {
-            DROP(k + NOBJECTS, FIXD[k]);
-            DROP(k, PLAC[k]);
+        if (object_descriptions[k].fixd > 0) {
+            DROP(k + NOBJECTS, object_descriptions[k].fixd);
+            DROP(k, object_descriptions[k].plac);
         }
     }
 
     for (int i = 1; i <= NOBJECTS; i++) {
         int k = NOBJECTS + 1 - i;
-        game.fixed[k] = FIXD[k];
-        if (PLAC[k] != 0 && FIXD[k] <= 0)
-            DROP(k, PLAC[k]);
+        game.fixed[k] = object_descriptions[k].fixd;
+        if (object_descriptions[k].plac != 0 && object_descriptions[k].fixd <= 0)
+            DROP(k, object_descriptions[k].plac);
     }
 
     /*  Treasure props are initially -1, and are set to 0 the first time
diff --git a/main.c b/main.c
index 069c8651c808ea312a150a4b9246713226a7a52a..733027f70eca8160e3813c60aaa4203c6c85d522 100644 (file)
--- a/main.c
+++ b/main.c
@@ -294,7 +294,7 @@ static bool spotted_by_pirate(int i)
            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])) {
+        if (treasure == PYRAMID && (game.loc == object_descriptions[PYRAMID].plac || game.loc == object_descriptions[EMERALD].plac)) {
             continue;
         }
         if (TOTING(treasure) || HERE(treasure))
@@ -328,7 +328,7 @@ static bool spotted_by_pirate(int i)
        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 (!(treasure == PYRAMID && (game.loc == object_descriptions[PYRAMID].plac || game.loc == object_descriptions[EMERALD].plac))) {
                 if (AT(treasure) && game.fixed[treasure] == 0)
                     CARRY(treasure, game.loc);
                 if (TOTING(treasure))
@@ -695,13 +695,13 @@ static bool playermove(token_t verb, int motion)
                         game.prop[TROLL] = 0;
                         MOVE(TROLL2, 0);
                         MOVE(TROLL2 + NOBJECTS, 0);
-                        MOVE(TROLL, PLAC[TROLL]);
-                        MOVE(TROLL + NOBJECTS, FIXD[TROLL]);
+                        MOVE(TROLL, object_descriptions[TROLL].plac);
+                        MOVE(TROLL + NOBJECTS, object_descriptions[TROLL].fixd);
                         JUGGLE(CHASM);
                         game.newloc = game.loc;
                         return true;
                     } else {
-                        game.newloc = PLAC[TROLL] + FIXD[TROLL] - game.loc;
+                        game.newloc = object_descriptions[TROLL].plac + object_descriptions[TROLL].fixd - game.loc;
                         if (game.prop[TROLL] == 0)game.prop[TROLL] = 1;
                         if (!TOTING(BEAR)) return true;
                         rspeak(BRIDGE_COLLAPSE);
@@ -773,8 +773,8 @@ static bool closecheck(void)
         }
         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);
         if (game.prop[BEAR] != 3)DESTROY(BEAR);
         game.prop[CHAIN] = 0;
index 1ff4327e486798ec76e300a68859b9fb9ab62372..c16f9999165eb26f5208a1627b5d4485c45dde2a 100755 (executable)
@@ -44,6 +44,7 @@ h_template = """/* Generated from adventure.yaml - do not hand-hack! */
 
 typedef struct {{
   const char* inventory;
+  int plac, fixd;
   bool is_treasure;
   const char** longs;
   const char** sounds;
@@ -240,6 +241,8 @@ def get_locations(loc):
 def get_object_descriptions(obj):
     template = """    {{
         .inventory = {},
+        .plac = {},
+        .fixd = {},
         .is_treasure = {},
         .longs = (const char* []) {{
 {}
@@ -254,13 +257,14 @@ def get_object_descriptions(obj):
 """
     obj_str = ""
     for item in obj:
-        i_msg = make_c_string(item[1]["inventory"])
+        attr = item[1]
+        i_msg = make_c_string(attr["inventory"])
         longs_str = ""
-        if item[1]["longs"] == None:
+        if attr["longs"] == None:
             longs_str = " " * 12 + "NULL,"
         else:
             labels = []
-            for l_msg in item[1]["longs"]:
+            for l_msg in attr["longs"]:
                 if not isinstance(l_msg, str):
                     labels.append(l_msg)
                     l_msg = l_msg[1]
@@ -275,21 +279,27 @@ def get_object_descriptions(obj):
                     statedefines += "#define %s\t%d /* %s */\n" % (label, i, message)
                 statedefines += "\n"
         sounds_str = ""
-        if item[1].get("sounds") == None:
+        if attr.get("sounds") == None:
             sounds_str = " " * 12 + "NULL,"
         else:
-             for l_msg in item[1]["sounds"]:
+             for l_msg in attr["sounds"]:
                  sounds_str += " " * 12 + make_c_string(l_msg) + ",\n"
              sounds_str = sounds_str[:-1] # trim trailing newline
         texts_str = ""
-        if item[1].get("texts") == None:
+        if attr.get("texts") == None:
             texts_str = " " * 12 + "NULL,"
         else:
-             for l_msg in item[1]["texts"]:
+             for l_msg in attr["texts"]:
                  texts_str += " " * 12 + make_c_string(l_msg) + ",\n"
              texts_str = texts_str[:-1] # trim trailing newline
-        treasure = "true" if item[1].get("treasure") else "false"
-        obj_str += template.format(i_msg, treasure, longs_str, sounds_str, texts_str)
+        locs = attr.get("locations", ["LOC_NOWHERE", "LOC_NOWHERE"])
+        immovable = attr.get("immovable", False)
+        if type(locs) == str:
+            locs = [locnames.index(locs), -1 if immovable else 0]
+        else:
+            locs = [locnames.index(x) for x in locs]
+        treasure = "true" if attr.get("treasure") else "false"
+        obj_str += template.format(i_msg, locs[0], locs[1], treasure, longs_str, sounds_str, texts_str)
     obj_str = obj_str[:-1] # trim trailing newline
     return obj_str
 
@@ -353,6 +363,8 @@ if __name__ == "__main__":
     with open(yaml_name, "r") as f:
         db = yaml.load(f)
 
+    locnames = [x[0] for x in db["locations"]]
+
     c = c_template.format(
         h_name,
         get_arbitrary_messages(db["arbitrary_messages"]),