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

sdelamarre noreply at scummvm.org
Sat Sep 6 21:54:38 UTC 2025


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

Summary:
560eda1210 GOB: Add o7_startAdi4Application opcode (Adi4)
8db1f33eaf GOB: Add more opcodes related to Adi4 applications
029d567340 GOB: Implement "copy previous env" command in totSub (Adi4)
781ac276f9 GOB: Rename Hotspots::_hotspotText to "hotspotTTSText"
8a8357a579 GOB: Fix "part == -1" case in o2_getTotTextItemPart
f5ae8a252c GOB: Rename oPlaytoons_F_1B -> "oPlaytoons_createButton"
b80a173d49 GOB: Add an English version of Adibou 2 Read/Count 4-5 years
ddcfe9a598 GOB: Fix "backuping media" command in totSub


Commit: 560eda1210d8c3946d27a48cb9a706abaa9b8b1e
    https://github.com/scummvm/scummvm/commit/560eda1210d8c3946d27a48cb9a706abaa9b8b1e
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2025-09-06T23:54:26+02:00

Commit Message:
GOB: Add o7_startAdi4Application opcode (Adi4)

Changed paths:
    engines/gob/inter.h
    engines/gob/inter_v7.cpp


diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index be1b82bb3fd..7499ea35740 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -787,6 +787,17 @@ protected:
 	void o7_readData(OpFuncParams &params);
 	void o7_writeData(OpFuncParams &params);
 
+	bool readAdi4InfDataForChild(Common::Array<byte> &dest, uint32 childNumber, uint32 offset, uint32 size);
+	bool readAdi4InstalledAppsData(Common::Array<byte> &generalChildData,
+								   Common::Array<byte> &appChildData,
+								   uint32 childNbr, uint32 appliNbr);
+	bool writeAdi4InfDataForChild(const Common::Array<byte> &data, uint32 childNumber, uint32 offset, uint32 size);
+	bool writeAdi4InstalledAppsData(const Common::Array<byte> &generalChildData,
+									const Common::Array<byte> &appChildData,
+									uint32 childNbr, uint32 appliNbr);
+
+	void o7_startAdi4Application(OpGobParams &params);
+
 	void o7_xorDeobfuscate(OpGobParams &params);
 	void o7_xorObfuscate(OpGobParams &params);
 	void o7_ansiToOEM(OpGobParams &params);
@@ -797,6 +808,15 @@ protected:
 	void o7_dummy(OpGobParams &params);
 
 private:
+	const uint32 kAdi4InfChildDataSize = 7406;
+	const uint32 kAdi4InfGeneralChildDataSize = 3406;
+	const uint32 kAdi4InfAppChildDataSize = 200;
+
+	uint32 _adi4CurrentAppNbr;
+	uint32 _adi4CurrentChildNbr;
+	Common::Array<byte> _adi4GeneralChildData;
+	Common::Array<byte> _adi4CurrentAppChildData;
+
 	INIConfig _inis;
 	TranslationDatabases _translationDatabases;
 	Common::HashMap<Common::String, Database, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _databases;
