Define a grammar for special node definition files

This commit is contained in:
2014-12-02 15:59:38 -05:00
parent a95f1c5b93
commit 01f0a62160
3 changed files with 57 additions and 6 deletions

View File

@@ -329,6 +329,8 @@
914CA4441905789C00B6ADD1 /* watch.gif in Copy Mac Cursors */ = {isa = PBXBuildFile; fileRef = 914CA4431905788F00B6ADD1 /* watch.gif */; };
914CA45819074E0100B6ADD1 /* scen.menus.mac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 914CA45719074D0A00B6ADD1 /* scen.menus.mac.mm */; };
915325171A2E1DF0000A9A1C /* oldstructs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 915325161A2E1DA8000A9A1C /* oldstructs.cpp */; };
915325391A2E5F36000A9A1C /* specials_parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 915325181A2E37EE000A9A1C /* specials_parse.cpp */; };
9153253B1A2E5F37000A9A1C /* specials_parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 915325181A2E37EE000A9A1C /* specials_parse.cpp */; };
91870F81190C8C1C0081C150 /* winutil.mac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 919145FF18E63B70005CF3A4 /* winutil.mac.mm */; };
91870F83190C8C1F0081C150 /* tarball.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91BFA3D81902AD78001686E4 /* tarball.cpp */; };
91870F84190C90980081C150 /* scen.menu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 914CA49F190C4E9200B6ADD1 /* scen.menu.xib */; };
@@ -1247,6 +1249,7 @@
914CA4641909B00100B6ADD1 /* scen.menus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scen.menus.h; sourceTree = "<group>"; };
914CA49F190C4E9200B6ADD1 /* scen.menu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = scen.menu.xib; sourceTree = "<group>"; };
915325161A2E1DA8000A9A1C /* oldstructs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = oldstructs.cpp; path = ../oldstructs.cpp; sourceTree = "<group>"; };
915325181A2E37EE000A9A1C /* specials_parse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = specials_parse.cpp; sourceTree = "<group>"; };
917B573F100B956C0096C978 /* undo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = undo.h; sourceTree = "<group>"; };
918D59A718EA513900735B66 /* dialog.keys.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dialog.keys.h; sourceTree = "<group>"; };
919145FB18E3A32F005CF3A4 /* boe.appleevents.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = boe.appleevents.mm; sourceTree = "<group>"; };
@@ -1690,6 +1693,7 @@
91EC481018FBABB100BB1E86 /* prefs.mac.mm */,
91F6F8F518F8DE6300E3EA15 /* qdpict.cpp */,
91B3F10F0F9779D000BF5B67 /* soundtool.cpp */,
915325181A2E37EE000A9A1C /* specials_parse.cpp */,
91BFA3D81902AD78001686E4 /* tarball.cpp */,
912283C80FD0E16C00B21642 /* undo.cpp */,
919145FF18E63B70005CF3A4 /* winutil.mac.mm */,
@@ -2400,6 +2404,7 @@
91BFA3DA1902B13D001686E4 /* tarball.cpp in Sources */,
91BFA3E919033E01001686E4 /* gzstream.cpp in Sources */,
915325171A2E1DF0000A9A1C /* oldstructs.cpp in Sources */,
9153253B1A2E5F37000A9A1C /* specials_parse.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -2509,6 +2514,7 @@
914CA45819074E0100B6ADD1 /* scen.menus.mac.mm in Sources */,
91870F81190C8C1C0081C150 /* winutil.mac.mm in Sources */,
91870F83190C8C1F0081C150 /* tarball.cpp in Sources */,
915325391A2E5F36000A9A1C /* specials_parse.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@@ -0,0 +1,51 @@
//
// specials_parse.cpp
// BoE
//
// Created by Celtic Minstrel on 14-12-02.
//
//
#include <boost/spirit/include/qi.hpp>
using namespace boost::spirit::qi;
std::string temp_symbol;
symbols<char, int> defn;
void prep_add_symbol(char c) {temp_symbol += c;}
void add_symbol(int i) {defn.add(temp_symbol, i); temp_symbol.clear();}
auto ws = char_(" \t");
auto comment = char_('#') >> *(print | char_('\t'));
auto symbol = char_("A-Za-z$_-")[prep_add_symbol] >> *char_("A-Za-z0-9$_-")[prep_add_symbol];
auto val = int_ | defn;
auto datcode = lit("sdf") | lit("pic") | lit("msg") | lit("ex1") | lit("ex2") | lit("goto");
auto opcode = lit("null") | lit("set-sdf") | lit("inc-sdf") | lit("disp-msg") | lit("secret-pass") | lit("disp-sm-msg") | lit("flip-sdf") |
lit("filter-context") | lit("block-move") | lit("change-time") | lit("start-timer") | lit("play-sound") | lit("change_horse") |
lit("change_boat") | lit("town-visible") | lit("set-event") | lit("force-give") | lit("buy-item-class") | lit("call-global") |
lit("set-sdf-row") | lit("copy-sdf") | lit("rest") | lit("set-wander-fight") | lit("end-scen") | lit("once-give-item") |
lit("once-give-spec-item") | lit("once") | lit("once-set-sdf") | lit("once-disp-msg") | lit("once-dlog") | lit("once-dlog-ter") |
lit("once-dlog-monst") | lit("once-give-dlog") | lit("once-give-ter") | lit("once-give-monst") | lit("once-encounter") |
lit("once-trap") | lit("select-pc") | lit("damage") | lit("hp") | lit("sp") | lit("xp") | lit("skill-pts") | lit("death") |
lit("status") | lit("statistic") | lit("spell") | lit("gold") | lit("food") | lit("alchemy") | lit("stealth") | lit("firewalk") |
lit("flight") | lit("if-sdf") | lit("if-town") | lit("if-spec-item") | lit("if-sdf-compare") | lit("if-ter") | lit("if-gold") |
lit("if-food") | lit("if-item-class-on-space") | lit("if-item-class") | lit("if-item-class-equip") | lit("if-day") | lit("if-field") |
lit("if-object") | lit("if-event") | lit("if-cave-lore") | lit("if-woodsman") | lit("if-mage-lore") | lit("if-response") | lit("if-sdf-eq") |
lit("town-attitude") | lit("change-ter") | lit("swap-ter") | lit("trans-ter") | lit("move-party") | lit("hit-space") |
lit("explode-space") | lit("lock-space") | lit("unlock-space") | lit("sfx-burst") | lit("make-wandering") | lit("place-monst") |
lit("destroy-monst") | lit("nuke-monsts") | lit("lever-generic") | lit("portal-generic") | lit("stair-generic") | lit("button-generic") |
lit("lever") | lit("portal") | lit("stair") | lit("set-sector") | lit("place-item") | lit("split-party") | lit("unite-party") |
lit("start-timer") | lit("rect-place-field") | lit("rect-cleanse") | lit("rect-place-sfx") | lit("rect-place-object") |
lit("rect-move-items") | lit("rect-destroy-items") | lit("rect-change-ter") | lit("rect-swap-ter") | lit("rect-trans-ter") |
lit("rect-lock") | lit("rect-unlock") | lit("make-out-monst") | lit("start-shop");
auto command = datcode >> ws >> *ws >> val >> (eps | *ws >> char_(',') >> *ws >> val >> (eps | *ws >> char_(',') >> *ws >> val));
auto def_line = *ws >> lit("def") >> ws >> *ws >> symbol >> *ws >> char_('=') >> *ws >> uint_[add_symbol] >> (comment | eps) >> eol;
auto cmd_line = *ws >> (command | eps) >> *ws >> (comment | eps) >> eol;
auto op_line = *ws >> char_('@') >> opcode >> (eps | *ws >> char_('=') >> *ws >> val) >> (comment | eps) >> eol;
auto command_block = op_line >> *(cmd_line | def_line);
auto nodes_file = *def_line >> *command_block;

View File

@@ -1,6 +0,0 @@
# Possible special node format
# SpecialID, SpecialType, SDF, Message, Extra1, Extra2, Jump
# Potentially, each SpecialType could have its own format.
0 TOWN_PLACE_MONST sdf(-1,-1), mess(0,1), extra(26,16), extra(1,1), jump(-1)