[Scummvm-git-logs] scummvm master -> 5026d13903bbca434d01dd6d9ad36fd436be4423

antoniou79 noreply at scummvm.org
Sun Sep 7 22:17:10 UTC 2025


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

Summary:
14bdcfc532 TSAGE: Show an error when trying to copy from empty source surface
df2fe81efc TSAGE: BLUEFORCE: Logo screens' popup prompt related fixes
a8cce54b01 TSAGE: BLUEFORCE: Fix car overlaying over scenery in scene 125
926afa65dc TSAGE: BLUEFORCE: Fix intro text message not displaying for scene 160
d2957ed175 TSAGE: BLUEFORCE: Improve code readability for transitions to/from black
3011d21c4a TSAGE: BLUEFORCE: Minor fixes for intro scenes 150 and 160
85462c9b93 TSAGE: Fix bad palette state after use of fader
991fb0f75c TSAGE: BLUEFORCE: Gun training (Scene 225) scroll fix
0a729983e5 TSAGE: BLUEFORCE: Restore missing credits line
f1261e5c71 TSAGE: BLUEFORCE: Scrolling related fix for Scene 600
84feaa94d9 TSAGE: BLUEFORCE: Fix for scrolling in scene 710 (beach)
8eb46bdbf2 TSAGE: BLUEFORCE: Minor fixes to Scene 840 (Inside Boat Rental shop)
108ecf3d62 TSAGE: Additional changes in SceneObjectList::draw()
dff86f5834 TSAGE: BLUEFORCE: Fix scene transition glitch from 160 to 200
5026d13903 TSAGE: Implement hack to smoothen scrolling


Commit: 14bdcfc532ad9cf1f52a78689230686172cb42e8
    https://github.com/scummvm/scummvm/commit/14bdcfc532ad9cf1f52a78689230686172cb42e8
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: Show an error when trying to copy from empty source surface

Otherwise, the engine would crash with segmentation fault.

This tends to happen when loading a game which was saved in certain game scenes,
which currently the game does not support well (tested with Blue Force).
More fixes are needed to the save system to support those cases, but it's still good to have an error here instead of a crash.

Changed paths:
    engines/tsage/graphics.cpp


diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp
index b31b8f2d95e..31a2c1fae47 100644
--- a/engines/tsage/graphics.cpp
+++ b/engines/tsage/graphics.cpp
@@ -487,6 +487,11 @@ void GfxSurface::copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds,
 	if (srcBounds.isEmpty())
 		return;
 
