diff options
author | whitertandrek | 2018-03-21 06:47:19 +0200 |
---|---|---|
committer | Eugene Sandulenko | 2018-06-28 23:51:32 +0200 |
commit | 43c72bc2b7623452063cc87c5bc14b0f0676b331 (patch) | |
tree | a1191a818515c76bbea5c5ac78d452fd6b6061a2 | |
parent | ac0ed1dbdd420e2a2c7b5118d29bdb47715b5a14 (diff) | |
download | scummvm-rg350-43c72bc2b7623452063cc87c5bc14b0f0676b331.tar.gz scummvm-rg350-43c72bc2b7623452063cc87c5bc14b0f0676b331.tar.bz2 scummvm-rg350-43c72bc2b7623452063cc87c5bc14b0f0676b331.zip |
PINK: added basic script implementation
-rw-r--r-- | engines/pink/actors/actor.cpp | 13 | ||||
-rw-r--r-- | engines/pink/actors/actor.h | 2 | ||||
-rw-r--r-- | engines/pink/items/sequence_item.cpp | 35 | ||||
-rw-r--r-- | engines/pink/items/sequence_item.h | 8 | ||||
-rw-r--r-- | engines/pink/items/sequence_item_default_action.cpp | 2 | ||||
-rw-r--r-- | engines/pink/items/sequence_item_leader.cpp | 2 | ||||
-rw-r--r-- | engines/pink/sequences/sequence.cpp | 61 | ||||
-rw-r--r-- | engines/pink/sequences/sequence.h | 25 | ||||
-rw-r--r-- | engines/pink/sequences/sequencer.h | 3 |
9 files changed, 132 insertions, 19 deletions
diff --git a/engines/pink/actors/actor.cpp b/engines/pink/actors/actor.cpp index fefe1f9834..c10df16919 100644 --- a/engines/pink/actors/actor.cpp +++ b/engines/pink/actors/actor.cpp @@ -75,6 +75,10 @@ void Actor::endAction() { void Actor::setAction(const Common::String &name) { Action *newAction = findAction(name); + setAction(newAction); +} + +void Actor::setAction(Action *newAction) { if (_action) { _isActionEnd = 1; _action->end(); @@ -86,4 +90,13 @@ void Actor::setAction(const Common::String &name) { } } +void Actor::setAction(Action *newAction, bool unk) { + if (unk){ + assert(0); // want to see this + _isActionEnd = 1; + _action = newAction; + } + else setAction(newAction); +} + } // End of namespace Pink diff --git a/engines/pink/actors/actor.h b/engines/pink/actors/actor.h index 83f0d8e574..040a482606 100644 --- a/engines/pink/actors/actor.h +++ b/engines/pink/actors/actor.h @@ -49,6 +49,8 @@ public: Action *findAction(const Common::String &name); void setAction(const Common::String &name); + void setAction(Action *newAction); + void setAction(Action *newAction, bool unk); protected: GamePage *_page; diff --git a/engines/pink/items/sequence_item.cpp b/engines/pink/items/sequence_item.cpp index 2a8a93f4a5..ade4e40e9d 100644 --- a/engines/pink/items/sequence_item.cpp +++ b/engines/pink/items/sequence_item.cpp @@ -21,25 +21,52 @@ */ #include <common/debug.h> +#include <engines/pink/sequences/sequence.h> +#include <engines/pink/sequences/sequencer.h> +#include <engines/pink/actions/action.h> #include "sequence_item.h" #include "../archive.h" #include "sequence_item_leader.h" #include "sequence_item_default_action.h" +#include "../page.h" +#include "../actors/actor.h" namespace Pink { void SequenceItem::deserialize(Archive &archive) { - archive >> _actor >> _action; + archive >> _actorName >> _actionName; if (!dynamic_cast<SequenceItemLeader*>(this) && !dynamic_cast<SequenceItemDefaultAction*>(this)) - debug("\t\tSequenceItem: _actor = %s, _action = %s", _actor.c_str(), _action.c_str()); + debug("\t\tSequenceItem: _actor = %s, _action = %s", _actorName.c_str(), _actionName.c_str()); } const Common::String &SequenceItem::getActor() const { - return _actor; + return _actorName; } const Common::String &SequenceItem::getAction() const { - return _action; + return _actionName; +} + +bool SequenceItem::execute(int unk, Sequence *sequence, bool unk2) { + Actor *actor; + Action *action; + if (!(actor = sequence->_sequencer->_page->findActor(_actorName)) || + !(action = actor->findAction(_actionName))) { + return false; + } + + 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 == _actorName){ + states[i]._unk = unk; + sequence->_context->_actor = dynamic_cast<SequenceItemLeader*>(this) ? + actor : sequence->_context->_actor; + // TODO change to virt call + } + } + + return true; } } // End of namespace Pink
\ No newline at end of file diff --git a/engines/pink/items/sequence_item.h b/engines/pink/items/sequence_item.h index 5cf622e115..2b6d2b9728 100644 --- a/engines/pink/items/sequence_item.h +++ b/engines/pink/items/sequence_item.h @@ -27,6 +27,8 @@ namespace Pink { +class Sequence; + class SequenceItem : public Object { public: virtual void deserialize(Archive &archive); @@ -34,9 +36,11 @@ public: const Common::String &getActor() const; const Common::String &getAction() const; + virtual bool execute(int unk, Sequence *sequence, bool unk2); + protected: - Common::String _actor; - Common::String _action; + Common::String _actorName; + Common::String _actionName; }; } diff --git a/engines/pink/items/sequence_item_default_action.cpp b/engines/pink/items/sequence_item_default_action.cpp index 279877a81b..3428639f10 100644 --- a/engines/pink/items/sequence_item_default_action.cpp +++ b/engines/pink/items/sequence_item_default_action.cpp @@ -29,7 +29,7 @@ namespace Pink { void Pink::SequenceItemDefaultAction::deserialize(Archive &archive) { SequenceItem::deserialize(archive); debug("\t\tSequenceItemDefaultAction: _actor = %s, _action = %s", - _actor.c_str(), _action.c_str()); + _actorName.c_str(), _actionName.c_str()); } } // End of namespace Pink
\ No newline at end of file diff --git a/engines/pink/items/sequence_item_leader.cpp b/engines/pink/items/sequence_item_leader.cpp index 412352a871..5e19fb4317 100644 --- a/engines/pink/items/sequence_item_leader.cpp +++ b/engines/pink/items/sequence_item_leader.cpp @@ -30,7 +30,7 @@ namespace Pink { void Pink::SequenceItemLeader::deserialize(Archive &archive) { SequenceItem::deserialize(archive); debug("\t\tSequenceItemLeader: _actor = %s, _action = %s", - _actor.c_str(), _action.c_str()); + _actorName.c_str(), _actionName.c_str()); } } //End of namespace Pink
\ No newline at end of file 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 diff --git a/engines/pink/sequences/sequence.h b/engines/pink/sequences/sequence.h index 0360f28147..02f3904d56 100644 --- a/engines/pink/sequences/sequence.h +++ b/engines/pink/sequences/sequence.h @@ -35,12 +35,19 @@ class SequenceContext; class Sequence : public NamedObject { public: virtual void deserialize(Archive &archive); + Common::Array<SequenceItem*> &getItems(); -private: + void setContext(SequenceContext *context); + void init(int unk); + void start(int unk); + +public: + SequenceContext *_context; Sequencer *_sequencer; Common::Array<SequenceItem*> _items; - //context + int _unk; + }; class SequenceActorState { @@ -49,20 +56,26 @@ public: const Common::String &getActor() const; -private: - Common::String _actor; - Common::String _unk; // ?state +public: + Common::String _actorName; + Common::String _actionName; // ?state + int _unk; }; +class Actor; class SequenceContext { public: SequenceContext(Sequence *sequence, Sequencer* sequencer); ~SequenceContext(); -private: + +public: Sequence *_sequence; Sequencer *_sequencer; + int _nextItemIndex; + Actor *_actor; Common::Array<SequenceActorState> _states; + int _unk; }; } // End of namespace Pink diff --git a/engines/pink/sequences/sequencer.h b/engines/pink/sequences/sequencer.h index e2d16cdea9..0243a4e1aa 100644 --- a/engines/pink/sequences/sequencer.h +++ b/engines/pink/sequences/sequencer.h @@ -41,13 +41,14 @@ public: Sequence* findSequence(const Common::String &name); void authorSequence(Sequence *sequence, bool unk); -private: +public: SequenceContext *_context; // unknown objects array Common::Array<Sequence*> _sequences; Common::String _currentSequenceName; //timers GamePage *_page; + int unk; }; } // End of namespace Pink |