aboutsummaryrefslogtreecommitdiff
path: root/engines/pink/sequences/sequence.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/pink/sequences/sequence.cpp')
-rw-r--r--engines/pink/sequences/sequence.cpp61
1 files changed, 57 insertions, 4 deletions
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