Permalink
Browse files

MUTATIONOFJB: Add support for DEFINE_STRUCT script command.

  • Loading branch information...
LubomirR authored and sev- committed Jun 20, 2018
1 parent 2fb867b commit f102667fc20d91149b685aac1bb5b05cabbc6e2b
@@ -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>";
}
}
@@ -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;
};
}
@@ -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;
}

}
@@ -68,6 +68,8 @@ class Game {
Font& getSystemFont();
Font& getSpeechFont();

static uint8 colorFromString(const char *colorStr);

private:
bool loadGameData(bool partB);
void runActiveCommand();
@@ -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 @@ struct GameData {
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
@@ -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;
@@ -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 \
@@ -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,
@@ -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);
}
}

0 comments on commit f102667

Please sign in to comment.