aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorĽubomír Remák2018-06-20 23:25:34 +0200
committerEugene Sandulenko2018-08-25 23:12:01 +0200
commitf102667fc20d91149b685aac1bb5b05cabbc6e2b (patch)
treefd629c40baa5dbbd4797e4a32b43b4faf3178d41 /engines
parent2fb867b2f56b5c337fe3c547a5f53a627e52b74e (diff)
downloadscummvm-rg350-f102667fc20d91149b685aac1bb5b05cabbc6e2b.tar.gz
scummvm-rg350-f102667fc20d91149b685aac1bb5b05cabbc6e2b.tar.bz2
scummvm-rg350-f102667fc20d91149b685aac1bb5b05cabbc6e2b.zip
MUTATIONOFJB: Add support for DEFINE_STRUCT script command.
Diffstat (limited to 'engines')
-rw-r--r--engines/mutationofjb/commands/definestructcommand.cpp83
-rw-r--r--engines/mutationofjb/commands/definestructcommand.h41
-rw-r--r--engines/mutationofjb/game.cpp25
-rw-r--r--engines/mutationofjb/game.h2
-rw-r--r--engines/mutationofjb/gamedata.h29
-rw-r--r--engines/mutationofjb/gui.h11
-rw-r--r--engines/mutationofjb/module.mk1
-rw-r--r--engines/mutationofjb/script.cpp2
-rw-r--r--engines/mutationofjb/widgets/conversationwidget.cpp5
9 files changed, 186 insertions, 13 deletions
diff --git a/engines/mutationofjb/commands/definestructcommand.cpp b/engines/mutationofjb/commands/definestructcommand.cpp
new file mode 100644
index 0000000000..ee15274a2d
--- /dev/null
+++ b/engines/mutationofjb/commands/definestructcommand.cpp
@@ -0,0 +1,83 @@
+/* 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/definestructcommand.h"
+#include "mutationofjb/script.h"
+#include "mutationofjb/game.h"
+#include "common/debug.h"
+
+namespace MutationOfJB {
+
+bool DefineStructCommandParser::parse(const Common::String &line, ScriptParseContext &parseCtx, Command *&command) {
+ if (line.size() < 24 || !line.hasPrefix("DEFINE_STRUCT")) {
+ return false;
+ }
+
+ ConversationInfo convInfo;
+
+ const int numLines = atoi(line.c_str() + 14);
+ convInfo._context = atoi(line.c_str() + 18);
+ convInfo._objectId = atoi(line.c_str() + 20);
+ convInfo._color = Game::colorFromString(line.c_str() + 23);
+
+ for (int i = 0; i < numLines; ++i) {
+ Common::String convLineStr;
+ if (!parseCtx.readLine(convLineStr)) {
+ break;
+ }
+
+ if (convLineStr.size() != 74) {
+ debug("Conversation line in DEFINE_STRUCT with wrong length");
+ continue;
+ }
+
+ const char* linePtr = convLineStr.c_str();
+
+ ConversationInfo::Line convLine;
+
+ for (int j = 0; j < 5; ++j) {
+ ConversationInfo::Item convItem;
+ convItem._question = atoi(linePtr);
+ linePtr += 6;
+ convItem._response = atoi(linePtr);
+ linePtr += 6;
+ convItem._nextLineIndex = atoi(linePtr);
+ linePtr += 3;
+ convLine._items.push_back(convItem);
+ }
+ convInfo._lines.push_back(convLine);
+ }
+
+ command = new DefineStructCommand(convInfo);
+
+ return true;
+}
+
+Command::ExecuteResult DefineStructCommand::execute(ScriptExecutionContext &scriptExecCtx) {
+ scriptExecCtx.getGameData()._conversationInfo = _conversationInfo;
+ return Command::Finished;
+}
+
+Common::String DefineStructCommand::debugString() const {
+ return "DEFINE_STRUCT <data omitted>";
+}
+}
diff --git a/engines/mutationofjb/commands/definestructcommand.h b/engines/mutationofjb/commands/definestructcommand.h
new file mode 100644
index 0000000000..13fc910403
--- /dev/null
+++ b/engines/mutationofjb/commands/definestructcommand.h
@@ -0,0 +1,41 @@
+/* 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/seqcommand.h"
+#include "mutationofjb/gamedata.h"
+
+namespace MutationOfJB {
+
+class DefineStructCommandParser : public SeqCommandParser {
+public:
+ virtual bool parse(const Common::String &line, ScriptParseContext &parseCtx, Command *&command) override;
+};
+
+class DefineStructCommand : public SeqCommand {
+public:
+ DefineStructCommand(const ConversationInfo& convInfo) : _conversationInfo(convInfo) {}
+ virtual Command::ExecuteResult execute(ScriptExecutionContext &scriptExecCtx) override;
+ virtual Common::String debugString() const override;
+private:
+ ConversationInfo _conversationInfo;
+};
+}
diff --git a/engines/mutationofjb/game.cpp b/engines/mutationofjb/game.cpp
index d6ab622e99..a0f85b49b8 100644
--- a/engines/mutationofjb/game.cpp
+++ b/engines/mutationofjb/game.cpp
@@ -200,4 +200,29 @@ Font& Game::getSpeechFont() {
return _speechFont;
}
+uint8 Game::colorFromString(const char *colorStr) {
+ struct {
+ const char *str;
+ uint8 color;
+ } colors[] = {
+ {"white", WHITE},
+ {"dakrgray", DARKGRAY},
+ {"lightgray", LIGHTGRAY},
+ {"green", GREEN},
+ {"orange", ORANGE},
+ {"darkblue", DARKBLUE},
+ {"lightblue", LIGHTBLUE},
+ {"brown", BROWN}
+ };
+
+ for (int i = 0; i < ARRAYSIZE(colors); ++i) {
+ if (strcmp(colors[i].str, colorStr) == 0) {
+ return colors[i].color;
+ }
+ }
+
+ warning(_("Color not found"));
+ return 0x00;
+}
+
}
diff --git a/engines/mutationofjb/game.h b/engines/mutationofjb/game.h
index 122c2a1f63..4985a884d7 100644
--- a/engines/mutationofjb/game.h
+++ b/engines/mutationofjb/game.h
@@ -68,6 +68,8 @@ public:
Font& getSystemFont();
Font& getSpeechFont();
+ static uint8 colorFromString(const char *colorStr);
+
private:
bool loadGameData(bool partB);
void runActiveCommand();
diff --git a/engines/mutationofjb/gamedata.h b/engines/mutationofjb/gamedata.h
index 321a688d3c..22be9dd273 100644
--- a/engines/mutationofjb/gamedata.h
+++ b/engines/mutationofjb/gamedata.h
@@ -161,6 +161,23 @@ struct Scene {
bool loadFromStream(Common::ReadStream &stream);
};
+struct ConversationInfo {
+ struct Item {
+ uint8 _question;
+ uint8 _response;
+ uint8 _nextLineIndex;
+ };
+
+ struct Line {
+ Common::Array<Item> _items;
+ };
+
+ Common::Array<Line> _lines;
+ uint8 _context;
+ uint8 _objectId;
+ uint8 _color;
+};
+
struct GameData {
public:
GameData();
@@ -175,10 +192,22 @@ public:
bool _partB;
Inventory _inventory;
Common::String _currentAPK;
+ ConversationInfo _conversationInfo;
private:
Scene _scenes[45];
};
+enum Colors {
+ WHITE = 0xC6,
+ DARKGRAY = 0xC2,
+ LIGHTGRAY = 0xC4,
+ GREEN = 0xC8,
+ ORANGE = 0xCA,
+ DARKBLUE = 0xD6,
+ LIGHTBLUE = 0xDA,
+ BROWN = 0xDC
+};
+
}
#endif
diff --git a/engines/mutationofjb/gui.h b/engines/mutationofjb/gui.h
index d8e1286233..8919a9deb6 100644
--- a/engines/mutationofjb/gui.h
+++ b/engines/mutationofjb/gui.h
@@ -47,17 +47,6 @@ class ConversationWidget;
class Gui : public InventoryObserver, public ButtonWidgetCallback {
public:
- enum Colors {
- WHITE = 0xC6,
- DARKGRAY = 0xC2,
- LIGHTGRAY = 0xC4,
- GREEN = 0xC8,
- ORANGE = 0xCA,
- DARKBLUE = 0xD6,
- LIGHTBLUE = 0xDA,
- BROWN = 0xDC
- };
-
typedef Common::HashMap<Common::String, int> InventoryMap;
friend class InventoryAnimationDecoderCallback;
diff --git a/engines/mutationofjb/module.mk b/engines/mutationofjb/module.mk
index 2fd4123087..507ae39402 100644
--- a/engines/mutationofjb/module.mk
+++ b/engines/mutationofjb/module.mk
@@ -7,6 +7,7 @@ MODULE_OBJS := \
commands/changecommand.o \
commands/command.o \
commands/conditionalcommand.o \
+ commands/definestructcommand.o \
commands/endblockcommand.o \
commands/gotocommand.o \
commands/ifcommand.o \
diff --git a/engines/mutationofjb/script.cpp b/engines/mutationofjb/script.cpp
index 1f5571f0b5..321a5ba79d 100644
--- a/engines/mutationofjb/script.cpp
+++ b/engines/mutationofjb/script.cpp
@@ -43,6 +43,7 @@
#include "mutationofjb/commands/callmacrocommand.h"
#include "mutationofjb/commands/newroomcommand.h"
#include "mutationofjb/commands/renamecommand.h"
+#include "mutationofjb/commands/definestructcommand.h"
#include "mutationofjb/game.h"
namespace MutationOfJB {
@@ -59,6 +60,7 @@ static CommandParser **getParsers() {
new ChangeObjectCommandParser,
new ChangeStaticCommandParser,
new ChangeSceneCommandParser,
+ new DefineStructCommandParser,
new SayCommandParser,
new AddItemCommandParser,
new RemoveItemCommandParser,
diff --git a/engines/mutationofjb/widgets/conversationwidget.cpp b/engines/mutationofjb/widgets/conversationwidget.cpp
index 6196bc672a..c609fb4bfc 100644
--- a/engines/mutationofjb/widgets/conversationwidget.cpp
+++ b/engines/mutationofjb/widgets/conversationwidget.cpp
@@ -22,6 +22,7 @@
#include "mutationofjb/widgets/conversationwidget.h"
#include "mutationofjb/game.h"
+#include "mutationofjb/gamedata.h"
#include "mutationofjb/gui.h"
#include "mutationofjb/font.h"
@@ -56,8 +57,8 @@ void ConversationWidget::_draw(Graphics::ManagedSurface &surface) {
continue;
}
- // TODO: Active line should be Gui::WHITE.
- _gui.getGame().getSystemFont().drawString(line, Gui::LIGHTGRAY, CONVERSATION_LINES_X, CONVERSATION_LINES_Y + i * CONVERSATION_LINE_HEIGHT, surface);
+ // TODO: Active line should be WHITE.
+ _gui.getGame().getSystemFont().drawString(line, LIGHTGRAY, CONVERSATION_LINES_X, CONVERSATION_LINES_Y + i * CONVERSATION_LINE_HEIGHT, surface);
}
}