diff options
author | whiterandrek | 2018-04-07 11:36:09 +0300 |
---|---|---|
committer | Eugene Sandulenko | 2018-06-28 23:51:32 +0200 |
commit | dac8d2a72b427cdecedfe4a951aa6166ce7b3720 (patch) | |
tree | 04bcc501b922dffa5d76ac1ae6a3559eddcda950 /engines/pink/objects/actors | |
parent | 78c4ed85ab7a84b18c8c7fd2e93c6bf2798acab6 (diff) | |
download | scummvm-rg350-dac8d2a72b427cdecedfe4a951aa6166ce7b3720.tar.gz scummvm-rg350-dac8d2a72b427cdecedfe4a951aa6166ce7b3720.tar.bz2 scummvm-rg350-dac8d2a72b427cdecedfe4a951aa6166ce7b3720.zip |
PINK: bugfixes and added basic inventory implementation
Diffstat (limited to 'engines/pink/objects/actors')
-rw-r--r-- | engines/pink/objects/actors/actor.cpp | 20 | ||||
-rw-r--r-- | engines/pink/objects/actors/actor.h | 4 | ||||
-rw-r--r-- | engines/pink/objects/actors/inventory_actor.h | 2 | ||||
-rw-r--r-- | engines/pink/objects/actors/lead_actor.cpp | 54 | ||||
-rw-r--r-- | engines/pink/objects/actors/lead_actor.h | 4 |
5 files changed, 68 insertions, 16 deletions
diff --git a/engines/pink/objects/actors/actor.cpp b/engines/pink/objects/actors/actor.cpp index 6a20a46f41..a7717d3b70 100644 --- a/engines/pink/objects/actors/actor.cpp +++ b/engines/pink/objects/actors/actor.cpp @@ -130,9 +130,7 @@ void Actor::onMouseOver(Common::Point point, CursorMgr *mgr) { Actor::~Actor() { for (int i = 0; i < _actions.size(); ++i) { - _actions[i]->toConsole(); delete _actions[i]; - _actions[i] = nullptr; } } @@ -143,8 +141,22 @@ void Actor::loadState(Archive &archive) { } void Actor::saveState(Archive &archive) { - assert(_action); - archive.writeString(_action->getName()); + Common::String actionName; + + if (_action) + actionName = _action->getName(); + + archive.writeString(actionName); +} + +void Actor::pause() { + if (_action) + _action->pause(); +} + +void Actor::unpause() { + if (_action) + _action->unpause(); } } // End of namespace Pink diff --git a/engines/pink/objects/actors/actor.h b/engines/pink/objects/actors/actor.h index 69cf37b920..0761b8ff6f 100644 --- a/engines/pink/objects/actors/actor.h +++ b/engines/pink/objects/actors/actor.h @@ -70,6 +70,10 @@ public: virtual void onMouseOver(Common::Point point, CursorMgr *mgr); virtual bool isClickable() { return 0;} + + virtual void pause(); + virtual void unpause(); + protected: GamePage *_page; Action *_action; diff --git a/engines/pink/objects/actors/inventory_actor.h b/engines/pink/objects/actors/inventory_actor.h index 4b2b424c9d..55dd83b902 100644 --- a/engines/pink/objects/actors/inventory_actor.h +++ b/engines/pink/objects/actors/inventory_actor.h @@ -37,6 +37,8 @@ public: _actions[i]->toConsole(); } } + + void pause() {} }; } // End of namespace Pink diff --git a/engines/pink/objects/actors/lead_actor.cpp b/engines/pink/objects/actors/lead_actor.cpp index d89ecb4f87..2a0f84dbcd 100644 --- a/engines/pink/objects/actors/lead_actor.cpp +++ b/engines/pink/objects/actors/lead_actor.cpp @@ -88,6 +88,8 @@ void LeadActor::update() { break; case kInventory: + getPage()->getModule()->getInventoryMgr()->update(); + break; case kPDA: break; @@ -184,25 +186,34 @@ void LeadActor::onLeftButtonClick(Common::Point point) { case kMoving: { Actor *actor = _page->getGame()->getDirector()->getActorByPoint(point); - if (this == actor){ - // inventory is not implemented + if (this == actor) { + onClick(); return; } _recipient = (SupportingActor*) actor; if (actor->isClickable() && - _recipient->isLeftClickHandlers()){ - _state = kMoving; - _nextState = kInDialog1; - _walkMgr->start(_walkMgr->findLocation(_recipient->getLocation())); + _recipient->isLeftClickHandlers()) { + WalkLocation *location = _walkMgr->findLocation(_recipient->getLocation()); + if (location) { + _state = kMoving; + _nextState = kInDialog1; + _walkMgr->start(location); + } + else if (_state == kReady){ + if (_isHaveItem) + sendUseClickMessage(_recipient); + else sendLeftClickMessage(_recipient); + } } - break; + + break; } case kPDA: break; case kInventory: - + _page->getModule()->getInventoryMgr()->onClick(point); break; default: break; @@ -220,8 +231,9 @@ void LeadActor::onWalkEnd() { _state = kReady; _nextState = kUnk_Loading; if (_recipient && oldNextState == kInDialog1){ - // if use click not impl - sendLeftClickMessage(_recipient); + if (_isHaveItem) + sendUseClickMessage(_recipient); + else sendLeftClickMessage(_recipient); } } @@ -238,7 +250,7 @@ bool LeadActor::sendLeftClickMessage(SupportingActor *actor) { void LeadActor::onClick() { if (_isHaveItem) { _isHaveItem = false; - _nextState = _state != kMoving ? + _nextState = (_state != kMoving) ? kUnk_Loading : kReady; } else { @@ -246,10 +258,28 @@ void LeadActor::onClick() { _recipient = nullptr; _nextState = kReady; } - + if (_page->getModule()->getInventoryMgr()->start(1)){ + _stateCopy = _state; + _state = kInventory; + _page->pause(); + } } } +LeadActor::LeadActor() + : _state(kReady), _nextState(kReady), + _isHaveItem(false), _recipient(nullptr), + _cursorMgr(nullptr), _walkMgr(nullptr), + _sequencer(nullptr) +{} + +void LeadActor::onInventoryClosed(bool isItemClicked) { + _isHaveItem = isItemClicked; + _state = _stateCopy; + _stateCopy = kUnk_Loading; + _page->unpause(); +} + 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 a2c2ededab..45e27f9233 100644 --- a/engines/pink/objects/actors/lead_actor.h +++ b/engines/pink/objects/actors/lead_actor.h @@ -35,9 +35,11 @@ class WalkMgr; class Sequencer; class SupportingActor; +class InventoryItem; class LeadActor : public Actor { public: + LeadActor(); enum State { kReady = 0, kMoving = 1, @@ -67,6 +69,7 @@ public: void onMouseMove(Common::Point point); void onWalkEnd(); void onClick(); + void onInventoryClosed(bool isItemClicked); virtual void onMouseOver(Common::Point point, CursorMgr *mgr); @@ -78,6 +81,7 @@ private: State _state; State _nextState; + State _stateCopy; bool _isHaveItem; |