From c36fb36afba47f52c1f81f1df61eb31838134cd2 Mon Sep 17 00:00:00 2001 From: Ľubomír Remák Date: Thu, 6 Sep 2018 19:38:16 +0200 Subject: MUTATIONOFJB: Add support for 'look' action on inventory items. --- engines/mutationofjb/assets.cpp | 4 + engines/mutationofjb/assets.h | 3 + engines/mutationofjb/game.cpp | 2 +- engines/mutationofjb/game.h | 6 +- engines/mutationofjb/gamescreen.cpp | 214 +++++++++++++++++ engines/mutationofjb/gamescreen.h | 84 +++++++ engines/mutationofjb/gui.cpp | 263 --------------------- engines/mutationofjb/gui.h | 90 ------- engines/mutationofjb/guiscreen.cpp | 73 ++++++ engines/mutationofjb/guiscreen.h | 88 +++++++ engines/mutationofjb/inventory.cpp | 4 +- .../mutationofjb/inventoryitemdefinitionlist.cpp | 73 ++++++ engines/mutationofjb/inventoryitemdefinitionlist.h | 50 ++++ engines/mutationofjb/module.mk | 4 +- engines/mutationofjb/mutationofjb.cpp | 4 +- engines/mutationofjb/tasks/conversationtask.cpp | 10 +- engines/mutationofjb/widgets/buttonwidget.cpp | 2 +- engines/mutationofjb/widgets/buttonwidget.h | 2 +- .../mutationofjb/widgets/conversationwidget.cpp | 4 +- engines/mutationofjb/widgets/conversationwidget.h | 2 +- engines/mutationofjb/widgets/imagewidget.cpp | 2 +- engines/mutationofjb/widgets/imagewidget.h | 2 +- engines/mutationofjb/widgets/inventorywidget.cpp | 64 ++++- engines/mutationofjb/widgets/inventorywidget.h | 41 +++- engines/mutationofjb/widgets/widget.h | 6 +- 25 files changed, 710 insertions(+), 387 deletions(-) create mode 100644 engines/mutationofjb/gamescreen.cpp create mode 100644 engines/mutationofjb/gamescreen.h delete mode 100644 engines/mutationofjb/gui.cpp delete mode 100644 engines/mutationofjb/gui.h create mode 100644 engines/mutationofjb/guiscreen.cpp create mode 100644 engines/mutationofjb/guiscreen.h create mode 100644 engines/mutationofjb/inventoryitemdefinitionlist.cpp create mode 100644 engines/mutationofjb/inventoryitemdefinitionlist.h (limited to 'engines/mutationofjb') 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/gamescreen.cpp b/engines/mutationofjb/gamescreen.cpp new file mode 100644 index 0000000000..3c007f415f --- /dev/null +++ b/engines/mutationofjb/gamescreen.cpp @@ -0,0 +1,214 @@ +/* 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/gamescreen.h" + +#include "mutationofjb/animationdecoder.h" +#include "mutationofjb/encryptedfile.h" +#include "mutationofjb/game.h" +#include "mutationofjb/gamedata.h" +#include "mutationofjb/inventory.h" +#include "mutationofjb/util.h" +#include "mutationofjb/widgets/widget.h" +#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 { + +enum ButtonType { + BUTTON_WALK = 0, + BUTTON_TALK, + BUTTON_LOOK, + BUTTON_USE, + BUTTON_PICKUP, + BUTTON_SCROLL_LEFT, + BUTTON_SCROLL_RIGHT, + BUTTON_SETTINGS, + NUM_BUTTONS +}; + +enum { + INVENTORY_START_X = 88, + INVENTORY_START_Y = 149, + INVENTORY_ITEM_WIDTH = 34, + INVENTORY_ITEM_HEIGHT = 33, + INVENTORY_ITEMS_PER_LINE = 8, + INVENTORY_ITEMS_LINES = 5, + CONVERSATION_X = 0, + CONVERSATION_Y = 139, + CONVERSATION_WIDTH = 320, + CONVERSATION_HEIGHT = 61 +}; + + +GameScreen::GameScreen(Game &game, Graphics::Screen *screen) + : GuiScreen(game, screen), + _inventoryWidget(nullptr), + _conversationWidget(nullptr) {} + +GameScreen::~GameScreen() {} + +bool GameScreen::init() { + if (!loadInventoryGfx()) { + return false; + } + + if (!loadHudGfx()) { + return false; + } + + _game.getGameData().getInventory().setObserver(this); + + // Init widgets. + + 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); + addWidget(image); + + _inventoryWidget = new InventoryWidget(*this, _inventorySurfaces); + _inventoryWidget->setCallback(this); + addWidget(_inventoryWidget); + + const Common::Rect ButtonRects[] = { + Common::Rect(0, 148, 67, 158), // Walk + Common::Rect(0, 158, 67, 168), // Talk + Common::Rect(0, 168, 67, 178), // Look + Common::Rect(0, 178, 67, 188), // Use + Common::Rect(0, 188, 67, 198), // PickUp + Common::Rect(67, 149, 88, 174), // ScrollLeft + Common::Rect(67, 174, 88, 199), // ScrollRight + Common::Rect(301, 148, 320, 200) // Settings + }; + + for (int i = 0; i < NUM_BUTTONS; ++i) { + const Graphics::Surface normalSurface = _hudSurfaces[0].getSubArea(ButtonRects[i]); + const Graphics::Surface pressedSurface = _hudSurfaces[1].getSubArea(ButtonRects[i]); + ButtonWidget *button = new ButtonWidget(*this, ButtonRects[i], normalSurface, pressedSurface); + button->setId(i); + button->setCallback(this); + 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); + addWidget(_conversationWidget); + + return true; +} + +ConversationWidget &GameScreen::getConversationWidget() { + return *_conversationWidget; +} + +class InventoryAnimationDecoderCallback : public AnimationDecoderCallback { +public: + InventoryAnimationDecoderCallback(GameScreen &gui) : _gui(gui) {} + virtual void onFrame(int frameNo, Graphics::Surface &surface) override; + virtual void onPaletteUpdated(byte palette[PALETTE_SIZE]) override; +private: + GameScreen &_gui; +}; + +void InventoryAnimationDecoderCallback::onPaletteUpdated(byte palette[PALETTE_SIZE]) { + _gui._screen->setPalette(palette + 0xC0 * 3, 0xC0, 0x20); // Load only 0x20 colors. +} + +void InventoryAnimationDecoderCallback::onFrame(int frameNo, Graphics::Surface &surface) { + if (frameNo < 3) { + Graphics::Surface outSurface; + outSurface.copyFrom(surface); + _gui._inventorySurfaces.push_back(outSurface); + } +} + +bool GameScreen::loadInventoryGfx() { + AnimationDecoder decoder("icons.dat"); + InventoryAnimationDecoderCallback callback(*this); + return decoder.decode(&callback); +} + +class HudAnimationDecoderCallback : public AnimationDecoderCallback { +public: + HudAnimationDecoderCallback(GameScreen &gui) : _gui(gui) {} + virtual void onFrame(int frameNo, Graphics::Surface &surface) override; + virtual void onPaletteUpdated(byte palette[PALETTE_SIZE]) override; +private: + GameScreen &_gui; +}; + +void HudAnimationDecoderCallback::onPaletteUpdated(byte [PALETTE_SIZE]) { +} + +void HudAnimationDecoderCallback::onFrame(int frameNo, Graphics::Surface &surface) { + if (frameNo == 0 || frameNo == 1 || frameNo == 4) { + Graphics::Surface outSurface; + outSurface.copyFrom(surface); + _gui._hudSurfaces.push_back(outSurface); + } +} + +bool GameScreen::loadHudGfx() { + AnimationDecoder decoder("room0.dat"); + HudAnimationDecoderCallback callback(*this); + return decoder.decode(&callback); +} + +void GameScreen::onInventoryChanged() { + _inventoryWidget->markDirty(); +} + +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}; + _game.setCurrentAction(actions[buttonId]); + } else if (buttonId == BUTTON_SCROLL_LEFT) { + _game.getGameData().getInventory().scrollLeft(); + } else if (buttonId == BUTTON_SCROLL_RIGHT) { + _game.getGameData().getInventory().scrollRight(); + } +} + +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/gamescreen.h b/engines/mutationofjb/gamescreen.h new file mode 100644 index 0000000000..bc70580eda --- /dev/null +++ b/engines/mutationofjb/gamescreen.h @@ -0,0 +1,84 @@ +/* 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_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" + +namespace Common { +struct Event; +} + +namespace Graphics { +class Screen; +} + +namespace MutationOfJB { + +class Game; +class Widget; +class InventoryWidget; +class ConversationWidget; + +class GameScreen : public GuiScreen, public InventoryObserver, public ButtonWidgetCallback, public InventoryWidgetCallback { +public: + friend class InventoryAnimationDecoderCallback; + friend class HudAnimationDecoderCallback; + + GameScreen(Game &game, Graphics::Screen *screen); + ~GameScreen(); + + bool init(); + + 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(); + void drawInventoryItem(const Common::String &item, int pos); + void drawInventory(); + + Common::Array _inventorySurfaces; + Common::Array _hudSurfaces; + + InventoryWidget *_inventoryWidget; + ConversationWidget *_conversationWidget; +}; + +} + +#endif diff --git a/engines/mutationofjb/gui.cpp b/engines/mutationofjb/gui.cpp deleted file mode 100644 index 7c219bc706..0000000000 --- a/engines/mutationofjb/gui.cpp +++ /dev/null @@ -1,263 +0,0 @@ -/* 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/gui.h" -#include "mutationofjb/animationdecoder.h" -#include "mutationofjb/encryptedfile.h" -#include "mutationofjb/game.h" -#include "mutationofjb/gamedata.h" -#include "mutationofjb/inventory.h" -#include "mutationofjb/util.h" -#include "mutationofjb/widgets/widget.h" -#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 { - -enum ButtonType { - BUTTON_WALK = 0, - BUTTON_TALK, - BUTTON_LOOK, - BUTTON_USE, - BUTTON_PICKUP, - BUTTON_SCROLL_LEFT, - BUTTON_SCROLL_RIGHT, - BUTTON_SETTINGS, - NUM_BUTTONS -}; - -enum { - INVENTORY_START_X = 88, - INVENTORY_START_Y = 149, - INVENTORY_ITEM_WIDTH = 34, - INVENTORY_ITEM_HEIGHT = 33, - INVENTORY_ITEMS_PER_LINE = 8, - INVENTORY_ITEMS_LINES = 5, - CONVERSATION_X = 0, - CONVERSATION_Y = 139, - CONVERSATION_WIDTH = 320, - CONVERSATION_HEIGHT = 61 -}; - - -Gui::Gui(Game &game, Graphics::Screen *screen) - : _game(game), - _screen(screen), - _inventoryWidget(nullptr), - _conversationWidget(nullptr) {} - -Gui::~Gui() { - for (Common::Array::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { - delete *it; - } -} - -Game &Gui::getGame() { - return _game; -} - -bool Gui::init() { - if (!loadInventoryList()) { - return false; - } - - if (!loadInventoryGfx()) { - return false; - } - - if (!loadHudGfx()) { - return false; - } - - _game.getGameData().getInventory().setObserver(this); - - // Init widgets. - - 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); - - _inventoryWidget = new InventoryWidget(*this, _inventoryItems, _inventorySurfaces); - _widgets.push_back(_inventoryWidget); - - const Common::Rect ButtonRects[] = { - Common::Rect(0, 148, 67, 158), // Walk - Common::Rect(0, 158, 67, 168), // Talk - Common::Rect(0, 168, 67, 178), // Look - Common::Rect(0, 178, 67, 188), // Use - Common::Rect(0, 188, 67, 198), // PickUp - Common::Rect(67, 149, 88, 174), // ScrollLeft - Common::Rect(67, 174, 88, 199), // ScrollRight - Common::Rect(301, 148, 320, 200) // Settings - }; - - for (int i = 0; i < NUM_BUTTONS; ++i) { - const Graphics::Surface normalSurface = _hudSurfaces[0].getSubArea(ButtonRects[i]); - const Graphics::Surface pressedSurface = _hudSurfaces[1].getSubArea(ButtonRects[i]); - ButtonWidget *button = new ButtonWidget(*this, ButtonRects[i], normalSurface, pressedSurface); - button->setId(i); - button->setCallback(this); - _widgets.push_back(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); - - return true; -} - -void Gui::markDirty() { - for (Common::Array::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { - if ((*it)->isVisible()) { - (*it)->markDirty(); - } - } -} - -void Gui::handleEvent(const Common::Event &event) { - for (Common::Array::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { - if ((*it)->isVisible()) { - (*it)->handleEvent(event); - } - } -} - -void Gui::update() { - for (Common::Array::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { - if ((*it)->isVisible()) { - (*it)->update(*_screen); - } - } -} - -ConversationWidget &Gui::getConversationWidget() { - return *_conversationWidget; -} - -class InventoryAnimationDecoderCallback : public AnimationDecoderCallback { -public: - InventoryAnimationDecoderCallback(Gui &gui) : _gui(gui) {} - virtual void onFrame(int frameNo, Graphics::Surface &surface) override; - virtual void onPaletteUpdated(byte palette[PALETTE_SIZE]) override; -private: - Gui &_gui; -}; - -void InventoryAnimationDecoderCallback::onPaletteUpdated(byte palette[PALETTE_SIZE]) { - _gui._screen->setPalette(palette + 0xC0 * 3, 0xC0, 0x20); // Load only 0x20 colors. -} - -void InventoryAnimationDecoderCallback::onFrame(int frameNo, Graphics::Surface &surface) { - if (frameNo < 3) { - Graphics::Surface outSurface; - outSurface.copyFrom(surface); - _gui._inventorySurfaces.push_back(outSurface); - } -} - -bool Gui::loadInventoryGfx() { - AnimationDecoder decoder("icons.dat"); - InventoryAnimationDecoderCallback callback(*this); - return decoder.decode(&callback); -} - -class HudAnimationDecoderCallback : public AnimationDecoderCallback { -public: - HudAnimationDecoderCallback(Gui &gui) : _gui(gui) {} - virtual void onFrame(int frameNo, Graphics::Surface &surface) override; - virtual void onPaletteUpdated(byte palette[PALETTE_SIZE]) override; -private: - Gui &_gui; -}; - -void HudAnimationDecoderCallback::onPaletteUpdated(byte [PALETTE_SIZE]) { -} - -void HudAnimationDecoderCallback::onFrame(int frameNo, Graphics::Surface &surface) { - if (frameNo == 0 || frameNo == 1 || frameNo == 4) { - Graphics::Surface outSurface; - outSurface.copyFrom(surface); - _gui._hudSurfaces.push_back(outSurface); - } -} - -bool Gui::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() { - _inventoryWidget->markDirty(); -} - -void Gui::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}; - _game.setCurrentAction(actions[buttonId]); - } else if (buttonId == BUTTON_SCROLL_LEFT) { - _game.getGameData().getInventory().scrollLeft(); - } else if (buttonId == BUTTON_SCROLL_RIGHT) { - _game.getGameData().getInventory().scrollRight(); - } -} - -} diff --git a/engines/mutationofjb/gui.h b/engines/mutationofjb/gui.h deleted file mode 100644 index 354d04f960..0000000000 --- a/engines/mutationofjb/gui.h +++ /dev/null @@ -1,90 +0,0 @@ -/* 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_GUI_H -#define MUTATIONOFJB_GUI_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; -} - -namespace Graphics { -class Screen; -} - -namespace MutationOfJB { - -class Game; -class Widget; -class InventoryWidget; -class ConversationWidget; - -class Gui : public InventoryObserver, public ButtonWidgetCallback { -public: - typedef Common::HashMap InventoryMap; - - friend class InventoryAnimationDecoderCallback; - friend class HudAnimationDecoderCallback; - - Gui(Game &game, Graphics::Screen *screen); - ~Gui(); - Game &getGame(); - - bool init(); - void update(); - - void markDirty(); - void handleEvent(const Common::Event &event); - - virtual void onInventoryChanged() override; - virtual void onButtonClicked(ButtonWidget *) 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 _inventorySurfaces; - Common::Array _hudSurfaces; - - InventoryWidget *_inventoryWidget; - ConversationWidget *_conversationWidget; - Common::Array _widgets; -}; - -} - -#endif 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::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { + delete *it; + } +} + +Game &GuiScreen::getGame() { + return _game; +} + +void GuiScreen::markDirty() { + for (Common::Array::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { + if ((*it)->isVisible()) { + (*it)->markDirty(); + } + } +} + +void GuiScreen::handleEvent(const Common::Event &event) { + for (Common::Array::iterator it = _widgets.begin(); it != _widgets.end(); ++it) { + if ((*it)->isVisible()) { + (*it)->handleEvent(event); + } + } +} + +void GuiScreen::update() { + for (Common::Array::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 _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 InventoryMap; + +class InventoryItemDefinitionList { +public: + InventoryItemDefinitionList(); + const InventoryMap &getInventorMap() const; + + int findItemIndex(const Common::String &itemName); + +private: + bool parseFile(); + + typedef Common::HashMap 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::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 &inventorySurfaces) : +InventoryWidget::InventoryWidget(GuiScreen &gui, const Common::Array &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 &inventorySurfaces); - virtual void draw(Graphics::ManagedSurface &) override; + InventoryWidget(GuiScreen &gui, const Common::Array &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 &_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; -- cgit v1.2.3