aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/kstring.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/kstring.cpp')
-rw-r--r--engines/sci/engine/kstring.cpp28
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());
}