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

sev- noreply at scummvm.org
Fri Jan 16 15:46:58 UTC 2026


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

Summary:
c77fb02137 DIRECTOR: Add full version of Welcome to the Future + XObjects
b4b3a8dc70 DIRECTOR: Fix detection entry for beyondthewall
41afdf15ef DIRECTOR: Fix buggy behaviour of d_strstr
606da4c9d4 DIRECTOR: Fix Ghost/NotGhost/Reverse/NotReverse ink types in 32bpp mode
ddc621d2ba DIRECTOR: Make 32-bit BITDDecoder images output an RGBA surface


Commit: c77fb021375e0889c8a6f8f0e9817a56b4dd1dfa
    https://github.com/scummvm/scummvm/commit/c77fb021375e0889c8a6f8f0e9817a56b4dd1dfa
Author: Scott Percival (code at moral.net.au)
Date: 2026-01-16T18:46:52+03:00

Commit Message:
DIRECTOR: Add full version of Welcome to the Future + XObjects

Changed paths:
  A engines/director/lingo/xlibs/b/blockthedrawingxobj.cpp
  A engines/director/lingo/xlibs/b/blockthedrawingxobj.h
  A engines/director/lingo/xlibs/m/mazexobj.cpp
  A engines/director/lingo/xlibs/m/mazexobj.h
  A engines/director/lingo/xlibs/p/playsoundmoviexobj.cpp
  A engines/director/lingo/xlibs/p/playsoundmoviexobj.h
  A engines/director/lingo/xlibs/s/savenrestorexobj.cpp
  A engines/director/lingo/xlibs/s/savenrestorexobj.h
  A engines/director/lingo/xlibs/t/temnotaxobj.cpp
  A engines/director/lingo/xlibs/t/temnotaxobj.h
    engines/director/detection_tables.h
    engines/director/lingo/lingo-object.cpp
    engines/director/module.mk


