aboutsummaryrefslogtreecommitdiff
path: root/engines/mutationofjb/commands
diff options
context:
space:
mode:
authorMiroslav Remák2018-07-14 21:42:57 +0200
committerEugene Sandulenko2018-08-25 23:12:01 +0200
commit3b614f08327441d5252add7c16f4955652e32d0a (patch)
tree9b1351d2e733bdde8d5fcd9ff29d103323d6f315 /engines/mutationofjb/commands
parentfebff83a4edc89e1dbc6f4c56f5531f0eb8f3287 (diff)
downloadscummvm-rg350-3b614f08327441d5252add7c16f4955652e32d0a.tar.gz
scummvm-rg350-3b614f08327441d5252add7c16f4955652e32d0a.tar.bz2
scummvm-rg350-3b614f08327441d5252add7c16f4955652e32d0a.zip
MUTATIONOFJB: Implement RANDOM command.
Diffstat (limited to 'engines/mutationofjb/commands')
-rw-r--r--engines/mutationofjb/commands/endblockcommand.cpp2
-rw-r--r--engines/mutationofjb/commands/randomcommand.cpp110
-rw-r--r--engines/mutationofjb/commands/randomcommand.h70
3 files changed, 181 insertions, 1 deletions
diff --git a/engines/mutationofjb/commands/endblockcommand.cpp b/engines/mutationofjb/commands/endblockcommand.cpp
index 3b4c25bf51..5fcccd390b 100644
--- a/engines/mutationofjb/commands/endblockcommand.cpp
+++ b/engines/mutationofjb/commands/endblockcommand.cpp
@@ -56,7 +56,7 @@ bool EndBlockCommandParser::parse(const Common::String &line, ScriptParseContext
}
const char firstChar = line.firstChar();
- if (firstChar != '#' && firstChar != '=' && firstChar != '-') {
+ if (firstChar != '#' && firstChar != '=' && firstChar != '-' && firstChar != '\\') {
return false;
}
diff --git a/engines/mutationofjb/commands/randomcommand.cpp b/engines/mutationofjb/commands/randomcommand.cpp
new file mode 100644
index 0000000000..ff03e96cc6
--- /dev/null
+++ b/engines/mutationofjb/commands/randomcommand.cpp
@@ -0,0 +1,110 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "mutationofjb/commands/randomcommand.h"
+
+#include "mutationofjb/game.h"
+#include "mutationofjb/script.h"
+#include "common/debug.h"
+#include "common/random.h"
+#include "common/translation.h"
+
+/*
+ "RANDOM " <numChoices>
+
+ RANDOM command randomly picks one of the command blocks that
+ follow it and jumps to its start.
+
+ These blocks start with "/" and end with "\". The end of a random
+ block also ends the current section. The number of blocks must
+ match numChoices.
+*/
+
+namespace MutationOfJB {
+
+bool RandomCommandParser::parse(const Common::String &line, ScriptParseContext &parseCtx, Command *&command) {
+ if (line.size() < 8 || !line.hasPrefix("RANDOM")) {
+ return false;
+ }
+
+ int numChoices = atoi(line.c_str() + 7);
+ if (parseCtx._pendingRandomCommand) {
+ // Nested RANDOM commands are unused and not properly supported by the original game.
+ warning(_("Ignoring nested RANDOM command."));
+ } else if (numChoices >= 1) {
+ RandomCommand *randomCommand = new RandomCommand(static_cast<uint>(numChoices));
+ parseCtx._pendingRandomCommand = randomCommand;
+ command = randomCommand;
+ } else {
+ warning(_("Ignoring malformed RANDOM command with %d choices."), numChoices);
+ }
+
+ return true;
+}
+
+bool RandomBlockStartParser::parse(const Common::String &line, ScriptParseContext &parseCtx, Command *&) {
+ if (line != "/") {
+ return false;
+ }
+
+ if (!parseCtx._pendingRandomCommand) {
+ warning(_("Unexpected start of RANDOM block"));
+ }
+
+ return true;
+}
+
+void RandomBlockStartParser::transition(ScriptParseContext &parseCtx, Command *, Command *newCommand, CommandParser *) {
+ if (newCommand && parseCtx._pendingRandomCommand) {
+ parseCtx._pendingRandomCommand->_choices.push_back(newCommand);
+ }
+}
+
+RandomCommand::RandomCommand(uint numChoices)
+ : _numChoices(numChoices),
+ _chosenNext(nullptr)
+{
+ _choices.reserve(numChoices);
+}
+
+Command::ExecuteResult RandomCommand::execute(ScriptExecutionContext &scriptExecCtx) {
+ assert(!_choices.empty());
+
+ Common::RandomSource &rng = scriptExecCtx.getGame().getRandomSource();
+ uint choice = rng.getRandomNumber(_choices.size() - 1);
+ _chosenNext = _choices[choice];
+ return Finished;
+}
+
+Command *RandomCommand::next() const {
+ return _chosenNext;
+}
+
+Common::String RandomCommand::debugString() const {
+ return Common::String::format("RANDOM %u", _numChoices);
+}
+
+const RandomCommand::Choices &RandomCommand::getChoices() const {
+ return _choices;
+}
+
+}
diff --git a/engines/mutationofjb/commands/randomcommand.h b/engines/mutationofjb/commands/randomcommand.h
new file mode 100644
index 0000000000..ffe9fc2374
--- /dev/null
+++ b/engines/mutationofjb/commands/randomcommand.h
@@ -0,0 +1,70 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef MUTATIONOFJB_RANDOMCOMMAND_H
+#define MUTATIONOFJB_RANDOMCOMMAND_H
+
+#include "mutationofjb/commands/command.h"
+#include "common/array.h"
+#include "common/scummsys.h"
+
+namespace MutationOfJB {
+
+class RandomCommandParser : public CommandParser {
+public:
+ RandomCommandParser() {}
+
+ virtual bool parse(const Common::String &line, ScriptParseContext &parseCtx, Command *&command) override;
+};
+
+class RandomBlockStartParser : public CommandParser {
+public:
+ RandomBlockStartParser() {}
+
+ virtual bool parse(const Common::String &line, ScriptParseContext &parseCtx, Command *&command) override;
+ virtual void transition(ScriptParseContext &parseCtx, Command *oldCommand, Command *newCommand, CommandParser *newCommandParser) override;
+};
+
+class RandomCommand : public Command {
+ friend class RandomBlockStartParser;
+
+public:
+ typedef Common::Array<Command *> Choices;
+
+ RandomCommand(uint numChoices);
+
+ virtual ExecuteResult execute(ScriptExecutionContext &scriptExecCtx) override;
+ virtual Command *next() const override;
+
+ virtual Common::String debugString() const override;
+
+ const Choices &getChoices() const;
+
+private:
+ uint _numChoices;
+ Choices _choices;
+ Command *_chosenNext;
+};
+
+}
+
+#endif