From 89d4e44281b7bf05b9ad234bdf242de32a47c688 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sat, 4 Sep 2010 08:51:10 +0000 Subject: SCI: doing detectDoSoundType() properly sci0early checking, if sound resources are sci0early or late for sci0early games instead of hardcoding lsl2 svn-id: r52514 --- engines/sci/engine/features.cpp | 9 +++------ engines/sci/resource.cpp | 13 +++++++++++++ engines/sci/resource.h | 2 ++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/engines/sci/engine/features.cpp b/engines/sci/engine/features.cpp index 66bd9da8ec..97eec38caf 100644 --- a/engines/sci/engine/features.cpp +++ b/engines/sci/engine/features.cpp @@ -138,12 +138,9 @@ bool GameFeatures::autoDetectSoundType() { SciVersion GameFeatures::detectDoSoundType() { if (_doSoundType == SCI_VERSION_NONE) { if (getSciVersion() == SCI_VERSION_0_EARLY) { - // This game is using early SCI0 sound code (different headers than - // SCI0 late) - if (g_sci->getGameId() == GID_LSL2) - _doSoundType = SCI_VERSION_0_LATE; - else - _doSoundType = SCI_VERSION_0_EARLY; + // Almost all of the SCI0EARLY games use different sound resources than + // SCI0LATE. Although the last SCI0EARLY game (lsl2) uses SCI0LATE resources + _doSoundType = g_sci->getResMan()->detectEarlySound() ? SCI_VERSION_0_EARLY : SCI_VERSION_0_LATE; #ifdef ENABLE_SCI32 } else if (getSciVersion() >= SCI_VERSION_2_1) { _doSoundType = SCI_VERSION_2_1; diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 3b787cc673..4aff273610 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -2148,6 +2148,19 @@ bool ResourceManager::detectForPaletteMergingForSci11() { return false; } +// is called on SCI0EARLY games to make sure that sound resources are in fact also SCI0EARLY +bool ResourceManager::detectEarlySound() { + Resource *res = findResource(ResourceId(kResourceTypeSound, 1), 0); + if (res) { + if (res->size >= 0x22) { + if (READ_LE_UINT16(res->data + 0x1f) == 0) // channel 15 voice count + play mask is 0 in SCI0LATE + if (res->data[0x21] == 0) // last byte right before actual data is 0 as well + return false; // these 2 bytes are + } + } + return true; +} + // Functions below are based on PD code by Brian Provinciano (SCI Studio) bool ResourceManager::hasOldScriptHeader() { Resource *res = findResource(ResourceId(kResourceTypeScript, 0), 0); diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 62968a231e..53c00f6ec0 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -345,6 +345,8 @@ public: bool detectFontExtended(); // Detects, if SCI1.1 game uses palette merging bool detectForPaletteMergingForSci11(); + // Detects, if SCI0EARLY game also has SCI0EARLY sound resources + bool detectEarlySound(); /** * Finds the internal Sierra ID of the current game from script 0. -- cgit v1.2.3