diff --git a/engines/twp/actions.h b/engines/twp/actions.h index a1a5a9541fd..58a92e8e5f6 100644 --- a/engines/twp/actions.h +++ b/engines/twp/actions.h @@ -40,7 +40,8 @@ enum TwpAction { kSelectChoice6, kSelectPreviousActor, kSelectNextActor, - kSkipText + kSkipText, + kShowHotspots }; } diff --git a/engines/twp/metaengine.cpp b/engines/twp/metaengine.cpp index 5f41ee1002b..8a09dbed78f 100644 --- a/engines/twp/metaengine.cpp +++ b/engines/twp/metaengine.cpp @@ -187,6 +187,7 @@ Common::Array TwpMetaEngine::initKeymaps(const char *target) c {"SELECTNEXTACTOR", _("Select Next Actor"), Twp::kSelectNextActor, "0"}, {"SELECTPREVACTOR", _("Select Previous Actor"), Twp::kSelectPreviousActor, "9"}, {"SKIPTEXT", _("Skip Text"), Twp::kSkipText, "."}, + {"SHOWHOTSPOTS", _("Show hotspots"), Twp::kShowHotspots, "TAB"}, }; for (int i = 0; i < ARRAYSIZE(actions); i++) { diff --git a/engines/twp/scenegraph.cpp b/engines/twp/scenegraph.cpp index 7d371067b5e..e944a2ec20e 100644 --- a/engines/twp/scenegraph.cpp +++ b/engines/twp/scenegraph.cpp @@ -718,4 +718,36 @@ bool NoOverrideNode::update(float elapsed) { return true; } +HotspotMarkerNode::HotspotMarkerNode() : Node("HotspotMarker") { + _zOrder = -1000; + _visible = false; +} + +HotspotMarkerNode::~HotspotMarkerNode() {} + +void HotspotMarkerNode::drawSprite(const SpriteSheetFrame &sf, Texture *texture, Color color, Math::Matrix4 trsf) { + Math::Vector3d pos(sf.spriteSourceSize.left - sf.sourceSize.getX() / 2.f, -sf.spriteSourceSize.height() - sf.spriteSourceSize.top + sf.sourceSize.getY() / 2.f, 0.f); + trsf.translate(pos); + g_engine->getGfx().drawSprite(sf.frame, *texture, color, trsf); +} + +void HotspotMarkerNode::drawCore(Math::Matrix4 trsf) { + SpriteSheet *gameSheet = g_engine->_resManager.spriteSheet("GameSheet"); + Texture *texture = g_engine->_resManager.texture(gameSheet->meta.image); + SpriteSheetFrame *frame = &gameSheet->frameTable["hotspot_marker"]; + Color color = Color::create(255, 165, 0); + for (int i = 0; i < g_engine->_room->_layers.size(); i++) { + Layer *layer = g_engine->_room->_layers[i]; + for (int j = 0; j < layer->_objects.size(); j++) { + Object *obj = layer->_objects[j]; + if (isObject(obj->getId()) && (obj->_objType == otNone) && obj->isTouchable()) { + Math::Vector2d pos = g_engine->roomToScreen(obj->_node->getAbsPos()); + Math::Matrix4 t; + t.translate(Math::Vector3d(pos.getX(), pos.getY(), 0.f)); + drawSprite(*frame, texture, color, t); + } + } + } +} + } // namespace Twp diff --git a/engines/twp/scenegraph.h b/engines/twp/scenegraph.h index f614f22cca3..f5d5023032a 100644 --- a/engines/twp/scenegraph.h +++ b/engines/twp/scenegraph.h @@ -353,6 +353,16 @@ private: float _elapsed = 0.f; }; +class HotspotMarkerNode: public Node { +public: + HotspotMarkerNode(); + virtual ~HotspotMarkerNode(); + +private: + void drawSprite(const SpriteSheetFrame& sf, Texture* texture, Color color, Math::Matrix4 trsf); + void drawCore(Math::Matrix4 trsf) override final; +}; + } // End of namespace Twp #endif diff --git a/engines/twp/twp.cpp b/engines/twp/twp.cpp index b08ade69920..3b89bca2b6a 100644 --- a/engines/twp/twp.cpp +++ b/engines/twp/twp.cpp @@ -63,6 +63,7 @@ TwpEngine::TwpEngine(OSystem *syst, const ADGameDescription *gameDesc) _screenScene.setName("Screen"); // _scene.addChild(&_walkboxNode); // _screenScene.addChild(&_pathNode); + _screenScene.addChild(&_hotspotMarker); _screenScene.addChild(&_inputState); _screenScene.addChild(&_sentence); _screenScene.addChild(&_dialog); @@ -735,9 +736,12 @@ Common::Error TwpEngine::run() { case TwpAction::kSelectChoice6: if (_dialog.getState() == DialogState::None) { int index = (TwpAction)e.customType - kSelectChoice1; - g_engine->_dialog.choose(index); + _dialog.choose(index); } break; + case TwpAction::kShowHotspots: + _hotspotMarker.setVisible(!_hotspotMarker.isVisible()); + break; } break; } break; diff --git a/engines/twp/twp.h b/engines/twp/twp.h index e90f9b4d137..3fbf34ba123 100644 --- a/engines/twp/twp.h +++ b/engines/twp/twp.h @@ -215,6 +215,7 @@ public: AudioSystem _audio; SaveGameManager _saveGameManager; ShaderParams _shaderParams; + HotspotMarkerNode _hotspotMarker; private: Gfx _gfx;