diff --git a/engines/director/detection_tables.h b/engines/director/detection_tables.h
index 51244f461b3..e82f49181d6 100644
--- a/engines/director/detection_tables.h
+++ b/engines/director/detection_tables.h
@@ -578,6 +578,7 @@ static const PlainGameDescriptor directorGames[] = {
 	{ "winniewitch",		"Winnie the Witch" },
 	{ "wishbone", 			"Wishbone and the Amazing Odyssey" },
 	{ "wrath",				"Wrath of the Gods" },
+	{ "wttf",				"Welcome to the Future" },
 	{ "xanthus",			"Xanthus" },
 	{ "xfools",				"The X-Fools: The Spoof is Out There" },
 	{ "xmasstory",			"A Christmas Story" },
@@ -1878,7 +1879,6 @@ static const PlainGameDescriptor directorGames[] = {
 	{ "windows95",			"Microsoft Windows 95" },
 	{ "worldatlas",			"World Reference Atlas" },
 	{ "wpmainstreet",		"WordPerfect Main Street" },
-	{ "wttf",				"Welcome to the Future" },
 	{ "wwaldocircus",		"Where's Waldo? At the Circus" },
 	{ "wwaldogeo",			"Where's Waldo? Exploring Geography" },
 	{ "xfiles",				"The X-Files" },
@@ -6493,7 +6493,7 @@ static const DirectorGameDescription gameDescriptions[] = {
 	WINDEMO2("worldatlas", "Sampler", "ATLAS.EXE",		   "t:73fd017684b6fd92d0b8a743994705ab", 696807,
 									  "DATA/CONTENTM.DIR", "f:f4c9435dac6653651bf7c86480c3333b", 681228, 404),
 
-	// Full game is not Director
+	MACGAME1f("wttf", "", "BLUESKY/WELCOME24", "rt:e8072b708d1d05793d0b8a3f1e2f301b", 483808, 404, GF_32BPP),
 	MACDEMO1("wttf", "Demo", "WTTF", "01be45e7241194dad07938e7059b88e3", 483518, 404),
 
 	// Full game is not Director
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 54209644d83..3b6de46841b 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -38,6 +38,7 @@
 #include "director/lingo/xlibs/b/batqt.h"
 #include "director/lingo/xlibs/b/bimxobj.h"
 #include "director/lingo/xlibs/b/blitpict.h"
+#include "director/lingo/xlibs/b/blockthedrawingxobj.h"
 #include "director/lingo/xlibs/c/cdromxobj.h"
 #include "director/lingo/xlibs/c/closebleedwindowxcmd.h"
 #include "director/lingo/xlibs/c/colorxobj.h"
@@ -100,6 +101,7 @@
 #include "director/lingo/xlibs/m/movutils.h"
 #include "director/lingo/xlibs/m/msfile.h"
 #include "director/lingo/xlibs/m/mystisle.h"
+#include "director/lingo/xlibs/m/mazexobj.h"
 #include "director/lingo/xlibs/o/openbleedwindowxcmd.h"
 #include "director/lingo/xlibs/o/orthoplayxobj.h"
 #include "director/lingo/xlibs/p/paco.h"
@@ -112,6 +114,7 @@
 #include "director/lingo/xlibs/p/printomatic.h"
 #include "director/lingo/xlibs/p/processxobj.h"
 #include "director/lingo/xlibs/p/putcurs.h"
+#include "director/lingo/xlibs/p/playsoundmoviexobj.h"
 #include "director/lingo/xlibs/q/qtmovie.h"
 #include "director/lingo/xlibs/q/qtcatmovieplayerxobj.h"
 #include "director/lingo/xlibs/q/qtvr.h"
@@ -124,7 +127,9 @@
 #include "director/lingo/xlibs/s/spacemgr.h"
 #include "director/lingo/xlibs/s/stagetc.h"
 #include "director/lingo/xlibs/s/syscolor.h"
+#include "director/lingo/xlibs/s/savenrestorexobj.h"
 #include "director/lingo/xlibs/t/tengu.h"
+#include "director/lingo/xlibs/t/temnotaxobj.h"
 #include "director/lingo/xlibs/u/unittest.h"
 #include "director/lingo/xlibs/v/valkyrie.h"
 #include "director/lingo/xlibs/v/versions.h"
@@ -251,6 +256,7 @@ static const struct XLibProto {
 	XLIBDEF(BatQT,				kXObj,			400),	// D4
 	XLIBDEF(BIMXObj,			kXObj,			400),	// D4
 	XLIBDEF(BlitPictXObj,		kXObj,			400),	// D4
+	XLIBDEF(BlockTheDrawingXObj,			kXObj,					400),	// D4
 	XLIBDEF(BudAPIXtra,			kXtraObj,					500),	// D5
 	XLIBDEF(CDROMXObj,			kXObj,			200),	// D2
 	XLIBDEF(CloseBleedWindowXCMD,kXObj,			300),	// D3
@@ -307,6 +313,7 @@ static const struct XLibProto {
 	XLIBDEF(ManiacBgXObj,		kXObj,			300),	// D3
 	XLIBDEF(MapNavigatorXObj,	kXObj,			400),	// D4
 	XLIBDEF(MasterAppXtra,		kXtraObj,		500),	// D5
+	XLIBDEF(MazeXObj,			kXObj,					400),	// D4
 	XLIBDEF(MemCheckXObj,		kXObj,			400),	// D4
 	XLIBDEF(MemoryXObj,			kXObj,			300),	// D3
 	XLIBDEF(Misc,				kXObj,			400),	// D4
@@ -328,6 +335,7 @@ static const struct XLibProto {
 	XLIBDEF(PalXObj,			kXObj,			400),	// D4
 	XLIBDEF(PanelXObj,			kXObj,			200),	// D2
 	XLIBDEF(PharaohsXObj,		kXObj,			400),	// D4
+	XLIBDEF(PlaySoundMovieXObj,			kXObj,					400),	// D4
 	XLIBDEF(PopUpMenuXObj,		kXObj,			200),	// D2
 	XLIBDEF(Porta,				kXObj,			300),	// D3
 	XLIBDEF(PrefPath,			kXObj,			400),	// D4
@@ -344,6 +352,7 @@ static const struct XLibProto {
 	XLIBDEF(RegistryReaderXtra,			kXtraObj,					500),	// D5
 	XLIBDEF(RemixXCMD,			kXObj,			300),	// D3
 	XLIBDEF(RolloverToolkitXtra,kXtraObj,		500),	// D5
+	XLIBDEF(SaveNRestoreXObj,			kXObj,					400),	// D4
 	XLIBDEF(ScrnUtilXtra,		kXtraObj,		500),	// D5
 	XLIBDEF(SerialPortXObj,		kXObj,			200),	// D2
 	XLIBDEF(SmackerXtra,			kXtraObj,					500),	// D5
@@ -358,6 +367,7 @@ static const struct XLibProto {
 	XLIBDEF(StayToonedOberXtra,			kXtraObj,					500),	// D5
 	XLIBDEF(StayToonedToonXtra,			kXtraObj,					500),	// D5
 	XLIBDEF(SysColorXObj,		kXObj,			400),	// D4
+	XLIBDEF(TemnotaXObj,			kXObj,					400),	// D4
 	XLIBDEF(TenguXObj,			kXObj,			400),	// D4
 	XLIBDEF(TimextraXtra,		kXtraObj,		500),	// D5
 	XLIBDEF(UnitTestXObj,		kXObj,			400),	// D4
diff --git a/engines/director/lingo/xlibs/b/blockthedrawingxobj.cpp b/engines/director/lingo/xlibs/b/blockthedrawingxobj.cpp
new file mode 100644
index 00000000000..ea75a7e60c5
--- /dev/null
+++ b/engines/director/lingo/xlibs/b/blockthedrawingxobj.cpp
@@ -0,0 +1,103 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/system.h"
+
+#include "director/director.h"
+#include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
+#include "director/lingo/lingo-utils.h"
+#include "director/lingo/xlibs/b/blockthedrawingxobj.h"
+
+/**************************************************
+ *
+ * USED IN:
+ * wttf
+ *
+ **************************************************/
+
+/*
+--		BlockTheDrawingXObj v 1.0d2 (c) 1995 Samizdat Productions.
+--		All Rights Reserved.
+--		Written by Christopher P. Kelly.
+I		mNew
+IIIII	mSetRect
+I		mInstallPatch
+I		mRemovePatch
+I		mDisposeMem
+ */
+
+namespace Director {
+
+const char *BlockTheDrawingXObj::xlibName = "BlockTheDrawingXObj";
+const XlibFileDesc BlockTheDrawingXObj::fileNames[] = {
+	{ "BlockTheDrawingXObj",   nullptr },
+	{ nullptr,        nullptr },
+};
+
+static MethodProto xlibMethods[] = {
+	{ "new",				BlockTheDrawingXObj::m_new,		 0, 0,	400 },
+	{ "setRect",				BlockTheDrawingXObj::m_setRect,		 4, 4,	400 },
+	{ "installPatch",				BlockTheDrawingXObj::m_installPatch,		 0, 0,	400 },
+	{ "removePatch",				BlockTheDrawingXObj::m_removePatch,		 0, 0,	400 },
+	{ "disposeMem",				BlockTheDrawingXObj::m_disposeMem,		 0, 0,	400 },
+
+	{ nullptr, nullptr, 0, 0, 0 }
+};
+
+static BuiltinProto xlibBuiltins[] = {
+
+	{ nullptr, nullptr, 0, 0, 0, VOIDSYM }
+};
+
+BlockTheDrawingXObject::BlockTheDrawingXObject(ObjectType ObjectType) :Object<BlockTheDrawingXObject>("BlockTheDrawingXObj") {
+	_objType = ObjectType;
+}
+
+void BlockTheDrawingXObj::open(ObjectType type, const Common::Path &path) {
+    BlockTheDrawingXObject::initMethods(xlibMethods);
+    BlockTheDrawingXObject *xobj = new BlockTheDrawingXObject(type);
+    if (type == kXtraObj) {
+        g_lingo->_openXtras.push_back(xlibName);
+		g_lingo->_openXtraObjects.push_back(xobj);
+	}
+    g_lingo->exposeXObject(xlibName, xobj);
+    g_lingo->initBuiltIns(xlibBuiltins);
+}
+
+void BlockTheDrawingXObj::close(ObjectType type) {
+    BlockTheDrawingXObject::cleanupMethods();
+    g_lingo->_globalvars[xlibName] = Datum();
+
+}
+
+void BlockTheDrawingXObj::m_new(int nargs) {
+	g_lingo->printSTUBWithArglist("BlockTheDrawingXObj::m_new", nargs);
+	g_lingo->dropStack(nargs);
+	g_lingo->push(g_lingo->_state->me);
+}
+
+XOBJSTUB(BlockTheDrawingXObj::m_setRect, 0)
+XOBJSTUB(BlockTheDrawingXObj::m_installPatch, 0)
+XOBJSTUB(BlockTheDrawingXObj::m_removePatch, 0)
+XOBJSTUB(BlockTheDrawingXObj::m_disposeMem, 0)
+
+}
diff --git a/engines/director/lingo/xlibs/b/blockthedrawingxobj.h b/engines/director/lingo/xlibs/b/blockthedrawingxobj.h
new file mode 100644
index 00000000000..df6a0780b2a
--- /dev/null
+++ b/engines/director/lingo/xlibs/b/blockthedrawingxobj.h
@@ -0,0 +1,50 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef DIRECTOR_LINGO_XLIBS_B_BLOCKTHEDRAWINGXOBJ_H
+#define DIRECTOR_LINGO_XLIBS_B_BLOCKTHEDRAWINGXOBJ_H
+
+namespace Director {
+
+class BlockTheDrawingXObject : public Object<BlockTheDrawingXObject> {
+public:
+	BlockTheDrawingXObject(ObjectType objType);
+};
+
+namespace BlockTheDrawingXObj {
+
+extern const char *xlibName;
+extern const XlibFileDesc fileNames[];
+
+void open(ObjectType type, const Common::Path &path);
+void close(ObjectType type);
+
+void m_new(int nargs);
+void m_setRect(int nargs);
+void m_installPatch(int nargs);
+void m_removePatch(int nargs);
+void m_disposeMem(int nargs);
+
+} // End of namespace BlockTheDrawingXObj
+
+} // End of namespace Director
+
+#endif
diff --git a/engines/director/lingo/xlibs/m/mazexobj.cpp b/engines/director/lingo/xlibs/m/mazexobj.cpp
new file mode 100644
index 00000000000..a49b64fa0d4
--- /dev/null
+++ b/engines/director/lingo/xlibs/m/mazexobj.cpp
@@ -0,0 +1,144 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/system.h"
+
+#include "director/director.h"
+#include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
+#include "director/lingo/lingo-utils.h"
+#include "director/lingo/xlibs/m/mazexobj.h"
+
+/**************************************************
+ *
+ * USED IN:
+ * wttf
+ *
+ **************************************************/
+
+/*
+--		Maze XObj v 1.09F (c) 1995 Samizdat Productions. All Rights Reserved.
+--		written by Christopher P. Kelly
+I		mNew
+II		mUserClicked where
+II		mCheckClick where
+S		mGetKeySettings
+IS		mSetKeySettings string
+S		mGetLocSettings
+IS		mSetLocSettings string
+I		mGetTemplate
+I		mGetKeyAdded
+IS		mSetCDPath fullpath
+IS		mSetHDPath fullpath
+IIIII	mSetMovieBox t,l,b,r
+II		mUpdateScreen moveFlag
+I		mFixScreen
+I		mGetLevel
+II		mGetKeyState keyNum
+III		mSetKeyState keyNum, state
+II		mSetPreclickOption onOrOff
+I		mDisposeMem
+ */
+
+namespace Director {
+
+const char *MazeXObj::xlibName = "MazeObj";
+const XlibFileDesc MazeXObj::fileNames[] = {
+	{ "MazeObj",   nullptr },
+	{ nullptr,        nullptr },
+};
+
+static MethodProto xlibMethods[] = {
+	{ "new",				MazeXObj::m_new,		 0, 0,	400 },
+	{ "userClicked",				MazeXObj::m_userClicked,		 1, 1,	400 },
+	{ "checkClick",				MazeXObj::m_checkClick,		 1, 1,	400 },
+	{ "getKeySettings",				MazeXObj::m_getKeySettings,		 0, 0,	400 },
+	{ "setKeySettings",				MazeXObj::m_setKeySettings,		 1, 1,	400 },
+	{ "getLocSettings",				MazeXObj::m_getLocSettings,		 0, 0,	400 },
+	{ "setLocSettings",				MazeXObj::m_setLocSettings,		 1, 1,	400 },
+	{ "getTemplate",				MazeXObj::m_getTemplate,		 0, 0,	400 },
+	{ "getKeyAdded",				MazeXObj::m_getKeyAdded,		 0, 0,	400 },
+	{ "setCDPath",				MazeXObj::m_setCDPath,		 1, 1,	400 },
+	{ "setHDPath",				MazeXObj::m_setHDPath,		 1, 1,	400 },
+	{ "setMovieBox",				MazeXObj::m_setMovieBox,		 4, 4,	400 },
+	{ "updateScreen",				MazeXObj::m_updateScreen,		 1, 1,	400 },
+	{ "fixScreen",				MazeXObj::m_fixScreen,		 0, 0,	400 },
+	{ "getLevel",				MazeXObj::m_getLevel,		 0, 0,	400 },
+	{ "getKeyState",				MazeXObj::m_getKeyState,		 1, 1,	400 },
+	{ "setKeyState",				MazeXObj::m_setKeyState,		 2, 2,	400 },
+	{ "setPreclickOption",				MazeXObj::m_setPreclickOption,		 1, 1,	400 },
+	{ "disposeMem",				MazeXObj::m_disposeMem,		 0, 0,	400 },
+
+	{ nullptr, nullptr, 0, 0, 0 }
+};
+
+static BuiltinProto xlibBuiltins[] = {
+
+	{ nullptr, nullptr, 0, 0, 0, VOIDSYM }
+};
+
+MazeXObject::MazeXObject(ObjectType ObjectType) :Object<MazeXObject>("MazeObj") {
+	_objType = ObjectType;
+}
+
+void MazeXObj::open(ObjectType type, const Common::Path &path) {
+    MazeXObject::initMethods(xlibMethods);
+    MazeXObject *xobj = new MazeXObject(type);
+    if (type == kXtraObj) {
+        g_lingo->_openXtras.push_back(xlibName);
+		g_lingo->_openXtraObjects.push_back(xobj);
+	}
+    g_lingo->exposeXObject(xlibName, xobj);
+    g_lingo->initBuiltIns(xlibBuiltins);
+}
+
+void MazeXObj::close(ObjectType type) {
+    MazeXObject::cleanupMethods();
+    g_lingo->_globalvars[xlibName] = Datum();
+
+}
+
+void MazeXObj::m_new(int nargs) {
+	g_lingo->printSTUBWithArglist("MazeXObj::m_new", nargs);
+	g_lingo->dropStack(nargs);
+	g_lingo->push(g_lingo->_state->me);
+}
+
+XOBJSTUB(MazeXObj::m_userClicked, 0)
+XOBJSTUB(MazeXObj::m_checkClick, 0)
+XOBJSTUB(MazeXObj::m_getKeySettings, "")
+XOBJSTUB(MazeXObj::m_setKeySettings, 0)
+XOBJSTUB(MazeXObj::m_getLocSettings, "")
+XOBJSTUB(MazeXObj::m_setLocSettings, 0)
+XOBJSTUB(MazeXObj::m_getTemplate, 0)
+XOBJSTUB(MazeXObj::m_getKeyAdded, 0)
+XOBJSTUB(MazeXObj::m_setCDPath, 0)
+XOBJSTUB(MazeXObj::m_setHDPath, 0)
+XOBJSTUB(MazeXObj::m_setMovieBox, 0)
+XOBJSTUB(MazeXObj::m_updateScreen, 0)
+XOBJSTUB(MazeXObj::m_fixScreen, 0)
+XOBJSTUB(MazeXObj::m_getLevel, 0)
+XOBJSTUB(MazeXObj::m_getKeyState, 0)
+XOBJSTUB(MazeXObj::m_setKeyState, 0)
+XOBJSTUB(MazeXObj::m_setPreclickOption, 0)
+XOBJSTUB(MazeXObj::m_disposeMem, 0)
+
+}
diff --git a/engines/director/lingo/xlibs/m/mazexobj.h b/engines/director/lingo/xlibs/m/mazexobj.h
new file mode 100644
index 00000000000..398e880dabb
--- /dev/null
+++ b/engines/director/lingo/xlibs/m/mazexobj.h
@@ -0,0 +1,64 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef DIRECTOR_LINGO_XLIBS_M_MAZEXOBJ_H
+#define DIRECTOR_LINGO_XLIBS_M_MAZEXOBJ_H
+
+namespace Director {
+
+class MazeXObject : public Object<MazeXObject> {
+public:
+	MazeXObject(ObjectType objType);
+};
+
+namespace MazeXObj {
+
+extern const char *xlibName;
+extern const XlibFileDesc fileNames[];
+
+void open(ObjectType type, const Common::Path &path);
+void close(ObjectType type);
+
+void m_new(int nargs);
+void m_userClicked(int nargs);
+void m_checkClick(int nargs);
+void m_getKeySettings(int nargs);
+void m_setKeySettings(int nargs);
+void m_getLocSettings(int nargs);
+void m_setLocSettings(int nargs);
+void m_getTemplate(int nargs);
+void m_getKeyAdded(int nargs);
+void m_setCDPath(int nargs);
+void m_setHDPath(int nargs);
+void m_setMovieBox(int nargs);
+void m_updateScreen(int nargs);
+void m_fixScreen(int nargs);
+void m_getLevel(int nargs);
+void m_getKeyState(int nargs);
+void m_setKeyState(int nargs);
+void m_setPreclickOption(int nargs);
+void m_disposeMem(int nargs);
+
+} // End of namespace MazeXObj
+
+} // End of namespace Director
+
+#endif
diff --git a/engines/director/lingo/xlibs/p/playsoundmoviexobj.cpp b/engines/director/lingo/xlibs/p/playsoundmoviexobj.cpp
new file mode 100644
index 00000000000..4b93de39628
--- /dev/null
+++ b/engines/director/lingo/xlibs/p/playsoundmoviexobj.cpp
@@ -0,0 +1,102 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/system.h"
+
+#include "director/director.h"
+#include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
+#include "director/lingo/lingo-utils.h"
+#include "director/lingo/xlibs/p/playsoundmoviexobj.h"
+
+/**************************************************
+ *
+ * USED IN:
+ * wttf
+ *
+ **************************************************/
+
+/*
+--		SaveNRestore XObj v 1.0d2 (c) 1995 Samizdat Productions. All Rights Reserved.
+--		written by Christopher P. Kelly
+I		mNew
+IS		mMovieOpen fullPathName
+I		mMovieIdle
+II		mMovieSetVolume newVolume
+I		mMovieStop
+ */
+
+namespace Director {
+
+const char *PlaySoundMovieXObj::xlibName = "PlaySoundMovieXObj";
+const XlibFileDesc PlaySoundMovieXObj::fileNames[] = {
+	{ "PlaySoundMovieXObj",   nullptr },
+	{ nullptr,        nullptr },
+};
+
+static MethodProto xlibMethods[] = {
+	{ "new",				PlaySoundMovieXObj::m_new,		 0, 0,	400 },
+	{ "movieOpen",				PlaySoundMovieXObj::m_movieOpen,		 1, 1,	400 },
+	{ "movieIdle",				PlaySoundMovieXObj::m_movieIdle,		 0, 0,	400 },
+	{ "movieSetVolume",				PlaySoundMovieXObj::m_movieSetVolume,		 1, 1,	400 },
+	{ "movieStop",				PlaySoundMovieXObj::m_movieStop,		 0, 0,	400 },
+
+	{ nullptr, nullptr, 0, 0, 0 }
+};
+
+static BuiltinProto xlibBuiltins[] = {
+
+	{ nullptr, nullptr, 0, 0, 0, VOIDSYM }
+};
+
+PlaySoundMovieXObject::PlaySoundMovieXObject(ObjectType ObjectType) :Object<PlaySoundMovieXObject>("PlaySoundMovieXObj") {
+	_objType = ObjectType;
+}
+
+void PlaySoundMovieXObj::open(ObjectType type, const Common::Path &path) {
+    PlaySoundMovieXObject::initMethods(xlibMethods);
+    PlaySoundMovieXObject *xobj = new PlaySoundMovieXObject(type);
+    if (type == kXtraObj) {
+        g_lingo->_openXtras.push_back(xlibName);
+		g_lingo->_openXtraObjects.push_back(xobj);
+	}
+    g_lingo->exposeXObject(xlibName, xobj);
+    g_lingo->initBuiltIns(xlibBuiltins);
+}
+
+void PlaySoundMovieXObj::close(ObjectType type) {
+    PlaySoundMovieXObject::cleanupMethods();
+    g_lingo->_globalvars[xlibName] = Datum();
+
+}
+
+void PlaySoundMovieXObj::m_new(int nargs) {
+	g_lingo->printSTUBWithArglist("PlaySoundMovieXObj::m_new", nargs);
+	g_lingo->dropStack(nargs);
+	g_lingo->push(g_lingo->_state->me);
+}
+
+XOBJSTUB(PlaySoundMovieXObj::m_movieOpen, 0)
+XOBJSTUB(PlaySoundMovieXObj::m_movieIdle, 0)
+XOBJSTUB(PlaySoundMovieXObj::m_movieSetVolume, 0)
+XOBJSTUB(PlaySoundMovieXObj::m_movieStop, 0)
+
+}
diff --git a/engines/director/lingo/xlibs/p/playsoundmoviexobj.h b/engines/director/lingo/xlibs/p/playsoundmoviexobj.h
new file mode 100644
index 00000000000..302a74c7865
--- /dev/null
+++ b/engines/director/lingo/xlibs/p/playsoundmoviexobj.h
@@ -0,0 +1,50 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef DIRECTOR_LINGO_XLIBS_P_PLAYSOUNDMOVIEXOBJ_H
+#define DIRECTOR_LINGO_XLIBS_P_PLAYSOUNDMOVIEXOBJ_H
+
+namespace Director {
+
+class PlaySoundMovieXObject : public Object<PlaySoundMovieXObject> {
+public:
+	PlaySoundMovieXObject(ObjectType objType);
+};
+
+namespace PlaySoundMovieXObj {
+
+extern const char *xlibName;
+extern const XlibFileDesc fileNames[];
+
+void open(ObjectType type, const Common::Path &path);
+void close(ObjectType type);
+
+void m_new(int nargs);
+void m_movieOpen(int nargs);
+void m_movieIdle(int nargs);
+void m_movieSetVolume(int nargs);
+void m_movieStop(int nargs);
+
+} // End of namespace PlaySoundMovieXObj
+
+} // End of namespace Director
+
+#endif
diff --git a/engines/director/lingo/xlibs/s/savenrestorexobj.cpp b/engines/director/lingo/xlibs/s/savenrestorexobj.cpp
new file mode 100644
index 00000000000..700d0529696
--- /dev/null
+++ b/engines/director/lingo/xlibs/s/savenrestorexobj.cpp
@@ -0,0 +1,132 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/system.h"
+
+#include "director/director.h"
+#include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
+#include "director/lingo/lingo-utils.h"
+#include "director/lingo/xlibs/s/savenrestorexobj.h"
+
+/**************************************************
+ *
+ * USED IN:
+ * wttf
+ *
+ **************************************************/
+
+/*
+--		SaveNRestore XObj v 1.0d2 (c) 1995 Samizdat Productions. All Rights Reserved.
+--		written by Christopher P. Kelly
+I		mNew
+II		mWriteSettingsFile
+II		mReadSettingsFile
+IS		mSetDirectorMovie
+IS		mSetSubLocation1
+IS		mSetSubLocation2
+IIII		mSetKeys whichList position value
+IS		mSetMazeKeys
+IS		mSetMazeLocation
+S		mGetDirectorMovie
+S		mGetSubLocation1
+S		mGetSubLocation2
+III		mGetKeys whichList position
+S		mGetMazeKeys
+S		mGetMazeLocation
+ */
+
+namespace Director {
+
+const char *SaveNRestoreXObj::xlibName = "SaveNRestoreXObj";
+const XlibFileDesc SaveNRestoreXObj::fileNames[] = {
+	{ "SaveNRestoreXObj",   nullptr },
+	{ nullptr,        nullptr },
+};
+
+static MethodProto xlibMethods[] = {
+	{ "new",				SaveNRestoreXObj::m_new,		 0, 0,	400 },
+	{ "writeSettingsFile",				SaveNRestoreXObj::m_writeSettingsFile,		 1, 1,	400 },
+	{ "readSettingsFile",				SaveNRestoreXObj::m_readSettingsFile,		 1, 1,	400 },
+	{ "setDirectorMovie",				SaveNRestoreXObj::m_setDirectorMovie,		 1, 1,	400 },
+	{ "setSubLocation1",				SaveNRestoreXObj::m_setSubLocation1,		 1, 1,	400 },
+	{ "setSubLocation2",				SaveNRestoreXObj::m_setSubLocation2,		 1, 1,	400 },
+	{ "setKeys",				SaveNRestoreXObj::m_setKeys,		 3, 3,	400 },
+	{ "setMazeKeys",				SaveNRestoreXObj::m_setMazeKeys,		 1, 1,	400 },
+	{ "setMazeLocation",				SaveNRestoreXObj::m_setMazeLocation,		 1, 1,	400 },
+	{ "getDirectorMovie",				SaveNRestoreXObj::m_getDirectorMovie,		 0, 0,	400 },
+	{ "getSubLocation1",				SaveNRestoreXObj::m_getSubLocation1,		 0, 0,	400 },
+	{ "getSubLocation2",				SaveNRestoreXObj::m_getSubLocation2,		 0, 0,	400 },
+	{ "getKeys",				SaveNRestoreXObj::m_getKeys,		 2, 2,	400 },
+	{ "getMazeKeys",				SaveNRestoreXObj::m_getMazeKeys,		 0, 0,	400 },
+	{ "getMazeLocation",				SaveNRestoreXObj::m_getMazeLocation,		 0, 0,	400 },
+
+	{ nullptr, nullptr, 0, 0, 0 }
+};
+
+static BuiltinProto xlibBuiltins[] = {
+
+	{ nullptr, nullptr, 0, 0, 0, VOIDSYM }
+};
+
+SaveNRestoreXObject::SaveNRestoreXObject(ObjectType ObjectType) :Object<SaveNRestoreXObject>("SaveNRestoreXObj") {
+	_objType = ObjectType;
+}
+
+void SaveNRestoreXObj::open(ObjectType type, const Common::Path &path) {
+    SaveNRestoreXObject::initMethods(xlibMethods);
+    SaveNRestoreXObject *xobj = new SaveNRestoreXObject(type);
+    if (type == kXtraObj) {
+        g_lingo->_openXtras.push_back(xlibName);
+		g_lingo->_openXtraObjects.push_back(xobj);
+	}
+    g_lingo->exposeXObject(xlibName, xobj);
+    g_lingo->initBuiltIns(xlibBuiltins);
+}
+
+void SaveNRestoreXObj::close(ObjectType type) {
+    SaveNRestoreXObject::cleanupMethods();
+    g_lingo->_globalvars[xlibName] = Datum();
+
+}
+
+void SaveNRestoreXObj::m_new(int nargs) {
+	g_lingo->printSTUBWithArglist("SaveNRestoreXObj::m_new", nargs);
+	g_lingo->dropStack(nargs);
+	g_lingo->push(g_lingo->_state->me);
+}
+
+XOBJSTUB(SaveNRestoreXObj::m_writeSettingsFile, 0)
+XOBJSTUB(SaveNRestoreXObj::m_readSettingsFile, 0)
+XOBJSTUB(SaveNRestoreXObj::m_setDirectorMovie, 0)
+XOBJSTUB(SaveNRestoreXObj::m_setSubLocation1, 0)
+XOBJSTUB(SaveNRestoreXObj::m_setSubLocation2, 0)
+XOBJSTUB(SaveNRestoreXObj::m_setKeys, 0)
+XOBJSTUB(SaveNRestoreXObj::m_setMazeKeys, 0)
+XOBJSTUB(SaveNRestoreXObj::m_setMazeLocation, 0)
+XOBJSTUB(SaveNRestoreXObj::m_getDirectorMovie, "")
+XOBJSTUB(SaveNRestoreXObj::m_getSubLocation1, "")
+XOBJSTUB(SaveNRestoreXObj::m_getSubLocation2, "")
+XOBJSTUB(SaveNRestoreXObj::m_getKeys, 0)
+XOBJSTUB(SaveNRestoreXObj::m_getMazeKeys, "")
+XOBJSTUB(SaveNRestoreXObj::m_getMazeLocation, "")
+
+}
diff --git a/engines/director/lingo/xlibs/s/savenrestorexobj.h b/engines/director/lingo/xlibs/s/savenrestorexobj.h
new file mode 100644
index 00000000000..5a54f5e6fb2
--- /dev/null
+++ b/engines/director/lingo/xlibs/s/savenrestorexobj.h
@@ -0,0 +1,60 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef DIRECTOR_LINGO_XLIBS_S_SAVENRESTOREXOBJ_H
+#define DIRECTOR_LINGO_XLIBS_S_SAVENRESTOREXOBJ_H
+
+namespace Director {
+
+class SaveNRestoreXObject : public Object<SaveNRestoreXObject> {
+public:
+	SaveNRestoreXObject(ObjectType objType);
+};
+
+namespace SaveNRestoreXObj {
+
+extern const char *xlibName;
+extern const XlibFileDesc fileNames[];
+
+void open(ObjectType type, const Common::Path &path);
+void close(ObjectType type);
+
+void m_new(int nargs);
+void m_writeSettingsFile(int nargs);
+void m_readSettingsFile(int nargs);
+void m_setDirectorMovie(int nargs);
+void m_setSubLocation1(int nargs);
+void m_setSubLocation2(int nargs);
+void m_setKeys(int nargs);
+void m_setMazeKeys(int nargs);
+void m_setMazeLocation(int nargs);
+void m_getDirectorMovie(int nargs);
+void m_getSubLocation1(int nargs);
+void m_getSubLocation2(int nargs);
+void m_getKeys(int nargs);
+void m_getMazeKeys(int nargs);
+void m_getMazeLocation(int nargs);
+
+} // End of namespace SaveNRestoreXObj
+
+} // End of namespace Director
+
+#endif
diff --git a/engines/director/lingo/xlibs/t/temnotaxobj.cpp b/engines/director/lingo/xlibs/t/temnotaxobj.cpp
new file mode 100644
index 00000000000..71dc1c5cd87
--- /dev/null
+++ b/engines/director/lingo/xlibs/t/temnotaxobj.cpp
@@ -0,0 +1,97 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/system.h"
+
+#include "director/director.h"
+#include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
+#include "director/lingo/lingo-utils.h"
+#include "director/lingo/xlibs/t/temnotaxobj.h"
+
+/**************************************************
+ *
+ * USED IN:
+ * wttf
+ *
+ **************************************************/
+
+/*
+--		TemnotaXObj v 1.0d2 (c) 1995 Samizdat Productions.
+--		All Rights Reserved.
+--		written by Christopher P. Kelly
+I		mNew
+I		mPutUp
+I		mGoAway
+ */
+
+namespace Director {
+
+const char *TemnotaXObj::xlibName = "TemnotaXObj";
+const XlibFileDesc TemnotaXObj::fileNames[] = {
+	{ "TemnotaXObj",   nullptr },
+	{ nullptr,        nullptr },
+};
+
+static MethodProto xlibMethods[] = {
+	{ "new",				TemnotaXObj::m_new,		 0, 0,	400 },
+	{ "putUp",				TemnotaXObj::m_putUp,		 0, 0,	400 },
+	{ "goAway",				TemnotaXObj::m_goAway,		 0, 0,	400 },
+
+	{ nullptr, nullptr, 0, 0, 0 }
+};
+
+static BuiltinProto xlibBuiltins[] = {
+
+	{ nullptr, nullptr, 0, 0, 0, VOIDSYM }
+};
+
+TemnotaXObject::TemnotaXObject(ObjectType ObjectType) :Object<TemnotaXObject>("TemnotaXObj") {
+	_objType = ObjectType;
+}
+
+void TemnotaXObj::open(ObjectType type, const Common::Path &path) {
+    TemnotaXObject::initMethods(xlibMethods);
+    TemnotaXObject *xobj = new TemnotaXObject(type);
+    if (type == kXtraObj) {
+        g_lingo->_openXtras.push_back(xlibName);
+		g_lingo->_openXtraObjects.push_back(xobj);
+	}
+    g_lingo->exposeXObject(xlibName, xobj);
+    g_lingo->initBuiltIns(xlibBuiltins);
+}
+
+void TemnotaXObj::close(ObjectType type) {
+    TemnotaXObject::cleanupMethods();
+    g_lingo->_globalvars[xlibName] = Datum();
+
+}
+
+void TemnotaXObj::m_new(int nargs) {
+	g_lingo->printSTUBWithArglist("TemnotaXObj::m_new", nargs);
+	g_lingo->dropStack(nargs);
+	g_lingo->push(g_lingo->_state->me);
+}
+
+XOBJSTUB(TemnotaXObj::m_putUp, 0)
+XOBJSTUB(TemnotaXObj::m_goAway, 0)
+
+}
diff --git a/engines/director/lingo/xlibs/t/temnotaxobj.h b/engines/director/lingo/xlibs/t/temnotaxobj.h
new file mode 100644
index 00000000000..eb9ac7bfb72
--- /dev/null
+++ b/engines/director/lingo/xlibs/t/temnotaxobj.h
@@ -0,0 +1,48 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef DIRECTOR_LINGO_XLIBS_T_TEMNOTAXOBJ_H
+#define DIRECTOR_LINGO_XLIBS_T_TEMNOTAXOBJ_H
+
+namespace Director {
+
+class TemnotaXObject : public Object<TemnotaXObject> {
+public:
+	TemnotaXObject(ObjectType objType);
+};
+
+namespace TemnotaXObj {
+
+extern const char *xlibName;
+extern const XlibFileDesc fileNames[];
+
+void open(ObjectType type, const Common::Path &path);
+void close(ObjectType type);
+
+void m_new(int nargs);
+void m_putUp(int nargs);
+void m_goAway(int nargs);
+
+} // End of namespace TemnotaXObj
+
+} // End of namespace Director
+
+#endif
diff --git a/engines/director/module.mk b/engines/director/module.mk
index 9e3d48ab560..958520d232e 100644
--- a/engines/director/module.mk
+++ b/engines/director/module.mk
@@ -132,7 +132,12 @@ MODULE_OBJS = \
 	lingo/xlibs/m/movutils.o \
 	lingo/xlibs/m/msfile.o \
 	lingo/xlibs/m/mystisle.o \
+	lingo/xlibs/b/blockthedrawingxobj.o \
+	lingo/xlibs/m/mazexobj.o \
 	lingo/xlibs/o/openbleedwindowxcmd.o \
+ 	lingo/xlibs/p/playsoundmoviexobj.o \
+ 	lingo/xlibs/s/savenrestorexobj.o \
+ 	lingo/xlibs/t/temnotaxobj.o \
 	lingo/xlibs/o/orthoplayxobj.o \
 	lingo/xlibs/p/paco.o \
 	lingo/xlibs/p/palxobj.o \


Commit: b4b3a8dc70409b74615abc5670ab8e5d74d22230
    https://github.com/scummvm/scummvm/commit/b4b3a8dc70409b74615abc5670ab8e5d74d22230
Author: Scott Percival (code at moral.net.au)
Date: 2026-01-16T18:46:52+03:00

Commit Message:
DIRECTOR: Fix detection entry for beyondthewall

Changed paths:
    engines/director/detection_tables.h


diff --git a/engines/director/detection_tables.h b/engines/director/detection_tables.h
index e82f49181d6..486f27ad4ce 100644
--- a/engines/director/detection_tables.h
+++ b/engines/director/detection_tables.h
@@ -2526,10 +2526,10 @@ static const DirectorGameDescription gameDescriptions[] = {
 
 	WINGAME1t("bestservice", "", "BESTDEMO.EXE", "437d0bc26a89a5f8cda3bef31db23897", 370015, 310),
 
-	MACGAME1("beyondthewall", "",  "Beyond The Wall Of Stars", "107c6a6d3cce957eaa26d427e672000c", 465267, 300),
-	MACGAME1("beyondthewall", "",  "Desktop Folder/bstars", "107c6a6d3cce957eaa26d427e672000c", 465267, 300),
-	WINGAME2t("beyondthewall", "", "WALL.EXE",	"36a8d553a58437752e12b250389a4629", 225253,
-								   "TITLE.MMM",	"1fa63036a9c55cdbec8830219315ee7a", 661220, 300),
+	MACGAME1("beyondthewall", "",  "Beyond The Wall Of Stars", "rt:449d133e14d82d6fc87d76fd048c588d", 465267, 300),
+	MACGAME1("beyondthewall", "",  "Desktop Folder/bstars", "rt:449d133e14d82d6fc87d76fd048c588d", 465267, 300),
+	WINGAME2t("beyondthewall", "", "PCMMMFIL/WALL.EXE",	"t:36a8d553a58437752e12b250389a4629", 225253,
+								   "PCMMMFIL/TITLE.MMM",	"d:9e77d5f51082677628f62112f79f2eeb", 661220, 300),
 
 	MACDEMO1_l("bigtimemovie", "Demo", "BIG TIME MOVIE-Studios", "f5277c53bacd27936158dd3867e587e2", 392265, Common::JA_JPN, 311),
 


Commit: 41afdf15efd3d3a2682297dcf36e8005c65ff071
    https://github.com/scummvm/scummvm/commit/41afdf15efd3d3a2682297dcf36e8005c65ff071
Author: Scott Percival (code at moral.net.au)
Date: 2026-01-16T18:46:52+03:00

Commit Message:
DIRECTOR: Fix buggy behaviour of d_strstr

Fixes substitution of the commander's name in Beyond the Wall of Stars -
this uses b_offset() to search for "iii", which was getting tripped up
by the singular letter I.

Changed paths:
    engines/director/util.cpp


diff --git a/engines/director/util.cpp b/engines/director/util.cpp
index 9e9cec7ef9a..777dc786c2b 100644
--- a/engines/director/util.cpp
+++ b/engines/director/util.cpp
@@ -1807,24 +1807,34 @@ bool compareStringEquality(const Common::String &s1, const Common::String &s2) {
 }
 
 const char *d_strstr(const char *str, const char *substr) {
-	// Check if the substr is found inside the str
-	int len = strlen(substr);
-	const char *ref = substr;
-
-	while (*str && *ref) {
-		const uint32 c1 = getCharEquality(*str);
-		const uint32 c2 = getCharEquality(*ref);
-
-		str++;
+	while (*str && *substr) {
+		uint32 c1 = getCharEquality(*str);
+		uint32 c2 = getCharEquality(*substr);
+
+		if (c1 == c2) {
+			// inner loop, keep track of the starting character
+			const char *baseptr = str;
+			const char *ref = substr;
+			while (*baseptr && *ref) {
+				c1 = getCharEquality(*baseptr);
+				c2 = getCharEquality(*ref);
+
+				// characters equal, increment substring
+				if (c1 == c2) {
+					ref++;
+				} else {
+					break;
+				}
 
-		if (c1 == c2)
-			ref++;
+				// reached the end of the substring, success
+				if (!*ref)
+					return str;
 
-		if (!*ref)
-			return (str - len);
+				baseptr++;
+			}
+		}
 
-		if (len == (ref - substr))
-			ref = substr;
+		str++;
 	}
 
 	return nullptr;


Commit: 606da4c9d4195b7e93019320d9e86f92e51beb71
    https://github.com/scummvm/scummvm/commit/606da4c9d4195b7e93019320d9e86f92e51beb71
Author: Scott Percival (code at moral.net.au)
Date: 2026-01-16T18:46:52+03:00

Commit Message:
DIRECTOR: Fix Ghost/NotGhost/Reverse/NotReverse ink types in 32bpp mode

Changed paths:
    engines/director/graphics.cpp


diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 4d3c4c46c53..d09b6152098 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -443,33 +443,53 @@ void InkPrimitives<T>::drawPoint(int x, int y, uint32 src, void *data) {
 		}
 		break;
 	case kInkTypeReverse:
-		// XOR dst palette index with src.
-		// Originally designed for 1-bit mode so that
-		// black pixels would appear white on a black
-		// background.
-		*dst ^= src;
+		if (sizeof(T) == 1) {
+			// XOR dst palette index with src.
+			// Originally designed for 1-bit mode so that
+			// black pixels would appear white on a black
+			// background.
+			*dst ^= src;
+		} else {
+			// In 32-bit mode, this is the opposite??
+			*dst ^= ~(src);
+		}
 		break;
 	case kInkTypeNotReverse:
-		// XOR dst palette index with the inverse of src.
-		*dst ^= ~(src);
+		if (sizeof(T) == 1) {
+			// XOR dst palette index with the inverse of src.
+			*dst ^= ~(src);
+		} else {
+			// In 32-bit mode, this is the opposite??
+			*dst ^= src & 0xffffff00;
+		}
 		break;
 	case kInkTypeGhost:
 		if (p->oneBitImage || p->applyColor) {
 			*dst = (src == p->colorBlack) ? p->backColor : *dst;
 		} else {
-			// AND dst palette index with the inverse of src.
-			// Originally designed for 1-bit mode so that
-			// black pixels would be invisible until they were
-			// over a black background, showing as white.
-			*dst = *dst & ~src;
+			if (sizeof(T) == 1) {
+				// AND dst palette index with the inverse of src.
+				// Originally designed for 1-bit mode so that
+				// black pixels would be invisible until they were
+				// over a black background, showing as white.
+				*dst = *dst & ~src;
+			} else {
+				// In 32-bit mode, OR dst RGBA with inverse src
+				*dst = *dst | ~src;
+			}
 		}
 		break;
 	case kInkTypeNotGhost:
 		if (p->oneBitImage || p->applyColor) {
 			*dst = (src == p->colorWhite) ? p->backColor : *dst;
 		} else {
-			// AND dst palette index with src.
-			*dst = *dst & src;
+			if (sizeof(T) == 1) {
+				// AND dst palette index with src.
+				*dst = *dst & src;
+			} else {
+				// In 32-bit mode, OR dst RGBA with src
+				*dst = *dst | src;
+			}
 		}
 		break;
 	default: {


Commit: ddc621d2bab657035eae38cb4c4bf6fed611d9dc
    https://github.com/scummvm/scummvm/commit/ddc621d2bab657035eae38cb4c4bf6fed611d9dc
Author: Scott Percival (code at moral.net.au)
Date: 2026-01-16T18:46:52+03:00

Commit Message:
DIRECTOR: Make 32-bit BITDDecoder images output an RGBA surface

Changed paths:
    engines/director/images.cpp


diff --git a/engines/director/images.cpp b/engines/director/images.cpp
index beebc03bf97..735ad73b00f 100644
--- a/engines/director/images.cpp
+++ b/engines/director/images.cpp
@@ -149,8 +149,8 @@ BITDDecoder::BITDDecoder(int w, int h, uint16 bitsPerPixel, uint16 pitch, const
 		format = Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0);
 		break;
 	case 4:
-		// RGB888
-		format = Graphics::PixelFormat(4, 8, 8, 8, 0, 16, 8, 0, 0);
+		// RGB8888
+		format = Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0);
 		break;
 	default:
 		warning("BITDDecoder::BITDDecoder(): unsupported bpp %d", bitsPerPixel);
@@ -309,7 +309,7 @@ bool BITDDecoder::loadStream(Common::SeekableReadStream &stream) {
 							pixels[(((y * _surface->w * 4)) + (x + 2 * _surface->w))] << 8 |
 							pixels[(((y * _surface->w * 4)) + (x + 3 * _surface->w))];
 					}
-					*((uint32 *)_surface->getBasePtr(x, y)) = color;
+					*((uint32 *)_surface->getBasePtr(x, y)) = (color << 8) | 0xff;
 					x++;
 					break;
 




More information about the Scummvm-git-logs mailing list