[Scummvm-git-logs] scummvm master -> 850d5585171c46cf0106ae93c687eaae33472a76

bluegr noreply at scummvm.org
Mon Mar 2 19:55:55 UTC 2026


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

Summary:
3b40ac0018 TINSEL: Add debugger commands for global variables
b2e9411eef TINSEL: Add debugger command for listing scenes
517b8d192d TINSEL: Fix DW1 Act 2 Amazon speech in all versions
7636862d06 TINSEL: Fix DW1 Act 4 invisible city guard crash
cd6e1b7048 TINSEL: Fix DW1 Act 3 floating calculate button
850d558517 TINSEL: Fix DW1 L-Space barman conversation window


Commit: 3b40ac0018596090a6f7ee9ca33920b0016c02f7
    https://github.com/scummvm/scummvm/commit/3b40ac0018596090a6f7ee9ca33920b0016c02f7
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2026-03-02T21:55:43+02:00

Commit Message:
TINSEL: Add debugger commands for global variables

Changed paths:
    engines/tinsel/debugger.cpp
    engines/tinsel/debugger.h
    engines/tinsel/pcode.cpp
    engines/tinsel/pcode.h


diff --git a/engines/tinsel/debugger.cpp b/engines/tinsel/debugger.cpp
index ba1606b4b9c..b8a8dbe565f 100644
--- a/engines/tinsel/debugger.cpp
+++ b/engines/tinsel/debugger.cpp
@@ -73,6 +73,9 @@ Console::Console() : GUI::Debugger() {
 	registerCmd("music",		WRAP_METHOD(Console, cmd_music));
 	registerCmd("sound",		WRAP_METHOD(Console, cmd_sound));
 	registerCmd("string",		WRAP_METHOD(Console, cmd_string));
+	registerCmd("globals",		WRAP_METHOD(Console, cmd_globals));
+	registerCmd("global",		WRAP_METHOD(Console, cmd_global));
+	registerCmd("g",		WRAP_METHOD(Console, cmd_global)); // alias
 }
 
 Console::~Console() {
@@ -167,6 +170,37 @@ bool Console::cmd_string(int argc, const char **argv) {
 	return true;
 }
 
+bool Console::cmd_globals(int argc, const char **argv) {
+	for (int i = 0; i < GetGlobalCount(); i++) {
+		int value = GetGlobal(i);
+		debugPrintf("global %d == %08x (%d)\n", i, value, value);
+	}
+	return true;
+}
+
+bool Console::cmd_global(int argc, const char **argv) {
+	if (!(2 <= argc && argc <= 3)) {
+		debugPrintf("Print or set global variable\n");
+		debugPrintf("usage: %s <global> [new-value]\n", argv[0]);
+		return true;
+	}
+
+	int global = strToInt(argv[1]);
+	if (!(0 <= global && global < GetGlobalCount())) {
+		debugPrintf("maximum global: %d\n", GetGlobalCount() - 1);
+		return true;
+	}
+
+	if (argc == 3) {
+		int newValue = strToInt(argv[2]);
+		SetGlobal(global, newValue);
+	}
+
+	int value = GetGlobal(global);
+	debugPrintf("global %d == %08x (%d)\n", global, value, value);
+	return true;
+}
+
 // Noir:
 bool Console::cmd_add_clue(int argc, const char **argv) {
 	if (argc < 2) {
diff --git a/engines/tinsel/debugger.h b/engines/tinsel/debugger.h
index 2e5b52645ac..d5d0d98ccc0 100644
--- a/engines/tinsel/debugger.h
+++ b/engines/tinsel/debugger.h
@@ -43,6 +43,8 @@ private:
 	bool cmd_music(int argc, const char **argv);
 	bool cmd_sound(int argc, const char **argv);
 	bool cmd_string(int argc, const char **argv);
+	bool cmd_globals(int argc, const char **argv);
+	bool cmd_global(int argc, const char **argv);
 };
 
 } // End of namespace Tinsel
diff --git a/engines/tinsel/pcode.cpp b/engines/tinsel/pcode.cpp
index acaf955683d..71079149eb1 100644
--- a/engines/tinsel/pcode.cpp
+++ b/engines/tinsel/pcode.cpp
@@ -509,6 +509,32 @@ void FreeGlobals() {
 	g_icList= nullptr;
 }
 
+/**
+ * Get number of globals. Used by debugger.
+ */
+int GetGlobalCount() {
+	return g_numGlobals;
+}
+
+/**
+ * Get global value. Used by debugger.
+ */
+int32 GetGlobal(int g) {
+	if (g_pGlobals != nullptr && 0 <= g && g < g_numGlobals) {
+		return g_pGlobals[g];
+	}
+	return 0;
+}
+
+/**
+* Sets global value. Used by debugger.
+*/
+void SetGlobal(int g, int32 value) {
+	if (g_pGlobals != nullptr && 0 <= g  && g < g_numGlobals) {
+		g_pGlobals[g] = value;
+	}
+}
+
 /**
  * (Un)serialize the global data for save/restore game.
  */
diff --git a/engines/tinsel/pcode.h b/engines/tinsel/pcode.h
index 4ecc9f12029..83377ca6c8d 100644
--- a/engines/tinsel/pcode.h
+++ b/engines/tinsel/pcode.h
@@ -111,6 +111,11 @@ void SaveInterpretContexts(INT_CONTEXT *sICInfo);
 void RegisterGlobals(int num);
 void FreeGlobals();
 
+// Used by debugger
+int GetGlobalCount();
+int32 GetGlobal(int g);
+void SetGlobal(int g, int32 value);
+
 void AttachInterpret(INT_CONTEXT *pic, Common::PROCESS *pProc);
 
 void WaitInterpret(CORO_PARAM, Common::PPROCESS pWaitProc, bool *result);


Commit: b2e9411eef00ac1fe7790cec0a49dd89e464279e
    https://github.com/scummvm/scummvm/commit/b2e9411eef00ac1fe7790cec0a49dd89e464279e
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2026-03-02T21:55:43+02:00

Commit Message:
TINSEL: Add debugger command for listing scenes

Changed paths:
    engines/tinsel/debugger.cpp
    engines/tinsel/debugger.h
    engines/tinsel/handle.cpp
    engines/tinsel/handle.h


diff --git a/engines/tinsel/debugger.cpp b/engines/tinsel/debugger.cpp
index b8a8dbe565f..4a02d5b2c2d 100644
--- a/engines/tinsel/debugger.cpp
+++ b/engines/tinsel/debugger.cpp
@@ -22,6 +22,7 @@
 #include "tinsel/tinsel.h"
 #include "tinsel/debugger.h"
 #include "tinsel/dialogs.h"
+#include "tinsel/handle.h"
 #include "tinsel/pcode.h"
 #include "tinsel/scene.h"
 #include "tinsel/sound.h"
@@ -69,6 +70,7 @@ Console::Console() : GUI::Debugger() {
 		registerCmd("list_clues",		WRAP_METHOD(Console, cmd_list_clues));
 	}
 	registerCmd("item",		WRAP_METHOD(Console, cmd_item));
+	registerCmd("scenes",		WRAP_METHOD(Console, cmd_scenes));
 	registerCmd("scene",		WRAP_METHOD(Console, cmd_scene));
 	registerCmd("music",		WRAP_METHOD(Console, cmd_music));
 	registerCmd("sound",		WRAP_METHOD(Console, cmd_sound));
@@ -93,6 +95,23 @@ bool Console::cmd_item(int argc, const char **argv) {
 	return false;
 }
 
+bool Console::cmd_scenes(int argc, const char **argv) {
+	Common::String filter;
+	if (argc >= 2) {
+		filter = argv[1];
+	}
+
+	for (int i = 0; i < _vm->_handle->GetSceneCount(); i++) {
+		Common::String name = _vm->_handle->GetSceneName(i);
+		if (!name.empty()) {
+			if (filter.empty() || name.hasPrefixIgnoreCase(filter)) {
+				debugPrintf("scene %d: %s\n", i, name.c_str());
+			}
+		}
+	}
+	return true;
+}
+
 bool Console::cmd_scene(int argc, const char **argv) {
 	if (argc < 1 || argc > 3) {
 		debugPrintf("%s [scene_number [entry number]]\n", argv[0]);
@@ -102,7 +121,9 @@ bool Console::cmd_scene(int argc, const char **argv) {
 	}
 
 	if (argc == 1) {
-		debugPrintf("Current scene is %d\n", GetSceneHandle() >> SCNHANDLE_SHIFT);
+		int index = GetSceneHandle() >> SCNHANDLE_SHIFT;
+		Common::String name = _vm->_handle->GetSceneName(index);
+		debugPrintf("Current scene is %d: %s\n", index, name.c_str());
 		return true;
 	}
 
diff --git a/engines/tinsel/debugger.h b/engines/tinsel/debugger.h
index d5d0d98ccc0..77e6f3ee099 100644
--- a/engines/tinsel/debugger.h
+++ b/engines/tinsel/debugger.h
@@ -39,6 +39,7 @@ private:
 	bool cmd_cross_clue(int argc, const char **argv);
 	bool cmd_list_clues(int argc, const char **argv);
 	bool cmd_item(int argc, const char **argv);
+	bool cmd_scenes(int argc, const char **argv);
 	bool cmd_scene(int argc, const char **argv);
 	bool cmd_music(int argc, const char **argv);
 	bool cmd_sound(int argc, const char **argv);
diff --git a/engines/tinsel/handle.cpp b/engines/tinsel/handle.cpp
index aeaf5f97418..26b00900fe6 100644
--- a/engines/tinsel/handle.cpp
+++ b/engines/tinsel/handle.cpp
@@ -593,6 +593,28 @@ bool Handle::ValidHandle(SCNHANDLE offset) {
 }
 #endif
 
+/**
+ * Get number of scenes. Used by debugger.
+ */
+int Handle::GetSceneCount() {
+	return _numHandles;
+}
+
+/**
+ * Get scene file name. Used by debugger.
+ */
+Common::String Handle::GetSceneName(int index) {
+	if (0 <= index && index < (int)_numHandles) {
+		// extract and zero terminate the filename
+		const MEMHANDLE *handle = &_handleTable[index];
+		char szFilename[sizeof(handle->szName) + 1];
+		memcpy(szFilename, handle->szName, sizeof(handle->szName));
+		szFilename[sizeof(handle->szName)] = 0;
+		return szFilename;
+	}
+	return "";
+}
+
 /**
  * TouchMem
  * @param offset			Handle and offset to data
diff --git a/engines/tinsel/handle.h b/engines/tinsel/handle.h
index 4d2aea96304..a59580c96f3 100644
--- a/engines/tinsel/handle.h
+++ b/engines/tinsel/handle.h
@@ -84,6 +84,10 @@ public:
 	bool ValidHandle(SCNHANDLE offset);
 #endif
 
+	// Used by debugger
+	int GetSceneCount();
+	Common::String GetSceneName(int index);
+
 private:
 	void LoadFile(MEMHANDLE *pH); // load a memory block as a file
 	void OpenCDGraphFile();


Commit: 517b8d192d286aa77f18ab39eac97f968e601f8b
    https://github.com/scummvm/scummvm/commit/517b8d192d286aa77f18ab39eac97f968e601f8b
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2026-03-02T21:55:43+02:00

Commit Message:
TINSEL: Fix DW1 Act 2 Amazon speech in all versions

Fixes bug #6013

Changed paths:
    engines/tinsel/pcode.cpp


diff --git a/engines/tinsel/pcode.cpp b/engines/tinsel/pcode.cpp
index 71079149eb1..d13745d365f 100644
--- a/engines/tinsel/pcode.cpp
+++ b/engines/tinsel/pcode.cpp
@@ -141,22 +141,23 @@ static const byte fragment5[] = {OP_IMM | OPSIZE16, FRAGMENT_WORD(901), OP_JUMP
 static const byte fragment6[] = {OP_IMM | OPSIZE16, FRAGMENT_WORD(903), OP_JUMP | OPSIZE16, FRAGMENT_WORD(516)};
 static const byte fragment7[] = {OP_IMM | OPSIZE16, FRAGMENT_WORD(908), OP_JUMP | OPSIZE16, FRAGMENT_WORD(616)};
 static const byte fragment8[] = {OP_IMM | OPSIZE16, FRAGMENT_WORD(910), OP_JUMP | OPSIZE16, FRAGMENT_WORD(644)};
-static const byte fragment9[] = {OP_JUMP | OPSIZE8, 123};
-static const byte fragment10[] = {OP_IMM | OPSIZE16, FRAGMENT_WORD(160), OP_JUMP | OPSIZE16, FRAGMENT_WORD(136)};
-static const byte fragment11[] = {OP_JMPTRUE | OPSIZE16, FRAGMENT_WORD(1572),
+static const byte fragment9[] = {OP_JUMP | OPSIZE8, 115};
+static const byte fragment10[] = {OP_JUMP | OPSIZE8, 123};
+static const byte fragment11[] = {OP_IMM | OPSIZE16, FRAGMENT_WORD(160), OP_JUMP | OPSIZE16, FRAGMENT_WORD(136)};
+static const byte fragment12[] = {OP_JMPTRUE | OPSIZE16, FRAGMENT_WORD(1572),
 		OP_ONE, OP_LIBCALL | OPSIZE8, 14,									// Re-show the cursor
 		OP_IMM | OPSIZE16, FRAGMENT_WORD(322), OP_LIBCALL | OPSIZE8, 46,	// Give back the whistle
 		OP_JUMP | OPSIZE16, FRAGMENT_WORD(1661)};
-static const byte fragment12[] = {OP_JMPTRUE | OPSIZE16, FRAGMENT_WORD(1491),
+static const byte fragment13[] = {OP_JMPTRUE | OPSIZE16, FRAGMENT_WORD(1491),
 		OP_ONE, OP_LIBCALL | OPSIZE8, 14,									// Re-show the cursor
 		OP_IMM | OPSIZE16, FRAGMENT_WORD(322), OP_LIBCALL | OPSIZE8, 46,	// Give back the whistle
 		OP_JUMP | OPSIZE16, FRAGMENT_WORD(1568)};
-static const byte fragment13[] = {OP_ZERO, OP_GSTORE | OPSIZE16, FRAGMENT_WORD(306)};
-static const byte fragment14[] = {OP_LIBCALL | OPSIZE8, 58,
+static const byte fragment14[] = {OP_ZERO, OP_GSTORE | OPSIZE16, FRAGMENT_WORD(306)};
+static const byte fragment15[] = {OP_LIBCALL | OPSIZE8, 58,
 		OP_IMM, FRAGMENT_DWORD((42 << 23)), OP_ONE, OP_ZERO, OP_LIBCALL | OPSIZE8, 44,
 		OP_LIBCALL | OPSIZE8, 97, OP_JUMP | OPSIZE16, FRAGMENT_WORD(2220)
 };
-static const byte fragment15[] = { OP_JMPFALSE | OPSIZE16, FRAGMENT_WORD(154) };
+static const byte fragment16[] = { OP_JMPFALSE | OPSIZE16, FRAGMENT_WORD(154) };
 
 #if NOIR_SKIP_INTRO
 static const byte fragment_noir_skip_intro_1[] = {
@@ -201,11 +202,16 @@ const WorkaroundEntry workaroundList[] = {
 	{TINSEL_V1, false, false, Common::kPlatformUnknown, 310506872, 613, sizeof(fragment7), fragment7},
 	{TINSEL_V1, false, false, Common::kPlatformUnknown, 310506872, 641, sizeof(fragment8), fragment8},
 
-	// DW1-SCN: The script for the lovable street-Starfish does a
+	// DW1: The script for the lovable street-Starfish does a
 	// 'StopSample' after flicking the coin to ensure it's sound is
 	// stopped, but which also accidentally can stop any active
-	// conversation with the Amazon.
-	{TINSEL_V1, true, false, Common::kPlatformUnknown, 394640351, 121, sizeof(fragment9), fragment9},
+	// conversation with the Amazon. This occurs in GRA and early
+	// SCN versions (Mac English-only, DOS English-only), and was
+	// fixed in later versions by removing the `StopSample` call.
+	// Fixes bugs #4588, #6013
+	{TINSEL_V1, false, false, Common::kPlatformUnknown,   386244920, 113, sizeof(fragment9),  fragment9},  // All .GRA
+	{TINSEL_V1, true,  false, Common::kPlatformMacintosh, 395378742, 113, sizeof(fragment9),  fragment9},  // Mac .SCN
+	{TINSEL_V1, true,  false, Common::kPlatformDOS,       394640351, 121, sizeof(fragment10), fragment10}, // DOS .SCN
 
 	// DW2: In the garden, global #490 is set when the bees begin their
 	// 'out of hive' animation, and reset when done. But if the game is
@@ -222,26 +228,26 @@ const WorkaroundEntry workaroundList[] = {
 
 	// DW1-GRA: Corrects text being drawn partially off-screen during
 	// the blackboard description of the Librarian.
-	{TINSEL_V1, false, false, Common::kPlatformUnknown, 293831402, 133, sizeof(fragment10), fragment10},
+	{TINSEL_V1, false, false, Common::kPlatformUnknown, 293831402, 133, sizeof(fragment11), fragment11},
 
 	// DW1-GRA/SCN: Corrects the dead-end of being able to give the
 	// whistle back to the pirate before giving him the parrot.
 	// See bug report #4755.
-	{TINSEL_V1, true, false, Common::kPlatformUnknown, 352601285, 1569, sizeof(fragment11), fragment11},
-	{TINSEL_V1, false, false, Common::kPlatformUnknown, 352602304, 1488, sizeof(fragment12), fragment12},
+	{TINSEL_V1, true, false, Common::kPlatformUnknown, 352601285, 1569, sizeof(fragment12), fragment12},
+	{TINSEL_V1, false, false, Common::kPlatformUnknown, 352602304, 1488, sizeof(fragment13), fragment13},
 
 	// DW2: Corrects a bug with global 306 not being cleared if you leave
 	// the marketplace scene whilst D'Blah is talking (even if it's not
 	// actually audible); returning to the scene and clicking on him multiple
 	// times would cause the game to crash
-	{TINSEL_V2, true, false, Common::kPlatformUnknown, 1109294728, 0, sizeof(fragment13), fragment13},
+	{TINSEL_V2, true, false, Common::kPlatformUnknown, 1109294728, 0, sizeof(fragment14), fragment14},
 
 	// DW1 PSX DEMO: Alters a script in the PSX DW1 demo to show the Idle animation scene rather than
 	// quitting the game when no user input happens for a while
-	{TINSEL_V1, true, true, Common::kPlatformPSX, 0, 2186, sizeof(fragment14), fragment14},
+	{TINSEL_V1, true, true, Common::kPlatformPSX, 0, 2186, sizeof(fragment15), fragment15},
 
 	// DW1-GRA: Fixes hang in Temple, when trying to use items on the big hammer
-	{TINSEL_V1, false, false, Common::kPlatformUnknown, 276915849, 0x98, sizeof(fragment15), fragment15},
+	{TINSEL_V1, false, false, Common::kPlatformUnknown, 276915849, 0x98, sizeof(fragment16), fragment16},
 
 #if NOIR_SKIP_INTRO
 	// NOIR: Skip the menu and intro, and skip the first conversation.


Commit: 7636862d06c365b3f6222bab76483ceeab1c9fac
    https://github.com/scummvm/scummvm/commit/7636862d06c365b3f6222bab76483ceeab1c9fac
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2026-03-02T21:55:43+02:00

Commit Message:
TINSEL: Fix DW1 Act 4 invisible city guard crash

Fixes bug #10659

Changed paths:
    engines/tinsel/pcode.cpp


diff --git a/engines/tinsel/pcode.cpp b/engines/tinsel/pcode.cpp
index d13745d365f..9ca44c1d4aa 100644
--- a/engines/tinsel/pcode.cpp
+++ b/engines/tinsel/pcode.cpp
@@ -158,6 +158,7 @@ static const byte fragment15[] = {OP_LIBCALL | OPSIZE8, 58,
 		OP_LIBCALL | OPSIZE8, 97, OP_JUMP | OPSIZE16, FRAGMENT_WORD(2220)
 };
 static const byte fragment16[] = { OP_JMPFALSE | OPSIZE16, FRAGMENT_WORD(154) };
+static const byte fragment17[] = { OP_IMM | OPSIZE8, 21, OP_LIBCALL | OPSIZE8, 0x29 }; // KillTag(21), city guard
 
 #if NOIR_SKIP_INTRO
 static const byte fragment_noir_skip_intro_1[] = {
@@ -249,6 +250,12 @@ const WorkaroundEntry workaroundList[] = {
 	// DW1-GRA: Fixes hang in Temple, when trying to use items on the big hammer
 	{TINSEL_V1, false, false, Common::kPlatformUnknown, 276915849, 0x98, sizeof(fragment16), fragment16},
 
+	// DW1-GRA: Fixes Act 4 invisible city guard. Talking to him crashes the game.
+	// The guard's polygon has the wrong ID, preventing `KillTag` from disabling it.
+	// The ID was fixed in SCN versions. We fix this by adding a `KillTag` with
+	// the actual polygon ID. Fixes bug #10659
+	{TINSEL_V1, false, false, Common::kPlatformUnknown, 184651316, 10, sizeof(fragment17), fragment17},
+
 #if NOIR_SKIP_INTRO
 	// NOIR: Skip the menu and intro, and skip the first conversation.
 	{TINSEL_V3, false, false, Common::kPlatformUnknown, 0, 0x6a2, sizeof(fragment_noir_skip_intro_1), fragment_noir_skip_intro_1},


Commit: cd6e1b70488ea35e8956e90c20467408854ff6d3
    https://github.com/scummvm/scummvm/commit/cd6e1b70488ea35e8956e90c20467408854ff6d3
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2026-03-02T21:55:43+02:00

Commit Message:
TINSEL: Fix DW1 Act 3 floating calculate button

Fixes bug #10658

Changed paths:
    engines/tinsel/pcode.cpp


diff --git a/engines/tinsel/pcode.cpp b/engines/tinsel/pcode.cpp
index 9ca44c1d4aa..5a3c84ec404 100644
--- a/engines/tinsel/pcode.cpp
+++ b/engines/tinsel/pcode.cpp
@@ -159,6 +159,13 @@ static const byte fragment15[] = {OP_LIBCALL | OPSIZE8, 58,
 };
 static const byte fragment16[] = { OP_JMPFALSE | OPSIZE16, FRAGMENT_WORD(154) };
 static const byte fragment17[] = { OP_IMM | OPSIZE8, 21, OP_LIBCALL | OPSIZE8, 0x29 }; // KillTag(21), city guard
+static const byte fragment18[] = {
+	OP_FILM, FRAGMENT_DWORD(0x0B015A30),
+	OP_IMM | OPSIZE16, FRAGMENT_WORD(82),
+	OP_IMM | OPSIZE16, FRAGMENT_WORD(141),
+	OP_MINUSONE, OP_ZERO, OP_ONE,
+	OP_LIBCALL | OPSIZE8, 0x51 // TopPlay(0B015A30, 82, 141, -1, 0, 1), city gate "calculate odds" button
+};
 
 #if NOIR_SKIP_INTRO
 static const byte fragment_noir_skip_intro_1[] = {
@@ -256,6 +263,12 @@ const WorkaroundEntry workaroundList[] = {
 	// the actual polygon ID. Fixes bug #10659
 	{TINSEL_V1, false, false, Common::kPlatformUnknown, 184651316, 10, sizeof(fragment17), fragment17},
 
+	// DW1-GRA: Fixes Act 3 floating "calculate odds" button when clicking outside window.
+	// The film that is played when clicking outside the window does not remove the button.
+	// This was fixed in SCN versions. We work around this by playing the click-button
+	// film when clicking outside the window, as it removes the button. Fixes bug #10658
+	{TINSEL_V1, false, false, Common::kPlatformUnknown, 184641238, 39, sizeof(fragment18), fragment18},
+
 #if NOIR_SKIP_INTRO
 	// NOIR: Skip the menu and intro, and skip the first conversation.
 	{TINSEL_V3, false, false, Common::kPlatformUnknown, 0, 0x6a2, sizeof(fragment_noir_skip_intro_1), fragment_noir_skip_intro_1},


Commit: 850d5585171c46cf0106ae93c687eaae33472a76
    https://github.com/scummvm/scummvm/commit/850d5585171c46cf0106ae93c687eaae33472a76
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2026-03-02T21:55:43+02:00

Commit Message:
TINSEL: Fix DW1 L-Space barman conversation window

Fixes bug #10661

Changed paths:
    engines/tinsel/pcode.cpp


diff --git a/engines/tinsel/pcode.cpp b/engines/tinsel/pcode.cpp
index 5a3c84ec404..5dbc026118e 100644
--- a/engines/tinsel/pcode.cpp
+++ b/engines/tinsel/pcode.cpp
@@ -166,6 +166,14 @@ static const byte fragment18[] = {
 	OP_MINUSONE, OP_ZERO, OP_ONE,
 	OP_LIBCALL | OPSIZE8, 0x51 // TopPlay(0B015A30, 82, 141, -1, 0, 1), city gate "calculate odds" button
 };
+static const byte fragment19[] = {
+	OP_DUP,
+	OP_IMM | OPSIZE16, FRAGMENT_WORD(331), // stop conversation icon
+	OP_EQUAL,
+	OP_JMPFALSE | OPSIZE16, FRAGMENT_WORD(69), // jmpfalse to alloc -1, jump to alloc -1, halt
+	OP_IMM | OPSIZE8, 2,
+	OP_LIBCALL | OPSIZE8, 0x0f // Conversation(2), close conversation window
+};
 
 #if NOIR_SKIP_INTRO
 static const byte fragment_noir_skip_intro_1[] = {
@@ -269,6 +277,11 @@ const WorkaroundEntry workaroundList[] = {
 	// film when clicking outside the window, as it removes the button. Fixes bug #10658
 	{TINSEL_V1, false, false, Common::kPlatformUnknown, 184641238, 39, sizeof(fragment18), fragment18},
 
+	// DW1-GRA: Fixes barman conversation window not closing in L-Space.
+	// The `SCANICON` switch statement is missing a handler, preventing
+	// the stop-conversation icon from working. Fixes bug #10661
+	{TINSEL_V1, false, false, Common::kPlatformUnknown, 553821320, 465, sizeof(fragment19), fragment19},
+
 #if NOIR_SKIP_INTRO
 	// NOIR: Skip the menu and intro, and skip the first conversation.
 	{TINSEL_V3, false, false, Common::kPlatformUnknown, 0, 0x6a2, sizeof(fragment_noir_skip_intro_1), fragment_noir_skip_intro_1},




More information about the Scummvm-git-logs mailing list