From 48d34128b25a70c78bdfbcc6f15f673b643e20b1 Mon Sep 17 00:00:00 2001 From: whiterandrek Date: Wed, 28 Mar 2018 15:43:29 +0300 Subject: PINK: implemented skipping to last subsequence --- engines/pink/objects/sequences/sequence.cpp | 18 ++++++++++++++++++ engines/pink/objects/sequences/sequence.h | 3 +++ engines/pink/objects/sequences/sequence_item.cpp | 4 ++++ engines/pink/objects/sequences/sequence_item.h | 2 ++ engines/pink/objects/sequences/sequencer.cpp | 4 ++-- 5 files changed, 29 insertions(+), 2 deletions(-) (limited to 'engines/pink/objects/sequences') diff --git a/engines/pink/objects/sequences/sequence.cpp b/engines/pink/objects/sequences/sequence.cpp index 0ef7803988..070147a310 100644 --- a/engines/pink/objects/sequences/sequence.cpp +++ b/engines/pink/objects/sequences/sequence.cpp @@ -115,6 +115,24 @@ void Sequence::restart() { start(0); } +void Sequence::skipToLastSubSequence() { + if (_unk && _context->getNextItemIndex() < _items.size()){ + int i = _items.size() - 1; + while(i >= 0 && !_items[i--]->isLeader()); + assert(i >= 0); + _context->setNextItemIndex(i); + _context->clearActionsFromActorStates(); + skipItemsTo(i); + start(0); + } +} + +void Sequence::skipItemsTo(int index) { + for(int i = 0; i < index; ++i){ + _items[i]->skip(this); + } +} + void SequenceAudio::deserialize(Archive &archive) { Sequence::deserialize(archive); archive >> _sound; diff --git a/engines/pink/objects/sequences/sequence.h b/engines/pink/objects/sequences/sequence.h index 45d10e585a..1ca40799a8 100644 --- a/engines/pink/objects/sequences/sequence.h +++ b/engines/pink/objects/sequences/sequence.h @@ -49,6 +49,9 @@ public: void update(); void restart(); + void skipToLastSubSequence(); + void skipItemsTo(int index); + public: SequenceContext *_context; Sequencer *_sequencer; diff --git a/engines/pink/objects/sequences/sequence_item.cpp b/engines/pink/objects/sequences/sequence_item.cpp index 3644261c0a..f7870d3f3b 100644 --- a/engines/pink/objects/sequences/sequence_item.cpp +++ b/engines/pink/objects/sequences/sequence_item.cpp @@ -107,4 +107,8 @@ void SequenceItemDefaultAction::toConsole() { debug("\t\t\t\tSequenceItemDefaultAction: _actor=%s, _action=%s", _actor.c_str(), _action.c_str()); } +void SequenceItemDefaultAction::skip(Sequence *sequence) { + execute(0, sequence, 1); +} + } // End of namespace Pink \ No newline at end of file diff --git a/engines/pink/objects/sequences/sequence_item.h b/engines/pink/objects/sequences/sequence_item.h index 197280fb7f..f217eafd74 100644 --- a/engines/pink/objects/sequences/sequence_item.h +++ b/engines/pink/objects/sequences/sequence_item.h @@ -40,6 +40,7 @@ public: virtual bool execute(int index, Sequence *sequence, bool unk2); virtual bool isLeader(); + virtual void skip(Sequence *sequence) {}; protected: Common::String _actor; @@ -65,6 +66,7 @@ private: class SequenceItemDefaultAction : public SequenceItem { public: virtual bool execute(int index, Sequence *sequence, bool unk2); + virtual void skip(Sequence *sequence); virtual void toConsole(); }; diff --git a/engines/pink/objects/sequences/sequencer.cpp b/engines/pink/objects/sequences/sequencer.cpp index c08e7fee43..4e59f18746 100644 --- a/engines/pink/objects/sequences/sequencer.cpp +++ b/engines/pink/objects/sequences/sequencer.cpp @@ -78,7 +78,7 @@ void Sequencer::update() { void Sequencer::removeContext(SequenceContext *context) { delete _context; - _context = 0; + _context = nullptr; } void Sequencer::skipSubSequence() { @@ -91,7 +91,7 @@ void Sequencer::restartSequence() { } void Sequencer::skipToLastSubSequence() { - + _context->getSequence()->skipToLastSubSequence(); } } // End of namespace Pink \ No newline at end of file -- cgit v1.2.3