[Scummvm-cvs-logs] scummvm master -> ba3656d84e61ae5f99a9449e81c5d3ff2ffa2565

m-kiewitz m_kiewitz at users.sourceforge.net
Thu Nov 21 22:41:39 CET 2013


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

Summary:
ba3656d84e SCI: fix script patcher for games w/o vocab


Commit: ba3656d84e61ae5f99a9449e81c5d3ff2ffa2565
    https://github.com/scummvm/scummvm/commit/ba3656d84e61ae5f99a9449e81c5d3ff2ffa2565
Author: Martin Kiewitz (m_kiewitz at users.sourceforge.net)
Date: 2013-11-21T13:41:07-08:00

Commit Message:
SCI: fix script patcher for games w/o vocab

Changed paths:
    engines/sci/engine/kernel.cpp
    engines/sci/engine/kernel.h
    engines/sci/engine/script_patches.cpp
    engines/sci/sci.cpp



diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 8d55790..12746e1 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -35,8 +35,6 @@ namespace Sci {
 
 Kernel::Kernel(ResourceManager *resMan, SegManager *segMan)
 	: _resMan(resMan), _segMan(segMan), _invalid("<invalid>") {
-	loadSelectorNames();
-	mapSelectors();      // Map a few special selectors for later use
 }
 
 Kernel::~Kernel() {
@@ -53,6 +51,11 @@ Kernel::~Kernel() {
 	}
 }
 
+void Kernel::init() {
+	loadSelectorNames();
+	mapSelectors();      // Map a few special selectors for later use
+}
+
 uint Kernel::getSelectorNamesSize() const {
 	return _selectorNames.size();
 }
@@ -104,6 +107,11 @@ int Kernel::findSelector(const char *selectorName) const {
 	return -1;
 }
 
+// used by Script patcher to figure out, if it's okay to initialize signature/patch-table
+bool Kernel::selectorNamesAvailable() {
+	return !_selectorNames.empty();
+}
+
 void Kernel::loadSelectorNames() {
 	Resource *r = _resMan->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SELECTORS), 0);
 	bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index 8a02107..69c3a6d 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -145,6 +145,8 @@ public:
 	 */
 	Kernel(ResourceManager *resMan, SegManager *segMan);
 	~Kernel();
+	
+	void init();
 
 	uint getSelectorNamesSize() const;
 	const Common::String &getSelectorName(uint selector);
@@ -159,6 +161,8 @@ public:
 	 * @return The appropriate selector ID, or -1 on error
 	 */
 	int findSelector(const char *selectorName) const;
+	
+	bool selectorNamesAvailable();
 
 	// Script dissection/dumping functions
 	void dissectScript(int scriptNumber, Vocabulary *vocab);
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index 0043f21..3b4bb12 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -2390,6 +2390,10 @@ void Script::patcherProcessScript(uint16 scriptNr, byte *scriptData, const uint3
 		bool isMacSci11 = (g_sci->getPlatform() == Common::kPlatformMacintosh && getSciVersion() >= SCI_VERSION_1_1);
 
 		if (!signatureTable->magicDWord) {
+			// Abort, in case selectors are not yet initialized (happens for games w/o selector-dictionary)
+			if (!g_sci->getKernel()->selectorNamesAvailable())
+				return;
+		
 			// signature table needs to get initialized (Magic DWORD set, selector table set)
 			patcherInitSignature(signatureTable, isMacSci11);
 			
diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp
index cbad3c6..065565d 100644
--- a/engines/sci/sci.cpp
+++ b/engines/sci/sci.cpp
@@ -225,6 +225,7 @@ Common::Error SciEngine::run() {
 	_gfxScreen->enableUndithering(ConfMan.getBool("disable_dithering"));
 
 	_kernel = new Kernel(_resMan, segMan);
+	_kernel->init();
 
 	_features = new GameFeatures(segMan, _kernel);
 	// Only SCI0, SCI01 and SCI1 EGA games used a parser






More information about the Scummvm-git-logs mailing list