[Scummvm-cvs-logs] scummvm master -> 0b5a09f8365a079f792a0d36383a86be37788c7f

m-kiewitz m_kiewitz at users.sourceforge.net
Mon Jan 4 14:56:55 CET 2016


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:
0b5a09f836 SCI32: fix kString calling from within kArray


Commit: 0b5a09f8365a079f792a0d36383a86be37788c7f
    https://github.com/scummvm/scummvm/commit/0b5a09f8365a079f792a0d36383a86be37788c7f
Author: Martin Kiewitz (m_kiewitz at users.sourceforge.net)
Date: 2016-01-04T14:58:02+01:00

Commit Message:
SCI32: fix kString calling from within kArray

(didn't work since the introduction of kString signatures and the
kString split-up)

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



diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index c0f2c64..3e70eb0 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -35,6 +35,9 @@ namespace Sci {
 
 Kernel::Kernel(ResourceManager *resMan, SegManager *segMan)
 	: _resMan(resMan), _segMan(segMan), _invalid("<invalid>") {
+#ifdef ENABLE_SCI32
+	_kernelFunc_StringId = 0;
+#endif
 }
 
 Kernel::~Kernel() {
@@ -603,6 +606,10 @@ void Kernel::mapFunctions() {
 		}
 
 #ifdef ENABLE_SCI32
+		if (kernelName == "String") {
+			_kernelFunc_StringId = id;
+		}
+
 		// HACK: Phantasmagoria Mac uses a modified kDoSound (which *nothing*
 		// else seems to use)!
 		if (g_sci->getPlatform() == Common::kPlatformMacintosh && g_sci->getGameId() == GID_PHANTASMAGORIA && kernelName == "DoSound") {
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index 5d929a3..f62a074 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -173,6 +173,12 @@ public:
 	typedef Common::Array<KernelFunction> KernelFunctionArray;
 	KernelFunctionArray _kernelFuncs; /**< Table of kernel functions. */
 
+#ifdef ENABLE_SCI32
+	// id of kString function, for quick usage in kArray
+	// kArray calls kString in case parameters are strings
+	uint16 _kernelFunc_StringId;
+#endif
+
 	/**
 	 * Determines whether a list of registers matches a given signature.
 	 * If no signature is given (i.e., if sig is NULL), this is always
diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp
index 66590da..c0da2da 100644
--- a/engines/sci/engine/klists.cpp
+++ b/engines/sci/engine/klists.cpp
@@ -669,26 +669,44 @@ reg_t kArray(EngineState *s, int argc, reg_t *argv) {
 	// TODO: we need to either merge SCI2 strings and
 	// arrays together, and in the future merge them with
 	// the SCI1 strings and arrays in the segment manager
+	bool callStringFunc = false;
 	if (op == 0) {
 		// New, check if the target type is 3 (string)
 		if (argv[2].toUint16() == 3)
-			return kString(s, argc, argv);
+			callStringFunc = true;
 	} else {
 		if (s->_segMan->getSegmentType(argv[1].getSegment()) == SEG_TYPE_STRING ||
 			s->_segMan->getSegmentType(argv[1].getSegment()) == SEG_TYPE_SCRIPT) {
-			return kString(s, argc, argv);
+			callStringFunc = true;
 		}
 
 #if 0
 		if (op == 6) {
 			if (s->_segMan->getSegmentType(argv[3].getSegment()) == SEG_TYPE_STRING ||
 				s->_segMan->getSegmentType(argv[3].getSegment()) == SEG_TYPE_SCRIPT) {
-				return kString(s, argc, argv);
+				callStringFunc = true;
 			}
 		}
 #endif
 	}
 
+	if (callStringFunc) {
+		Kernel *kernel = g_sci->getKernel();
+		uint16 kernelStringFuncId = kernel->_kernelFunc_StringId;
+		if (kernelStringFuncId) {
+			const KernelFunction *kernelStringFunc = &kernel->_kernelFuncs[kernelStringFuncId];
+
+			if (op < kernelStringFunc->subFunctionCount) {
+				// subfunction-id is valid
+				const KernelSubFunction *kernelStringSubCall = &kernelStringFunc->subFunctions[op];
+				argc--;
+				argv++; // remove subfunction-id from arguments
+				// and call the kString subfunction
+				return kernelStringSubCall->function(s, argc, argv);
+			}
+		}
+	}
+
 	switch (op) {
 	case 0: { // New
 		reg_t arrayHandle;






More information about the Scummvm-git-logs mailing list