LONG CED6AsDecompiler::DumpToFile(ED6_ACTION_SCRIPT_INFO *pAsInfo, LPWSTR pszAsFile, LPWSTR pszOutput) { LONG Status; CHAR Buffer[0x400]; CFileDisk file; Status = CreateDefinition(pszAsFile, Buffer); AS_IF_FAIL_RETURN(Status); Status = ASDECL_ERROR_UNKNOWN; LOOP_ONCE { if (!file.Create(pszOutput)) AS_BREAK(Status, ASDECL_ERROR_CREATE_FILE); _wsetlocale(LC_CTYPE, L""); WriteScr( "@_FILE \"debug_%S\"\n" "@_INCLUDE \"%s\"\n" "\n", findnamew(pszAsFile), NAME_DEFINITION_FILE); WriteScr( "@%s %d\n" "\n", NAME_HEADER_UNKNOWN, pAsInfo->Unknown); WriteScr( "(%s:s)\n" "(%s:s)\n" "(%s:s)\n" "\n", LABEL_CRAFT_OFFSET_TABLE, LABEL_CRAFT_OFFSET_TABLE_END, NAME_HEADER_UNKNOWN); WriteScr("; Char chip pattern info CH_Index, CH_DAT_Index, CP_Index, CP_DAT_Index\n"); CHAR_CHIP_PATTERN_INFO *pChipPtn = pAsInfo->pChrChipPtnInfo; for (ULONG Index = 0, Count = pAsInfo->ChrChipPtnCount; Count; ++Index, --Count) { WriteScr( " (0x%04X:s, 0x%04X:s, 0x%04X:s, 0x%04X:s)", pChipPtn->CHIndex, pChipPtn->CHDatIndex, pChipPtn->CPIndex, pChipPtn->CPDatIndex); ++pChipPtn; if (Index & 1) WriteScr("\n"); } WriteScr("\n[FF FF FF FF]\n\n"); WriteScr("; 3d model file\n"); for (LPSTR pszX3FileName = pAsInfo->pszXFileName; ; ) { LPSTR pString; ULONG Length; Length = StrLengthA(pszX3FileName) + 1; pString = *pszX3FileName == 0 ? NULL : AllocString(pszX3FileName, Length); WriteScr("\"%s\"\n", pString == NULL ? pszX3FileName : pString); FreeString(pString); if (*pszX3FileName == 0) { if (pszX3FileName != pAsInfo->pszXFileName) WriteScr("[%02X %02X]\n", pszX3FileName[1], pszX3FileName[2]); break; } pszX3FileName += Length; } WriteScr("\n#%s\n", LABEL_CRAFT_OFFSET_TABLE); ED6_AS_CRAFT_INFO *pCraft; ED6_INSTRUCTION *pInstruction; pCraft = pAsInfo->pCraftInfo; for (ULONG Index = 0, Count = pAsInfo->CraftCount; Count; ++pCraft, ++Index, --Count) { ULONG TrueIndex; if (pCraft->Offset == ED6_INVALID_OFFSET) { PBYTE p = (PBYTE)&pCraft->Offset; WriteScr("[%02X", *p++); for (ULONG Len = sizeof(ED6_INVALID_OFFSET) - 1; Len; --Len) WriteScr(" %02X", *p++); WriteScr("]\n"); continue; } pInstruction = UnlinkInstruction(pCraft->pInstruction); if (pInstruction == NULL) continue; TrueIndex = Index; for (ULONG i = 0; i != Index; ++i) { if (pInstruction->Offset == pAsInfo->pCraftInfo[i].Offset) { TrueIndex = i; break; } } GetCraftName(pAsInfo, TrueIndex, Buffer); WriteScr(" (%s:s)", Buffer); if (Index >=countof(g_szIntrinsicCraft) && (Index + 1 - countof(g_szIntrinsicCraft)) % 5 != 0) continue; WriteScr("\n"); } WriteScr("\n#%s\n\n", LABEL_CRAFT_OFFSET_TABLE_END); PBYTE pbFlags = pAsInfo->pbAsBuffer + pAsInfo->CraftOffsetTableEndOffset; WriteScr( "[%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X]\n\n", pbFlags[0], pbFlags[1], pbFlags[2], pbFlags[3], pbFlags[4], pbFlags[5], pbFlags[6], pbFlags[7], pbFlags[8], pbFlags[9], pbFlags[10], pbFlags[11], pbFlags[12], pbFlags[13], pbFlags[14], pbFlags[15], pbFlags[16]); Status = DumpCrafts(pAsInfo, file, Buffer); AS_IF_FAIL_BREAK(Status); Status = DumpFunctions(pAsInfo, file, Buffer); } return Status; }
void DumpIPTrans() { SYMBOL *Sym; SYMBOL *LastSLDSym = NULL; FILE *SldFile = 0; int line, file; uint n; int MustConvertPaths = 0; Sym = SymTab; n = SYMMAX; SldFile = fopen(SldName, "w"); if (!SldFile) { printf("Failed to create source line file'\n"); return; } fprintf(SldFile, "Files\n"); do { if (Sym->Section == section_SLD_File) { char *SymName = Sym->Name; size_t i, j = 0, len; char temp[256]; if(!MustConvertPaths) { if(LastSLDSym && LastSLDSym->Type > Sym->Type) MustConvertPaths = 1; LastSLDSym = Sym; } if(MustConvertPaths) { char *ParentPath = GetFileIdString(Sym->Type); GetRelPath(ParentPath); len = strlen(Sym->Name); #define IS_SLASH(c) ((c)=='/' || (c)=='\\') if((len>2 && Sym->Name[1]==':' && IS_SLASH(Sym->Name[2])) || (len>0 && IS_SLASH(Sym->Name[0]))) { } else { SymName = AddRelPrefix(Sym->Name); } } len = strlen(SymName); // filter out bad slashes... for(i = 0; i < len; i++) { if(IS_SLASH(SymName[i])) { if(i+1<len-1 && IS_SLASH(SymName[i+1])) { i++; } temp[j++] = '/'; } else temp[j++] = SymName[i]; } temp[j] = 0; fprintf(SldFile, "%d:%d:%s\n", Sym->Value, Sym->Type, temp); } Sym++; } while(--n); fprintf(SldFile, "SLD\n"); if (!SLD_Line_Array.array) return; for (n=SLD_Line_Array.lo; n<SLD_Line_Array.hi+1; n++) { line = ArrayGet(&SLD_Line_Array, n); file= ArrayGet(&SLD_File_Array, n); if (line) { fprintf(SldFile, "%x:%d:%d\n", n, line, file); } } DumpFunctions(SldFile); DumpVariables(SldFile); //DumpAllSyms(SldFile); Dump_MasterIP_Trans(SldFile); fprintf(SldFile, "END\n"); fclose(SldFile); return; }