diff options
Diffstat (limited to 'engines/cruise/script.cpp')
-rw-r--r-- | engines/cruise/script.cpp | 247 |
1 files changed, 102 insertions, 145 deletions
diff --git a/engines/cruise/script.cpp b/engines/cruise/script.cpp index 5403c5da59..1f308714f7 100644 --- a/engines/cruise/script.cpp +++ b/engines/cruise/script.cpp @@ -51,12 +51,13 @@ int32 opcodeType0() { int index = 0; switch (currentScriptOpcodeType) { - case 0: { + case 0: pushVar(getShortFromScript()); return (0); - } + case 5: index = saveOpcodeVar; + // No break on purpose case 1: { uint8 *address = 0; int type = getByteFromScript(); @@ -131,12 +132,12 @@ int32 opcodeType1() { int offset = 0; switch (currentScriptOpcodeType) { - case 0: { + case 0: return (0); // strange, but happens also in original interpreter - } - case 5: { + + case 5: offset = saveOpcodeVar; - } + //no break on purpose case 1: { int var_A = 0; @@ -169,7 +170,7 @@ int32 opcodeType1() { if (var_6 == 5) { ptr = overlayTable[byte2].ovlData->data4Ptr + var_C; } else { - ASSERT(0); + assert(0); } } else { ptr = scriptDataPtrTable[var_6] + var_C; @@ -226,6 +227,7 @@ int32 opcodeType2() { switch (currentScriptOpcodeType) { case 5: index = saveOpcodeVar; + // No break on purpose case 1: { uint8* adresse = NULL; int type = getByteFromScript(); @@ -247,7 +249,7 @@ int32 opcodeType2() { if (!overlayTable[overlay].ovlData) { return (-4); } - ASSERT(0); + assert(0); } adresse += offset; @@ -261,6 +263,7 @@ int32 opcodeType2() { } } + break; } return 0; @@ -281,39 +284,37 @@ int32 opcodeType4() { // test int var2 = popVar(); switch (currentScriptOpcodeType) { - case 0: { + case 0: if (var2 != var1) boolVar = 1; break; - } - case 1: { + + case 1: if (var2 == var1) boolVar = 1; break; - } - case 2: { + + case 2: if (var2 < var1) boolVar = 1; break; - } - case 3: { + + case 3: if (var2 <= var1) boolVar = 1; break; - } - case 4: { + + case 4: if (var2 > var1) boolVar = 1; break; - } - case 5: { + + case 5: if (var2 >= var1) boolVar = 1; break; } - } - pushVar(boolVar); return (0); @@ -327,13 +328,11 @@ int32 opcodeType6() { if (!pop) si = 1; - if (pop < 0) { + if (pop < 0) si |= 4; - } - if (pop > 0) { + if (pop > 0) si |= 2; - } currentScriptPtr->ccr = si; @@ -357,50 +356,49 @@ int32 opcodeType5() { int bitMask = currentScriptPtr->ccr; switch (currentScriptOpcodeType) { - case 0: { - if (!(bitMask & 1)) { + case 0: + if (!(bitMask & 1)) currentScriptPtr->scriptOffset = newSi; - } + break; - } - case 1: { - if (bitMask & 1) { + + case 1: + if (bitMask & 1) currentScriptPtr->scriptOffset = newSi; - } + break; - } - case 2: { - if (bitMask & 2) { + + case 2: + if (bitMask & 2) currentScriptPtr->scriptOffset = newSi; - } + break; - } - case 3: { - if (bitMask & 3) { + + case 3: + if (bitMask & 3) currentScriptPtr->scriptOffset = newSi; - } + break; - } - case 4: { - if (bitMask & 4) { + + case 4: + if (bitMask & 4) currentScriptPtr->scriptOffset = newSi; - } + break; - } - case 5: { - if (bitMask & 5) { + + case 5: + if (bitMask & 5) currentScriptPtr->scriptOffset = newSi; - } + break; - } - case 6: { + + case 6: break; // never - } - case 7: { + + case 7: currentScriptPtr->scriptOffset = newSi; //always break; } - } return (0); } @@ -410,39 +408,39 @@ int32 opcodeType3() { // math int pop2 = popVar(); switch (currentScriptOpcodeType) { - case 0: { + case 0: pushVar(pop1 + pop2); return (0); - } - case 1: { + + case 1: if (pop2 == 0) error("opcodeType3 - Invalid value for pop2"); pushVar(pop1 / pop2); return (0); - } - case 2: { + + case 2: pushVar(pop1 - pop2); return (0); - } - case 3: { + + case 3: pushVar(pop1 * pop2); return (0); - } - case 4: { + + case 4: if (pop2 == 0) error("opcodeType3 - Invalid value for pop2"); pushVar(pop1 % pop2); return (0); - } + case 7: - case 5: { + case 5: pushVar(pop2 | pop1); return (0); - } - case 6: { + + case 6: pushVar(pop2 & pop1); return (0); - } + } return 0; @@ -455,9 +453,8 @@ int32 opcodeType9() { // stop script } void setupFuncArray() { - for (int i = 0; i < 64; i++) { + for (int i = 0; i < 64; i++) opcodeTypeTable[i] = NULL; - } opcodeTypeTable[1] = opcodeType0; opcodeTypeTable[2] = opcodeType1; @@ -474,19 +471,13 @@ void setupFuncArray() { } int removeScript(int overlay, int idx, scriptInstanceStruct *headPtr) { - scriptInstanceStruct *scriptPtr; - - scriptPtr = headPtr->nextScriptPtr; + scriptInstanceStruct *scriptPtr = headPtr->nextScriptPtr; - if (scriptPtr) { - do { - if (scriptPtr->overlayNumber == overlay - && (scriptPtr->scriptNumber == idx || idx == -1)) { - scriptPtr->scriptNumber = -1; - } + while (scriptPtr) { + if (scriptPtr->overlayNumber == overlay && (scriptPtr->scriptNumber == idx || idx == -1)) + scriptPtr->scriptNumber = -1; - scriptPtr = scriptPtr->nextScriptPtr; - } while (scriptPtr); + scriptPtr = scriptPtr->nextScriptPtr; } return (0); @@ -495,77 +486,61 @@ int removeScript(int overlay, int idx, scriptInstanceStruct *headPtr) { uint8 *attacheNewScriptToTail(scriptInstanceStruct *scriptHandlePtr, int16 overlayNumber, int16 param, int16 arg0, int16 arg1, int16 arg2, scriptTypeEnum scriptType) { int useArg3Neg = 0; ovlData3Struct *data3Ptr; - scriptInstanceStruct *tempPtr; int var_C; scriptInstanceStruct *oldTail; - //debug("Starting script %d of overlay %s", param,overlayTable[overlayNumber].overlayName); - if (scriptType < 0) { useArg3Neg = 1; - scriptType = (scriptTypeEnum) - scriptType; + scriptType = (scriptTypeEnum) -scriptType; } - if (scriptType == 20) { + if (scriptType == 20) data3Ptr = getOvlData3Entry(overlayNumber, param); - } else { - if (scriptType == 30) { - data3Ptr = scriptFunc1Sub2(overlayNumber, param); - } else { - return (NULL); - } - } + else if (scriptType == 30) + data3Ptr = scriptFunc1Sub2(overlayNumber, param); + else + return (NULL); - if (!data3Ptr) { + if (!data3Ptr) return (NULL); - } - if (!data3Ptr->dataPtr) { + if (!data3Ptr->dataPtr) return (NULL); - } var_C = data3Ptr->sysKey; - oldTail = scriptHandlePtr; - while (oldTail->nextScriptPtr) { // go to the end of the list + while (oldTail->nextScriptPtr) // go to the end of the list oldTail = oldTail->nextScriptPtr; - } - tempPtr = - (scriptInstanceStruct *) - mallocAndZero(sizeof(scriptInstanceStruct)); + scriptInstanceStruct *tempPtr = (scriptInstanceStruct *)mallocAndZero(sizeof(scriptInstanceStruct)); if (!tempPtr) return (NULL); tempPtr->data = NULL; - if (var_C) { + if (var_C) tempPtr->data = (uint8 *) mallocAndZero(var_C); - } tempPtr->dataSize = var_C; tempPtr->nextScriptPtr = NULL; tempPtr->scriptOffset = 0; - tempPtr->scriptNumber = param; tempPtr->overlayNumber = overlayNumber; - if (scriptType == 20) { // Obj or not ? + if (scriptType == 20) // Obj or not ? tempPtr->sysKey = useArg3Neg; - } else { + else tempPtr->sysKey = 1; - } tempPtr->freeze = 0; tempPtr->type = scriptType; tempPtr->var18 = arg2; tempPtr->var16 = arg1; tempPtr->var1A = arg0; - tempPtr->nextScriptPtr = oldTail->nextScriptPtr; // should always be NULL as it's the tail - - oldTail->nextScriptPtr = tempPtr; // attache the new node to the list + tempPtr->nextScriptPtr = oldTail->nextScriptPtr; // should always be NULL as it's the tail + oldTail->nextScriptPtr = tempPtr; // attach the new node to the list return (tempPtr->data); } @@ -578,27 +553,18 @@ int executeScripts(scriptInstanceStruct *ptr) { numScript2 = ptr->scriptNumber; - if (ptr->type == 20) { + if (ptr->type == 20) ptr2 = getOvlData3Entry(ptr->overlayNumber, numScript2); + else if (ptr->type == 30) + ptr2 = scriptFunc1Sub2(ptr->overlayNumber, numScript2); + else + return (-6); - if (!ptr2) { - return (-4); - } - } else { - if (ptr->type == 30) { - ptr2 = scriptFunc1Sub2(ptr->overlayNumber, numScript2); - - if (!ptr2) { - return (-4); - } - } else { - return (-6); - } - } + if (!ptr2) + return (-4); - if (!overlayTable[ptr->overlayNumber].alreadyLoaded) { + if (!overlayTable[ptr->overlayNumber].alreadyLoaded) return (-7); - } ovlData = overlayTable[ptr->overlayNumber].ovlData; @@ -606,14 +572,11 @@ int executeScripts(scriptInstanceStruct *ptr) { return (-4); currentData3DataPtr = ptr2->dataPtr; - scriptDataPtrTable[1] = (uint8 *) ptr->data; scriptDataPtrTable[2] = getDataFromData3(ptr2, 1); scriptDataPtrTable[5] = ovlData->data4Ptr; // free strings scriptDataPtrTable[6] = ovlData->ptr8; - currentScriptPtr = ptr; - positionInStack = 0; do { @@ -647,21 +610,15 @@ int executeScripts(scriptInstanceStruct *ptr) { void manageScripts(scriptInstanceStruct *scriptHandle) { scriptInstanceStruct *ptr = scriptHandle; - if (ptr) { - do { - if (!overlayTable[ptr->overlayNumber].executeScripts) { - if ((ptr->scriptNumber != -1) && (ptr->freeze == 0) && (ptr->sysKey != 0)) { - executeScripts(ptr); - } - - if (ptr->sysKey == 0) { - ptr->sysKey = 1; - } - } - - ptr = ptr->nextScriptPtr; + while (ptr) { + if (!overlayTable[ptr->overlayNumber].executeScripts) { + if ((ptr->scriptNumber != -1) && (ptr->freeze == 0) && (ptr->sysKey != 0)) + executeScripts(ptr); - } while (ptr); + if (ptr->sysKey == 0) + ptr->sysKey = 1; + } + ptr = ptr->nextScriptPtr; } } |