From 8a6e6aae7d289c4f7d5c419aba5f39f5eb74fb08 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sat, 24 Jun 2017 20:05:14 -0400 Subject: [PATCH] Fully subsume section 7 into YAML. --- actions.c | 24 +++++------ adventure.yaml | 113 +++++++++++++++++++++++++++++++++++++++++++++++-- dungeon.c | 12 +----- init.c | 12 +++--- main.c | 14 +++--- newdungeon.py | 30 +++++++++---- 6 files changed, 156 insertions(+), 49 deletions(-) diff --git a/actions.c b/actions.c index c5f06e5..c1996f3 100644 --- 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; diff --git a/adventure.yaml b/adventure.yaml index 629060a..622b319 100644 --- a/adventure.yaml +++ b/adventure.yaml @@ -64,7 +64,10 @@ # # 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!' diff --git a/dungeon.c b/dungeon.c index 6c6fcfd..35ffbd4 100644 --- a/dungeon.c +++ b/dungeon.c @@ -60,11 +60,6 @@ * 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 fe373f3..03a574f 100644 --- 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 069c865..733027f 100644 --- 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; diff --git a/newdungeon.py b/newdungeon.py index 1ff4327..c16f999 100755 --- a/newdungeon.py +++ b/newdungeon.py @@ -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"]), -- 2.31.1