aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Kiewitz2016-01-04 14:57:04 +0100
committerMartin Kiewitz2016-01-04 14:58:02 +0100
commit0b5a09f8365a079f792a0d36383a86be37788c7f (patch)
treebc71d87d1106f7d645cd08a8dc28653ebeb5b213
parentd919c66e996647333b1ee66d0eb5522cb8491009 (diff)
downloadscummvm-rg350-0b5a09f8365a079f792a0d36383a86be37788c7f.tar.gz
scummvm-rg350-0b5a09f8365a079f792a0d36383a86be37788c7f.tar.bz2
scummvm-rg350-0b5a09f8365a079f792a0d36383a86be37788c7f.zip
SCI32: fix kString calling from within kArray
(didn't work since the introduction of kString signatures and the kString split-up)
-rw-r--r--engines/sci/engine/kernel.cpp7
-rw-r--r--engines/sci/engine/kernel.h6
-rw-r--r--engines/sci/engine/klists.cpp24
3 files changed, 34 insertions, 3 deletions
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index c0f2c64995..3e70eb0788 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 5d929a36ae..f62a074ef1 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 66590da23f..c0da2daaeb 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;