/* ResidualVM - A 3D game interpreter * * ResidualVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the AUTHORS * 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 "engines/stark/ui/actionmenu.h" #include "engines/stark/gfx/driver.h" #include "engines/stark/ui/inventorywindow.h" #include "engines/stark/resources/anim.h" #include "engines/stark/resources/item.h" #include "engines/stark/resources/knowledgeset.h" #include "engines/stark/resources/level.h" #include "engines/stark/resources/pattable.h" #include "engines/stark/services/services.h" #include "engines/stark/services/gameinterface.h" #include "engines/stark/services/staticprovider.h" #include "engines/stark/services/global.h" #include "engines/stark/scene.h" #include "engines/stark/visual/image.h" namespace Stark { ActionMenu::ActionMenu(Gfx::Driver *gfx, Cursor *cursor) : Window(gfx, cursor) { StaticProvider *staticProvider = StarkServices::instance().staticProvider; // TODO: Shouldn't use a function called getCursorImage for this, also unhardcode _background = staticProvider->getCursorImage(5); _unscaled = true; _item = nullptr; _buttons[kActionHand].action = Resources::PATTable::kActionUse; _buttons[kActionHand].rect = Common::Rect(90, 15, 126, 63); _buttons[kActionEye].action = Resources::PATTable::kActionLook; _buttons[kActionEye].rect = Common::Rect(5, 77, 51, 110); _buttons[kActionMouth].action = Resources::PATTable::kActionTalk; _buttons[kActionMouth].rect = Common::Rect(42, 35, 83, 74); clearActions(); } ActionMenu::~ActionMenu() { } void ActionMenu::open(Resources::ItemVisual *item, const Common::Point &itemRelativePos) { GameInterface *game = StarkServices::instance().gameInterface; _visible = true; Common::Point screenMousePos = getScreenMousePosition(); _position = Common::Rect::center(screenMousePos.x, screenMousePos.y, 160, 111); _itemRelativePos = itemRelativePos; _item = item; _fromInventory = item->getSubType() == Resources::Item::kItemInventory; clearActions(); Resources::ActionArray possible; if (_fromInventory) { possible = game->getActionsPossibleForObject(_item); } else { possible = game->getActionsPossibleForObject(_item, _itemRelativePos); } for (uint i = 0; i < possible.size(); i++) { enableAction(possible[i]); } if (_fromInventory) { // All inventory items can be picked up enableAction(Resources::PATTable::kActionUse); } } void ActionMenu::close() { _visible = false; _item = nullptr; } void ActionMenu::onRender() { GameInterface *game = StarkServices::instance().gameInterface; Common::Point mousePos = getMousePosition(); _background->render(Common::Point(0, 0), false); for (uint i = 0; i < ARRAYSIZE(_buttons); i++) { if (_buttons[i].enabled) { bool active = _buttons[i].rect.contains(mousePos); VisualImageXMG *visual = game->getActionImage(_buttons[i].action, active); visual->render(Common::Point(_buttons[i].rect.left, _buttons[i].rect.top), false); } } } void ActionMenu::clearActions() { for (uint i = 0; i < ARRAYSIZE(_buttons); i++) { _buttons[i].enabled = false; } } void ActionMenu::enableAction(uint32 action) { for (uint j = 0; j < ARRAYSIZE(_buttons); j++) { if (_buttons[j].action == action) { _buttons[j].enabled = true; break; } } } void ActionMenu::onMouseMove(const Common::Point &pos) { bool hoveringAction = false; for (uint i = 0; i < ARRAYSIZE(_buttons); i++) { if (_buttons[i].enabled && _buttons[i].rect.contains(pos)) { hoveringAction = true; } } if (hoveringAction) { setCursor(Cursor::kActive); } else { setCursor(Cursor::kDefault); } } void ActionMenu::onClick(const Common::Point &pos) { GameInterface *game = StarkServices::instance().gameInterface; for (uint i = 0; i < ARRAYSIZE(_buttons); i++) { if (_buttons[i].enabled && _buttons[i].rect.contains(pos)) { if (_fromInventory && i == kActionHand) { _inventory->setSelectedInventoryItem(_item->getIndex()); } else { if (_fromInventory) { game->itemDoAction(_item, _buttons[i].action); } else { game->itemDoActionAt(_item, _buttons[i].action, _itemRelativePos); } } close(); } } } void ActionMenu::setInventory(InventoryWindow *inventory) { _inventory = inventory; } } // End of namespace Stark