diff options
Diffstat (limited to 'engines/pink/sequences/sequence.cpp')
-rw-r--r-- | engines/pink/sequences/sequence.cpp | 61 |
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 |