From cad72b1532faa96c68848392766f25a4a58398ab Mon Sep 17 00:00:00 2001 From: whiterandrek Date: Thu, 5 Apr 2018 08:15:14 +0300 Subject: PINK: basic walk, left click and seqTimer implementation --- engines/pink/objects/sequences/seq_timer.cpp | 22 +++++++++++++++- engines/pink/objects/sequences/seq_timer.h | 8 ++++-- engines/pink/objects/sequences/sequence.cpp | 2 +- engines/pink/objects/sequences/sequence_item.cpp | 21 +++++---------- engines/pink/objects/sequences/sequencer.cpp | 33 +++++++++++++++++++++++- engines/pink/objects/sequences/sequencer.h | 7 ++++- 6 files changed, 72 insertions(+), 21 deletions(-) (limited to 'engines/pink/objects/sequences') diff --git a/engines/pink/objects/sequences/seq_timer.cpp b/engines/pink/objects/sequences/seq_timer.cpp index d2b761cfed..d5029e60fb 100644 --- a/engines/pink/objects/sequences/seq_timer.cpp +++ b/engines/pink/objects/sequences/seq_timer.cpp @@ -24,11 +24,14 @@ #include #include "./sequencer.h" #include +#include +#include "pink/objects/pages/game_page.h" +#include "pink/pink.h" namespace Pink { SeqTimer::SeqTimer() - : _unk(0) { + : _updatesToMessage(0) { } @@ -43,4 +46,21 @@ void SeqTimer::toConsole() { debug("\tSeqTimer: _actor=%s _period=%u _range=%u", _actor.c_str(), _period, _range); } +void SeqTimer::update() { + Common::RandomSource &random =_sequencer->_page->getGame()->getRnd(); + if (_updatesToMessage--) + return; + + calculateUpdatesCount(); + SupportingActor *actor = static_cast(_sequencer->_page->findActor(_actor)); + if (!_sequencer->findSequenceActorState(actor->getName())){ + actor->onTimerMessage(); + } +} + +void SeqTimer::calculateUpdatesCount() { + Common::RandomSource &random =_sequencer->_page->getGame()->getRnd(); + _updatesToMessage = _range ? _period + random.getRandomNumber(_range) : _period; +} + } // End of namespace Pink \ No newline at end of file diff --git a/engines/pink/objects/sequences/seq_timer.h b/engines/pink/objects/sequences/seq_timer.h index 4319b9279a..0b961c0c25 100644 --- a/engines/pink/objects/sequences/seq_timer.h +++ b/engines/pink/objects/sequences/seq_timer.h @@ -35,12 +35,16 @@ public: virtual void deserialize(Archive &archive); virtual void toConsole(); + virtual void update(); + + private: + void calculateUpdatesCount(); Common::String _actor; + Sequencer *_sequencer; int _period; int _range; - int _unk; - Sequencer *_sequencer; + int _updatesToMessage; }; } // End of namespace Pink diff --git a/engines/pink/objects/sequences/sequence.cpp b/engines/pink/objects/sequences/sequence.cpp index 098330bf03..b95605758c 100644 --- a/engines/pink/objects/sequences/sequence.cpp +++ b/engines/pink/objects/sequences/sequence.cpp @@ -119,7 +119,7 @@ void Sequence::restart() { void Sequence::skipToLastSubSequence() { if (_unk && _context->getNextItemIndex() < _items.size()){ int i = _items.size() - 1; - while(i >= 0 && !_items[i--]->isLeader()); + while(i >= 0 && !_items[--i]->isLeader()); assert(i >= 0); _context->setNextItemIndex(i); _context->clearActionsFromActorStates(); diff --git a/engines/pink/objects/sequences/sequence_item.cpp b/engines/pink/objects/sequences/sequence_item.cpp index 5ea7b7468d..c7b5213f3e 100644 --- a/engines/pink/objects/sequences/sequence_item.cpp +++ b/engines/pink/objects/sequences/sequence_item.cpp @@ -58,14 +58,10 @@ bool SequenceItem::execute(int index, Sequence *sequence, bool unk2) { } actor->setAction(action, unk2); - Common::Array &states = sequence->_context->_states; - for (int i = 0; i < sequence->_context->_states.size(); ++i) { - if (states[i]._actorName == _actor){ - states[i]._index = index; - sequence->_context->_actor = isLeader() ? actor : sequence->_context->_actor; - break; - } - } + + SequenceActorState *state = sequence->_sequencer->findSequenceActorState(_actor); + state->_index = index; + sequence->_context->_actor = isLeader() ? actor : sequence->_context->_actor; return true; } @@ -97,13 +93,8 @@ uint32 SequenceItemLeaderAudio::getSample() { } bool SequenceItemDefaultAction::execute(int index, Sequence *sequence, bool unk2) { - Common::Array &actorStates = sequence->_context->_states; - for (int i = 0; i < actorStates.size(); ++i) { - if (actorStates[i]._actorName == _actor){ - actorStates[i]._actionName = _action; - break; - } - } + SequenceActorState *state = sequence->_sequencer->findSequenceActorState(_actor); + state->_actionName = _action; return true; } diff --git a/engines/pink/objects/sequences/sequencer.cpp b/engines/pink/objects/sequences/sequencer.cpp index 871a2e2621..f996dc1b1e 100644 --- a/engines/pink/objects/sequences/sequencer.cpp +++ b/engines/pink/objects/sequences/sequencer.cpp @@ -27,11 +27,14 @@ #include "sequence_context.h" #include "pink/objects/actors/actor.h" #include "engines/pink/archive.h" +#include "pink/objects/pages/game_page.h" +#include "pink/pink.h" +#include "pink/objects/sequences/seq_timer.h" namespace Pink { Sequencer::Sequencer(GamePage *page) - : _context(nullptr), _page(page) + : _context(nullptr), _page(page), _time(0) {} Sequencer::~Sequencer() { @@ -70,11 +73,15 @@ void Sequencer::toConsole() { for (int i = 0; i < _sequences.size(); ++i) { _sequences[i]->toConsole(); } + for (int i = 0; i < _timers.size(); ++i) { + _timers[i]->toConsole(); + } } void Sequencer::update() { if (_context) _context->_sequence->update(); + updateTimers(); } void Sequencer::removeContext(SequenceContext *context) { @@ -95,4 +102,28 @@ void Sequencer::skipToLastSubSequence() { _context->getSequence()->skipToLastSubSequence(); } +void Sequencer::updateTimers() { + uint time = _page->getGame()->getTotalPlayTime(); + if (time - _time <= 0x64) { + return; + } + + _time = time; + for (int i = 0; i < _timers.size(); ++i) { + _timers[i]->update(); + } +} + +SequenceActorState *Sequencer::findSequenceActorState(const Common::String &name) { + if (!_context) + return nullptr; + + for (int i = 0; i < _context->_states.size(); ++i) { + if (_context->_states[i].getActor() == name) + return &_context->_states[i]; + } + + return nullptr; +} + } // End of namespace Pink \ No newline at end of file diff --git a/engines/pink/objects/sequences/sequencer.h b/engines/pink/objects/sequences/sequencer.h index f453ffbf22..1ae4689114 100644 --- a/engines/pink/objects/sequences/sequencer.h +++ b/engines/pink/objects/sequences/sequencer.h @@ -33,6 +33,7 @@ class Sequence; class SequenceContext; class GamePage; class SeqTimer; +class SequenceActorState; class Sequencer : public Object { public: @@ -43,6 +44,8 @@ public: virtual void deserialize(Archive &archive); Sequence* findSequence(const Common::String &name); + SequenceActorState *findSequenceActorState(const Common::String &name); + void authorSequence(Sequence *sequence, bool unk); void removeContext(SequenceContext *context); @@ -54,13 +57,15 @@ public: void skipToLastSubSequence(); public: + void updateTimers(); + SequenceContext *_context; // context array Common::Array _sequences; Common::String _currentSequenceName; Common::Array _timers; GamePage *_page; - int unk; + uint _time; }; } // End of namespace Pink -- cgit v1.2.3