[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 ¶ms);
void o7_writeData(OpFuncParams ¶ms);
+ 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 ¶ms);
+
void o7_xorDeobfuscate(OpGobParams ¶ms);
void o7_xorObfuscate(OpGobParams ¶ms);
void o7_ansiToOEM(OpGobParams ¶ms);
@@ -797,6 +808,15 @@ protected:
void o7_dummy(OpGobParams ¶ms);
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 ¶ms) {
+ 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 ¶ms) {
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 ¶ms);
+ void o7_writeUnknownAppChildDataToGameVariables(OpGobParams ¶ms);
+ void o7_writeUnknownChildUin16ToGameVariables(OpGobParams ¶ms);
+
void o7_startAdi4Application(OpGobParams ¶ms);
void o7_xorDeobfuscate(OpGobParams ¶ms);
@@ -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 ¶ms) {
+ 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 ¶ms) {
+ 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 ¶ms) {
+ uint16 varIndex = _vm->_game->_script->readUint16();
+ if (_adi4GeneralChildData.empty())
+ return;
+
+ WRITE_VAR(varIndex, READ_LE_UINT16(&_adi4GeneralChildData[3241]));
+}
+
void Inter_v7::o7_startAdi4Application(OpGobParams ¶ms) {
uint16 varIndexAppNbr = _vm->_game->_script->readUint16();
uint16 varIndexChildNbr = _vm->_game->_script->readUint16();
@@ -2137,6 +2168,7 @@ void Inter_v7::o7_startAdi4Application(OpGobParams ¶ms) {
_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 ¶ms) {
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 ¶ms) {
}
#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 ¶ms) {
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 ¶ms);
- void oPlaytoons_F_1B(OpFuncParams ¶ms);
+ void oPlaytoons_createButton(OpFuncParams ¶ms);
void oPlaytoons_putPixel(OpFuncParams ¶ms);
void oPlaytoons_freeSprite(OpFuncParams ¶ms);
void oPlaytoons_checkData(OpFuncParams ¶ms);
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 ¶ms) {
_vm->_game->_script->skip(1);
}
-void Inter_Playtoons::oPlaytoons_F_1B(OpFuncParams ¶ms) {
- _vm->_game->_hotspots->oPlaytoons_F_1B();
+void Inter_Playtoons::oPlaytoons_createButton(OpFuncParams ¶ms) {
+ _vm->_game->_hotspots->createButton();
}
void Inter_Playtoons::oPlaytoons_putPixel(OpFuncParams ¶ms) {
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