diff options
Diffstat (limited to 'engines/pink/objects/actors')
-rw-r--r-- | engines/pink/objects/actors/actor.cpp | 12 | ||||
-rw-r--r-- | engines/pink/objects/actors/actor.h | 6 | ||||
-rw-r--r-- | engines/pink/objects/actors/lead_actor.cpp | 91 | ||||
-rw-r--r-- | engines/pink/objects/actors/lead_actor.h | 9 | ||||
-rw-r--r-- | engines/pink/objects/actors/supporting_actor.cpp | 17 | ||||
-rw-r--r-- | engines/pink/objects/actors/supporting_actor.h | 5 |
6 files changed, 135 insertions, 5 deletions
diff --git a/engines/pink/objects/actors/actor.cpp b/engines/pink/objects/actors/actor.cpp index c6ea1dcb1c..2bd6af4f82 100644 --- a/engines/pink/objects/actors/actor.cpp +++ b/engines/pink/objects/actors/actor.cpp @@ -20,10 +20,12 @@ * */ +#include <engines/pink/constants.h> #include "actor.h" #include "engines/pink/objects/pages/game_page.h" #include "lead_actor.h" #include "engines/pink/objects/actions/action.h" +#include "pink/cursor_mgr.h" namespace Pink { @@ -122,4 +124,14 @@ bool Actor::initPallete(Director *director) { return false; } +void Actor::onMouseOver(Common::Point point, CursorMgr *mgr) { + mgr->setCursor(kDefaultCursor, point); +} + +Actor::~Actor() { + for (int i = 0; i < _actions.size(); ++i) { + delete _actions[i]; + } +} + } // End of namespace Pink diff --git a/engines/pink/objects/actors/actor.h b/engines/pink/objects/actors/actor.h index 1d6fdf4bd4..270ac99914 100644 --- a/engines/pink/objects/actors/actor.h +++ b/engines/pink/objects/actors/actor.h @@ -24,6 +24,7 @@ #define PINK_ACTOR_H #include <common/array.h> +#include <common/rect.h> #include "engines/pink/objects/object.h" namespace Pink { @@ -32,6 +33,7 @@ class GamePage; class Action; class Sequencer; class Director; +class CursorMgr; class Actor : public NamedObject { public: @@ -39,6 +41,7 @@ public: : _page(nullptr), _action(nullptr), _isActionEnded(1) {}; + ~Actor(); virtual void deserialize(Archive &archive); virtual void toConsole(); @@ -61,6 +64,9 @@ public: virtual void update() {}; + virtual void onMouseOver(Common::Point point, CursorMgr *mgr); + + virtual bool isClickable() { return 0;} protected: GamePage *_page; Action *_action; diff --git a/engines/pink/objects/actors/lead_actor.cpp b/engines/pink/objects/actors/lead_actor.cpp index be7dfbe879..e26b50a42c 100644 --- a/engines/pink/objects/actors/lead_actor.cpp +++ b/engines/pink/objects/actors/lead_actor.cpp @@ -29,13 +29,13 @@ #include "engines/pink/archive.h" #include "engines/pink/objects/pages/game_page.h" #include "engines/pink/pink.h" +#include "supporting_actor.h" namespace Pink { void LeadActor::deserialize(Archive &archive) { _state = kReady; Actor::deserialize(archive); - _state = kReady; _cursorMgr = static_cast<CursorMgr*>(archive.readObject()); _walkMgr = static_cast<WalkMgr*>(archive.readObject()); _sequencer = static_cast<Sequencer*>(archive.readObject()); @@ -70,18 +70,36 @@ LeadActor::State LeadActor::getState() const { void LeadActor::update() { switch (_state) { + case kReady: + + _sequencer->update(); + //fall-through intended + case kMoving: + + _cursorMgr->update(); + break; + case kInDialog1: + case kInDialog2: + _sequencer->update(); + break; + + case kInventory: + case kPDA: + break; + case kPlayingVideo: _sequencer->update(); if (!_sequencer->_context){ _state = kUnk_Loading; _page->getGame()->changeScene(_page); } - default: + break; + case kUnk_Loading: break; } } -void LeadActor::OnKeyboardButtonClick(Common::KeyCode code) { +void LeadActor::onKeyboardButtonClick(Common::KeyCode code) { switch(_state) { case kMoving: switch (code){ @@ -116,6 +134,73 @@ void LeadActor::OnKeyboardButtonClick(Common::KeyCode code) { } } +void LeadActor::start(bool isHandler) { + if (isHandler && _state != kPlayingVideo){ + _state = kReady; + } + updateCursor({0,0}); +} + +void LeadActor::onMouseMove(Common::Point point) { + if (_state != kPDA) + updateCursor(point); + else error("pda is not supported"); +} + +void LeadActor::updateCursor(Common::Point point) { + switch (_state) { + case kReady: + case kMoving: { + Director *director = _page->getGame()->getDirector(); + Actor *actor = director->getActorByPoint(point); + if (actor) + actor->onMouseOver(point, _cursorMgr); + else _cursorMgr->setCursor(kDefaultCursor, point); + break; + } + case kInDialog1: + case kInDialog2: + case kPlayingVideo: + _cursorMgr->setCursor(kNotClickableCursor, point); + break; + case kPDA: + case kInventory: + _cursorMgr->setCursor(kDefaultCursor, point); + break; + default: + break; + } +} + +void LeadActor::onLeftButtonClick(Common::Point point) { + switch (_state) { + case kReady: + case kMoving: { + Actor *actor = _page->getGame()->getDirector()->getActorByPoint(point); + if (this == actor){ + // inventory is not implemented + return; + } + + if (actor->isClickable() && + ((SupportingActor*) actor)->isLeftClickHandlers()) + + + + + break; + } + case kPDA: + + break; + case kInventory: + + break; + default: + break; + } +} + void ParlSqPink::toConsole() { debug("ParlSqPink: _name = %s", _name.c_str()); for (int i = 0; i < _actions.size(); ++i) { diff --git a/engines/pink/objects/actors/lead_actor.h b/engines/pink/objects/actors/lead_actor.h index 4e17bf285a..3a64893991 100644 --- a/engines/pink/objects/actors/lead_actor.h +++ b/engines/pink/objects/actors/lead_actor.h @@ -24,6 +24,7 @@ #define PINK_LEAD_ACTOR_H #include <common/keyboard.h> +#include <common/rect.h> #include "actor.h" namespace Pink { @@ -58,8 +59,14 @@ public: void start(bool isHandler); void update(); - void OnKeyboardButtonClick(Common::KeyCode code); + void onKeyboardButtonClick(Common::KeyCode code); + void onLeftButtonClick(Common::Point point); + void onMouseMove(Common::Point point); + private: + void updateCursor(Common::Point point); + + State _state; CursorMgr *_cursorMgr; WalkMgr *_walkMgr; diff --git a/engines/pink/objects/actors/supporting_actor.cpp b/engines/pink/objects/actors/supporting_actor.cpp index 2cffbf16ce..a7e1b79954 100644 --- a/engines/pink/objects/actors/supporting_actor.cpp +++ b/engines/pink/objects/actors/supporting_actor.cpp @@ -23,7 +23,8 @@ #include "supporting_actor.h" #include <engines/pink/archive.h> #include <engines/pink/objects/actions/action.h> -#include <common/debug.h> +#include <engines/pink/constants.h> +#include "pink/cursor_mgr.h" namespace Pink { @@ -42,4 +43,18 @@ void SupportingActor::toConsole() { _handlerMgr.toConsole(); } +void SupportingActor::onMouseOver(Common::Point point, CursorMgr *mgr) { + if (isLeftClickHandlers()){ + if (!_cursor.empty()){ + mgr->setCursor(_cursor, point); + } + else mgr->setCursor(kClickableFirstFrameCursor, point); + } + else Actor::onMouseOver(point, mgr); +} + +bool SupportingActor::isLeftClickHandlers() { + return _handlerMgr.isLeftClickHandler(this); +} + } // End of namespace Pink
\ No newline at end of file diff --git a/engines/pink/objects/actors/supporting_actor.h b/engines/pink/objects/actors/supporting_actor.h index a9dd69a495..bfee083dbd 100644 --- a/engines/pink/objects/actors/supporting_actor.h +++ b/engines/pink/objects/actors/supporting_actor.h @@ -33,6 +33,11 @@ public: virtual void deserialize(Archive &archive); virtual void toConsole(); + virtual void onMouseOver(Common::Point point, CursorMgr *mgr); + + virtual bool isClickable() { return 1; } + bool isLeftClickHandlers(); + private: HandlerMgr _handlerMgr; Common::String _location; |