diff --git a/engines/gob/inter_v7.cpp b/engines/gob/inter_v7.cpp
index 3e99edcd24f..9c78cc8ec70 100644
--- a/engines/gob/inter_v7.cpp
+++ b/engines/gob/inter_v7.cpp
@@ -152,6 +152,7 @@ void Inter_v7::setupOpcodesFunc() {
 void Inter_v7::setupOpcodesGob() {
 	Inter_Playtoons::setupOpcodesGob();
 
+	OPCODEGOB(406, o7_startAdi4Application);
 	OPCODEGOB(407, o7_xorDeobfuscate);
 	OPCODEGOB(408, o7_xorObfuscate);
 	OPCODEGOB(420, o7_ansiToOEM);
@@ -1982,6 +1983,163 @@ void Inter_v7::xorDeobfuscate(byte *str, int len) {
 		str[i] = str[i] ^ str[i - 1];
 }
 
+bool Inter_v7::readAdi4InfDataForChild(Common::Array<byte> &dest, uint32 childNumber, uint32 offset, uint32 size) {
+	uint32 totalOffset = childNumber * kAdi4InfChildDataSize + offset;
+	assert(size <= dest.size());
+
+	if (!_vm->_saveLoad->loadToRaw("ADI.INF", dest.data(), size, totalOffset))
+		return false;
+
+	xorDeobfuscate(dest.data(), size);
+	return true;
+}
+
+bool Inter_v7::readAdi4InstalledAppsData(Common::Array<byte> &generalChildData,
+										 Common::Array<byte> &appChildData,
+										 uint32 childNbr,
+										 uint32 appliNbr) {
+	if (!readAdi4InfDataForChild(generalChildData, childNbr, 0, kAdi4InfGeneralChildDataSize)) {
+		warning("readAdi4InstalledAppsData: Failed to read general data for child %d in ADI.INF", childNbr);
+		return false;
+	}
+
+	Common::Array<byte> appChildDataPacked(kAdi4InfAppChildDataSize);
+	if (!readAdi4InfDataForChild(appChildDataPacked,
+								 childNbr,
+								 kAdi4InfGeneralChildDataSize + appliNbr * kAdi4InfAppChildDataSize,
+								 kAdi4InfAppChildDataSize)) {
+		warning("readAdi4InstalledAppsData: Failed to read app-specific data for child %d in ADI.INF", childNbr);
+		return false;
+	}
+
+	for (uint32 i = 0; i < kAdi4InfAppChildDataSize; ++i) {
+		appChildData[i] = appChildDataPacked[i] & 3;
+		appChildData[i + kAdi4InfAppChildDataSize] = (appChildDataPacked[i] >> 2) & 3;
+		appChildData[i + 2 * kAdi4InfAppChildDataSize] = (appChildDataPacked[i] >> 4) & 3;
+	}
+
+	return true;
+}
+
+bool Inter_v7::writeAdi4InfDataForChild(const Common::Array<byte> &src, uint32 childNumber, uint32 offset, uint32 size) {
+	int adiInfSize = _vm->_saveLoad->getSize("ADI.INF");
+	if (adiInfSize < 0) {
+		warning("writeAdi4InfDataForChild: ADI.INF file not found");
+		return false;
+	}
+
+	Common::Array<byte> bytesToWrite(size);
+	memcpy(bytesToWrite.data(), src.data(), size);
+	xorObfuscate(bytesToWrite.data(), bytesToWrite.size());
+
+	uint32 totalOffset = childNumber * kAdi4InfChildDataSize + offset;
+	if (totalOffset > (uint32) adiInfSize) {
+		// Offset is past the current size, fill the gap with spaces
+		Common::Array<byte> emptySpace(totalOffset - adiInfSize, ' ');
+		if (!_vm->_saveLoad->saveFromRaw("ADI.INF", emptySpace.data(), emptySpace.size(), adiInfSize))
+			return false;
+	}
+
+	if (!_vm->_saveLoad->saveFromRaw("ADI.INF", bytesToWrite.data(), bytesToWrite.size(), totalOffset))
+		return false;
+
+	return true;
+}
+
+bool Inter_v7::writeAdi4InstalledAppsData(const Common::Array<byte> &generalChildData,
+										 const Common::Array<byte> &appChildData,
+										 uint32 childNbr,
+										 uint32 appliNbr) {
+
+	if (!writeAdi4InfDataForChild(generalChildData, childNbr, 0, kAdi4InfGeneralChildDataSize)) {
+		warning("wrAdi4InstalledAppsData: Failed to write general data for child %d in ADI.INF", childNbr);
+		return false;
+	}
+
+	Common::Array<byte> appChildDataPacked(kAdi4InfAppChildDataSize);
+	for (uint32 i = 0; i < kAdi4InfAppChildDataSize; ++i) {
+		appChildDataPacked[i] = (appChildData[i] & 3) |
+								((appChildData[i + kAdi4InfAppChildDataSize] & 3) << 2) |
+								((appChildData[i + 2 * kAdi4InfAppChildDataSize] & 3) << 4);
+	}
+
+	if (!readAdi4InfDataForChild(appChildDataPacked,
+								 childNbr,
+								 kAdi4InfGeneralChildDataSize + appliNbr * kAdi4InfAppChildDataSize,
+								 kAdi4InfAppChildDataSize)) {
+		warning("readAdi4InstalledAppsData: Failed to write app-specific data for child %d in ADI.INF", childNbr);
+		return false;
+	}
+
+	return true;
+}
+
+void Inter_v7::o7_startAdi4Application(OpGobParams &params) {
+	uint16 varIndexAppNbr = _vm->_game->_script->readUint16();
+	uint16 varIndexChildNbr = _vm->_game->_script->readUint16();
+
+	_adi4CurrentAppNbr = VAR(varIndexAppNbr);
+	_adi4CurrentChildNbr = VAR(varIndexChildNbr);
+
+	_adi4GeneralChildData.resize(kAdi4InfGeneralChildDataSize);
+	_adi4CurrentAppChildData.resize(3 * kAdi4InfAppChildDataSize, ' ');
+
+	readAdi4InstalledAppsData(_adi4GeneralChildData,
+							  _adi4CurrentAppChildData,
+							  _adi4CurrentChildNbr,
+							  _adi4CurrentAppNbr);
+
+	char appliAbbreviationBuf[4];
+	appliAbbreviationBuf[0] = static_cast<char>(_adi4GeneralChildData[_adi4CurrentAppNbr * 4 + 55]);
+	appliAbbreviationBuf[1] = static_cast<char>(_adi4GeneralChildData[_adi4CurrentAppNbr * 4 + 56]);
+	appliAbbreviationBuf[2] = static_cast<char>(_adi4GeneralChildData[_adi4CurrentAppNbr * 4 + 57]);
+	appliAbbreviationBuf[3] = '\0';
+
+	Common::String appliAbbreviation(appliAbbreviationBuf);
+	byte c = _adi4GeneralChildData[_adi4CurrentAppNbr * 4 + 58];
+
+	Common::String appliDescFilename = "<CD>DESC" + appliAbbreviation;
+	if (c != 0) {
+		appliDescFilename.push_back(static_cast<char>(c));
+	}
+
+	appliDescFilename += ".ADI";
+
+	Common::String appliDescFile = getFile(appliDescFilename.c_str());
+
+	// Ensure the desc file is found
+	if (!_vm->_dataIO->hasFile(appliDescFile)) {
+		warning("o7_startAdi4Application: desc file '%s' not found (application %d, child %d)",
+				appliDescFile.c_str(),
+				_adi4CurrentAppNbr,
+				_adi4CurrentChildNbr);
+		return;
+	}
+
+	if (c == 0) {
+		// Ensure the ADIVMD.TIK file is found
+		if (!_vm->_dataIO->hasFile(getFile("<CD>ADIVMD.TIK"))) {
+			warning("o7_startAdi4Application: desc file '%s' not found (application %d, child %d)",
+					appliDescFile.c_str(),
+					_adi4CurrentAppNbr,
+					_adi4CurrentChildNbr);
+			return;
+		}
+
+		warning("o7_startAdi4Application: c = 0 case stub");
+	} else {
+		Common::String appliStkFile = "ADI" + appliAbbreviation + ".STK";
+		_vm->_dataIO->openArchive(appliStkFile, false);
+
+		Common::String appliIntroTotFile = appliAbbreviation + "INTRO";
+		_vm->_game->totSub(1, appliIntroTotFile);
+
+		_vm->_dataIO->closeArchive(false);
+	}
+
+	_adi4GeneralChildData.clear();
+	_adi4CurrentAppChildData.clear();
+}
 
 void Inter_v7::o7_xorDeobfuscate(OpGobParams &params) {
 	uint16 varIndex = _vm->_game->_script->readUint16();


Commit: 8db1f33eaf97728813be3efd87d07ee843f37b21
    https://github.com/scummvm/scummvm/commit/8db1f33eaf97728813be3efd87d07ee843f37b21
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2025-09-06T23:54:26+02:00

Commit Message:
GOB: Add more opcodes related to Adi4 applications

Changed paths:
    engines/gob/inter.h
    engines/gob/inter_v7.cpp


diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index 7499ea35740..a979c929f46 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -796,6 +796,10 @@ protected:
 									const Common::Array<byte> &appChildData,
 									uint32 childNbr, uint32 appliNbr);
 
+	void o7_writeUnknownChildDataToGameVariables(OpGobParams &params);
+	void o7_writeUnknownAppChildDataToGameVariables(OpGobParams &params);
+	void o7_writeUnknownChildUin16ToGameVariables(OpGobParams &params);
+
 	void o7_startAdi4Application(OpGobParams &params);
 
 	void o7_xorDeobfuscate(OpGobParams &params);
@@ -812,8 +816,9 @@ private:
 	const uint32 kAdi4InfGeneralChildDataSize = 3406;
 	const uint32 kAdi4InfAppChildDataSize = 200;
 
-	uint32 _adi4CurrentAppNbr;
-	uint32 _adi4CurrentChildNbr;
+	uint32 _adi4CurrentAppNbr = 0;
+	uint32 _adi4CurrentChildNbr = 0;
+	uint32 _adi4CurrentSectionInAppChildData = 0; // 0, 1, or 2
 	Common::Array<byte> _adi4GeneralChildData;
 	Common::Array<byte> _adi4CurrentAppChildData;
 
diff --git a/engines/gob/inter_v7.cpp b/engines/gob/inter_v7.cpp
index 9c78cc8ec70..f0c751543b2 100644
--- a/engines/gob/inter_v7.cpp
+++ b/engines/gob/inter_v7.cpp
@@ -150,7 +150,9 @@ void Inter_v7::setupOpcodesFunc() {
 }
 
 void Inter_v7::setupOpcodesGob() {
-	Inter_Playtoons::setupOpcodesGob();
+	OPCODEGOB(55, o7_writeUnknownChildDataToGameVariables);
+	OPCODEGOB(64, o7_writeUnknownAppChildDataToGameVariables);
+	OPCODEGOB(74, o7_writeUnknownChildUin16ToGameVariables);
 
 	OPCODEGOB(406, o7_startAdi4Application);
 	OPCODEGOB(407, o7_xorDeobfuscate);
@@ -2050,7 +2052,6 @@ bool Inter_v7::writeAdi4InstalledAppsData(const Common::Array<byte> &generalChil
 										 const Common::Array<byte> &appChildData,
 										 uint32 childNbr,
 										 uint32 appliNbr) {
-
 	if (!writeAdi4InfDataForChild(generalChildData, childNbr, 0, kAdi4InfGeneralChildDataSize)) {
 		warning("wrAdi4InstalledAppsData: Failed to write general data for child %d in ADI.INF", childNbr);
 		return false;
@@ -2069,11 +2070,41 @@ bool Inter_v7::writeAdi4InstalledAppsData(const Common::Array<byte> &generalChil
 								 kAdi4InfAppChildDataSize)) {
 		warning("readAdi4InstalledAppsData: Failed to write app-specific data for child %d in ADI.INF", childNbr);
 		return false;
-	}
+								 }
 
 	return true;
 }
 
+void Inter_v7::o7_writeUnknownChildDataToGameVariables(OpGobParams &params) {
+	uint16 destVarIndex = _vm->_game->_script->readUint16();
+	_vm->_game->_script->skip(14);
+
+	if (_adi4GeneralChildData.empty())
+		return;
+
+	_vm->_inter->_variables->copyFrom(destVarIndex * 4, &_adi4GeneralChildData[3344], 40);
+	WRITE_VARO_UINT16(destVarIndex * 4 + 39, _adi4CurrentChildNbr);
+}
+
+void Inter_v7::o7_writeUnknownAppChildDataToGameVariables(OpGobParams &params) {
+	uint16 destVarIndex = _vm->_game->_script->readUint16();
+	if (_adi4GeneralChildData.empty())
+		return;
+
+	for (uint32 i = 0; i < kAdi4InfAppChildDataSize; ++i) {
+		WRITE_VARO_UINT8(destVarIndex * 4 + i,
+						_adi4CurrentAppChildData[i + _adi4CurrentSectionInAppChildData * kAdi4InfAppChildDataSize] & 3);
+	}
+}
+
+void Inter_v7::o7_writeUnknownChildUin16ToGameVariables(OpGobParams &params) {
+	uint16 varIndex = _vm->_game->_script->readUint16();
+	if (_adi4GeneralChildData.empty())
+		return;
+
+	WRITE_VAR(varIndex, READ_LE_UINT16(&_adi4GeneralChildData[3241]));
+}
+
 void Inter_v7::o7_startAdi4Application(OpGobParams &params) {
 	uint16 varIndexAppNbr = _vm->_game->_script->readUint16();
 	uint16 varIndexChildNbr = _vm->_game->_script->readUint16();
@@ -2137,6 +2168,7 @@ void Inter_v7::o7_startAdi4Application(OpGobParams &params) {
 		_vm->_dataIO->closeArchive(false);
 	}
 
+	_adi4CurrentSectionInAppChildData = 0;
 	_adi4GeneralChildData.clear();
 	_adi4CurrentAppChildData.clear();
 }


Commit: 029d56734023ca181491a60907e574be947fe293
    https://github.com/scummvm/scummvm/commit/029d56734023ca181491a60907e574be947fe293
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2025-09-06T23:54:26+02:00

Commit Message:
GOB: Implement "copy previous env" command in totSub (Adi4)

Changed paths:
    engines/gob/game.cpp


diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp
index ef92f2c54bd..579b1574227 100644
--- a/engines/gob/game.cpp
+++ b/engines/gob/game.cpp
@@ -908,6 +908,9 @@ void Game::totSub(int8 flags, const Common::String &totFile) {
 	if (_numEnvironments >= Environments::kEnvironmentCount)
 		error("Game::totSub(): Environments overflow");
 
+	debugC(4, kDebugGameFlow,
+		   "Pushing current env (index %d, script %s) to stack, opening env (index %d, script %s.TOT)",
+		   _numEnvironments, _curTotFile.c_str(), _numEnvironments + 1, totFile.c_str());
 	_environments.set(_numEnvironments);
 
 	if (flags == 18) {
@@ -922,43 +925,80 @@ void Game::totSub(int8 flags, const Common::String &totFile) {
 	_script = new Script(_vm);
 	_resources = new Resources(_vm);
 
-	if (flags & 0x80)
-		warning("Addy Stub: Game::totSub(), flags & 0x80");
-
 	if (flags & 5)
 		_vm->_inter->_variables = nullptr;
 
 	_curTotFile = totFile + ".TOT";
 
-	if (_vm->_inter->_terminate != 0) {
-		clearUnusedEnvironment();
-		return;
-	}
 
-	if (!(flags & 0x20))
-		_hotspots->push(0, true);
+	bool copyPreviousMatchingEnv = flags & 0x80;
+	if (copyPreviousMatchingEnv) {
+		bool matchingEnvFoundP = false;
+		for (int8 env = 0; env < _curEnvironment - 1; ++env) {
+			if (_environments.getTotFile(env).equalsIgnoreCase(_curTotFile)) {
+				debugC(4, kDebugGameFlow, "Copy previous environment (index %d, script %s) from stack",
+					   env, _curTotFile.c_str());
+				_environments.get(env);
+				_curEnvironment = env;
+				matchingEnvFoundP = true;
+				break;
+			}
+		}
 
-	if ((flags == 18) || (flags & 0x06))
-		playTot(-1);
-	else
-		playTot(0);
+		if (matchingEnvFoundP) {
+			if (_vm->_inter->_terminate != 0) {
+				clearUnusedEnvironment();
+				return;
+			}
 
-	if (_vm->_inter->_terminate != 2)
-		_vm->_inter->_terminate = 0;
+			if (!(flags & 0x20))
+				_hotspots->push(0, true);
 
-	if (!(flags & 0x20)) {
-		_hotspots->clear();
-		_hotspots->pop();
-	}
+			playTot(flags & 0x0F);
 
-	if ((flags & 5) && _vm->_inter->_variables)
-		_vm->_inter->delocateVars();
+			if (_vm->_inter->_terminate < 2)
+				_vm->_inter->_terminate = 0;
+
+			if (!(flags & 0x20)) {
+				_hotspots->clear();
+				_hotspots->pop();
+			}
+		}
+	} else {
+		if (_vm->_inter->_terminate != 0) {
+			clearUnusedEnvironment();
+			return;
+		}
+
+		if (!(flags & 0x20))
+			_hotspots->push(0, true);
+
+		if ((flags == 18) || (flags & 0x06))
+			playTot(-1);
+		else
+			playTot(0);
+
+		if (_vm->_inter->_terminate != 2)
+			_vm->_inter->_terminate = 0;
+
+		if (!(flags & 0x20)) {
+			_hotspots->clear();
+			_hotspots->pop();
+		}
+
+		if ((flags & 5) && _vm->_inter->_variables)
+			_vm->_inter->delocateVars();
+	}
 
 	clearUnusedEnvironment();
 
+
 	_numEnvironments--;
 	_curEnvironment = curBackupPos;
 	_environments.get(_numEnvironments);
+	debugC(4, kDebugGameFlow,
+		   "Closing env (index %d, script %s.TOT), popping env (index %d, script %s) from stack.",
+		   _numEnvironments + 1, totFile.c_str(), _numEnvironments , _vm->_game->_curTotFile.c_str());
 
 	if (flags == 18) {
 		warning("Restoring media from %d", _numEnvironments);


Commit: 781ac276f9c36786a86d8f5b2bd552714e2125ec
    https://github.com/scummvm/scummvm/commit/781ac276f9c36786a86d8f5b2bd552714e2125ec
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2025-09-06T23:54:26+02:00

Commit Message:
GOB: Rename Hotspots::_hotspotText to "hotspotTTSText"

To avoid confusion with Draw->_hotspotText.

Changed paths:
    engines/gob/draw_fascin.cpp
    engines/gob/draw_playtoons.cpp
    engines/gob/draw_v1.cpp
    engines/gob/draw_v2.cpp
    engines/gob/game.cpp
    engines/gob/hotspots.cpp
    engines/gob/hotspots.h
    engines/gob/inter_v1.cpp
    engines/gob/util.cpp


diff --git a/engines/gob/draw_fascin.cpp b/engines/gob/draw_fascin.cpp
index ac09b9079e0..8ad199646e5 100644
--- a/engines/gob/draw_fascin.cpp
+++ b/engines/gob/draw_fascin.cpp
@@ -260,7 +260,7 @@ void Draw_Fascination::spriteOperation(int16 operation, bool ttsAddHotspotText)
 
 #ifdef USE_TTS
 		if (ttsAddHotspotText) {
-			_vm->_game->_hotspots->addHotspotText(_textToPrint, left, _destSpriteY,
+			_vm->_game->_hotspots->addHotspotTTSText(_textToPrint, left, _destSpriteY,
 											_destSpriteX - 1, _destSpriteY + _fonts[_fontIndex]->getCharHeight() - 1, _destSurface);
 		}
 #endif
@@ -552,7 +552,7 @@ void Draw_Fascination::drawWin(int16 fct) {
 			_destSpriteX += len * _fonts[_fontIndex]->getCharWidth();
 
 #ifdef USE_TTS
-			_vm->_game->_hotspots->addHotspotText(_textToPrint, left, _destSpriteY,
+			_vm->_game->_hotspots->addHotspotTTSText(_textToPrint, left, _destSpriteY,
 											_destSpriteX - 1, _destSpriteY + _fonts[_fontIndex]->getCharHeight() - 1, _destSurface);
 #endif
 
@@ -676,7 +676,7 @@ void Draw_Fascination::drawWin(int16 fct) {
 			_destSpriteX += len * _fonts[_fontIndex]->getCharWidth();
 
 #ifdef USE_TTS
-			_vm->_game->_hotspots->addHotspotText(_textToPrint, left, _destSpriteY,
+			_vm->_game->_hotspots->addHotspotTTSText(_textToPrint, left, _destSpriteY,
 											_destSpriteX - 1, _destSpriteY + _fonts[_fontIndex]->getCharHeight() - 1, _destSurface);
 #endif
 
diff --git a/engines/gob/draw_playtoons.cpp b/engines/gob/draw_playtoons.cpp
index 2bf25312b40..aa8118a0cec 100644
--- a/engines/gob/draw_playtoons.cpp
+++ b/engines/gob/draw_playtoons.cpp
@@ -353,7 +353,7 @@ void Draw_Playtoons::spriteOperation(int16 operation, bool ttsAddHotspotText) {
 
 #ifdef USE_TTS
 		if (ttsAddHotspotText) {
-			_vm->_game->_hotspots->addHotspotText(_textToPrint, left, _destSpriteY, 
+			_vm->_game->_hotspots->addHotspotTTSText(_textToPrint, left, _destSpriteY, 
 											_destSpriteX - 1, _destSpriteY + _fonts[_fontIndex]->getCharHeight() - 1, _destSurface);
 		}
 #endif
diff --git a/engines/gob/draw_v1.cpp b/engines/gob/draw_v1.cpp
index ebda9c4b480..7ea2a36df24 100644
--- a/engines/gob/draw_v1.cpp
+++ b/engines/gob/draw_v1.cpp
@@ -438,7 +438,7 @@ void Draw_v1::spriteOperation(int16 operation, bool ttsAddHotspotText) {
 
 #ifdef USE_TTS
 		if (ttsAddHotspotText) {
-			_vm->_game->_hotspots->addHotspotText(_textToPrint, _destSpriteX, _destSpriteY,
+			_vm->_game->_hotspots->addHotspotTTSText(_textToPrint, _destSpriteX, _destSpriteY,
 											_destSpriteX + len * font->getCharWidth() - 1,
 											_destSpriteY + font->getCharHeight() - 1, _destSurface);
 		}
diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp
index 91a5636ea5e..b56654d5e19 100644
--- a/engines/gob/draw_v2.cpp
+++ b/engines/gob/draw_v2.cpp
@@ -899,7 +899,7 @@ void Draw_v2::spriteOperation(int16 operation, bool ttsAddHotspotText) {
 		}
 
 		if (ttsAddHotspotText) {
-			_vm->_game->_hotspots->addHotspotText(_textToPrint, left, _destSpriteY,
+			_vm->_game->_hotspots->addHotspotTTSText(_textToPrint, left, _destSpriteY,
 											_destSpriteX - 1, _destSpriteY + _fonts[_fontIndex]->getCharHeight() - 1, _destSurface);
 		}
 #endif
diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp
index 579b1574227..892a929dce9 100644
--- a/engines/gob/game.cpp
+++ b/engines/gob/game.cpp
@@ -688,7 +688,7 @@ void Game::playTot(int32 function) {
 #ifdef USE_TTS
 	if (_vm->getGameType() == kGameTypeWeen && _vm->isCurrentTot("edit.tot")) {
 		_vm->_weenVoiceNotepad = true;
-		_vm->_game->_hotspots->clearHotspotText();
+		_vm->_game->_hotspots->clearHotspotTTSText();
 	}
 #endif
 
@@ -764,7 +764,7 @@ void Game::capturePop(char doDraw) {
 		_vm->_draw->_needAdjust = savedNeedAdjust;
 
 #ifdef USE_TTS
-		_hotspots->clearHotspotText();
+		_hotspots->clearHotspotTTSText();
 #endif
 	}
 	_vm->_draw->freeSprite(Draw::kCaptureSurface + _captureCount);
diff --git a/engines/gob/hotspots.cpp b/engines/gob/hotspots.cpp
index 154401190f7..9fb00036211 100644
--- a/engines/gob/hotspots.cpp
+++ b/engines/gob/hotspots.cpp
@@ -212,7 +212,7 @@ Hotspots::Hotspots(GobEngine *vm) : _vm(vm) {
 	_currentX     = 0;
 	_currentY     = 0;
 #ifdef USE_TTS
-	_currentHotspotTextIndex = -1;
+	_currentHotspotTTSTextIndex = -1;
 	_hotspotSpokenLast = false;
 #endif
 }
@@ -270,8 +270,8 @@ uint16 Hotspots::add(const Hotspot &hotspot) {
 		spot.scriptFuncLeave = _vm->_game->_script;
 
 #ifdef USE_TTS
-		removeHotspotText(i);
-		expandHotspotText(i);
+		removeHotspotTTSText(i);
+		expandHotspotTTSText(i);
 #endif
 
 		debugC(1, kDebugHotspots, "Adding hotspot %03d: Coord:%3d+%3d+%3d+%3d - id:%04X, key:%04X, flag:%04X - fcts:%5d, %5d, %5d",
@@ -291,7 +291,7 @@ void Hotspots::remove(uint16 id) {
 			debugC(1, kDebugHotspots, "Removing hotspot %d: %X", i, id);
 			_hotspots[i].clear();
 #ifdef USE_TTS
-			removeHotspotText(i);
+			removeHotspotTTSText(i);
 #endif
 		}
 	}
@@ -305,7 +305,7 @@ void Hotspots::removeState(uint8 state) {
 			debugC(1, kDebugHotspots, "Removing hotspot %d: %X (by state %X)", i, spot.id, state);
 			spot.clear();
 #ifdef USE_TTS
-			removeHotspotText(i);
+			removeHotspotTTSText(i);
 #endif
 		}
 	}
@@ -389,7 +389,7 @@ void Hotspots::recalculate(bool force) {
 
 #ifdef USE_TTS
 	voiceUnassignedHotspots();
-	clearUnassignedHotspotText();
+	clearUnassignedHotspotTTSText();
 #endif
 }
 
@@ -1777,7 +1777,7 @@ void Hotspots::evaluate() {
 	}
 
 #ifdef USE_TTS
-	clearUnassignedHotspotText();
+	clearUnassignedHotspotTTSText();
 #endif
 }
 
@@ -1913,44 +1913,44 @@ bool Hotspots::hoveringOverHotspot() const {
 	return _currentIndex != 0;
 }
 
-void Hotspots::addHotspotText(const Common::String &text, uint16 x1, uint16 y1, uint16 x2, uint16 y2, int16 surf) {
+void Hotspots::addHotspotTTSText(const Common::String &text, uint16 x1, uint16 y1, uint16 x2, uint16 y2, int16 surf) {
 	if (x1 <= x2 && y1 <= y2) {
 		Common::Rect rect(x1, y1, x2, y2);
-		for (uint i = 0; i < _hotspotText.size(); ++i) {
+		for (uint i = 0; i < _hotspotTTSText.size(); ++i) {
 			// If there's already hotspot text at the same position, simply change the text
-			if (rect.contains(_hotspotText[i].rect) || _hotspotText[i].rect.contains(rect)) {
-				_hotspotText[i].str = text;
-				_hotspotText[i].voiced = false;
+			if (rect.contains(_hotspotTTSText[i].rect) || _hotspotTTSText[i].rect.contains(rect)) {
+				_hotspotTTSText[i].str = text;
+				_hotspotTTSText[i].voiced = false;
 				return;
 			}
 		}
 
-		_hotspotText.push_back(HotspotTTSText{text, rect, -1, false, surf});
+		_hotspotTTSText.push_back(HotspotTTSText{text, rect, -1, false, surf});
 	} else {
 		_vm->sayText(text, Common::TextToSpeechManager::QUEUE);
 	}
 }
 
-void Hotspots::voiceHotspotText(int16 x, int16 y) {
+void Hotspots::voiceHotspotTTSText(int16 x, int16 y) {
 	// Don't allow any text on Ween's notepad to be voiced by moving the mouse, as the text is typically broken into pieces,
 	// which results in awkward voicing
 	if (_vm->getGameType() == kGameTypeWeen && _vm->isCurrentTot("edit.tot")) {
 		return;
 	}
 
-	for (uint i = 0; i < _hotspotText.size(); ++i) {
-		if (_hotspotText[i].rect.contains(x, y)) {
-			if ((int16)i != _currentHotspotTextIndex) {
-				_vm->sayText(_hotspotText[i].str, _hotspotSpokenLast ? Common::TextToSpeechManager::INTERRUPT : Common::TextToSpeechManager::QUEUE);
+	for (uint i = 0; i < _hotspotTTSText.size(); ++i) {
+		if (_hotspotTTSText[i].rect.contains(x, y)) {
+			if ((int16)i != _currentHotspotTTSTextIndex) {
+				_vm->sayText(_hotspotTTSText[i].str, _hotspotSpokenLast ? Common::TextToSpeechManager::INTERRUPT : Common::TextToSpeechManager::QUEUE);
 				_hotspotSpokenLast = true;
-				_currentHotspotTextIndex = i;
+				_currentHotspotTTSTextIndex = i;
 			}
 			
 			return;
 		}
 	}
 
-	_currentHotspotTextIndex = -1;
+	_currentHotspotTTSTextIndex = -1;
 	if (!hoveringOverHotspot()) {
 		clearPreviousSaid();
 	}
@@ -1959,23 +1959,23 @@ void Hotspots::voiceHotspotText(int16 x, int16 y) {
 
 void Hotspots::voiceUnassignedHotspots() {
 	Common::String ttsMessage;
-	for (uint i = 0; i < _hotspotText.size(); ++i) {
+	for (uint i = 0; i < _hotspotTTSText.size(); ++i) {
 		// For Ween's notepad, manually add spaces back in
 		if (_vm->getGameType() == kGameTypeWeen && _vm->isCurrentTot("edit.tot")) {
 			if (_vm->_weenVoiceNotepad) {
 				if (_vm->_draw->_fontIndex < _vm->_draw->kFontCount && _vm->_draw->_fonts[_vm->_draw->_fontIndex]) {
 					if (i > 0 && 
-						_hotspotText[i].rect.left != 
-						_hotspotText[i - 1].rect.left + _vm->_draw->_fonts[_vm->_draw->_fontIndex]->getCharWidth()) {
+						_hotspotTTSText[i].rect.left !=
+						_hotspotTTSText[i - 1].rect.left + _vm->_draw->_fonts[_vm->_draw->_fontIndex]->getCharWidth()) {
 						ttsMessage += " ";
 					}
 				}
 
-				ttsMessage += _hotspotText[i].str;
+				ttsMessage += _hotspotTTSText[i].str;
 			}
-		} else if (_hotspotText[i].hotspot == -1 && !_hotspotText[i].voiced) {
-			ttsMessage += _hotspotText[i].str + "\n";
-			_hotspotText[i].voiced = true;
+		} else if (_hotspotTTSText[i].hotspot == -1 && !_hotspotTTSText[i].voiced) {
+			ttsMessage += _hotspotTTSText[i].str + "\n";
+			_hotspotTTSText[i].voiced = true;
 		}
 	}
 
@@ -1986,14 +1986,14 @@ void Hotspots::voiceUnassignedHotspots() {
 	}
 }
 
-void Hotspots::clearHotspotText() {
-	_hotspotText.clear();
+void Hotspots::clearHotspotTTSText() {
+	_hotspotTTSText.clear();
 }
 
-void Hotspots::clearUnassignedHotspotText() {
-	for (Common::Array<HotspotTTSText>::iterator it = _hotspotText.begin(); it != _hotspotText.end();) {
+void Hotspots::clearUnassignedHotspotTTSText() {
+	for (Common::Array<HotspotTTSText>::iterator it = _hotspotTTSText.begin(); it != _hotspotTTSText.end();) {
 		if (it->hotspot == -1) {
-			it = _hotspotText.erase(it);
+			it = _hotspotTTSText.erase(it);
 		} else {
 			it++;
 		}
@@ -2004,15 +2004,15 @@ void Hotspots::clearPreviousSaid() {
 	_previousSaid.clear();
 }
 
-void Hotspots::adjustHotspotTextRect(int16 oldLeft, int16 oldTop, int16 oldRight, int16 oldBottom, int16 newX, int16 newY, int16 surf) {
+void Hotspots::adjustHotspotTTSTextRect(int16 oldLeft, int16 oldTop, int16 oldRight, int16 oldBottom, int16 newX, int16 newY, int16 surf) {
 	if (oldLeft > oldRight || oldTop > oldBottom) {
 		return;
 	}
 
 	Common::Rect oldRect(oldLeft, oldTop, oldRight, oldBottom);
-	for (uint i = 0; i < _hotspotText.size(); ++i) {
-		if (_hotspotText[i].surf == surf && oldRect.contains(_hotspotText[i].rect)) {
-			_hotspotText[i].rect.moveTo(newX, newY);
+	for (uint i = 0; i < _hotspotTTSText.size(); ++i) {
+		if (_hotspotTTSText[i].surf == surf && oldRect.contains(_hotspotTTSText[i].rect)) {
+			_hotspotTTSText[i].rect.moveTo(newX, newY);
 			return;
 		}
 	}
@@ -2432,7 +2432,7 @@ void Hotspots::updateAllTexts(const InputDesc *inputs) const {
 
 #ifdef USE_TTS
 
-void Hotspots::expandHotspotText(uint16 spotID) {
+void Hotspots::expandHotspotTTSText(uint16 spotID) {
 	if (spotID > kHotspotCount || _hotspots[spotID].getType() == kTypeClick || _hotspots[spotID].isDisabled()) {
 		return;
 	}
@@ -2456,14 +2456,14 @@ void Hotspots::expandHotspotText(uint16 spotID) {
 		return;
 	}
 	
-	for (int i = _hotspotText.size() - 1; i >= 0; --i) {
-		if (_hotspotText[i].hotspot != -1) {
+	for (int i = _hotspotTTSText.size() - 1; i >= 0; --i) {
+		if (_hotspotTTSText[i].hotspot != -1) {
 			continue;
 		}
 
-		if (spotRect.intersects(_hotspotText[i].rect)) {
-			_hotspotText[i].rect = spotRect;
-			_hotspotText[i].hotspot = spotID;
+		if (spotRect.intersects(_hotspotTTSText[i].rect)) {
+			_hotspotTTSText[i].rect = spotRect;
+			_hotspotTTSText[i].hotspot = spotID;
 
 			// Try to voice what the mouse is hovering over, as the text underneath the mouse may have changed
 			int16 dx = 0;
@@ -2473,19 +2473,19 @@ void Hotspots::expandHotspotText(uint16 spotID) {
 				dy = 0;
 			}
 
-			voiceHotspotText(_vm->_global->_inter_mouseX - dx, _vm->_global->_inter_mouseY - dy);
+			voiceHotspotTTSText(_vm->_global->_inter_mouseX - dx, _vm->_global->_inter_mouseY - dy);
 			return;
 		}
 	}
 }
 
-void Hotspots::removeHotspotText(uint16 spotID) {
-	for (uint i = 0; i < _hotspotText.size(); ++i) {
-		if (_hotspotText[i].hotspot == spotID) {
-			_hotspotText.remove_at(i);
+void Hotspots::removeHotspotTTSText(uint16 spotID) {
+	for (uint i = 0; i < _hotspotTTSText.size(); ++i) {
+		if (_hotspotTTSText[i].hotspot == spotID) {
+			_hotspotTTSText.remove_at(i);
 
-			if ((int16)i == _currentHotspotTextIndex) {
-				_currentHotspotTextIndex = -1;
+			if ((int16)i == _currentHotspotTTSTextIndex) {
+				_currentHotspotTTSTextIndex = -1;
 			}
 			return;
 		}
diff --git a/engines/gob/hotspots.h b/engines/gob/hotspots.h
index f0c27390d50..b3c6d4b2f18 100644
--- a/engines/gob/hotspots.h
+++ b/engines/gob/hotspots.h
@@ -108,13 +108,13 @@ public:
 
 #ifdef USE_TTS
 	bool hoveringOverHotspot() const;
-	void addHotspotText(const Common::String &text, uint16 x1, uint16 y1, uint16 x2, uint16 y2, int16 surf);
+	void addHotspotTTSText(const Common::String &text, uint16 x1, uint16 y1, uint16 x2, uint16 y2, int16 surf);
 	void voiceUnassignedHotspots();
-	void voiceHotspotText(int16 x, int16 y);
-	void clearHotspotText();
-	void clearUnassignedHotspotText();
+	void voiceHotspotTTSText(int16 x, int16 y);
+	void clearHotspotTTSText();
+	void clearUnassignedHotspotTTSText();
 	void clearPreviousSaid();
-	void adjustHotspotTextRect(int16 oldLeft, int16 oldTop, int16 oldRight, int16 oldBottom, int16 newX, int16 newY, int16 surf);
+	void adjustHotspotTTSTextRect(int16 oldLeft, int16 oldTop, int16 oldRight, int16 oldBottom, int16 newX, int16 newY, int16 surf);
 #endif
 
 private:
@@ -212,9 +212,9 @@ private:
 
 #ifdef USE_TTS
 	Common::String _previousSaid;
-	int16 _currentHotspotTextIndex;
 	bool _hotspotSpokenLast;
-	Common::Array<HotspotTTSText> _hotspotText;
+	Common::Array<HotspotTTSText> _hotspotTTSText;
+	int16 _currentHotspotTTSTextIndex;
 #endif
 
 	/** Add a hotspot, returning the new index. */
@@ -308,8 +308,8 @@ private:
 	void updateAllTexts(const InputDesc *inputs) const;
 
 #ifdef USE_TTS
-	void expandHotspotText(uint16 spotID);
-	void removeHotspotText(uint16 spotID);
+	void expandHotspotTTSText(uint16 spotID);
+	void removeHotspotTTSText(uint16 spotID);
 #endif
 };
 
diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp
index 59d35460c11..0af78047815 100644
--- a/engines/gob/inter_v1.cpp
+++ b/engines/gob/inter_v1.cpp
@@ -1372,7 +1372,7 @@ void Inter_v1::o1_keyFunc(OpFuncParams &params) {
 		storeKey(key);
 #ifdef USE_TTS
 		_vm->stopTextToSpeech();
-		_vm->_game->_hotspots->clearHotspotText();
+		_vm->_game->_hotspots->clearHotspotTTSText();
 #endif
 
 		_vm->_util->clearKeyBuf();
@@ -1676,7 +1676,7 @@ void Inter_v1::o1_copySprite(OpFuncParams &params) {
 	}
 
 #ifdef USE_TTS
-	_vm->_game->_hotspots->adjustHotspotTextRect(_vm->_draw->_spriteLeft, _vm->_draw->_spriteTop, 
+	_vm->_game->_hotspots->adjustHotspotTTSTextRect(_vm->_draw->_spriteLeft, _vm->_draw->_spriteTop,
 											_vm->_draw->_spriteLeft + _vm->_draw->_spriteRight - 1, 
 											_vm->_draw->_spriteTop + _vm->_draw->_spriteBottom - 1,
 											_vm->_draw->_destSpriteX, _vm->_draw->_destSpriteY, _vm->_draw->_sourceSurface);
diff --git a/engines/gob/util.cpp b/engines/gob/util.cpp
index 4e9a158a186..1014f4e0a67 100644
--- a/engines/gob/util.cpp
+++ b/engines/gob/util.cpp
@@ -374,7 +374,7 @@ void Util::setMousePos(int16 x, int16 y) {
 	g_system->warpMouse(x, y);
 
 #ifdef USE_TTS
-	_vm->_game->_hotspots->voiceHotspotText(x, y);
+	_vm->_game->_hotspots->voiceHotspotTTSText(x, y);
 #endif
 }
 


Commit: 8a8357a5796fddd24950db783886b1a51d3fd7d2
    https://github.com/scummvm/scummvm/commit/8a8357a5796fddd24950db783886b1a51d3fd7d2
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2025-09-06T23:54:26+02:00

Commit Message:
GOB: Fix "part == -1" case in o2_getTotTextItemPart

This case should only map _hotspotText to a game variable and return.
This _hotspotText variable is later used in Draw::oPlaytoons_sub_F_1B
(button drawing function)

Changed paths:
    engines/gob/inter_v2.cpp


diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp
index c0eea1f5e84..ae5f9805b3a 100644
--- a/engines/gob/inter_v2.cpp
+++ b/engines/gob/inter_v2.cpp
@@ -1243,8 +1243,8 @@ void Inter_v2::o2_getTotTextItemPart(OpFuncParams &params) {
 
 	stringVar = stringStartVar;
 	if (part == -1) {
-		warning("o2_getTotTextItemPart, part == -1");
 		_vm->_draw->_hotspotText = GET_VARO_STR(stringVar);
+		return;
 	}
 
 	WRITE_VARO_UINT8(stringVar, 0);


Commit: f5ae8a252ccca7184ae0e90584636eee6eee76b4
    https://github.com/scummvm/scummvm/commit/f5ae8a252ccca7184ae0e90584636eee6eee76b4
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2025-09-06T23:54:26+02:00

Commit Message:
GOB: Rename oPlaytoons_F_1B -> "oPlaytoons_createButton"

Changed paths:
    engines/gob/draw.cpp
    engines/gob/draw.h
    engines/gob/hotspots.cpp
    engines/gob/hotspots.h
    engines/gob/inter.h
    engines/gob/inter_playtoons.cpp


diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp
index cfb3edad76d..e6b856de69f 100644
--- a/engines/gob/draw.cpp
+++ b/engines/gob/draw.cpp
@@ -503,7 +503,7 @@ void Draw::printTextCentered(int16 id, int16 left, int16 top, int16 right,
 	spriteOperation(DRAW_PRINTTEXT);
 }
 
-void Draw::oPlaytoons_sub_F_1B(uint16 id, int16 left, int16 top, int16 right, int16 bottom,
+void Draw::drawButton(uint16 id, int16 left, int16 top, int16 right, int16 bottom,
 		char *paramStr, int16 fontIndex, int16 var4, int16 shortId) {
 
 	int16 width;
diff --git a/engines/gob/draw.h b/engines/gob/draw.h
index 00a8a370dec..74bf5cd85f8 100644
--- a/engines/gob/draw.h
+++ b/engines/gob/draw.h
@@ -208,7 +208,7 @@ public:
 	int stringLength(const char *str, uint16 fontIndex);
 	void printTextCentered(int16 id, int16 left, int16 top, int16 right,
 			int16 bottom, const char *str, int16 fontIndex, int16 color);
-	void oPlaytoons_sub_F_1B( uint16 id, int16 left, int16 top, int16 right, int16 bottom, char *paramStr, int16 var3, int16 var4, int16 shortId);
+	void drawButton( uint16 id, int16 left, int16 top, int16 right, int16 bottom, char *paramStr, int16 var3, int16 var4, int16 shortId);
 
 	int32 getSpriteRectSize(int16 index);
 	void forceBlit(bool backwards = false);
diff --git a/engines/gob/hotspots.cpp b/engines/gob/hotspots.cpp
index 9fb00036211..955c402d88c 100644
--- a/engines/gob/hotspots.cpp
+++ b/engines/gob/hotspots.cpp
@@ -1852,7 +1852,7 @@ int16 Hotspots::findCursor(uint16 x, uint16 y) const {
 	return cursor;
 }
 
-void Hotspots::oPlaytoons_F_1B() {
+void Hotspots::createButton() {
 	int16 shortId;
 	int16 longId;
 	int16 var2;
@@ -1882,7 +1882,7 @@ void Hotspots::oPlaytoons_F_1B() {
 		if ((_hotspots[i].id == 0xD000 + shortId) || (_hotspots[i].id == 0xB000 + shortId) ||
 			(_hotspots[i].id == 0x4000 + shortId)) {
 			longId = _hotspots[i].id;
-			warning("oPlaytoons_F_1B: shortId %d, var2 %d fontIndex %d var4 %d - longId %d", shortId, var2, fontIndex, var4, longId);
+			warning("createButton: shortId %d, var2 %d fontIndex %d var4 %d - longId %d", shortId, var2, fontIndex, var4, longId);
 
 			left = _hotspots[i].left;
 			top = _hotspots[i].top;
@@ -1899,7 +1899,7 @@ void Hotspots::oPlaytoons_F_1B() {
 				right -= 2;
 				bottom -= 2;
 			}
-			_vm->_draw->oPlaytoons_sub_F_1B(0x8000+ var2, left, top, right, bottom, _vm->_game->_script->getResultStr(), fontIndex, var4, shortId);
+			_vm->_draw->drawButton(0x8000+ var2, left, top, right, bottom, _vm->_game->_script->getResultStr(), fontIndex, var4, shortId);
 			return;
 		}
 	}
diff --git a/engines/gob/hotspots.h b/engines/gob/hotspots.h
index b3c6d4b2f18..3555d211bfa 100644
--- a/engines/gob/hotspots.h
+++ b/engines/gob/hotspots.h
@@ -104,7 +104,7 @@ public:
 	int16 findCursor(uint16 x, uint16 y) const;
 
 	/** implementation of oPlaytoons_F_1B code*/
-	void oPlaytoons_F_1B();
+	void createButton();
 
 #ifdef USE_TTS
 	bool hoveringOverHotspot() const;
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index a979c929f46..d6331c9c770 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -674,7 +674,7 @@ protected:
 	void setupOpcodesGob() override;
 
 	void oPlaytoons_printText(OpFuncParams &params);
-	void oPlaytoons_F_1B(OpFuncParams &params);
+	void oPlaytoons_createButton(OpFuncParams &params);
 	void oPlaytoons_putPixel(OpFuncParams &params);
 	void oPlaytoons_freeSprite(OpFuncParams &params);
 	void oPlaytoons_checkData(OpFuncParams &params);
diff --git a/engines/gob/inter_playtoons.cpp b/engines/gob/inter_playtoons.cpp
index 3fd0bb5cd88..f82fc8f3796 100644
--- a/engines/gob/inter_playtoons.cpp
+++ b/engines/gob/inter_playtoons.cpp
@@ -91,7 +91,7 @@ void Inter_Playtoons::setupOpcodesFunc() {
 
 	CLEAROPCODEFUNC(0x3D);
 	OPCODEFUNC(0x0B, oPlaytoons_printText);
-	OPCODEFUNC(0x1B, oPlaytoons_F_1B);
+	OPCODEFUNC(0x1B, oPlaytoons_createButton);
 	OPCODEFUNC(0x24, oPlaytoons_putPixel);
 	OPCODEFUNC(0x27, oPlaytoons_freeSprite);
 	OPCODEFUNC(0x3F, oPlaytoons_checkData);
@@ -188,8 +188,8 @@ void Inter_Playtoons::oPlaytoons_printText(OpFuncParams &params) {
 	_vm->_game->_script->skip(1);
 }
 
-void Inter_Playtoons::oPlaytoons_F_1B(OpFuncParams &params) {
-	_vm->_game->_hotspots->oPlaytoons_F_1B();
+void Inter_Playtoons::oPlaytoons_createButton(OpFuncParams &params) {
+	_vm->_game->_hotspots->createButton();
 }
 
 void Inter_Playtoons::oPlaytoons_putPixel(OpFuncParams &params) {


Commit: b80a173d49f117c28925ee24aeef653b9f06cb2b
    https://github.com/scummvm/scummvm/commit/b80a173d49f117c28925ee24aeef653b9f06cb2b
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2025-09-06T23:54:26+02:00

Commit Message:
GOB: Add an English version of Adibou 2 Read/Count 4-5 years

Changed paths:
    engines/gob/detection/tables_adibou2.h


diff --git a/engines/gob/detection/tables_adibou2.h b/engines/gob/detection/tables_adibou2.h
index 4cd06f89e86..91f95b99937 100644
--- a/engines/gob/detection/tables_adibou2.h
+++ b/engines/gob/detection/tables_adibou2.h
@@ -323,6 +323,21 @@
 	0, 0, 0
 },
 
+{
+	{
+		"adibou2readcount45",
+		"", // "I can read/I can count 4-5 years"
+		AD_ENTRY2s("intro_ap.stk", "5ac48f29e989fae9a3c600978e52f5cf", 41662238,
+				   "appli_01.vmd", "3a596569b76c0180a7e1643c1c76d383", 56432),
+		EN_GRB,
+		kPlatformWindows,
+		ADGF_ADDON,
+		GUIO0()
+	},
+	kFeatures640x480,
+	0, 0, 0
+},
+
 // -- Add-ons : Read/Count 6-7 years --
 {
 	{


Commit: ddcfe9a5986c8de642797a1b4df10cd6bb94c5ae
    https://github.com/scummvm/scummvm/commit/ddcfe9a5986c8de642797a1b4df10cd6bb94c5ae
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2025-09-06T23:54:26+02:00

Commit Message:
GOB: Fix "backuping media" command in totSub

New game variables must be allocated in this case.

Changed paths:
    engines/gob/game.cpp


diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp
index 892a929dce9..ea626ce1551 100644
--- a/engines/gob/game.cpp
+++ b/engines/gob/game.cpp
@@ -916,6 +916,7 @@ void Game::totSub(int8 flags, const Common::String &totFile) {
 	if (flags == 18) {
 		warning("Backuping media to %d", _numEnvironments);
 		_environments.setMedia(_numEnvironments);
+		_vm->_inter->_variables = nullptr;
 	}
 
 	curBackupPos = _curEnvironment;




More information about the Scummvm-git-logs mailing list