diff options
-rw-r--r-- | engines/sci/engine/klists.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index ca23469e44..0b6fac4a17 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -618,6 +618,23 @@ reg_t kMoveToEnd(EngineState *s, int argc, reg_t *argv) { } reg_t kArray(EngineState *s, int argc, reg_t *argv) { + // Use kString when accessing strings + // This is possible, as strings inherit from arrays + // and in this case (type 3) arrays are of type char *. + // kString is almost exactly the same as kArray, so + // this call is possible + // 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 + if (argv[0].toUint16() == 0) { + // New, check if the target type is 3 (string) + if (argv[2].toUint16() == 3) + return kString(s, argc, argv); + } else { + if (s->_segMan->getSegmentType(argv[1].segment) == SEG_TYPE_STRING) + return kString(s, argc, argv); + } + switch (argv[0].toUint16()) { case 0: { // New reg_t arrayHandle; @@ -671,12 +688,14 @@ reg_t kArray(EngineState *s, int argc, reg_t *argv) { return argv[1]; } case 6: { // Cpy +#if 0 if (s->_segMan->getSegmentObj(argv[1].segment)->getType() != SEG_TYPE_ARRAY || s->_segMan->getSegmentObj(argv[3].segment)->getType() != SEG_TYPE_ARRAY) { // Happens in the RAMA demo warning("kArray(Cpy): Request to copy a segment which isn't an array, ignoring"); return NULL_REG; } +#endif SciArray<reg_t> *array1 = s->_segMan->lookupArray(argv[1]); SciArray<reg_t> *array2 = s->_segMan->lookupArray(argv[3]); @@ -702,6 +721,12 @@ reg_t kArray(EngineState *s, int argc, reg_t *argv) { // Not implemented in SSCI return s->r_acc; case 8: { // Dup + if (s->_segMan->getSegmentObj(argv[1].segment)->getType() != SEG_TYPE_ARRAY) { + // Happens in the RAMA demo and LSL7 + warning("kArray(Dup): Request to duplicate a segment which isn't an array, ignoring"); + return NULL_REG; + } + reg_t arrayHandle; SciArray<reg_t> *dupArray = s->_segMan->allocateArray(&arrayHandle); // This must occur after allocateArray, as inserting a new object |