diff options
Diffstat (limited to 'saga/sthread.cpp')
-rw-r--r-- | saga/sthread.cpp | 67 |
1 files changed, 25 insertions, 42 deletions
diff --git a/saga/sthread.cpp b/saga/sthread.cpp index e6fed99bff..f50524f80d 100644 --- a/saga/sthread.cpp +++ b/saga/sthread.cpp @@ -23,7 +23,6 @@ // Scripting module thread management component #include "saga/saga.h" -#include "saga/yslib.h" #include "saga/gfx.h" #include "saga/actor.h" @@ -32,6 +31,8 @@ #include "saga/script.h" #include "saga/sdata.h" +#include "saga/game_mod.h" +#include "saga/stream.h" namespace Saga { @@ -42,22 +43,13 @@ void Script::setFramePtr(SCRIPT_THREAD *thread, int newPtr) { } SCRIPT_THREAD *Script::SThreadCreate() { - YS_DL_NODE *new_node; SCRIPT_THREAD *new_thread; if (!isInitialized()) { return NULL; } - new_thread = (SCRIPT_THREAD *)calloc(1, sizeof *new_thread); - if (new_thread == NULL) { - return NULL; - } - - new_node = ys_dll_add_head(threadList(), new_thread, sizeof *new_thread); - free(new_thread); - - new_thread = (SCRIPT_THREAD *)ys_dll_get_data(new_node); + new_thread = _threadList.pushFront().operator->(); new_thread->stackPtr = ARRAYSIZE(new_thread->stackBuf) - 1; setFramePtr(new_thread, new_thread->stackPtr); @@ -71,45 +63,24 @@ SCRIPT_THREAD *Script::SThreadCreate() { return new_thread; } -int Script::SThreadDestroy(SCRIPT_THREAD *thread) { - YS_DL_NODE *walk_p; - SCRIPT_THREAD *th; - - if (thread == NULL) { - return FAILURE; - } - - for (walk_p = ys_dll_head(threadList()); walk_p != NULL; walk_p = ys_dll_next(walk_p)) { - th = (SCRIPT_THREAD *)ys_dll_get_data(walk_p); - if (thread == th) { - ys_dll_delete(walk_p); - break; - } - } - - return SUCCESS; -} int Script::SThreadExecThreads(uint msec) { - YS_DL_NODE *walk_p, *next_p; SCRIPT_THREAD *thread; if (!isInitialized()) { return FAILURE; } - walk_p = ys_dll_head(threadList()); + ScriptThreadList::iterator threadi = _threadList.begin(); - while (walk_p != NULL) { - next_p = ys_dll_next(walk_p); - - thread = (SCRIPT_THREAD *)ys_dll_get_data(walk_p); + while (threadi != _threadList.end()) { + thread = (SCRIPT_THREAD *)threadi.operator->(); if (thread->flags & (kTFlagFinished | kTFlagAborted)) { //if (thread->flags & kTFlagFinished) // FIXME. Missing function - SThreadDestroy(thread); - walk_p = next_p; + + threadi = _threadList.erase(threadi); continue; } @@ -131,14 +102,14 @@ int Script::SThreadExecThreads(uint msec) { if (!(thread->flags & kTFlagWaiting)) SThreadRun(thread, STHREAD_TIMESLICE); - walk_p = next_p; + ++threadi; } return SUCCESS; } void Script::SThreadCompleteThread(void) { - for (int i = 0; i < 40 && (ys_dll_head(threadList()) != NULL); i++) + for (int i = 0; i < 40 && !_threadList.isEmpty() ; i++) SThreadExecThreads(0); } @@ -260,7 +231,7 @@ int Script::SThreadRun(SCRIPT_THREAD *thread, int instr_limit) { } } - MemoryReadStream scriptS(currentScript()->bytecode->bytecode_p, currentScript()->bytecode->bytecode_len); + MemoryReadStream/*Endian*/ scriptS(currentScript()->bytecode->bytecode_p, currentScript()->bytecode->bytecode_len/*, IS_BIG_ENDIAN*/); dataBuffer(2)->len = currentScript()->bytecode->bytecode_len / sizeof(SDataWord_T); dataBuffer(2)->data = (SDataWord_T *) currentScript()->bytecode->bytecode_p; @@ -275,7 +246,6 @@ int Script::SThreadRun(SCRIPT_THREAD *thread, int instr_limit) { in_char = scriptS.readByte(); debug(2, "Executing thread offset: %lu (%x) stack: %d", thread->i_offset, in_char, thread->stackSize()); - switch (in_char) { case 0x01: // nextblock // Some sort of "jump to the start of the next memory @@ -385,6 +355,7 @@ int Script::SThreadRun(SCRIPT_THREAD *thread, int instr_limit) { if (func_num >= SFUNC_NUM) { _vm->_console->DebugPrintf(S_ERROR_PREFIX "Invalid script function number: (%X)\n", func_num); thread->flags |= kTFlagAborted; + debug(9, "Invalid script function number: (%X)\n", func_num); break; } @@ -392,6 +363,7 @@ int Script::SThreadRun(SCRIPT_THREAD *thread, int instr_limit) { sfuncRetVal = (this->*sfunc)(thread, n_args); if (sfuncRetVal != SUCCESS) { _vm->_console->DebugPrintf(S_WARN_PREFIX "%X: Script function %d failed.\n", thread->i_offset, func_num); + debug(9, "%X: Script function %d failed.\n", thread->i_offset, func_num); } if (func_num == 16) { // SF_gotoScene @@ -421,6 +393,7 @@ int Script::SThreadRun(SCRIPT_THREAD *thread, int instr_limit) { if (thread->stackSize() == 0) { _vm->_console->DebugPrintf("Script execution complete.\n"); thread->flags |= kTFlagFinished; + debug(9, "Script execution complete.\n"); } else { thread->i_offset = thread->pop(); /* int n_args = */ thread->pop(); @@ -520,6 +493,7 @@ int Script::SThreadRun(SCRIPT_THREAD *thread, int instr_limit) { } if (!branch_found) { _vm->_console->DebugPrintf(S_ERROR_PREFIX "%X: Random jump target out of bounds.\n", thread->i_offset); + debug(9, "%X: Random jump target out of bounds.\n", thread->i_offset); } } break; @@ -758,6 +732,7 @@ int Script::SThreadRun(SCRIPT_THREAD *thread, int instr_limit) { a_index = _vm->_actor->getActorIndex(param1); if (a_index < 0) { _vm->_console->DebugPrintf(S_WARN_PREFIX "%X: DLGP Actor id not found.\n", thread->i_offset); + debug(9, "%X: DLGP Actor id not found.\n", thread->i_offset); } for (i = 0; i < n_voices; i++) { @@ -806,6 +781,7 @@ int Script::SThreadRun(SCRIPT_THREAD *thread, int instr_limit) { _vm->_console->DebugPrintf(S_ERROR_PREFIX "%X: Invalid opcode encountered: (%X).\n", thread->i_offset, in_char); thread->flags |= kTFlagAborted; + debug(9, "%X: Invalid opcode encountered: (%X).\n", thread->i_offset, in_char); break; } @@ -813,11 +789,18 @@ int Script::SThreadRun(SCRIPT_THREAD *thread, int instr_limit) { if (saved_offset == thread->i_offset) { thread->i_offset = scriptS.pos(); } else { - scriptS.seek(thread->i_offset); + if (thread->i_offset >= scriptS.size()) { + _vm->_console->DebugPrintf("Out of range script execution at %x size %x\n", thread->i_offset, scriptS.size()); + thread->flags |= kTFlagFinished; + debug(9, "Out of range script execution at %x size %x\n", thread->i_offset, scriptS.size()); + } + else + scriptS.seek(thread->i_offset); } if (unhandled) { _vm->_console->DebugPrintf(S_ERROR_PREFIX "%X: Unhandled opcode.\n", thread->i_offset); thread->flags |= kTFlagAborted; + debug(9, "%X: Unhandled opcode.\n", thread->i_offset); } if ((thread->flags == kTFlagNone) && debug_print) { SDebugPrintInstr(thread); |