diff options
author | Ľubomír Remák | 2018-09-06 19:38:16 +0200 |
---|---|---|
committer | Ľubomír Remák | 2018-09-06 19:38:16 +0200 |
commit | c36fb36afba47f52c1f81f1df61eb31838134cd2 (patch) | |
tree | a87bc4e4c7a70542da8b54e1cb4e86373ec199f8 | |
parent | f10816d9ed0b74b478799a96f26ee8f3f42f9ee2 (diff) | |
download | scummvm-rg350-c36fb36afba47f52c1f81f1df61eb31838134cd2.tar.gz scummvm-rg350-c36fb36afba47f52c1f81f1df61eb31838134cd2.tar.bz2 scummvm-rg350-c36fb36afba47f52c1f81f1df61eb31838134cd2.zip |
MUTATIONOFJB: Add support for 'look' action on inventory items.
23 files changed, 461 insertions, 138 deletions
diff --git a/engines/mutationofjb/assets.cpp b/engines/mutationofjb/assets.cpp index 2adda51c09..6f3236177b 100644 --- a/engines/mutationofjb/assets.cpp +++ b/engines/mutationofjb/assets.cpp @@ -42,4 +42,8 @@ ConversationLineList &Assets::getResponseList() { return _responseList; } +InventoryItemDefinitionList &Assets::getInventoryItemDefList() { + return _invItemDefList; +} + } diff --git a/engines/mutationofjb/assets.h b/engines/mutationofjb/assets.h index 2cd0612f20..89ed678c60 100644 --- a/engines/mutationofjb/assets.h +++ b/engines/mutationofjb/assets.h @@ -25,6 +25,7 @@ #include "mutationofjb/font.h" #include "mutationofjb/conversationlinelist.h" +#include "mutationofjb/inventoryitemdefinitionlist.h" namespace MutationOfJB { @@ -39,6 +40,7 @@ public: ConversationLineList &getToSayList(); ConversationLineList &getResponseList(); + InventoryItemDefinitionList &getInventoryItemDefList(); private: Game &_game; @@ -46,6 +48,7 @@ private: SpeechFont _speechFont; ConversationLineList _toSayList; ConversationLineList _responseList; + InventoryItemDefinitionList _invItemDefList; }; } diff --git a/engines/mutationofjb/game.cpp b/engines/mutationofjb/game.cpp index ff05bb99eb..5e0d1e699c 100644 --- a/engines/mutationofjb/game.cpp +++ b/engines/mutationofjb/game.cpp @@ -194,7 +194,7 @@ void Game::update() { _taskManager.update(); } -Gui &Game::getGui() { +GameScreen &Game::getGameScreen() { return _gui; } diff --git a/engines/mutationofjb/game.h b/engines/mutationofjb/game.h index 6230b93aff..adb5bf5c48 100644 --- a/engines/mutationofjb/game.h +++ b/engines/mutationofjb/game.h @@ -24,7 +24,7 @@ #define MUTATIONOFJB_GAME_H #include "mutationofjb/assets.h" -#include "mutationofjb/gui.h" +#include "mutationofjb/gamescreen.h" #include "mutationofjb/script.h" #include "mutationofjb/tasks/taskmanager.h" @@ -66,7 +66,7 @@ public: void update(); - Gui &getGui(); + GameScreen &getGameScreen(); ActionInfo::Action getCurrentAction() const; void setCurrentAction(ActionInfo::Action); @@ -97,7 +97,7 @@ private: Script *_localScript; Script *_delayedLocalScript; Room *_room; - Gui _gui; + GameScreen _gui; ActionInfo::Action _currentAction; ScriptExecutionContext _scriptExecCtx; diff --git a/engines/mutationofjb/gui.cpp b/engines/mutationofjb/gamescreen.cpp index 7c219bc706..3c007f415f 100644 --- a/engines/mutationofjb/gui.cpp +++ b/engines/mutationofjb/gamescreen.cpp @@ -20,7 +20,8 @@ * */ -#include "mutationofjb/gui.h" +#include "mutationofjb/gamescreen.h" + #include "mutationofjb/animationdecoder.h" #include "mutationofjb/encryptedfile.h" #include "mutationofjb/game.h" @@ -31,7 +32,9 @@ #include "mutationofjb/widgets/inventorywidget.h" #include "mutationofjb/widgets/imagewidget.h" #include "mutationofjb/widgets/conversationwidget.h" + #include "common/rect.h" + #include "graphics/screen.h" namespace MutationOfJB { @@ -62,27 +65,14 @@ enum { }; -Gui::Gui(Game &game, Graphics::Screen *screen) - : _game(game), - _screen(screen), +GameScreen::GameScreen(Game &game, Graphics::Screen *screen) + : GuiScreen(game, screen), _inventoryWidget(nullptr), _conversationWidget(nullptr) {} -Gui::~Gui() { - for (Common::Array<Widget *>::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { - delete *it; - } -} - -Game &Gui::getGame() { - return _game; -} - -bool Gui::init() { - if (!loadInventoryList()) { - return false; - } +GameScreen::~GameScreen() {} +bool GameScreen::init() { if (!loadInventoryGfx()) { return false; } @@ -98,10 +88,11 @@ bool Gui::init() { const Common::Rect backgroundRect(CONVERSATION_X, CONVERSATION_Y, CONVERSATION_X + CONVERSATION_WIDTH, CONVERSATION_Y + CONVERSATION_HEIGHT); const Graphics::Surface backgroundSurface = _hudSurfaces[0].getSubArea(backgroundRect); ImageWidget *image = new ImageWidget(*this, backgroundRect, backgroundSurface); - _widgets.push_back(image); + addWidget(image); - _inventoryWidget = new InventoryWidget(*this, _inventoryItems, _inventorySurfaces); - _widgets.push_back(_inventoryWidget); + _inventoryWidget = new InventoryWidget(*this, _inventorySurfaces); + _inventoryWidget->setCallback(this); + addWidget(_inventoryWidget); const Common::Rect ButtonRects[] = { Common::Rect(0, 148, 67, 158), // Walk @@ -120,53 +111,29 @@ bool Gui::init() { ButtonWidget *button = new ButtonWidget(*this, ButtonRects[i], normalSurface, pressedSurface); button->setId(i); button->setCallback(this); - _widgets.push_back(button); + addWidget(button); } const Common::Rect conversationRect(CONVERSATION_X, CONVERSATION_Y, CONVERSATION_X + CONVERSATION_WIDTH, CONVERSATION_Y + CONVERSATION_HEIGHT); const Graphics::Surface conversationSurface = _hudSurfaces[2].getSubArea(conversationRect); _conversationWidget = new ConversationWidget(*this, conversationRect, conversationSurface); _conversationWidget->setVisible(false); - _widgets.push_back(_conversationWidget); + addWidget(_conversationWidget); return true; } -void Gui::markDirty() { - for (Common::Array<Widget *>::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { - if ((*it)->isVisible()) { - (*it)->markDirty(); - } - } -} - -void Gui::handleEvent(const Common::Event &event) { - for (Common::Array<Widget *>::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { - if ((*it)->isVisible()) { - (*it)->handleEvent(event); - } - } -} - -void Gui::update() { - for (Common::Array<Widget *>::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { - if ((*it)->isVisible()) { - (*it)->update(*_screen); - } - } -} - -ConversationWidget &Gui::getConversationWidget() { +ConversationWidget &GameScreen::getConversationWidget() { return *_conversationWidget; } class InventoryAnimationDecoderCallback : public AnimationDecoderCallback { public: - InventoryAnimationDecoderCallback(Gui &gui) : _gui(gui) {} + InventoryAnimationDecoderCallback(GameScreen &gui) : _gui(gui) {} virtual void onFrame(int frameNo, Graphics::Surface &surface) override; virtual void onPaletteUpdated(byte palette[PALETTE_SIZE]) override; private: - Gui &_gui; + GameScreen &_gui; }; void InventoryAnimationDecoderCallback::onPaletteUpdated(byte palette[PALETTE_SIZE]) { @@ -181,7 +148,7 @@ void InventoryAnimationDecoderCallback::onFrame(int frameNo, Graphics::Surface & } } -bool Gui::loadInventoryGfx() { +bool GameScreen::loadInventoryGfx() { AnimationDecoder decoder("icons.dat"); InventoryAnimationDecoderCallback callback(*this); return decoder.decode(&callback); @@ -189,11 +156,11 @@ bool Gui::loadInventoryGfx() { class HudAnimationDecoderCallback : public AnimationDecoderCallback { public: - HudAnimationDecoderCallback(Gui &gui) : _gui(gui) {} + HudAnimationDecoderCallback(GameScreen &gui) : _gui(gui) {} virtual void onFrame(int frameNo, Graphics::Surface &surface) override; virtual void onPaletteUpdated(byte palette[PALETTE_SIZE]) override; private: - Gui &_gui; + GameScreen &_gui; }; void HudAnimationDecoderCallback::onPaletteUpdated(byte [PALETTE_SIZE]) { @@ -207,48 +174,17 @@ void HudAnimationDecoderCallback::onFrame(int frameNo, Graphics::Surface &surfac } } -bool Gui::loadHudGfx() { +bool GameScreen::loadHudGfx() { AnimationDecoder decoder("room0.dat"); HudAnimationDecoderCallback callback(*this); return decoder.decode(&callback); } -bool Gui::loadInventoryList() { - EncryptedFile file; - const char *fileName = "fixitems.dat"; - file.open(fileName); - if (!file.isOpen()) { - reportFileMissingError(fileName); - return false; - } - - int itemIndex = 0; - while (!file.eos()) { - Common::String line = file.readLine(); - if (line.empty() || line.hasPrefix("#")) { - continue; - } - const char *firstSpace = strchr(line.c_str(), ' '); - if (!firstSpace) { - continue; - } - const int len = firstSpace - line.c_str(); - if (!len) { - continue; - } - Common::String item(line.c_str(), len); - _inventoryItems[item] = itemIndex; - itemIndex++; - } - - return true; -} - -void Gui::onInventoryChanged() { +void GameScreen::onInventoryChanged() { _inventoryWidget->markDirty(); } -void Gui::onButtonClicked(ButtonWidget *button) { +void GameScreen::onButtonClicked(ButtonWidget *button) { const int buttonId = button->getId(); if (buttonId <= BUTTON_PICKUP) { const ActionInfo::Action actions[] = {ActionInfo::Walk, ActionInfo::Talk, ActionInfo::Look, ActionInfo::Use, ActionInfo::PickUp}; @@ -260,4 +196,19 @@ void Gui::onButtonClicked(ButtonWidget *button) { } } +void GameScreen::onInventoryItemHovered(InventoryWidget *widget, int posInWidget) { + // TODO +} + +void GameScreen::onInventoryItemClicked(InventoryWidget *widget, int posInWidget) { + // Position in widget should match the position in inventory. + const Common::String &item = getGame().getGameData().getInventory().getItems()[posInWidget]; + + if (_game.getCurrentAction() == ActionInfo::Use) { + // TODO + } else { + _game.startActionSection(ActionInfo::Look, item); + } +} + } diff --git a/engines/mutationofjb/gui.h b/engines/mutationofjb/gamescreen.h index 354d04f960..bc70580eda 100644 --- a/engines/mutationofjb/gui.h +++ b/engines/mutationofjb/gamescreen.h @@ -23,12 +23,16 @@ #ifndef MUTATIONOFJB_GUI_H #define MUTATIONOFJB_GUI_H +#include "mutationofjb/inventory.h" +#include "mutationofjb/widgets/buttonwidget.h" +#include "mutationofjb/widgets/inventorywidget.h" +#include "mutationofjb/guiscreen.h" + #include "common/array.h" #include "common/hashmap.h" #include "common/hash-str.h" + #include "graphics/surface.h" -#include "mutationofjb/inventory.h" -#include "mutationofjb/widgets/buttonwidget.h" namespace Common { struct Event; @@ -45,44 +49,34 @@ class Widget; class InventoryWidget; class ConversationWidget; -class Gui : public InventoryObserver, public ButtonWidgetCallback { +class GameScreen : public GuiScreen, public InventoryObserver, public ButtonWidgetCallback, public InventoryWidgetCallback { public: - typedef Common::HashMap<Common::String, int> InventoryMap; - friend class InventoryAnimationDecoderCallback; friend class HudAnimationDecoderCallback; - Gui(Game &game, Graphics::Screen *screen); - ~Gui(); - Game &getGame(); + GameScreen(Game &game, Graphics::Screen *screen); + ~GameScreen(); bool init(); - void update(); - - void markDirty(); - void handleEvent(const Common::Event &event); virtual void onInventoryChanged() override; virtual void onButtonClicked(ButtonWidget *) override; + virtual void onInventoryItemHovered(InventoryWidget *widget, int posInWidget) override; + virtual void onInventoryItemClicked(InventoryWidget *widget, int posInWidget) override; ConversationWidget &getConversationWidget(); private: bool loadInventoryGfx(); bool loadHudGfx(); - bool loadInventoryList(); void drawInventoryItem(const Common::String &item, int pos); void drawInventory(); - Game &_game; - Graphics::Screen *_screen; - InventoryMap _inventoryItems; Common::Array<Graphics::Surface> _inventorySurfaces; Common::Array<Graphics::Surface> _hudSurfaces; InventoryWidget *_inventoryWidget; ConversationWidget *_conversationWidget; - Common::Array<Widget *> _widgets; }; } diff --git a/engines/mutationofjb/guiscreen.cpp b/engines/mutationofjb/guiscreen.cpp new file mode 100644 index 0000000000..5ad545dc3c --- /dev/null +++ b/engines/mutationofjb/guiscreen.cpp @@ -0,0 +1,73 @@ +/* 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/guiscreen.h" + +#include "mutationofjb/widgets/widget.h" + +#include "graphics/screen.h" + +namespace MutationOfJB { + +GuiScreen::GuiScreen(Game &game, Graphics::Screen *screen) + : _game(game), + _screen(screen) {} + +GuiScreen::~GuiScreen() { + for (Common::Array<Widget *>::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { + delete *it; + } +} + +Game &GuiScreen::getGame() { + return _game; +} + +void GuiScreen::markDirty() { + for (Common::Array<Widget *>::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { + if ((*it)->isVisible()) { + (*it)->markDirty(); + } + } +} + +void GuiScreen::handleEvent(const Common::Event &event) { + for (Common::Array<Widget *>::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { + if ((*it)->isVisible()) { + (*it)->handleEvent(event); + } + } +} + +void GuiScreen::update() { + for (Common::Array<Widget *>::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { + if ((*it)->isVisible()) { + (*it)->update(*_screen); + } + } +} + +void GuiScreen::addWidget(Widget *widget) { + _widgets.push_back(widget); +} + +} diff --git a/engines/mutationofjb/guiscreen.h b/engines/mutationofjb/guiscreen.h new file mode 100644 index 0000000000..c1761be39a --- /dev/null +++ b/engines/mutationofjb/guiscreen.h @@ -0,0 +1,88 @@ +/* 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_GUISCREEN_H +#define MUTATIONOFJB_GUISCREEN_H + +#include "common/array.h" + +namespace Common { +struct Event; +} + +namespace Graphics { +class Screen; +} + +namespace MutationOfJB { + +class Game; +class Widget; + +/** + * Base class for GUI screens. + * + * GUI screen is a collection of widgets. + */ +class GuiScreen { +public: + + GuiScreen(Game &game, Graphics::Screen *screen); + virtual ~GuiScreen(); + Game &getGame(); + + /** + * Marks all visible widgets as dirty (needs redraw). + */ + void markDirty(); + + /** + * Lets all visible widgets handle core events. + * + * @param event ScummVM event. + */ + void handleEvent(const Common::Event &event); + + /** + * Updates all visible widgets. + */ + void update(); + + /** + * Adds a widget to the GUI screen. + * The GUI screen will own the widget. + * + * @param widget Widget to add. + */ + void addWidget(Widget *widget); + +protected: + Game &_game; + Graphics::Screen *_screen; + +private: + Common::Array<Widget *> _widgets; +}; + +} + +#endif diff --git a/engines/mutationofjb/inventory.cpp b/engines/mutationofjb/inventory.cpp index 91bfd9f005..6176425ca2 100644 --- a/engines/mutationofjb/inventory.cpp +++ b/engines/mutationofjb/inventory.cpp @@ -21,8 +21,10 @@ */ #include "mutationofjb/inventory.h" + #include "mutationofjb/game.h" -#include "mutationofjb/gui.h" +#include "mutationofjb/gamescreen.h" + #include "common/algorithm.h" #include "common/debug.h" diff --git a/engines/mutationofjb/inventoryitemdefinitionlist.cpp b/engines/mutationofjb/inventoryitemdefinitionlist.cpp new file mode 100644 index 0000000000..8af9bd4dee --- /dev/null +++ b/engines/mutationofjb/inventoryitemdefinitionlist.cpp @@ -0,0 +1,73 @@ +/* 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/inventoryitemdefinitionlist.h" + +#include "mutationofjb/encryptedfile.h" +#include "mutationofjb/util.h" + +namespace MutationOfJB { + +InventoryItemDefinitionList::InventoryItemDefinitionList() { + parseFile(); +} + +int InventoryItemDefinitionList::findItemIndex(const Common::String &itemName) { + const InventoryItemMap::const_iterator it = _inventoryItemMap.find(itemName); + if (it == _inventoryItemMap.end()) + return -1; + return it->_value; +} + +bool InventoryItemDefinitionList::parseFile() { + EncryptedFile file; + const char *fileName = "fixitems.dat"; + file.open(fileName); + if (!file.isOpen()) { + reportFileMissingError(fileName); + return false; + } + + int itemIndex = 0; + while (!file.eos()) { + Common::String line = file.readLine(); + if (line.empty() || line.hasPrefix("#")) { + continue; + } + + Common::String::const_iterator firstSpace = Common::find(line.begin(), line.end(), ' '); + if (firstSpace == line.end()) { + continue; + } + const int len = firstSpace - line.begin(); + if (!len) { + continue; + } + Common::String item(line.c_str(), len); + _inventoryItemMap[item] = itemIndex; + itemIndex++; + } + + return true; +} + +} diff --git a/engines/mutationofjb/inventoryitemdefinitionlist.h b/engines/mutationofjb/inventoryitemdefinitionlist.h new file mode 100644 index 0000000000..5f29b277c7 --- /dev/null +++ b/engines/mutationofjb/inventoryitemdefinitionlist.h @@ -0,0 +1,50 @@ +/* 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_INVENTORYITEMDEFINITIONLIST_H +#define MUTATIONOFJB_INVENTORYITEMDEFINITIONLIST_H + +#include "common/str.h" +#include "common/hash-str.h" +#include "common/hashmap.h" + +namespace MutationOfJB { + +typedef Common::HashMap<Common::String, int> InventoryMap; + +class InventoryItemDefinitionList { +public: + InventoryItemDefinitionList(); + const InventoryMap &getInventorMap() const; + + int findItemIndex(const Common::String &itemName); + +private: + bool parseFile(); + + typedef Common::HashMap<Common::String, int> InventoryItemMap; + InventoryItemMap _inventoryItemMap; +}; + +} + +#endif diff --git a/engines/mutationofjb/module.mk b/engines/mutationofjb/module.mk index 465f228a43..c7de62bfa1 100644 --- a/engines/mutationofjb/module.mk +++ b/engines/mutationofjb/module.mk @@ -42,8 +42,10 @@ MODULE_OBJS := \ font.o \ game.o \ gamedata.o \ - gui.o \ + gamescreen.o \ + guiscreen.o \ inventory.o \ + inventoryitemdefinitionlist.o \ mutationofjb.o \ room.o \ script.o \ diff --git a/engines/mutationofjb/mutationofjb.cpp b/engines/mutationofjb/mutationofjb.cpp index d96d1658b8..84ef9742f1 100644 --- a/engines/mutationofjb/mutationofjb.cpp +++ b/engines/mutationofjb/mutationofjb.cpp @@ -150,7 +150,7 @@ Common::Error MutationOfJBEngine::loadGameState(int slot) { delete saveFile; _game->changeScene(_game->getGameData()._currentScene, _game->getGameData()._partB); - _game->getGui().markDirty(); + _game->getGameScreen().markDirty(); return Common::kNoError; } @@ -204,7 +204,7 @@ void MutationOfJBEngine::handleNormalScene(const Common::Event &event) { default: break; } - _game->getGui().handleEvent(event); + _game->getGameScreen().handleEvent(event); } void MutationOfJBEngine::handleMapScene(const Common::Event &event) { diff --git a/engines/mutationofjb/tasks/conversationtask.cpp b/engines/mutationofjb/tasks/conversationtask.cpp index 9c3ae4b8d8..5167ec5308 100644 --- a/engines/mutationofjb/tasks/conversationtask.cpp +++ b/engines/mutationofjb/tasks/conversationtask.cpp @@ -25,7 +25,7 @@ #include "mutationofjb/assets.h" #include "mutationofjb/game.h" #include "mutationofjb/gamedata.h" -#include "mutationofjb/gui.h" +#include "mutationofjb/gamescreen.h" #include "mutationofjb/script.h" #include "mutationofjb/tasks/saytask.h" #include "mutationofjb/tasks/sequentialtask.h" @@ -39,7 +39,7 @@ void ConversationTask::start() { setState(RUNNING); Game &game = getTaskManager()->getGame(); - ConversationWidget &widget = game.getGui().getConversationWidget(); + ConversationWidget &widget = game.getGameScreen().getConversationWidget(); widget.setCallback(this); widget.setVisible(true); @@ -156,7 +156,7 @@ void ConversationTask::showChoicesOrPick() { } if (itemsWithValidQuestions.size() > 1) { - ConversationWidget &widget = game.getGui().getConversationWidget(); + ConversationWidget &widget = game.getGameScreen().getConversationWidget(); const ConversationLineList &toSayList = game.getAssets().getToSayList(); for (Common::Array<uint32>::size_type i = 0; i < itemsWithValidQuestions.size() && i < ConversationWidget::CONVERSATION_MAX_CHOICES; ++i) { @@ -219,9 +219,9 @@ void ConversationTask::finish() { setState(FINISHED); Game &game = getTaskManager()->getGame(); - ConversationWidget &widget = game.getGui().getConversationWidget(); + ConversationWidget &widget = game.getGameScreen().getConversationWidget(); widget.setVisible(false); - game.getGui().markDirty(); // TODO: Handle automatically when changing visibility. + game.getGameScreen().markDirty(); // TODO: Handle automatically when changing visibility. } void ConversationTask::startExtra() { diff --git a/engines/mutationofjb/widgets/buttonwidget.cpp b/engines/mutationofjb/widgets/buttonwidget.cpp index e2a9dd3b65..b7a1ce0845 100644 --- a/engines/mutationofjb/widgets/buttonwidget.cpp +++ b/engines/mutationofjb/widgets/buttonwidget.cpp @@ -26,7 +26,7 @@ namespace MutationOfJB { -ButtonWidget::ButtonWidget(Gui &gui, const Common::Rect &area, const Graphics::Surface &normalSurface, const Graphics::Surface &pressedSurface) : +ButtonWidget::ButtonWidget(GuiScreen &gui, const Common::Rect &area, const Graphics::Surface &normalSurface, const Graphics::Surface &pressedSurface) : Widget(gui, area), _normalSurface(normalSurface), _pressedSurface(pressedSurface), diff --git a/engines/mutationofjb/widgets/buttonwidget.h b/engines/mutationofjb/widgets/buttonwidget.h index d148fa8727..ae544b2508 100644 --- a/engines/mutationofjb/widgets/buttonwidget.h +++ b/engines/mutationofjb/widgets/buttonwidget.h @@ -38,7 +38,7 @@ public: class ButtonWidget : public Widget { public: - ButtonWidget(Gui &gui, const Common::Rect &area, const Graphics::Surface &normalSurface, const Graphics::Surface &pressedSurface); + ButtonWidget(GuiScreen &gui, const Common::Rect &area, const Graphics::Surface &normalSurface, const Graphics::Surface &pressedSurface); void setCallback(ButtonWidgetCallback *callback); virtual void handleEvent(const Common::Event &event) override; diff --git a/engines/mutationofjb/widgets/conversationwidget.cpp b/engines/mutationofjb/widgets/conversationwidget.cpp index 56e00579d3..049b73d0c5 100644 --- a/engines/mutationofjb/widgets/conversationwidget.cpp +++ b/engines/mutationofjb/widgets/conversationwidget.cpp @@ -23,7 +23,7 @@ #include "mutationofjb/widgets/conversationwidget.h" #include "mutationofjb/game.h" #include "mutationofjb/gamedata.h" -#include "mutationofjb/gui.h" +#include "mutationofjb/guiscreen.h" #include "mutationofjb/font.h" #include "common/events.h" @@ -35,7 +35,7 @@ enum { CONVERSATION_LINE_HEIGHT = 12 }; -ConversationWidget::ConversationWidget(Gui &gui, const Common::Rect &area, const Graphics::Surface &surface) : +ConversationWidget::ConversationWidget(GuiScreen &gui, const Common::Rect &area, const Graphics::Surface &surface) : Widget(gui, area), _surface(surface), _callback(nullptr) {} diff --git a/engines/mutationofjb/widgets/conversationwidget.h b/engines/mutationofjb/widgets/conversationwidget.h index 34ea2152e8..ea6e49f807 100644 --- a/engines/mutationofjb/widgets/conversationwidget.h +++ b/engines/mutationofjb/widgets/conversationwidget.h @@ -40,7 +40,7 @@ class ConversationWidget : public Widget { public: enum { CONVERSATION_MAX_CHOICES = 4 }; - ConversationWidget(Gui &gui, const Common::Rect &area, const Graphics::Surface &surface); + ConversationWidget(GuiScreen &gui, const Common::Rect &area, const Graphics::Surface &surface); void setCallback(ConversationWidgetCallback *callback) { _callback = callback; } diff --git a/engines/mutationofjb/widgets/imagewidget.cpp b/engines/mutationofjb/widgets/imagewidget.cpp index 8eeb7ed5e5..1bab1ade91 100644 --- a/engines/mutationofjb/widgets/imagewidget.cpp +++ b/engines/mutationofjb/widgets/imagewidget.cpp @@ -25,7 +25,7 @@ namespace MutationOfJB { -ImageWidget::ImageWidget(Gui &gui, const Common::Rect &area, const Graphics::Surface &image) : +ImageWidget::ImageWidget(GuiScreen &gui, const Common::Rect &area, const Graphics::Surface &image) : Widget(gui, area), _image(image) {} diff --git a/engines/mutationofjb/widgets/imagewidget.h b/engines/mutationofjb/widgets/imagewidget.h index da3dd36d69..80f5537f6d 100644 --- a/engines/mutationofjb/widgets/imagewidget.h +++ b/engines/mutationofjb/widgets/imagewidget.h @@ -30,7 +30,7 @@ namespace MutationOfJB { class ImageWidget : public Widget { public: - ImageWidget(Gui &gui, const Common::Rect &area, const Graphics::Surface &image); + ImageWidget(GuiScreen &gui, const Common::Rect &area, const Graphics::Surface &image); protected: virtual void draw(Graphics::ManagedSurface &surface) override; diff --git a/engines/mutationofjb/widgets/inventorywidget.cpp b/engines/mutationofjb/widgets/inventorywidget.cpp index 46bfab9c34..851f8af9d0 100644 --- a/engines/mutationofjb/widgets/inventorywidget.cpp +++ b/engines/mutationofjb/widgets/inventorywidget.cpp @@ -23,11 +23,14 @@ #include "mutationofjb/widgets/inventorywidget.h" #include "mutationofjb/game.h" #include "mutationofjb/gamedata.h" -#include "mutationofjb/gui.h" +#include "mutationofjb/gamescreen.h" #include "mutationofjb/inventory.h" + #include "common/str.h" #include "common/rect.h" #include "common/util.h" +#include "common/events.h" + #include "graphics/managed_surface.h" namespace MutationOfJB { @@ -41,18 +44,18 @@ enum { INVENTORY_ITEMS_LINES = 5 }; -InventoryWidget::InventoryWidget(Gui &gui, Gui::InventoryMap &inventoryMap, const Common::Array<Graphics::Surface> &inventorySurfaces) : +InventoryWidget::InventoryWidget(GuiScreen &gui, const Common::Array<Graphics::Surface> &inventorySurfaces) : Widget(gui, Common::Rect(INVENTORY_START_X, INVENTORY_START_Y, INVENTORY_START_X + Inventory::VISIBLE_ITEMS * INVENTORY_ITEM_WIDTH, INVENTORY_START_Y + INVENTORY_ITEM_HEIGHT)), - _inventoryMap(inventoryMap), - _surfaces(inventorySurfaces) {} + _surfaces(inventorySurfaces), + _callback(nullptr), + _hoveredItemPos(-1) {} void InventoryWidget::drawInventoryItem(Graphics::ManagedSurface &surface, const Common::String &item, int pos) { - Gui::InventoryMap::iterator it = _inventoryMap.find(item); - if (it == _inventoryMap.end()) { + const int index = _gui.getGame().getAssets().getInventoryItemDefList().findItemIndex(item); + if (index == -1) { return; } - const int index = it->_value; const int surfaceNo = index / (INVENTORY_ITEMS_LINES * INVENTORY_ITEMS_PER_LINE); const int indexInSurface = index % (INVENTORY_ITEMS_LINES * INVENTORY_ITEMS_PER_LINE); const int itemX = indexInSurface % INVENTORY_ITEMS_PER_LINE; @@ -72,4 +75,51 @@ void InventoryWidget::draw(Graphics::ManagedSurface &surface) { } } +void InventoryWidget::handleEvent(const Common::Event &event) { + if (!_callback) + return; + + Inventory &inventory = _gui.getGame().getGameData().getInventory(); + const int numItems = inventory.getItems().size(); + + switch (event.type) { + case Common::EVENT_LBUTTONDOWN: { + const int16 x = event.mouse.x; + const int16 y = event.mouse.y; + if (_area.contains(x, y)) { + int itemPos = (x - INVENTORY_START_X) / INVENTORY_ITEM_WIDTH; + if (itemPos < numItems) { + _callback->onInventoryItemClicked(this, itemPos); + } + } + break; + } + case Common::EVENT_MOUSEMOVE: { + const int16 x = event.mouse.x; + const int16 y = event.mouse.y; + + int newHoveredItemPos = -1; + if (_area.contains(x, y)) { + int itemPos = (x - INVENTORY_START_X) / INVENTORY_ITEM_WIDTH; + if (itemPos < numItems) { + newHoveredItemPos = itemPos; + + if (_hoveredItemPos != newHoveredItemPos) { + _callback->onInventoryItemHovered(this, itemPos); + } + } + } + + if (newHoveredItemPos == -1 && _hoveredItemPos != -1) { + _callback->onInventoryItemHovered(this, -1); + } + + _hoveredItemPos = newHoveredItemPos; + break; + } + default: + break; + } +} + } diff --git a/engines/mutationofjb/widgets/inventorywidget.h b/engines/mutationofjb/widgets/inventorywidget.h index f1841e8668..1819aa1821 100644 --- a/engines/mutationofjb/widgets/inventorywidget.h +++ b/engines/mutationofjb/widgets/inventorywidget.h @@ -24,7 +24,9 @@ #define MUTATIONOFJB_INVENTORYWIDGET_H #include "mutationofjb/widgets/widget.h" -#include "mutationofjb/gui.h" + +#include "common/array.h" +#include "graphics/surface.h" namespace Common { class String; @@ -32,15 +34,46 @@ class String; namespace MutationOfJB { +class InventoryWidget; + +class InventoryWidgetCallback { +public: + virtual ~InventoryWidgetCallback() {} + + /** + * Called when the user hovers an inventory item with the mouse or when stops hovering an item. + * + * @param widget Inventory widget. + * @param posInWidget Item position in the widget or -1 if none. + */ + virtual void onInventoryItemHovered(InventoryWidget *widget, int posInWidget) = 0; + + /** + * Called when the user clicks on an inventory item. + * + * @param widget Inventory widget. + * @param posInWidget Item position in the widget. + */ + virtual void onInventoryItemClicked(InventoryWidget *widget, int posInWidget) = 0; +}; + class InventoryWidget : public Widget { public: - InventoryWidget(Gui &gui, Gui::InventoryMap &inventoryMap, const Common::Array<Graphics::Surface> &inventorySurfaces); - virtual void draw(Graphics::ManagedSurface &) override; + InventoryWidget(GuiScreen &gui, const Common::Array<Graphics::Surface> &inventorySurfaces); + void setCallback(InventoryWidgetCallback *callback) { + _callback = callback; + } + + virtual void handleEvent(const Common::Event &event) override; + +protected: + virtual void draw(Graphics::ManagedSurface &surface) override; private: void drawInventoryItem(Graphics::ManagedSurface &surface, const Common::String &item, int pos); - Gui::InventoryMap &_inventoryMap; const Common::Array<Graphics::Surface> &_surfaces; + InventoryWidgetCallback *_callback; + int _hoveredItemPos; }; } diff --git a/engines/mutationofjb/widgets/widget.h b/engines/mutationofjb/widgets/widget.h index e16b1e4447..86c912a555 100644 --- a/engines/mutationofjb/widgets/widget.h +++ b/engines/mutationofjb/widgets/widget.h @@ -36,11 +36,11 @@ class ManagedSurface; namespace MutationOfJB { -class Gui; +class GuiScreen; class Widget { public: - Widget(Gui &gui, const Common::Rect &area) : _gui(gui), _area(area), _id(0), _visible(true), _dirty(true) {} + Widget(GuiScreen &gui, const Common::Rect &area) : _gui(gui), _area(area), _id(0), _visible(true), _dirty(true) {} virtual ~Widget() {} int getId() const; @@ -57,7 +57,7 @@ public: protected: virtual void draw(Graphics::ManagedSurface &) = 0; - Gui &_gui; + GuiScreen &_gui; Common::Rect _area; int _id; bool _visible; |