From f102667fc20d91149b685aac1bb5b05cabbc6e2b Mon Sep 17 00:00:00 2001 From: Ľubomír Remák Date: Wed, 20 Jun 2018 23:25:34 +0200 Subject: MUTATIONOFJB: Add support for DEFINE_STRUCT script command. --- .../mutationofjb/commands/definestructcommand.cpp | 83 ++++++++++++++++++++++ .../mutationofjb/commands/definestructcommand.h | 41 +++++++++++ engines/mutationofjb/game.cpp | 25 +++++++ engines/mutationofjb/game.h | 2 + engines/mutationofjb/gamedata.h | 29 ++++++++ engines/mutationofjb/gui.h | 11 --- engines/mutationofjb/module.mk | 1 + engines/mutationofjb/script.cpp | 2 + .../mutationofjb/widgets/conversationwidget.cpp | 5 +- 9 files changed, 186 insertions(+), 13 deletions(-) create mode 100644 engines/mutationofjb/commands/definestructcommand.cpp create mode 100644 engines/mutationofjb/commands/definestructcommand.h (limited to 'engines/mutationofjb') 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 "; +} +} 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 _items; + }; + + Common::Array _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 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); } } -- cgit v1.2.3