diff options
author | Ľubomír Remák | 2018-03-22 16:08:14 +0100 |
---|---|---|
committer | Eugene Sandulenko | 2018-08-25 23:12:01 +0200 |
commit | 63c0dac9613caef3778a4cb9765bb8b628e5a1c2 (patch) | |
tree | de47fa3b7282dc163d06b51a47cbd1d3f0a868be /engines | |
parent | 3928c52c0ee2a930431a807d0b4262440ab75725 (diff) | |
download | scummvm-rg350-63c0dac9613caef3778a4cb9765bb8b628e5a1c2.tar.gz scummvm-rg350-63c0dac9613caef3778a4cb9765bb8b628e5a1c2.tar.bz2 scummvm-rg350-63c0dac9613caef3778a4cb9765bb8b628e5a1c2.zip |
MUTATIONOFJB: Add support for macro definitions.
Diffstat (limited to 'engines')
-rw-r--r-- | engines/mutationofjb/commands/command.h | 2 | ||||
-rw-r--r-- | engines/mutationofjb/commands/endblockcommand.cpp | 30 | ||||
-rw-r--r-- | engines/mutationofjb/commands/endblockcommand.h | 1 | ||||
-rw-r--r-- | engines/mutationofjb/debug.cpp | 51 | ||||
-rw-r--r-- | engines/mutationofjb/debug.h | 2 | ||||
-rw-r--r-- | engines/mutationofjb/script.cpp | 7 | ||||
-rw-r--r-- | engines/mutationofjb/script.h | 4 |
7 files changed, 94 insertions, 3 deletions
diff --git a/engines/mutationofjb/commands/command.h b/engines/mutationofjb/commands/command.h index c6fce1e892..1303242fb5 100644 --- a/engines/mutationofjb/commands/command.h +++ b/engines/mutationofjb/commands/command.h @@ -24,7 +24,7 @@ #define MUTATIONOFJB_COMMAND_H namespace Common { - class String; +class String; } namespace MutationOfJB { diff --git a/engines/mutationofjb/commands/endblockcommand.cpp b/engines/mutationofjb/commands/endblockcommand.cpp index c8adaaa998..4a6e608ae7 100644 --- a/engines/mutationofjb/commands/endblockcommand.cpp +++ b/engines/mutationofjb/commands/endblockcommand.cpp @@ -26,6 +26,26 @@ #include "common/str.h" #include "common/debug.h" +/* + ("#L " | "-L ") <object> + ("#W " | "-W ") <object> + ("#T " | "-T ") <object> + ("#U " | "-U ") <object1> [<object2>] + ("#ELSE" | "-ELSE") [<tag>] + "#MACRO " <name> + + If a line starts with '#', '=', '-', it is treated as the end of a section. + However, at the same time it can also start a new section depending on what follows. + + #L (look), #W (walk), #T (talk), #U (use) sections are executed + when the user starts corresponding action on the object or in case of "use" up to two objects. + The difference between '#' and '-' version is whether the player walks towards the object ('#') or not ('-'). + + #ELSE is used by conditional commands (see comments for IfCommand and others). + + #MACRO starts a new macro. Global script can call macros from local script and vice versa. +*/ + namespace MutationOfJB { bool EndBlockCommandParser::parse(const Common::String &line, ScriptParseContext &parseCtx, Command *&command) { @@ -85,6 +105,8 @@ bool EndBlockCommandParser::parse(const Common::String &line, ScriptParseContext if (line.size() >= 6) { _ifTag = line[5]; } + } else if (line.size() >= 8 && line.hasPrefix("#MACRO")) { + _foundMacro = line.c_str() + 7; } if (firstChar == '#') { @@ -116,6 +138,13 @@ void EndBlockCommandParser::transition(ScriptParseContext &parseCtx, Command *, _ifTag = 0; } + if (!_foundMacro.empty() && newCommand) { + if (!parseCtx._macros.contains(_foundMacro)) { + parseCtx._macros[_foundMacro] = newCommand; + } + _foundMacro = ""; + } + if (newCommandParser != this) { if (!_pendingActionInfos.empty()) { for (Common::Array<uint>::iterator it = _pendingActionInfos.begin(); it != _pendingActionInfos.end(); ++it) { @@ -135,6 +164,7 @@ void EndBlockCommandParser::finish(ScriptParseContext &) { debug("Problem: Pending action infos from end block parser is not empty!"); } _pendingActionInfos.clear(); + _foundMacro = ""; } Command::ExecuteResult EndBlockCommand::execute(GameData &) { diff --git a/engines/mutationofjb/commands/endblockcommand.h b/engines/mutationofjb/commands/endblockcommand.h index 140fb21917..1b22d75931 100644 --- a/engines/mutationofjb/commands/endblockcommand.h +++ b/engines/mutationofjb/commands/endblockcommand.h @@ -44,6 +44,7 @@ private: char _ifTag; Common::Array<uint> _pendingActionInfos; + Common::String _foundMacro; }; class EndBlockCommand : public Command { diff --git a/engines/mutationofjb/debug.cpp b/engines/mutationofjb/debug.cpp index e6393242e2..99c4c7b70f 100644 --- a/engines/mutationofjb/debug.cpp +++ b/engines/mutationofjb/debug.cpp @@ -204,4 +204,55 @@ bool Console::cmd_showsection(int argc, const char **argv) { return true; } +bool Console::cmd_listmacros(int argc, const char **argv) { + if (argc == 2) { + Script *script = nullptr; + if (strcmp(argv[1], "G") == 0) { + script = _vm->getGame().getGlobalScript(); + } else if (strcmp(argv[1], "L") == 0) { + script = _vm->getGame().getLocalScript(); + } + if (!script) { + debugPrintf(_("Choose 'G' (global) or 'L' (local) script.\n")); + } else { + const Macros ¯os = script->getMacros(); + for (Macros::const_iterator it = macros.begin(); it != macros.end(); ++it) { + debugPrintf("%s\n", it->_key.c_str()); + } + } + } else { + debugPrintf(_("listmacros <G|L>\n")); + } + + return true; +} + +bool Console::cmd_showmacro(int argc, const char **argv) { + if (argc == 3) { + Script *script = nullptr; + if (strcmp(argv[1], "G") == 0) { + script = _vm->getGame().getGlobalScript(); + } else if (strcmp(argv[1], "L") == 0) { + script = _vm->getGame().getLocalScript(); + } + if (!script) { + debugPrintf(_("Choose 'G' (global) or 'L' (local) script.\n")); + } else { + const Macros ¯os = script->getMacros(); + Macros::const_iterator itMacro = macros.find(argv[2]); + if (itMacro != macros.end()) { + if (itMacro->_value) { + showCommands(itMacro->_value); + } + } else { + debugPrintf("Macro not found.\n"); + } + } + } else { + debugPrintf(_("showmacro <G|L> <macroname>\n")); + } + + return true; +} + } diff --git a/engines/mutationofjb/debug.h b/engines/mutationofjb/debug.h index ee187cb605..1dcc0fb264 100644 --- a/engines/mutationofjb/debug.h +++ b/engines/mutationofjb/debug.h @@ -37,6 +37,8 @@ public: private: bool cmd_listsections(int argc, const char **argv); bool cmd_showsection(int argc, const char **argv); + bool cmd_listmacros(int argc, const char **argv); + bool cmd_showmacro(int argc, const char **argv); void showIndent(int indentLevel); void showCommands(Command *command, int indentLevel = 0); diff --git a/engines/mutationofjb/script.cpp b/engines/mutationofjb/script.cpp index dfb6886af7..7a39127728 100644 --- a/engines/mutationofjb/script.cpp +++ b/engines/mutationofjb/script.cpp @@ -151,8 +151,7 @@ bool Script::loadFromStream(Common::SeekableReadStream &stream) { } } - Common::HashMap<Common::String, Command *> macros; - Common::HashMap<Common::String, Command *> labels; + _macros = parseCtx._macros; return true; } @@ -184,4 +183,8 @@ const ActionInfos &Script::getUseActionInfos() const { return _useActionInfos; } +const Macros &Script::getMacros() const { + return _macros; +} + } diff --git a/engines/mutationofjb/script.h b/engines/mutationofjb/script.h index 9589968d9a..64adda831e 100644 --- a/engines/mutationofjb/script.h +++ b/engines/mutationofjb/script.h @@ -58,6 +58,7 @@ struct ActionInfo { typedef Common::Array<ActionInfo> ActionInfos; typedef Common::Array<GotoCommand *> GotoCommands; +typedef Common::HashMap<Common::String, Command *> Macros; class ScriptParseContext { public: @@ -85,6 +86,7 @@ public: PendingGotoMap _pendingGotos; ActionInfos _actionInfos; + Macros _macros; private: }; @@ -98,6 +100,7 @@ public: const ActionInfos &getWalkActionInfos() const; const ActionInfos &getTalkActionInfos() const; const ActionInfos &getUseActionInfos() const; + const Macros &getMacros() const; private: void destroy(); @@ -106,6 +109,7 @@ private: ActionInfos _walkActionInfos; ActionInfos _talkActionInfos; ActionInfos _useActionInfos; + Macros _macros; }; } |