From b1ae0b5929e90a2478456d50b4ecdb8ea72c530d Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Thu, 26 Aug 2021 19:11:02 +0100 Subject: [PATCH 1/4] CINE: Avoid using static objects with destructors --- engines/cine/cine.cpp | 3 ++- engines/cine/cine.h | 1 + engines/cine/prc.cpp | 2 +- engines/cine/rel.cpp | 2 +- engines/cine/saveload.cpp | 4 ++-- engines/cine/script.h | 4 +--- engines/cine/script_fw.cpp | 12 ++++-------- engines/cine/various.cpp | 2 +- 8 files changed, 13 insertions(+), 17 deletions(-) diff --git a/engines/cine/cine.cpp b/engines/cine/cine.cpp index 212e082569a4..7e893696600f 100644 --- a/engines/cine/cine.cpp +++ b/engines/cine/cine.cpp @@ -126,6 +126,7 @@ Common::Error CineEngine::run() { delete renderer; delete[] collisionPage; + delete _scriptInfo; } while (_restartRequested); delete g_sound; @@ -176,7 +177,7 @@ void CineEngine::initialize() { Common::fill(g_cine->_zoneQuery.begin(), g_cine->_zoneQuery.end(), 0); setDefaultGameSpeed(); - setupOpcodes(); + _scriptInfo = setupOpcodes(); initLanguage(getLanguage()); diff --git a/engines/cine/cine.h b/engines/cine/cine.h index 447554c7591c..a7bc2af2b865 100644 --- a/engines/cine/cine.h +++ b/engines/cine/cine.h @@ -184,6 +184,7 @@ class CineEngine : public Engine { */ ScriptVars _globalVars; RawScriptArray _scriptTable; ///< Table of script bytecode + FWScriptInfo *_scriptInfo; Common::Array _zoneData; Common::Array _zoneQuery; ///< Only exists in Operation Stealth diff --git a/engines/cine/prc.cpp b/engines/cine/prc.cpp index 553f2f80acc0..4d5ed7e6f66a 100644 --- a/engines/cine/prc.cpp +++ b/engines/cine/prc.cpp @@ -85,7 +85,7 @@ bool loadPrc(const char *pPrcName) { uint16 size = g_cine->_scriptTable[i]->_size; // TODO: delete the test? if (size) { - g_cine->_scriptTable[i]->setData(*scriptInfo, scriptPtr); + g_cine->_scriptTable[i]->setData(*g_cine->_scriptInfo, scriptPtr); scriptPtr += size; } } diff --git a/engines/cine/rel.cpp b/engines/cine/rel.cpp index 09b849961806..172ec6c6bfba 100644 --- a/engines/cine/rel.cpp +++ b/engines/cine/rel.cpp @@ -63,7 +63,7 @@ void loadRel(char *pRelName) { size = g_cine->_relTable[i]->_size; // TODO: delete the test? if (size) { - g_cine->_relTable[i]->setData(*scriptInfo, ptr); + g_cine->_relTable[i]->setData(*g_cine->_scriptInfo, ptr); ptr += size; } } diff --git a/engines/cine/saveload.cpp b/engines/cine/saveload.cpp index 9ab83515506e..5eccbc885960 100644 --- a/engines/cine/saveload.cpp +++ b/engines/cine/saveload.cpp @@ -210,11 +210,11 @@ void loadScriptFromSave(Common::SeekableReadStream &fHandle, bool isGlobal) { // original code loaded everything into globalScripts, this should be // the correct behavior if (isGlobal) { - ScriptPtr tmp(scriptInfo->create(*g_cine->_scriptTable[idx], idx, labels, localVars, compare, pos)); + ScriptPtr tmp(g_cine->_scriptInfo->create(*g_cine->_scriptTable[idx], idx, labels, localVars, compare, pos)); assert(tmp); g_cine->_globalScripts.push_back(tmp); } else { - ScriptPtr tmp(scriptInfo->create(*g_cine->_relTable[idx], idx, labels, localVars, compare, pos)); + ScriptPtr tmp(g_cine->_scriptInfo->create(*g_cine->_relTable[idx], idx, labels, localVars, compare, pos)); assert(tmp); g_cine->_objectScripts.push_back(tmp); } diff --git a/engines/cine/script.h b/engines/cine/script.h index c088544a426c..c4c0c1bed9c8 100644 --- a/engines/cine/script.h +++ b/engines/cine/script.h @@ -367,9 +367,7 @@ typedef Common::Array RawObjectScriptArray; #define NUM_MAX_SCRIPT 50 -extern FWScriptInfo *scriptInfo; - -void setupOpcodes(); +FWScriptInfo *setupOpcodes(); void decompileScript(const byte *scriptPtr, uint16 scriptSize, uint16 scriptIdx); void dumpScript(char *dumpName); diff --git a/engines/cine/script_fw.cpp b/engines/cine/script_fw.cpp index 25b811ff6777..1423c780a033 100644 --- a/engines/cine/script_fw.cpp +++ b/engines/cine/script_fw.cpp @@ -206,20 +206,16 @@ void FWScript::setupTable() { FWScript::_numOpcodes = ARRAYSIZE(opcodeTable); } -FWScriptInfo *scriptInfo; ///< Script factory - /** * @todo replace with script subsystem */ -void setupOpcodes() { - static FWScriptInfo fw; - static OSScriptInfo os; +FWScriptInfo *setupOpcodes() { if (g_cine->getGameType() == Cine::GType_FW) { FWScript::setupTable(); - scriptInfo = &fw; + return new FWScriptInfo(); } else { OSScript::setupTable(); - scriptInfo = &os; + return new OSScriptInfo(); } } @@ -2015,7 +2011,7 @@ int FWScript::o1_unloadMask5() { //----------------------------------------------------------------------- void addScriptToGlobalScripts(uint16 idx) { - ScriptPtr tmp(scriptInfo->create(*g_cine->_scriptTable[idx], idx)); + ScriptPtr tmp(g_cine->_scriptInfo->create(*g_cine->_scriptTable[idx], idx)); assert(tmp); g_cine->_globalScripts.push_back(tmp); } diff --git a/engines/cine/various.cpp b/engines/cine/various.cpp index 85a0d6f47fa1..80fb98899bde 100644 --- a/engines/cine/various.cpp +++ b/engines/cine/various.cpp @@ -177,7 +177,7 @@ uint safeControlAccessMinMs() { } void runObjectScript(int16 entryIdx) { - ScriptPtr tmp(scriptInfo->create(*g_cine->_relTable[entryIdx], entryIdx)); + ScriptPtr tmp(g_cine->_scriptInfo->create(*g_cine->_relTable[entryIdx], entryIdx)); assert(tmp); g_cine->_objectScripts.push_back(tmp); } From 2bd8e2e33c238f674f502ea429b9cf7168870f64 Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Thu, 26 Aug 2021 19:35:08 +0100 Subject: [PATCH 2/4] ILLUSIONS: Avoid using static objects with destructors --- engines/illusions/bbdou/illusions_bbdou.cpp | 8 ++++---- engines/illusions/duckman/illusions_duckman.cpp | 8 ++++---- engines/illusions/illusions.h | 1 - engines/illusions/saveload.cpp | 16 +++++----------- 4 files changed, 13 insertions(+), 20 deletions(-) diff --git a/engines/illusions/bbdou/illusions_bbdou.cpp b/engines/illusions/bbdou/illusions_bbdou.cpp index 05b37beed7ca..d32fcf6a6106 100644 --- a/engines/illusions/bbdou/illusions_bbdou.cpp +++ b/engines/illusions/bbdou/illusions_bbdou.cpp @@ -668,14 +668,14 @@ void IllusionsEngine_BBDOU::reset() { void IllusionsEngine_BBDOU::loadSavegameFromScript(int16 slotNum, uint32 callingThreadId) { // NOTE Just loads the savegame, doesn't activate it yet - const char *fileName = getSavegameFilename(_savegameSlotNum); - _loadGameResult = loadgame(fileName); + Common::String fileName = getSavegameFilename(_targetName, _savegameSlotNum); + _loadGameResult = loadgame(fileName.c_str()); } void IllusionsEngine_BBDOU::saveSavegameFromScript(int16 slotNum, uint32 callingThreadId) { // TODO - // const char *fileName = getSavegameFilename(slotNum); - _saveGameResult = false;//savegame(fileName, _savegameDescription.c_str()); + // Common::String fileName = getSavegameFilename(_targetName, slotNum); + _saveGameResult = false;//savegame(fileName.c_str(), _savegameDescription.c_str()); } void IllusionsEngine_BBDOU::activateSavegame(uint32 callingThreadId) { diff --git a/engines/illusions/duckman/illusions_duckman.cpp b/engines/illusions/duckman/illusions_duckman.cpp index 0821dfd4e757..ca0024140249 100644 --- a/engines/illusions/duckman/illusions_duckman.cpp +++ b/engines/illusions/duckman/illusions_duckman.cpp @@ -1278,8 +1278,8 @@ bool IllusionsEngine_Duckman::loadSavegameFromScript(int16 slotNum, uint32 calli return false; // TODO need to handle reset from new game (without exising savegame). } - const char *fileName = getSavegameFilename(_savegameSlotNum); - bool success = loadgame(fileName); + Common::String fileName = getSavegameFilename(_targetName, _savegameSlotNum); + bool success = loadgame(fileName.c_str()); if (success) activateSavegame(callingThreadId); _gameState->deleteReadStream(); @@ -1287,8 +1287,8 @@ bool IllusionsEngine_Duckman::loadSavegameFromScript(int16 slotNum, uint32 calli } bool IllusionsEngine_Duckman::saveSavegameFromScript(int16 slotNum, uint32 callingThreadId) { - const char *fileName = getSavegameFilename(_savegameSlotNum); - return savegame(fileName, _savegameDescription.c_str()); + Common::String fileName = getSavegameFilename(_targetName, _savegameSlotNum); + return savegame(fileName.c_str(), _savegameDescription.c_str()); } void IllusionsEngine_Duckman::activateSavegame(uint32 callingThreadId) { diff --git a/engines/illusions/illusions.h b/engines/illusions/illusions.h index 2e2dcfb4d688..34f9816585f0 100644 --- a/engines/illusions/illusions.h +++ b/engines/illusions/illusions.h @@ -229,7 +229,6 @@ class IllusionsEngine : public Engine { Common::Error removeGameState(int slot); bool savegame(const char *filename, const char *description); bool loadgame(const char *filename); - const char *getSavegameFilename(int num); bool existsSavegame(int num); static Common::String getSavegameFilename(const Common::String &target, int num); static kReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *in, SaveHeader &header, bool skipThumbnail = true); diff --git a/engines/illusions/saveload.cpp b/engines/illusions/saveload.cpp index f46496abad4f..a9475a33d484 100644 --- a/engines/illusions/saveload.cpp +++ b/engines/illusions/saveload.cpp @@ -126,8 +126,8 @@ bool IllusionsEngine::loadgame(const char *filename) { Common::Error IllusionsEngine::loadGameState(int slot) { _resumeFromSavegameRequested = false; - const char *fileName = getSavegameFilename(slot); - if (!loadgame(fileName)) + Common::String fileName = getSavegameFilename(_targetName, slot); + if (!loadgame(fileName.c_str())) return Common::kReadingFailed; _resumeFromSavegameRequested = true; _savegameSlotNum = slot; @@ -135,25 +135,19 @@ Common::Error IllusionsEngine::loadGameState(int slot) { } Common::Error IllusionsEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) { - const char *fileName = getSavegameFilename(slot); - if (!savegame(fileName, description.c_str())) + Common::String fileName = getSavegameFilename(_targetName, slot); + if (!savegame(fileName.c_str(), description.c_str())) return Common::kWritingFailed; return Common::kNoError; } Common::Error IllusionsEngine::removeGameState(int slot) { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); - Common::String filename = Illusions::IllusionsEngine::getSavegameFilename(_targetName, slot); + Common::String filename = getSavegameFilename(_targetName, slot); saveFileMan->removeSavefile(filename.c_str()); return Common::kNoError; } -const char *IllusionsEngine::getSavegameFilename(int num) { - static Common::String filename; - filename = getSavegameFilename(_targetName, num); - return filename.c_str(); -} - Common::String IllusionsEngine::getSavegameFilename(const Common::String &target, int num) { assert(num >= 0 && num <= 999); return Common::String::format("%s.%03d", target.c_str(), num); From 520fc1224a284135eb9aec480244d4485085149a Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Thu, 26 Aug 2021 19:57:28 +0100 Subject: [PATCH 3/4] SUPERNOVA: Avoid using static objects with destructors --- engines/supernova/supernova1/state.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/supernova/supernova1/state.cpp b/engines/supernova/supernova1/state.cpp index c75cb00f007e..4eda1ba25fae 100644 --- a/engines/supernova/supernova1/state.cpp +++ b/engines/supernova/supernova1/state.cpp @@ -405,7 +405,7 @@ void GameManager1::corridorOnEntrance() { } void GameManager1::telomat(int nr) { - static Common::String name[8] = { + static const char *const name[8] = { "DR. ALAB HANSI", "ALAB HANSI", "SAVAL LUN", @@ -416,7 +416,7 @@ void GameManager1::telomat(int nr) { "x" }; - static Common::String name2[4] = { + static const char *const name2[4] = { "Alab Hansi", "Saval Lun", "Ugnul Tschabb", @@ -506,7 +506,7 @@ void GameManager1::telomat(int nr) { _vm->removeMessage(); if (_state._nameSeen[nr]) { Common::String string = _vm->getGameString(kStringTelomat2); - _vm->setGameString(kStringPlaceholder1, Common::String::format(string.c_str(), name2[nr].c_str())); + _vm->setGameString(kStringPlaceholder1, Common::String::format(string.c_str(), name2[nr])); dial1[1] = kStringPlaceholder1; _currentRoom->addSentence(1, 1); } else From a79c701a35697e9b4e43a92ee463e87bd668020a Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Thu, 26 Aug 2021 20:07:59 +0100 Subject: [PATCH 4/4] LAB: Avoid using static objects with destructors --- engines/lab/interface.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/engines/lab/interface.cpp b/engines/lab/interface.cpp index bac11557256b..9b169b852fb9 100644 --- a/engines/lab/interface.cpp +++ b/engines/lab/interface.cpp @@ -191,9 +191,7 @@ void Interface::mayShowCrumbIndicator() { return; if (_vm->_droppingCrumbs && _vm->isMainDisplay()) { - static byte *imgData = new byte[CRUMBSWIDTH * CRUMBSHEIGHT]; - memcpy(imgData, dropCrumbsImageData, CRUMBSWIDTH * CRUMBSHEIGHT); - static Image dropCrumbsImage(CRUMBSWIDTH, CRUMBSHEIGHT, imgData, _vm); + Image dropCrumbsImage(CRUMBSWIDTH, CRUMBSHEIGHT, dropCrumbsImageData, _vm, false); dropCrumbsImage.drawMaskImage(612, 4); } @@ -231,9 +229,7 @@ void Interface::mayShowCrumbIndicatorOff() { return; if (_vm->isMainDisplay()) { - static byte *imgData = new byte[CRUMBSWIDTH * CRUMBSHEIGHT]; - memcpy(imgData, dropCrumbsOffImageData, CRUMBSWIDTH * CRUMBSHEIGHT); - static Image dropCrumbsOffImage(CRUMBSWIDTH, CRUMBSHEIGHT, imgData, _vm); + Image dropCrumbsOffImage(CRUMBSWIDTH, CRUMBSHEIGHT, dropCrumbsOffImageData, _vm, false); dropCrumbsOffImage.drawMaskImage(612, 4); }