public static void Decompile() { var fIcons = new Text(Path.Combine(Common.InputPath, "map_icons.txt")); var fSource = new Win32FileWriter(Path.Combine(Common.OutputPath, "module_map_icons.py")); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Icons); fIcons.GetString(); int iMapIcons = fIcons.GetInt(); for (int iMIcon = 0; iMIcon < iMapIcons; iMIcon++) { var strName = fIcons.GetWord(); fSource.Write(" (\"{0}\",", strName); DWORD dwFlags = fIcons.GetDWord(); fSource.Write(" {0},", dwFlags == 1 ? "mcn_no_shadow" : "0"); var strMeshName = fIcons.GetWord(); fSource.Write(" \"{0}\",", strMeshName); var dScale = fIcons.GetDouble(); int iSound = fIcons.GetInt(); double dX = fIcons.GetDouble(), dY = fIcons.GetDouble(), dZ = fIcons.GetDouble(); fSource.Write(" {0}, {1}, {2}, {3}, {4}", dScale.ToString(CultureInfo.GetCultureInfo("en-US")), iSound != 0 ? iSound < Common.Sounds.Count ? "snd_" + Common.Sounds[iSound] : iSound.ToString(CultureInfo.GetCultureInfo("en-US")) : "0", dX.ToString(CultureInfo.GetCultureInfo("en-US")), dY.ToString(CultureInfo.GetCultureInfo("en-US")), dZ.ToString(CultureInfo.GetCultureInfo("en-US"))); int iTriggers = fIcons.GetInt(); if (iTriggers > 0) { fSource.Write(",\r\n [\r\n"); for (int t = 0; t < iTriggers; t++) { double dInterval = fIcons.GetDouble(); fSource.WriteLine(" ({0},[", Common.GetTriggerParam(dInterval)); int iRecords = fIcons.GetInt(); Common.PrintStatement(ref fIcons, ref fSource, iRecords, " "); fSource.WriteLine(" ]),"); } fSource.Write(" ]"); } fSource.WriteLine("),"); } fSource.Write("]"); fSource.Close(); fIcons.Close(); Common.GenerateId("ID_map_icons.py", Common.MapIcons, "icon"); }
public static void Decompile() { var fActions = new Text(Path.Combine(Common.InputPath, "actions.txt")); var fSource = new Win32FileWriter(Path.Combine(Common.OutputPath, "module_animations.py")); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Animations); var iActions = fActions.GetInt(); for (int a = 0; a < iActions; a++) { var strAnimId = fActions.GetWord(); var dwAnimFlags = fActions.GetDWord(); var dwMasterAnimFlags = fActions.GetDWord(); fSource.WriteLine(" [\"{0}\", {1}, {2},", strAnimId, DecompileFlags(dwAnimFlags), DecompileMasterFlags(dwMasterAnimFlags)); var iAnimSequences = fActions.GetInt(); for (int s = 0; s < iAnimSequences; s++) { var dDuration = fActions.GetDouble(); var strName = fActions.GetWord(); fSource.Write(" [{0}, \"{1}\",", dDuration.ToString(CultureInfo.GetCultureInfo("en-US")), strName); int iBeginFrame = fActions.GetInt(), iEndingFrame = fActions.GetInt(); var dwSequenceFlags = fActions.GetDWord(); var dd = new string[5]; //NOTE: Type string for non-english version of windows var bZeroes = true; for (int d = 0; d < 5; d++) { dd[d] = fActions.GetDouble().ToString(CultureInfo.GetCultureInfo("en-US")); if (dd[d] != "0") { bZeroes = false; } } if (bZeroes) { fSource.Write(" {0}, {1}, {2}],\r\n", iBeginFrame, iEndingFrame, DecompileSequenceFlags(dwSequenceFlags)); } else { fSource.Write(" {0}, {1}, {2}, {3}, ({4}, {5}, {6}), {7}],\r\n", iBeginFrame, iEndingFrame, DecompileSequenceFlags(dwSequenceFlags), DecompilePack((DWORD)Convert.ToDouble(dd[0], CultureInfo.GetCultureInfo("en-US"))), dd[1], dd[2], dd[3], dd[4]); } } fSource.WriteLine(" ],"); } fSource.Write("]"); fSource.Close(); fActions.Close(); Common.GenerateId("ID_animations.py", Common.Animations, "anim"); }
public static void Decompile() { var fSkyboxes = new Text(Common.InputPath + "/skyboxes.txt"); var fSource = new Win32FileWriter(Common.OutputPath + "/module_skyboxes.py"); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Skyboxes); int iSkyboxes = fSkyboxes.GetInt(); for (int i = 0; i < iSkyboxes; i++) { string strID = fSkyboxes.GetWord(); DWORD dwFlags = fSkyboxes.GetDWord(); fSource.Write(" (\"{0}\", {1},", strID, DecompileFlags(dwFlags)); for (int j = 0; j < 3; j++) { fSource.Write(" {0},", fSkyboxes.GetDouble().ToString(CultureInfo.GetCultureInfo("en-US"))); } fSource.Write(" \"{0}\",", fSkyboxes.GetWord()); for (int j = 0; j < 3; j++) { fSource.Write(" ({0}, {1}, {2}),", fSkyboxes.GetDouble().ToString(CultureInfo.GetCultureInfo("en-US")), fSkyboxes.GetDouble().ToString(CultureInfo.GetCultureInfo("en-US")), fSkyboxes.GetDouble().ToString(CultureInfo.GetCultureInfo("en-US"))); } fSource.WriteLine(" ({0}, 0x{1:X8})),", fSkyboxes.GetDouble().ToString(CultureInfo.GetCultureInfo("en-US")), fSkyboxes.GetDWord()); } fSource.Write(@"] def save_skyboxes(): file = open(export_dir + ""Data/skyboxes.txt"",""w"") file.write(""d\n""%len(skyboxes)) for skybox in skyboxes: file.write(""%s %d %f %f %f %s\n""%(skybox[0],skybox[1],skybox[2],skybox[3],skybox[4],skybox[5])) file.write("" %f %f %f ""%skybox[6]) file.write("" %f %f %f ""%skybox[7]) file.write("" %f %f %f ""%skybox[8]) file.write("" %f %d\n""%skybox[9]) file.close() print ""Exporting skyboxes..."" save_skyboxes()"); fSource.Close(); fSkyboxes.Close(); }
public static void Decompile() { var fTriggers = new Text(Path.Combine(Common.InputPath, "simple_triggers.txt")); var fSource = new Win32FileWriter(Path.Combine(Common.OutputPath, "module_simple_triggers.py")); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.SimpleTriggers); fTriggers.GetString(); int iSimpleTriggers = fTriggers.GetInt(); for (int t = 0; t < iSimpleTriggers; t++) { fSource.Write(" ({0},\r\n [", Common.GetTriggerParam(fTriggers.GetDouble())); int iRecords = fTriggers.GetInt(); if (iRecords != 0) { fSource.WriteLine(); Common.PrintStatement(ref fTriggers, ref fSource, iRecords, " "); fSource.Write(" "); } fSource.Write("]),\r\n\r\n"); } fSource.Write("]"); fSource.Close(); fTriggers.Close(); }
public static string[] Initialize() { var fID = new Text(Common.InputPath + "/factions.txt"); fID.GetString(); int n = Convert.ToInt32(fID.GetString()); var aFactions = new string[n]; for (int i = 0; i < n; i++) { string strFacID = fID.GetWord(); if (strFacID == "0") { strFacID = fID.GetWord(); } aFactions[i] = strFacID.Remove(0, 4); fID.GetWord(); fID.GetWord(); fID.GetWord(); for (int r = 0; r < n; r++) { fID.GetDouble(); } } fID.Close(); return(aFactions); }
public static string[] Initialize() { if (!File.Exists(Path.Combine(Common.InputPath, "factions.txt"))) { return(Array.Empty <string>()); } var fId = new Text(Path.Combine(Common.InputPath, "factions.txt")); fId.GetString(); var n = Convert.ToInt32(fId.GetString(), CultureInfo.GetCultureInfo("en-US")); var aFactions = new string[n]; for (int i = 0; i < n; i++) { var strFacId = fId.GetWord(); if (strFacId == "0") { strFacId = fId.GetWord(); } aFactions[i] = strFacId.Remove(0, 4); fId.GetWord(); fId.GetWord(); fId.GetWord(); for (int r = 0; r < n; r++) { fId.GetDouble(); } } fId.Close(); return(aFactions); }
public static void Decompile() { var fPostfx = new Text(Path.Combine(Common.InputPath, "postfx.txt")); var fSource = new Win32FileWriter(Path.Combine(Common.OutputPath, "module_postfx.py")); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Postfx); fPostfx.GetString(); int iPostFXs = fPostfx.GetInt(); var postfxList = new string[iPostFXs]; for (int i = 0; i < iPostFXs; i++) { postfxList[i] = fPostfx.GetWord().Remove(0, 4); fSource.Write(" (\"{0}\"", postfxList[i]); var dwFlag = fPostfx.GetDWord(); if (dwFlag == 1) { fSource.Write(", fxf_highhdr"); } else { fSource.Write(", {0}", dwFlag); } var iOpType = fPostfx.GetInt(); fSource.Write(", {0},", iOpType); for (int p = 0; p < 3; p++) { double d1 = fPostfx.GetDouble(), d2 = fPostfx.GetDouble(), d3 = fPostfx.GetDouble(), d4 = fPostfx.GetDouble(); fSource.Write(" [{0}, {1}, {2}, {3}]{4}", d1.ToString(CultureInfo.GetCultureInfo("en-US")), d2.ToString(CultureInfo.GetCultureInfo("en-US")), d3.ToString(CultureInfo.GetCultureInfo("en-US")), d4.ToString(CultureInfo.GetCultureInfo("en-US")), p < 2 ? "," : ""); } fSource.WriteLine("),"); } fSource.Write("]"); fSource.Close(); fPostfx.Close(); Common.GenerateId("ID_postfx_params.py", postfxList, "pfx"); }
public static void Decompile() { var fPresentations = new Text(Common.InputPath + "/presentations.txt"); var fSource = new Win32FileWriter(Common.OutputPath + "/module_presentations.py"); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Presentations); fPresentations.GetString(); int iPresentations = fPresentations.GetInt(); for (int i = 0; i < iPresentations; i++) { fSource.Write(" (\"{0}\"", fPresentations.GetWord().Remove(0, 6)); int iFlag = fPresentations.GetInt(); fSource.Write(", {0}", DecompileFlags(iFlag)); int iMesh = fPresentations.GetInt(); if (iMesh >= 0 && iMesh < Common.Meshes.Length) { fSource.Write(", mesh_{0}", Common.Meshes[iMesh]); } else { fSource.Write(", {0}", iMesh); } fSource.Write(",\r\n [\r\n"); int iTriggers = fPresentations.GetInt(); for (int t = 0; t < iTriggers; t++) { double dInterval = fPresentations.GetDouble(); fSource.Write(" ({0},\r\n [\r\n", Common.GetTriggerParam(dInterval)); int iRecords = fPresentations.GetInt(); if (iRecords != 0) { //memcpy(indention, " ", 7); Common.PrintStatement(ref fPresentations, ref fSource, iRecords, " "); } fSource.Write(" ]),\r\n"); } fSource.Write(" ]),\r\n\r\n"); } fSource.Write("]"); fSource.Close(); fPresentations.Close(); Common.GenerateId("ID_presentations.py", Common.Presentations, "prsnt"); }
public static void Decompile() { var fTriggers = new Text(Path.Combine(Common.InputPath, "triggers.txt")); var fSource = new Win32FileWriter(Path.Combine(Common.OutputPath, "module_triggers.py")); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Triggers); fTriggers.GetString(); int iTriggers = fTriggers.GetInt(); for (int t = 0; t < iTriggers; t++) { double dCheckInterval = fTriggers.GetDouble(), dDelayInterval = fTriggers.GetDouble(), dReArmInterval = fTriggers.GetDouble(); fSource.Write(" ({0}, {1}, {2},[", GetTriggerParam(dCheckInterval), GetTriggerParam(dDelayInterval), GetTriggerParam(dReArmInterval)); int iConditionRecords = fTriggers.GetInt(); if (iConditionRecords != 0) { fSource.WriteLine(); Common.PrintStatement(ref fTriggers, ref fSource, iConditionRecords, " "); fSource.Write(" "); } fSource.Write("],\r\n ["); iConditionRecords = fTriggers.GetInt(); if (iConditionRecords != 0) { fSource.WriteLine(); Common.PrintStatement(ref fTriggers, ref fSource, iConditionRecords, " "); fSource.Write(" "); } fSource.WriteLine("]),\r\n"); } fSource.Write("]"); fSource.Close(); fTriggers.Close(); }
public static void Decompile() { var fSceneProps = new Text(Path.Combine(Common.InputPath, "scene_props.txt")); var fSource = new Win32FileWriter(Path.Combine(Common.OutputPath, "module_scene_props.py")); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.SceneProps); fSceneProps.GetString(); var iSceneProps = fSceneProps.GetInt(); for (int i = 0; i < iSceneProps; i++) { var strId = fSceneProps.GetWord(); var dwFlag = fSceneProps.GetUInt(); fSceneProps.GetInt(); fSource.Write(" (\"{0}\", {1}, \"{2}\", \"{3}\", [", strId.Remove(0, 4), DecompileFlags(dwFlag), fSceneProps.GetWord(), fSceneProps.GetWord()); var iTriggers = fSceneProps.GetInt(); for (int t = 0; t < iTriggers; t++) { var dInterval = fSceneProps.GetDouble(); fSource.Write("\r\n ({0},[\r\n", Common.GetTriggerParam(dInterval)); var iRecords = fSceneProps.GetInt(); if (iRecords != 0) { Common.PrintStatement(ref fSceneProps, ref fSource, iRecords, " "); } fSource.WriteLine(" ]),"); } fSource.WriteLine(iTriggers > 0 ? " ]),\r\n" : "]),\r\n"); } fSource.Write("]"); fSource.Close(); fSceneProps.Close(); Common.GenerateId("ID_scene_props.py", Common.SceneProps, "spr"); }
public static void Decompile() { var fMeshes = new Text(Common.InputPath + "/meshes.txt"); var fSource = new Win32FileWriter(Common.OutputPath + "/module_meshes.py"); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Meshes); int iMeshes = fMeshes.GetInt(); for (int m = 0; m < iMeshes; m++) { fSource.Write(" (\"{0}\", ", fMeshes.GetWord().Remove(0, 5)); int iFlag = fMeshes.GetInt(); if (iFlag == 1) { fSource.Write("render_order_plus_1,"); } else { fSource.Write("{0},", iFlag); } fSource.Write(" \"{0}\"", fMeshes.GetWord()); for (int i = 0; i < 9; i++) { fSource.Write(", {0}", fMeshes.GetDouble().ToString(CultureInfo.GetCultureInfo("en-US"))); } fSource.WriteLine("),"); } fSource.Write("]"); fSource.Close(); fMeshes.Close(); Common.GenerateId("ID_meshes.py", Common.Meshes, "mesh"); }
public static void Decompile() { var fParticles = new Text(Path.Combine(Common.InputPath, "particle_systems.txt")); var fSource = new Win32FileWriter(Path.Combine(Common.OutputPath, "module_particle_systems.py")); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.ParticleSystems); fParticles.GetString(); int iParticles = fParticles.GetInt(); for (int i = 0; i < iParticles; i++) { fSource.Write(" (\"{0}\", ", fParticles.GetWord().Remove(0, 5)); DWORD dwFlag = fParticles.GetDWord(); fSource.Write("{0}, \"{1}\",\r\n ", DecompileFlags(dwFlag), fParticles.GetWord()); for (int j = 0; j < 6; j++) { fSource.Write(" {0},", fParticles.GetDouble().ToString(CultureInfo.GetCultureInfo("en-US"))); } fSource.WriteLine(); double d0, d1; for (int j = 0; j < 5; j++) { d0 = fParticles.GetDouble(); d1 = fParticles.GetDouble(); fSource.Write(" ({0}, {1}),", d0.ToString(CultureInfo.GetCultureInfo("en-US")), d1.ToString(CultureInfo.GetCultureInfo("en-US"))); d0 = fParticles.GetDouble(); d1 = fParticles.GetDouble(); fSource.WriteLine(" ({0}, {1}),", d0.ToString(CultureInfo.GetCultureInfo("en-US")), d1.ToString(CultureInfo.GetCultureInfo("en-US"))); } d0 = fParticles.GetDouble(); d1 = fParticles.GetDouble(); var d2 = fParticles.GetDouble(); fSource.WriteLine(" ({0}, {1}, {2}),", d0.ToString(CultureInfo.GetCultureInfo("en-US")), d1.ToString(CultureInfo.GetCultureInfo("en-US")), d2.ToString(CultureInfo.GetCultureInfo("en-US"))); d0 = fParticles.GetDouble(); d1 = fParticles.GetDouble(); d2 = fParticles.GetDouble(); fSource.WriteLine(" ({0}, {1}, {2}),", d0.ToString(CultureInfo.GetCultureInfo("en-US")), d1.ToString(CultureInfo.GetCultureInfo("en-US")), d2.ToString(CultureInfo.GetCultureInfo("en-US"))); d0 = fParticles.GetDouble(); d1 = fParticles.GetDouble(); d2 = fParticles.GetDouble(); fSource.WriteLine(" {0},\r\n {1}, {2}\r\n ),\r\n", d0.ToString(CultureInfo.GetCultureInfo("en-US")), d1.ToString(CultureInfo.GetCultureInfo("en-US")), d2.ToString(CultureInfo.GetCultureInfo("en-US"))); } fSource.Write("]"); fSource.Close(); fParticles.Close(); Common.GenerateId("ID_particle_systems.py", Common.ParticleSystems, "psys"); }
public static void Decompile() { var fItems = new Text(Common.InputPath + "/item_kinds1.txt"); var fSource = new Win32FileWriter(Common.OutputPath + "/module_items.py"); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Items); fItems.GetString(); int iItems = fItems.GetInt(); for (int i = 0; i < iItems; i++) { string strItemID = fItems.GetWord().Remove(0, 4); fSource.Write(" [\"{0}\"", strItemID); fItems.GetWord(); // skip second name string strItemName = fItems.GetWord(); fSource.Write(",\"{0}\", [", strItemName); int iMeshes = fItems.GetInt(); //if (iMeshes != 0) // source.Write(", ["); string strMeshes = ""; for (int m = 0; m < iMeshes; m++) { string strMeshName = fItems.GetWord(); DWORD64 dwMeshBits = fItems.GetUInt64(); strMeshes = strMeshes + $"(\"{strMeshName}\", {DecompileMeshesImodBits(dwMeshBits)}),"; } if (strMeshes.Length > 0) { strMeshes = strMeshes.Remove(strMeshes.Length - 1, 1); } fSource.Write("{0}]", strMeshes); DWORD64 dwItemFlags = fItems.GetUInt64(); ulong lItemCaps = fItems.GetUInt64(); BYTE bType; fSource.Write(", {0}, {1},", DecompileFlags(dwItemFlags, out bType), DecompileCapabilities(lItemCaps)); int iCost = fItems.GetInt(); //items.GetWord(); DWORD64 dwImodBits = fItems.GetUInt64(); string strItemStats = "weight(" + fItems.GetDouble().ToString(CultureInfo.GetCultureInfo("en-US")) + ")"; string[] strStats = { "abundance", "head_armor", "body_armor", "leg_armor", "difficulty", "hit_points", "spd_rtng", "shoot_speed", "weapon_length", "max_ammo", "thrust_damage", "swing_damage" }; for (int v = 0; v < 12; v++) { int iValue = fItems.GetInt(); string strState = strStats[v]; if (bType == HORSE_TYPE && strState == "shoot_speed") { strState = "horse_speed"; } else if (bType == HORSE_TYPE && strState == "spd_rtng") { strState = "horse_maneuver"; } else if (bType == GOODS_TYPE && strState == "head_armor") { strState = "food_quality"; } else if ((bType == BOW_TYPE || bType == CROSSBOW_TYPE || bType == MUSKET_TYPE || bType == PISTOL_TYPE) && strState == "leg_armor") { strState = "accuracy"; } else if (bType == SHIELD_TYPE && strState == "weapon_length") { strState = "shield_width"; } else if (bType == SHIELD_TYPE && strState == "shoot_speed") { strState = "shield_height"; } if (iValue != 0) { if (v >= 10) { int iDamage = iValue & 0xFF; int iDamageType = (iValue - iDamage) >> 8; string strDamageType = ""; switch (iDamageType) { case 0: strDamageType = "cut"; break; case 1: strDamageType = "pierce"; break; case 2: strDamageType = "blunt"; break; } if (bType == HORSE_TYPE && strState == "thrust_damage" && iDamageType == 0) { strItemStats = strItemStats + $"|horse_charge({iDamage})"; } else { strItemStats = strItemStats + $"|{strState}({iDamage}, {strDamageType})"; } } else { strItemStats = strItemStats + $"|{strState}({iValue})"; } } } fSource.Write("{0}, {1}, {2}", iCost, strItemStats, DecompileImodBits(dwImodBits)); int iFactions = fItems.GetInt(); string strFactionList = ""; for (int f = 0; f < iFactions; f++) { int iFaction = fItems.GetInt(); strFactionList += "fac_" + Common.Factions[iFaction] + ","; } if (strFactionList != "") { strFactionList = strFactionList.Remove(strFactionList.Length - 1, 1); } int iTriggers = fItems.GetInt(); if (iTriggers != 0) { fSource.Write(", [\r\n "); for (int t = 0; t < iTriggers; t++) { double dInterval = fItems.GetDouble(); fSource.WriteLine("({0}, [", Common.GetTriggerParam(dInterval)); int iRecords = fItems.GetInt(); //memcpy(indention, " ", 7); Common.PrintStatement(ref fItems, ref fSource, iRecords, " "); fSource.Write(" ]),\r\n "); } fSource.Write("]"); } else { fSource.Write(", []"); } if (iFactions != 0) { fSource.WriteLine(", [{0}]],", strFactionList); } else { fSource.WriteLine("],"); } } fSource.Write("]"); fSource.Close(); fItems.Close(); Common.GenerateId("ID_items.py", Common.Items, "itm"); }
public static void Decompile() { var fParties = new Text(Common.InputPath + "/parties.txt"); var fSource = new Win32FileWriter(Common.OutputPath + "/module_parties.py"); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Parties); fParties.GetString(); int iParties = fParties.GetInt(); fParties.GetInt(); for (int i = 0; i < iParties; i++) { fParties.GetInt(); fParties.GetInt(); fParties.GetInt(); fSource.Write(" (\"{0}\", \"{1}\", {2}", fParties.GetWord().Remove(0, 2), fParties.GetWord().Replace('_', ' '), DecompileFlags(fParties.GetDWord())); int iMenu = fParties.GetInt(); fSource.Write(", {0}", iMenu == 0 ? "no_menu" : "mnu_" + Common.Menus[iMenu]); int iParty = fParties.GetInt(); fSource.Write(", {0}", iParty == 0 ? "pt_none" : "pt_" + Common.PTemps[iParty]); int iFaction = fParties.GetInt(); fSource.Write(", {0}", "fac_" + Common.Factions[iFaction]); int iPersonality = fParties.GetInt(); fParties.GetInt(); fSource.Write(", {0}", iPersonality); int iAIbehaviour = fParties.GetInt(); fParties.GetInt(); string[] strAIbehaviours = { "ai_bhvr_hold", "ai_bhvr_travel_to_party", "ai_bhvr_patrol_location", "ai_bhvr_patrol_party", "ai_bhvr_attack_party", "ai_bhvr_avoid_party", "ai_bhvr_travel_to_point", "ai_bhvr_negotiate_party","ai_bhvr_in_town", "ai_bhvr_travel_to_ship", "ai_bhvr_escort_party", "ai_bhvr_driven_by_party" }; fSource.Write(", {0}", iAIbehaviour <= 11 ? strAIbehaviours[iAIbehaviour] : iAIbehaviour.ToString(CultureInfo.GetCultureInfo("en-US"))); int iAITargetParty = fParties.GetInt(); fSource.Write(", {0}", iAITargetParty); double dX = fParties.GetDouble(), dY = fParties.GetDouble(); fSource.Write(", ({0}, {1}), [", dX.ToString(CultureInfo.GetCultureInfo("en-US")), dY.ToString(CultureInfo.GetCultureInfo("en-US"))); fParties.GetDouble(); fParties.GetDouble(); fParties.GetDouble(); fParties.GetDouble(); fParties.GetDouble(); int iRecords = fParties.GetInt(); for (int j = 0; j < iRecords; j++) { int iTroop = fParties.GetInt(); int iNumTroops = fParties.GetInt(); fParties.GetInt(); int iFlag = fParties.GetInt(); fSource.Write("(trp_{0}, {1}, {2}){3}", Common.Troops[iTroop], iNumTroops, iFlag == 1 ? "pmf_is_prisoner" : "0", j == (iRecords - 1) ? "" : ","); } fSource.Write("]"); double dAngle = fParties.GetDouble(); if (Math.Abs(dAngle) > 0.0000001) { fSource.Write(", {0}", (Math.Round(dAngle * (180 / Math.PI))).ToString(CultureInfo.GetCultureInfo("en-US"))); } fSource.WriteLine("),"); } fSource.Write("]"); fSource.Close(); fParties.Close(); Common.GenerateId("ID_parties.py", Common.Parties, "p"); }
public static void Decompile() { var fMissionTemplates = new Text(Path.Combine(Common.InputPath, "mission_templates.txt")); var fSource = new Win32FileWriter(Path.Combine(Common.OutputPath, "module_mission_templates.py")); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.MissionTemplates); fMissionTemplates.GetString(); int iMissionTemplates = fMissionTemplates.GetInt(); for (int m = 0; m < iMissionTemplates; m++) { fMissionTemplates.GetWord(); fSource.Write(" (\"{0}\",", fMissionTemplates.GetWord()); var dwFlag = fMissionTemplates.GetDWord(); var sbFlag = new StringBuilder(256); string[] strFlags = { "mtf_arena_fight", "mtf_battle_mode", "mtf_commit_casualties", "mtf_no_blood", "mtf_synch_inventory" }; DWORD[] dwFlags = { 0x00000001, 0x00000002, 0x00000010, 0x00000100, 0x00010000 }; for (int i = 0; i < dwFlags.Length; i++) { if ((dwFlag & dwFlags[i]) == 0) { continue; } dwFlag ^= dwFlags[i]; sbFlag.Append(strFlags[i]); sbFlag.Append('|'); } if (sbFlag.Length == 0) { sbFlag.Append('0'); } else { sbFlag.Length--; } fSource.Write(" {0},", sbFlag.ToString()); var iType = fMissionTemplates.GetInt(); var strType = ""; if (iType == 8) { strType = "charge"; } else if (iType == 10) { strType = "charge_with_ally"; } if (strType.Length > 0) { fSource.WriteLine(" {0},", strType); } else { fSource.WriteLine(" {0},", iType); } fSource.WriteLine(" \"{0}\",\r\n [", fMissionTemplates.GetWord().Replace('_', ' ')); var iSpawnRecords = fMissionTemplates.GetInt(); for (int i = 0; i < iSpawnRecords; i++) { var iNum = fMissionTemplates.GetInt(); var dwSpawnFlag = fMissionTemplates.GetDWord(); var dwAlterFlag = fMissionTemplates.GetDWord(); var dwAIFlag = fMissionTemplates.GetDWord(); var iTroops = fMissionTemplates.GetInt(); var iItems = fMissionTemplates.GetInt(); fSource.Write(" ({0}, {1}, {2}", iNum, DecompileSpawnFlags(dwSpawnFlag), DecompileAlterFlags(dwAlterFlag)); if (dwAIFlag == 0x00000010) { fSource.Write(", aif_start_alarmed"); } else { fSource.Write(", {0}", dwAIFlag); } fSource.Write(", {0}, [", iTroops); var itemsList = new int[iItems]; for (int j = 0; j < iItems; j++) { itemsList[j] = fMissionTemplates.GetInt(); } fSource.WriteLine("{0}]),", String.Join(",", itemsList.Select(t => t <Common.Items.Count && t> -1 ? $"itm_{Common.Items[t]}" : t.ToString(CultureInfo.GetCultureInfo("en-US"))))); } fSource.WriteLine(" ],\r\n ["); int iTriggers = fMissionTemplates.GetInt(); for (int i = 0; i < iTriggers; i++) { fSource.Write(" ("); for (int j = 0; j < 3; j++) { double dInterval = fMissionTemplates.GetDouble(); fSource.Write("{0}, ", Common.GetTriggerParam(dInterval)); } fSource.Write("\r\n ["); int iConditionRecords = fMissionTemplates.GetInt(); if (iConditionRecords != 0) { fSource.WriteLine(); Common.PrintStatement(ref fMissionTemplates, ref fSource, iConditionRecords, " "); fSource.Write(" "); } fSource.Write("],\r\n ["); iConditionRecords = fMissionTemplates.GetInt(); if (iConditionRecords != 0) { fSource.WriteLine(); Common.PrintStatement(ref fMissionTemplates, ref fSource, iConditionRecords, " "); fSource.Write(" "); } fSource.Write("]),\r\n\r\n"); } fSource.Write(" ]),\r\n\r\n"); } fSource.Write("]"); fSource.Close(); fMissionTemplates.Close(); Common.GenerateId("ID_mission_templates.py", Common.MissionTemplates, "mst"); }
public static void Decompile() { var fFactions = new Text(Common.InputPath + "/factions.txt"); var fSource = new Win32FileWriter(Common.OutputPath + "/module_factions.py"); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Factions); fFactions.GetString(); int iFactions = fFactions.GetInt(); for (int f = 0; f < iFactions; f++) { string strFacID = fFactions.GetWord(); if (strFacID == "0") { strFacID = fFactions.GetWord(); } string strFacName = fFactions.GetWord(); fSource.Write(" (\"{0}\", \"{1}\",", strFacID.Remove(0, 4), strFacName); string strFlags = ""; DWORD dwFlags = fFactions.GetUInt(); int iRating = ((int)(dwFlags & 0xFF00)) >> 8; if (iRating != 0) { strFlags = $"max_player_rating({100 - iRating})"; } if ((dwFlags & 1) != 0) { if (strFlags != "") { strFlags = strFlags + "|"; } strFlags += "ff_always_hide_label"; } if (strFlags == "") { strFlags = "0"; } fSource.Write(" {0}, 0.0, [", strFlags); DWORD dwColor = fFactions.GetUInt(); string strRelations = ""; for (int r = 0; r < iFactions; r++) { double rRelation = fFactions.GetDouble(); if (Math.Abs(rRelation) > 0.000001) { strRelations += $"(\"{Common.Factions[r]}\", {rRelation.ToString(CultureInfo.GetCultureInfo("en-US"))}),"; } } if (strRelations != "") { strRelations = strRelations.Remove(strRelations.Length - 1, 1); } fSource.Write("{0}], []", strRelations); if (dwColor != 0xAAAAAA) { fSource.Write(", 0x{0:X}", dwColor); } fSource.WriteLine("),"); } fSource.Write("]"); fSource.Close(); fFactions.Close(); Common.GenerateId("ID_factions.py", Common.Factions, "fac"); }
public static void Decompile() { var fGroundSpecs = new Text(Path.Combine(Common.InputPath, "ground_specs.txt")); var fSource = new Win32FileWriter(Path.Combine(Common.OutputPath, "module_ground_specs.py")); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.GroundSpecs); int n = GetLexemsInFile(Path.Combine(Common.InputPath, "ground_specs.txt")) >> 3; // / 8; for (int i = 0; i < n; i++) { var strId = fGroundSpecs.GetWord(); var dwFlag = fGroundSpecs.GetUInt(); var strMaterial = fGroundSpecs.GetWord(); var dblUVScale = fGroundSpecs.GetDouble(); var strMultitexMaterialName = fGroundSpecs.GetWord(); double dColor1 = fGroundSpecs.GetDouble(), dColor2 = fGroundSpecs.GetDouble(), dColor3 = fGroundSpecs.GetDouble(); var sbFlag = new StringBuilder(64); string[] strFlags = { "gtf_overlay", "gtf_dusty", "gtf_has_color" }; DWORD[] dwFlags = { 1, 2, 4 }; for (int j = 0; j < dwFlags.Length; j++) { if ((dwFlag & dwFlags[j]) == 0) { continue; } dwFlag ^= dwFlags[j]; sbFlag.Append(strFlags[j]); sbFlag.Append('|'); } if (sbFlag.Length == 0) { sbFlag.Append('0'); } else { sbFlag.Length--; } fSource.WriteLine(" (\"{0}\", {1}, \"{2}\", {3}, \"{4}\", ({5}, {6}, {7})),", strId, sbFlag, strMaterial, dblUVScale.ToString(CultureInfo.GetCultureInfo("en-US")), strMultitexMaterialName, dColor1.ToString(CultureInfo.GetCultureInfo("en-US")), dColor2.ToString(CultureInfo.GetCultureInfo("en-US")), dColor3.ToString(CultureInfo.GetCultureInfo("en-US"))); } fSource.WriteLine(@"] def write_vec(file,vec): file.write("" %f %f %f ""%vec) def save_ground_specs(): file = open(export_dir + ""Data/ground_specs.txt"",""w"") for ground_spec in ground_specs: file.write("" %s %d %s %f %s""%(ground_spec[0],ground_spec[1],ground_spec[2],ground_spec[3],ground_spec[4])) if (ground_spec[1] & gtf_has_color): file.write("" %f %f %f""%ground_spec[5]) file.write(""\n"") file.close() def save_c_header(): file = open(export_dir + ""ground_spec_codes.h"",""w"") file.write(""#ifndef _GROUND_SPEC_CODES_H\n"") file.write(""#define _GROUND_SPEC_CODES_H\n\n"") file.write(""typedef enum {\n"") for ground_spec in ground_specs: file.write("" ground_%s,\n""%ground_spec[0]) file.write(""}Ground_spec_codes;\n"") file.write(""const int num_ground_specs = %d;\n""%(len(ground_specs))) file.write(""\n\n"") file.write(""\n#endif\n"") file.close() def save_python_header(): file = open(""./header_ground_types.py"",""w"") for ig in xrange(len(ground_specs)): ground_spec = ground_specs[ig] file.write(""ground_%s = %d\n""%(ground_spec[0], ig)) file.write(""\n\n"") file.close() print ""Exporting ground_spec data..."" save_ground_specs() save_c_header() save_python_header()"); fSource.Close(); fGroundSpecs.Close(); }
public static void Decompile() { var fSkins = new Text(Common.InputPath + "/skins.txt"); var fSource = new Win32FileWriter(Common.OutputPath + "/module_skins.py"); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Skins); fSkins.GetString(); int iSkins = fSkins.GetInt(); for (int s = 0; s < iSkins; s++) { fSource.WriteLine(" (\r\n \"{0}\", {1},", fSkins.GetWord(), fSkins.GetInt()); fSource.WriteLine(" \"{0}\", \"{1}\", \"{2}\",", fSkins.GetWord(), fSkins.GetWord(), fSkins.GetWord()); fSource.WriteLine(" \"{0}\",\r\n [", fSkins.GetWord()); int iFaceKeys = fSkins.GetInt(); for (int i = 0; i < iFaceKeys; i++) { fSkins.GetWord(); double d1 = fSkins.GetDouble(), d2 = fSkins.GetDouble(), d3 = fSkins.GetDouble(), d4 = fSkins.GetDouble(); string strText = fSkins.GetWord(); fSource.WriteLine(" ({0}, {1}, {2}, {3}, \"{4}\"),", d1.ToString(CultureInfo.GetCultureInfo("en-US")), d2.ToString(CultureInfo.GetCultureInfo("en-US")), d3.ToString(CultureInfo.GetCultureInfo("en-US")), d4.ToString(CultureInfo.GetCultureInfo("en-US")), strText.Replace('_', ' ')); } fSource.WriteLine(" ],"); int iMeshesHair = fSkins.GetInt(); fSource.Write(" ["); for (int i = 0; i < iMeshesHair; i++) { fSource.Write("\"{0}\"{1}", fSkins.GetWord(), i != iMeshesHair - 1 ? ", " : ""); } fSource.WriteLine("],"); int iMeshesBeard = fSkins.GetInt(); fSource.Write(" ["); for (int i = 0; i < iMeshesBeard; i++) { fSource.Write("\"{0}\"{1}", fSkins.GetWord(), i != iMeshesBeard - 1 ? ", " : ""); } fSource.WriteLine("],"); for (int i = 0; i < 2; i++) { int iTextures = fSkins.GetInt(); fSource.Write(" ["); for (int t = 0; t < iTextures; t++) { fSource.Write("\"{0}\"{1}", fSkins.GetWord(), t != iTextures - 1 ? ", " : ""); } fSource.WriteLine("],"); } int iTexturesFace = fSkins.GetInt(); fSource.WriteLine(" ["); for (int i = 0; i < iTexturesFace; i++) { fSource.Write(" (\"{0}\", 0x{1:X}, ", fSkins.GetWord(), fSkins.GetDWord()); int iHairMats = fSkins.GetInt(); int iHairColors = fSkins.GetInt(); for (int m = 0; m < iHairMats; m++) { fSource.Write("[\"{0}\"], ", fSkins.GetWord()); } fSource.Write("["); for (int c = 0; c < iHairColors; c++) { //fprintf( g_fOutput, " 0x%X,", GetDWord() ); fSource.Write("0x{0:x}{1}", fSkins.GetUInt64(), c != iHairColors - 1 ? ", " : ""); } fSource.WriteLine("]),"); } fSource.WriteLine(" ],"); int iVoices = fSkins.GetInt(); fSource.Write(" ["); for (int v = 0; v < iVoices; v++) { DWORD dwFlag = fSkins.GetDWord(); string[] strFlags = { "voice_die", "voice_hit", "voice_grunt", "voice_grunt_long", "voice_yell", "voice_warcry", "voice_victory", "voice_stun" }; if (dwFlag <= 7) { fSource.Write("({0},", strFlags[dwFlag]); } else { fSource.Write("({0},", dwFlag); } string strSound = fSkins.GetWord(); fSource.Write(" \"{0}\"){1}", strSound, v != iVoices - 1 ? "," : ""); } fSource.WriteLine("],"); string strSkeleton = fSkins.GetWord(); fSource.WriteLine(" \"{0}\", {1},", strSkeleton, fSkins.GetWord()); int ixParticleSystem1 = fSkins.GetInt(), ixParticleSystem2 = fSkins.GetInt(); fSource.WriteLine(" psys_{0}, psys_{1},", Common.ParticleSystems[ixParticleSystem1], Common.ParticleSystems[ixParticleSystem2]); int iConstraints = fSkins.GetInt(); fSource.Write(" ["); for (int i = 0; i < iConstraints; i++) { double d1 = fSkins.GetDouble(); fSource.Write("\r\n [{0},", d1.ToString(CultureInfo.GetCultureInfo("en-US"))); int i1 = fSkins.GetInt(); string c1 = i1 == 1 ? "comp_greater_than" : i1 == -1 ? "comp_less_than" : "0"; if (c1 != "0") { fSource.Write(" {0}, ", c1); } else { fSource.Write(" {0}, ", i1); } int count = fSkins.GetInt(); for (int c = 0; c < count; c++) { double dc1 = fSkins.GetDouble(); int ic1 = fSkins.GetInt(); fSource.Write("({0}, {1}){2}", dc1.ToString(CultureInfo.GetCultureInfo("en-US")), ic1, c != count - 1 ? "," : ""); } fSource.Write("],"); } fSource.WriteLine("\r\n ]),\r\n"); } fSource.Write("]"); fSource.Close(); fSkins.Close(); }
public static void Decompile() { var fMissionTemplates = new Text(Common.InputPath + "/mission_templates.txt"); var fSource = new Win32FileWriter(Common.OutputPath + "/module_mission_templates.py"); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.MissionTemplates); fMissionTemplates.GetString(); int iMissionTemplates = fMissionTemplates.GetInt(); for (int m = 0; m < iMissionTemplates; m++) { fMissionTemplates.GetWord(); fSource.Write(" (\"{0}\",", fMissionTemplates.GetWord()); DWORD dwFlag = fMissionTemplates.GetDWord(); string strFlag = ""; string[] strFlags = { "mtf_arena_fight", "mtf_battle_mode", "mtf_commit_casualties", "mtf_no_blood", "mtf_synch_inventory" }; DWORD[] dwFlags = { 0x00000001, 0x00000002, 0x00000010, 0x00000100, 0x00010000 }; for (int i = 0; i < dwFlags.Length; i++) { if ((dwFlag & dwFlags[i]) != 0) { dwFlag ^= dwFlags[i]; strFlag += strFlags[i] + "|"; } } /*for (int i = dwFlags.Length - 1; i >= 0; i--) * { * if (dwFlag >= dwFlags[i]) * { * strFlag = strFlag + strFlags[i] + "|"; * } * }*/ strFlag = strFlag == "" ? "0" : strFlag.Remove(strFlag.Length - 1, 1); /*var sbFlag = new StringBuilder(256); * string[] strFlags = { "mtf_arena_fight", "mtf_battle_mode", "mtf_commit_casualties", "mtf_no_blood", "mtf_synch_inventory" }; * DWORD[] dwFlags = { 0x00000001, 0x00000002, 0x00000010, 0x00000100, 0x00010000 }; * for (int i = 0; i < dwFlags.Length; i++) * { * if ((dwFlag & dwFlags[i]) != 0) * { * dwFlag ^= dwFlags[i]; * sbFlag.Append(strFlags[i]); * sbFlag.Append('|'); * } * } * if (sbFlag.Length == 0) * sbFlag.Append('0'); * else * sbFlag.Length--;*/ fSource.Write(" {0},", strFlag); int iType = fMissionTemplates.GetInt(); string strType = ""; if (iType == 8) { strType = "charge"; } else if (iType == 10) { strType = "charge_with_ally"; } if (strType != "") { fSource.WriteLine(" {0},", strType); } else { fSource.WriteLine(" {0},", iType); } fSource.WriteLine(" \"{0}\",\r\n [", fMissionTemplates.GetWord().Replace('_', ' ')); int iSpawnRecords = fMissionTemplates.GetInt(); for (int i = 0; i < iSpawnRecords; i++) { int iNum = fMissionTemplates.GetInt(); DWORD dwSpawnFlag = fMissionTemplates.GetDWord(); DWORD dwAlterFlag = fMissionTemplates.GetDWord(); DWORD dwAIFlag = fMissionTemplates.GetDWord(); int iTroops = fMissionTemplates.GetInt(); int iItems = fMissionTemplates.GetInt(); fSource.Write(" ({0}, {1}, {2}", iNum, DecompileSpawnFlags(dwSpawnFlag), DecompileAlterFlags(dwAlterFlag)); if (dwAIFlag == 0x00000010) { fSource.Write(", aif_start_alarmed"); } else { fSource.Write(", {0}", dwAIFlag); } fSource.Write(", {0}, [", iTroops); string strItemList = ""; for (int j = 0; j < iItems; j++) { //fSource.Write("{0},", Common.Items[fMissionTemplates.GetInt()]); strItemList = strItemList + $"itm_{Common.Items[fMissionTemplates.GetInt()]},"; } if (strItemList.Length > 0) { strItemList = strItemList.Remove(strItemList.Length - 1, 1); } fSource.WriteLine("{0}]),", strItemList); } fSource.WriteLine(" ],\r\n ["); int iTriggers = fMissionTemplates.GetInt(); for (int i = 0; i < iTriggers; i++) { fSource.Write(" ("); for (int j = 0; j < 3; j++) { double dInterval = fMissionTemplates.GetDouble(); fSource.Write("{0}, ", Common.GetTriggerParam(dInterval)); } fSource.Write("\r\n ["); int iConditionRecords = fMissionTemplates.GetInt(); if (iConditionRecords != 0) { fSource.WriteLine(); Common.PrintStatement(ref fMissionTemplates, ref fSource, iConditionRecords, " "); fSource.Write(" "); } fSource.Write("],\r\n ["); iConditionRecords = fMissionTemplates.GetInt(); if (iConditionRecords != 0) { fSource.WriteLine(); Common.PrintStatement(ref fMissionTemplates, ref fSource, iConditionRecords, " "); fSource.Write(" "); } fSource.Write("]),\r\n\r\n"); } fSource.Write(" ]),\r\n\r\n"); } fSource.Write("]"); fSource.Close(); fMissionTemplates.Close(); Common.GenerateId("ID_mission_templates.py", Common.MissionTemplates, "mst"); }
public static void Decompile() { var fScenes = new Text(Common.InputPath + "/scenes.txt"); var fSource = new Win32FileWriter(Common.OutputPath + "/module_scenes.py"); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Scenes); fScenes.GetString(); int iScenes = fScenes.GetInt(); for (int iS = 0; iS < iScenes; iS++) { fScenes.GetWord(); fSource.Write(" (\"{0}\"", fScenes.GetWord()); DWORD dwFlag = fScenes.GetDWord(); fSource.Write(", {0}, \"{1}\", \"{2}\"", DecompileFlags(dwFlag), fScenes.GetWord(), fScenes.GetWord()); double d1 = fScenes.GetDouble(), d2 = fScenes.GetDouble(); fSource.Write(", ({0}, {1})", d1.ToString(CultureInfo.GetCultureInfo("en-US")), d2.ToString(CultureInfo.GetCultureInfo("en-US"))); d1 = fScenes.GetDouble(); d2 = fScenes.GetDouble(); fSource.Write(", ({0}, {1})", d1.ToString(CultureInfo.GetCultureInfo("en-US")), d2.ToString(CultureInfo.GetCultureInfo("en-US"))); fSource.Write(", {0}, \"{1}\",[", fScenes.GetDouble().ToString(CultureInfo.GetCultureInfo("en-US")), fScenes.GetWord()); int iPassages = fScenes.GetInt(); for (int i = 0; i < iPassages; i++) { int iScene = fScenes.GetInt(); if (iScene == 100000) { fSource.Write("\"exit\""); } //else if (iScene == 0) // fprintf(g_fOutput, "\"\""); else { fSource.Write("\"{0}\"", Common.Scenes[iScene]); } if (i < (iPassages - 1)) { fSource.Write(", "); } } fSource.Write("], ["); int iChestTroops = fScenes.GetInt(); for (int i = 0; i < iChestTroops; i++) { int iTroop = fScenes.GetInt(); if (iTroop < Common.Troops.Length) { fSource.Write("\"{0}\"", Common.Troops[iTroop]); } else { fSource.Write("{0}", iTroop); } if (i < (iChestTroops - 1)) { fSource.Write(", "); } } fSource.Write("]"); string strTerrain = fScenes.GetWord(); if (strTerrain != "0") { fSource.Write(", \"{0}\"", strTerrain); } fSource.WriteLine("),"); } fSource.Write("]"); fSource.Close(); fScenes.Close(); Common.GenerateId("ID_scenes.py", Common.Scenes, "scn"); }
public static void Decompile() { var fFactions = new Text(Path.Combine(Common.InputPath, "factions.txt")); var fSource = new Win32FileWriter(Path.Combine(Common.OutputPath, "module_factions.py")); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Factions); fFactions.GetString(); var iFactions = fFactions.GetInt(); for (int f = 0; f < iFactions; f++) { var strFacId = fFactions.GetWord(); if (strFacId == "0") { strFacId = fFactions.GetWord(); } var strFacName = fFactions.GetWord(); fSource.Write(" (\"{0}\", \"{1}\",", strFacId.Remove(0, 4), strFacName); var sbFlags = new StringBuilder(64); var dwFlags = fFactions.GetUInt(); var iRating = (int)(dwFlags & 0xFF00) >> 8; if (iRating != 0) { sbFlags.Append($"max_player_rating({100 - iRating})"); } if ((dwFlags & 1) != 0) { if (sbFlags.Length > 0) { sbFlags.Append('|'); } sbFlags.Append("ff_always_hide_label"); } if (sbFlags.Length == 0) { sbFlags.Append('0'); } fSource.Write(" {0}, 0.0, [", sbFlags); var dwColor = fFactions.GetUInt(); var sbRelations = new StringBuilder(1024); for (int r = 0; r < iFactions; r++) { var rRelation = fFactions.GetDouble(); if (Math.Abs(rRelation) > 0.000001) { sbRelations.Append($"(\"{Common.Factions[r]}\", {rRelation.ToString(CultureInfo.GetCultureInfo("en-US"))}),"); } } if (sbRelations.Length != 0) { sbRelations.Length--; } fSource.Write("{0}], []", sbRelations); if (dwColor != 0xAAAAAA) { fSource.Write(", 0x{0:X}", dwColor); } fSource.WriteLine("),"); } fSource.Write("]"); fSource.Close(); fFactions.Close(); Common.GenerateId("ID_factions.py", Common.Factions, "fac"); }