[Scummvm-git-logs] scummvm master -> f0bba695456f68e094223cac86dacaddca9f4f8d

dreammaster dreammaster at scummvm.org
Tue Mar 23 03:26:24 UTC 2021


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:
f0bba69545 ULTIMA4: Fix infinite combat loop at Shrine of Humility


Commit: f0bba695456f68e094223cac86dacaddca9f4f8d
    https://github.com/scummvm/scummvm/commit/f0bba695456f68e094223cac86dacaddca9f4f8d
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-03-22T20:25:41-07:00

Commit Message:
ULTIMA4: Fix infinite combat loop at Shrine of Humility

Changed paths:
    engines/ultima/ultima4/controllers/combat_controller.cpp
    engines/ultima/ultima4/controllers/controller.h
    engines/ultima/ultima4/controllers/game_controller.cpp
    engines/ultima/ultima4/controllers/game_controller.h


diff --git a/engines/ultima/ultima4/controllers/combat_controller.cpp b/engines/ultima/ultima4/controllers/combat_controller.cpp
index ce6f01e7ec..179b2cd920 100644
--- a/engines/ultima/ultima4/controllers/combat_controller.cpp
+++ b/engines/ultima/ultima4/controllers/combat_controller.cpp
@@ -320,10 +320,8 @@ void CombatController::end(bool adjustKarma) {
 			g_context->_location->_map->removeObject(_creature);
 
 		g_death->start(5);
-	}
-
-	else {
 
+	} else {
 		/* need to get this here because when we exit to the parent map, all the monsters are cleared */
 		bool won = isWon();
 
@@ -396,8 +394,8 @@ void CombatController::end(bool adjustKarma) {
 			g_context->_location->_map->removeObject(_creature);
 
 		/* Make sure finishturn only happens if a new combat has not begun */
-		if (! eventHandler->getController()->isCombatController())
-			g_context->_location->_turnCompleter->finishTurn();
+		if (!eventHandler->getController()->isCombatController())
+			g_context->_location->_turnCompleter->finishTurnAfterCombatEnds();
 	}
 
 	delete this;
diff --git a/engines/ultima/ultima4/controllers/controller.h b/engines/ultima/ultima4/controllers/controller.h
index 6b8d5927a2..67a5319c33 100644
--- a/engines/ultima/ultima4/controllers/controller.h
+++ b/engines/ultima/ultima4/controllers/controller.h
@@ -156,6 +156,10 @@ public:
 	virtual ~TurnCompleter() {
 	}
 	virtual void finishTurn() = 0;
+
+	virtual void finishTurnAfterCombatEnds() {
+		finishTurn();
+	}
 };
 
 } // End of namespace Ultima4
diff --git a/engines/ultima/ultima4/controllers/game_controller.cpp b/engines/ultima/ultima4/controllers/game_controller.cpp
index f60cbd5e28..cae641b0ef 100644
--- a/engines/ultima/ultima4/controllers/game_controller.cpp
+++ b/engines/ultima/ultima4/controllers/game_controller.cpp
@@ -53,7 +53,9 @@ static const MouseArea MOUSE_AREAS[] = {
 	{ 0, { { 0, 0 }, { 0, 0 }, { 0, 0 } }, MC_NORTH, DIR_NONE }
 };
 
-GameController::GameController() : _mapArea(BORDER_WIDTH, BORDER_HEIGHT, VIEWPORT_W, VIEWPORT_H), _paused(false), _pausedTimer(0) {
+GameController::GameController() :
+		_mapArea(BORDER_WIDTH, BORDER_HEIGHT, VIEWPORT_W, VIEWPORT_H),
+		_paused(false), _combatFinished(false), _pausedTimer(0) {
 	g_game = this;
 }
 
@@ -215,19 +217,26 @@ void GameController::finishTurn() {
 			// apply effects from tile avatar is standing on
 			g_context->_party->applyEffect(g_context->_location->_map->tileTypeAt(g_context->_location->_coords, WITH_GROUND_OBJECTS)->getEffect());
 
-			// Move creatures and see if something is attacking the avatar
-			attacker = g_context->_location->_map->moveObjects(g_context->_location->_coords);
+			// WORKAROUND: This fixes infinite combat loop at the Shrine of Humility.
+			// I presume the original had code to show the game screen after combat
+			// without doing all the end turn logic
+			if (!_combatFinished) {
+				// Move creatures and see if something is attacking the avatar
+				attacker = g_context->_location->_map->moveObjects(g_context->_location->_coords);
+
+				// Something's attacking!  Start combat!
+				if (attacker) {
+					gameCreatureAttack(attacker);
+					return;
+				}
 
-			// Something's attacking!  Start combat!
-			if (attacker) {
-				gameCreatureAttack(attacker);
-				return;
+				// cleanup old creatures and spawn new ones
+				creatureCleanup();
+				checkRandomCreatures();
+				checkBridgeTrolls();
+			} else {
+				_combatFinished = false;
 			}
-
-			// cleanup old creatures and spawn new ones
-			creatureCleanup();
-			checkRandomCreatures();
-			checkBridgeTrolls();
 		}
 
 		/* update map annotations */
diff --git a/engines/ultima/ultima4/controllers/game_controller.h b/engines/ultima/ultima4/controllers/game_controller.h
index f88b00384e..91d25fcca2 100644
--- a/engines/ultima/ultima4/controllers/game_controller.h
+++ b/engines/ultima/ultima4/controllers/game_controller.h
@@ -106,6 +106,7 @@ public:
 	TileView _mapArea;
 	bool _paused;
 	int _pausedTimer;
+	bool _combatFinished;
 public:
 	GameController();
 
@@ -144,6 +145,16 @@ public:
 	 **/
 	int exitToParentMap();
 
+	/**
+	 * Finishes the game turn after combat ends. It suppresses monster
+	 * movement to prevent issues, such as infinite combat at the
+	 * Shrine of Humility
+	 */
+	void finishTurnAfterCombatEnds() override {
+		_combatFinished = true;
+		finishTurn();
+	}
+
 	/**
 	 * Terminates a game turn.  This performs the post-turn housekeeping
 	 * tasks like adjusting the party's food, incrementing the number of




More information about the Scummvm-git-logs mailing list