Change structure of vocabulary YAML to cope with multiply-loaded words.
authorEric S. Raymond <esr@thyrsus.com>
Sun, 25 Jun 2017 16:36:40 +0000 (12:36 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Sun, 25 Jun 2017 16:36:40 +0000 (12:36 -0400)
adventure.yaml
travel.py

index a1c10fd173c4dae9114e539211d0e65138642419..acbbb91da5cd90a9dc65828693ec7de5ab594caa 100644 (file)
 #      %B = Variable number of blanks
 #      %! = The entire message should be suppressed
 
-vocabulary: {
-    "ROAD":  {type: motion, value: 2},
-    "HILL":  {type: motion, value: 2},
-    "ENTER": {type: motion, value: 3},
-    "UPSTR": {type: motion, value: 4},
-    "DOWNS": {type: motion, value: 5},
-    "FORES": {type: motion, value: 6},
-    "FORWA": {type: motion, value: 7},
-    "CONTI": {type: motion, value: 7},
-    "ONWAR": {type: motion, value: 7},
-    "BACK":  {type: motion, value: 8},
-    "RETUR": {type: motion, value: 8},
-    "RETRE": {type: motion, value: 8},
-    "VALLE": {type: motion, value: 9},
-    "STAIR": {type: motion, value: 10},
-    "OUT":   {type: motion, value: 11},
-    "OUTSI": {type: motion, value: 11},
-    "EXIT":  {type: motion, value: 11},
-    "LEAVE": {type: motion, value: 11},
-    "BUILD": {type: motion, value: 12},
-    "HOUSE": {type: motion, value: 12},
-    "GULLY": {type: motion, value: 13},
-    "STREA": {type: motion, value: 14},
-    "FORK":  {type: motion, value: 15},
-    "BED":   {type: motion, value: 16},
-    "CRAWL": {type: motion, value: 17},
-    "COBBL": {type: motion, value: 18},
-    "INWAR": {type: motion, value: 19},
-    "INSID": {type: motion, value: 19},
-    "IN":    {type: motion, value: 19},
-    "SURFA": {type: motion, value: 20},
-    "NULL":  {type: motion, value: 21},
-    "NOWHE": {type: motion, value: 21},
-    "DARK":  {type: motion, value: 22},
-    "PASSA": {type: motion, value: 23},
-    "TUNNE": {type: motion, value: 23},
-    "LOW":   {type: motion, value: 24},
-    "CANYO": {type: motion, value: 25},
-    "AWKWA": {type: motion, value: 26},
-    "GIANT": {type: motion, value: 27},
-    "VIEW":  {type: motion, value: 28},
-    "UPWAR": {type: motion, value: 29},
-    "UP":    {type: motion, value: 29},
-    "U":     {type: motion, value: 29},
-    "ABOVE": {type: motion, value: 29},
-    "ASCEN": {type: motion, value: 29},
-    "D":     {type: motion, value: 30},
-    "DOWNW": {type: motion, value: 30},
-    "DOWN":  {type: motion, value: 30},
-    "DESCE": {type: motion, value: 30},
-    "PIT":   {type: motion, value: 31},
-    "OUTDO": {type: motion, value: 32},
-    "CRACK": {type: motion, value: 33},
-    "STEPS": {type: motion, value: 34},
-    "DOME":  {type: motion, value: 35},
-    "LEFT":  {type: motion, value: 36},
-    "RIGHT": {type: motion, value: 37},
-    "HALL":  {type: motion, value: 38},
-    "JUMP":  {type: motion, value: 39},
-    "BARRE": {type: motion, value: 40},
-    "OVER":  {type: motion, value: 41},
-    "ACROS": {type: motion, value: 42},
-    "EAST":  {type: motion, value: 43},
-    "E":     {type: motion, value: 43},
-    "WEST":  {type: motion, value: 44},
-    "W":     {type: motion, value: 44},
-    "NORTH": {type: motion, value: 45},
-    "N":     {type: motion, value: 45},
-    "SOUTH": {type: motion, value: 46},
-    "S":     {type: motion, value: 46},
-    "NE":    {type: motion, value: 47},
-    "SE":    {type: motion, value: 48},
-    "SW":    {type: motion, value: 49},
-    "NW":    {type: motion, value: 50},
-    "DEBRI": {type: motion, value: 51},
-    "HOLE":  {type: motion, value: 52},
-    "WALL":  {type: motion, value: 53},
-    "BROKE": {type: motion, value: 54},
-    "Y2":    {type: motion, value: 55},
-    "CLIMB": {type: motion, value: 56},
-    "LOOK":  {type: motion, value: 57},
-    "EXAMI": {type: motion, value: 57},
-    "TOUCH": {type: motion, value: 57},
-    "DESCR": {type: motion, value: 57},
-    "FLOOR": {type: motion, value: 58},
-    "ROOM":  {type: motion, value: 59},
-    "SLIT":  {type: motion, value: 60},
-    "SLAB":  {type: motion, value: 61},
-    "SLABR": {type: motion, value: 61},
-    "XYZZY": {type: motion, value: 62},
-    "DEPRE": {type: motion, value: 63},
-    "ENTRA": {type: motion, value: 64},
-    "PLUGH": {type: motion, value: 65},
-    "SECRE": {type: motion, value: 66},
-    "CAVE":  {type: motion, value: 67},
-    "CROSS": {type: motion, value: 69},
-    "BEDQU": {type: motion, value: 70},
-    "PLOVE": {type: motion, value: 71},
-    "ORIEN": {type: motion, value: 72},
-    "CAVER": {type: motion, value: 73},
-    "SHELL": {type: motion, value: 74},
-    "RESER": {type: motion, value: 75},
-    "MAIN":  {type: motion, value: 76},
-    "OFFIC": {type: motion, value: 76},
-    "KEYS":  {type: object, value: 1},
-    "KEY":   {type: object, value: 1},
-    "LAMP":  {type: object, value: 2},
-    "LANTE": {type: object, value: 2},
-    "GRATE": {type: object, value: 3},
-    "CAGE":  {type: object, value: 4},
-    "ROD":   {type: object, value: 5},
-    "ROD":   {type: object, value: 6}, # Must be next object after "real" rod
-    "STEPS": {type: object, value: 7},
-    "BIRD":  {type: object, value: 8},
-    "DOOR":  {type: object, value: 9},
-    "PILLO": {type: object, value: 10},
-    "VELVE": {type: object, value: 10},
-    "SNAKE": {type: object, value: 11},
-    "FISSU": {type: object, value: 12},
-    "TABLE": {type: object, value: 13},
-    "CLAM":  {type: object, value: 14},
-    "OYSTE": {type: object, value: 15},
-    "MAGAZ": {type: object, value: 16},
-    "ISSUE": {type: object, value: 16},
-    "SPELU": {type: object, value: 16},
-    '"SPEL': {type: object, value: 16},
-    "DWARF": {type: object, value: 17},
-    "DWARV": {type: object, value: 17},
-    "KNIFE": {type: object, value: 18},
-    "KNIVE": {type: object, value: 18},
-    "FOOD":  {type: object, value: 19},
-    "RATIO": {type: object, value: 19},
-    "BOTTL": {type: object, value: 20},
-    "JAR":   {type: object, value: 20},
-    "WATER": {type: object, value: 21},
-    "H2O":   {type: object, value: 21},
-    "OIL":   {type: object, value: 22},
-    "MIRRO": {type: object, value: 23},
-    "PLANT": {type: object, value: 24},
-    "BEANS": {type: object, value: 24},
-    "PLANT": {type: object, value: 25}, # Must be next object after "real" plant
-    "STALA": {type: object, value: 26},
-    "SHADO": {type: object, value: 27},
-    "FIGUR": {type: object, value: 27},
-    "WINDO": {type: object, value: 27}, # Same as figure
-    "AXE":   {type: object, value: 28},
-    "DRAWI": {type: object, value: 29},
-    "PIRAT": {type: object, value: 30},
-    "GENIE": {type: object, value: 30},
-    "DJINN": {type: object, value: 30},
-    "DRAGO": {type: object, value: 31},
-    "CHASM": {type: object, value: 32},
-    "TROLL": {type: object, value: 33},
-    "TROLL": {type: object, value: 34}, # Must be next object after "real" troll
-    "BEAR":  {type: object, value: 35},
-    "MESSA": {type: object, value: 36},
-    "VOLCA": {type: object, value: 37},
-    "GEYSE": {type: object, value: 37}, # Same as volcano
-    "MACHI": {type: object, value: 38},
-    "VENDI": {type: object, value: 38},
-    "BATTE": {type: object, value: 39},
-    "CARPE": {type: object, value: 40},
-    "MOSS":  {type: object, value: 40},
-    "CURTA": {type: object, value: 40}, # Same as carpet
-    "OGRE":  {type: object, value: 41},
-    "URN":   {type: object, value: 42},
-    "CAVIT": {type: object, value: 43},
-    "BLOOD": {type: object, value: 44},
-    "RESER": {type: object, value: 45}, # Verb overrides
-    "APPEN": {type: object, value: 46},
-    "LEPOR": {type: object, value: 46},
-    "MUD":   {type: object, value: 47},
-    "NOTE":  {type: object, value: 48},
-    "SIGN":  {type: object, value: 49},
-    "GOLD":  {type: object, value: 50},
-    "NUGGE": {type: object, value: 50},
-    "DIAMO": {type: object, value: 51},
-    "SILVE": {type: object, value: 52},
-    "BARS":  {type: object, value: 52},
-    "JEWEL": {type: object, value: 53},
-    "COINS": {type: object, value: 54},
-    "CHEST": {type: object, value: 55},
-    "BOX":   {type: object, value: 55},
-    "TREAS": {type: object, value: 55},
-    "EGGS":  {type: object, value: 56},
-    "EGG":   {type: object, value: 56},
-    "NEST":  {type: object, value: 56},
-    "TRIDE": {type: object, value: 57},
-    "VASE":  {type: object, value: 58},
-    "MING":  {type: object, value: 58},
-    "SHARD": {type: object, value: 58},
-    "POTTE": {type: object, value: 58},
-    "EMERA": {type: object, value: 59},
-    "PLATI": {type: object, value: 60},
-    "PYRAM": {type: object, value: 60},
-    "PEARL": {type: object, value: 61},
-    "RUG":   {type: object, value: 62},
-    "PERSI": {type: object, value: 62},
-    "SPICE": {type: object, value: 63},
-    "CHAIN": {type: object, value: 64},
-    "RUBY":  {type: object, value: 65},
-    "JADE":  {type: object, value: 66},
-    "NECKL": {type: object, value: 66},
-    "AMBER": {type: object, value: 67},
-    "GEMST": {type: object, value: 67},
-    "SAPPH": {type: object, value: 68},
-    "EBONY": {type: object, value: 69},
-    "STATU": {type: object, value: 69},
-    "CARRY": {type: action, value: 1},
-    "TAKE":  {type: action, value: 1},
-    "KEEP":  {type: action, value: 1},
-    "CATCH": {type: action, value: 1},
-    "STEAL": {type: action, value: 1},
-    "CAPTU": {type: action, value: 1},
-    "GET":   {type: action, value: 1},
-    "TOTE":  {type: action, value: 1},
-    "SNARF": {type: action, value: 1},
-    "DROP":  {type: action, value: 2},
-    "RELEA": {type: action, value: 2},
-    "FREE":  {type: action, value: 2},
-    "DISCA": {type: action, value: 2},
-    "DUMP":  {type: action, value: 2},
-    "SAY":   {type: action, value: 3},
-    "CHANT": {type: action, value: 3},
-    "SING":  {type: action, value: 3},
-    "UTTER": {type: action, value: 3},
-    "MUMBL": {type: action, value: 3},
-    "UNLOC": {type: action, value: 4},
-    "OPEN":  {type: action, value: 4},
-    "NOTHI": {type: action, value: 5},
-    "LOCK":  {type: action, value: 6},
-    "CLOSE": {type: action, value: 6},
-    "LIGHT": {type: action, value: 7},
-    "ON":    {type: action, value: 7},
-    "EXTIN": {type: action, value: 8},
-    "OFF":   {type: action, value: 8},
-    "WAVE":  {type: action, value: 9},
-    "SHAKE": {type: action, value: 9},
-    "SWING": {type: action, value: 9},
-    "CALM":  {type: action, value: 10},
-    "PLACA": {type: action, value: 10},
-    "TAME":  {type: action, value: 10},
-    "WALK":  {type: action, value: 11},
-    "RUN":   {type: action, value: 11},
-    "TRAVE": {type: action, value: 11},
-    "GO":    {type: action, value: 11},
-    "PROCE": {type: action, value: 11},
-    "CONTI": {type: action, value: 11},
-    "EXPLO": {type: action, value: 11},
-    "FOLLO": {type: action, value: 11},
-    "TURN":  {type: action, value: 11},
-    "ATTAC": {type: action, value: 12},
-    "KILL":  {type: action, value: 12},
-    "FIGHT": {type: action, value: 12},
-    "HIT":   {type: action, value: 12},
-    "STRIK": {type: action, value: 12},
-    "SLAY":  {type: action, value: 12},
-    "POUR":  {type: action, value: 13},
-    "EAT":   {type: action, value: 14},
-    "DEVOU": {type: action, value: 14},
-    "DRINK": {type: action, value: 15},
-    "RUB":   {type: action, value: 16},
-    "THROW": {type: action, value: 17},
-    "TOSS":  {type: action, value: 17},
-    "QUIT":  {type: action, value: 18},
-    "FIND":  {type: action, value: 19},
-    "WHERE": {type: action, value: 19},
-    "INVEN": {type: action, value: 20},
-    "FEED":  {type: action, value: 21},
-    "FILL":  {type: action, value: 22},
-    "BLAST": {type: action, value: 23},
-    "DETON": {type: action, value: 23},
-    "IGNIT": {type: action, value: 23},
-    "BLOWU": {type: action, value: 23},
-    "SCORE": {type: action, value: 24},
-    "FEE":   {type: action, value: 25},
-    "FIE":   {type: action, value: 25},
-    "FOE":   {type: action, value: 25},
-    "FOO":   {type: action, value: 25},
-    "FUM":   {type: action, value: 25},
-    "BRIEF": {type: action, value: 26},
-    "READ":  {type: action, value: 27},
-    "PERUS": {type: action, value: 27},
-    "BREAK": {type: action, value: 28},
-    "SHATT": {type: action, value: 28},
-    "SMASH": {type: action, value: 28},
-    "WAKE":  {type: action, value: 29},
-    "DISTU": {type: action, value: 29},
-    "SUSPE": {type: action, value: 30},
-    "PAUSE": {type: action, value: 30},
-    "SAVE":  {type: action, value: 30},
-    "RESUM": {type: action, value: 31},
-    "RESTA": {type: action, value: 31},
-    "FLY":   {type: action, value: 32},
-    "LISTE": {type: action, value: 33},
-    "Z'ZZZ": {type: action, value: 34}, # Gets replaced
-    "FEE":   {type: special, value: 1},
-    "FIE":   {type: special, value: 2},
-    "FOE":   {type: special, value: 3},
-    "FOO":   {type: special, value: 4},
-    "FUM":   {type: special, value: 5},
-    "THANK": {type: special, value: 13},
-    "SESAM": {type: special, value: 50},
-    "OPENS": {type: special, value: 50},
-    "ABRA":  {type: special, value: 50},
-    "ABRAC": {type: special, value: 50},
-    "SHAZA": {type: special, value: 50},
-    "HOCUS": {type: special, value: 50},
-    "POCUS": {type: special, value: 50},
-    "HELP":  {type: special, value: 51},
-    "?":     {type: special, value: 51},
-    "NO":    {type: special, value: 54},
-    "TREE":  {type: special, value: 64},
-    "TREES": {type: special, value: 64},
-    "DIG":   {type: special, value: 66},
-    "EXCAV": {type: special, value: 66},
-    "LOST":  {type: special, value: 68},
-    "MIST":  {type: special, value: 69},
-    "FUCK":  {type: special, value: 79},
-    "STOP":  {type: special, value: 139},
-    "INFO":  {type: special, value: 142},
-    "INFOR": {type: special, value: 142},
-    "SWIM":  {type: special, value: 147},
-    "WIZAR": {type: special, value: 246},
-    "YES":   {type: special, value: 271},
-    "NEWS":  {type: special, value: 275},
-}
+# There are duplicate keys in this voavulary, that's why it can't be a normal map
+vocabulary: [
+    {word: "ROAD",  type: motion, value: 2},
+    {word: "HILL",  type: motion, value: 2},
+    {word: "ENTER", type: motion, value: 3},
+    {word: "UPSTR", type: motion, value: 4},
+    {word: "DOWNS", type: motion, value: 5},
+    {word: "FORES", type: motion, value: 6},
+    {word: "FORWA", type: motion, value: 7},
+    {word: "CONTI", type: motion, value: 7},
+    {word: "ONWAR", type: motion, value: 7},
+    {word: "BACK",  type: motion, value: 8},
+    {word: "RETUR", type: motion, value: 8},
+    {word: "RETRE", type: motion, value: 8},
+    {word: "VALLE", type: motion, value: 9},
+    {word: "STAIR", type: motion, value: 10},
+    {word: "OUT",   type: motion, value: 11},
+    {word: "OUTSI", type: motion, value: 11},
+    {word: "EXIT",  type: motion, value: 11},
+    {word: "LEAVE", type: motion, value: 11},
+    {word: "BUILD", type: motion, value: 12},
+    {word: "HOUSE", type: motion, value: 12},
+    {word: "GULLY", type: motion, value: 13},
+    {word: "STREA", type: motion, value: 14},
+    {word: "FORK",  type: motion, value: 15},
+    {word: "BED",   type: motion, value: 16},
+    {word: "CRAWL", type: motion, value: 17},
+    {word: "COBBL", type: motion, value: 18},
+    {word: "INWAR", type: motion, value: 19},
+    {word: "INSID", type: motion, value: 19},
+    {word: "IN",    type: motion, value: 19},
+    {word: "SURFA", type: motion, value: 20},
+    {word: "NULL",  type: motion, value: 21},
+    {word: "NOWHE", type: motion, value: 21},
+    {word: "DARK",  type: motion, value: 22},
+    {word: "PASSA", type: motion, value: 23},
+    {word: "TUNNE", type: motion, value: 23},
+    {word: "LOW",   type: motion, value: 24},
+    {word: "CANYO", type: motion, value: 25},
+    {word: "AWKWA", type: motion, value: 26},
+    {word: "GIANT", type: motion, value: 27},
+    {word: "VIEW",  type: motion, value: 28},
+    {word: "UPWAR", type: motion, value: 29},
+    {word: "UP",    type: motion, value: 29},
+    {word: "U",     type: motion, value: 29},
+    {word: "ABOVE", type: motion, value: 29},
+    {word: "ASCEN", type: motion, value: 29},
+    {word: "D",     type: motion, value: 30},
+    {word: "DOWNW", type: motion, value: 30},
+    {word: "DOWN",  type: motion, value: 30},
+    {word: "DESCE", type: motion, value: 30},
+    {word: "PIT",   type: motion, value: 31},
+    {word: "OUTDO", type: motion, value: 32},
+    {word: "CRACK", type: motion, value: 33},
+    {word: "STEPS", type: motion, value: 34},
+    {word: "DOME",  type: motion, value: 35},
+    {word: "LEFT",  type: motion, value: 36},
+    {word: "RIGHT", type: motion, value: 37},
+    {word: "HALL",  type: motion, value: 38},
+    {word: "JUMP",  type: motion, value: 39},
+    {word: "BARRE", type: motion, value: 40},
+    {word: "OVER",  type: motion, value: 41},
+    {word: "ACROS", type: motion, value: 42},
+    {word: "EAST",  type: motion, value: 43},
+    {word: "E",     type: motion, value: 43},
+    {word: "WEST",  type: motion, value: 44},
+    {word: "W",     type: motion, value: 44},
+    {word: "NORTH", type: motion, value: 45},
+    {word: "N",     type: motion, value: 45},
+    {word: "SOUTH", type: motion, value: 46},
+    {word: "S",     type: motion, value: 46},
+    {word: "NE",    type: motion, value: 47},
+    {word: "SE",    type: motion, value: 48},
+    {word: "SW",    type: motion, value: 49},
+    {word: "NW",    type: motion, value: 50},
+    {word: "DEBRI", type: motion, value: 51},
+    {word: "HOLE",  type: motion, value: 52},
+    {word: "WALL",  type: motion, value: 53},
+    {word: "BROKE", type: motion, value: 54},
+    {word: "Y2",    type: motion, value: 55},
+    {word: "CLIMB", type: motion, value: 56},
+    {word: "LOOK",  type: motion, value: 57},
+    {word: "EXAMI", type: motion, value: 57},
+    {word: "TOUCH", type: motion, value: 57},
+    {word: "DESCR", type: motion, value: 57},
+    {word: "FLOOR", type: motion, value: 58},
+    {word: "ROOM",  type: motion, value: 59},
+    {word: "SLIT",  type: motion, value: 60},
+    {word: "SLAB",  type: motion, value: 61},
+    {word: "SLABR", type: motion, value: 61},
+    {word: "XYZZY", type: motion, value: 62},
+    {word: "DEPRE", type: motion, value: 63},
+    {word: "ENTRA", type: motion, value: 64},
+    {word: "PLUGH", type: motion, value: 65},
+    {word: "SECRE", type: motion, value: 66},
+    {word: "CAVE",  type: motion, value: 67},
+    {word: "CROSS", type: motion, value: 69},
+    {word: "BEDQU", type: motion, value: 70},
+    {word: "PLOVE", type: motion, value: 71},
+    {word: "ORIEN", type: motion, value: 72},
+    {word: "CAVER", type: motion, value: 73},
+    {word: "SHELL", type: motion, value: 74},
+    {word: "RESER", type: motion, value: 75},
+    {word: "MAIN",  type: motion, value: 76},
+    {word: "OFFIC", type: motion, value: 76},
+    {word: "KEYS",  type: object, value: 1},
+    {word: "KEY",   type: object, value: 1},
+    {word: "LAMP",  type: object, value: 2},
+    {word: "LANTE", type: object, value: 2},
+    {word: "GRATE", type: object, value: 3},
+    {word: "CAGE",  type: object, value: 4},
+    {word: "ROD",   type: object, value: 5},
+    {word: "ROD",   type: object, value: 6}, # Must be next object after "real" rod
+    {word: "STEPS", type: object, value: 7},
+    {word: "BIRD",  type: object, value: 8},
+    {word: "DOOR",  type: object, value: 9},
+    {word: "PILLO", type: object, value: 10},
+    {word: "VELVE", type: object, value: 10},
+    {word: "SNAKE", type: object, value: 11},
+    {word: "FISSU", type: object, value: 12},
+    {word: "TABLE", type: object, value: 13},
+    {word: "CLAM",  type: object, value: 14},
+    {word: "OYSTE", type: object, value: 15},
+    {word: "MAGAZ", type: object, value: 16},
+    {word: "ISSUE", type: object, value: 16},
+    {word: "SPELU", type: object, value: 16},
+    {word: '"SPEL', type: object, value: 16},
+    {word: "DWARF", type: object, value: 17},
+    {word: "DWARV", type: object, value: 17},
+    {word: "KNIFE", type: object, value: 18},
+    {word: "KNIVE", type: object, value: 18},
+    {word: "FOOD",  type: object, value: 19},
+    {word: "RATIO", type: object, value: 19},
+    {word: "BOTTL", type: object, value: 20},
+    {word: "JAR",   type: object, value: 20},
+    {word: "WATER", type: object, value: 21},
+    {word: "H2O",   type: object, value: 21},
+    {word: "OIL",   type: object, value: 22},
+    {word: "MIRRO", type: object, value: 23},
+    {word: "PLANT", type: object, value: 24},
+    {word: "BEANS", type: object, value: 24},
+    {word: "PLANT", type: object, value: 25}, # Must be next object after "real" plant
+    {word: "STALA", type: object, value: 26},
+    {word: "SHADO", type: object, value: 27},
+    {word: "FIGUR", type: object, value: 27},
+    {word: "WINDO", type: object, value: 27}, # Same as figure
+    {word: "AXE",   type: object, value: 28},
+    {word: "DRAWI", type: object, value: 29},
+    {word: "PIRAT", type: object, value: 30},
+    {word: "GENIE", type: object, value: 30},
+    {word: "DJINN", type: object, value: 30},
+    {word: "DRAGO", type: object, value: 31},
+    {word: "CHASM", type: object, value: 32},
+    {word: "TROLL", type: object, value: 33},
+    {word: "TROLL", type: object, value: 34}, # Must be next object after "real" troll
+    {word: "BEAR",  type: object, value: 35},
+    {word: "MESSA", type: object, value: 36},
+    {word: "VOLCA", type: object, value: 37},
+    {word: "GEYSE", type: object, value: 37}, # Same as volcano
+    {word: "MACHI", type: object, value: 38},
+    {word: "VENDI", type: object, value: 38},
+    {word: "BATTE", type: object, value: 39},
+    {word: "CARPE", type: object, value: 40},
+    {word: "MOSS",  type: object, value: 40},
+    {word: "CURTA", type: object, value: 40}, # Same as carpet
+    {word: "OGRE",  type: object, value: 41},
+    {word: "URN",   type: object, value: 42},
+    {word: "CAVIT", type: object, value: 43},
+    {word: "BLOOD", type: object, value: 44},
+    {word: "RESER", type: object, value: 45}, # Verb overrides
+    {word: "APPEN", type: object, value: 46},
+    {word: "LEPOR", type: object, value: 46},
+    {word: "MUD",   type: object, value: 47},
+    {word: "NOTE",  type: object, value: 48},
+    {word: "SIGN",  type: object, value: 49},
+    {word: "GOLD",  type: object, value: 50},
+    {word: "NUGGE", type: object, value: 50},
+    {word: "DIAMO", type: object, value: 51},
+    {word: "SILVE", type: object, value: 52},
+    {word: "BARS",  type: object, value: 52},
+    {word: "JEWEL", type: object, value: 53},
+    {word: "COINS", type: object, value: 54},
+    {word: "CHEST", type: object, value: 55},
+    {word: "BOX",   type: object, value: 55},
+    {word: "TREAS", type: object, value: 55},
+    {word: "EGGS",  type: object, value: 56},
+    {word: "EGG",   type: object, value: 56},
+    {word: "NEST",  type: object, value: 56},
+    {word: "TRIDE", type: object, value: 57},
+    {word: "VASE",  type: object, value: 58},
+    {word: "MING",  type: object, value: 58},
+    {word: "SHARD", type: object, value: 58},
+    {word: "POTTE", type: object, value: 58},
+    {word: "EMERA", type: object, value: 59},
+    {word: "PLATI", type: object, value: 60},
+    {word: "PYRAM", type: object, value: 60},
+    {word: "PEARL", type: object, value: 61},
+    {word: "RUG",   type: object, value: 62},
+    {word: "PERSI", type: object, value: 62},
+    {word: "SPICE", type: object, value: 63},
+    {word: "CHAIN", type: object, value: 64},
+    {word: "RUBY",  type: object, value: 65},
+    {word: "JADE",  type: object, value: 66},
+    {word: "NECKL", type: object, value: 66},
+    {word: "AMBER", type: object, value: 67},
+    {word: "GEMST", type: object, value: 67},
+    {word: "SAPPH", type: object, value: 68},
+    {word: "EBONY", type: object, value: 69},
+    {word: "STATU", type: object, value: 69},
+    {word: "CARRY", type: action, value: 1},
+    {word: "TAKE",  type: action, value: 1},
+    {word: "KEEP",  type: action, value: 1},
+    {word: "CATCH", type: action, value: 1},
+    {word: "STEAL", type: action, value: 1},
+    {word: "CAPTU", type: action, value: 1},
+    {word: "GET",   type: action, value: 1},
+    {word: "TOTE",  type: action, value: 1},
+    {word: "SNARF", type: action, value: 1},
+    {word: "DROP",  type: action, value: 2},
+    {word: "RELEA", type: action, value: 2},
+    {word: "FREE",  type: action, value: 2},
+    {word: "DISCA", type: action, value: 2},
+    {word: "DUMP",  type: action, value: 2},
+    {word: "SAY",   type: action, value: 3},
+    {word: "CHANT", type: action, value: 3},
+    {word: "SING",  type: action, value: 3},
+    {word: "UTTER", type: action, value: 3},
+    {word: "MUMBL", type: action, value: 3},
+    {word: "UNLOC", type: action, value: 4},
+    {word: "OPEN",  type: action, value: 4},
+    {word: "NOTHI", type: action, value: 5},
+    {word: "LOCK",  type: action, value: 6},
+    {word: "CLOSE", type: action, value: 6},
+    {word: "LIGHT", type: action, value: 7},
+    {word: "ON",    type: action, value: 7},
+    {word: "EXTIN", type: action, value: 8},
+    {word: "OFF",   type: action, value: 8},
+    {word: "WAVE",  type: action, value: 9},
+    {word: "SHAKE", type: action, value: 9},
+    {word: "SWING", type: action, value: 9},
+    {word: "CALM",  type: action, value: 10},
+    {word: "PLACA", type: action, value: 10},
+    {word: "TAME",  type: action, value: 10},
+    {word: "WALK",  type: action, value: 11},
+    {word: "RUN",   type: action, value: 11},
+    {word: "TRAVE", type: action, value: 11},
+    {word: "GO",    type: action, value: 11},
+    {word: "PROCE", type: action, value: 11},
+    {word: "CONTI", type: action, value: 11},
+    {word: "EXPLO", type: action, value: 11},
+    {word: "FOLLO", type: action, value: 11},
+    {word: "TURN",  type: action, value: 11},
+    {word: "ATTAC", type: action, value: 12},
+    {word: "KILL",  type: action, value: 12},
+    {word: "FIGHT", type: action, value: 12},
+    {word: "HIT",   type: action, value: 12},
+    {word: "STRIK", type: action, value: 12},
+    {word: "SLAY",  type: action, value: 12},
+    {word: "POUR",  type: action, value: 13},
+    {word: "EAT",   type: action, value: 14},
+    {word: "DEVOU", type: action, value: 14},
+    {word: "DRINK", type: action, value: 15},
+    {word: "RUB",   type: action, value: 16},
+    {word: "THROW", type: action, value: 17},
+    {word: "TOSS",  type: action, value: 17},
+    {word: "QUIT",  type: action, value: 18},
+    {word: "FIND",  type: action, value: 19},
+    {word: "WHERE", type: action, value: 19},
+    {word: "INVEN", type: action, value: 20},
+    {word: "FEED",  type: action, value: 21},
+    {word: "FILL",  type: action, value: 22},
+    {word: "BLAST", type: action, value: 23},
+    {word: "DETON", type: action, value: 23},
+    {word: "IGNIT", type: action, value: 23},
+    {word: "BLOWU", type: action, value: 23},
+    {word: "SCORE", type: action, value: 24},
+    {word: "FEE",   type: action, value: 25},
+    {word: "FIE",   type: action, value: 25},
+    {word: "FOE",   type: action, value: 25},
+    {word: "FOO",   type: action, value: 25},
+    {word: "FUM",   type: action, value: 25},
+    {word: "BRIEF", type: action, value: 26},
+    {word: "READ",  type: action, value: 27},
+    {word: "PERUS", type: action, value: 27},
+    {word: "BREAK", type: action, value: 28},
+    {word: "SHATT", type: action, value: 28},
+    {word: "SMASH", type: action, value: 28},
+    {word: "WAKE",  type: action, value: 29},
+    {word: "DISTU", type: action, value: 29},
+    {word: "SUSPE", type: action, value: 30},
+    {word: "PAUSE", type: action, value: 30},
+    {word: "SAVE",  type: action, value: 30},
+    {word: "RESUM", type: action, value: 31},
+    {word: "RESTA", type: action, value: 31},
+    {word: "FLY",   type: action, value: 32},
+    {word: "LISTE", type: action, value: 33},
+    {word: "Z'ZZZ", type: action, value: 34}, # Gets replaced
+    {word: "FEE",   type: special, value: 1},
+    {word: "FIE",   type: special, value: 2},
+    {word: "FOE",   type: special, value: 3},
+    {word: "FOO",   type: special, value: 4},
+    {word: "FUM",   type: special, value: 5},
+    {word: "THANK", type: special, value: 13},
+    {word: "SESAM", type: special, value: 50},
+    {word: "OPENS", type: special, value: 50},
+    {word: "ABRA",  type: special, value: 50},
+    {word: "ABRAC", type: special, value: 50},
+    {word: "SHAZA", type: special, value: 50},
+    {word: "HOCUS", type: special, value: 50},
+    {word: "POCUS", type: special, value: 50},
+    {word: "HELP",  type: special, value: 51},
+    {word: "?",     type: special, value: 51},
+    {word: "NO",    type: special, value: 54},
+    {word: "TREE",  type: special, value: 64},
+    {word: "TREES", type: special, value: 64},
+    {word: "DIG",   type: special, value: 66},
+    {word: "EXCAV", type: special, value: 66},
+    {word: "LOST",  type: special, value: 68},
+    {word: "MIST",  type: special, value: 69},
+    {word: "FUCK",  type: special, value: 79},
+    {word: "STOP",  type: special, value: 139},
+    {word: "INFO",  type: special, value: 142},
+    {word: "INFOR", type: special, value: 142},
+    {word: "SWIM",  type: special, value: 147},
+    {word: "WIZAR", type: special, value: 246},
+    {word: "YES",   type: special, value: 271},
+    {word: "NEWS",  type: special, value: 275},
+]
 
 # FIXME: Hint texts shouldn't be in arbitrary_messages, but inlined here
 hints:
index 6e7a8f0dd7a0fc51393e019be4734d70880a5acc..c9731eb7e2a812ff448c1e89f3a59e416a694dbd 100755 (executable)
--- a/travel.py
+++ b/travel.py
 #              If M=100        unconditional, but forbidden to dwarves.
 #              If 100<M<=200   he must be carrying object M-100.
 #              If 200<M<=300   must be carrying or in same room as M-200.
-#              If 300<M<=400   game.prop(M % 100) must#not* be 0.
-#              If 400<M<=500   game.prop(M % 100) must#not* be 1.
-#              If 500<M<=600   game.prop(M % 100) must#not* be 2, etc.
-#      If the condition (if any) is not met, then the next#different*
-#      "destination" value is used (unless it fails to meet#its* conditions,
+#              If 300<M<=400   game.prop(M % 100) must *not* be 0.
+#              If 400<M<=500   game.prop(M % 100) must *not* be 1.
+#              If 500<M<=600   game.prop(M % 100) must *not* be 2, etc.
+#      If the condition (if any) is not met, then the next different
+#      "destination" value is used (unless it fails to meet *its* conditions,
 #      in which case the next is found, etc.).  Typically, the next dest will
 #      be for one of the same verbs, so that its only use is as the alternate
 #      destination for those verbs.  For instance:
@@ -671,13 +671,28 @@ section3 = (
     (184, 33, 1),
     )
 
+def destdecode(dest):
+    "Decode a destinatio nnumber"
+    if dest <= 300:
+        return '["move", %s]' % locnames[dest]
+    elif dest <= 500:
+        return '["goto", %s]' % (dest - 300)
+    else:
+        return '["speak", %s]' % (msgnames[dest - 500])
+
 def genline(loc):
     attrs = []
     sys.stdout.write("    travel: {\n")
     for t in section3:
         t = list(t)
-        if t.pop(0) == loc:
-            sys.stdout.write("       %s,\n" % t)
+        src = t.pop(0)
+        if src == loc:
+            dest = t.pop(0)
+            cond = dest // 1000
+            dest = dest % 1000
+            print("cond %s, dest %s, words: %s" % (cond, dest, t))
+            t = [verbs[e] for e in t]
+            sys.stdout.write("      %s %s %s,\n" % (destdecode(dest), cond, t))
     sys.stdout.write("    }\n")
         
     
@@ -687,6 +702,12 @@ if __name__ == "__main__":
         db = yaml.load(fp)
         fp.seek(0)
         locnames = [el[0] for el in db["locations"]]
+        msgnames = [el[0] for el in db["arbitrary_messages"]]
+        verbs = {}
+        for entry in db["vocabulary"]:
+            if entry["type"] == "motion" and entry["value"] not in verbs:
+                verbs[entry["value"]] = entry["word"]
+        print(verbs)
         ln = -1
         while True:
             line = fp.readline()