diff options
author | Martin Kiewitz | 2016-01-04 14:57:04 +0100 |
---|---|---|
committer | Martin Kiewitz | 2016-01-04 14:58:02 +0100 |
commit | 0b5a09f8365a079f792a0d36383a86be37788c7f (patch) | |
tree | bc71d87d1106f7d645cd08a8dc28653ebeb5b213 | |
parent | d919c66e996647333b1ee66d0eb5522cb8491009 (diff) | |
download | scummvm-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.cpp | 7 | ||||
-rw-r--r-- | engines/sci/engine/kernel.h | 6 | ||||
-rw-r--r-- | engines/sci/engine/klists.cpp | 24 |
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; |