aboutsummaryrefslogtreecommitdiff
path: root/engines/pink/objects/sequences
diff options
context:
space:
mode:
Diffstat (limited to 'engines/pink/objects/sequences')
-rw-r--r--engines/pink/objects/sequences/seq_timer.cpp22
-rw-r--r--engines/pink/objects/sequences/seq_timer.h8
-rw-r--r--engines/pink/objects/sequences/sequence.cpp2
-rw-r--r--engines/pink/objects/sequences/sequence_item.cpp21
-rw-r--r--engines/pink/objects/sequences/sequencer.cpp33
-rw-r--r--engines/pink/objects/sequences/sequencer.h7
6 files changed, 72 insertions, 21 deletions
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 <engines/pink/archive.h>
#include "./sequencer.h"
#include <common/debug.h>
+#include <engines/pink/objects/actors/supporting_actor.h>
+#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<SupportingActor*>(_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<SequenceActorState> &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<SequenceActorState> &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<Sequence*> _sequences;
Common::String _currentSequenceName;
Common::Array<SeqTimer*> _timers;
GamePage *_page;
- int unk;
+ uint _time;
};
} // End of namespace Pink