diff options
Diffstat (limited to 'engines/cruise/decompiler.cpp')
-rw-r--r-- | engines/cruise/decompiler.cpp | 2477 |
1 files changed, 1264 insertions, 1213 deletions
diff --git a/engines/cruise/decompiler.cpp b/engines/cruise/decompiler.cpp index 5e32374e3d..a2a554aedf 100644 --- a/engines/cruise/decompiler.cpp +++ b/engines/cruise/decompiler.cpp @@ -35,13 +35,12 @@ namespace Cruise { int currentLineType = 0; -struct decompileLineStruct -{ - int lineOffset; - char line[lineMaxSize]; - int indent; - int type; - int pendingElse; +struct decompileLineStruct { + int lineOffset; + char line[lineMaxSize]; + int indent; + int type; + int pendingElse; }; struct decompileLineStruct decompileLineTable[numMaxLignes]; @@ -50,11 +49,11 @@ int positionInDecompileLineTable; int failed; -char* currentDecompScript; +char *currentDecompScript; scriptInstanceStruct dummy; -scriptInstanceStruct* currentDecompScriptPtr = &dummy; +scriptInstanceStruct *currentDecompScriptPtr = &dummy; -uint8* getDataFromData3(ovlData3Struct* ptr, int param); +uint8 *getDataFromData3(ovlData3Struct * ptr, int param); opcodeTypeFunction decompOpcodeTypeTable[64]; @@ -64,7 +63,7 @@ unsigned long int currentOffset; unsigned long int dumpIdx = 0; -FILE* fHandle = NULL; +FILE *fHandle = NULL; #define DECOMPILER_STACK_DEPTH 100 #define DECOMPILER_STACK_ENTRY_SIZE 5000 @@ -77,645 +76,648 @@ unsigned long int decompileStackPosition = 0; uint8 stringName[256]; -ovlData3Struct* currentScript; +ovlData3Struct *currentScript; -ovlDataStruct* currentDecompOvl; +ovlDataStruct *currentDecompOvl; int currentDecompScriptIdx; char decompSaveOpcodeVar[256]; -uint8* getStringNameFromIdx(uint16 stringTypeIdx, char* offset) -{ - switch(stringTypeIdx&7) - { - case 2: - { - sprintf(stringName,"\"%s\"",currentScript->dataPtr+currentScript->offsetToSubData3 + atoi(offset)); - break; - } - case 5: - { - sprintf(stringName,"vars[%s]",offset); - break; - } - default: - { - sprintf(stringName,"string[%d][%s]",stringTypeIdx&7,offset); - break; - } - } +uint8 *getStringNameFromIdx(uint16 stringTypeIdx, char *offset) { + switch (stringTypeIdx & 7) { + case 2: + { + sprintf(stringName, "\"%s\"", + currentScript->dataPtr + + currentScript->offsetToSubData3 + atoi(offset)); + break; + } + case 5: + { + sprintf(stringName, "vars[%s]", offset); + break; + } + default: + { + sprintf(stringName, "string[%d][%s]", + stringTypeIdx & 7, offset); + break; + } + } - return stringName; + return stringName; } -char* resolveMessage(char* messageIdxString) -{ - char buffer[500]; - int variable; +char *resolveMessage(char *messageIdxString) { + char buffer[500]; + int variable; - variable = atoi(messageIdxString); - sprintf(buffer,"%d",variable); + variable = atoi(messageIdxString); + sprintf(buffer, "%d", variable); - if(strcmp(buffer,messageIdxString)) - { - return messageIdxString; - } - else - { - return currentDecompOvl->stringTable[atoi(messageIdxString)].string; - } + if (strcmp(buffer, messageIdxString)) { + return messageIdxString; + } else { + return currentDecompOvl->stringTable[atoi(messageIdxString)]. + string; + } } -void pushDecomp(char* string, ...) -{ - va_list va; +void pushDecomp(char *string, ...) { + va_list va; - va_start(va,string); - vsprintf(decompileStack[decompileStackPosition],string,va); - va_end(va); + va_start(va, string); + vsprintf(decompileStack[decompileStackPosition], string, va); + va_end(va); - // fprintf(fHandle, "----> %s\n",decompileStack[decompileStackPosition]); + // fprintf(fHandle, "----> %s\n",decompileStack[decompileStackPosition]); - decompileStackPosition++; + decompileStackPosition++; } -void resolveDecompShort(char* buffer) -{ - ovlData3Struct* data3Ptr = currentScript; +void resolveDecompShort(char *buffer) { + ovlData3Struct *data3Ptr = currentScript; - { - int i; - - importScriptStruct* importEntry = (importScriptStruct*) (data3Ptr->dataPtr + data3Ptr->offsetToImportData); - - for(i=0;i<data3Ptr->numImport;i++) - { - switch(importEntry->type) - { - case 20: // script - case 30: - case 40: - case 50: - { - if(importEntry->offset == currentDecompScriptPtr->var4 - 3) // param1 - { - sprintf(buffer,data3Ptr->dataPtr+data3Ptr->offsetToImportName+importEntry->offsetToName); - return; - } - if(importEntry->offset == currentDecompScriptPtr->var4 - 6) // param2 - { - sprintf(buffer,"linkedIdx"); - return; - } - break; - } - default: - { - if(importEntry->offset == currentDecompScriptPtr->var4 - 4) - { - sprintf(buffer,data3Ptr->dataPtr+data3Ptr->offsetToImportName+importEntry->offsetToName); - return; - } - } - } - importEntry++; - } - } + { + int i; + + importScriptStruct *importEntry = + (importScriptStruct *) (data3Ptr->dataPtr + + data3Ptr->offsetToImportData); + + for (i = 0; i < data3Ptr->numImport; i++) { + switch (importEntry->type) { + case 20: // script + case 30: + case 40: + case 50: + { + if (importEntry->offset == currentDecompScriptPtr->var4 - 3) // param1 + { + sprintf(buffer, + data3Ptr->dataPtr + + data3Ptr-> + offsetToImportName + + importEntry->offsetToName); + return; + } + if (importEntry->offset == currentDecompScriptPtr->var4 - 6) // param2 + { + sprintf(buffer, "linkedIdx"); + return; + } + break; + } + default: + { + if (importEntry->offset == + currentDecompScriptPtr->var4 - 4) { + sprintf(buffer, + data3Ptr->dataPtr + + data3Ptr-> + offsetToImportName + + importEntry->offsetToName); + return; + } + } + } + importEntry++; + } + } - buffer[0] = 0; + buffer[0] = 0; } -void resolveDecompChar(char* buffer) -{ - ovlData3Struct* data3Ptr = currentScript; +void resolveDecompChar(char *buffer) { + ovlData3Struct *data3Ptr = currentScript; - { - int i; - - importScriptStruct* importEntry = (importScriptStruct*) (data3Ptr->dataPtr + data3Ptr->offsetToImportData); - - for(i=0;i<data3Ptr->numImport;i++) - { - switch(importEntry->type) - { - default: - { - if(importEntry->offset == currentDecompScriptPtr->var4 - 2) - { - sprintf(buffer,data3Ptr->dataPtr+data3Ptr->offsetToImportName+importEntry->offsetToName); - return; - } - } - } - importEntry++; - } - } + { + int i; - buffer[0] = 0; + importScriptStruct *importEntry = + (importScriptStruct *) (data3Ptr->dataPtr + + data3Ptr->offsetToImportData); + + for (i = 0; i < data3Ptr->numImport; i++) { + switch (importEntry->type) { + default: + { + if (importEntry->offset == + currentDecompScriptPtr->var4 - 2) { + sprintf(buffer, + data3Ptr->dataPtr + + data3Ptr-> + offsetToImportName + + importEntry->offsetToName); + return; + } + } + } + importEntry++; + } + } + + buffer[0] = 0; } -char* popDecomp() -{ - // printf("<----\n"); +char *popDecomp() { + // printf("<----\n"); - if(!decompileStackPosition) - { - return(""); - } + if (!decompileStackPosition) { + return (""); + } - decompileStackPosition--; + decompileStackPosition--; - return decompileStack[decompileStackPosition]; + return decompileStack[decompileStackPosition]; } -void getByteFromDecompScript(char* buffer) -{ +void getByteFromDecompScript(char *buffer) { short int var = currentDecompScript[currentDecompScriptPtr->var4]; - currentDecompScriptPtr->var4 = currentDecompScriptPtr->var4+1; + currentDecompScriptPtr->var4 = currentDecompScriptPtr->var4 + 1; - if(var==-1) - { - resolveDecompChar(buffer); + if (var == -1) { + resolveDecompChar(buffer); - if(buffer[0]) - return; - } + if (buffer[0]) + return; + } - sprintf(buffer,"%d",var); + sprintf(buffer, "%d", var); } -char getByteFromDecompScriptReal(void) -{ +char getByteFromDecompScriptReal(void) { short int var = currentDecompScript[currentDecompScriptPtr->var4]; - currentDecompScriptPtr->var4 = currentDecompScriptPtr->var4+1; + currentDecompScriptPtr->var4 = currentDecompScriptPtr->var4 + 1; return var; } -void getShortFromDecompScript(char* buffer) -{ - short int var = *(int16*)(currentDecompScript+currentDecompScriptPtr->var4); +void getShortFromDecompScript(char *buffer) { + short int var = + *(int16 *) (currentDecompScript + currentDecompScriptPtr->var4); - currentDecompScriptPtr->var4 = currentDecompScriptPtr->var4+2; + currentDecompScriptPtr->var4 = currentDecompScriptPtr->var4 + 2; flipShort(&var); - if(var == -1) - { - resolveDecompShort(buffer); + if (var == -1) { + resolveDecompShort(buffer); - if(buffer[0]) - return; - } + if (buffer[0]) + return; + } - sprintf(buffer,"%d",var); + sprintf(buffer, "%d", var); } -short int getShortFromDecompScriptReal(void) -{ - short int var = *(int16*)(currentDecompScript+currentDecompScriptPtr->var4); +short int getShortFromDecompScriptReal(void) { + short int var = + *(int16 *) (currentDecompScript + currentDecompScriptPtr->var4); - currentDecompScriptPtr->var4 = currentDecompScriptPtr->var4+2; + currentDecompScriptPtr->var4 = currentDecompScriptPtr->var4 + 2; flipShort(&var); return var; } -void addDecomp(char* string, ...) -{ - va_list va; - - /* fprintf(fHandle,"%d: ",currentLineIdx); - - va_start(va,string); - vfprintf(fHandle,string,va); - va_end(va); - - fprintf(fHandle,"\n"); */ - - struct decompileLineStruct* pLineStruct = &decompileLineTable[positionInDecompileLineTable++]; - - pLineStruct->lineOffset = currentLineIdx; - pLineStruct->indent = 0; - pLineStruct->type = currentLineType; - pLineStruct->line[0] = 0; - pLineStruct->pendingElse = 0; - - va_start(va,string); - vsprintf(pLineStruct->line, string,va); - va_end(va); - - currentLineIdx = currentDecompScriptPtr->var4; - currentLineType = 0; - - /*printf("%d: ",currentOffset); - - va_start(va,string); - vprintf(string,va); - va_end(va); - - printf("\n");*/ +void addDecomp(char *string, ...) { + va_list va; + + /* fprintf(fHandle,"%d: ",currentLineIdx); + * + * va_start(va,string); + * vfprintf(fHandle,string,va); + * va_end(va); + * + * fprintf(fHandle,"\n"); */ + + struct decompileLineStruct *pLineStruct = + &decompileLineTable[positionInDecompileLineTable++]; + + pLineStruct->lineOffset = currentLineIdx; + pLineStruct->indent = 0; + pLineStruct->type = currentLineType; + pLineStruct->line[0] = 0; + pLineStruct->pendingElse = 0; + + va_start(va, string); + vsprintf(pLineStruct->line, string, va); + va_end(va); + + currentLineIdx = currentDecompScriptPtr->var4; + currentLineType = 0; + + /*printf("%d: ",currentOffset); + * + * va_start(va,string); + * vprintf(string,va); + * va_end(va); + * + * printf("\n"); */ } -void resolveVarName(char* ovlIdxString, int varType, char* varIdxString, char* outputName) -{ +void resolveVarName(char *ovlIdxString, int varType, char *varIdxString, + char *outputName) { int varIdx = atoi(varIdxString); - strcpy(outputName,""); + strcpy(outputName, ""); - if(varType == 2) - { - strcpy(outputName, getStringNameFromIdx(varType, varIdxString)); + if (varType == 2) { + strcpy(outputName, getStringNameFromIdx(varType, + varIdxString)); return; } - if(varType == 1) - { + if (varType == 1) { sprintf(outputName, "localVar_%s", varIdxString); return; } - if(!strcmp(ovlIdxString,"0")) - { + if (!strcmp(ovlIdxString, "0")) { int i; - for(i=0;i<currentDecompOvl->numExport;i++) - { - if(varIdx == currentDecompOvl->exportDataPtr[i].idx) - { - if( ((currentDecompOvl->exportDataPtr[i].var4&0xF0) == 0) && varType != 0x20) // var + for (i = 0; i < currentDecompOvl->numExport; i++) { + if (varIdx == currentDecompOvl->exportDataPtr[i].idx) { + if (((currentDecompOvl->exportDataPtr[i].var4 & 0xF0) == 0) && varType != 0x20) // var { - strcpy(outputName, currentDecompOvl->exportNamesPtr + currentDecompOvl->exportDataPtr[i].offsetToName); + strcpy(outputName, + currentDecompOvl->exportNamesPtr + + currentDecompOvl->exportDataPtr[i]. + offsetToName); return; } - if( (currentDecompOvl->exportDataPtr[i].var4) == 20 && varType == 0x20) // script + if ((currentDecompOvl->exportDataPtr[i].var4) == 20 && varType == 0x20) // script { - strcpy(outputName, currentDecompOvl->exportNamesPtr + currentDecompOvl->exportDataPtr[i].offsetToName); + strcpy(outputName, + currentDecompOvl->exportNamesPtr + + currentDecompOvl->exportDataPtr[i]. + offsetToName); return; } } } - sprintf(outputName, "ovl(%s).[%d][%s]", ovlIdxString, varType, varIdxString); - } - else - { + sprintf(outputName, "ovl(%s).[%d][%s]", ovlIdxString, varType, + varIdxString); + } else { strcpy(outputName, ovlIdxString); } } -int decompLoadVar(void) -{ - switch(currentScriptOpcodeType) - { +int decompLoadVar(void) { + switch (currentScriptOpcodeType) { case 0: { - char buffer[256]; + char buffer[256]; - getShortFromDecompScript(buffer); + getShortFromDecompScript(buffer); - pushDecomp(buffer); + pushDecomp(buffer); - return(0); + return (0); } - // string - case 1: - { - char buffer1[256]; - char buffer2[256]; - char buffer3[256]; + // string + case 1: + { + char buffer1[256]; + char buffer2[256]; + char buffer3[256]; char varName[256]; - getByteFromDecompScript(buffer1); + getByteFromDecompScript(buffer1); getByteFromDecompScript(buffer2); getShortFromDecompScript(buffer3); - resolveVarName(buffer2,atoi(buffer1) & 7,buffer3, varName); + resolveVarName(buffer2, atoi(buffer1) & 7, buffer3, + varName); - pushDecomp("%s",varName); - return(0); - } - case 2: - { - char buffer1[256]; - char buffer2[256]; - char buffer3[256]; + pushDecomp("%s", varName); + return (0); + } + case 2: + { + char buffer1[256]; + char buffer2[256]; + char buffer3[256]; char varName[256]; - getByteFromDecompScript(buffer1); + getByteFromDecompScript(buffer1); getByteFromDecompScript(buffer2); getShortFromDecompScript(buffer3); - resolveVarName(buffer2,atoi(buffer1) & 7,buffer3, varName); + resolveVarName(buffer2, atoi(buffer1) & 7, buffer3, + varName); - pushDecomp("%s",varName); - return(0); - } - case 5: - { - char buffer1[256]; - char buffer2[256]; - char buffer3[256]; + pushDecomp("%s", varName); + return (0); + } + case 5: + { + char buffer1[256]; + char buffer2[256]; + char buffer3[256]; char varName[256]; - getByteFromDecompScript(buffer1); + getByteFromDecompScript(buffer1); getByteFromDecompScript(buffer2); getShortFromDecompScript(buffer3); - resolveVarName(buffer2,atoi(buffer1) & 7,buffer3, varName); + resolveVarName(buffer2, atoi(buffer1) & 7, buffer3, + varName); - pushDecomp("%s[%s]",varName,decompSaveOpcodeVar); - return(0); - } + pushDecomp("%s[%s]", varName, decompSaveOpcodeVar); + return (0); + } default: { - printf("Unsupported type %d in opcodeType0\n",currentScriptOpcodeType); - failed = 1; + printf("Unsupported type %d in opcodeType0\n", + currentScriptOpcodeType); + failed = 1; } } } -int decompSaveVar(void) -{ -// int var = popVar(); +int decompSaveVar(void) { +// int var = popVar(); - switch(currentScriptOpcodeType) - { - case 0: - { - addDecomp(popDecomp()); - return(0); - } - // modify string - case 1: - { - char buffer1[256]; - char buffer2[256]; - char buffer3[256]; + switch (currentScriptOpcodeType) { + case 0: + { + addDecomp(popDecomp()); + return (0); + } + // modify string + case 1: + { + char buffer1[256]; + char buffer2[256]; + char buffer3[256]; char varName[256]; - uint8 type; + uint8 type; - getByteFromDecompScript(buffer1); + getByteFromDecompScript(buffer1); getByteFromDecompScript(buffer2); getShortFromDecompScript(buffer3); - type = atoi(buffer1) & 7; + type = atoi(buffer1) & 7; - resolveVarName(buffer2,type,buffer3, varName); + resolveVarName(buffer2, type, buffer3, varName); - addDecomp("%s = %s",varName,popDecomp()); - break; + addDecomp("%s = %s", varName, popDecomp()); + break; } - case 2: + case 2: { - char buffer1[256]; - char buffer2[256]; - char buffer3[256]; + char buffer1[256]; + char buffer2[256]; + char buffer3[256]; - getByteFromDecompScript(buffer1); + getByteFromDecompScript(buffer1); getByteFromDecompScript(buffer2); getShortFromDecompScript(buffer3); - addDecomp("ovl(%s).setVar(%s,%s) = %s",buffer2,buffer1,buffer3,popDecomp()); - break; + addDecomp("ovl(%s).setVar(%s,%s) = %s", buffer2, + buffer1, buffer3, popDecomp()); + break; } - case 4: - { - strcpy(decompSaveOpcodeVar,popDecomp()); - break; - } - case 5: + case 4: { - char buffer1[256]; - char buffer2[256]; - char buffer3[256]; + strcpy(decompSaveOpcodeVar, popDecomp()); + break; + } + case 5: + { + char buffer1[256]; + char buffer2[256]; + char buffer3[256]; char varName[256]; - uint8 type; + uint8 type; - getByteFromDecompScript(buffer1); + getByteFromDecompScript(buffer1); getByteFromDecompScript(buffer2); getShortFromDecompScript(buffer3); - type = atoi(buffer1) & 7; + type = atoi(buffer1) & 7; - resolveVarName(buffer2,type,buffer3, varName); + resolveVarName(buffer2, type, buffer3, varName); - addDecomp("%s[%s] = %s",varName,decompSaveOpcodeVar,popDecomp()); - break; + addDecomp("%s[%s] = %s", varName, decompSaveOpcodeVar, + popDecomp()); + break; } default: { - printf("Unsupported type %d in opcodeType1\n",currentScriptOpcodeType); - failed = 1; + printf("Unsupported type %d in opcodeType1\n", + currentScriptOpcodeType); + failed = 1; } } - return(0); + return (0); } -int decompOpcodeType2(void) -{ - switch(currentScriptOpcodeType) - { - case 1: - { - char buffer3[256]; - char varName[256]; - int byte1 = getByteFromDecompScriptReal(); - int byte2 = getByteFromDecompScriptReal(); - getShortFromDecompScript(buffer3); - - resolveVarName("0",byte1 & 7,buffer3, varName); - - pushDecomp(varName); - - break; - } - case 5: - { +int decompOpcodeType2(void) { + switch (currentScriptOpcodeType) { + case 1: + { + char buffer3[256]; + char varName[256]; + int byte1 = getByteFromDecompScriptReal(); + int byte2 = getByteFromDecompScriptReal(); + getShortFromDecompScript(buffer3); + + resolveVarName("0", byte1 & 7, buffer3, varName); + + pushDecomp(varName); + + break; + } + case 5: + { int byte1 = getByteFromDecompScriptReal(); int byte2 = getByteFromDecompScriptReal(); short int short1 = getShortFromDecompScriptReal(); - int8* ptr = scriptDataPtrTable[byte1 & 7] + short1; - - if((byte1&7) == 2) - { - pushDecomp("\"%s\"[%s]",ptr,decompSaveOpcodeVar); - } - else - if((byte1&7) == 5) - { - pushDecomp("freeString[%d][%s]",short1,decompSaveOpcodeVar); - } - else - { - printf("Unsupported type %d in opcodeType2\n",byte1 & 7); - failed = 1; - } - break; - } + int8 *ptr = scriptDataPtrTable[byte1 & 7] + short1; + + if ((byte1 & 7) == 2) { + pushDecomp("\"%s\"[%s]", ptr, + decompSaveOpcodeVar); + } else if ((byte1 & 7) == 5) { + pushDecomp("freeString[%d][%s]", short1, + decompSaveOpcodeVar); + } else { + printf("Unsupported type %d in opcodeType2\n", + byte1 & 7); + failed = 1; + } + break; + } default: { - printf("Unsupported type %d in opcodeType2\n",currentScriptOpcodeType); - failed = 1; + printf("Unsupported type %d in opcodeType2\n", + currentScriptOpcodeType); + failed = 1; } - } - return(0); + } + return (0); } -int decompMath(void) -{ - char* param1 = popDecomp(); - char* param2 = popDecomp(); - - switch(currentScriptOpcodeType) - { - case 0: - { - sprintf(tempbuffer,"%s+%s",param1,param2); - pushDecomp(tempbuffer); - break; - } - case 1: - { - sprintf(tempbuffer,"%s/%s",param1,param2); - pushDecomp(tempbuffer); - break; - } - case 2: - { - sprintf(tempbuffer,"%s-%s",param1,param2); - pushDecomp(tempbuffer); - break; - } - case 3: - { - sprintf(tempbuffer,"%s*%s",param1,param2); - pushDecomp(tempbuffer); - break; - } - case 4: - { - sprintf(tempbuffer,"%s\%%s",param1,param2); - pushDecomp(tempbuffer); - break; - } - case 5: - case 7: - { - sprintf(tempbuffer,"%s|%s",param1,param2); - pushDecomp(tempbuffer); - break; - } - case 6: - { - sprintf(tempbuffer,"%s&%s",param1,param2); - pushDecomp(tempbuffer); - break; - } - +int decompMath(void) { + char *param1 = popDecomp(); + char *param2 = popDecomp(); + + switch (currentScriptOpcodeType) { + case 0: + { + sprintf(tempbuffer, "%s+%s", param1, param2); + pushDecomp(tempbuffer); + break; + } + case 1: + { + sprintf(tempbuffer, "%s/%s", param1, param2); + pushDecomp(tempbuffer); + break; + } + case 2: + { + sprintf(tempbuffer, "%s-%s", param1, param2); + pushDecomp(tempbuffer); + break; + } + case 3: + { + sprintf(tempbuffer, "%s*%s", param1, param2); + pushDecomp(tempbuffer); + break; + } + case 4: + { + sprintf(tempbuffer, "%s\%%s", param1, param2); + pushDecomp(tempbuffer); + break; + } + case 5: + case 7: + { + sprintf(tempbuffer, "%s|%s", param1, param2); + pushDecomp(tempbuffer); + break; + } + case 6: + { + sprintf(tempbuffer, "%s&%s", param1, param2); + pushDecomp(tempbuffer); + break; + } + default: { - sprintf(tempbuffer,"decompMath(%d,%s,%s)",currentScriptOpcodeType,param1,param2); - pushDecomp(tempbuffer); + sprintf(tempbuffer, "decompMath(%d,%s,%s)", + currentScriptOpcodeType, param1, param2); + pushDecomp(tempbuffer); break; } - } - return(0); + } + return (0); } -int decompBoolCompare(void) -{ - char* param1; - char* param2; +int decompBoolCompare(void) { + char *param1; + char *param2; - param1 = popDecomp(); - param2 = popDecomp(); + param1 = popDecomp(); + param2 = popDecomp(); - sprintf(tempbuffer,"compare(%s,%s)",param1,param2); - pushDecomp(tempbuffer); + sprintf(tempbuffer, "compare(%s,%s)", param1, param2); + pushDecomp(tempbuffer); - return 0; + return 0; } -int decompTest(void) -{ - unsigned long int oldOffset = currentDecompScriptPtr->var4; - short int offset = getShortFromDecompScriptReal(); - - switch(currentScriptOpcodeType) - { - case 0: - { - currentLineType = 1; - addDecomp("test '!(bitMask & 1)' and goto %d",offset+oldOffset); - break; - } - case 1: - { - currentLineType = 1; - addDecomp("test '(bitMask & 1)' and goto %d",offset+oldOffset); - break; - } - case 2: - { - currentLineType = 1; - addDecomp("test '(bitMask & 2)' and goto %d",offset+oldOffset); - break; - } - case 3: - { - currentLineType = 1; - addDecomp("test '(bitMask & 3)' and goto %d",offset+oldOffset); - break; - } - case 4: - { - currentLineType = 1; - addDecomp("test '(bitMask & 4)' and goto %d",offset+oldOffset); - break; - } - case 5: - { - currentLineType = 1; - addDecomp("test '(bitMask & 5)' and goto %d",offset+oldOffset); - break; - } - case 6: - { - currentLineType = 2; - addDecomp("test 'never' and goto %d",offset+oldOffset); - break; - } - case 7: - { - currentLineType = 3; - addDecomp("goto %d",offset+oldOffset); - break; - } - - } - - return 0; +int decompTest(void) { + unsigned long int oldOffset = currentDecompScriptPtr->var4; + short int offset = getShortFromDecompScriptReal(); + + switch (currentScriptOpcodeType) { + case 0: + { + currentLineType = 1; + addDecomp("test '!(bitMask & 1)' and goto %d", + offset + oldOffset); + break; + } + case 1: + { + currentLineType = 1; + addDecomp("test '(bitMask & 1)' and goto %d", + offset + oldOffset); + break; + } + case 2: + { + currentLineType = 1; + addDecomp("test '(bitMask & 2)' and goto %d", + offset + oldOffset); + break; + } + case 3: + { + currentLineType = 1; + addDecomp("test '(bitMask & 3)' and goto %d", + offset + oldOffset); + break; + } + case 4: + { + currentLineType = 1; + addDecomp("test '(bitMask & 4)' and goto %d", + offset + oldOffset); + break; + } + case 5: + { + currentLineType = 1; + addDecomp("test '(bitMask & 5)' and goto %d", + offset + oldOffset); + break; + } + case 6: + { + currentLineType = 2; + addDecomp("test 'never' and goto %d", + offset + oldOffset); + break; + } + case 7: + { + currentLineType = 3; + addDecomp("goto %d", offset + oldOffset); + break; + } + + } + + return 0; } -int decompCompare(void) -{ - char* param; +int decompCompare(void) { + char *param; - param = popDecomp(); + param = popDecomp(); - addDecomp("sign(%s)",param); + addDecomp("sign(%s)", param); /* if(!pop) @@ -734,816 +736,865 @@ int decompCompare(void) currentScriptPtr->bitMask = si; */ - return 0; + return 0; } +int decompSwapStack(void) { + char *stack1; + char *stack2; + char buffer1[4000]; + char buffer2[4000]; -int decompSwapStack(void) -{ - char* stack1; - char* stack2; - char buffer1[4000]; - char buffer2[4000]; - - stack1 = popDecomp(); - stack2 = popDecomp(); + stack1 = popDecomp(); + stack2 = popDecomp(); - strcpyuint8(buffer1,stack1); - strcpyuint8(buffer2,stack2); + strcpyuint8(buffer1, stack1); + strcpyuint8(buffer2, stack2); - pushDecomp(buffer1); - pushDecomp(buffer2); + pushDecomp(buffer1); + pushDecomp(buffer2); - return 0; + return 0; } -int decompFunction(void) -{ - currentScriptOpcodeType = getByteFromDecompScriptReal(); +int decompFunction(void) { + currentScriptOpcodeType = getByteFromDecompScriptReal(); // addDecomp("OP_%X", currentScriptOpcodeType); - switch(currentScriptOpcodeType) - { - case 0x1: - { - pushDecomp("_setMain5()"); - break; - } - case 0x2: - { - pushDecomp("_prepareFade()"); - break; - } - case 0x3: - { - sprintf(tempbuffer,"_loadBackground(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x4: - { - sprintf(tempbuffer,"_loadFullBundle(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x5: - { - sprintf(tempbuffer,"_addCell(%s,%s,%s)",popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x6: - { - unsigned long int numArg = atoi(popDecomp()); - char* ovlStr; - char* idxStr; - int i; - char functionName[100]; - - idxStr = popDecomp(); - ovlStr = popDecomp(); - - resolveVarName(ovlStr, 0x20, idxStr, functionName); - - sprintf(tempbuffer,"_startASync(%s",functionName); - - for(i=0;i<numArg;i++) - { - strcatuint8(tempbuffer,","); - strcatuint8(tempbuffer,popDecomp()); - } - - strcatuint8(tempbuffer,")"); - - pushDecomp(tempbuffer); - break; - } - case 0x7: - { - char* var1; - char* objIdxStr; - char* ovlStr; - char varName[256]; - int i; - - var1 = popDecomp(); - objIdxStr = popDecomp(); - ovlStr = popDecomp(); - - sprintf(tempbuffer,"_createObjectFromOvlData(ovl:%s,dataIdx:%s,%s)",ovlStr,objIdxStr,var1); - pushDecomp(tempbuffer); - break; - } - case 0x8: - { - sprintf(tempbuffer,"_removeObjectFromList(%s,%s,%s)",popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x9: - { - pushDecomp("_freeobjectList()"); - break; - } - case 0xA: - { - sprintf(tempbuffer,"_removeScript(ovl(%s),%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0xB: - { - sprintf(tempbuffer,"_resetFilesEntries(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0xC: - { - sprintf(tempbuffer,"_loadOverlay(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0xD: - { - sprintf(tempbuffer,"_palManipulation(%s,%s,%s,%s,%s)",popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0xE: - { - sprintf(tempbuffer,"_playSample(%s,%s,%s,%s)",popDecomp(),popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x10: - { - sprintf(tempbuffer,"_releaseScript2(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x11: - { - sprintf(tempbuffer,"_getOverlayIdx(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x13: - { - sprintf(tempbuffer,"_displayMessage(%s,\"%s\",%s,%s,%s,%s)",popDecomp(),resolveMessage(popDecomp()),popDecomp(),popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x14: - { - sprintf(tempbuffer,"_removeObject(ovl(%s),%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x15: - { - pushDecomp("_pauseScript()"); - break; - } - case 0x16: - { - sprintf(tempbuffer,"_Op_FreezeCell(%s,%s,%s,%s,%s,%s)",popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x17: - { - sprintf(tempbuffer,"_loadCtp(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x18: - { - sprintf(tempbuffer,"_Op_AddAnimation(%s,%s,%s,%s,%s,%s,%s)",popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x19: - { - sprintf(tempbuffer,"_Op_RemoveAnimation(%s,%s,%s)",popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x1A: - { - sprintf(tempbuffer,"_setupScaleFormula(%s,%s,%s,%s)",popDecomp(),popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x1E: - { - sprintf(tempbuffer,"_op_1E(%s,%s,%s,%s,%s,%s)",popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x21: - { - sprintf(tempbuffer,"_isActorLoaded(%s,%s,%s)",popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x22: - { - sprintf(tempbuffer,"_computeScale(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x23: - { - sprintf(tempbuffer,"_convertToScale(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x24: - { - sprintf(tempbuffer,"_op_24(%s,%s,%s,%s)",popDecomp(),popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x27: - { - sprintf(tempbuffer,"_getWalkBoxCollision(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x28: - { - sprintf(tempbuffer,"_changeSaveAllowedState(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x29: - { - pushDecomp("_freeAllPerso()"); - break; - } - case 0x2B: - { - sprintf(tempbuffer,"_getProcIdx(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x2C: - { - sprintf(tempbuffer,"_setObjectPosition(%s,%s,%s)",popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; + switch (currentScriptOpcodeType) { + case 0x1: + { + pushDecomp("_setMain5()"); + break; + } + case 0x2: + { + pushDecomp("_prepareFade()"); + break; + } + case 0x3: + { + sprintf(tempbuffer, "_loadBackground(%s,%s)", + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x4: + { + sprintf(tempbuffer, "_loadFullBundle(%s,%s)", + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x5: + { + sprintf(tempbuffer, "_addCell(%s,%s,%s)", popDecomp(), + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x6: + { + unsigned long int numArg = atoi(popDecomp()); + char *ovlStr; + char *idxStr; + int i; + char functionName[100]; + + idxStr = popDecomp(); + ovlStr = popDecomp(); + + resolveVarName(ovlStr, 0x20, idxStr, functionName); + + sprintf(tempbuffer, "_startASync(%s", functionName); + + for (i = 0; i < numArg; i++) { + strcatuint8(tempbuffer, ","); + strcatuint8(tempbuffer, popDecomp()); + } + + strcatuint8(tempbuffer, ")"); + + pushDecomp(tempbuffer); + break; + } + case 0x7: + { + char *var1; + char *objIdxStr; + char *ovlStr; + char varName[256]; + int i; + + var1 = popDecomp(); + objIdxStr = popDecomp(); + ovlStr = popDecomp(); + + sprintf(tempbuffer, + "_createObjectFromOvlData(ovl:%s,dataIdx:%s,%s)", + ovlStr, objIdxStr, var1); + pushDecomp(tempbuffer); + break; + } + case 0x8: + { + sprintf(tempbuffer, "_removeObjectFromList(%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x9: + { + pushDecomp("_freeobjectList()"); + break; + } + case 0xA: + { + sprintf(tempbuffer, "_removeScript(ovl(%s),%s)", + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0xB: + { + sprintf(tempbuffer, "_resetFilesEntries(%s,%s)", + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0xC: + { + sprintf(tempbuffer, "_loadOverlay(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0xD: + { + sprintf(tempbuffer, "_palManipulation(%s,%s,%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp(), popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0xE: + { + sprintf(tempbuffer, "_playSample(%s,%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x10: + { + sprintf(tempbuffer, "_releaseScript2(%s)", + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x11: + { + sprintf(tempbuffer, "_getOverlayIdx(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x13: + { + sprintf(tempbuffer, + "_displayMessage(%s,\"%s\",%s,%s,%s,%s)", + popDecomp(), resolveMessage(popDecomp()), + popDecomp(), popDecomp(), popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x14: + { + sprintf(tempbuffer, "_removeObject(ovl(%s),%s)", + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x15: + { + pushDecomp("_pauseScript()"); + break; + } + case 0x16: + { + sprintf(tempbuffer, + "_Op_FreezeCell(%s,%s,%s,%s,%s,%s)", popDecomp(), + popDecomp(), popDecomp(), popDecomp(), popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x17: + { + sprintf(tempbuffer, "_loadCtp(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x18: + { + sprintf(tempbuffer, + "_Op_AddAnimation(%s,%s,%s,%s,%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp(), popDecomp(), + popDecomp(), popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x19: + { + sprintf(tempbuffer, "_Op_RemoveAnimation(%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x1A: + { + sprintf(tempbuffer, "_setupScaleFormula(%s,%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x1E: + { + sprintf(tempbuffer, "_op_1E(%s,%s,%s,%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp(), popDecomp(), + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x21: + { + sprintf(tempbuffer, "_isActorLoaded(%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x22: + { + sprintf(tempbuffer, "_computeScale(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x23: + { + sprintf(tempbuffer, "_convertToScale(%s,%s)", + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x24: + { + sprintf(tempbuffer, "_op_24(%s,%s,%s,%s)", popDecomp(), + popDecomp(), popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x27: + { + sprintf(tempbuffer, "_getWalkBoxCollision(%s,%s)", + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x28: + { + sprintf(tempbuffer, "_changeSaveAllowedState(%s)", + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x29: + { + pushDecomp("_freeAllPerso()"); + break; + } + case 0x2B: + { + sprintf(tempbuffer, "_getProcIdx(%s,%s)", popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x2C: + { + sprintf(tempbuffer, "_setObjectPosition(%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x2E: + { + sprintf(tempbuffer, "_releaseScript(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x2F: + { + sprintf(tempbuffer, "_addBackgroundIncrust(%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x30: + { + sprintf(tempbuffer, "_removeBackgroundIncrust(%s,%s)", + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x31: + { + sprintf(tempbuffer, "_op_31(%s,%s)", popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x32: + { + pushDecomp("_freeBackgroundInscrustList()"); + break; + } + case 0x35: + { + sprintf(tempbuffer, "_op35(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x37: + { + sprintf(tempbuffer, "_op37(%s,%s)", popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x38: + { + sprintf(tempbuffer, "_removeBackground(%s)", + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x39: + { + sprintf(tempbuffer, "_SetActiveBackgroundPlane(%s)", + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x3A: + { + sprintf(tempbuffer, "_setVar49(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x3B: + { + pushDecomp("_op3B()"); + break; + } + case 0x3C: + { + sprintf(tempbuffer, "_rand(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x3D: + { + sprintf(tempbuffer, "_loadMusic(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x3E: + { + pushDecomp("_op_3E()"); + break; + } + case 0x3F: + { + pushDecomp("_op_3F()"); + break; + } + case 0x40: + { + pushDecomp("_op_40()"); + break; + } + case 0x41: + { + sprintf(tempbuffer, "_isFileLoaded2(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x45: + { + pushDecomp("_stopSound()"); + break; + } + case 0x49: + { + sprintf(tempbuffer, "_op49(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x54: + { + sprintf(tempbuffer, "_setFontVar(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x56: + { + sprintf(tempbuffer, "_changeCutSceneState(%s)", + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x57: + { + pushDecomp("_getMouseX()"); + break; + } + case 0x58: + { + pushDecomp("_getMouseY()"); + break; + } + case 0x59: + { + pushDecomp("_getMouse3()"); + break; + } + case 0x5A: + { + sprintf(tempbuffer, "_isFileLoaded(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x5B: + { + pushDecomp("_regenerateBackgroundIncrust()"); + break; + } + case 0x5C: + { + sprintf(tempbuffer, "_Op_AddCellC(%s,%s)", popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x5E: + { + sprintf(tempbuffer, "_Op_AddCellE(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x60: + { + sprintf(tempbuffer, "_op_60(%s,%s,%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp(), popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x61: + { + sprintf(tempbuffer, "_op61(%s,%s)", popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x62: + { + pushDecomp("_pauseCallingScript()"); + break; + } + case 0x63: + { + pushDecomp("_resumeScript()"); + break; + } + case 0x64: + { + unsigned long int numArg = atoi(popDecomp()); + char *ovlStr; + char *idxStr; + int i; + char functionName[256]; + + idxStr = popDecomp(); + ovlStr = popDecomp(); + + resolveVarName(ovlStr, 0x20, idxStr, functionName); + + sprintf(tempbuffer, "%s(", functionName); + + for (i = 0; i < numArg; i++) { + if (i) + strcatuint8(tempbuffer, ","); + strcatuint8(tempbuffer, popDecomp()); + } + + strcatuint8(tempbuffer, ")"); + + pushDecomp(tempbuffer); + break; + } + case 0x65: + { + sprintf(tempbuffer, + "_addWaitObject(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp(), popDecomp(), + popDecomp(), popDecomp(), popDecomp(), popDecomp(), + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x66: + { + sprintf(tempbuffer, "_op_66(%s,%s)", popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x67: + { + sprintf(tempbuffer, "_loadAudioResource(%s,%s)", + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x68: + { + pushDecomp("_freeMediumVar()"); + break; + } + case 0x6A: + { + sprintf(tempbuffer, "_op_6A(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x6B: + { + sprintf(tempbuffer, "_loadData(%s,%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x6C: + { + sprintf(tempbuffer, "_op_6C(%s,%s)", popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x6D: + { + sprintf(tempbuffer, "_strcpy(%s,%s)", popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x6E: + { + sprintf(tempbuffer, "_op_6E(%s,%s)", popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x6F: + { + unsigned long int numArg = atoi(popDecomp()); + char *ovlStr; + char *idxStr; + int i; + + idxStr = popDecomp(); + ovlStr = popDecomp(); + + sprintf(tempbuffer, "_op_6F(%s,%s", idxStr, ovlStr); + + for (i = 0; i < numArg; i++) { + strcatuint8(tempbuffer, ","); + strcatuint8(tempbuffer, popDecomp()); } - case 0x2E: - { - sprintf(tempbuffer,"_releaseScript(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x2F: - { - sprintf(tempbuffer,"_addBackgroundIncrust(%s,%s,%s)",popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x30: - { - sprintf(tempbuffer,"_removeBackgroundIncrust(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x31: - { - sprintf(tempbuffer,"_op_31(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x32: - { - pushDecomp("_freeBackgroundInscrustList()"); - break; - } - case 0x35: - { - sprintf(tempbuffer,"_op35(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x37: - { - sprintf(tempbuffer,"_op37(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x38: - { - sprintf(tempbuffer,"_removeBackground(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x39: - { - sprintf(tempbuffer,"_SetActiveBackgroundPlane(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x3A: - { - sprintf(tempbuffer,"_setVar49(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x3B: - { - pushDecomp("_op3B()"); - break; - } - case 0x3C: - { - sprintf(tempbuffer,"_rand(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x3D: - { - sprintf(tempbuffer,"_loadMusic(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x3E: - { - pushDecomp("_op_3E()"); - break; - } - case 0x3F: - { - pushDecomp("_op_3F()"); - break; - } - case 0x40: - { - pushDecomp("_op_40()"); - break; - } - case 0x41: - { - sprintf(tempbuffer,"_isFileLoaded2(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x45: - { - pushDecomp("_stopSound()"); - break; - } - case 0x49: - { - sprintf(tempbuffer,"_op49(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x54: - { - sprintf(tempbuffer,"_setFontVar(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x56: - { - sprintf(tempbuffer,"_changeCutSceneState(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x57: - { - pushDecomp("_getMouseX()"); - break; - } - case 0x58: - { - pushDecomp("_getMouseY()"); - break; - } - case 0x59: - { - pushDecomp("_getMouse3()"); - break; - } - case 0x5A: - { - sprintf(tempbuffer,"_isFileLoaded(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x5B: - { - pushDecomp("_regenerateBackgroundIncrust()"); - break; - } - case 0x5C: - { - sprintf(tempbuffer,"_Op_AddCellC(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x5E: - { - sprintf(tempbuffer,"_Op_AddCellE(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x60: - { - sprintf(tempbuffer,"_op_60(%s,%s,%s,%s,%s)",popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x61: - { - sprintf(tempbuffer,"_op61(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x62: - { - pushDecomp("_pauseCallingScript()"); - break; - } - case 0x63: - { - pushDecomp("_resumeScript()"); - break; - } - case 0x64: - { - unsigned long int numArg = atoi(popDecomp()); - char* ovlStr; - char* idxStr; - int i; - char functionName[256]; - - idxStr = popDecomp(); - ovlStr = popDecomp(); - - resolveVarName(ovlStr, 0x20, idxStr, functionName); - - sprintf(tempbuffer,"%s(",functionName); - - for(i=0;i<numArg;i++) - { - if(i) - strcatuint8(tempbuffer,","); - strcatuint8(tempbuffer,popDecomp()); - } - - strcatuint8(tempbuffer,")"); - - pushDecomp(tempbuffer); - break; - } - case 0x65: - { - sprintf(tempbuffer,"_addWaitObject(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)",popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x66: - { - sprintf(tempbuffer,"_op_66(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x67: - { - sprintf(tempbuffer,"_loadAudioResource(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x68: - { - pushDecomp("_freeMediumVar()"); - break; - } - case 0x6A: - { - sprintf(tempbuffer,"_op_6A(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x6B: - { - sprintf(tempbuffer,"_loadData(%s,%s,%s,%s)",popDecomp(),popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x6C: - { - sprintf(tempbuffer,"_op_6C(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x6D: - { - sprintf(tempbuffer,"_strcpy(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x6E: - { - sprintf(tempbuffer,"_op_6E(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x6F: - { - unsigned long int numArg = atoi(popDecomp()); - char* ovlStr; - char* idxStr; - int i; - - idxStr = popDecomp(); - ovlStr = popDecomp(); - - sprintf(tempbuffer,"_op_6F(%s,%s",idxStr,ovlStr); - - for(i=0;i<numArg;i++) - { - strcatuint8(tempbuffer,","); - strcatuint8(tempbuffer,popDecomp()); - } - - strcatuint8(tempbuffer,")"); - - pushDecomp(tempbuffer); - break; - } - case 0x70: - { - sprintf(tempbuffer,"_comment(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x71: - { - sprintf(tempbuffer,"_op71(%s,%s,%s,%s,%s)",popDecomp(),popDecomp(),popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x72: - { - sprintf(tempbuffer,"_op72(%s,%s)",popDecomp(),popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x73: - { - sprintf(tempbuffer,"_op73(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x74: - { - sprintf(tempbuffer,"_getInitVar1()"); - pushDecomp(tempbuffer); - break; - } - case 0x76: - { - sprintf(tempbuffer,"_Op_InitializeState6(%s,%s)",popDecomp(),popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x77: - { - sprintf(tempbuffer,"_Op_InitializeState7(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x78: - { - sprintf(tempbuffer,"_Op_InitializeState8(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x79: - { - sprintf(tempbuffer,"_EnterPlayerMenu(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x7B: - { - sprintf(tempbuffer,"_Op_InitializeStateB(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x7C: - { - sprintf(tempbuffer,"_Op_InitializeStateC(%s)",popDecomp()); - pushDecomp(tempbuffer); - break; - } - case 0x7D: - { - pushDecomp("_freeAllMenu()"); - break; - } + + strcatuint8(tempbuffer, ")"); + + pushDecomp(tempbuffer); + break; + } + case 0x70: + { + sprintf(tempbuffer, "_comment(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x71: + { + sprintf(tempbuffer, "_op71(%s,%s,%s,%s,%s)", + popDecomp(), popDecomp(), popDecomp(), popDecomp(), + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x72: + { + sprintf(tempbuffer, "_op72(%s,%s)", popDecomp(), + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x73: + { + sprintf(tempbuffer, "_op73(%s)", popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x74: + { + sprintf(tempbuffer, "_getInitVar1()"); + pushDecomp(tempbuffer); + break; + } + case 0x76: + { + sprintf(tempbuffer, "_Op_InitializeState6(%s,%s)", + popDecomp(), popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x77: + { + sprintf(tempbuffer, "_Op_InitializeState7(%s)", + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x78: + { + sprintf(tempbuffer, "_Op_InitializeState8(%s)", + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x79: + { + sprintf(tempbuffer, "_EnterPlayerMenu(%s)", + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x7B: + { + sprintf(tempbuffer, "_Op_InitializeStateB(%s)", + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x7C: + { + sprintf(tempbuffer, "_Op_InitializeStateC(%s)", + popDecomp()); + pushDecomp(tempbuffer); + break; + } + case 0x7D: + { + pushDecomp("_freeAllMenu()"); + break; + } default: { addDecomp("OP_%X", currentScriptOpcodeType); - printf("OPCODE: %X\n",currentScriptOpcodeType); - failed = 1; + printf("OPCODE: %X\n", currentScriptOpcodeType); + failed = 1; break; } - } - + } + // pushDecomp("functionDummyPush"); - return(0); + return (0); } uint8 stop = 0; -int decompStop(void) -{ - stop = 1; - addDecomp("stop\n"); - return 0; +int decompStop(void) { + stop = 1; + addDecomp("stop\n"); + return 0; } -int decompBreak(void) -{ - addDecomp("break"); - return 0; +int decompBreak(void) { + addDecomp("break"); + return 0; } -void generateIndentation(void) -{ - int i; +void generateIndentation(void) { + int i; - for(i=0;i<positionInDecompileLineTable;i++) - { - if(decompileLineTable[i].type != 0) - { - char* gotoStatement; - int destLine; - int destLineIdx; - - gotoStatement = strstr(decompileLineTable[i].line,"goto"); - assert(gotoStatement); - gotoStatement = strchr(gotoStatement,' ')+1; - - destLine = atoi(gotoStatement); - - { - int j; - - destLineIdx = -1; - - for(j=0;j<positionInDecompileLineTable;j++) - { - if(decompileLineTable[j].lineOffset == destLine) - { - destLineIdx = j; - break; - } - } - - assert(destLineIdx != -1); - - if(destLineIdx>i) - { - int j; - - for(j=i+1;j<destLineIdx;j++) - { - decompileLineTable[j].indent++; - } - - if(strstr(decompileLineTable[destLineIdx-1].line,"goto") == decompileLineTable[destLineIdx-1].line) - { - //decompileLineTable[destLineIdx-1].pendingElse = 1; - } - } - } - } - } + for (i = 0; i < positionInDecompileLineTable; i++) { + if (decompileLineTable[i].type != 0) { + char *gotoStatement; + int destLine; + int destLineIdx; + + gotoStatement = + strstr(decompileLineTable[i].line, "goto"); + assert(gotoStatement); + gotoStatement = strchr(gotoStatement, ' ') + 1; + + destLine = atoi(gotoStatement); + + { + int j; + + destLineIdx = -1; + + for (j = 0; j < positionInDecompileLineTable; + j++) { + if (decompileLineTable[j].lineOffset == + destLine) { + destLineIdx = j; + break; + } + } + + assert(destLineIdx != -1); + + if (destLineIdx > i) { + int j; + + for (j = i + 1; j < destLineIdx; j++) { + decompileLineTable[j].indent++; + } + + if (strstr(decompileLineTable + [destLineIdx - 1].line, + "goto") == + decompileLineTable[destLineIdx - + 1].line) { + //decompileLineTable[destLineIdx-1].pendingElse = 1; + } + } + } + } + } } -void dumpScript(uint8* ovlName, ovlDataStruct* ovlData,int idx) -{ +void dumpScript(uint8 *ovlName, ovlDataStruct *ovlData, int idx) { uint8 opcodeType; char buffer[256]; int i; - + char temp[256]; char scriptName[256]; - sprintf(temp,"%d",idx); + sprintf(temp, "%d", idx); - failed = 0; - - currentScript = &ovlData->data3Table[idx]; + failed = 0; - currentDecompScript = currentScript->dataPtr; - currentDecompScriptPtr->var4 = 0; + currentScript = &ovlData->data3Table[idx]; - currentDecompOvl = ovlData; - currentDecompScriptIdx = idx; + currentDecompScript = currentScript->dataPtr; + currentDecompScriptPtr->var4 = 0; - currentLineIdx = 0; - positionInDecompileLineTable = 0; - currentLineType = 0; + currentDecompOvl = ovlData; + currentDecompScriptIdx = idx; - resolveVarName("0",0x20,temp, scriptName); + currentLineIdx = 0; + positionInDecompileLineTable = 0; + currentLineType = 0; - printf("decompiling script %d - %s\n",idx,scriptName); + resolveVarName("0", 0x20, temp, scriptName); - // return; + printf("decompiling script %d - %s\n", idx, scriptName); -// scriptDataPtrTable[1] = *(char**)(ptr+0x6); - scriptDataPtrTable[2] = getDataFromData3(currentScript, 1); // strings - scriptDataPtrTable[5] = ovlData->data4Ptr; // free strings + // return; + +// scriptDataPtrTable[1] = *(char**)(ptr+0x6); + scriptDataPtrTable[2] = getDataFromData3(currentScript, 1); // strings + scriptDataPtrTable[5] = ovlData->data4Ptr; // free strings scriptDataPtrTable[6] = ovlData->ptr8; - stop = 0; + stop = 0; - sprintf(buffer,"%s-%02d-%s.txt",ovlName,idx,scriptName); - fHandle = fopen(buffer,"w+"); + sprintf(buffer, "%s-%02d-%s.txt", ovlName, idx, scriptName); + fHandle = fopen(buffer, "w+"); - decompileStackPosition = 0; + decompileStackPosition = 0; - for(i=0;i<64;i++) - { + for (i = 0; i < 64; i++) { decompOpcodeTypeTable[i] = NULL; } - decompOpcodeTypeTable[1] = decompLoadVar; - decompOpcodeTypeTable[2] = decompSaveVar; - decompOpcodeTypeTable[3] = decompOpcodeType2; - decompOpcodeTypeTable[4] = decompMath; - decompOpcodeTypeTable[5] = decompBoolCompare; - decompOpcodeTypeTable[6] = decompTest; - decompOpcodeTypeTable[7] = decompCompare; - decompOpcodeTypeTable[8] = decompSwapStack; - decompOpcodeTypeTable[9] = decompFunction; - decompOpcodeTypeTable[10] = decompStop; - decompOpcodeTypeTable[12] = decompBreak; - - do - { - currentOffset = currentDecompScriptPtr->var4; + decompOpcodeTypeTable[1] = decompLoadVar; + decompOpcodeTypeTable[2] = decompSaveVar; + decompOpcodeTypeTable[3] = decompOpcodeType2; + decompOpcodeTypeTable[4] = decompMath; + decompOpcodeTypeTable[5] = decompBoolCompare; + decompOpcodeTypeTable[6] = decompTest; + decompOpcodeTypeTable[7] = decompCompare; + decompOpcodeTypeTable[8] = decompSwapStack; + decompOpcodeTypeTable[9] = decompFunction; + decompOpcodeTypeTable[10] = decompStop; + decompOpcodeTypeTable[12] = decompBreak; + + do { + currentOffset = currentDecompScriptPtr->var4; opcodeType = getByteFromDecompScriptReal(); currentScriptOpcodeType = opcodeType & 7; - if(!decompOpcodeTypeTable[(opcodeType&0xFB)>>3]) - { - printf("Unsupported opcode type %d in decomp\n",(opcodeType&0xFB)>>3); + if (!decompOpcodeTypeTable[(opcodeType & 0xFB) >> 3]) { + printf("Unsupported opcode type %d in decomp\n", + (opcodeType & 0xFB) >> 3); return; } - - //printf("Optype: %d\n",(opcodeType&0xFB)>>3); + //printf("Optype: %d\n",(opcodeType&0xFB)>>3); - decompOpcodeTypeTable[(opcodeType&0xFB)>>3](); + decompOpcodeTypeTable[(opcodeType & 0xFB) >> 3] (); - if(failed) - { + if (failed) { printf("Aborting decompilation..\n"); fclose(fHandle); return; } - }while(!stop); + } while (!stop); - dumpIdx++; + dumpIdx++; - generateIndentation(); + generateIndentation(); - for(i=0;i<positionInDecompileLineTable;i++) - { - int j; - - if(decompileLineTable[i].pendingElse) - { - fprintf(fHandle,"%05d:\t", decompileLineTable[i].lineOffset); - fprintf(fHandle,"else", decompileLineTable[i].line); - fprintf(fHandle,"\n"); - } - - fprintf(fHandle,"%05d:\t", decompileLineTable[i].lineOffset); - for(j=0;j<decompileLineTable[i].indent;j++) - { - fprintf(fHandle,"\t"); - } - fprintf(fHandle,"%s", decompileLineTable[i].line); - fprintf(fHandle,"\n"); - } + for (i = 0; i < positionInDecompileLineTable; i++) { + int j; + + if (decompileLineTable[i].pendingElse) { + fprintf(fHandle, "%05d:\t", + decompileLineTable[i].lineOffset); + fprintf(fHandle, "else", decompileLineTable[i].line); + fprintf(fHandle, "\n"); + } - fclose(fHandle); + fprintf(fHandle, "%05d:\t", decompileLineTable[i].lineOffset); + for (j = 0; j < decompileLineTable[i].indent; j++) { + fprintf(fHandle, "\t"); + } + fprintf(fHandle, "%s", decompileLineTable[i].line); + fprintf(fHandle, "\n"); + } + + fclose(fHandle); } #endif } // End of namespace Cruise - |