aboutsummaryrefslogtreecommitdiff
path: root/engines/mads/player.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/mads/player.cpp')
-rw-r--r--engines/mads/player.cpp82
1 files changed, 55 insertions, 27 deletions
diff --git a/engines/mads/player.cpp b/engines/mads/player.cpp
index 09a961825e..7d9a4fd8df 100644
--- a/engines/mads/player.cpp
+++ b/engines/mads/player.cpp
@@ -32,6 +32,34 @@ const int Player::_directionListIndexes[32] = {
0, 7, 4, 3, 6, 0, 2, 5, 0, 1, 9, 4, 1, 2, 7, 9, 3, 8, 9, 6, 7, 2, 3, 6, 1, 7, 9, 4, 7, 8, 0, 0
};
+/*------------------------------------------------------------------------*/
+
+void StopWalkerEntry::synchronize(Common::Serializer &s) {
+ s.syncAsSint16LE(_stack);
+ s.syncAsSint16LE(_trigger);
+}
+
+/*------------------------------------------------------------------------*/
+
+void StopWalkers::synchronize(Common::Serializer &s) {
+ StopWalkerEntry rec;
+ int count = size();
+ s.syncAsUint16LE(count);
+
+ if (s.isLoading()) {
+ clear();
+ for (int idx = 0; idx < count; ++idx) {
+ rec.synchronize(s);
+ push(rec);
+ }
+ } else {
+ for (int idx = 0; idx < count; ++idx)
+ (*this)[idx].synchronize(s);
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
Player::Player(MADSEngine *vm)
: _vm(vm) {
_action = nullptr;
@@ -69,7 +97,6 @@ Player::Player(MADSEngine *vm)
_upcomingTrigger = 0;
_trigger = 0;
_frameListIndex = 0;
- _stopWalkerIndex = 0;
_totalDistance = 0;
_distAccum = 0;
_pixelAccum = 0;
@@ -84,8 +111,6 @@ Player::Player(MADSEngine *vm)
_enableAtTarget = false;
_walkTrigger = 0;
- Common::fill(&_stopWalkerList[0], &_stopWalkerList[12], 0);
- Common::fill(&_stopWalkerTrigger[0], &_stopWalkerTrigger[12], 0);
Common::fill(&_spriteSetsPresent[0], &_spriteSetsPresent[PLAYER_SPRITES_FILE_COUNT], false);
}
@@ -256,15 +281,16 @@ void Player::updateFrame() {
if (!spriteSet._charInfo->_numEntries) {
_frameNumber = 1;
} else {
- _frameListIndex = _stopWalkerList[_stopWalkerIndex];
+ _frameListIndex = _stopWalkers.empty() ? 0 : _stopWalkers.top()._stack;
if (!_visible) {
_upcomingTrigger = 0;
} else {
- _upcomingTrigger = _stopWalkerTrigger[_stopWalkerIndex];
-
- if (_stopWalkerIndex > 0)
- --_stopWalkerIndex;
+ if (_stopWalkers.empty()) {
+ _upcomingTrigger = 0;
+ } else {
+ _upcomingTrigger = _stopWalkers.pop()._trigger;
+ }
}
// Set the player frame number
@@ -284,11 +310,20 @@ void Player::updateFrame() {
}
void Player::activateTrigger() {
- // TODO: Finish this!
- // TODO: Also sync _walkTrigger, if necessary
+ Game &game = *_vm->_game;
+ MADSAction &action = game._scene._action;
+ _commandsAllowed |= _enableAtTarget;
+ _enableAtTarget = false;
+
if (_walkTrigger) {
- _vm->_game->_trigger = _walkTrigger;
+ game._trigger = _walkTrigger;
+ game._triggerMode = SEQUENCE_TRIGGER_DAEMON;
+
+ if (game._triggerMode != SEQUENCE_TRIGGER_DAEMON) {
+ action._activeAction = _walkTriggerAction;
+ }
+
_walkTrigger = 0;
}
}
@@ -376,9 +411,7 @@ void Player::update() {
}
void Player::clearStopList() {
- _stopWalkerList[0] = 0;
- _stopWalkerTrigger[0] = 0;
- _stopWalkerIndex = 0;
+ _stopWalkers.clear();
_upcomingTrigger = 0;
_trigger = 0;
}
@@ -701,14 +734,10 @@ void Player::addWalker(int walker, int trigger) {
SpriteAsset &spriteSet = *scene._sprites[_spritesStart + _spritesIdx];
assert(spriteSet._charInfo);
- if (walker < spriteSet._charInfo->_numEntries && _stopWalkerIndex < 11) {
- ++_stopWalkerIndex;
- _stopWalkerList[_stopWalkerIndex] = walker;
- _stopWalkerTrigger[_stopWalkerIndex] = trigger;
- }
+ if (walker < spriteSet._charInfo->_numEntries)
+ _stopWalkers.push(StopWalkerEntry(walker, trigger));
}
-
/**
* Releases any sprites used by the player
*/
@@ -770,13 +799,10 @@ void Player::synchronize(Common::Serializer &s) {
s.syncAsSint16LE(_currentDepth);
s.syncAsSint16LE(_currentScale);
s.syncAsSint16LE(_frameListIndex);
+ _stopWalkers.synchronize(s);
+ _walkTriggerAction.synchronize(s);
+ s.syncAsUint16LE(_walkTriggerDest);
- for (int i = 0; i < 12; ++i) {
- s.syncAsSint16LE(_stopWalkerList[i]);
- s.syncAsSint16LE(_stopWalkerTrigger[i]);
- }
-
- s.syncAsSint16LE(_stopWalkerIndex);
s.syncAsSint16LE(_upcomingTrigger);
s.syncAsSint16LE(_trigger);
s.syncAsSint16LE(_scalingVelocity);
@@ -826,8 +852,10 @@ void Player::firstWalk(Common::Point fromPos, Facing fromFacing, Common::Point d
}
void Player::setWalkTrigger(int val) {
+ Scene &scene = _vm->_game->_scene;
_walkTrigger = val;
- warning("TODO: Player::setWalkTrigger");
+ _walkTriggerDest = _vm->_game->_triggerSetupMode;
+ _walkTriggerAction = scene._action._activeAction;
}
void Player::resetFacing(Facing facing) {