aboutsummaryrefslogtreecommitdiff
path: root/engines/pink/objects/actors
diff options
context:
space:
mode:
authorwhiterandrek2018-04-07 11:36:09 +0300
committerEugene Sandulenko2018-06-28 23:51:32 +0200
commitdac8d2a72b427cdecedfe4a951aa6166ce7b3720 (patch)
tree04bcc501b922dffa5d76ac1ae6a3559eddcda950 /engines/pink/objects/actors
parent78c4ed85ab7a84b18c8c7fd2e93c6bf2798acab6 (diff)
downloadscummvm-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.cpp20
-rw-r--r--engines/pink/objects/actors/actor.h4
-rw-r--r--engines/pink/objects/actors/inventory_actor.h2
-rw-r--r--engines/pink/objects/actors/lead_actor.cpp54
-rw-r--r--engines/pink/objects/actors/lead_actor.h4
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;