diff options
Diffstat (limited to 'engines/sci/engine/kstring.cpp')
-rw-r--r-- | engines/sci/engine/kstring.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 5ea3178ae5..a66dc8d91f 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -26,6 +26,7 @@ /* String and parser handling */ #include "sci/resource.h" +#include "sci/engine/features.h" #include "sci/engine/state.h" #include "sci/engine/message.h" #include "sci/engine/selector.h" @@ -616,7 +617,14 @@ reg_t kText(EngineState *s, int argc, reg_t *argv) { } reg_t kString(EngineState *s, int argc, reg_t *argv) { - switch (argv[0].toUint16()) { + uint16 op = argv[0].toUint16(); + + if (g_sci->_features->detectSci2StringFunctionType() == kSci2StringFunctionNew) { + if (op >= 8) // Dup, GetData have been removed + op += 2; + } + + switch (op) { case 0: { // New reg_t stringHandle; SciString *string = s->_segMan->allocateString(&stringHandle); @@ -780,6 +788,24 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { Common::String string = s->_segMan->getString(argv[1]); return make_reg(0, (uint16)atoi(string.c_str())); } + // New subops in SCI2.1 late / SCI3 + case 14: // unknown + warning("kString, subop %d", op); + return NULL_REG; + case 15: { // upper + Common::String string = s->_segMan->getString(argv[1]); + + string.toUppercase(); + s->_segMan->strcpy(argv[1], string.c_str()); + return NULL_REG; + } + case 16: { // lower + Common::String string = s->_segMan->getString(argv[1]); + + string.toLowercase(); + s->_segMan->strcpy(argv[1], string.c_str()); + return NULL_REG; + } default: error("Unknown kString subop %d", argv[0].toUint16()); } |