public static void Decompile() { var fScenes = new Text(Path.Combine(Common.InputPath, "scenes.txt")); var fSource = new Win32FileWriter(Path.Combine(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()); var 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}", iScene < Common.Scenes.Count ? '"' + Common.Scenes[iScene] + '"' : iScene.ToString(CultureInfo.GetCultureInfo("en-US"))); } 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.Count) { fSource.Write("\"{0}\"", Common.Troops[iTroop]); } else { fSource.Write("{0}", iTroop); } if (i < iChestTroops - 1) { fSource.Write(", "); } } fSource.Write("]"); var 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 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 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"); }
public static void Decompile() { var fFloraKinds = new Text(Common.InputPath + "/flora_kinds.txt"); var fSource = new Win32FileWriter(Common.OutputPath + "/module_flora_kinds.py"); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Flora); int iFloraKinds = fFloraKinds.GetInt(); for (int f = 0; f < iFloraKinds; f++) { string strID = fFloraKinds.GetWord(); DWORD64 dwFlag = fFloraKinds.GetUInt64(); int iNumMeshes = fFloraKinds.GetInt(); fSource.Write(" (\"{0}\", {1}, [", strID, DecompileFlags(dwFlag)); //string strMeshesList = ""; if (IsTree(dwFlag)) { for (int m = 0; m < iNumMeshes; m++) { string strMeshName = fFloraKinds.GetWord(), strMeshCollision = fFloraKinds.GetWord(), strAlternativeMeshName = fFloraKinds.GetWord(), //fFloraKinds.GetInt().ToString(CultureInfo.GetCultureInfo("en-US")), strAlternativeCollision = fFloraKinds.GetWord(); //fFloraKinds.GetInt().ToString(CultureInfo.GetCultureInfo("en-US")); //System.Windows.MessageBox.Show(strAlternativeMeshName, strAlternativeCollision); fSource.Write("(\"{0}\", \"{1}\",(\"{2}\",\"{3}\")){4}", strMeshName, strMeshCollision, strAlternativeMeshName, strAlternativeCollision, m == iNumMeshes - 1 ? "" : ","); } } else { for (int m = 0; m < iNumMeshes; m++) { fSource.Write("[\"{0}\", \"{1}\"]{2}", fFloraKinds.GetWord(), fFloraKinds.GetWord(), m == iNumMeshes - 1 ? "" : ","); } } fSource.WriteLine("]),"); } fSource.Write(@"] def save_fauna_kinds(): file = open(export_dir + ""Data/flora_kinds.txt"",""w"") file.write(""%d\n""%len(fauna_kinds)) for fauna_kind in fauna_kinds: meshes_list = fauna_kind[2] file.write(""%s %d %d\n""%(fauna_kind[0], (dword_mask & fauna_kind[1]), len(meshes_list))) for m in meshes_list: file.write("" %s ""%(m[0])) if (len(m) > 1): file.write("" %s\n""%(m[1])) else: file.write("" 0\n"") if ( fauna_kind[1] & (fkf_tree|fkf_speedtree) ): #if this fails make sure that you have entered the alternative tree definition (NOT FUNCTIONAL in Warband) speedtree_alternative = m[2] file.write("" %s %s\n""%(speedtree_alternative[0], speedtree_alternative[1])) if ( fauna_kind[1] & fkf_has_colony_props ): file.write("" %s %s\n""%(fauna_kind[3], fauna_kind[4])) file.close() def two_to_pow(x): result = 1 for i in xrange(x): result = result * 2 return result fauna_mask = 0x80000000000000000000000000000000 low_fauna_mask = 0x8000000000000000 def save_python_header(): file = open(""./fauna_codes.py"",""w"") for i_fauna_kind in xrange(len(fauna_kinds)): file.write(""%s_1 = 0x""%(fauna_kinds[i_fauna_kind][0])) file.write(""%x\n""%(fauna_mask | two_to_pow(i_fauna_kind))) file.write(""%s_2 = 0x""%(fauna_kinds[i_fauna_kind][0])) file.write(""%x\n""%(fauna_mask | ((low_fauna_mask|two_to_pow(i_fauna_kind)) << 64))) file.write(""%s_3 = 0x""%(fauna_kinds[i_fauna_kind][0])) file.write(""%x\n""%(fauna_mask | ((low_fauna_mask|two_to_pow(i_fauna_kind)) << 64) | two_to_pow(i_fauna_kind))) file.close() print ""Exporting flora data..."" save_fauna_kinds()"); fSource.Close(); fFloraKinds.Close(); }
public static void Decompile() { var fTroops = new Text(Common.InputPath + "/troops.txt"); var fSource = new Win32FileWriter(Common.OutputPath + "/module_troops.py"); fSource.WriteLine(Header.Standard); fSource.WriteLine(Header.Troops); for (int s = 0; s < Common.Skins.Length; s++) { fSource.WriteLine("tf_" + Common.Skins[s] + " = " + s); } fSource.WriteLine("\r\ntroops = ["); fTroops.GetString(); int iTroops = fTroops.GetInt(); var aUpList = new List <object>(); for (int t = 0; t < iTroops; t++) { fSource.Write(" [\"{0}\", \"{1}\", \"{2}\",", fTroops.GetWord().Remove(0, 4), fTroops.GetWord().Replace('_', ' '), fTroops.GetWord().Replace('_', ' ')); fTroops.GetWord(); DWORD dwFlag = fTroops.GetDWord(); fSource.Write(" {0},", DecompileFlags(dwFlag)); DWORD dwScene = fTroops.GetDWord(); fSource.Write(" {0},", dwScene == 0 ? "0" : GetScene(dwScene)); fSource.Write(" {0},", fTroops.GetWord()); // reserved "0" int iFaction = fTroops.GetInt(); if (iFaction > 0 && iFaction < Common.Factions.Length) { fSource.WriteLine(" fac_{0},", Common.Factions[iFaction]); } else { fSource.WriteLine(" {0},", iFaction); } int iUp1 = fTroops.GetInt(); int iUp2 = fTroops.GetInt(); /*if (iUp1 != 0 && iUp2 != 0) * strUpList.Add( * $"upgrade2(troops,\"{Common.Troops[t]}\",\"{Common.Troops[iUp1]}\",\"{Common.Troops[iUp2]}\")"); * else if (iUp1 != 0 && iUp2 == 0) * strUpList.Add($"upgrade(troops,\"{Common.Troops[t]}\",\"{Common.Troops[iUp1]}\")"); */ if (iUp1 != 0 && iUp2 != 0) { aUpList.Add(new Upgrade2(t, iUp1, iUp2)); } else if (iUp1 != 0 && iUp2 == 0) { aUpList.Add(new Upgrade(t, iUp1)); } string strItemList = ""; for (int i = 0; i < 64; i++) { int iItem = fTroops.GetInt(); fTroops.GetInt(); //skip 0 if (-1 == iItem) { continue; } strItemList += iItem < Common.Items.Length ? $"itm_{Common.Items[iItem]}," : $"{iItem},"; } if (strItemList.Length > 0) { strItemList = strItemList.Remove(strItemList.Length - 1, 1); } fSource.WriteLine(" [{0}],", strItemList); int iStregth = fTroops.GetInt(), iAgility = fTroops.GetInt(), iIntelligence = fTroops.GetInt(), iCharisma = fTroops.GetInt(), iLevel = fTroops.GetInt(); fSource.Write(" strength({0})|agility({1})|intellect({2})|charisma({3})|level({4}), ", iStregth, iAgility, iIntelligence, iCharisma, iLevel); var iWP = new int[7]; for (int i = 0; i < 7; i++) { iWP[i] = fTroops.GetInt(); } if (iWP[0] == iWP[1] && iWP[1] == iWP[2] && iWP[2] == iWP[3] && iWP[3] == iWP[4] && iWP[4] == iWP[5]) { fSource.Write("wp({0}){1},", iWP[0], iWP[6] == 0 ? "" : "|wp_firearm(" + iWP[6] + ")"); } else if (iWP[0] == iWP[1] && iWP[1] == iWP[2]) { fSource.Write("wpe({0},{1},{2},{3}){4},", iWP[0], iWP[3], iWP[4], iWP[5], iWP[6] == 0 ? "" : "|wp_firearm(" + iWP[6] + ")"); } else { fSource.Write("wpex({0},{1},{2},{3},{4},{5}){6},", iWP[0], iWP[1], iWP[2], iWP[3], iWP[4], iWP[5], iWP[6] == 0 ? "" : "|wp_firearm(" + iWP[6] + ")"); } var strKnow = new StringBuilder(""); for (int x = 0; x < 6; x++) { DWORD dword = fTroops.GetDWord(); if (dword == 0) { continue; } for (int q = 0; q < 8; q++) { DWORD dwKnow = 0xF & (dword >> (q * 4)); /*if (dwKnow != 0 && dwKnow <= 8) * strKnow = strKnow + String.Format("knows_{0}_{1}|", Common.Skills[x * 8 + q], dwKnow); * else*/ if (dwKnow != 0 && (x << 3) + q < Common.Skills.Length) { strKnow.Append($"knows_{Common.Skills[(x << 3) + q]}_{dwKnow}|"); } } } if (strKnow.Length == 0) { strKnow.Append('0'); } else { strKnow.Length--; } //strKnow = strKnow.Length == 0 ? "0" : strKnow.Remove(strKnow.Length - 1, 1); fSource.Write(" {0},", strKnow); string strFase = $"0x{fTroops.GetUInt64():x16}{fTroops.GetUInt64():x16}{fTroops.GetUInt64():x16}{fTroops.GetUInt64():x16}, 0x{fTroops.GetUInt64():x16}{fTroops.GetUInt64():x16}{fTroops.GetUInt64():x16}{fTroops.GetUInt64():x16}"; if (Common.SelectedMode == Mode.Caribbean) { fTroops.GetWord(); } fSource.WriteLine("{0}],", strFase); } fSource.WriteLine("]"); foreach (var t in aUpList.Select(up => up.ToString()).Where(t => !String.IsNullOrEmpty(t))) { fSource.WriteLine(t); } fSource.Close(); fTroops.Close(); Common.GenerateId("ID_troops.py", Common.Troops, "trp"); }