aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/pink/actors/actor.cpp13
-rw-r--r--engines/pink/actors/actor.h2
-rw-r--r--engines/pink/items/sequence_item.cpp35
-rw-r--r--engines/pink/items/sequence_item.h8
-rw-r--r--engines/pink/items/sequence_item_default_action.cpp2
-rw-r--r--engines/pink/items/sequence_item_leader.cpp2
-rw-r--r--engines/pink/sequences/sequence.cpp61
-rw-r--r--engines/pink/sequences/sequence.h25
-rw-r--r--engines/pink/sequences/sequencer.h3
9 files changed, 132 insertions, 19 deletions
diff --git a/engines/pink/actors/actor.cpp b/engines/pink/actors/actor.cpp
index fefe1f9834..c10df16919 100644
--- a/engines/pink/actors/actor.cpp
+++ b/engines/pink/actors/actor.cpp
@@ -75,6 +75,10 @@ void Actor::endAction() {
void Actor::setAction(const Common::String &name) {
Action *newAction = findAction(name);
+ setAction(newAction);
+}
+
+void Actor::setAction(Action *newAction) {
if (_action) {
_isActionEnd = 1;
_action->end();
@@ -86,4 +90,13 @@ void Actor::setAction(const Common::String &name) {
}
}
+void Actor::setAction(Action *newAction, bool unk) {
+ if (unk){
+ assert(0); // want to see this
+ _isActionEnd = 1;
+ _action = newAction;
+ }
+ else setAction(newAction);
+}
+
} // End of namespace Pink
diff --git a/engines/pink/actors/actor.h b/engines/pink/actors/actor.h
index 83f0d8e574..040a482606 100644
--- a/engines/pink/actors/actor.h
+++ b/engines/pink/actors/actor.h
@@ -49,6 +49,8 @@ public:
Action *findAction(const Common::String &name);
void setAction(const Common::String &name);
+ void setAction(Action *newAction);
+ void setAction(Action *newAction, bool unk);
protected:
GamePage *_page;
diff --git a/engines/pink/items/sequence_item.cpp b/engines/pink/items/sequence_item.cpp
index 2a8a93f4a5..ade4e40e9d 100644
--- a/engines/pink/items/sequence_item.cpp
+++ b/engines/pink/items/sequence_item.cpp
@@ -21,25 +21,52 @@
*/
#include <common/debug.h>
+#include <engines/pink/sequences/sequence.h>
+#include <engines/pink/sequences/sequencer.h>
+#include <engines/pink/actions/action.h>
#include "sequence_item.h"
#include "../archive.h"
#include "sequence_item_leader.h"
#include "sequence_item_default_action.h"
+#include "../page.h"
+#include "../actors/actor.h"
namespace Pink {
void SequenceItem::deserialize(Archive &archive) {
- archive >> _actor >> _action;
+ archive >> _actorName >> _actionName;
if (!dynamic_cast<SequenceItemLeader*>(this) && !dynamic_cast<SequenceItemDefaultAction*>(this))
- debug("\t\tSequenceItem: _actor = %s, _action = %s", _actor.c_str(), _action.c_str());
+ debug("\t\tSequenceItem: _actor = %s, _action = %s", _actorName.c_str(), _actionName.c_str());
}
const Common::String &SequenceItem::getActor() const {
- return _actor;
+ return _actorName;
}
const Common::String &SequenceItem::getAction() const {
- return _action;
+ return _actionName;
+}
+
+bool SequenceItem::execute(int unk, Sequence *sequence, bool unk2) {
+ Actor *actor;
+ Action *action;
+ if (!(actor = sequence->_sequencer->_page->findActor(_actorName)) ||
+ !(action = actor->findAction(_actionName))) {
+ return false;
+ }
+
+ actor->setAction(action, unk2);
+ Common::Array<SequenceActorState> &states = sequence->_context->_states;
+ for (int i = 0; i < sequence->_context->_states.size(); ++i) {
+ if (states[i]._actorName == _actorName){
+ states[i]._unk = unk;
+ sequence->_context->_actor = dynamic_cast<SequenceItemLeader*>(this) ?
+ actor : sequence->_context->_actor;
+ // TODO change to virt call
+ }
+ }
+
+ return true;
}
} // End of namespace Pink \ No newline at end of file
diff --git a/engines/pink/items/sequence_item.h b/engines/pink/items/sequence_item.h
index 5cf622e115..2b6d2b9728 100644
--- a/engines/pink/items/sequence_item.h
+++ b/engines/pink/items/sequence_item.h
@@ -27,6 +27,8 @@
namespace Pink {
+class Sequence;
+
class SequenceItem : public Object {
public:
virtual void deserialize(Archive &archive);
@@ -34,9 +36,11 @@ public:
const Common::String &getActor() const;
const Common::String &getAction() const;
+ virtual bool execute(int unk, Sequence *sequence, bool unk2);
+
protected:
- Common::String _actor;
- Common::String _action;
+ Common::String _actorName;
+ Common::String _actionName;
};
}
diff --git a/engines/pink/items/sequence_item_default_action.cpp b/engines/pink/items/sequence_item_default_action.cpp
index 279877a81b..3428639f10 100644
--- a/engines/pink/items/sequence_item_default_action.cpp
+++ b/engines/pink/items/sequence_item_default_action.cpp
@@ -29,7 +29,7 @@ namespace Pink {
void Pink::SequenceItemDefaultAction::deserialize(Archive &archive) {
SequenceItem::deserialize(archive);
debug("\t\tSequenceItemDefaultAction: _actor = %s, _action = %s",
- _actor.c_str(), _action.c_str());
+ _actorName.c_str(), _actionName.c_str());
}
} // End of namespace Pink \ No newline at end of file
diff --git a/engines/pink/items/sequence_item_leader.cpp b/engines/pink/items/sequence_item_leader.cpp
index 412352a871..5e19fb4317 100644
--- a/engines/pink/items/sequence_item_leader.cpp
+++ b/engines/pink/items/sequence_item_leader.cpp
@@ -30,7 +30,7 @@ namespace Pink {
void Pink::SequenceItemLeader::deserialize(Archive &archive) {
SequenceItem::deserialize(archive);
debug("\t\tSequenceItemLeader: _actor = %s, _action = %s",
- _actor.c_str(), _action.c_str());
+ _actorName.c_str(), _actionName.c_str());
}
} //End of namespace Pink \ No newline at end of file
diff --git a/engines/pink/sequences/sequence.cpp b/engines/pink/sequences/sequence.cpp
index 0d8adc1ac4..034078f725 100644
--- a/engines/pink/sequences/sequence.cpp
+++ b/engines/pink/sequences/sequence.cpp
@@ -21,10 +21,12 @@
*/
#include <common/debug.h>
+#include <engines/pink/items/sequence_item_leader.h>
#include "sequence.h"
#include "sequencer.h"
#include "../archive.h"
-#include "../items/sequence_item.h"
+#include "../page.h"
+#include "../actors/actor.h"
namespace Pink {
@@ -39,10 +41,61 @@ Common::Array<SequenceItem*> &Sequence::getItems() {
return _items;
}
+void Sequence::setContext(SequenceContext *context) {
+ _context = context;
+}
+
+void Sequence::init(int unk) {
+ assert(_items.size());
+ assert(dynamic_cast<SequenceItemLeader*>(_items[0])); // first item must always be a leader
+ start(unk);
+}
+
+class Action;
+
+void Sequence::start(int unk) {
+ if (_context->_nextItemIndex > _items.size()){
+ debug("Sequence %s ended", _name);
+ //TODO destroy context
+ return;
+ }
+
+ if (!_items[_context->_nextItemIndex]->execute(_context->_unk, this, unk)){
+ //destroy context;
+ }
+
+ uint i;
+ for (i = _context->_nextItemIndex + 1; i <_items.size(); ++i){
+ if (dynamic_cast<SequenceItemLeader*>(_items[i]))
+ break;
+ _items[i]->execute(_context->_unk, this, unk);
+ }
+ _context->_nextItemIndex = i;
+
+
+ Common::Array<SequenceActorState> &states = _context->_states;
+ for (uint j = 0; j < states.size(); ++j) {
+ if (states[j]._unk != _context->_unk &&
+ !states[j]._actionName.empty()) {
+ Actor *actor;
+ Action *action;
+ actor = _sequencer->_page->findActor(states[j]._actorName);
+ assert(actor);
+ action = actor->findAction(states[j]._actionName);
+ assert(action);
+ actor->setAction(action, unk);
+ }
+ }
+ _context->_unk++;
+}
+
SequenceContext::SequenceContext(Sequence *sequence, Sequencer *sequencer)
- : _sequence(sequence), _sequencer(sequencer)
+ : _sequence(sequence), _sequencer(sequencer),
+ _nextItemIndex(0), _unk(1), _actor(nullptr)
{
+ sequence->setContext(this);
Common::Array<SequenceItem*> &items = sequence->getItems();
+ debug("SequenceContext for %s", _sequence->getName().c_str());
for (uint i = 0; i < items.size(); ++i) {
bool found = 0;
for (uint j = 0; j < _states.size(); ++j) {
@@ -63,11 +116,11 @@ SequenceContext::~SequenceContext() {
}
SequenceActorState::SequenceActorState(const Common::String &name)
- :_actor(name)
+ :_actorName(name), _unk(0)
{}
const Common::String &SequenceActorState::getActor() const {
- return _actor;
+ return _actorName;
}
} // End of namespace Pink \ No newline at end of file
diff --git a/engines/pink/sequences/sequence.h b/engines/pink/sequences/sequence.h
index 0360f28147..02f3904d56 100644
--- a/engines/pink/sequences/sequence.h
+++ b/engines/pink/sequences/sequence.h
@@ -35,12 +35,19 @@ class SequenceContext;
class Sequence : public NamedObject {
public:
virtual void deserialize(Archive &archive);
+
Common::Array<SequenceItem*> &getItems();
-private:
+ void setContext(SequenceContext *context);
+ void init(int unk);
+ void start(int unk);
+
+public:
+ SequenceContext *_context;
Sequencer *_sequencer;
Common::Array<SequenceItem*> _items;
- //context
+ int _unk;
+
};
class SequenceActorState {
@@ -49,20 +56,26 @@ public:
const Common::String &getActor() const;
-private:
- Common::String _actor;
- Common::String _unk; // ?state
+public:
+ Common::String _actorName;
+ Common::String _actionName; // ?state
+ int _unk;
};
+class Actor;
class SequenceContext {
public:
SequenceContext(Sequence *sequence, Sequencer* sequencer);
~SequenceContext();
-private:
+
+public:
Sequence *_sequence;
Sequencer *_sequencer;
+ int _nextItemIndex;
+ Actor *_actor;
Common::Array<SequenceActorState> _states;
+ int _unk;
};
} // End of namespace Pink
diff --git a/engines/pink/sequences/sequencer.h b/engines/pink/sequences/sequencer.h
index e2d16cdea9..0243a4e1aa 100644
--- a/engines/pink/sequences/sequencer.h
+++ b/engines/pink/sequences/sequencer.h
@@ -41,13 +41,14 @@ public:
Sequence* findSequence(const Common::String &name);
void authorSequence(Sequence *sequence, bool unk);
-private:
+public:
SequenceContext *_context;
// unknown objects array
Common::Array<Sequence*> _sequences;
Common::String _currentSequenceName;
//timers
GamePage *_page;
+ int unk;
};
} // End of namespace Pink