From eb47dcf2c95ee4eb731aa0385403dce7665aec75 Mon Sep 17 00:00:00 2001 From: Bastien Bouclet Date: Sun, 7 Feb 2016 06:10:52 +0100 Subject: MOHAWK: Implement preloading conditional script resources --- engines/mohawk/myst.cpp | 92 +++++++++++++++++++++++++++++-------------------- engines/mohawk/myst.h | 19 ++++++---- 2 files changed, 67 insertions(+), 44 deletions(-) (limited to 'engines/mohawk') diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index e4f77afde7..91cb9a4015 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -682,7 +682,7 @@ MystArea *MohawkEngine_Myst::updateCurrentResource() { } void MohawkEngine_Myst::loadCard() { - debugC(kDebugView, "Loading Card View:"); + debugC(kDebugView, "Loading Card View: %d", _curCard); Common::SeekableReadStream *viewStream = getResource(ID_VIEW, _curCard); @@ -752,7 +752,7 @@ void MohawkEngine_Myst::loadCard() { } } else { debugC(kDebugView, "Unknown"); - warning("Unknown sound control value in card"); + warning("Unknown sound control value '%d' in card '%d'", _view.sound, _curCard); } // Resources that scripts can call upon @@ -762,35 +762,42 @@ void MohawkEngine_Myst::loadCard() { MystView::ScriptResource scriptResource; debugC(kDebugView, "\tResource %d:", i); - scriptResource.type = viewStream->readUint16LE(); + scriptResource.type = (MystView::ScriptResourceType) viewStream->readUint16LE(); debugC(kDebugView, "\t\t Type: %d", scriptResource.type); switch (scriptResource.type) { - case 1: + case MystView::kResourceImage: debugC(kDebugView, "\t\t\t\t= Image"); break; - case 2: + case MystView::kResourceSound: debugC(kDebugView, "\t\t\t\t= Sound"); break; - case 3: - debugC(kDebugView, "\t\t\t\t= Resource List"); + case MystView::kResourceSwitch: + debugC(kDebugView, "\t\t\t\t= Resource Switch"); + break; + case MystView::kResourceImageNoCache: + debugC(kDebugView, "\t\t\t\t= Image - Caching disabled"); + break; + case MystView::kResourceSoundNoCache: + debugC(kDebugView, "\t\t\t\t= Sound - Caching disabled"); break; default: debugC(kDebugView, "\t\t\t\t= Unknown"); + warning("Unknown script resource type '%d' in card '%d'", scriptResource.type, _curCard); break; } - if (scriptResource.type == 3) { - scriptResource.var = viewStream->readUint16LE(); - debugC(kDebugView, "\t\t Var: %d", scriptResource.var); + if (scriptResource.type == MystView::kResourceSwitch) { + scriptResource.switchVar = viewStream->readUint16LE(); + debugC(kDebugView, "\t\t Var: %d", scriptResource.switchVar); uint16 count = viewStream->readUint16LE(); debugC(kDebugView, "\t\t Resource List Count: %d", count); - scriptResource.u0 = viewStream->readUint16LE(); - debugC(kDebugView, "\t\t u0: %d", scriptResource.u0); + scriptResource.switchResourceType = (MystView::ScriptResourceType) viewStream->readUint16LE(); + debugC(kDebugView, "\t\t u0: %d", scriptResource.switchResourceType); for (uint16 j = 0; j < count; j++) { - scriptResource.resourceList.push_back(viewStream->readSint16LE()); - debugC(kDebugView, "\t\t Resource List %d: %d", j, scriptResource.resourceList[j]); + scriptResource.switchResourceIds.push_back(viewStream->readSint16LE()); + debugC(kDebugView, "\t\t Resource List %d: %d", j, scriptResource.switchResourceIds[j]); } } else { scriptResource.id = viewStream->readUint16LE(); @@ -812,7 +819,6 @@ void MohawkEngine_Myst::loadCard() { delete viewStream; // Precache Card Resources - // TODO: Deal with Mac ME External Picture File uint32 cacheImageType; if (getFeatures() & GF_ME) cacheImageType = ID_PICT; @@ -821,39 +827,49 @@ void MohawkEngine_Myst::loadCard() { // Precache Image Block data if (_view.conditionalImages.size() != 0) { - for (uint16 i = 0; i < _view.conditionalImages.size(); i++) - for (uint16 j = 0; j < _view.conditionalImages[i].values.size(); j++) - cachePreload(cacheImageType, _view.conditionalImages[i].values[j]); - } else + for (uint16 i = 0; i < _view.conditionalImages.size(); i++) { + uint16 value = _scriptParser->getVar(_view.conditionalImages[i].var); + cachePreload(cacheImageType, _view.conditionalImages[i].values[value]); + } + } else { cachePreload(cacheImageType, _view.mainImage); + } // Precache Sound Block data if (_view.sound > 0) cachePreload(ID_MSND, _view.sound); else if (_view.sound == kMystSoundActionConditional) { - for (uint16 i = 0; i < _view.soundList.size(); i++) { - if (_view.soundList[i].action > 0) - cachePreload(ID_MSND, _view.soundList[i].action); + uint16 value = _scriptParser->getVar(_view.soundVar); + if (_view.soundList[value].action > 0) { + cachePreload(ID_MSND, _view.soundList[value].action); } } // Precache Script Resources - if (_view.scriptResources.size() != 0) { - for (uint16 i = 0; i < _view.scriptResources.size(); i++) { - switch (_view.scriptResources[i].type) { - case 1: - cachePreload(cacheImageType, _view.scriptResources[i].id); - break; - case 2: - cachePreload(ID_MSND, _view.scriptResources[i].id); - break; - case 3: - warning("TODO: Precaching of Script Resource List not supported"); - break; - default: - warning("Unknown Resource in Script Resource List Precaching"); - break; - } + for (uint16 i = 0; i < _view.scriptResources.size(); i++) { + MystView::ScriptResourceType type; + int16 id; + if (_view.scriptResources[i].type == MystView::kResourceSwitch) { + type = _view.scriptResources[i].switchResourceType; + uint16 value = _scriptParser->getVar(_view.scriptResources[i].switchVar); + id = _view.scriptResources[i].switchResourceIds[value]; + } else { + type = _view.scriptResources[i].type; + id = _view.scriptResources[i].id; + } + + if (id < 0) continue; + + switch (type) { + case MystView::kResourceImage: + cachePreload(cacheImageType, id); + break; + case MystView::kResourceSound: + cachePreload(ID_MSND, id); + break; + default: + // The other resource types should not be cached + break; } } } diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h index 7fd21455f3..34607d8329 100644 --- a/engines/mohawk/myst.h +++ b/engines/mohawk/myst.h @@ -130,13 +130,20 @@ struct MystView { Common::Array soundList; // Script Resources + enum ScriptResourceType { + kResourceImage = 1, + kResourceSound = 2, + kResourceSwitch = 3, + kResourceImageNoCache = 4, + kResourceSoundNoCache = 5 + }; + struct ScriptResource { - uint16 type; - uint16 id; // Not used by type 3 - // TODO: Type 3 has more. Maybe use a union? - uint16 var; // Used by type 3 only - uint16 u0; // Used by type 3 only - Common::Array resourceList; // Used by type 3 only + ScriptResourceType type; + uint16 id; + uint16 switchVar; + ScriptResourceType switchResourceType; + Common::Array switchResourceIds; }; Common::Array scriptResources; -- cgit v1.2.3