[Scummvm-cvs-logs] scummvm master -> cf5856492c6ce1820339dd76f9d3175f9f457215

dreammaster dreammaster at scummvm.org
Thu Jan 7 08:11:58 CET 2016


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
cf5856492c MADS: Phantom: Flesh out walk triggers


Commit: cf5856492c6ce1820339dd76f9d3175f9f457215
    https://github.com/scummvm/scummvm/commit/cf5856492c6ce1820339dd76f9d3175f9f457215
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2016-01-07T18:11:24+11:00

Commit Message:
MADS: Phantom: Flesh out walk triggers

Changed paths:
    engines/mads/nebular/game_nebular.cpp
    engines/mads/phantom/game_phantom.cpp
    engines/mads/player.cpp
    engines/mads/player.h



diff --git a/engines/mads/nebular/game_nebular.cpp b/engines/mads/nebular/game_nebular.cpp
index c4b7f57..9c0acf1 100644
--- a/engines/mads/nebular/game_nebular.cpp
+++ b/engines/mads/nebular/game_nebular.cpp
@@ -827,51 +827,49 @@ void GameNebular::step() {
 	if (_player._visible && _player._stepEnabled && !_player._moving &&
 		(_player._facing == _player._turnToFacing)) {
 		if (_scene._frameStartTime >= (uint32)_globals[kWalkerTiming]) {
-			if (!_player._stopWalkerIndex) {
-				int randomVal = _vm->getRandomNumber(29999);
-				if (_globals[kSexOfRex] == REX_MALE) {
-					switch (_player._facing) {
-					case FACING_SOUTHWEST:
-					case FACING_SOUTHEAST:
-					case FACING_NORTHWEST:
-					case FACING_NORTHEAST:
-						if (randomVal < 200) {
-							_player.addWalker(-1, 0);
+			int randomVal = _vm->getRandomNumber(29999);
+			if (_globals[kSexOfRex] == REX_MALE) {
+				switch (_player._facing) {
+				case FACING_SOUTHWEST:
+				case FACING_SOUTHEAST:
+				case FACING_NORTHWEST:
+				case FACING_NORTHEAST:
+					if (randomVal < 200) {
+						_player.addWalker(-1, 0);
+						_player.addWalker(1, 0);
+					}
+					break;
+
+				case FACING_WEST:
+				case FACING_EAST:
+					if (randomVal < 500) {
+						for (int count = 0; count < 10; ++count) {
 							_player.addWalker(1, 0);
 						}
-						break;
-
-					case FACING_WEST:
-					case FACING_EAST:
-						if (randomVal < 500) {
-							for (int count = 0; count < 10; ++count) {
-								_player.addWalker(1, 0);
-							}
+					}
+					break;
+
+				case FACING_SOUTH:
+					if (randomVal < 500) {
+						for (int count = 0; count < 10; ++count) {
+							_player.addWalker((randomVal < 250) ? 1 : 2, 0);
 						}
-						break;
-
-					case FACING_SOUTH:
-						if (randomVal < 500) {
-							for (int count = 0; count < 10; ++count) {
-								_player.addWalker((randomVal < 250) ? 1 : 2, 0);
-							}
-						} else if (randomVal < 750) {
-							for (int count = 0; count < 5; ++count) {
-								_player.addWalker(1, 0);
-							}
-
-							_player.addWalker(0, 0);
-							_player.addWalker(0, 0);
-
-							for (int count = 0; count < 5; ++count) {
-								_player.addWalker(2, 0);
-							}
+					} else if (randomVal < 750) {
+						for (int count = 0; count < 5; ++count) {
+							_player.addWalker(1, 0);
 						}
-						break;
 
-					default:
-						break;
+						_player.addWalker(0, 0);
+						_player.addWalker(0, 0);
+
+						for (int count = 0; count < 5; ++count) {
+							_player.addWalker(2, 0);
+						}
 					}
+					break;
+
+				default:
+					break;
 				}
 			}
 
diff --git a/engines/mads/phantom/game_phantom.cpp b/engines/mads/phantom/game_phantom.cpp
index 27849cc..3ec3052 100644
--- a/engines/mads/phantom/game_phantom.cpp
+++ b/engines/mads/phantom/game_phantom.cpp
@@ -747,7 +747,7 @@ void GamePhantom::step() {
 	 && (_player._stepEnabled || (_vm->_gameConv->_running >= 0))
 	 && !_player._moving && (_player._facing == _player._turnToFacing)
 	 && (_scene._frameStartTime >= (uint32)_globals[kWalkerTiming])) {
-		if (!_player._stopWalkerIndex)
+		if (_player._stopWalkers.empty())
 			stopWalker();
 
 		_globals[kWalkerTiming] += 6;
diff --git a/engines/mads/player.cpp b/engines/mads/player.cpp
index 09a9618..7d9a4fd 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) {
diff --git a/engines/mads/player.h b/engines/mads/player.h
index 5500004..04b86b7 100644
--- a/engines/mads/player.h
+++ b/engines/mads/player.h
@@ -45,6 +45,23 @@ enum Facing {
 	FACING_NONE = 5, FACING_DUMMY = 0
 };
 
+struct StopWalkerEntry {
+	int _stack;
+	int _trigger;
+
+	StopWalkerEntry() : _stack(0), _trigger(0) {}
+	StopWalkerEntry(int stack, int trigger) : _stack(stack), _trigger(trigger) {}
+
+	void synchronize(Common::Serializer &s);
+};
+
+class StopWalkers : public Common::FixedStack<StopWalkerEntry, 12> {
+public:
+	StopWalkers() : Common::FixedStack<StopWalkerEntry, 12>() {}
+
+	void synchronize(Common::Serializer &s);
+};
+
 class Player {
 private:
 	static const int _directionListIndexes[32];
@@ -58,8 +75,6 @@ private:
 	int _distAccum;
 	int _pixelAccum;
 	int _deltaDistance;
-	int _stopWalkerList[12];
-	int _stopWalkerTrigger[12];
 	int _totalDistance;
 
 	void clearStopList();
@@ -138,12 +153,15 @@ public:
 	bool _readyToWalk;
 	bool _commandsAllowed;
 	bool _enableAtTarget;
-	int _stopWalkerIndex;
 	int _centerOfGravity;
 	int _currentDepth;
 	int _currentScale;
 	Common::String _spritesPrefix;
+
 	int _walkTrigger;
+	TriggerMode _walkTriggerDest;
+	ActionDetails _walkTriggerAction;
+	StopWalkers _stopWalkers;
 public:
 	Player(MADSEngine *vm);
 






More information about the Scummvm-git-logs mailing list