[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