+	// Show an error if the source surface has no pixel data to copy (otherwise the app would crash with segmentation fault)
+	if (src.getPixels() == nullptr) {
+		error("GfxSurface::copyFrom() - source surface has no pixel data to copy to destination");
+	}
+
 	if (srcBounds == src.getBounds())
 		srcImage = src;
 	else {


Commit: df2fe81efc6e9eefeafd5e1c06edb6524aea825b
    https://github.com/scummvm/scummvm/commit/df2fe81efc6e9eefeafd5e1c06edb6524aea825b
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: BLUEFORCE: Logo screens' popup prompt related fixes

Clicking in the first logo screen should just skip that scene

Clicking in the second logo screen now does nothing and waits for the game prompt the user on its own. This differs from the original behavior,
but the original behavior is buggy due to also allowing the on-demand popup to come up (and subsequently may still show the automated one).

Changed paths:
    engines/tsage/blue_force/blueforce_logic.cpp
    engines/tsage/blue_force/blueforce_scenes1.cpp
    engines/tsage/core.cpp


diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp
index 4250be15e4a..e545e2f291b 100644
--- a/engines/tsage/blue_force/blueforce_logic.cpp
+++ b/engines/tsage/blue_force/blueforce_logic.cpp
@@ -128,7 +128,7 @@ Scene *BlueForceGame::createScene(int sceneNumber) {
 		// Living Room & Kitchen
 		return new Scene270();
 	case 271:
-		// Living Room & Kitchen #2
+		// Living Room & Kitchen #2 (post accident)
 		return new Scene271();
 	case 280:
 		// Bedroom Flashback cut-scene
@@ -979,24 +979,33 @@ void SceneHandlerExt::process(Event &event) {
 
 	// If the user clicks the button whilst the introduction is active, prompt for playing the game
 	if ((BF_GLOBALS._dayNumber == 0) && (event.eventType == EVENT_BUTTON_DOWN)) {
-		// Prompt user for whether to start play or watch introduction
-		BF_GLOBALS._player.enableControl();
-		BF_GLOBALS._events.setCursor(CURSOR_WALK);
-
-		int rc;
-		if (g_vm->getLanguage() == Common::ES_ESP) {
-			rc = MessageDialog::show2(ESP_WATCH_INTRO_MSG, ESP_START_PLAY_BTN_STRING, ESP_INTRODUCTION_BTN_STRING);
-		} else if (g_vm->getLanguage() == Common::RU_RUS) {
-			rc = MessageDialog::show2(RUS_WATCH_INTRO_MSG, RUS_START_PLAY_BTN_STRING, RUS_INTRODUCTION_BTN_STRING);
-		} else {
-			rc = MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING);
-		}
-		if (rc == 0) {
-			// Start the game
-			BF_GLOBALS._dayNumber = 1;
-			BF_GLOBALS._sceneManager.changeScene(190);
-		} else {
-			BF_GLOBALS._player.disableControl();
+		// Don't show this on-demand popup (ie. for the "Watch" or "Play" prompt) upon mouse click,
+		// during the Tsunami Title Screen or Tsnunami Title Screen #2.
+		// NOTE The game will automatically show this popup after a while in Tsnunami Title Screen #2 (Scene 100)
+		if (BF_GLOBALS._sceneManager._sceneNumber == 20) {
+			// Just skip the Tsunami logo scene and proceed to the next scene (100)
+			BF_GLOBALS._sceneManager.changeScene(100);
+		} else if (BF_GLOBALS._sceneManager._sceneNumber != 100) {
+			// Prompt user for whether to start play or watch introduction
+			BF_GLOBALS._player.enableControl();
+			// Set Arrow cursor for this popup prompt
+			BF_GLOBALS._events.setCursor(CURSOR_ARROW);
+
+			int rc;
+			if (g_vm->getLanguage() == Common::ES_ESP) {
+				rc = MessageDialog::show2(ESP_WATCH_INTRO_MSG, ESP_START_PLAY_BTN_STRING, ESP_INTRODUCTION_BTN_STRING);
+			} else if (g_vm->getLanguage() == Common::RU_RUS) {
+				rc = MessageDialog::show2(RUS_WATCH_INTRO_MSG, RUS_START_PLAY_BTN_STRING, RUS_INTRODUCTION_BTN_STRING);
+			} else {
+				rc = MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING);
+			}
+			if (rc == 0) {
+				// Start the game
+				BF_GLOBALS._dayNumber = 1;
+				BF_GLOBALS._sceneManager.changeScene(190);
+			} else {
+				BF_GLOBALS._player.disableControl();
+			}
 		}
 
 		event.handled = true;
diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp
index 150775b45ee..d70f113f9ba 100644
--- a/engines/tsage/blue_force/blueforce_scenes1.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes1.cpp
@@ -148,7 +148,8 @@ void Scene100::Action2::signal() {
 		} else {
 			// Prompt user for whether to start play or watch introduction
 			g_globals->_player.enableControl();
-			g_globals->_events.setCursor(CURSOR_WALK);
+			// Set Arrow cursor for this popup prompt
+			g_globals->_events.setCursor(CURSOR_ARROW);
 
 			int rc;
 			if (g_vm->getLanguage() == Common::ES_ESP) {
diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index e43a446fa9a..a7346cbc786 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -335,7 +335,7 @@ void ObjectMover::dispatch() {
 	}
 
 	_sceneObject->_regionIndex = _sceneObject->checkRegion(currPos);
-	if (!_sceneObject->_regionIndex) {
+	if (_sceneObject->_regionIndex == 0) {
 		_sceneObject->setPosition(currPos, yDiff);
 		_sceneObject->getHorizBounds();
 
@@ -3555,6 +3555,9 @@ void Player::enableControl() {
 	case GType_BlueForce:
 	case GType_Ringworld2:
 		cursor = g_globals->_events.getCursor();
+		// Avoid keeping a CURSOR_NONE cursor (which is an issue mainly when jumping to scenes via debugger)
+		if (cursor == CURSOR_NONE)
+			g_globals->_events.setCursor(CURSOR_WALK);
 		g_globals->_events.setCursor(cursor);
 
 		if (g_vm->getGameID() == GType_BlueForce && T2_GLOBALS._uiElements._active)
@@ -4442,19 +4445,24 @@ void SceneHandler::process(Event &event) {
 			g_globals->_events.setCursorFromFlag();
 	}
 
-	// Check for displaying right-click dialog
-	if ((event.eventType == EVENT_BUTTON_DOWN) && (event.btnState == BTNSHIFT_RIGHT) &&
-			g_globals->_player._uiEnabled &&
-			((g_vm->getGameID() != GType_Ringworld2) || (R2_GLOBALS._sceneManager._sceneNumber != 1330))) {
-		g_globals->_game->rightClick();
+	if (!event.handled) {
+		// Check for displaying right-click dialog
+		if ((event.eventType == EVENT_BUTTON_DOWN) && (event.btnState == BTNSHIFT_RIGHT) &&
+				g_globals->_player._uiEnabled &&
+				((g_vm->getGameID() != GType_Ringworld2) || (R2_GLOBALS._sceneManager._sceneNumber != 1330)) &&
+				((g_vm->getGameID() != GType_BlueForce) || (R2_GLOBALS._sceneManager._sceneNumber != 100))) {
+			g_globals->_game->rightClick();
 
-		event.handled = true;
-		return;
+			event.handled = true;
+			return;
+		}
 	}
 
-	// If there is an active scene, pass the event to it
-	if (g_globals->_sceneManager._scene)
-		g_globals->_sceneManager._scene->process(event);
+	if (!event.handled) {
+		// If there is an active scene, pass the event to it
+		if (g_globals->_sceneManager._scene)
+			g_globals->_sceneManager._scene->process(event);
+	}
 
 	if (!event.handled) {
 		// Separate check for F5 - Save key


Commit: a8cce54b012b1fa3b772d8b988f1bb85421f02c0
    https://github.com/scummvm/scummvm/commit/a8cce54b012b1fa3b772d8b988f1bb85421f02c0
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: BLUEFORCE: Fix car overlaying over scenery in scene 125

This is the car chase scene. The buggy car is the one that comes from the bottom left of the screen.

Changed paths:
    engines/tsage/blue_force/blueforce_scenes1.cpp


diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp
index d70f113f9ba..287735f6bbf 100644
--- a/engines/tsage/blue_force/blueforce_scenes1.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes1.cpp
@@ -2089,7 +2089,7 @@ void Scene125::Action4::signal() {
 		setDelay(180);
 		break;
 	case 1: {
-		owner->setPriority(scene->_object2._priority - 1);
+		owner->fixPriority(scene->_object2._priority + 1);
 		Common::Point destPos(66, 168);
 		NpcMover *mover = new NpcMover();
 		owner->addMover(mover, &destPos, this);


Commit: 926afa65dc0279bf534a0448d066930d394b3741
    https://github.com/scummvm/scummvm/commit/926afa65dc0279bf534a0448d066930d394b3741
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: BLUEFORCE: Fix intro text message not displaying for scene 160

This is the burial scene. This is an original game bug.

Changed paths:
    engines/tsage/blue_force/blueforce_scenes1.cpp


diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp
index 287735f6bbf..b991aeb5bd1 100644
--- a/engines/tsage/blue_force/blueforce_scenes1.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes1.cpp
@@ -2708,11 +2708,20 @@ void Scene160::Action3::signal() {
 }
 
 void Scene160::postInit(SceneObjectList *OwnerList) {
-	SceneExt::postInit();
-	loadScene(160);
 	_sceneBounds.moveTo(0, 0);
+	loadScene(160);
 
 	BF_GLOBALS._scenePalette.loadPalette(2);
+	// ORIGINAL BUG FIX
+	// A Palette refresh is required because the fader (to black) from Scene 150 wrongly set
+	// the BF_GLOBALS._scenePalette._colors.background to index 255 (instead index 19 that is expected for palette 2)
+	// The fix allows the intro scene text "Three Days Later" to become visible as intended.
+	BF_GLOBALS._scenePalette.refresh();
+
+	SceneExt::postInit();
+
+	// FIXME: This fixes an obvious glitch during scene transition.
+	clearScreen();
 
 	BF_GLOBALS._player.postInit();
 	BF_GLOBALS._player.setPosition(Common::Point(160, 100));


Commit: d2957ed175c8a118e2d79a074b8eae9ed4d4fdfa
    https://github.com/scummvm/scummvm/commit/d2957ed175c8a118e2d79a074b8eae9ed4d4fdfa
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: BLUEFORCE: Improve code readability for transitions to/from black

Changed paths:
    engines/tsage/blue_force/blueforce_scenes1.cpp
    engines/tsage/blue_force/blueforce_scenes2.cpp
    engines/tsage/blue_force/blueforce_scenes3.cpp
    engines/tsage/blue_force/blueforce_scenes5.cpp
    engines/tsage/blue_force/blueforce_scenes6.cpp
    engines/tsage/blue_force/blueforce_scenes8.cpp
    engines/tsage/blue_force/blueforce_scenes9.cpp


diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp
index b991aeb5bd1..4624d2dc224 100644
--- a/engines/tsage/blue_force/blueforce_scenes1.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes1.cpp
@@ -131,6 +131,7 @@ void Scene100::Action1::setTextStrings(const Common::String &msg1, const Common:
 void Scene100::Action2::signal() {
 	Scene100 *scene = (Scene100 *)g_globals->_sceneManager._scene;
 	static byte black[3] = {0, 0, 0};
+	static byte black2[3] = {0, 0, 0};
 
 	switch (_actionIndex++) {
 	case 0:
@@ -168,7 +169,7 @@ void Scene100::Action2::signal() {
 		}
 
 		// At this point the introduction needs to start
-		g_globals->_scenePalette.addFader(black, 1, 2, this);
+		g_globals->_scenePalette.addFader(black2, 1, 2, this);
 		break;
 	}
 	case 3:
@@ -2374,7 +2375,7 @@ void Scene140::postInit(SceneObjectList *OwnerList) {
  *--------------------------------------------------------------------------*/
 void Scene150::Action1::signal() {
 	SceneObject *owner = static_cast<SceneObject *>(this->_owner);
-	static uint32 v50B96 = 0;
+	static byte black[3] = { 0, 0, 0 };
 
 	switch (_actionIndex++) {
 	case 0:
@@ -2423,7 +2424,7 @@ void Scene150::Action1::signal() {
 		setDelay(30);
 		break;
 	case 10:
-		BF_GLOBALS._scenePalette.addFader((const byte *)&v50B96, 1, 2, this);
+		BF_GLOBALS._scenePalette.addFader(black, 1, 2, this);
 		break;
 	case 11:
 		BF_GLOBALS._sound1.play(9);
@@ -2511,8 +2512,8 @@ void Scene160::Action1::signal() {
 void Scene160::Action2::signal() {
 	Scene160 *scene = (Scene160 *)BF_GLOBALS._sceneManager._scene;
 	SceneObject *owner = static_cast<SceneObject *>(this->_owner);
-	static uint32 v50BAB = 0;
-	static uint32 v50BC3 = 0;
+	static byte black[3] = { 0, 0, 0 };
+	static byte black2[3] = { 0, 0, 0 };
 
 	switch (_actionIndex++) {
 	case 0:
@@ -2632,7 +2633,7 @@ void Scene160::Action2::signal() {
 		break;
 	case 20:
 		BF_GLOBALS._sound1.changeSound(10);
-		BF_GLOBALS._scenePalette.addFader((const byte *)&v50BAB, 1, 2, this);
+		BF_GLOBALS._scenePalette.addFader(black, 1, 2, this);
 		break;
 	case 21:
 		BF_GLOBALS._scenePalette.loadPalette(2);
@@ -2652,7 +2653,7 @@ void Scene160::Action2::signal() {
 	case 23:
 		BF_GLOBALS._scenePalette.loadPalette(2);
 		scene->loadScene(165);
-		BF_GLOBALS._scenePalette.addFader((const byte *)&v50BC3, 1, -5, this);
+		BF_GLOBALS._scenePalette.addFader(black2, 1, -5, this);
 		break;
 	case 24:
 		setDelay(900);
diff --git a/engines/tsage/blue_force/blueforce_scenes2.cpp b/engines/tsage/blue_force/blueforce_scenes2.cpp
index 31cafdf0ce4..4d8ccae7df8 100644
--- a/engines/tsage/blue_force/blueforce_scenes2.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes2.cpp
@@ -1562,12 +1562,13 @@ void Scene271::postInit(SceneObjectList *OwnerList) {
 
 	_sceneMode = 11;
 
-	static uint32 black = 0;
-	add2Faders((const byte *)&black, 2, 270, this);
+	static byte black[3] = { 0, 0, 0 };
+	add2Faders(black, 2, 270, this);
 }
 
 void Scene271::signal() {
-	static uint32 black = 0;
+	static byte black[3] = { 0, 0, 0 };
+	static byte black2[3] = { 0, 0, 0 };
 
 	switch (_sceneMode) {
 	case 10:
@@ -1644,7 +1645,7 @@ void Scene271::signal() {
 	case 2709:
 		BF_GLOBALS._sound1.play(68);
 		_sceneMode = 12;
-		addFader((const byte *)&black, 2, this);
+		addFader(black, 2, this);
 		break;
 	case 2712:
 		BF_GLOBALS._sound1.fadeOut2(NULL);
@@ -1661,7 +1662,7 @@ void Scene271::signal() {
 	case 2716:
 		BF_GLOBALS._deathReason = 24;
 		_sceneMode = 13;
-		addFader((const byte *)&black, 2, this);
+		addFader(black2, 2, this);
 		break;
 	default:
 		break;
@@ -1734,7 +1735,7 @@ void Scene271::dispatch() {
 
 void Scene280::Action1::signal() {
 	Scene280 *scene = (Scene280 *)BF_GLOBALS._sceneManager._scene;
-	static uint32 black = 0;
+	static byte black[3] = { 0, 0, 0 };
 
 	switch (_actionIndex++) {
 	case 0:
@@ -1807,7 +1808,7 @@ void Scene280::Action1::signal() {
 	case 9:
 		scene->_sceneMode = 2;
 		BF_GLOBALS._sound1.fadeOut2(NULL);
-		scene->addFader((const byte *)&black, 2, scene);
+		scene->addFader(black, 2, scene);
 
 		scene->_jake.remove();
 		scene->_mum.animate(ANIM_MODE_5, NULL);
@@ -1835,8 +1836,8 @@ void Scene280::postInit(SceneObjectList *OwnerList) {
 	_object4.setVisage(280);
 	_object4.setPosition(Common::Point(139, 141));
 
-	const uint32 black = 0;
-	add2Faders((const byte *)&black, 2, 280, this);
+	static byte black[3] = { 0, 0, 0 };
+	add2Faders(black, 2, 280, this);
 	_sceneMode = 1;
 	setAction(&_action1);
 }
diff --git a/engines/tsage/blue_force/blueforce_scenes3.cpp b/engines/tsage/blue_force/blueforce_scenes3.cpp
index 965756697fd..5eddfdc0546 100644
--- a/engines/tsage/blue_force/blueforce_scenes3.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes3.cpp
@@ -3714,7 +3714,7 @@ void Scene355::postInit(SceneObjectList *OwnerList) {
 }
 
 void Scene355::signal() {
-	static uint32 black = 0;
+	static byte black[3] = { 0, 0, 0 };
 
 	switch (_sceneMode) {
 	case 12:
@@ -3849,7 +3849,7 @@ void Scene355::signal() {
 	case 9981:
 		_sceneMode = 9994;
 		_green.animate(ANIM_MODE_5, NULL);
-		addFader((const byte *)&black, 10, this);
+		addFader(black, 10, this);
 		break;
 	case 9982:
 		_sceneMode = 9983;
diff --git a/engines/tsage/blue_force/blueforce_scenes5.cpp b/engines/tsage/blue_force/blueforce_scenes5.cpp
index 5b596538d19..dffb5158814 100644
--- a/engines/tsage/blue_force/blueforce_scenes5.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes5.cpp
@@ -2555,7 +2555,7 @@ void Scene590::postInit(SceneObjectList *OwnerList) {
 }
 
 void Scene590::signal() {
-	static uint32 black = 0;
+	static byte black[3] = { 0, 0, 0 };
 
 	switch (_sceneMode) {
 	case 1:
@@ -2577,7 +2577,7 @@ void Scene590::signal() {
 		ADD_MOVER_NULL(_laura, 0, 170);
 
 		_sceneMode = 1;
-		addFader((byte *)&black, 2, this);
+		addFader(black, 2, this);
 		break;
 	default:
 		BF_GLOBALS._player.enableControl();
diff --git a/engines/tsage/blue_force/blueforce_scenes6.cpp b/engines/tsage/blue_force/blueforce_scenes6.cpp
index ad4f1416041..6ffa81bfb6c 100644
--- a/engines/tsage/blue_force/blueforce_scenes6.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes6.cpp
@@ -151,12 +151,18 @@ void Scene620::postInit(SceneObjectList *OwnerList) {
 	BF_GLOBALS._player.setVisage(621);
 	BF_GLOBALS._player.setPosition(Common::Point(47, 96));
 
-	static const uint32 black = 0;
-	add2Faders((const byte *)&black, 2, 621, this);
+	static byte black[3] = { 0, 0, 0 };
+	add2Faders(black, 2, 621, this);
 }
 
 void Scene620::signal() {
-	static const uint32 black = 0;
+	static byte black[3] = { 0, 0, 0 };
+	static byte black2[3] = { 0, 0, 0 };
+	static byte black3[3] = { 0, 0, 0 };
+	static byte black4[3] = { 0, 0, 0 };
+	static byte black5[3] = { 0, 0, 0 };
+	static byte black6[3] = { 0, 0, 0 };
+	static byte black7[3] = { 0, 0, 0 };
 
 	switch (_sceneMode++) {
 	case 0:
@@ -172,14 +178,14 @@ void Scene620::signal() {
 	case 13:
 	case 16:
 	case 19:
-		addFader((const byte *)&black, 2, this);
+		addFader(black, 2, this);
 		break;
 	case 2:
 		BF_GLOBALS._player.remove();
 		_object1.postInit();
 		_object1.setVisage(622);
 		_object1.setPosition(Common::Point(101, 41));
-		add2Faders((const byte *)&black, 2, 622, this);
+		add2Faders(black2, 2, 622, this);
 		break;
 	case 5:
 		_object1.remove();
@@ -187,7 +193,7 @@ void Scene620::signal() {
 		_object2.postInit();
 		_object2.setVisage(623);
 		_object2.setPosition(Common::Point(216, 4));
-		add2Faders((const byte *)&black, 2, 623, this);
+		add2Faders(black3, 2, 623, this);
 		break;
 	case 6:
 		_object2.animate(ANIM_MODE_5, this);
@@ -199,7 +205,7 @@ void Scene620::signal() {
 		_object3.setVisage(624);
 		_object3.setFrame(1);
 		_object3.setPosition(Common::Point(28, 88));
-		add2Faders((const byte *)&black, 2, 624, this);
+		add2Faders(black4, 2, 624, this);
 		break;
 	case 11:
 		_object3.remove();
@@ -207,7 +213,7 @@ void Scene620::signal() {
 		_object4.postInit();
 		_object4.setVisage(625);
 		_object4.setPosition(Common::Point(168, 8));
-		add2Faders((const byte *)&black, 2, 625, this);
+		add2Faders(black5, 2, 625, this);
 		break;
 	case 14:
 		_object4.remove();
@@ -215,7 +221,7 @@ void Scene620::signal() {
 		_object5.postInit();
 		_object5.setVisage(626);
 		_object5.setPosition(Common::Point(249, 183));
-		add2Faders((const byte *)&black, 2, 626, this);
+		add2Faders(black6, 2, 626, this);
 		break;
 	case 15:
 		_object5.animate(ANIM_MODE_5, this);
@@ -226,7 +232,7 @@ void Scene620::signal() {
 		_object6.postInit();
 		_object6.setVisage(627);
 		_object6.setPosition(Common::Point(65, 24));
-		add2Faders((const byte *)&black, 2, 627, this);
+		add2Faders(black7, 2, 627, this);
 		break;
 	case 18:
 		_object6.animate(ANIM_MODE_5, this);
diff --git a/engines/tsage/blue_force/blueforce_scenes8.cpp b/engines/tsage/blue_force/blueforce_scenes8.cpp
index 88caf23e966..c2d62f675d3 100644
--- a/engines/tsage/blue_force/blueforce_scenes8.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes8.cpp
@@ -1799,18 +1799,20 @@ void Scene830::remove() {
 }
 
 void Scene830::signal() {
-	static uint32 black = 0;
+	static byte black[3] = { 0, 0, 0 };
+	static byte black2[3] = { 0, 0, 0 };
+	static byte black3[3] = { 0, 0, 0 };
 
 	switch (_sceneMode) {
 	case 11:
 		_sceneMode = 832;
 		BF_GLOBALS._scenePalette.clearListeners();
-		addFader((const byte *)&black, 5, this);
+		addFader(black, 5, this);
 		break;
 	case 12:
 		_sceneMode = 831;
 		BF_GLOBALS._scenePalette.clearListeners();
-		addFader((const byte *)&black, 5, this);
+		addFader(black2, 5, this);
 		break;
 	case 13:
 		BF_GLOBALS._sceneManager.changeScene(850);
@@ -1856,7 +1858,7 @@ void Scene830::signal() {
 	case 8300:
 		_sceneMode = 13;
 		BF_GLOBALS._scenePalette.clearListeners();
-		addFader((const byte *)&black, 5, this);
+		addFader(black3, 5, this);
 		break;
 	case 8305:
 		_object6.remove();
diff --git a/engines/tsage/blue_force/blueforce_scenes9.cpp b/engines/tsage/blue_force/blueforce_scenes9.cpp
index 0a4fec306b9..a258ba74a84 100644
--- a/engines/tsage/blue_force/blueforce_scenes9.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes9.cpp
@@ -566,7 +566,7 @@ void Scene900::postInit(SceneObjectList *OwnerList) {
 }
 
 void Scene900::signal() {
-	static uint32 v50E8B = 0;
+	static byte black[3] = { 0, 0, 0 };
 
 	switch (_sceneMode++) {
 	case 1:
@@ -616,7 +616,7 @@ void Scene900::signal() {
 			PlayerMover *mover = new PlayerMover();
 			_lyle.addMover(mover, &pt, NULL);
 			_sceneMode = 1;
-			addFader((const byte *)&v50E8B, 5, this);
+			addFader(black, 5, this);
 		} else
 			BF_GLOBALS._sceneManager.changeScene(910);
 		break;
@@ -1250,7 +1250,8 @@ void Scene910::Object13::synchronize(Serializer &s) {
 }
 
 bool Scene910::Object13::startAction(CursorType action, Event &event) {
-	static uint32 black = 0;
+	static byte black[3] = { 0, 0, 0 };
+	static byte black2[3] = { 0, 0, 0 };
 	Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene;
 
 	int8 xDiff;
@@ -1333,7 +1334,7 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) {
 						BF_GLOBALS._player.setVisage(911);
 						scene->_lyle.setVisage(912);
 					}
-					scene->transition((const byte *)&black, 25, 910, NULL, 0, 111, 112, 255, 0);
+					scene->transition(black, 25, 910, NULL, 0, 111, 112, 255, 0);
 					BF_GLOBALS._scenePalette.signalListeners();
 					// _objectList.draw();
 				} else {
@@ -1345,7 +1346,7 @@ bool Scene910::Object13::startAction(CursorType action, Event &event) {
 						BF_GLOBALS._player.disableControl();
 						BF_GLOBALS._v4CEC8 = 0;
 						scene->_sceneMode = 2;
-						scene->transition((const byte *)&black, 30, 910, scene, 0, 111, 112, 255, 0);
+						scene->transition(black2, 30, 910, scene, 0, 111, 112, 255, 0);
 					}
 				}
 			} else
@@ -1958,8 +1959,10 @@ void Scene910::synchronize(Serializer &s) {
 }
 
 void Scene910::postInit(SceneObjectList *OwnerList) {
-	uint32 unk_50E94 = 0, unk_50E90 = 0;
-	uint32 unk_50E98 = 0, unk_50E9C = 0;
+	static byte black[3] = { 0, 0, 0 };
+	static byte black2[3] = { 0, 0, 0 };
+	static byte black3[3] = { 0, 0, 0 };
+	static byte black4[3] = { 0, 0, 0 };
 
 	PalettedScene::postInit(OwnerList);
 	loadScene(910);
@@ -2156,9 +2159,9 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
 			_yellowCord.setPosition(Common::Point(291, -30));
 		_sceneMode = 11;
 		if (BF_GLOBALS._v4CEC8 == 0)
-			add2Faders((const byte *)&unk_50E94, 2, 913, this);
+			add2Faders(black, 2, 913, this);
 		else
-			add2Faders((const byte *)&unk_50E90, 2, 911, this);
+			add2Faders(black2, 2, 911, this);
 	} else {
 		BF_GLOBALS.clearFlag(gunDrawn);
 		BF_GLOBALS._player.disableControl();
@@ -2227,14 +2230,20 @@ void Scene910::postInit(SceneObjectList *OwnerList) {
 	if (BF_GLOBALS._sceneManager._previousScene != 935) {
 		_sceneMode = 11;
 		if (BF_GLOBALS._v4CEC8 == 0)
-			add2Faders((const byte *)&unk_50E9C, 10, 910, this);
+			add2Faders(black3, 10, 910, this);
 		else
-			add2Faders((const byte *)&unk_50E98, 10, 911, this);
+			add2Faders(black4, 10, 911, this);
 	}
 }
 
 void Scene910::signal() {
-	static uint32 black = 0;
+	static byte black[3] = { 0, 0, 0 };
+	static byte black2[3] = { 0, 0, 0 };
+	static byte black3[3] = { 0, 0, 0 };
+	static byte black4[3] = { 0, 0, 0 };
+	static byte black5[3] = { 0, 0, 0 };
+	static byte black6[3] = { 0, 0, 0 };
+	static byte black7[3] = { 0, 0, 0 };
 
 	switch (_sceneMode) {
 	case 2:
@@ -2243,7 +2252,7 @@ void Scene910::signal() {
 		break;
 	case 3:
 		_sceneMode = 4;
-		transition((const byte *)&black, 35, 910, this, 0, 111, 112, 255, false);
+		transition(black, 35, 910, this, 0, 111, 112, 255, false);
 		break;
 	case 4:
 		_sceneMode = 5;
@@ -2251,7 +2260,7 @@ void Scene910::signal() {
 		break;
 	case 5:
 		_sceneMode = 6;
-		transition((const byte *)&black, 40, 910, this, 0, 111, 112, 255, false);
+		transition(black2, 40, 910, this, 0, 111, 112, 255, false);
 		break;
 	case 6:
 		_sceneMode = 7;
@@ -2262,7 +2271,7 @@ void Scene910::signal() {
 		_lyle.setVisage(811);
 		_object5.hide();
 		_sceneMode = 8;
-		transition((const byte *)&black, 95, 910, this, 0, 111, 112, 255, false);
+		transition(black3, 95, 910, this, 0, 111, 112, 255, false);
 		break;
 	case 8:
 		_sceneMode = 9;
@@ -2270,7 +2279,7 @@ void Scene910::signal() {
 		break;
 	case 9:
 		_sceneMode = 0;
-		transition((const byte *)&black, 100, 910, this, 0, 111, 112, 255, false);
+		transition(black4, 100, 910, this, 0, 111, 112, 255, false);
 		BF_GLOBALS._player.enableControl();
 		break;
 	case 10:
@@ -2280,7 +2289,7 @@ void Scene910::signal() {
 	case 11:
 		if (BF_GLOBALS._sceneManager._previousScene == 900) {
 			if (BF_GLOBALS._v4CEC8 != 0)
-				transition((const byte *)&black, 25, 910, NULL, 0, 111, 112, 255, false);
+				transition(black5, 25, 910, NULL, 0, 111, 112, 255, false);
 			if (BF_GLOBALS.getFlag(fWithLyle)) {
 				NpcMover *mover = new NpcMover();
 				Common::Point destPos(22, 157);
@@ -2318,7 +2327,7 @@ void Scene910::signal() {
 	case 16:
 		_lyle._field90 = 1;
 		_sceneMode = 10;
-		addFader((const byte *)&black, 2, this);
+		addFader(black6, 2, this);
 		BF_GLOBALS._nico910State = 1;
 		BF_GLOBALS._walkRegions.disableRegion(16);
 		BF_GLOBALS._walkRegions.disableRegion(14);
@@ -2660,7 +2669,7 @@ void Scene910::signal() {
 		break;
 	case 9140:
 		_sceneMode = 14;
-		addFader((const byte *)&black, 2, this);
+		addFader(black7, 2, this);
 		break;
 	case 9141:
 		BF_INVENTORY.setObjectScene(INV_22_SNUB, 1);
@@ -3417,7 +3426,7 @@ void Scene930::postInit(SceneObjectList *OwnerList) {
 }
 
 void Scene930::signal() {
-	static uint32 v50EC4 = 0;
+	static byte black[3] = { 0, 0, 0 };
 
 	switch (_sceneMode++) {
 	case 1:
@@ -3434,7 +3443,7 @@ void Scene930::signal() {
 		break;
 	case 3:
 		_sceneMode = 4;
-		addFader((const byte *)&v50EC4, 5, this);
+		addFader(black, 5, this);
 		break;
 	case 4:
 		BF_GLOBALS._sceneManager.changeScene(935);
@@ -3501,11 +3510,18 @@ void Scene930::synchronize(Serializer &s) {
 
 void Scene935::Action1::signal() {
 	Scene935 *scene = (Scene935 *)BF_GLOBALS._sceneManager._scene;
-	static uint32 v50ECC = 0, v50EEA = 0, v50EEE = 0, v50F26 = 0, v50F2A = 0, v50F62 = 0, v50F66 = 0, v50F6A = 0;
+	static byte black[3] = { 0, 0, 0 };
+	static byte black2[3] = { 0, 0, 0 };
+	static byte black3[3] = { 0, 0, 0 };
+	static byte black4[3] = { 0, 0, 0 };
+	static byte black5[3] = { 0, 0, 0 };
+	static byte black6[3] = { 0, 0, 0 };
+	static byte black7[3] = { 0, 0, 0 };
+	static byte black8[3] = { 0, 0, 0 };
 
 	switch (_actionIndex++) {
 	case 0:
-		scene->addFader((const byte *)&v50ECC, 100, this);
+		scene->addFader(black, 100, this);
 		break;
 	case 1:
 		if (g_vm->getLanguage() == Common::RU_RUS) {
@@ -3514,11 +3530,11 @@ void Scene935::Action1::signal() {
 			scene->_visualSpeaker.setText("Jake! Hide in the closet!");
 		}
 		for (int i = 1; i < 21; i++)
-			scene->transition((const byte *)&v50EEA, 5 * i, 935, NULL, 0, 255, 249, 255, 1);
+			scene->transition(black2, 5 * i, 935, NULL, 0, 255, 249, 255, 1);
 		setDelay(3);
 		break;
 	case 2:
-		scene->addFader((const byte *)&v50EEE, 5, this);
+		scene->addFader(black3, 5, this);
 		break;
 	case 3:
 		scene->_visualSpeaker.removeText();
@@ -3539,11 +3555,11 @@ void Scene935::Action1::signal() {
 			scene->_visualSpeaker.setText("Jake! Hide in the closet!");
 		}
 		for (int i = 1; i < 21; i++)
-			scene->transition((const byte *)&v50F26, 5 * i, 935, NULL, 0, 255, 249, 255, 1);
+			scene->transition(black4, 5 * i, 935, NULL, 0, 255, 249, 255, 1);
 		setDelay(3);
 		break;
 	case 5:
-		scene->addFader((const byte *)&v50F2A, 5, this);
+		scene->addFader(black5, 5, this);
 		break;
 	case 6:
 		scene->_visualSpeaker.removeText();
@@ -3564,11 +3580,11 @@ void Scene935::Action1::signal() {
 			scene->_visualSpeaker.setText("Jake! Hide in the closet!");
 		}
 		for (int i = 1; i < 21; i++)
-			scene->transition((const byte *)&v50F62, 5 * i, 935, NULL, 0, 255, 249, 255, 1);
+			scene->transition(black6, 5 * i, 935, NULL, 0, 255, 249, 255, 1);
 		setDelay(3);
 		break;
 	case 8:
-		scene->addFader((const byte *)&v50F66, 5, this);
+		scene->addFader(black7, 5, this);
 		break;
 	case 9:
 		scene->_visualSpeaker.removeText();
@@ -3576,7 +3592,7 @@ void Scene935::Action1::signal() {
 		break;
 	case 10:
 		scene->_sceneMode = 1;
-		scene->add2Faders((const byte *)&v50F6A, 5, 935, scene);
+		scene->add2Faders(black8, 5, 935, scene);
 		remove();
 		break;
 	default:
@@ -3608,7 +3624,7 @@ void Scene935::remove() {
 }
 
 void Scene935::signal() {
-	static uint32 v50EC8 = 0;
+	static byte black[3] = { 0, 0, 0 };
 
 	switch (_sceneMode) {
 	case 1:
@@ -3633,7 +3649,7 @@ void Scene935::signal() {
 	case 2:
 		BF_GLOBALS._sound1.play(68);
 		_sceneMode = 0;
-		addFader((const byte *)&v50EC8, 5, this);
+		addFader(black, 5, this);
 		break;
 	case 3:
 		_sceneMode = 2;


Commit: 3011d21c4ad70f546cfe3cbf06a33ae2eb1569ab
    https://github.com/scummvm/scummvm/commit/3011d21c4ad70f546cfe3cbf06a33ae2eb1569ab
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: BLUEFORCE: Minor fixes for intro scenes 150 and 160

Changed paths:
    engines/tsage/blue_force/blueforce_scenes1.cpp


diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp
index 4624d2dc224..4e5ca6e9523 100644
--- a/engines/tsage/blue_force/blueforce_scenes1.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes1.cpp
@@ -2436,8 +2436,8 @@ void Scene150::Action1::signal() {
 }
 
 void Scene150::postInit(SceneObjectList *OwnerList) {
-	SceneExt::postInit();
 	loadScene(150);
+	SceneExt::postInit();
 
 	BF_GLOBALS._player.postInit();
 	BF_GLOBALS._player.setPosition(Common::Point(160, 100));
@@ -2623,7 +2623,7 @@ void Scene160::Action2::signal() {
 		owner->animate(ANIM_MODE_5, this);
 		break;
 	case 17:
-		setDelay(70);
+		setDelay(60);
 		break;
 	case 18:
 		owner->animate(ANIM_MODE_6, this);


Commit: 85462c9b93c47771b1dd111f07bf383f20d01b34
    https://github.com/scummvm/scummvm/commit/85462c9b93c47771b1dd111f07bf383f20d01b34
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: Fix bad palette state after use of fader

Fixes a black artifact in screen 210 of Blue Force

Matches disasm

Changed paths:
    engines/tsage/core.cpp


diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index a7346cbc786..eaa2fb43a00 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -3034,6 +3034,21 @@ void SceneObjectList::draw() {
 	Common::Array<SceneObject *> objList;
 	int paneNum = 0;
 
+	// This code ensures that palette entry 0 is set to the black color
+	// and entry 255 is set to the white.
+	// This fixes a graphical artifact glitch in BlueForce intro scene 210 (Credits - Car Training)
+	// where the car would leave black spots on the screen. The bug was caused by the earlier scene (160)
+	// which uses a fader. Faders leave the game palette in a state that simply loading another palette does not fix.
+	BF_GLOBALS._scenePalette.setEntry(0, 0, 0, 0); // Black
+	BF_GLOBALS._scenePalette.setPalette(0, 1);
+
+	BF_GLOBALS._scenePalette.setEntry(255, 0xff, 0xff, 0xff);  // White
+	BF_GLOBALS._scenePalette.setPalette(255, 1);
+
+	g_globals->_sceneManager._scene->_sceneBounds.left &= ~3;
+	g_globals->_sceneManager._scene->_sceneBounds.right &= ~3;
+	g_globals->_sceneOffset.x &= ~3;
+
 	if (_objList.size() == 0) {
 		// Alternate draw mode
 


Commit: 991fb0f75c9f28ffa37a2778b3cead6f3840fc10
    https://github.com/scummvm/scummvm/commit/991fb0f75c9f28ffa37a2778b3cead6f3840fc10
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: BLUEFORCE: Gun training (Scene 225) scroll fix

Changed paths:
    engines/tsage/blue_force/blueforce_scenes2.cpp


diff --git a/engines/tsage/blue_force/blueforce_scenes2.cpp b/engines/tsage/blue_force/blueforce_scenes2.cpp
index 4d8ccae7df8..bcc209fd1c8 100644
--- a/engines/tsage/blue_force/blueforce_scenes2.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes2.cpp
@@ -450,7 +450,7 @@ void Scene225::Action1::signal() {
 		owner->setStrip(4);
 		owner->setFrame(1);
 		owner->fixPriority(116);
-		owner->animate(ANIM_MODE_1, NULL);
+		owner->animate(ANIM_MODE_1, this);
 
 		Common::Point destPos(138, 117);
 		NpcMover *mover = new NpcMover();
@@ -468,6 +468,7 @@ void Scene225::Action1::signal() {
 		owner->addMover(mover2, &destPos, this);
 
 		BF_GLOBALS._player.setPosition(Common::Point(owner->_position.x, 0));
+		BF_GLOBALS._player._moveDiff.x = 10;
 		ADD_MOVER_NULL(BF_GLOBALS._player, 500, 0);
 		break;
 	}
@@ -624,9 +625,9 @@ void Scene225::Action6::signal() {
 /*--------------------------------------------------------------------------*/
 
 void Scene225::postInit(SceneObjectList *OwnerList) {
-	SceneExt::postInit();
 	loadScene(1225);
 	loadBackground(-320, 0);
+	SceneExt::postInit();
 
 	_object8.postInit();
 	_object8.setVisage(1225);


Commit: 0a729983e5c214c8618d82d960ad75e5c48f1845
    https://github.com/scummvm/scummvm/commit/0a729983e5c214c8618d82d960ad75e5c48f1845
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: BLUEFORCE: Restore missing credits line

The "Tsage developed by" line was missing from scene 225 (credits - gun training)

Changed paths:
    engines/tsage/blue_force/blueforce_scenes2.cpp


diff --git a/engines/tsage/blue_force/blueforce_scenes2.cpp b/engines/tsage/blue_force/blueforce_scenes2.cpp
index bcc209fd1c8..38a347f1ab5 100644
--- a/engines/tsage/blue_force/blueforce_scenes2.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes2.cpp
@@ -503,6 +503,7 @@ void Scene225::Action1::signal() {
 		owner->animate(ANIM_MODE_4, 4, -1, this);
 		break;
 	case 20:
+		scene->_object21.show();
 		PaletteRotation *rot;
 		rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1);
 		rot->setDelay(10);


Commit: f1261e5c71fcf45e3d313d4cdac09dcea8f4b07c
    https://github.com/scummvm/scummvm/commit/f1261e5c71fcf45e3d313d4cdac09dcea8f4b07c
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: BLUEFORCE: Scrolling related fix for Scene 600

Changed paths:
    engines/tsage/blue_force/blueforce_logic.cpp
    engines/tsage/blue_force/blueforce_scenes6.cpp
    engines/tsage/scenes.cpp


diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp
index e545e2f291b..4599ab4c87b 100644
--- a/engines/tsage/blue_force/blueforce_logic.cpp
+++ b/engines/tsage/blue_force/blueforce_logic.cpp
@@ -781,6 +781,9 @@ void SceneExt::dispatch() {
 void SceneExt::loadScene(int sceneNum) {
 	Scene::loadScene(sceneNum);
 
+	BF_GLOBALS._sceneManager._scrollerRect.top = 0;
+	BF_GLOBALS._sceneManager._scrollerRect.bottom = 300;
+
 	BF_GLOBALS._sceneHandler->_delayTicks = 1;
 }
 
diff --git a/engines/tsage/blue_force/blueforce_scenes6.cpp b/engines/tsage/blue_force/blueforce_scenes6.cpp
index 6ffa81bfb6c..36708751fe7 100644
--- a/engines/tsage/blue_force/blueforce_scenes6.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes6.cpp
@@ -95,14 +95,16 @@ void Scene600::Action1::signal() {
 /*--------------------------------------------------------------------------*/
 
 void Scene600::postInit(SceneObjectList *OwnerList) {
-	SceneExt::postInit();
-	loadScene(600);
-	setZoomPercents(0, 100, 200, 100);
 	_sceneBounds.moveTo(320, 0);
+	BF_GLOBALS._sceneManager._scrollerRect.setRect(20, 0, 300, 200);
 
 	_sound1.play(58);
 	_sound1.holdAt(1);
 
+	loadScene(600);
+	setZoomPercents(0, 100, 200, 100);
+	SceneExt::postInit();
+
 	BF_GLOBALS._player.postInit();
 	BF_GLOBALS._player.hide();
 	BF_GLOBALS._player.setPosition(Common::Point(639, 0));
diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp
index 7b36059b67c..5ab239e7a1f 100644
--- a/engines/tsage/scenes.cpp
+++ b/engines/tsage/scenes.cpp
@@ -274,6 +274,7 @@ Scene::Scene() : _sceneBounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT),
 	_sceneMode = 0;
 	_activeScreenNumber = 0;
 	_oldSceneBounds = Rect(4000, 4000, 4100, 4100);
+	g_globals->_sceneManager._scrollerRect = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
 	Common::fill(&_zoomPercents[0], &_zoomPercents[256], 0);
 
 	_screenNumber = 0;


Commit: 84feaa94d996f75459696b6b22f1cd7006a17a2f
    https://github.com/scummvm/scummvm/commit/84feaa94d996f75459696b6b22f1cd7006a17a2f
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: BLUEFORCE: Fix for scrolling in scene 710 (beach)

This prevents the scrolling starting when talking to Laura at the beach

It is like this in the original. Otherwise this may cause a graphical glitch where text and talking heads move to the right following the scroller movement.

Changed paths:
    engines/tsage/blue_force/blueforce_scenes7.cpp


diff --git a/engines/tsage/blue_force/blueforce_scenes7.cpp b/engines/tsage/blue_force/blueforce_scenes7.cpp
index 718c12d2abd..97f286ecce4 100644
--- a/engines/tsage/blue_force/blueforce_scenes7.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes7.cpp
@@ -141,13 +141,18 @@ bool Scene710::Object5::startAction(CursorType action, Event &event) {
 }
 
 void Scene710::postInit(SceneObjectList *OwnerList) {
-	SceneExt::postInit();
-	loadScene(710);
 	_sceneBounds.moveTo(320, 0);
+	loadScene(710);
+	// Fix for scrolling while talking to Laura, which causes the talking head portraits
+	// and the spoken text to also scroll right (with the text overlapping on itself).
+	// This is like this in the disasm, so presumably this was an intentional "hack" to address the bug.
+	BF_GLOBALS._sceneManager._scrollerRect.setRect(40, 0, 280, 200);
 
 	BF_GLOBALS._sound1.fadeSound(14);
 	_soundExt1.fadeSound(48);
 
+	SceneExt::postInit();
+
 	BF_GLOBALS._player.postInit();
 	BF_GLOBALS._player.hide();
 	BF_GLOBALS._player._moveDiff = Common::Point(4, 2);


Commit: 8eb46bdbf2db12adaa19f91ab3bbf1233a043ad7
    https://github.com/scummvm/scummvm/commit/8eb46bdbf2db12adaa19f91ab3bbf1233a043ad7
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: BLUEFORCE: Minor fixes to Scene 840 (Inside Boat Rental shop)

To closer match disasm

Changed paths:
    engines/tsage/blue_force/blueforce_scenes8.cpp


diff --git a/engines/tsage/blue_force/blueforce_scenes8.cpp b/engines/tsage/blue_force/blueforce_scenes8.cpp
index c2d62f675d3..3bc7ba281fd 100644
--- a/engines/tsage/blue_force/blueforce_scenes8.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes8.cpp
@@ -2228,7 +2228,7 @@ Scene840::Scene840(): PalettedScene() {
 	_field1AC0 = 0;
 	_field1AC2 = 0;
 	_field1AC4 = 0;
-	_field1AC6 = (BF_GLOBALS._dayNumber > 3) ? 1 : 0;
+	_field1AC6 = 0;
 	_field1ABA = 0;
 }
 
@@ -2248,6 +2248,7 @@ void Scene840::postInit(SceneObjectList *OwnerList) {
 	PalettedScene::postInit(OwnerList);
 	BF_GLOBALS._sound1.changeSound(41);
 	loadScene(840);
+	BF_GLOBALS.clearFlag(fCanDrawGun);
 	_field1ABA = 0;
 
 	if (BF_GLOBALS._dayNumber == 0) {
@@ -2266,6 +2267,7 @@ void Scene840::postInit(SceneObjectList *OwnerList) {
 	_stripManager.addSpeaker(&_carterSpeaker);
 
 	BF_GLOBALS._player.postInit();
+	BF_GLOBALS._player.disableControl();
 	BF_GLOBALS._player.changeZoom(-1);
 	BF_GLOBALS._player._moveDiff.x = BF_GLOBALS.getFlag(onDuty) ? 8 : 7;
 
@@ -2302,6 +2304,8 @@ void Scene840::postInit(SceneObjectList *OwnerList) {
 	_item12.setDetails(7, 840, 35, 36, 37, 1);
 	_item13.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, UI_INTERFACE_Y), 840, 41, 42, 43, 1, NULL);
 
+	_field1AC6 = (BF_GLOBALS._dayNumber > 3) ? 1 : 0;
+
 	if (BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) == 1) {
 		_boatKeys.postInit();
 		_boatKeys.setVisage(840);


Commit: 108ecf3d626e8f6c51d09abbb38ba12ab2cf36fc
    https://github.com/scummvm/scummvm/commit/108ecf3d626e8f6c51d09abbb38ba12ab2cf36fc
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: Additional changes in SceneObjectList::draw()

Brings code closer to disasm

Changed paths:
    engines/tsage/core.cpp
    engines/tsage/scenes.cpp


diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index eaa2fb43a00..76e47152d42 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -3052,13 +3052,17 @@ void SceneObjectList::draw() {
 	if (_objList.size() == 0) {
 		// Alternate draw mode
 
-		if (g_globals->_paneRefreshFlag[paneNum] == 1) {
+		if (g_globals->_paneRefreshFlag[paneNum] != 0) {
 			// Load the background
-			g_globals->_sceneManager._scene->refreshBackground(0, 0);
+			if (g_globals->_sceneManager._loadMode == 1) {
+				g_globals->_sceneManager._scene->refreshBackground(0, 0);
+				g_globals->_sceneManager._loadMode = 0;
+			}
 
 			Rect tempRect = g_globals->_sceneManager._scene->_sceneBounds;
 			tempRect.translate(-g_globals->_sceneOffset.x, -g_globals->_sceneOffset.y);
 			ScenePalette::changeBackground(tempRect, g_globals->_sceneManager._fadeMode);
+			g_globals->_paneRefreshFlag[paneNum] = 0;
 		} else {
 			g_globals->_paneRegions[CURRENT_PANENUM].draw();
 		}
@@ -3134,7 +3138,7 @@ void SceneObjectList::draw() {
 		checkIntersection(objList, objList.size(), CURRENT_PANENUM);
 		sortList(objList);
 
-		if (g_globals->_paneRefreshFlag[paneNum] == 1) {
+		if (g_globals->_sceneManager._loadMode == 1) {
 			// Load the background
 			g_globals->_sceneManager._scene->refreshBackground(0, 0);
 		}
@@ -3203,6 +3207,7 @@ void SceneObjectList::draw() {
 					redrawFlag = true;
 				}
 			}
+			g_globals->_sceneManager._loadMode = 0;
 		}
 	}
 }
diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp
index 5ab239e7a1f..4dd2f126679 100644
--- a/engines/tsage/scenes.cpp
+++ b/engines/tsage/scenes.cpp
@@ -265,6 +265,9 @@ void SceneManager::listenerSynchronize(Serializer &s) {
 	g_globals->_sceneManager._scrollerRect.synchronize(s);
 	SYNC_POINTER(g_globals->_scrollFollower);
 	s.syncAsSint16LE(_loadMode);
+	if (s.isLoading()) {
+		_loadMode = 1;
+	}
 }
 
 /*--------------------------------------------------------------------------*/


Commit: dff86f58348013871b42e5d9816e6d50e085416d
    https://github.com/scummvm/scummvm/commit/dff86f58348013871b42e5d9816e6d50e085416d
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:25+03:00

Commit Message:
TSAGE: BLUEFORCE: Fix scene transition glitch from 160 to 200

Removed unnecessary setZoomPercents command from Scene200 postInit

Changed paths:
    engines/tsage/blue_force/blueforce_scenes2.cpp


diff --git a/engines/tsage/blue_force/blueforce_scenes2.cpp b/engines/tsage/blue_force/blueforce_scenes2.cpp
index 38a347f1ab5..f36933ece3f 100644
--- a/engines/tsage/blue_force/blueforce_scenes2.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes2.cpp
@@ -103,10 +103,9 @@ void Scene200::Action2::signal() {
 /*--------------------------------------------------------------------------*/
 
 void Scene200::postInit(SceneObjectList *OwnerList) {
-	SceneExt::postInit();
-	loadScene(200);
-	setZoomPercents(0, 100, 200, 100);
 	BF_GLOBALS._sound1.play(3);
+	loadScene(200);
+	SceneExt::postInit();
 
 	_object10.postInit();
 	_object10.setVisage(200);


Commit: 5026d13903bbca434d01dd6d9ad36fd436be4423
    https://github.com/scummvm/scummvm/commit/5026d13903bbca434d01dd6d9ad36fd436be4423
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2025-09-08T01:15:26+03:00

Commit Message:
TSAGE: Implement hack to smoothen scrolling

Examples of scenes affected in Blue Force are the intro scenes 160 (burial) and 225 (Gun training)

This effectively slows down the updating of the screenbounds while scolling, allowing for the scroller movement to catch up.

Changed paths:
    engines/tsage/core.cpp


diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index 76e47152d42..04a8ea4e907 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -3102,9 +3102,18 @@ void SceneObjectList::draw() {
 		}
 
 		if (g_globals->_sceneManager._sceneLoadCount > 0) {
-			--g_globals->_sceneManager._sceneLoadCount;
-			g_globals->_sceneManager._scene->loadBackground(g_globals->_sceneManager._sceneBgOffset.x,
-				g_globals->_sceneManager._sceneBgOffset.y);
+			// HACK Checking the value of g_globals->_paneRefreshFlag[1] is done so that
+			// the _sceneBounds are not updated faster than the scroller is "moving" resulting in stutters while scrolling
+			// The g_globals->_paneRefreshFlag[1] is unused by ScummVM otherwise, so it's safe to make use of it here.
+			// However, there's a broader issue with the engine doing things faster than it should eg. for fading as well,
+			// and resolving that issue could render this hack unnecessary.
+			if (g_globals->_paneRefreshFlag[1] <= 0) {
+				--g_globals->_sceneManager._sceneLoadCount;
+				g_globals->_sceneManager._scene->loadBackground(g_globals->_sceneManager._sceneBgOffset.x,
+					g_globals->_sceneManager._sceneBgOffset.y);
+			} else {
+				--g_globals->_paneRefreshFlag[1];
+			}
 		}
 
 		// Set up the flag mask. Currently, paneNum is always set to 0, so the check is meaningless




More information about the Scummvm-git-logs mailing list