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; | 
