aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine')
-rw-r--r--engines/sci/engine/kstring.cpp68
-rw-r--r--engines/sci/engine/message.cpp18
-rw-r--r--engines/sci/engine/message.h4
3 files changed, 40 insertions, 50 deletions
diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp
index 36a3f992f3..827f2c4bc1 100644
--- a/engines/sci/engine/kstring.cpp
+++ b/engines/sci/engine/kstring.cpp
@@ -727,56 +727,49 @@ reg_t kGetFarText(EngineState *s, int funct_nr, int argc, reg_t *argv) {
static MessageState state;
reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+ MessageTuple tuple;
+
if (!state.isInitialized())
message_state_initialize(s->resmgr, &state);
switch (UKPV(0)) {
- case 0 : {
- char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL;
- MessageTuple tuple;
- int module = UKPV(1);
+ case 0:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ if (!state.loadRes(UKPV(1)))
+ return NULL_REG;
tuple.noun = UKPV(2);
tuple.verb = UKPV(3);
tuple.cond = UKPV(4);
tuple.seq = UKPV(5);
+ }
+
+ switch (UKPV(0)) {
+ case 0 :
+ case 1 :
+ if (UKPV(0) == 0 ? state.getSpecific(&tuple) : state.getNext()) {
+ char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], state.getLength() + 1) : NULL;
- if (state.loadRes(module) && state.getSpecific(&tuple)) {
if (buffer)
- state.getText(buffer, 100);
+ state.getText(buffer);
// Talker id
return make_reg(0, state.getTalker());
} else {
- if (buffer) strcpy(buffer, DUMMY_MESSAGE);
- return NULL_REG;
- }
- }
- case 1 : {
- char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL;
+ char *buffer = argc == 7 ? kernel_dereference_char_pointer(s, argv[6], 0) : NULL;
- if (state.getNext()) {
if (buffer)
- state.getText(buffer, 100);
- // Talker id
- return make_reg(0, state.getTalker());
- } else {
- if (buffer) strcpy(buffer, DUMMY_MESSAGE);
+ strcpy(buffer, DUMMY_MESSAGE);
+
return NULL_REG;
}
- }
- case 2 : {
- MessageTuple tuple;
- int module = UKPV(1);
- tuple.noun = UKPV(2);
- tuple.verb = UKPV(3);
- tuple.cond = UKPV(4);
- tuple.seq = UKPV(5);
-
- if (state.loadRes(module) && state.getSpecific(&tuple))
+ case 2:
+ if (state.getSpecific(&tuple))
return make_reg(0, state.getLength() + 1);
else return NULL_REG;
}
- }
return NULL_REG;
}
@@ -785,8 +778,6 @@ reg_t kGetMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
if (!state.isInitialized())
message_state_initialize(s->resmgr, &state);
- char *buffer = kernel_dereference_char_pointer(s, argv[3], 0);
-
MessageTuple tuple;
tuple.noun = UKPV(0);
int module = UKPV(1);
@@ -794,12 +785,17 @@ reg_t kGetMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
tuple.cond = 0;
tuple.seq = 0;
- if (buffer && state.loadRes(module) && state.getSpecific(&tuple)) {
- state.getText(buffer, 255);
- return argv[3];
- } else {
- return NULL_REG;
+ if (state.loadRes(module) && state.getSpecific(&tuple)) {
+ int len = state.getLength();
+ char *buffer = kernel_dereference_char_pointer(s, argv[3], len + 1);
+
+ if (buffer) {
+ state.getText(buffer);
+ return argv[3];
+ }
}
+
+ return NULL_REG;
}
} // End of namespace Sci
diff --git a/engines/sci/engine/message.cpp b/engines/sci/engine/message.cpp
index 6766224247..2bed850a31 100644
--- a/engines/sci/engine/message.cpp
+++ b/engines/sci/engine/message.cpp
@@ -93,22 +93,16 @@ int MessageState::getTalker() {
return *(_engineCursor.index_record + 4);
}
-int MessageState::getText(char *buffer, int length) {
- int offset;
- if (_version == 2101)
- offset = READ_LE_UINT16(_engineCursor.index_record + 2);
- else
- offset = READ_LE_UINT16(_engineCursor.index_record + 5);
-
+void MessageState::getText(char *buffer) {
+ int offset = READ_LE_UINT16(_engineCursor.index_record + ((_version == 2101) ? 2 : 5));
char *stringptr = (char *)_engineCursor.resource_beginning + offset;
- strncpy(buffer, stringptr, length);
-
- return strlen(buffer);
+ strcpy(buffer, stringptr);
}
int MessageState::getLength() {
- char buffer[500];
- return getText(buffer, sizeof(buffer));
+ int offset = READ_LE_UINT16(_engineCursor.index_record + ((_version == 2101) ? 2 : 5));
+ char *stringptr = (char *)_engineCursor.resource_beginning + offset;
+ return strlen(stringptr);
}
int MessageState::loadRes(int module) {
diff --git a/engines/sci/engine/message.h b/engines/sci/engine/message.h
index 9f5b04cf7e..c125d1b898 100644
--- a/engines/sci/engine/message.h
+++ b/engines/sci/engine/message.h
@@ -46,7 +46,7 @@ struct IndexRecordCursor {
//typedef int index_record_size_t();
typedef void parse_index_record_t(IndexRecordCursor *index_record, MessageTuple *t);
typedef int get_talker_t(IndexRecordCursor *cursor);
-typedef void get_text_t(IndexRecordCursor *cursor, char *buffer, int buffer_size);
+typedef void get_text_t(IndexRecordCursor *cursor);
typedef int index_record_count_t(byte *header);
class MessageState {
@@ -55,7 +55,7 @@ public:
int getNext();
int getTalker();
int getLength();
- int getText(char *buffer, int length);
+ void getText(char *buffer);
int loadRes(int module);
int isInitialized() { return _initialized; }
void initialize(ResourceManager *resmgr);