aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/engine/klists.cpp25
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