aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippos Karapetis2010-11-19 10:27:22 +0000
committerFilippos Karapetis2010-11-19 10:27:22 +0000
commit6ec8ec416bfdd4241d451de7ba501873fbae38b2 (patch)
tree5ea91e4b01c1ff5395f2b8c3a9d241e614ca54c0
parent16ee411187608220e936b366bfa8afb5da5bce19 (diff)
downloadscummvm-rg350-6ec8ec416bfdd4241d451de7ba501873fbae38b2.tar.gz
scummvm-rg350-6ec8ec416bfdd4241d451de7ba501873fbae38b2.tar.bz2
scummvm-rg350-6ec8ec416bfdd4241d451de7ba501873fbae38b2.zip
SCI: Added support for script -> string copying (used by late SCI2.1 and SCI3 games)
svn-id: r54364
-rw-r--r--engines/sci/engine/klists.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp
index 0b6fac4a17..5b26a932c7 100644
--- a/engines/sci/engine/klists.cpp
+++ b/engines/sci/engine/klists.cpp
@@ -719,11 +719,23 @@ reg_t kArray(EngineState *s, int argc, reg_t *argv) {
}
case 7: // Cmp
// Not implemented in SSCI
+ warning("kArray(Cmp) called");
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");
+ SegmentType sourceType = s->_segMan->getSegmentObj(argv[1].segment)->getType();
+ if (sourceType == SEG_TYPE_SCRIPT) {
+ // A technique used in later SCI2.1 and SCI3 games: the contents of a script
+ // are loaded in an array (well, actually a string).
+ Script *scr = s->_segMan->getScript(argv[1].segment);
+ reg_t stringHandle;
+
+ SciString *dupString = s->_segMan->allocateString(&stringHandle);
+ dupString->setSize(scr->getBufSize());
+ dupString->fromString(Common::String((const char *)scr->getBuf()));
+
+ return stringHandle;
+ } else if (sourceType != SEG_TYPE_ARRAY && sourceType != SEG_TYPE_SCRIPT) {
+ warning("kArray(Dup): Request to duplicate a segment which isn't an array or a script, ignoring");
return NULL_REG;
}