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 | |
| parent | 3928c52c0ee2a930431a807d0b4262440ab75725 (diff) | |
| download | scummvm-rg350-63c0dac9613caef3778a4cb9765bb8b628e5a1c2.tar.gz scummvm-rg350-63c0dac9613caef3778a4cb9765bb8b628e5a1c2.tar.bz2 scummvm-rg350-63c0dac9613caef3778a4cb9765bb8b628e5a1c2.zip  | |
MUTATIONOFJB: Add support for macro definitions.
| -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;  };  }  | 
