[Scummvm-git-logs] scummvm master -> 11adaa4f3db382451e3a87bc584d722487b41465

antoniou79 a.antoniou79 at gmail.com
Thu Feb 27 18:27:46 UTC 2020


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:
11adaa4f3d BLADERUNNER: Add engine option to disable stamina drain


Commit: 11adaa4f3db382451e3a87bc584d722487b41465
    https://github.com/scummvm/scummvm/commit/11adaa4f3db382451e3a87bc584d722487b41465
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2020-02-27T20:27:29+02:00

Commit Message:
BLADERUNNER: Add engine option to disable stamina drain

Allows not having to constantly click the mouse to keep McCoy from slowing down

Even though this was a bug in the original game, having this option re-creates the original experience of McCoy running quite fast (still keeping the 30 fps limit) and not slowing down when the player stops clicking.

Changed paths:
    engines/bladerunner/actor.cpp
    engines/bladerunner/bladerunner.cpp
    engines/bladerunner/bladerunner.h
    engines/bladerunner/detection.cpp
    engines/bladerunner/detection_tables.h


diff --git a/engines/bladerunner/actor.cpp b/engines/bladerunner/actor.cpp
index 2d753be415..3eb5d6f95f 100644
--- a/engines/bladerunner/actor.cpp
+++ b/engines/bladerunner/actor.cpp
@@ -226,26 +226,32 @@ void Actor::increaseFPS() {
 	int fps = MIN(_fps + 3, 30);
 	setFPS(fps);
 
-	// Only McCoy is using the stamina timer in the game
-	if (_id == kActorMcCoy) {
-		if (_vm->_cutContent) {
-			if (_fps > 20 && oldFps < _fps) {
-				// only start the stamina timer
-				// when McCoy's fps are more than 20 fps and purely increased
-				// and only if the new drain interval is smaller than the previous one
-				// the start drain interval is supposed to be slow
-				// starting from 10 seconds and decreasing as low as 1 second
-				// (It will barely come into play basically)
-				int nextStaminaDrainInterval = (31 - _fps) * 1000;
-				if (nextStaminaDrainInterval < timerLeft(kActorTimerRunningStaminaFPS)) {
-					timerStart(kActorTimerRunningStaminaFPS, nextStaminaDrainInterval);
+	// Note: When stamina drain is disabled, McCoy returns to normal fps
+	// (which is the default for his animations ie. 15 fps)
+	// on his actor->tick() method, when he switches from running to walking animation
+	// and setFPS(-2) is called
+	if (!_vm->_disableStaminaDrain) {
+		// Only McCoy is using the stamina timer in the game
+		if (_id == kActorMcCoy) {
+			if (_vm->_cutContent) {
+				if (_fps > 20 && oldFps < _fps) {
+					// only start the stamina timer
+					// when McCOy's fps are more than 20 fps and purely increased
+					// and only if the new drain interval is smaller than the previous one
+					// the start drain interval is supposed to be slow
+					// starting from 10 seconds and decreasing as low as 1 second
+					// (It will barely come into play basically)
+					int nextStaminaDrainInterval = (31 - _fps) * 1000;
+					if (nextStaminaDrainInterval < timerLeft(kActorTimerRunningStaminaFPS)) {
+						timerStart(kActorTimerRunningStaminaFPS, nextStaminaDrainInterval);
+					}
+				}
+			} else {
+				// just prevent any rogue state for stamina timer being 0
+				// at any time when McCoy's fps get increased
+				if (timerLeft(kActorTimerRunningStaminaFPS) == 0) {
+					timerStart(kActorTimerRunningStaminaFPS, 200);
 				}
-			}
-		} else {
-			// just prevent any rogue state for stamina timer being 0
-			// at any time when McCoy's fps get increased
-			if (timerLeft(kActorTimerRunningStaminaFPS) == 0) {
-				timerStart(kActorTimerRunningStaminaFPS, 200);
 			}
 		}
 	}
@@ -318,30 +324,42 @@ void Actor::timerUpdate(int timerId) {
 			// Actor animation frame timer
 			break;
 		case kActorTimerRunningStaminaFPS:
-			if (isRunning()) {
-				if (_fps > 15) {
-					int newFps = _fps - 2;
-					if (newFps < 15) {
-						newFps = 15;
+			// If stamina drain is disabled then
+			// the timer will become zero and won't get initialized again
+			// This is better than entirely skipping updating this specific timer
+			// which would include constantly checking for it in a frequently repeated loop
+			// If stamina drain is re-enabled, the timer will get initialized
+			// either:
+			// Vanilla mode: when McCoy starts running,
+			//               or if starting new game
+			//               or if loading a game where the timer was stored as 0
+			// Restored Content mode: when McCoy starts running fast enough
+			if (!_vm->_disableStaminaDrain) {
+				if (isRunning()) {
+					if (_fps > 15) {
+						int newFps = _fps - 2;
+						if (newFps < 15) {
+							newFps = 15;
+						}
+						setFPS(newFps);
 					}
-					setFPS(newFps);
 				}
-			}
 #if BLADERUNNER_ORIGINAL_BUGS
-			_timersLeft[kActorTimerRunningStaminaFPS] = 200;
+				_timersLeft[kActorTimerRunningStaminaFPS] = 200;
 #else
-			if (_vm->_cutContent) {
-				if (isRunning()) {
-					// drain faster if closer to max fps (30), else slower
-					_timersLeft[kActorTimerRunningStaminaFPS] = (31 - _fps) * 200;
+				if (_vm->_cutContent) {
+					if (isRunning()) {
+						// drain faster if closer to max fps (30), else slower
+						_timersLeft[kActorTimerRunningStaminaFPS] = (31 - _fps) * 200;
+					} else {
+						// not running - stop the timer
+						timerReset(kActorTimerRunningStaminaFPS);
+					}
 				} else {
-					// not running - stop the timer
-					timerReset(kActorTimerRunningStaminaFPS);
+					_timersLeft[kActorTimerRunningStaminaFPS] = 200;
 				}
-			} else {
-				_timersLeft[kActorTimerRunningStaminaFPS] = 200;
-			}
 #endif // BLADERUNNER_ORIGINAL_BUGS
+			}
 			break;
 		default:
 			break;
diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp
index 7b0867c86c..75fc74cc94 100644
--- a/engines/bladerunner/bladerunner.cpp
+++ b/engines/bladerunner/bladerunner.cpp
@@ -116,6 +116,7 @@ BladeRunnerEngine::BladeRunnerEngine(OSystem *syst, const ADGameDescription *des
 	_shortyMode                   = false;
 	_noDelayMillisFramelimiter    = false;
 	_framesPerSecondMax           = false;
+	_disableStaminaDrain          = false;
 	_cutContent                   = Common::String(desc->gameId).contains("bladerunner-final");
 
 	_playerLosesControlCounter = 0;
@@ -476,11 +477,13 @@ bool BladeRunnerEngine::startup(bool hasSavegames) {
 	ConfMan.registerDefault("shorty", "false");
 	ConfMan.registerDefault("nodelaymillisfl", "false");
 	ConfMan.registerDefault("frames_per_secondfl", "false");
+	ConfMan.registerDefault("disable_stamina_drain", "false");
 
 	_sitcomMode                = ConfMan.getBool("sitcom");
 	_shortyMode                = ConfMan.getBool("shorty");
 	_noDelayMillisFramelimiter = ConfMan.getBool("nodelaymillisfl");
 	_framesPerSecondMax        = ConfMan.getBool("frames_per_secondfl");
+	_disableStaminaDrain       = ConfMan.getBool("disable_stamina_drain");
 
 	// These are static objects in original game
 	_screenEffects = new ScreenEffects(this, 0x8000);
diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h
index 45bed4d2c6..321a2cc0ca 100644
--- a/engines/bladerunner/bladerunner.h
+++ b/engines/bladerunner/bladerunner.h
@@ -216,6 +216,7 @@ public:
 	bool _shortyMode;
 	bool _noDelayMillisFramelimiter;
 	bool _framesPerSecondMax;
+	bool _disableStaminaDrain;
 	bool _cutContent;
 
 	int _walkSoundId;
diff --git a/engines/bladerunner/detection.cpp b/engines/bladerunner/detection.cpp
index c413b2b4d6..0b182dda68 100644
--- a/engines/bladerunner/detection.cpp
+++ b/engines/bladerunner/detection.cpp
@@ -78,6 +78,15 @@ static const ADExtraGuiOptionsMap optionsList[] = {
 			false
 		}
 	},
+	{
+		GAMEOPTION_DISABLE_STAMINA_DRAIN,
+		{
+			_s("Disable McCoy's quick stamina drain"),
+			_s("When running, McCoy won't start slowing down as soon as the player stops clicking the mouse"),
+			"disable_stamina_drain",
+			false
+		}
+	},
 	AD_EXTRA_GUI_OPTIONS_TERMINATOR
 };
 
diff --git a/engines/bladerunner/detection_tables.h b/engines/bladerunner/detection_tables.h
index 6ffce36725..8d5b7ec427 100644
--- a/engines/bladerunner/detection_tables.h
+++ b/engines/bladerunner/detection_tables.h
@@ -29,6 +29,7 @@
 #define GAMEOPTION_SHORTY                     GUIO_GAMEOPTIONS2
 #define GAMEOPTION_FRAMELIMITER_NODELAYMILLIS GUIO_GAMEOPTIONS3
 #define GAMEOPTION_FRAMELIMITER_FPS           GUIO_GAMEOPTIONS4
+#define GAMEOPTION_DISABLE_STAMINA_DRAIN      GUIO_GAMEOPTIONS5
 
 namespace BladeRunner {
 
@@ -41,7 +42,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::EN_ANY,
 		Common::kPlatformWindows,
 		ADGF_NO_FLAGS,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (German) - DEU
@@ -52,7 +53,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::DE_DEU,
 		Common::kPlatformWindows,
 		ADGF_NO_FLAGS,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (French) - FRA - Bug #9722
@@ -63,7 +64,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::FR_FRA,
 		Common::kPlatformWindows,
 		ADGF_NO_FLAGS,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (Italian) - ITA
@@ -74,7 +75,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::IT_ITA,
 		Common::kPlatformWindows,
 		ADGF_NO_FLAGS,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (Russian - Fargus Multimedia + Home Systems, Inc.) - RUS
@@ -85,7 +86,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::RU_RUS,
 		Common::kPlatformWindows,
 		ADGF_NO_FLAGS,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (Russian - Fargus Multimedia + Home Systems, Inc. + Siberian Studio, R3) - RUS
@@ -96,7 +97,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::RU_RUS,
 		Common::kPlatformWindows,
 		ADGF_NO_FLAGS,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (Russian - Fargus Multimedia + Home Systems, Inc. + Siberian Studio, R4) - RUS
@@ -107,7 +108,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::RU_RUS,
 		Common::kPlatformWindows,
 		ADGF_NO_FLAGS,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (Spanish) - ESP
@@ -118,7 +119,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::ES_ESP,
 		Common::kPlatformWindows,
 		ADGF_NO_FLAGS,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// Versions with restored content
@@ -131,7 +132,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::EN_ANY,
 		Common::kPlatformWindows,
 		ADGF_UNSTABLE,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (German) - DEU
@@ -142,7 +143,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::DE_DEU,
 		Common::kPlatformWindows,
 		ADGF_UNSTABLE,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (French) - FRA
@@ -153,7 +154,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::FR_FRA,
 		Common::kPlatformWindows,
 		ADGF_UNSTABLE,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (Italian) - ITA
@@ -164,7 +165,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::IT_ITA,
 		Common::kPlatformWindows,
 		ADGF_UNSTABLE,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (Russian - Fargus Multimedia + Home Systems, Inc.) - RUS
@@ -175,7 +176,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::RU_RUS,
 		Common::kPlatformWindows,
 		ADGF_UNSTABLE,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (Russian - Fargus Multimedia + Home Systems, Inc. + Siberian Studio, R3) - RUS
@@ -186,7 +187,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::RU_RUS,
 		Common::kPlatformWindows,
 		ADGF_UNSTABLE,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (Russian - Fargus Multimedia + Home Systems, Inc. + Siberian Studio, R4) - RUS
@@ -197,7 +198,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::RU_RUS,
 		Common::kPlatformWindows,
 		ADGF_UNSTABLE,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	// BladeRunner (Spanish) - ESP
@@ -208,7 +209,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::ES_ESP,
 		Common::kPlatformWindows,
 		ADGF_UNSTABLE,
-		GUIO5(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GUIO_NOMIDI)
+		GUIO6(GAMEOPTION_SITCOM, GAMEOPTION_SHORTY, GAMEOPTION_FRAMELIMITER_NODELAYMILLIS, GAMEOPTION_FRAMELIMITER_FPS, GAMEOPTION_DISABLE_STAMINA_DRAIN, GUIO_NOMIDI)
 	},
 
 	AD_TABLE_END_MARKER




More information about the Scummvm-git-logs mailing list