aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--saga/script.h2
-rw-r--r--saga/sthread.cpp6
2 files changed, 5 insertions, 3 deletions
diff --git a/saga/script.h b/saga/script.h
index 4cb99f99c0..029f38a567 100644
--- a/saga/script.h
+++ b/saga/script.h
@@ -290,7 +290,7 @@ public:
}
uint pushedSize() {
- return _stackSize - _stackTopIndex - 1;
+ return _stackSize - _stackTopIndex - 2;
}
void push(int16 value) {
diff --git a/saga/sthread.cpp b/saga/sthread.cpp
index dc759be65c..1513fa65ea 100644
--- a/saga/sthread.cpp
+++ b/saga/sthread.cpp
@@ -49,7 +49,7 @@ ScriptThread *Script::createThread(uint16 scriptModuleNumber, uint16 scriptEntry
newThread->_flags = kTFlagNone;
newThread->_stackSize = DEFAULT_THREAD_STACK_SIZE;
newThread->_stackBuf = (uint16 *)malloc(newThread->_stackSize * sizeof(*newThread->_stackBuf));
- newThread->_stackTopIndex = newThread->_stackSize - 1; // or 2 - as in original
+ newThread->_stackTopIndex = newThread->_stackSize - 2;
newThread->_instructionOffset = _modules[scriptModuleNumber].entryPoints[scriptEntryPointNumber].offset;
newThread->_commonBase = _commonBuffer;
newThread->_staticBase = _commonBuffer + _modules[scriptModuleNumber].staticOffset;
@@ -322,6 +322,8 @@ bool Script::runThread(ScriptThread *thread, uint instructionLimit) {
// counter as a pointer here. But I don't think
// we will have to do that.
thread->push(param2);
+ // NOTE2: program counter is 32bit - so we should "emulate" it size - because kAddressStack relies on it
+ thread->push(0);
thread->_instructionOffset = iparam1;
break;
@@ -338,7 +340,6 @@ bool Script::runThread(ScriptThread *thread, uint instructionLimit) {
(this->*scriptFunction)(thread, argumentsCount);
if (scriptFunction == &Saga::Script::sfScriptGotoScene) {
- //if (functionNumber == 16) { // sfScriptGotoScene
return true; // cause abortAllThreads called and _this_ thread destroyed
}
@@ -363,6 +364,7 @@ bool Script::runThread(ScriptThread *thread, uint instructionLimit) {
thread->_flags |= kTFlagFinished;
return true;
} else {
+ thread->pop(); //cause it 0
thread->_instructionOffset = thread->pop();
iparam1 = thread->pop();
iparam1 += iparam1;