WIP code for kGetMessage (tested with Eco Quest 1). Currently, it doesn't always work for some reason...
svn-id: r40092
This commit is contained in:
parent
a016ed90ba
commit
bd2c2b0e50
4 changed files with 45 additions and 18 deletions
|
@ -204,6 +204,7 @@ SciKernelFunction kfunct_mappers[] = {
|
||||||
/*(?)*/ DEFUN("TimesCot", kTimesCot, "ii"),
|
/*(?)*/ DEFUN("TimesCot", kTimesCot, "ii"),
|
||||||
/*(?)*/ DEFUN("TimesTan", kTimesTan, "ii"),
|
/*(?)*/ DEFUN("TimesTan", kTimesTan, "ii"),
|
||||||
DEFUN("Message", kMessage, ".*"),
|
DEFUN("Message", kMessage, ".*"),
|
||||||
|
DEFUN("GetMessage", kGetMessage, ".*"),
|
||||||
DEFUN("DoAudio", kDoAudio, ".*"),
|
DEFUN("DoAudio", kDoAudio, ".*"),
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -450,6 +450,7 @@ reg_t kGetSaveDir(EngineState *s, int funct_nr, int argc, reg_t *argv);
|
||||||
reg_t kTextSize(EngineState *s, int funct_nr, int argc, reg_t *argv);
|
reg_t kTextSize(EngineState *s, int funct_nr, int argc, reg_t *argv);
|
||||||
reg_t kIsItSkip(EngineState *s, int funct_nr, int argc, reg_t *argv);
|
reg_t kIsItSkip(EngineState *s, int funct_nr, int argc, reg_t *argv);
|
||||||
reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv);
|
reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv);
|
||||||
|
reg_t kGetMessage(EngineState *s, int funct_nr, int argc, reg_t *argv);
|
||||||
reg_t kDoAudio(EngineState *s, int funct_nr, int argc, reg_t *argv);
|
reg_t kDoAudio(EngineState *s, int funct_nr, int argc, reg_t *argv);
|
||||||
reg_t k_Unknown(EngineState *s, int funct_nr, int argc, reg_t *argv);
|
reg_t k_Unknown(EngineState *s, int funct_nr, int argc, reg_t *argv);
|
||||||
|
|
||||||
|
|
|
@ -782,4 +782,28 @@ reg_t kMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
|
||||||
return NULL_REG;
|
return NULL_REG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: This doesn't always work, sometimes it doesn't find the requested tuple (tested with EcoQuest 1)
|
||||||
|
reg_t kGetMessage(EngineState *s, int funct_nr, int argc, reg_t *argv) {
|
||||||
|
if (!state.initialized)
|
||||||
|
message_state_initialize(s->resmgr, &state);
|
||||||
|
|
||||||
|
char *buffer = argc == 4 ? kernel_dereference_char_pointer(s, argv[3], 0) : NULL;
|
||||||
|
|
||||||
|
MessageTuple tuple;
|
||||||
|
tuple.noun = UKPV(0);
|
||||||
|
int module = UKPV(1);
|
||||||
|
tuple.verb = UKPV(2);
|
||||||
|
tuple.cond = 0;
|
||||||
|
tuple.seq = 0;
|
||||||
|
|
||||||
|
if (state.loadRes(module) && state.getSpecific(&tuple)) {
|
||||||
|
if (buffer)
|
||||||
|
state.getText(buffer, 100);
|
||||||
|
|
||||||
|
return make_reg(0, *buffer);
|
||||||
|
} else {
|
||||||
|
return NULL_REG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // End of namespace Sci
|
} // End of namespace Sci
|
||||||
|
|
|
@ -28,17 +28,12 @@
|
||||||
|
|
||||||
namespace Sci {
|
namespace Sci {
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Unreferenced - removed
|
|
||||||
static int get_talker_trivial(IndexRecordCursor *cursor) {
|
static int get_talker_trivial(IndexRecordCursor *cursor) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Version 2.101 and later code ahead */
|
/* Version 2.101 and later code ahead */
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Unreferenced - removed
|
|
||||||
static void index_record_parse_2101(IndexRecordCursor *cursor, MessageTuple *t) {
|
static void index_record_parse_2101(IndexRecordCursor *cursor, MessageTuple *t) {
|
||||||
int noun = *(cursor->index_record + 0);
|
int noun = *(cursor->index_record + 0);
|
||||||
int verb = *(cursor->index_record + 1);
|
int verb = *(cursor->index_record + 1);
|
||||||
|
@ -47,24 +42,17 @@ static void index_record_parse_2101(IndexRecordCursor *cursor, MessageTuple *t)
|
||||||
t->verb = verb;
|
t->verb = verb;
|
||||||
t->cond = t->seq = 0;
|
t->cond = t->seq = 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Unreferenced - removed
|
|
||||||
static void index_record_get_text_2101(IndexRecordCursor *cursor, char *buffer, int buffer_size) {
|
static void index_record_get_text_2101(IndexRecordCursor *cursor, char *buffer, int buffer_size) {
|
||||||
int offset = READ_LE_UINT16(cursor->index_record + 2);
|
int offset = READ_LE_UINT16(cursor->index_record + 2);
|
||||||
char *stringptr = (char *)cursor->resource_beginning + offset;
|
char *stringptr = (char *)cursor->resource_beginning + offset;
|
||||||
|
|
||||||
strncpy(buffer, stringptr, buffer_size);
|
strncpy(buffer, stringptr, buffer_size);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Unreferenced - removed
|
|
||||||
static int header_get_index_record_count_2101(byte *header) {
|
static int header_get_index_record_count_2101(byte *header) {
|
||||||
return READ_LE_UINT16(header + 4);
|
return READ_LE_UINT16(header + 4);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// Version 3.411 and later code ahead
|
// Version 3.411 and later code ahead
|
||||||
|
|
||||||
|
@ -175,6 +163,16 @@ int MessageState::loadRes(int module) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static MessageHandler fixed_handler_old = {
|
||||||
|
2101,
|
||||||
|
index_record_parse_2101,
|
||||||
|
get_talker_trivial,
|
||||||
|
index_record_get_text_2101,
|
||||||
|
header_get_index_record_count_2101,
|
||||||
|
10, // FIXME: is this correct?
|
||||||
|
11 // FIXME: is this correct?
|
||||||
|
};
|
||||||
|
|
||||||
static MessageHandler fixed_handler = {
|
static MessageHandler fixed_handler = {
|
||||||
3411,
|
3411,
|
||||||
index_record_parse_3411,
|
index_record_parse_3411,
|
||||||
|
@ -186,19 +184,22 @@ static MessageHandler fixed_handler = {
|
||||||
};
|
};
|
||||||
|
|
||||||
void message_state_initialize(ResourceManager *resmgr, MessageState *state) {
|
void message_state_initialize(ResourceManager *resmgr, MessageState *state) {
|
||||||
//Resource *tester = resmgr->findResource(kResourceTypeMessage, 0, 0);
|
Resource *tester = resmgr->findResource(kResourceTypeMessage, 0, 0);
|
||||||
//int version;
|
int version;
|
||||||
|
|
||||||
//if (tester == NULL)
|
if (tester == NULL)
|
||||||
// return;
|
return;
|
||||||
|
|
||||||
//version = READ_LE_UINT16(tester->data);
|
version = READ_LE_UINT16(tester->data);
|
||||||
|
|
||||||
state->initialized = 1;
|
state->initialized = 1;
|
||||||
state->_module = -1;
|
state->_module = -1;
|
||||||
state->resmgr = resmgr;
|
state->resmgr = resmgr;
|
||||||
state->current_res = NULL;
|
state->current_res = NULL;
|
||||||
state->record_count = 0;
|
state->record_count = 0;
|
||||||
|
if (version == 2101)
|
||||||
|
state->handler = &fixed_handler_old;
|
||||||
|
else
|
||||||
state->handler = &fixed_handler;
|
state->handler = &fixed_handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue