MaelstromTools Dev

Just a set of statistics & summaries about repair time and base resources. Mainly for internal use, but you are free to test and comment it.

  1. // ==UserScript==
  2. // @name MaelstromTools Dev
  3. // @namespace MaelstromTools
  4. // @description Just a set of statistics & summaries about repair time and base resources. Mainly for internal use, but you are free to test and comment it.
  5. // @version 0.1.3.3
  6. // @author Gryphon, Maelstrom, HuffyLuf, KRS_L and Krisan
  7. // @include http*://prodgame*.alliances.commandandconquer.com/*/index.aspx*
  8. // ==/UserScript==
  9. //var offense_units = own_city.get_CityArmyFormationsManager().GetFormationByTargetBaseId(current_city.get_Id()).get_ArmyUnits().l;
  10. //System.Int64 GetForumIdByType (ClientLib.Data.Forum.EForumType eForumType)
  11. //static ClientLib.Data.Forum.EForumType NormalForum
  12. //System.Collections.Generic.List$1 get_ForumsAlliance ()
  13. //System.Void CreateThread (System.Int64 forumId ,System.String threadTitle ,System.String threadPost ,System.Boolean autoSubscribe)
  14. //System.Void CreatePost (System.Int64 forumId ,System.Int64 threadId ,System.String postMessage)
  15. //System.Void StartGetForumThreadData (System.Int64 forumId ,System.Int32 skip ,System.Int32 take)
  16. //System.Void OnForumThreadDataReceived (System.Object context ,System.Object result)
  17. //System.Void add_ThreadsFetched (ClientLib.Data.ForumThreadsFetched value)
  18. //System.Void MarkThreadsAsRead (System.Int64 forumId ,System.Int64[] threadIds)
  19. //
  20. //var score = ClientLib.Base.PointOfInterestTypes.GetScoreByLevel(lvl);
  21. //var scoreNext = ClientLib.Base.PointOfInterestTypes.GetNextScore(score);
  22. //var resBonus = ClientLib.Base.PointOfInterestTypes.GetBonusByType(ClientLib.Base.EPOIType.TiberiumBonus, score);
  23. //var unitBonus = ClientLib.Base.PointOfInterestTypes.GetBonusByType(ClientLib.Base.EPOIType.InfanteryBonus, score);
  24. //console.log("POI lvl" + lvl + "gives " + score + "points, next lvl at " + scoreNext + " points. Resource bonus: " + resBonus + " Unit bonus: " + unitBonus + "%");
  25. /*
  26. ClientLib.Data.Player
  27. get_ResearchPoints
  28. GetCreditsCount
  29. GetCreditsGrowth
  30. ClientLib.Data.PlayerResearch get_PlayerResearch ()
  31. ClientLib.Data.PlayerResearchItem GetResearchItemFomMdbId (System.Int32 _mdbId)
  32. ClientLib.Data.PlayerResearchItem.System.Object get_NextLevelInfo_Obj ()
  33.  
  34. var cw=ClientLib.Data.MainData.GetInstance().get_Player().get_Faction();
  35. var cj=ClientLib.Base.Tech.GetTechIdFromTechNameAndFaction(ClientLib.Base.ETechName.Research_BaseFound,cw);
  36. var cd=cr.GetResearchItemFomMdbId(cj);
  37. */
  38. (function () {
  39. var MaelstromTools_main = function () {
  40. try {
  41. function CCTAWrapperIsInstalled() {
  42. return (typeof (CCTAWrapper_IsInstalled) != 'undefined' && CCTAWrapper_IsInstalled);
  43. }
  44.  
  45. function createMaelstromTools() {
  46. console.log('MaelstromTools loaded');
  47.  
  48. qx.Class.define("MaelstromTools.Language", {
  49. type: "singleton",
  50. extend: qx.core.Object,
  51. construct: function (language) {
  52. this.Languages = ['de', 'pt', 'fr', 'tr']; // en is default, not needed in here!
  53. if (language != null) {
  54. this.MyLanguage = language;
  55. }
  56. },
  57. members: {
  58. MyLanguage: "en",
  59. Languages: null,
  60. Data: null,
  61.  
  62. loadData: function (language) {
  63. var l = this.Languages.indexOf(language);
  64.  
  65. if (l < 0) {
  66. this.Data = null;
  67. return;
  68. }
  69.  
  70. this.Data = new Object();
  71. this.Data["Collect all packages"] = ["Alle Pakete einsammeln", "Recolher todos os pacotes", "Récupérez tous les paquets", "Tüm paketleri topla"][l];
  72. this.Data["Overall production"] = ["Produktionsübersicht", "Produção global", "La production globale", "Genel üretim"][l];
  73. this.Data["Army overview"] = ["Truppenübersicht", "Vista Geral de Exército", "Armée aperçu", "Ordu önizlemesi"][l];
  74. this.Data["Base resources"] = ["Basis Ressourcen", "Recursos base", "ressources de base", "Üs önizlemesi"][l];
  75. this.Data["Main menu"] = ["Hauptmenü", "Menu Principal", "menu principal", "Ana menü"][l];
  76. this.Data["Repair all units"] = ["Alle Einheiten reparieren", "Reparar todas as unidades", "Réparer toutes les unités", "Tüm üniteleri onar"][l];
  77. this.Data["Repair all defense buildings"] = ["Alle Verteidigungsgebäude reparieren", "Reparar todos os edifícios de defesa", "Réparer tous les bâtiments de défense", "Tüm savunma binalarını onar"][l];
  78. this.Data["Repair all buildings"] = ["Alle Gebäurde reparieren", "Reparar todos os edifícios", "Réparer tous les bâtiments", "Tüm binaları onar"][l];
  79. this.Data["Base status overview"] = ["Basisübersicht", "Estado geral da base", "aperçu de l'état de base", "Üs durumu önizlemesi"][l];
  80. this.Data["Upgrade priority overview"] = ["Upgrade Übersicht", "Prioridade de upgrades", "aperçu des priorités de mise à niveau", "Yükseltme önceliği önizlemesi"][l];
  81. this.Data["MaelstromTools Preferences"] = ["MaelstromTools Einstellungen", "Preferências de MaelstromTools", "Préférences MaelstromTools", "MaelstromTools Ayarları"][l];
  82. this.Data["Options"] = ["Einstellungen", "Opções", "Options", "Seçenekler"][l];
  83. this.Data["Target out of range, no resource calculation possible"] = ["Ziel nicht in Reichweite, kann die plünderbaren Ressourcen nicht berechnen", "Alvo fora do alcance, não é possivel calcular os recursos", "Cible hors de portée, pas de calcul de ressources possible",
  84. "Hedef menzil dışında, kaynak hesaplaması olanaksız"][l];
  85. this.Data["Lootable resources"] = ["Plünderbare Ressourcen", "Recursos roubáveis", "Ressources à piller", "Yağmalanabilir kaynaklar"][l];
  86. this.Data["per CP"] = ["pro KP", "por PC", "par PC", "KP başına"][l];
  87. this.Data["2nd run"] = ["2. Angriff", "2º ataque", "2° attaque", "2. saldırı"][l];
  88. this.Data["3rd run"] = ["3. Angriff", "3º ataque", "3° attaque", "3. saldırı"][l];
  89. this.Data["Calculating resources..."] = ["Berechne plünderbare Ressourcen...", "A calcular recursos...", "calcul de ressources ...", "Kaynaklar hesaplanıyor..."][l];
  90. this.Data["Next MCV"] = ["MBF", "MCV", "VCM"][l];
  91. this.Data["Show time to next MCV"] = ["Zeige Zeit bis zum nächsten MBF", "Mostrar tempo restante até ao próximo MCV", "Afficher l'heure pour le prochain VCM ", "Sırdaki MCV için gereken süreyi göster"][l];
  92. this.Data["Show lootable resources (restart required)"] = ["Zeige plünderbare Ressourcen (Neustart nötig)", "Mostrar recursos roubáveis (é necessário reiniciar)", "Afficher les ressources fouiller (redémarrage nécessaire)", "Yağmalanabilir kaynakları göster (yeniden başlatma gerekli)"][l];
  93. this.Data["Use dedicated Main Menu (restart required)"] = ["Verwende extra Hauptmenü (Neustart nötig)", "Usar botão para o Menu Principal (é necessário reiniciar)", "Utiliser dédiée du menu principal (redémarrage nécessaire)", "Ana menü tuşunu kullan (yeniden başlatma gerekli)"][l];
  94. this.Data["Autocollect packages"] = ["Sammle Pakete automatisch", "Auto recolher pacotes", "paquets autocollecté", "Paketleri otomatik topla"][l];
  95. this.Data["Autorepair units"] = ["Repariere Einheiten automatisch", "Auto reparar o exército", "unités autoréparé", "Üniteleri otomatik onar"][l];
  96. this.Data["Autorepair defense (higher prio than buildings)"] = ["Repariere Verteidigung automatisch (höhere Prio als Gebäude)", "Auto reparar defesa (maior prioridade do que os edifícios)", "réparation automatique la défense (priorité plus élevé que les bâtiments) ", "Savunmayı otomatik onar (binalardan daha yüksek öncelikli olarak)"][l];
  97. this.Data["Autorepair buildings"] = ["Repariere Gebäude automatisch", "Auto reparar edifícios", "bâtiments autoréparé", "Binaları otomatik onar"][l];
  98. this.Data["Automatic interval in minutes"] = ["Auto-Intervall in Minuten", "Intervalo de tempo automático (em minutos)", "intervalle automatique en quelques minutes", "Otomatik toplama aralığı (dk)"][l];
  99. this.Data["Apply changes"] = ["Speichern", "Confirmar", "Appliquer changements", "Uygula"][l];
  100. this.Data["Discard changes"] = ["Abbrechen", "Cancelar", "Annuler changements", "İptal"][l];
  101. this.Data["Reset to default"] = ["Auf Standard zurücksetzen", "Definições padrão", "Réinitialiser", "Sıfırla"][l];
  102. this.Data["Continuous"] = ["Kontinuierlich", "Contínua", "continue", "Sürekli"][l];
  103. this.Data["Bonus"] = ["Pakete", "Bónus", "Bonus", "Bonus"][l];
  104. this.Data["POI"] = ["POI", "POI", "POI", "POI"][l];
  105. this.Data["Total / h"] = ["Gesamt / h", "Total / h", "Total / h", "Toplam / sa."][l];
  106. this.Data["Repaircharges"] = ["Reparaturzeiten", "Custo de reparação", "frais de réparation", "Onarım maliyeti"][l];
  107. this.Data["Repairtime"] = ["Max. verfügbar", "Tempo de reparação", "Temps de réparation", "Onarım süresi"][l];
  108. this.Data["Attacks"] = ["Angriffe", "Ataques", "Attaques", "Saldırılar"][l];
  109. this.Data[MaelstromTools.Statics.Infantry] = ["Infanterie", "Infantaria", "Infanterie", "Piyade"][l];
  110. this.Data[MaelstromTools.Statics.Vehicle] = ["Fahrzeuge", "Veículos", "Vehicule", "Motorlu B."][l];
  111. this.Data[MaelstromTools.Statics.Aircraft] = ["Flugzeuge", "Aeronaves", "Aviation", "Hava A."][l];
  112. this.Data[MaelstromTools.Statics.Tiberium] = ["Tiberium", "Tibério", "Tiberium", "Tiberium"][l];
  113. this.Data[MaelstromTools.Statics.Crystal] = ["Kristalle", "Cristal", "Cristal", "Kristal"][l];
  114. this.Data[MaelstromTools.Statics.Power] = ["Strom", "Potência", "Energie", "Güç"][l];
  115. this.Data[MaelstromTools.Statics.Dollar] = ["Credits", "Créditos", "Crédit", "Kredi"][l];
  116. this.Data[MaelstromTools.Statics.Research] = ["Forschung", "Investigação", "Recherche", "Araştırma"][l];
  117. this.Data["Base"] = ["Basis", "Base", "Base", "Üs"][l];
  118. this.Data["Defense"] = ["Verteidigung", "Defesa", "Défense", "Savunma"][l];
  119. this.Data["Army"] = ["Armee", "Exército", "Armée", "Ordu"][l];
  120. this.Data["Level"] = ["Stufe", "Nível", "Niveau", "Seviye"][l];
  121. this.Data["Buildings"] = ["Gebäude", "Edifícios", "Bâtiments", "Binalar"][l];
  122. this.Data["Health"] = ["Leben", "Vida", "Santé", "Sağlık"][l];
  123. this.Data["Units"] = ["Einheiten", "Unidades", "Unités", "Üniteler"][l];
  124. this.Data["Hide Mission Tracker"] = ["Missionsfenster ausblenden", "Esconder janela das Missões", "Cacher la fenêtre de mission", "Görev İzleyicisini Gizle"][l];
  125. this.Data["none"] = ["keine", "nenhum", "aucun", "hiçbiri"][l];
  126. this.Data["Cooldown"] = ["Cooldown", "Relocalização", "Recharge", "Cooldown"][l];
  127. this.Data["Protection"] = ["Geschützt bis", "Protecção", "Protection", "Koruma"][l];
  128. this.Data["Available weapon"] = ["Verfügbare Artillerie", "Apoio disponível", "arme disponible", "Mevcut silah"][l];
  129. this.Data["Calibrated on"] = ["Kalibriert auf", "Calibrado em", "Calibré sur ", "Kalibreli"][l];
  130. this.Data["Total resources"] = ["Gesamt", "Total de recursos", "Ressources totales", "Toplam kaynaklar"][l];
  131. this.Data["Max. storage"] = ["Max. Kapazität", "Armazenamento Máx.", "Max. de stockage", "Maks. Depo"][l];
  132. this.Data["Storage full!"] = ["Lager voll!", "Armazenamento cheio!", "Stockage plein", "Depo dolu!"][l];
  133. this.Data["Storage"] = ["Lagerstand", "Armazenamento", "Stockage", "Depo"][l];
  134. this.Data["display only top buildings"] = ["Nur Top-Gebäude anzeigen", "Mostrar apenas melhores edifícios", "afficher uniquement les bâtiments principaux", "yalnızca en iyi binaları göster"][l];
  135. this.Data["display only affordable buildings"] = ["Nur einsetzbare Gebäude anzeigen", "Mostrar apenas edíficios acessíveis", "afficher uniquement les bâtiments abordables", "yalnızca satın alınabilir binaları göster"][l];
  136. this.Data["City"] = ["Stadt", "Base", "Base", "Şehir"][l];
  137. this.Data["Type (coord)"] = ["Typ (Koord.)", "Escrever (coord)", "Type (coord)", "Tip (koord.)"][l];
  138. this.Data["to Level"] = ["Auf Stufe", "para nível", "à Niveau ", "Seviye için"][l];
  139. this.Data["Gain/h"] = ["Zuwachs/h", "Melhoria/h", "Gain / h", "Kazanç / sa."][l];
  140. this.Data["Factor"] = ["Faktor", "Factor", "Facteur", "Faktör"][l];
  141. this.Data["Tib/gain"] = ["Tib./Zuwachs", "Tib/melhoria", "Tib / gain", "Tib/Kazanç"][l];
  142. this.Data["Pow/gain"] = ["Strom/Zuwachs", "Potencia/melhoria", "Puissance / Gain", "Güç/Kazanç"][l];
  143. this.Data["ETA"] = ["Verfügbar in", "Tempo restante", "Temps restant", "Kalan Zaman"][l];
  144. this.Data["Upgrade"] = ["Aufrüsten", "Upgrade", "Upgrade", "Yükselt"][l];
  145. this.Data["Powerplant"] = ["Kratfwerk", "Central de Energia", "Centrale", "Güç Santrali"][l];
  146. this.Data["Refinery"] = ["Raffinerie", "Refinaria", "Raffinerie", "Rafineri"][l];
  147. this.Data["Harvester"] = ["Sammler", "Harvester", "Collecteur", "Biçerdöver"][l];
  148. this.Data["Silo"] = ["Silo", "Silo", "Silo", "Silo"][l];
  149. this.Data["Accumulator"] = ["Akkumulator", "Acumulador", "Accumulateur", "Akümülatör"][l];
  150. this.Data["Calibrate support"] = ["Artillerie kalibrieren", "Calibrar apoio", "Calibrer soutien", "Takviyeyi kalibre et"][l];
  151. this.Data["Access"] = ["Öffne", "Aceder", "Accès ", "Aç"][l];
  152. this.Data["Focus on"] = ["Zentriere auf", "Concentrar em", "Centré sur", "Odaklan"][l];
  153. this.Data["Possible attacks from this base (available CP)"] = ["Mögliche Angriffe (verfügbare KP)", "Possible attacks from this base (available CP)","Possible attacks from this base (available CP)", "Bu üsten yapılması mümkün olan saldırılar (mevcut KP)"][l];
  154. //this.Data[""] = [""][l];
  155. },
  156. get: function (ident) {
  157. return this.gt(ident);
  158. },
  159. gt: function (ident) {
  160. if (!this.Data || !this.Data[ident]) {
  161. /*if(!parseInt(ident.substr(0, 1), 10) && ident != "0") {
  162. console.log("missing language data: " + ident);
  163. }*/
  164. return ident;
  165. }
  166. return this.Data[ident];
  167. }
  168. }
  169. }),
  170.  
  171. // define Base
  172. qx.Class.define("MaelstromTools.Base", {
  173. type: "singleton",
  174. extend: qx.core.Object,
  175. members: {
  176. /* Desktop */
  177. timerInterval: 1500,
  178. mainTimerInterval: 5000,
  179. lootStatusInfoInterval: null,
  180. images: null,
  181. mWindows: null,
  182. mainMenuWindow: null,
  183.  
  184. itemsOnDesktop: null,
  185. itemsOnDesktopCount: null,
  186. itemsInMainMenu: null,
  187. itemsInMainMenuCount: null,
  188. buttonCollectAllResources: null,
  189. buttonRepairAllUnits: null,
  190. buttonRepairAllBuildings: null,
  191.  
  192. lootWidget: null,
  193.  
  194. initialize: function () {
  195. try {
  196. //console.log(qx.locale.Manager.getInstance().getLocale());
  197. Lang.loadData(qx.locale.Manager.getInstance().getLocale());
  198. //console.log("Client version: " + MaelstromTools.Wrapper.GetClientVersion());
  199. this.itemsOnDesktopCount = new Array();
  200. this.itemsOnDesktop = new Object();
  201. this.itemsInMainMenuCount = new Array();
  202. this.itemsInMainMenu = new Object();
  203.  
  204. var fileManager = ClientLib.File.FileManager.GetInstance();
  205. //ui/icons/icon_mainui_defense_button
  206. //ui/icons/icon_mainui_base_button
  207. //ui/icons/icon_army_points
  208. //icon_def_army_points
  209. var factionText = ClientLib.Base.Util.GetFactionGuiPatchText();
  210. this.createNewImage(MaelstromTools.Statics.Tiberium, "ui/common/icn_res_tiberium.png", fileManager);
  211. this.createNewImage(MaelstromTools.Statics.Crystal, "ui/common/icn_res_chrystal.png", fileManager);
  212. this.createNewImage(MaelstromTools.Statics.Power, "ui/common/icn_res_power.png", fileManager);
  213. this.createNewImage(MaelstromTools.Statics.Dollar, "ui/common/icn_res_dollar.png", fileManager);
  214. this.createNewImage(MaelstromTools.Statics.Research, "ui/common/icn_res_research.png", fileManager);
  215. this.createNewImage("Sum", "ui/common/icn_build_slots.png", fileManager);
  216. this.createNewImage("AccessBase", "ui/" + factionText + "/icons/icon_mainui_enterbase.png", fileManager);
  217. this.createNewImage("FocusBase", "ui/" + factionText + "/icons/icon_mainui_focusbase.png", fileManager);
  218. this.createNewImage("Packages", "ui/" + factionText + "/icons/icon_collect_packages.png", fileManager);
  219. this.createNewImage("RepairAllUnits", "ui/" + factionText + "/icons/icon_army_points.png", fileManager);
  220. this.createNewImage("RepairAllBuildings", "ui/" + factionText + "/icons/icn_build_slots.png", fileManager);
  221. this.createNewImage("ResourceOverviewMenu", "ui/common/icn_res_chrystal.png", fileManager);
  222. this.createNewImage("ProductionMenu", "ui/" + factionText + "/icons/icn_build_slots.png", fileManager);
  223. this.createNewImage("RepairTimeMenu", "ui/" + factionText + "/icons/icon_repair_all_button.png", fileManager);
  224. this.createNewImage("Crosshair", "ui/icons/icon_support_tnk_white.png", fileManager);
  225. this.createNewImage("UpgradeBuilding", "ui/" + factionText + "/icons/icon_building_detail_upgrade.png", fileManager);
  226.  
  227. this.createNewWindow("MainMenu", "R", 125, 140, 120, 100, "B");
  228. this.createNewWindow("Production", "L", 120, 60, 340, 140);
  229. this.createNewWindow("RepairTime", "L", 120, 60, 340, 140);
  230. this.createNewWindow("ResourceOverview", "L", 120, 60, 340, 140);
  231. this.createNewWindow("BaseStatusOverview", "L", 120, 60, 340, 140);
  232. this.createNewWindow("Preferences", "L", 120, 60, 440, 140);
  233. this.createNewWindow("UpgradePriority", "L", 120, 60, 870, 400);
  234.  
  235. if (!this.mainMenuWindow) {
  236. this.mainMenuWindow = new qx.ui.popup.Popup(new qx.ui.layout.Canvas()).set({
  237. //backgroundColor: "#303030",
  238. padding: 5,
  239. paddingRight: 0
  240. });
  241. if (MT_Preferences.Settings.useDedicatedMainMenu) {
  242. this.mainMenuWindow.setPlaceMethod("mouse");
  243. this.mainMenuWindow.setPosition("top-left");
  244. } else {
  245. this.mainMenuWindow.setPlaceMethod("widget");
  246. this.mainMenuWindow.setPosition("bottom-right");
  247. this.mainMenuWindow.setAutoHide(false);
  248. this.mainMenuWindow.setBackgroundColor("transparent");
  249. this.mainMenuWindow.setShadow(null);
  250. this.mainMenuWindow.setDecorator(new qx.ui.decoration.Background());
  251. }
  252. }
  253.  
  254. var desktopPositionModifier = 0;
  255.  
  256. this.buttonCollectAllResources = this.createDesktopButton(Lang.gt("Collect all packages"), "Packages", true, this.desktopPosition(desktopPositionModifier));
  257. this.buttonCollectAllResources.addListener("execute", this.collectAllPackages, this);
  258.  
  259. var openProductionWindowButton = this.createDesktopButton(Lang.gt("Overall production"), "ProductionMenu", false, this.desktopPosition(desktopPositionModifier));
  260. openProductionWindowButton.addListener("execute", function () {
  261. window.MaelstromTools.Production.getInstance().openWindow("Production", Lang.gt("Overall production"));
  262. }, this);
  263.  
  264. var openResourceOverviewWindowButton = this.createDesktopButton(Lang.gt("Base resources"), "ResourceOverviewMenu", false, this.desktopPosition(desktopPositionModifier));
  265. openResourceOverviewWindowButton.addListener("execute", function () {
  266. window.MaelstromTools.ResourceOverview.getInstance().openWindow("ResourceOverview", Lang.gt("Base resources"));
  267. }, this);
  268.  
  269. desktopPositionModifier++;
  270. var openMainMenuButton = this.createDesktopButton(Lang.gt("Main menu"), "ProductionMenu", false, this.desktopPosition(desktopPositionModifier));
  271. openMainMenuButton.addListener("click", function (e) {
  272. this.mainMenuWindow.placeToMouse(e);
  273. this.mainMenuWindow.show();
  274. }, this);
  275.  
  276. this.buttonRepairAllUnits = this.createDesktopButton(Lang.gt("Repair all units"), "RepairAllUnits", true, this.desktopPosition(desktopPositionModifier));
  277. this.buttonRepairAllUnits.addListener("execute", this.repairAllUnits, this);
  278.  
  279. this.buttonRepairAllBuildings = this.createDesktopButton(Lang.gt("Repair all buildings"), "RepairAllBuildings", true, this.desktopPosition(desktopPositionModifier));
  280. this.buttonRepairAllBuildings.addListener("execute", this.repairAllBuildings, this);
  281.  
  282. var openRepairTimeWindowButton = this.createDesktopButton(Lang.gt("Army overview"), "RepairTimeMenu", false, this.desktopPosition(desktopPositionModifier));
  283. openRepairTimeWindowButton.addListener("execute", function () {
  284. window.MaelstromTools.RepairTime.getInstance().openWindow("RepairTime", Lang.gt("Army overview"));
  285. }, this);
  286.  
  287. var openBaseStatusOverview = this.createDesktopButton(Lang.gt("Base status overview"), "Crosshair", false, this.desktopPosition(desktopPositionModifier));
  288. openBaseStatusOverview.addListener("execute", function () {
  289. window.MaelstromTools.BaseStatus.getInstance().openWindow("BaseStatusOverview", Lang.gt("Base status overview"));
  290. }, this);
  291.  
  292. desktopPositionModifier++;
  293. var openHuffyUpgradeOverview = this.createDesktopButton(Lang.gt("Upgrade priority overview"), "UpgradeBuilding", false, this.desktopPosition(desktopPositionModifier));
  294. openHuffyUpgradeOverview.addListener("execute", function () {
  295. window.HuffyTools.UpgradePriorityGUI.getInstance().openWindow("UpgradePriority", Lang.gt("Upgrade priority overview"));
  296. }, this);
  297.  
  298. desktopPositionModifier++;
  299. var preferencesButton = new qx.ui.form.Button(Lang.gt("Options")).set({
  300. appearance: "button-text-small",
  301. width: 100,
  302. minWidth: 100,
  303. maxWidth: 100
  304. });
  305. preferencesButton.setUserData("desktopPosition", this.desktopPosition(desktopPositionModifier));
  306. preferencesButton.addListener("execute", function () {
  307. window.MaelstromTools.Preferences.getInstance().openWindow("Preferences", Lang.gt("MaelstromTools Preferences"), true);
  308. }, this);
  309.  
  310. if (MT_Preferences.Settings.useDedicatedMainMenu) {
  311. this.addToDesktop("MainMenu", openMainMenuButton);
  312. }
  313. this.addToMainMenu("ResourceOverviewMenu", openResourceOverviewWindowButton);
  314. this.addToMainMenu("ProductionMenu", openProductionWindowButton);
  315. this.addToMainMenu("BaseStatusMenu", openBaseStatusOverview);
  316. this.addToMainMenu("RepairTimeMenu", openRepairTimeWindowButton);
  317. this.addToMainMenu("UpgradeBuilding", openHuffyUpgradeOverview);
  318.  
  319. this.addToMainMenu("PreferencesMenu", preferencesButton);
  320.  
  321. if (!MT_Preferences.Settings.useDedicatedMainMenu) {
  322. this.mainMenuWindow.show();
  323. var target = qx.core.Init.getApplication().getOptionsBar(); //getServerBar(); //qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_APPOINTMENTS);
  324. this.mainMenuWindow.placeToWidget(target, true);
  325. }
  326.  
  327. webfrontend.gui.chat.ChatWidget.recvbufsize = MaelstromTools.LocalStorage.get(MaelstromTools.Preferences.CHATHISTORYLENGTH, 64);
  328. this.runSecondlyTimer();
  329. this.runMainTimer();
  330. this.runAutoCollectTimer();
  331. } catch (e) {
  332. console.log("MaelstromTools.initialize: ", e);
  333. }
  334. },
  335.  
  336. desktopPosition: function (modifier) {
  337. if (!modifier) modifier = 0;
  338. return modifier;
  339. },
  340.  
  341. createDesktopButton: function (title, imageName, isNotification, desktopPosition) {
  342. try {
  343. if (!isNotification) {
  344. isNotification = false;
  345. }
  346. if (!desktopPosition) {
  347. desktopPosition = this.desktopPosition();
  348. }
  349. var desktopButton = new qx.ui.form.Button(null, this.images[imageName]).set({
  350. toolTipText: title,
  351. width: 50,
  352. height: 40,
  353. maxWidth: 50,
  354. maxHeight: 40,
  355. appearance: (isNotification ? "button-standard-nod" : "button-playarea-mode-frame"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  356. center: true
  357. });
  358.  
  359. desktopButton.setUserData("isNotification", isNotification);
  360. desktopButton.setUserData("desktopPosition", desktopPosition);
  361. return desktopButton;
  362. } catch (e) {
  363. console.log("MaelstromTools.createDesktopButton: ", e);
  364. }
  365. },
  366.  
  367. createNewImage: function (name, path, fileManager) {
  368. try {
  369. if (!this.images) {
  370. this.images = new Object();
  371. }
  372. if (!fileManager) {
  373. return;
  374. }
  375.  
  376. this.images[name] = fileManager.GetPhysicalPath(path);
  377. } catch (e) {
  378. console.log("MaelstromTools.createNewImage: ", e);
  379. }
  380. },
  381.  
  382. createNewWindow: function (name, align, x, y, w, h, alignV) {
  383. try {
  384. if (!this.mWindows) {
  385. this.mWindows = new Object();
  386. }
  387. this.mWindows[name] = new Object();
  388. this.mWindows[name]["Align"] = align;
  389. this.mWindows[name]["AlignV"] = alignV;
  390. this.mWindows[name]["x"] = x;
  391. this.mWindows[name]["y"] = y;
  392. this.mWindows[name]["w"] = w;
  393. this.mWindows[name]["h"] = h;
  394. } catch (e) {
  395. console.log("MaelstromTools.createNewWindow: ", e);
  396. }
  397. },
  398.  
  399. addToMainMenu: function (name, button) {
  400. try {
  401. /*if(!this.useDedicatedMainMenu) {
  402. return;
  403. }*/
  404. if (this.itemsInMainMenu[name] != null) {
  405. return;
  406. }
  407. var desktopPosition = button.getUserData("desktopPosition");
  408. var isNotification = button.getUserData("isNotification");
  409. if (!desktopPosition) {
  410. desktopPosition = this.desktopPosition();
  411. }
  412. if (!isNotification) {
  413. isNotification = false;
  414. }
  415.  
  416. if (isNotification && MT_Preferences.Settings.useDedicatedMainMenu) {
  417. this.addToDesktop(name, button);
  418. } else {
  419. if (!this.itemsInMainMenuCount[desktopPosition]) {
  420. this.itemsInMainMenuCount[desktopPosition] = 0;
  421. }
  422. this.mainMenuWindow.add(button, {
  423. right: 5 + (52 * this.itemsInMainMenuCount[desktopPosition]),
  424. top: 0 + (42 * (desktopPosition)) //bottom: 0 - (42 * (desktopPosition - 1))
  425. });
  426.  
  427. this.itemsInMainMenu[name] = button;
  428. this.itemsInMainMenuCount[desktopPosition]++;
  429. }
  430. } catch (e) {
  431. console.log("MaelstromTools.addToMainMenu: ", e);
  432. }
  433. },
  434.  
  435. removeFromMainMenu: function (name, rearrange) {
  436. try {
  437. if (rearrange == null) {
  438. rearrange = true;
  439. }
  440. if (this.itemsOnDesktop[name] != null) {
  441. var isNotification = this.itemsOnDesktop[name].getUserData("isNotification");
  442. if (!isNotification) {
  443. isNotification = false;
  444. }
  445. if (isNotification && MT_Preferences.Settings.useDedicatedMainMenu) {
  446. this.removeFromDesktop(name, rearrange);
  447. }
  448. } else if (this.itemsInMainMenu[name] != null) {
  449. var desktopPosition = this.itemsInMainMenu[name].getUserData("desktopPosition");
  450. var isNotification = this.itemsInMainMenu[name].getUserData("isNotification");
  451. if (!desktopPosition) {
  452. desktopPosition = this.desktopPosition();
  453. }
  454. if (!isNotification) {
  455. isNotification = false;
  456. }
  457.  
  458. this.mainMenuWindow.remove(this.itemsInMainMenu[name]);
  459. this.itemsInMainMenu[name] = null;
  460. this.itemsInMainMenuCount[desktopPosition]--;
  461.  
  462. if (rearrange && this.itemsInMainMenu[desktopPosition] > 1) {
  463. var tmpItems = new Object();
  464. // remove notifications
  465. for (var itemName in this.itemsOnDesktop) {
  466. if (this.itemsInMainMenu[itemName] == null) {
  467. continue;
  468. }
  469. if (!isNotification) {
  470. continue;
  471. }
  472. tmpItems[itemName] = this.itemsInMainMenu[itemName];
  473. this.removeFromMainMenu(itemName, false);
  474. }
  475. // rearrange notifications
  476. for (var itemName2 in tmpItems) {
  477. var tmp = tmpItems[itemName2];
  478. if (tmp == null) {
  479. continue;
  480. }
  481. this.addToMainMenu(itemName2, tmp);
  482. }
  483. }
  484. }
  485. } catch (e) {
  486. console.log("MaelstromTools.removeFromDesktop: ", e);
  487. }
  488. },
  489.  
  490. addToDesktop: function (name, button) {
  491. try {
  492. if (this.itemsOnDesktop[name] != null) {
  493. return;
  494. }
  495. var desktopPosition = button.getUserData("desktopPosition");
  496. if (!desktopPosition) {
  497. desktopPosition = this.desktopPosition();
  498. }
  499.  
  500. if (!this.itemsOnDesktopCount[desktopPosition]) {
  501. this.itemsOnDesktopCount[desktopPosition] = 0;
  502. }
  503.  
  504. var app = qx.core.Init.getApplication();
  505. //var navBar = app.getNavigationBar();
  506.  
  507. // console.log("add to Desktop at pos: " + this.itemsOnDesktopCount);
  508. app.getDesktop().add(button, {
  509. //right: navBar.getBounds().width + (52 * this.itemsOnDesktopCount[desktopPosition]),
  510. //top: 42 * (desktopPosition - 1)
  511. right: 5 + (52 * this.itemsOnDesktopCount[desktopPosition]),
  512. //top: this.initialAppointmentBarHeight + 125 + (42 * (desktopPosition - 1))
  513. bottom: 140 - (42 * (desktopPosition - 1))
  514. });
  515.  
  516. this.itemsOnDesktop[name] = button;
  517. this.itemsOnDesktopCount[desktopPosition]++;
  518. } catch (e) {
  519. console.log("MaelstromTools.addToDesktop: ", e);
  520. }
  521. },
  522.  
  523. removeFromDesktop: function (name, rearrange) {
  524. try {
  525. if (rearrange == null) {
  526. rearrange = true;
  527. }
  528. var app = qx.core.Init.getApplication();
  529.  
  530. if (this.itemsOnDesktop[name] != null) {
  531. var desktopPosition = this.itemsOnDesktop[name].getUserData("desktopPosition");
  532. var isNotification = this.itemsOnDesktop[name].getUserData("isNotification");
  533. if (!desktopPosition) {
  534. desktopPosition = this.desktopPosition();
  535. }
  536. if (!isNotification) {
  537. isNotification = false;
  538. }
  539.  
  540. app.getDesktop().remove(this.itemsOnDesktop[name]);
  541. this.itemsOnDesktop[name] = null;
  542. this.itemsOnDesktopCount[desktopPosition]--;
  543.  
  544. if (rearrange && this.itemsOnDesktopCount[desktopPosition] > 1) {
  545. var tmpItems = new Object();
  546. // remove notifications
  547. for (var itemName in this.itemsOnDesktop) {
  548. if (this.itemsOnDesktop[itemName] == null) {
  549. continue;
  550. }
  551. if (!this.itemsOnDesktop[itemName].getUserData("isNotification")) {
  552. continue;
  553. }
  554. tmpItems[itemName] = this.itemsOnDesktop[itemName];
  555. this.removeFromDesktop(itemName, false);
  556. }
  557. // rearrange notifications
  558. for (var itemName2 in tmpItems) {
  559. var tmp = tmpItems[itemName2];
  560. if (tmp == null) {
  561. continue;
  562. }
  563. this.addToMainMenu(itemName2, tmp);
  564. }
  565. }
  566. }
  567. } catch (e) {
  568. console.log("MaelstromTools.removeFromDesktop: ", e);
  569. }
  570. },
  571.  
  572. runSecondlyTimer: function () {
  573. try {
  574. this.calculateCostsForNextMCV();
  575.  
  576. var self = this;
  577. window.setTimeout(function () {
  578. self.runSecondlyTimer();
  579. }, 1000);
  580. } catch (e) {
  581. console.log("MaelstromTools.runSecondlyTimer: ", e);
  582. }
  583. },
  584.  
  585. runMainTimer: function () {
  586. try {
  587. this.checkForPackages();
  588. if (CCTAWrapperIsInstalled()) {
  589. this.checkRepairAllUnits();
  590. this.checkRepairAllBuildings();
  591. }
  592.  
  593. var missionTracker = typeof (qx.core.Init.getApplication().getMissionsBar) === 'function' ? qx.core.Init.getApplication().getMissionsBar() : qx.core.Init.getApplication().getMissionTracker(); //fix for PerforceChangelist>=376877
  594. if (MT_Preferences.Settings.autoHideMissionTracker) {
  595. if (missionTracker.isVisible()) {
  596. missionTracker.hide();
  597. }
  598. if (typeof (qx.core.Init.getApplication().getMissionsBar) === 'function') {
  599. if (qx.core.Init.getApplication().getMissionsBar().getSizeHint().height != 0) {
  600. qx.core.Init.getApplication().getMissionsBar().getSizeHint().height = 0;
  601. qx.core.Init.getApplication().triggerDesktopResize();
  602. }
  603. }
  604. } else {
  605. if (!missionTracker.isVisible()) {
  606. missionTracker.show();
  607. if (typeof (qx.core.Init.getApplication().getMissionsBar) === 'function') {
  608. qx.core.Init.getApplication().getMissionsBar().initHeight();
  609. qx.core.Init.getApplication().triggerDesktopResize();
  610. }
  611. }
  612. }
  613. var self = this;
  614. window.setTimeout(function () {
  615. self.runMainTimer();
  616. }, this.mainTimerInterval);
  617. } catch (e) {
  618. console.log("MaelstromTools.runMainTimer: ", e);
  619. }
  620. },
  621.  
  622. runAutoCollectTimer: function () {
  623. try {
  624. //console.log("runAutoCollectTimer ", MT_Preferences.Settings.AutoCollectTimer);
  625. if (!CCTAWrapperIsInstalled()) return; // run timer only then wrapper is running
  626. if (this.checkForPackages() && MT_Preferences.Settings.autoCollectPackages) {
  627. this.collectAllPackages();
  628. }
  629. if (this.checkRepairAllUnits() && MT_Preferences.Settings.autoRepairUnits) {
  630. this.repairAllUnits();
  631. }
  632. if (this.checkRepairAllBuildings() && MT_Preferences.Settings.autoRepairBuildings) {
  633. this.repairAllBuildings();
  634. }
  635.  
  636. var self = this;
  637. window.setTimeout(function () {
  638. self.runAutoCollectTimer();
  639. }, MT_Preferences.Settings.AutoCollectTimer * 60000);
  640. } catch (e) {
  641. console.log("MaelstromTools.runMainTimer: ", e);
  642. }
  643. },
  644.  
  645. openWindow: function (windowObj, windowName, skipMoveWindow) {
  646. try {
  647. if (!windowObj.isVisible()) {
  648. if (windowName == "MainMenu") {
  649. windowObj.show();
  650. } else {
  651. if (!skipMoveWindow) {
  652. this.moveWindow(windowObj, windowName);
  653. }
  654. windowObj.open();
  655. }
  656. }
  657. } catch (e) {
  658. console.log("MaelstromTools.openWindow: ", e);
  659. }
  660. },
  661.  
  662. moveWindow: function (windowObj, windowName) {
  663. try {
  664. var x = this.mWindows[windowName]["x"];
  665. var y = this.mWindows[windowName]["y"];
  666. if (this.mWindows[windowName]["Align"] == "R") {
  667. x = qx.bom.Viewport.getWidth(window) - this.mWindows[windowName]["x"];
  668. }
  669. if (this.mWindows[windowName]["AlignV"] == "B") {
  670. y = qx.bom.Viewport.getHeight(window) - this.mWindows[windowName]["y"] - windowObj.height;
  671. }
  672. windowObj.moveTo(x, y);
  673. if (windowName != "MainMenu") {
  674. windowObj.setHeight(this.mWindows[windowName]["h"]);
  675. windowObj.setWidth(this.mWindows[windowName]["w"]);
  676. }
  677. } catch (e) {
  678. console.log("MaelstromTools.moveWindow: ", e);
  679. }
  680. },
  681.  
  682. checkForPackages: function () {
  683. try {
  684. MT_Cache.updateCityCache();
  685.  
  686. for (var cname in MT_Cache.Cities) {
  687. var ncity = MT_Cache.Cities[cname].Object;
  688. if (ncity.get_CityBuildingsData().get_HasCollectableBuildings()) {
  689. this.addToMainMenu("CollectAllResources", this.buttonCollectAllResources);
  690. return true;
  691. }
  692. }
  693. this.removeFromMainMenu("CollectAllResources");
  694. return false;
  695. } catch (e) {
  696. console.log("MaelstromTools.checkForPackages: ", e);
  697. return false;
  698. }
  699. },
  700.  
  701. collectAllPackages: function () {
  702. try {
  703. MT_Cache.updateCityCache();
  704. for (var cname in MT_Cache.Cities) {
  705. var ncity = MT_Cache.Cities[cname].Object;
  706. if (ncity.get_CityBuildingsData().get_HasCollectableBuildings()) {
  707. if (MT_Cache.CityCount <= 1) {
  708. var buildings = ncity.get_Buildings().d;
  709. for (var x in buildings) {
  710. var building = buildings[x];
  711. if (building.get_ProducesPackages() && building.get_ReadyToCollect()) {
  712. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("CollectResource",{cityid:ncity.get_Id(), posX:building.get_CoordX(),posY:building.get_CoordY()}, null, null, true);
  713. }
  714. }
  715. } else {
  716. ncity.CollectAllResources();
  717. }
  718. }
  719. }
  720. this.removeFromMainMenu("CollectAllResources");
  721. } catch (e) {
  722. console.log("MaelstromTools.collectAllPackages: ", e);
  723. }
  724. },
  725.  
  726. checkRepairAll: function (visMode, buttonName, button) {
  727. try {
  728. MT_Cache.updateCityCache();
  729.  
  730. for (var cname in MT_Cache.Cities) {
  731. var ncity = MT_Cache.Cities[cname].Object;
  732. if (MaelstromTools.Wrapper.CanRepairAll(ncity, visMode)) {
  733. this.addToMainMenu(buttonName, button);
  734. return true;
  735. }
  736. }
  737.  
  738. this.removeFromMainMenu(buttonName);
  739. return false;
  740. } catch (e) {
  741. console.log("MaelstromTools.checkRepairAll: ", e);
  742. return false;
  743. }
  744. },
  745.  
  746. checkRepairAllUnits: function () {
  747. return this.checkRepairAll(ClientLib.Vis.Mode.ArmySetup, "RepairAllUnits", this.buttonRepairAllUnits);
  748. },
  749.  
  750. checkRepairAllBuildings: function () {
  751. return this.checkRepairAll(ClientLib.Vis.Mode.City, "RepairAllBuildings", this.buttonRepairAllBuildings);
  752. },
  753.  
  754. repairAll: function (visMode, buttonName) {
  755. try {
  756. MT_Cache.updateCityCache();
  757.  
  758. for (var cname in MT_Cache.Cities) {
  759. var ncity = MT_Cache.Cities[cname].Object;
  760. if (MaelstromTools.Wrapper.CanRepairAll(ncity, visMode)) {
  761. MaelstromTools.Wrapper.RepairAll(ncity, visMode);
  762. }
  763.  
  764. }
  765. this.removeFromMainMenu(buttonName);
  766. } catch (e) {
  767. console.log("MaelstromTools.repairAll: ", e);
  768. }
  769. },
  770.  
  771. //ClientLib.Data.City.prototype.get_CityRepairData
  772. //ClientLib.Data.CityRepair.prototype.CanRepairAll
  773. //ClientLib.Data.CityRepair.prototype.RepairAll
  774. repairAllUnits: function () {
  775. try {
  776. this.repairAll(ClientLib.Vis.Mode.ArmySetup, "RepairAllUnits");
  777. } catch (e) {
  778. console.log("MaelstromTools.repairAllUnits: ", e);
  779. }
  780. },
  781.  
  782. repairAllBuildings: function () {
  783. try {
  784. this.repairAll(ClientLib.Vis.Mode.City, "RepairAllBuildings");
  785. } catch (e) {
  786. console.log("MaelstromTools.repairAllBuildings: ", e);
  787. }
  788. },
  789.  
  790. updateLoot: function (ident, visCity, widget) {
  791. try {
  792. clearInterval(this.lootStatusInfoInterval);
  793. if (!MT_Preferences.Settings.showLoot) {
  794. if (this.lootWidget[ident]) {
  795. this.lootWidget[ident].removeAll();
  796. }
  797. return;
  798. }
  799.  
  800. var baseLoadState = MT_Cache.updateLoot(visCity);
  801. if (baseLoadState == -2) { // base already cached and base not changed
  802. return;
  803. }
  804.  
  805. if (!this.lootWidget) {
  806. this.lootWidget = new Object();
  807. }
  808. if (!this.lootWidget[ident]) {
  809. this.lootWidget[ident] = new qx.ui.container.Composite(new qx.ui.layout.Grid(5, 5));
  810. this.lootWidget[ident].setTextColor("white");
  811. widget.add(this.lootWidget[ident]);
  812. }
  813. var lootWidget = this.lootWidget[ident];
  814.  
  815. var rowIdx = 1;
  816. var colIdx = 1;
  817. lootWidget.removeAll();
  818. switch (baseLoadState) {
  819. case -1:
  820. {
  821. MaelstromTools.Util.addLabel(lootWidget, rowIdx, colIdx++, "Target out of range, no resource calculation possible", null, null, 'bold', null);
  822. break;
  823. }
  824. case 1:
  825. {
  826. var Resources = MT_Cache.SelectedBaseResources;
  827. this.createResourceLabels(lootWidget, ++rowIdx, "Possible attacks from this base (available CP)", Resources, - 1);
  828. this.createResourceLabels(lootWidget, ++rowIdx, "Lootable resources", Resources, 1);
  829. this.createResourceLabels(lootWidget, ++rowIdx, "per CP", Resources, 1 * Resources.CPNeeded);
  830. this.createResourceLabels(lootWidget, ++rowIdx, "2nd run", Resources, 2 * Resources.CPNeeded);
  831. this.createResourceLabels(lootWidget, ++rowIdx, "3rd run", Resources, 3 * Resources.CPNeeded);
  832. break;
  833. }
  834. default:
  835. {
  836. MaelstromTools.Util.addLabel(lootWidget, rowIdx, colIdx++, "Calculating resources...", null, null, 'bold', null);
  837. this.lootStatusInfoInterval = setInterval(function () {
  838. MaelstromTools.Base.getInstance().updateLoot(ident, visCity, widget);
  839. }, 100);
  840. break;
  841. }
  842. }
  843. } catch (e) {
  844. console.log("MaelstromTools.updateLoot: ", e);
  845. }
  846. },
  847.  
  848. createResourceLabels: function (lootWidget, rowIdx, Label, Resources, Modifier) {
  849. var colIdx = 1;
  850. var font = (Modifier > 1 ? null : 'bold');
  851.  
  852. if (Modifier == -1 && Resources.CPNeeded > 0) {
  853. Label = Lang.gt(Label) + ": " + Math.floor(ClientLib.Data.MainData.GetInstance().get_Player().GetCommandPointCount() / Resources.CPNeeded);
  854. MaelstromTools.Util.addLabel(lootWidget, rowIdx, colIdx++, Label, null, 'left', font, null, 9);
  855. return;
  856. }
  857. colIdx = 1;
  858. if (Modifier > 0) {
  859. MaelstromTools.Util.addLabel(lootWidget, rowIdx, colIdx++, Lang.gt(Label) + ":", null, null, font);
  860. MaelstromTools.Util.addImage(lootWidget, rowIdx, colIdx++, MaelstromTools.Util.getImage(MaelstromTools.Statics.Research));
  861. MaelstromTools.Util.addLabel(lootWidget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(Resources[MaelstromTools.Statics.Research] / Modifier), 50, 'right', font);
  862. MaelstromTools.Util.addImage(lootWidget, rowIdx, colIdx++, MaelstromTools.Util.getImage(MaelstromTools.Statics.Tiberium));
  863. MaelstromTools.Util.addLabel(lootWidget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(Resources[MaelstromTools.Statics.Tiberium] / Modifier), 50, 'right', font);
  864. MaelstromTools.Util.addImage(lootWidget, rowIdx, colIdx++, MaelstromTools.Util.getImage(MaelstromTools.Statics.Crystal));
  865. MaelstromTools.Util.addLabel(lootWidget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(Resources[MaelstromTools.Statics.Crystal] / Modifier), 50, 'right', font);
  866. MaelstromTools.Util.addImage(lootWidget, rowIdx, colIdx++, MaelstromTools.Util.getImage(MaelstromTools.Statics.Dollar));
  867. MaelstromTools.Util.addLabel(lootWidget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(Resources[MaelstromTools.Statics.Dollar] / Modifier), 50, 'right', font);
  868. MaelstromTools.Util.addImage(lootWidget, rowIdx, colIdx++, MaelstromTools.Util.getImage("Sum"));
  869. MaelstromTools.Util.addLabel(lootWidget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(Resources["Total"] / Modifier), 50, 'right', font);
  870. }
  871. },
  872.  
  873. mcvPopup: null,
  874. mcvPopupX : 0,
  875. mcvPopupY : 0,
  876. mcvTimerLabel: null,
  877. calculateCostsForNextMCV: function () {
  878. try {
  879. if (!MT_Preferences.Settings.showCostsForNextMCV) {
  880. if (this.mcvPopup) {
  881. this.mcvPopup.close();
  882. }
  883. return;
  884. }
  885. var player = ClientLib.Data.MainData.GetInstance().get_Player();
  886. var cw = player.get_Faction();
  887. var cj = ClientLib.Base.Tech.GetTechIdFromTechNameAndFaction(ClientLib.Base.ETechName.Research_BaseFound, cw);
  888. var cr = player.get_PlayerResearch();
  889. var cd = cr.GetResearchItemFomMdbId(cj);
  890. if (cd == null) {
  891. if (this.mcvPopup) {
  892. this.mcvPopup.close();
  893. }
  894. return;
  895. }
  896.  
  897. if (!this.mcvPopup) {
  898. this.mcvPopup = new qx.ui.window.Window("").set({
  899. contentPadding : 0,
  900. showMinimize : false,
  901. showMaximize : false,
  902. showClose : false,
  903. resizable : false
  904. });
  905. this.mcvPopup.setLayout(new qx.ui.layout.VBox());
  906. this.mcvPopup.addListener("move", function (e) {
  907. var base = MaelstromTools.Base.getInstance();
  908. var size = qx.core.Init.getApplication().getRoot().getBounds();
  909. var value = size.width - e.getData().left;
  910. //Added sizeClientHeight and sizeClientWidth
  911. var sizeClientWidth = document.documentElement.clientWidth
  912. var sizeClientHeight = document.documentElement.clientHeight
  913. //Modified "base.mcvPopupX = value < 0 ? 150 : value;" to keep "x" of mcv timer
  914. //position from exceeding the window size.
  915. base.mcvPopupX = value < 0 || value > sizeClientWidth ? 150 : value;
  916. value = size.height - e.getData().top;
  917. //Modified "base.mcvPopupY = value < 0 ? 70 : value;" to keep "Y" of mcv timer
  918. //position from exceeding the window size.
  919. base.mcvPopupY = value < 0 || value > sizeClientHeight ? 70 : value;
  920. MaelstromTools.LocalStorage.set("mcvPopup", {
  921. x : base.mcvPopupX,
  922. y : base.mcvPopupY
  923. });
  924. });
  925. var font = qx.bom.Font.fromString('bold').set({
  926. size: 20
  927. });
  928.  
  929. this.mcvTimerLabel = new qx.ui.basic.Label().set({
  930. font: font,
  931. textColor: 'red',
  932. width: 155,
  933. textAlign: 'center',
  934. marginBottom : 5
  935. });
  936. this.mcvPopup.add(this.mcvTimerLabel);
  937. var serverBar = qx.core.Init.getApplication().getServerBar().getBounds();
  938. var pos = MaelstromTools.LocalStorage.get("mcvPopup", {
  939. x : serverBar.width + 150,
  940. y : 70
  941. });
  942. this.mcvPopupX = pos.x;
  943. this.mcvPopupY = pos.y;
  944. this.mcvPopup.open();
  945. }
  946. var size = qx.core.Init.getApplication().getRoot().getBounds();
  947. this.mcvPopup.moveTo(size.width - this.mcvPopupX, size.height - this.mcvPopupY);
  948.  
  949. var nextLevelInfo = cd.get_NextLevelInfo_Obj();
  950. var resourcesNeeded = new Array();
  951. for (var i in nextLevelInfo.rr) {
  952. if (nextLevelInfo.rr[i].t > 0) {
  953. resourcesNeeded[nextLevelInfo.rr[i].t] = nextLevelInfo.rr[i].c;
  954. }
  955. }
  956. //var researchNeeded = resourcesNeeded[ClientLib.Base.EResourceType.ResearchPoints];
  957. //var currentResearchPoints = player.get_ResearchPoints();
  958.  
  959. var creditsNeeded = resourcesNeeded[ClientLib.Base.EResourceType.Gold];
  960. var creditsResourceData = player.get_Credits();
  961. var creditGrowthPerHour = (creditsResourceData.Delta + creditsResourceData.ExtraBonusDelta) * ClientLib.Data.MainData.GetInstance().get_Time().get_StepsPerHour();
  962. var creditTimeLeftInHours = (creditsNeeded - player.GetCreditsCount()) / creditGrowthPerHour;
  963.  
  964. if (creditGrowthPerHour == 0 || creditTimeLeftInHours <= 0) {
  965. if (this.mcvPopup) {
  966. this.mcvPopup.close();
  967. }
  968. return;
  969. }
  970.  
  971. this.mcvPopup.setCaption(Lang.gt("Next MCV") + " ($ " + MaelstromTools.Wrapper.FormatNumbersCompact(creditsNeeded) + ")");
  972. this.mcvTimerLabel.setValue(MaelstromTools.Wrapper.FormatTimespan(creditTimeLeftInHours * 60 * 60));
  973.  
  974. if (!this.mcvPopup.isVisible()) {
  975. this.mcvPopup.open();
  976. }
  977. } catch (e) {
  978. console.log("calculateCostsForNextMCV", e);
  979. }
  980. }
  981. }
  982. });
  983.  
  984. // define Preferences
  985. qx.Class.define("MaelstromTools.Preferences", {
  986. type: "singleton",
  987. extend: qx.core.Object,
  988.  
  989. statics: {
  990. USEDEDICATEDMAINMENU: "useDedicatedMainMenu",
  991. AUTOCOLLECTPACKAGES: "autoCollectPackages",
  992. AUTOREPAIRUNITS: "autoRepairUnits",
  993. AUTOREPAIRBUILDINGS: "autoRepairBuildings",
  994. AUTOHIDEMISSIONTRACKER: "autoHideMissionTracker",
  995. AUTOCOLLECTTIMER: "AutoCollectTimer",
  996. SHOWLOOT: "showLoot",
  997. SHOWCOSTSFORNEXTMCV: "showCostsForNextMCV",
  998. CHATHISTORYLENGTH: "ChatHistoryLength"
  999. },
  1000.  
  1001. members: {
  1002. Window: null,
  1003. Widget: null,
  1004. Settings: null,
  1005. FormElements: null,
  1006.  
  1007. readOptions: function () {
  1008. try {
  1009. if (!this.Settings) {
  1010. this.Settings = new Object();
  1011. }
  1012.  
  1013. /*
  1014. if(MaelstromTools.LocalStorage.get("useDedicatedMainMenu") == null) {
  1015. if(qx.bom.Viewport.getWidth(window) > 1800) {
  1016. this.Settings["useDedicatedMainMenu"] = false;
  1017. }
  1018. } else {
  1019. this.Settings["useDedicatedMainMenu"] = (MaelstromTools.LocalStorage.get("useDedicatedMainMenu", 1) == 1);
  1020. }*/
  1021. this.Settings[MaelstromTools.Preferences.USEDEDICATEDMAINMENU] = (MaelstromTools.LocalStorage.get(MaelstromTools.Preferences.USEDEDICATEDMAINMENU, 1) == 1);
  1022. this.Settings[MaelstromTools.Preferences.AUTOCOLLECTPACKAGES] = (MaelstromTools.LocalStorage.get(MaelstromTools.Preferences.AUTOCOLLECTPACKAGES, 0) == 1);
  1023. this.Settings[MaelstromTools.Preferences.AUTOREPAIRUNITS] = (MaelstromTools.LocalStorage.get(MaelstromTools.Preferences.AUTOREPAIRUNITS, 0) == 1);
  1024. this.Settings[MaelstromTools.Preferences.AUTOREPAIRBUILDINGS] = (MaelstromTools.LocalStorage.get(MaelstromTools.Preferences.AUTOREPAIRBUILDINGS, 0) == 1);
  1025. this.Settings[MaelstromTools.Preferences.AUTOHIDEMISSIONTRACKER] = (MaelstromTools.LocalStorage.get(MaelstromTools.Preferences.AUTOHIDEMISSIONTRACKER, 0) == 1);
  1026. this.Settings[MaelstromTools.Preferences.AUTOCOLLECTTIMER] = MaelstromTools.LocalStorage.get(MaelstromTools.Preferences.AUTOCOLLECTTIMER, 60);
  1027. this.Settings[MaelstromTools.Preferences.SHOWLOOT] = (MaelstromTools.LocalStorage.get(MaelstromTools.Preferences.SHOWLOOT, 1) == 1);
  1028. this.Settings[MaelstromTools.Preferences.SHOWCOSTSFORNEXTMCV] = (MaelstromTools.LocalStorage.get(MaelstromTools.Preferences.SHOWCOSTSFORNEXTMCV, 1) == 1);
  1029. this.Settings[MaelstromTools.Preferences.CHATHISTORYLENGTH] = MaelstromTools.LocalStorage.get(MaelstromTools.Preferences.CHATHISTORYLENGTH, 64);
  1030.  
  1031. if (!CCTAWrapperIsInstalled()) {
  1032. this.Settings[MaelstromTools.Preferences.AUTOREPAIRUNITS] = false;
  1033. this.Settings[MaelstromTools.Preferences.AUTOREPAIRBUILDINGS] = false;
  1034. //this.Settings[MaelstromTools.Preferences.SHOWLOOT] = false;
  1035. }
  1036. //console.log(this.Settings);
  1037.  
  1038. } catch (e) {
  1039. console.log("MaelstromTools.Preferences.readOptions: ", e);
  1040. }
  1041. },
  1042.  
  1043. openWindow: function (WindowName, WindowTitle) {
  1044. try {
  1045. if (!this.Window) {
  1046. //this.Window = new qx.ui.window.Window(WindowTitle).set({
  1047. this.Window = new webfrontend.gui.OverlayWindow().set({
  1048. autoHide: false,
  1049. title: WindowTitle,
  1050. minHeight: 350
  1051.  
  1052. //resizable: false,
  1053. //showMaximize:false,
  1054. //showMinimize:false,
  1055. //allowMaximize:false,
  1056. //allowMinimize:false,
  1057. //showStatusbar: false
  1058. });
  1059. this.Window.clientArea.setPadding(10);
  1060. this.Window.clientArea.setLayout(new qx.ui.layout.VBox(3));
  1061.  
  1062. this.Widget = new qx.ui.container.Composite(new qx.ui.layout.Grid().set({
  1063. spacingX: 5,
  1064. spacingY: 5
  1065. }));
  1066.  
  1067. //this.Widget.setTextColor("white");
  1068.  
  1069. this.Window.clientArea.add(this.Widget);
  1070. }
  1071.  
  1072. if (this.Window.isVisible()) {
  1073. this.Window.close();
  1074. } else {
  1075. MT_Base.openWindow(this.Window, WindowName);
  1076. this.setWidgetLabels();
  1077. }
  1078. } catch (e) {
  1079. console.log("MaelstromTools.Preferences.openWindow: ", e);
  1080. }
  1081. },
  1082.  
  1083. addFormElement: function (name, element) {
  1084. this.FormElements[name] = element;
  1085. },
  1086.  
  1087. setWidgetLabels: function () {
  1088. try {
  1089. this.readOptions();
  1090.  
  1091. this.FormElements = new Object();
  1092. this.Widget.removeAll();
  1093. var rowIdx = 1;
  1094. var colIdx = 1;
  1095.  
  1096. var chkAutoHideMissionTracker = new qx.ui.form.CheckBox(Lang.gt("Hide Mission Tracker")).set({
  1097. value: this.Settings[MaelstromTools.Preferences.AUTOHIDEMISSIONTRACKER] == 1
  1098. });
  1099. var chkUseDedicatedMainMenu = new qx.ui.form.CheckBox(Lang.gt("Use dedicated Main Menu (restart required)")).set({
  1100. value: this.Settings[MaelstromTools.Preferences.USEDEDICATEDMAINMENU] == 1
  1101. });
  1102. var chkShowLoot = new qx.ui.form.CheckBox(Lang.gt("Show lootable resources (restart required)")).set({
  1103. value: this.Settings[MaelstromTools.Preferences.SHOWLOOT] == 1/*,
  1104. enabled: CCTAWrapperIsInstalled()*/
  1105. });
  1106. var chkCostsNextMCV = new qx.ui.form.CheckBox(Lang.gt("Show time to next MCV")).set({
  1107. value: this.Settings[MaelstromTools.Preferences.SHOWCOSTSFORNEXTMCV] == 1
  1108. });
  1109. MaelstromTools.Util.addElement(this.Widget, rowIdx++, colIdx, chkAutoHideMissionTracker, 2);
  1110. MaelstromTools.Util.addElement(this.Widget, rowIdx++, colIdx, chkUseDedicatedMainMenu, 2);
  1111. MaelstromTools.Util.addElement(this.Widget, rowIdx++, colIdx, chkShowLoot, 2);
  1112. MaelstromTools.Util.addElement(this.Widget, rowIdx++, colIdx, chkCostsNextMCV, 2);
  1113.  
  1114. var chkAutoCollectPackages = new qx.ui.form.CheckBox(Lang.gt("Autocollect packages")).set({
  1115. value: this.Settings[MaelstromTools.Preferences.AUTOCOLLECTPACKAGES] == 1
  1116. });
  1117. var chkAutoRepairUnits = new qx.ui.form.CheckBox(Lang.gt("Autorepair units")).set({
  1118. value: this.Settings[MaelstromTools.Preferences.AUTOREPAIRUNITS] == 1,
  1119. enabled: CCTAWrapperIsInstalled()
  1120. });
  1121. var chkAutoRepairBuildings = new qx.ui.form.CheckBox(Lang.gt("Autorepair buildings")).set({
  1122. value: this.Settings[MaelstromTools.Preferences.AUTOREPAIRBUILDINGS] == 1,
  1123. enabled: CCTAWrapperIsInstalled()
  1124. });
  1125.  
  1126. var spinnerChatHistoryLength = new qx.ui.form.Spinner().set({
  1127. minimum: 64,
  1128. maximum: 512,
  1129. value: this.Settings[MaelstromTools.Preferences.CHATHISTORYLENGTH]
  1130. });
  1131.  
  1132. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx, Lang.gt("Chat history length") + " (" + spinnerChatHistoryLength.getMinimum() + " - " + spinnerChatHistoryLength.getMaximum() + ")");
  1133. MaelstromTools.Util.addElement(this.Widget, rowIdx++, colIdx + 1, spinnerChatHistoryLength);
  1134.  
  1135. var spinnerAutoCollectTimer = new qx.ui.form.Spinner().set({
  1136. minimum: 5,
  1137. maximum: 60 * 6,
  1138. value: this.Settings[MaelstromTools.Preferences.AUTOCOLLECTTIMER]
  1139. });
  1140.  
  1141. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx, Lang.gt("Automatic interval in minutes") + " (" + spinnerAutoCollectTimer.getMinimum() + " - " + spinnerAutoCollectTimer.getMaximum() + ")");
  1142. MaelstromTools.Util.addElement(this.Widget, rowIdx++, colIdx + 1, spinnerAutoCollectTimer);
  1143. MaelstromTools.Util.addElement(this.Widget, rowIdx++, colIdx, chkAutoCollectPackages, 2);
  1144. MaelstromTools.Util.addElement(this.Widget, rowIdx++, colIdx, chkAutoRepairUnits, 2);
  1145. MaelstromTools.Util.addElement(this.Widget, rowIdx++, colIdx, chkAutoRepairBuildings, 2);
  1146.  
  1147. var applyButton = new qx.ui.form.Button(Lang.gt("Apply changes")).set({
  1148. appearance: "button-detailview-small",
  1149. width: 120,
  1150. minWidth: 120,
  1151. maxWidth: 120
  1152. });
  1153. applyButton.addListener("execute", this.applyChanges, this);
  1154.  
  1155. var cancelButton = new qx.ui.form.Button(Lang.gt("Discard changes")).set({
  1156. appearance: "button-detailview-small",
  1157. width: 120,
  1158. minWidth: 120,
  1159. maxWidth: 120
  1160. });
  1161. cancelButton.addListener("execute", function () {
  1162. this.Window.close();
  1163. }, this);
  1164.  
  1165. var resetButton = new qx.ui.form.Button(Lang.gt("Reset to default")).set({
  1166. appearance: "button-detailview-small",
  1167. width: 120,
  1168. minWidth: 120,
  1169. maxWidth: 120
  1170. });
  1171. resetButton.addListener("execute", this.resetToDefault, this);
  1172.  
  1173. MaelstromTools.Util.addElement(this.Widget, rowIdx++, colIdx, resetButton);
  1174. colIdx = 1;
  1175. MaelstromTools.Util.addElement(this.Widget, rowIdx, colIdx++, cancelButton);
  1176. MaelstromTools.Util.addElement(this.Widget, rowIdx++, colIdx, applyButton);
  1177.  
  1178. this.addFormElement(MaelstromTools.Preferences.AUTOHIDEMISSIONTRACKER, chkAutoHideMissionTracker);
  1179. this.addFormElement(MaelstromTools.Preferences.USEDEDICATEDMAINMENU, chkUseDedicatedMainMenu);
  1180. this.addFormElement(MaelstromTools.Preferences.SHOWLOOT, chkShowLoot);
  1181. this.addFormElement(MaelstromTools.Preferences.SHOWCOSTSFORNEXTMCV, chkCostsNextMCV);
  1182. this.addFormElement(MaelstromTools.Preferences.AUTOCOLLECTPACKAGES, chkAutoCollectPackages);
  1183. this.addFormElement(MaelstromTools.Preferences.AUTOREPAIRUNITS, chkAutoRepairUnits);
  1184. this.addFormElement(MaelstromTools.Preferences.AUTOREPAIRBUILDINGS, chkAutoRepairBuildings);
  1185. this.addFormElement(MaelstromTools.Preferences.AUTOCOLLECTTIMER, spinnerAutoCollectTimer);
  1186. this.addFormElement(MaelstromTools.Preferences.CHATHISTORYLENGTH, spinnerChatHistoryLength);
  1187. } catch (e) {
  1188. console.log("MaelstromTools.Preferences.setWidgetLabels: ", e);
  1189. }
  1190. },
  1191.  
  1192. applyChanges: function () {
  1193. try {
  1194. var autoRunNeeded = false;
  1195. for (var idx in this.FormElements) {
  1196. var element = this.FormElements[idx];
  1197. if (idx == MaelstromTools.Preferences.AUTOCOLLECTTIMER) {
  1198. autoRunNeeded = (MaelstromTools.LocalStorage.get(MaelstromTools.Preferences.AUTOCOLLECTTIMER, 0) != element.getValue());
  1199. }
  1200. if (idx == MaelstromTools.Preferences.CHATHISTORYLENGTH) {
  1201. webfrontend.gui.chat.ChatWidget.recvbufsize = element.getValue();
  1202. }
  1203. MaelstromTools.LocalStorage.set(idx, element.getValue());
  1204. }
  1205. this.readOptions();
  1206. if (autoRunNeeded) {
  1207. MT_Base.runAutoCollectTimer();
  1208. }
  1209. this.Window.close();
  1210. } catch (e) {
  1211. console.log("MaelstromTools.Preferences.applyChanges: ", e);
  1212. }
  1213. },
  1214.  
  1215. resetToDefault: function () {
  1216. try {
  1217. MaelstromTools.LocalStorage.clearAll();
  1218. this.setWidgetLabels();
  1219. } catch (e) {
  1220. console.log("MaelstromTools.Preferences.resetToDefault: ", e);
  1221. }
  1222. }
  1223. }
  1224. });
  1225.  
  1226. // define DefaultObject
  1227. qx.Class.define("MaelstromTools.DefaultObject", {
  1228. type: "abstract",
  1229. extend: qx.core.Object,
  1230. members: {
  1231. Window: null,
  1232. Widget: null,
  1233. Cache: {}, //k null
  1234. IsTimerEnabled: true,
  1235.  
  1236. calc: function () {
  1237. try {
  1238. if (this.Window.isVisible()) {
  1239. this.updateCache();
  1240. this.setWidgetLabels();
  1241. if (this.IsTimerEnabled) {
  1242. var self = this;
  1243. window.setTimeout(function () {
  1244. self.calc();
  1245. }, MT_Base.timerInterval);
  1246. }
  1247. }
  1248. } catch (e) {
  1249. console.log("MaelstromTools.DefaultObject.calc: ", e);
  1250. }
  1251. },
  1252.  
  1253. openWindow: function (WindowName, WindowTitle) {
  1254. try {
  1255. if (!this.Window) {
  1256. this.Window = new qx.ui.window.Window(WindowTitle).set({
  1257. resizable: false,
  1258. showMaximize: false,
  1259. showMinimize: false,
  1260. allowMaximize: false,
  1261. allowMinimize: false,
  1262. showStatusbar: false
  1263. });
  1264. this.Window.setPadding(10);
  1265. this.Window.setLayout(new qx.ui.layout.VBox(3));
  1266.  
  1267. this.Widget = new qx.ui.container.Composite(new qx.ui.layout.Grid());
  1268. this.Widget.setTextColor("white");
  1269.  
  1270. this.Window.add(this.Widget);
  1271. }
  1272.  
  1273. if (this.Window.isVisible()) {
  1274. this.Window.close();
  1275. } else {
  1276. MT_Base.openWindow(this.Window, WindowName);
  1277. this.calc();
  1278. }
  1279. } catch (e) {
  1280. console.log("MaelstromTools.DefaultObject.openWindow: ", e);
  1281. }
  1282. }
  1283. }
  1284. });
  1285.  
  1286. // define Production
  1287. qx.Class.define("MaelstromTools.Production", {
  1288. type: "singleton",
  1289. extend: MaelstromTools.DefaultObject,
  1290. members: {
  1291. updateCache: function (onlyForCity) {
  1292. try {
  1293. MT_Cache.updateCityCache();
  1294. var alliance = ClientLib.Data.MainData.GetInstance().get_Alliance();
  1295. //this.Cache = Object();
  1296.  
  1297. for (var cname in MT_Cache.Cities) {
  1298. if (onlyForCity != null && onlyForCity != cname) {
  1299. continue;
  1300. }
  1301. var ncity = MT_Cache.Cities[cname].Object;
  1302. if (typeof (this.Cache[cname]) !== 'object') this.Cache[cname] = {};
  1303. if (typeof (this.Cache[cname][MaelstromTools.Statics.Tiberium]) !== 'object') this.Cache[cname][MaelstromTools.Statics.Tiberium] = {}; // all have to be checked,
  1304. if (typeof (this.Cache[cname][MaelstromTools.Statics.Crystal]) !== 'object') this.Cache[cname][MaelstromTools.Statics.Crystal] = {}; // this.Cache[cname] can be created inside different namespaces
  1305. if (typeof (this.Cache[cname][MaelstromTools.Statics.Power]) !== 'object') this.Cache[cname][MaelstromTools.Statics.Power] = {}; // like the RepairTime etc... without those objs
  1306. if (typeof (this.Cache[cname][MaelstromTools.Statics.Dollar]) !== 'object') this.Cache[cname][MaelstromTools.Statics.Dollar] = {};
  1307.  
  1308. this.Cache[cname]["ProductionStopped"] = ncity.get_IsGhostMode();
  1309. this.Cache[cname]["PackagesStopped"] = (ncity.get_hasCooldown() || ncity.get_IsGhostMode());
  1310. this.Cache[cname][MaelstromTools.Statics.Tiberium]["Delta"] = ncity.GetResourceGrowPerHour(ClientLib.Base.EResourceType.Tiberium, false, false); // (production.d[ClientLib.Base.EResourceType.Tiberium]['Delta'] * serverTime.get_StepsPerHour());
  1311. this.Cache[cname][MaelstromTools.Statics.Tiberium]["ExtraBonusDelta"] = ncity.GetResourceBonusGrowPerHour(ClientLib.Base.EResourceType.Tiberium); //(production.d[ClientLib.Base.EResourceType.Tiberium]['ExtraBonusDelta'] * serverTime.get_StepsPerHour());
  1312. this.Cache[cname][MaelstromTools.Statics.Tiberium]["POI"] = alliance.GetPOIBonusFromResourceType(ClientLib.Base.EResourceType.Tiberium);
  1313. this.Cache[cname][MaelstromTools.Statics.Crystal]["Delta"] = ncity.GetResourceGrowPerHour(ClientLib.Base.EResourceType.Crystal, false, false); //(production.d[ClientLib.Base.EResourceType.Crystal]['Delta'] * serverTime.get_StepsPerHour());
  1314. this.Cache[cname][MaelstromTools.Statics.Crystal]["ExtraBonusDelta"] = ncity.GetResourceBonusGrowPerHour(ClientLib.Base.EResourceType.Crystal); //(production.d[ClientLib.Base.EResourceType.Crystal]['ExtraBonusDelta'] * serverTime.get_StepsPerHour());
  1315. this.Cache[cname][MaelstromTools.Statics.Crystal]["POI"] = alliance.GetPOIBonusFromResourceType(ClientLib.Base.EResourceType.Crystal);
  1316. this.Cache[cname][MaelstromTools.Statics.Power]["Delta"] = ncity.GetResourceGrowPerHour(ClientLib.Base.EResourceType.Power, false, false); //(production.d[ClientLib.Base.EResourceType.Power]['Delta'] * serverTime.get_StepsPerHour());
  1317. this.Cache[cname][MaelstromTools.Statics.Power]["ExtraBonusDelta"] = ncity.GetResourceBonusGrowPerHour(ClientLib.Base.EResourceType.Power); // (production.d[ClientLib.Base.EResourceType.Power]['ExtraBonusDelta'] * serverTime.get_StepsPerHour());
  1318. this.Cache[cname][MaelstromTools.Statics.Power]["POI"] = alliance.GetPOIBonusFromResourceType(ClientLib.Base.EResourceType.Power);
  1319. this.Cache[cname][MaelstromTools.Statics.Dollar]["Delta"] = ClientLib.Base.Resource.GetResourceGrowPerHour(ncity.get_CityCreditsProduction(), false); // (ncity.get_CityCreditsProduction()['Delta'] * serverTime.get_StepsPerHour());
  1320. this.Cache[cname][MaelstromTools.Statics.Dollar]["ExtraBonusDelta"] = ClientLib.Base.Resource.GetResourceBonusGrowPerHour(ncity.get_CityCreditsProduction(), false); // (ncity.get_CityCreditsProduction()['ExtraBonusDelta'] * serverTime.get_StepsPerHour());
  1321. this.Cache[cname][MaelstromTools.Statics.Dollar]["POI"] = 0;
  1322. this.Cache[cname]["BaseLevel"] = MaelstromTools.Wrapper.GetBaseLevel(ncity);
  1323. if (onlyForCity != null && onlyForCity == cname) return this.Cache[cname];
  1324. }
  1325. } catch (e) {
  1326. console.log("MaelstromTools.Production.updateCache: ", e);
  1327. }
  1328. },
  1329.  
  1330. createProductionLabels2: function (rowIdx, colIdx, cityName, resourceType) {
  1331. try {
  1332. if (cityName == "-Total-") {
  1333. var Totals = Object();
  1334. Totals["Delta"] = 0;
  1335. Totals["ExtraBonusDelta"] = 0;
  1336. Totals["POI"] = 0;
  1337. Totals["Total"] = 0;
  1338.  
  1339. for (var cname in this.Cache) {
  1340. Totals["Delta"] += this.Cache[cname][resourceType]['Delta'];
  1341. Totals["ExtraBonusDelta"] += this.Cache[cname][resourceType]['ExtraBonusDelta'];
  1342. Totals["POI"] += this.Cache[cname][resourceType]['POI'];
  1343. }
  1344. Totals["Total"] = Totals['Delta'] + Totals['ExtraBonusDelta'] + Totals['POI'];
  1345.  
  1346. rowIdx++;
  1347.  
  1348. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, MaelstromTools.Wrapper.FormatNumbersCompact(Totals['Delta']), 80, 'right', 'bold');
  1349. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, MaelstromTools.Wrapper.FormatNumbersCompact(Totals['ExtraBonusDelta']), 80, 'right', 'bold');
  1350. if (resourceType != MaelstromTools.Statics.Dollar) {
  1351. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, MaelstromTools.Wrapper.FormatNumbersCompact(Totals['POI']), 80, 'right', 'bold');
  1352. } else {
  1353. rowIdx++;
  1354. }
  1355. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, MaelstromTools.Wrapper.FormatNumbersCompact(Totals['Total']), 80, 'right', 'bold');
  1356. } else if (cityName == "-Labels-") {
  1357. MaelstromTools.Util.addImage(this.Widget, rowIdx++, colIdx, MaelstromTools.Util.getImage(resourceType));
  1358. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, "Continuous", 100, 'left');
  1359. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, "Bonus", 100, 'left');
  1360. if (resourceType != MaelstromTools.Statics.Dollar) {
  1361. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, "POI", 100, 'left');
  1362. } else {
  1363. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, "Total / BaseLevel", 100, 'left');
  1364. }
  1365. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, "Total / h", 100, 'left');
  1366. } else {
  1367. var cityCache = this.Cache[cityName];
  1368. if (rowIdx > 2) {
  1369. rowIdx++;
  1370. }
  1371. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[resourceType]['Delta']), 80, 'right', null, ((cityCache["ProductionStopped"] || cityCache[resourceType]['Delta'] == 0) ? "red" : "white"));
  1372. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[resourceType]['ExtraBonusDelta']), 80, 'right', null, ((cityCache["PackagesStopped"] || cityCache[resourceType]['ExtraBonusDelta'] == 0) ? "red" : "white"));
  1373. if (resourceType != MaelstromTools.Statics.Dollar) {
  1374. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[resourceType]['POI']), 80, 'right', null, (cityCache[resourceType]['POI'] == 0 ? "red" : "white"));
  1375. } else {
  1376. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, MaelstromTools.Wrapper.FormatNumbersCompact((cityCache[resourceType]['Delta'] + cityCache[resourceType]['ExtraBonusDelta'] + cityCache[resourceType]['POI']) / cityCache["BaseLevel"]), 80, 'right');
  1377. }
  1378. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[resourceType]['Delta'] + cityCache[resourceType]['ExtraBonusDelta'] + cityCache[resourceType]['POI']), 80, 'right', 'bold');
  1379. }
  1380. return rowIdx;
  1381. } catch (e) {
  1382. console.log("MaelstromTools.Production.createProductionLabels2: ", e);
  1383. }
  1384. },
  1385.  
  1386. setWidgetLabels: function () {
  1387. try {
  1388. this.Widget.removeAll();
  1389.  
  1390. var rowIdx = 1;
  1391. var colIdx = 1;
  1392.  
  1393. rowIdx = this.createProductionLabels2(rowIdx, colIdx, "-Labels-", MaelstromTools.Statics.Tiberium);
  1394. rowIdx = this.createProductionLabels2(rowIdx, colIdx, "-Labels-", MaelstromTools.Statics.Crystal);
  1395. rowIdx = this.createProductionLabels2(rowIdx, colIdx, "-Labels-", MaelstromTools.Statics.Power);
  1396. rowIdx = this.createProductionLabels2(rowIdx, colIdx, "-Labels-", MaelstromTools.Statics.Dollar);
  1397.  
  1398. colIdx++;
  1399. for (var cityName in this.Cache) {
  1400. rowIdx = 1;
  1401. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx, cityName, 80, 'right');
  1402.  
  1403. rowIdx = this.createProductionLabels2(rowIdx, colIdx, cityName, MaelstromTools.Statics.Tiberium);
  1404. rowIdx = this.createProductionLabels2(rowIdx, colIdx, cityName, MaelstromTools.Statics.Crystal);
  1405. rowIdx = this.createProductionLabels2(rowIdx, colIdx, cityName, MaelstromTools.Statics.Power);
  1406. rowIdx = this.createProductionLabels2(rowIdx, colIdx, cityName, MaelstromTools.Statics.Dollar);
  1407.  
  1408. MaelstromTools.Util.addElement(this.Widget, rowIdx, colIdx++, MaelstromTools.Util.getAccessBaseButton(cityName));
  1409. }
  1410.  
  1411. rowIdx = 1;
  1412. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx, "Total / h", 80, 'right', 'bold');
  1413.  
  1414. rowIdx = this.createProductionLabels2(rowIdx, colIdx, "-Total-", MaelstromTools.Statics.Tiberium);
  1415. rowIdx = this.createProductionLabels2(rowIdx, colIdx, "-Total-", MaelstromTools.Statics.Crystal);
  1416. rowIdx = this.createProductionLabels2(rowIdx, colIdx, "-Total-", MaelstromTools.Statics.Power);
  1417. rowIdx = this.createProductionLabels2(rowIdx, colIdx, "-Total-", MaelstromTools.Statics.Dollar);
  1418. } catch (e) {
  1419. console.log("MaelstromTools.Production.setWidgetLabels: ", e);
  1420. }
  1421. }
  1422. }
  1423. });
  1424.  
  1425. // define RepairTime
  1426. qx.Class.define("MaelstromTools.RepairTime", {
  1427. type: "singleton",
  1428. extend: MaelstromTools.DefaultObject,
  1429. members: {
  1430.  
  1431. updateCache: function () {
  1432. try {
  1433. MT_Cache.updateCityCache();
  1434. this.Cache = Object();
  1435.  
  1436. for (var cname in MT_Cache.Cities) {
  1437. var ncity = MT_Cache.Cities[cname].Object;
  1438. var RepLargest = '';
  1439.  
  1440. this.Cache[cname] = Object();
  1441. this.Cache[cname]["RepairTime"] = Object();
  1442. this.Cache[cname]["Repaircharge"] = Object();
  1443. this.Cache[cname]["Repaircharge"]["Smallest"] = 999999999;
  1444. this.Cache[cname]["RepairTime"]["Largest"] = 0;
  1445.  
  1446. this.Cache[cname]["RepairTime"][MaelstromTools.Statics.Infantry] = ncity.get_CityUnitsData().GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Infantry, false);
  1447. this.Cache[cname]["RepairTime"][MaelstromTools.Statics.Vehicle] = ncity.get_CityUnitsData().GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Vehicle, false);
  1448. this.Cache[cname]["RepairTime"][MaelstromTools.Statics.Aircraft] = ncity.get_CityUnitsData().GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Aircraft, false);
  1449. this.Cache[cname]["RepairTime"]["Maximum"] = ncity.GetResourceMaxStorage(ClientLib.Base.EResourceType.RepairChargeInf);
  1450. this.Cache[cname]["Repaircharge"][MaelstromTools.Statics.Infantry] = ncity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeInf);
  1451. this.Cache[cname]["Repaircharge"][MaelstromTools.Statics.Vehicle] = ncity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeVeh);
  1452. this.Cache[cname]["Repaircharge"][MaelstromTools.Statics.Aircraft] = ncity.GetResourceCount(ClientLib.Base.EResourceType.RepairChargeAir);
  1453.  
  1454. if (this.Cache[cname]["Repaircharge"][MaelstromTools.Statics.Infantry] < this.Cache[cname]["Repaircharge"]["Smallest"]) {
  1455. this.Cache[cname]["Repaircharge"]["Smallest"] = this.Cache[cname]["Repaircharge"][MaelstromTools.Statics.Infantry];
  1456. }
  1457. if (this.Cache[cname]["Repaircharge"][MaelstromTools.Statics.Vehicle] < this.Cache[cname]["Repaircharge"]["Smallest"]) {
  1458. this.Cache[cname]["Repaircharge"]["Smallest"] = this.Cache[cname]["Repaircharge"][MaelstromTools.Statics.Vehicle];
  1459. }
  1460. if (this.Cache[cname]["Repaircharge"][MaelstromTools.Statics.Aircraft] < this.Cache[cname]["Repaircharge"]["Smallest"]) {
  1461. this.Cache[cname]["Repaircharge"]["Smallest"] = this.Cache[cname]["Repaircharge"][MaelstromTools.Statics.Aircraft];
  1462. }
  1463.  
  1464. if (this.Cache[cname]["RepairTime"][MaelstromTools.Statics.Infantry] > this.Cache[cname]["RepairTime"]["Largest"]) {
  1465. this.Cache[cname]["RepairTime"]["Largest"] = this.Cache[cname]["RepairTime"][MaelstromTools.Statics.Infantry];
  1466. RepLargest = "Infantry";
  1467. }
  1468. if (this.Cache[cname]["RepairTime"][MaelstromTools.Statics.Vehicle] > this.Cache[cname]["RepairTime"]["Largest"]) {
  1469. this.Cache[cname]["RepairTime"]["Largest"] = this.Cache[cname]["RepairTime"][MaelstromTools.Statics.Vehicle];
  1470. RepLargest = "Vehicle";
  1471. }
  1472. if (this.Cache[cname]["RepairTime"][MaelstromTools.Statics.Aircraft] > this.Cache[cname]["RepairTime"]["Largest"]) {
  1473. this.Cache[cname]["RepairTime"]["Largest"] = this.Cache[cname]["RepairTime"][MaelstromTools.Statics.Aircraft];
  1474. RepLargest = "Aircraft";
  1475. }
  1476.  
  1477. //PossibleAttacks and MaxAttacks fixes
  1478. var offHealth = ncity.GetOffenseConditionInPercent();
  1479. if (RepLargest !== '') {
  1480. this.Cache[cname]["RepairTime"]["LargestDiv"] = this.Cache[cname]["RepairTime"][RepLargest];
  1481. var i = Math.ceil(this.Cache[cname]["Repaircharge"].Smallest / this.Cache[cname]["RepairTime"].LargestDiv); //fix
  1482. var j = this.Cache[cname]["Repaircharge"].Smallest / this.Cache[cname]["RepairTime"].LargestDiv;
  1483. if (offHealth !== 100) { i--; i += '*';} // Decrease number of attacks by 1 when unit unhealthy. Additional visual info: asterisk when units aren't healthy
  1484. this.Cache[cname]["RepairTime"]["PossibleAttacks"] = i;
  1485. var k = this.Cache[cname]["RepairTime"].Maximum / this.Cache[cname]["RepairTime"].LargestDiv;
  1486. this.Cache[cname]["RepairTime"]["MaxAttacks"] = Math.ceil(k); //fix
  1487. } else {
  1488. this.Cache[cname]["RepairTime"]["LargestDiv"] = 0;
  1489. this.Cache[cname]["RepairTime"]["PossibleAttacks"] = 0;
  1490. this.Cache[cname]["RepairTime"]["MaxAttacks"] = 0;
  1491. }
  1492.  
  1493. var unitsData = ncity.get_CityUnitsData();
  1494. this.Cache[cname]["Base"] = Object();
  1495. this.Cache[cname]["Base"]["Level"] = MaelstromTools.Wrapper.GetBaseLevel(ncity);
  1496. this.Cache[cname]["Base"]["UnitLimit"] = ncity.GetBuildingSlotLimit(); //ncity.GetNumBuildings();
  1497. this.Cache[cname]["Base"]["TotalHeadCount"] = ncity.GetBuildingSlotCount();
  1498. this.Cache[cname]["Base"]["FreeHeadCount"] = this.Cache[cname]["Base"]["UnitLimit"] - this.Cache[cname]["Base"]["TotalHeadCount"];
  1499. this.Cache[cname]["Base"]["HealthInPercent"] = ncity.GetBuildingsConditionInPercent();
  1500.  
  1501. this.Cache[cname]["Offense"] = Object();
  1502. this.Cache[cname]["Offense"]["Level"] = (Math.floor(ncity.get_LvlOffense() * 100) / 100).toFixed(2);
  1503. this.Cache[cname]["Offense"]["UnitLimit"] = unitsData.get_UnitLimitOffense();
  1504. this.Cache[cname]["Offense"]["TotalHeadCount"] = unitsData.get_TotalOffenseHeadCount();
  1505. this.Cache[cname]["Offense"]["FreeHeadCount"] = unitsData.get_FreeOffenseHeadCount();
  1506. this.Cache[cname]["Offense"]["HealthInPercent"] = offHealth > 0 ? offHealth : 0;
  1507.  
  1508. this.Cache[cname]["Defense"] = Object();
  1509. this.Cache[cname]["Defense"]["Level"] = (Math.floor(ncity.get_LvlDefense() * 100) / 100).toFixed(2);
  1510. this.Cache[cname]["Defense"]["UnitLimit"] = unitsData.get_UnitLimitDefense();
  1511. this.Cache[cname]["Defense"]["TotalHeadCount"] = unitsData.get_TotalDefenseHeadCount();
  1512. this.Cache[cname]["Defense"]["FreeHeadCount"] = unitsData.get_FreeDefenseHeadCount();
  1513. this.Cache[cname]["Defense"]["HealthInPercent"] = ncity.GetDefenseConditionInPercent() > 0 ? ncity.GetDefenseConditionInPercent() : 0;
  1514.  
  1515. //console.log(ncity.get_CityUnitsData().get_UnitLimitOffense() + " / " + ncity.get_CityUnitsData().get_TotalOffenseHeadCount() + " = " + ncity.get_CityUnitsData().get_FreeOffenseHeadCount());
  1516. //console.log(ncity.get_CityUnitsData().get_UnitLimitDefense() + " / " + ncity.get_CityUnitsData().get_TotalDefenseHeadCount() + " = " + ncity.get_CityUnitsData().get_FreeDefenseHeadCount());
  1517. }
  1518. } catch (e) {
  1519. console.log("MaelstromTools.RepairTime.updateCache: ", e);
  1520. }
  1521. },
  1522.  
  1523. setWidgetLabels: function () {
  1524. try {
  1525. this.Widget.removeAll();
  1526. var rowIdx = 1;
  1527.  
  1528. rowIdx = this.createOverviewLabels(rowIdx);
  1529. rowIdx = this.createRepairchargeLabels(rowIdx);
  1530. } catch (e) {
  1531. console.log("MaelstromTools.RepairTime.setWidgetLabels: ", e);
  1532. }
  1533. },
  1534.  
  1535. createRepairchargeLabels: function (rowIdx) {
  1536. try {
  1537. var colIdx = 2;
  1538. MaelstromTools.Util.addLabel(this.Widget, rowIdx++, colIdx++, "Repaircharges", null, 'left', null, null, 3);
  1539. colIdx = 2;
  1540.  
  1541. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Statics.Infantry, 60, 'right');
  1542. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Statics.Vehicle, 60, 'right');
  1543. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Statics.Aircraft, 60, 'right');
  1544. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Repairtime", 80, 'right');
  1545. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Attacks", 60, 'right');
  1546. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Next at", 80, 'right');
  1547. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Max+1 at", 80, 'right');
  1548.  
  1549. rowIdx++;
  1550. for (var cityName in this.Cache) {
  1551. var cityCache = this.Cache[cityName];
  1552. if (cityCache.Offense.UnitLimit == 0) {
  1553. continue;
  1554. }
  1555. colIdx = 1;
  1556. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityName, 80, 'left');
  1557.  
  1558. // Skip bases with no armies
  1559. if (cityCache.Offense.UnitLimit > 0) {
  1560. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatTimespan(cityCache.RepairTime.Infantry), 60, 'right', null, (cityCache.RepairTime.Infantry == cityCache.RepairTime.LargestDiv ? "yellow" : "white"));
  1561. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatTimespan(cityCache.RepairTime.Vehicle), 60, 'right', null, (cityCache.RepairTime.Vehicle == cityCache.RepairTime.LargestDiv ? "yellow" : "white"));
  1562. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatTimespan(cityCache.RepairTime.Aircraft), 60, 'right', null, (cityCache.RepairTime.Aircraft == cityCache.RepairTime.LargestDiv ? "yellow" : "white"));
  1563. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatTimespan(cityCache.Repaircharge.Smallest), 80, 'right');
  1564. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityCache.RepairTime.PossibleAttacks + " / " + cityCache.RepairTime.MaxAttacks, 60, 'right', null, (cityCache.Offense.HealthInPercent !== 100 ? 'red' : null)); // mark red when unhealthy
  1565. var i = cityCache.RepairTime.LargestDiv * cityCache.RepairTime.PossibleAttacks;
  1566. var j = cityCache.RepairTime.LargestDiv * cityCache.RepairTime.MaxAttacks;
  1567. (i>0) ? MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatTimespan(i), 80, 'right', null, (i > cityCache.RepairTime.Maximum ? "yellow" : "white")) : colIdx++; /// yellow if more than Maximum RT
  1568. (j>0) ? MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatTimespan(j), 80, 'right') : colIdx++;
  1569. } else {
  1570. colIdx += 7;
  1571. }
  1572.  
  1573. colIdx += 4;
  1574. MaelstromTools.Util.addElement(this.Widget, rowIdx, colIdx++, MaelstromTools.Util.getAccessBaseButton(cityName, PerforceChangelist >= 376877 ? ClientLib.Data.PlayerAreaViewMode.pavmPlayerOffense : webfrontend.gui.PlayArea.PlayArea.modes.EMode_PlayerOffense));
  1575. rowIdx += 2;
  1576. }
  1577.  
  1578. return rowIdx;
  1579. } catch (e) {
  1580. console.log("MaelstromTools.RepairTime.createRepairchargeLabels: ", e);
  1581. }
  1582. },
  1583.  
  1584. createOverviewLabels: function (rowIdx) {
  1585. try {
  1586. var colIdx = 2;
  1587.  
  1588. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx, "Base", 60, 'right');
  1589. colIdx += 3;
  1590. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx, "Defense", 60, 'right');
  1591. colIdx += 3;
  1592. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx, "Army", 60, 'right');
  1593.  
  1594. rowIdx++;
  1595. colIdx = 2;
  1596.  
  1597. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Level", 60, 'right');
  1598. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Buildings", 60, 'right');
  1599. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Health", 60, 'right');
  1600.  
  1601. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Level", 60, 'right');
  1602. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Buildings", 60, 'right');
  1603. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Health", 60, 'right');
  1604.  
  1605. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Level", 60, 'right');
  1606. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Units", 60, 'right');
  1607. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Health", 60, 'right');
  1608.  
  1609. rowIdx++;
  1610. for (var cityName in this.Cache) {
  1611. var cityCache = this.Cache[cityName];
  1612. colIdx = 1;
  1613.  
  1614. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityName, 80, 'left');
  1615.  
  1616. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityCache.Base.Level, 60, 'right');
  1617. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityCache.Base.TotalHeadCount + " / " + cityCache.Base.UnitLimit, 60, 'right', null, (cityCache.Base.FreeHeadCount >= 1 ? "red" : "white"));
  1618. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityCache.Base.HealthInPercent + "%", 60, 'right', null, (cityCache.Base.HealthInPercent < 25 ? "red" : (cityCache.Base.HealthInPercent < 100 ? "yellow" : "white")));
  1619.  
  1620. if (cityCache.Defense.UnitLimit > 0) {
  1621. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityCache.Defense.Level, 60, 'right');
  1622. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityCache.Defense.TotalHeadCount + " / " + cityCache.Defense.UnitLimit, 60, 'right', null, (cityCache.Defense.FreeHeadCount >= 5 ? "red" : (cityCache.Defense.FreeHeadCount >= 3 ? "yellow" : "white")));
  1623. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityCache.Defense.HealthInPercent + "%", 60, 'right', null, (cityCache.Defense.HealthInPercent < 25 ? "red" : (cityCache.Defense.HealthInPercent < 100 ? "yellow" : "white")));
  1624. } else {
  1625. colIdx += 3;
  1626. }
  1627.  
  1628. // Skip bases with no armies
  1629. if (cityCache.Offense.UnitLimit > 0) {
  1630. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityCache.Offense.Level, 60, 'right');
  1631. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityCache.Offense.TotalHeadCount + " / " + cityCache.Offense.UnitLimit, 60, 'right', null, (cityCache.Offense.FreeHeadCount >= 10 ? "red" : (cityCache.Offense.FreeHeadCount >= 5 ? "yellow" : "white")));
  1632. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityCache.Offense.HealthInPercent + "%", 60, 'right', null, (cityCache.Offense.HealthInPercent < 25 ? "red" : (cityCache.Offense.HealthInPercent < 100 ? "yellow" : "white")));
  1633. } else {
  1634. colIdx += 3;
  1635. }
  1636.  
  1637. MaelstromTools.Util.addElement(this.Widget, rowIdx, colIdx++, MaelstromTools.Util.getAccessBaseButton(cityName));
  1638. rowIdx += 2;
  1639. }
  1640. return rowIdx;
  1641. } catch (e) {
  1642. console.log("MaelstromTools.RepairTime.createOverviewLabels: ", e);
  1643. }
  1644. }
  1645.  
  1646. }
  1647. });
  1648.  
  1649. // define ResourceOverview
  1650. qx.Class.define("MaelstromTools.ResourceOverview", {
  1651. type: "singleton",
  1652. extend: MaelstromTools.DefaultObject,
  1653. members: {
  1654. Table: null,
  1655. Model: null,
  1656.  
  1657. updateCache: function () {
  1658. try {
  1659. MT_Cache.updateCityCache();
  1660. this.Cache = Object();
  1661.  
  1662. for (var cname in MT_Cache.Cities) {
  1663. var ncity = MT_Cache.Cities[cname].Object;
  1664. var mtime = ClientLib.Data.MainData.GetInstance().get_Time();
  1665.  
  1666. this.Cache[cname] = Object();
  1667. this.Cache[cname][MaelstromTools.Statics.Tiberium] = ncity.GetResourceCount(ClientLib.Base.EResourceType.Tiberium);
  1668. this.Cache[cname][MaelstromTools.Statics.Tiberium + "Max"] = ncity.GetResourceMaxStorage(ClientLib.Base.EResourceType.Tiberium);
  1669. this.Cache[cname][MaelstromTools.Statics.Tiberium + "Full"] = mtime.GetJSStepTime(ncity.GetResourceStorageFullStep(ClientLib.Base.EResourceType.Tiberium));
  1670. this.Cache[cname][MaelstromTools.Statics.Crystal] = ncity.GetResourceCount(ClientLib.Base.EResourceType.Crystal);
  1671. this.Cache[cname][MaelstromTools.Statics.Crystal + "Max"] = ncity.GetResourceMaxStorage(ClientLib.Base.EResourceType.Crystal);
  1672. this.Cache[cname][MaelstromTools.Statics.Crystal + "Full"] = mtime.GetJSStepTime(ncity.GetResourceStorageFullStep(ClientLib.Base.EResourceType.Crystal));
  1673. this.Cache[cname][MaelstromTools.Statics.Power] = ncity.GetResourceCount(ClientLib.Base.EResourceType.Power);
  1674. this.Cache[cname][MaelstromTools.Statics.Power + "Max"] = ncity.GetResourceMaxStorage(ClientLib.Base.EResourceType.Power);
  1675. this.Cache[cname][MaelstromTools.Statics.Power + "Full"] = mtime.GetJSStepTime(ncity.GetResourceStorageFullStep(ClientLib.Base.EResourceType.Power));
  1676. }
  1677.  
  1678. } catch (e) {
  1679. console.log("MaelstromTools.ResourceOverview.updateCache: ", e);
  1680. }
  1681. },
  1682. /*
  1683. setWidgetLabelsTable: function () {
  1684. try {
  1685. if (!this.Table) {
  1686. this.Widget.setLayout(new qx.ui.layout.HBox());
  1687.  
  1688. this.Model = new qx.ui.table.model.Simple();
  1689. this.Model.setColumns(["City", "Tib. Storage", "Tiberium", "Full", "Crystal", "Full", "Power", "Storage", "Full"]);
  1690. this.Table = new qx.ui.table.Table(this.Model);
  1691. this.Widget.add(this.Table, {
  1692. flex: 1
  1693. });
  1694. }
  1695.  
  1696. var Totals = Object();
  1697. Totals[MaelstromTools.Statics.Tiberium] = 0;
  1698. Totals[MaelstromTools.Statics.Crystal] = 0;
  1699. Totals[MaelstromTools.Statics.Power] = 0;
  1700. Totals[MaelstromTools.Statics.Tiberium + "Max"] = 0;
  1701. Totals[MaelstromTools.Statics.Power + "Max"] = 0;
  1702.  
  1703. var rowData = [];
  1704.  
  1705. for (var cityName in this.Cache) {
  1706. var cityCache = this.Cache[cityName];
  1707.  
  1708. Totals[MaelstromTools.Statics.Tiberium] += cityCache[MaelstromTools.Statics.Tiberium];
  1709. Totals[MaelstromTools.Statics.Crystal] += cityCache[MaelstromTools.Statics.Crystal];
  1710. Totals[MaelstromTools.Statics.Power] += cityCache[MaelstromTools.Statics.Power];
  1711. Totals[MaelstromTools.Statics.Tiberium + "Max"] += cityCache[MaelstromTools.Statics.Tiberium + 'Max'];
  1712. Totals[MaelstromTools.Statics.Power + "Max"] += cityCache[MaelstromTools.Statics.Power + 'Max'];
  1713.  
  1714. rowData.push([
  1715. cityName,
  1716. MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[MaelstromTools.Statics.Tiberium + 'Max']),
  1717. MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[MaelstromTools.Statics.Tiberium]),
  1718. MaelstromTools.Wrapper.GetDateTimeString(cityCache[MaelstromTools.Statics.Tiberium + 'Full']),
  1719. MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[MaelstromTools.Statics.Crystal]),
  1720. MaelstromTools.Wrapper.GetDateTimeString(cityCache[MaelstromTools.Statics.Crystal + 'Full']),
  1721. MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[MaelstromTools.Statics.Power]),
  1722. MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[MaelstromTools.Statics.Power + 'Max']),
  1723. MaelstromTools.Wrapper.GetDateTimeString(cityCache[MaelstromTools.Statics.Power + 'Full'])
  1724. ]);
  1725. }
  1726. rowData.push([
  1727. 'Total resources',
  1728. MaelstromTools.Wrapper.FormatNumbersCompact(Totals[MaelstromTools.Statics.Tiberium + 'Max']),
  1729. MaelstromTools.Wrapper.FormatNumbersCompact(Totals[MaelstromTools.Statics.Tiberium]),
  1730. '',
  1731. MaelstromTools.Wrapper.FormatNumbersCompact(Totals[MaelstromTools.Statics.Crystal]),
  1732. '',
  1733. MaelstromTools.Wrapper.FormatNumbersCompact(Totals[MaelstromTools.Statics.Power]),
  1734. MaelstromTools.Wrapper.FormatNumbersCompact(Totals[MaelstromTools.Statics.Power + 'Max']),
  1735. ''
  1736. ]);
  1737.  
  1738. this.Model.setData(rowData);
  1739. } catch (e) {
  1740. console.log("MaelstromTools.ResourceOverview.setWidgetLabels: ", e);
  1741. }
  1742. },
  1743.  
  1744. */
  1745. setWidgetLabels: function () {
  1746. try {
  1747. this.Widget.removeAll();
  1748.  
  1749. var first = true;
  1750. var rowIdx = 2;
  1751. var Totals = Object();
  1752. var colIdx = 1;
  1753. Totals[MaelstromTools.Statics.Tiberium] = 0;
  1754. Totals[MaelstromTools.Statics.Crystal] = 0;
  1755. Totals[MaelstromTools.Statics.Power] = 0;
  1756. Totals[MaelstromTools.Statics.Tiberium + "Max"] = 0;
  1757. Totals[MaelstromTools.Statics.Power + "Max"] = 0;
  1758.  
  1759. for (var cityName in this.Cache) {
  1760. var cityCache = this.Cache[cityName];
  1761. Totals[MaelstromTools.Statics.Tiberium] += cityCache[MaelstromTools.Statics.Tiberium];
  1762. Totals[MaelstromTools.Statics.Crystal] += cityCache[MaelstromTools.Statics.Crystal];
  1763. Totals[MaelstromTools.Statics.Power] += cityCache[MaelstromTools.Statics.Power];
  1764. Totals[MaelstromTools.Statics.Tiberium + "Max"] += cityCache[MaelstromTools.Statics.Tiberium + 'Max'];
  1765. Totals[MaelstromTools.Statics.Power + "Max"] += cityCache[MaelstromTools.Statics.Power + 'Max'];
  1766.  
  1767. colIdx = 1;
  1768.  
  1769. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityName, 100, 'left');
  1770. if (first) {
  1771. MaelstromTools.Util.addLabel(this.Widget, 1, colIdx, 'Max. storage', 80, 'left');
  1772. }
  1773. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[MaelstromTools.Statics.Tiberium + 'Max']), 80, 'right');
  1774.  
  1775. if (first) {
  1776. MaelstromTools.Util.addImage(this.Widget, 1, colIdx, MaelstromTools.Util.getImage(MaelstromTools.Statics.Tiberium));
  1777. }
  1778. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[MaelstromTools.Statics.Tiberium]), 60, 'right', null, (cityCache[MaelstromTools.Statics.Tiberium] >= cityCache[MaelstromTools.Statics.Tiberium + 'Max'] ? "red" : (cityCache[MaelstromTools.Statics.Tiberium] >= (0.75 * cityCache[MaelstromTools.Statics.Tiberium + 'Max']) ? "yellow" : "white")));
  1779.  
  1780. if (cityCache[MaelstromTools.Statics.Tiberium] < cityCache[MaelstromTools.Statics.Tiberium + 'Max']) {
  1781. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.GetDateTimeString(cityCache[MaelstromTools.Statics.Tiberium + 'Full']), 100, 'right', null, (cityCache[MaelstromTools.Statics.Tiberium] >= (0.75 * cityCache[MaelstromTools.Statics.Tiberium + 'Max']) ? "yellow" : "white"));
  1782. } else {
  1783. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Storage full!", 100, 'right', null, "red");
  1784. }
  1785. if (first) {
  1786. MaelstromTools.Util.addImage(this.Widget, 1, colIdx, MaelstromTools.Util.getImage(MaelstromTools.Statics.Crystal));
  1787. }
  1788. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[MaelstromTools.Statics.Crystal]), 60, 'right', null, (cityCache[MaelstromTools.Statics.Crystal] >= cityCache[MaelstromTools.Statics.Crystal + 'Max'] ? "red" : (cityCache[MaelstromTools.Statics.Crystal] >= (0.75 * cityCache[MaelstromTools.Statics.Crystal + 'Max']) ? "yellow" : "white")));
  1789.  
  1790. if (cityCache[MaelstromTools.Statics.Crystal] < cityCache[MaelstromTools.Statics.Crystal + 'Max']) {
  1791. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.GetDateTimeString(cityCache[MaelstromTools.Statics.Crystal + 'Full']), 100, 'right', null, (cityCache[MaelstromTools.Statics.Crystal] >= (0.75 * cityCache[MaelstromTools.Statics.Crystal + 'Max']) ? "yellow" : "white"));
  1792. } else {
  1793. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Storage full!", 100, 'right', null, "red");
  1794. }
  1795.  
  1796. if (first) {
  1797. MaelstromTools.Util.addImage(this.Widget, 1, colIdx, MaelstromTools.Util.getImage(MaelstromTools.Statics.Power));
  1798. }
  1799. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[MaelstromTools.Statics.Power]), 60, 'right', null, (cityCache[MaelstromTools.Statics.Power] >= cityCache[MaelstromTools.Statics.Power + 'Max'] ? "red" : (cityCache[MaelstromTools.Statics.Power] >= (0.75 * cityCache[MaelstromTools.Statics.Power + 'Max']) ? "yellow" : "white")));
  1800.  
  1801. if (first) {
  1802. MaelstromTools.Util.addLabel(this.Widget, 1, colIdx, 'Storage', 80, 'left');
  1803. }
  1804. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(cityCache[MaelstromTools.Statics.Power + 'Max']), 80, 'right');
  1805.  
  1806. if (cityCache[MaelstromTools.Statics.Power] < cityCache[MaelstromTools.Statics.Power + 'Max']) {
  1807. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.GetDateTimeString(cityCache[MaelstromTools.Statics.Power + 'Full']), 100, 'right', null, (cityCache[MaelstromTools.Statics.Power] >= (0.75 * cityCache[MaelstromTools.Statics.Power + 'Max']) ? "yellow" : "white"));
  1808. } else {
  1809. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Storage full!", 100, 'right', null, "red");
  1810. }
  1811.  
  1812.  
  1813. MaelstromTools.Util.addElement(this.Widget, rowIdx, colIdx++, MaelstromTools.Util.getAccessBaseButton(cityName));
  1814. rowIdx++;
  1815. first = false;
  1816. }
  1817.  
  1818. colIdx = 1;
  1819. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Total resources", 100, 'left', 'bold');
  1820. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(Totals[MaelstromTools.Statics.Tiberium + 'Max']), 80, 'right', 'bold');
  1821. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(Totals[MaelstromTools.Statics.Tiberium]), 60, 'right', 'bold');
  1822. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, Math.round(Totals[MaelstromTools.Statics.Tiberium] / Totals[MaelstromTools.Statics.Tiberium + 'Max'] * 100) + '%', 100, 'center', 'bold');
  1823. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(Totals[MaelstromTools.Statics.Crystal]), 60, 'right', 'bold');
  1824. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, Math.round(Totals[MaelstromTools.Statics.Crystal] / Totals[MaelstromTools.Statics.Tiberium + 'Max'] * 100) + '%', 100, 'center', 'bold');
  1825. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(Totals[MaelstromTools.Statics.Power]), 60, 'right', 'bold');
  1826. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.FormatNumbersCompact(Totals[MaelstromTools.Statics.Power + 'Max']), 80, 'right', 'bold');
  1827. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, Math.round(Totals[MaelstromTools.Statics.Power] / Totals[MaelstromTools.Statics.Power + 'Max'] * 100) + '%', 100, 'center', 'bold');
  1828. } catch (e) {
  1829. console.log("MaelstromTools.ResourceOverview.setWidgetLabels: ", e);
  1830. }
  1831. }
  1832. }
  1833. });
  1834.  
  1835. // define BaseStatus
  1836. qx.Class.define("MaelstromTools.BaseStatus", {
  1837. type: "singleton",
  1838. extend: MaelstromTools.DefaultObject,
  1839. members: {
  1840. CityMenuButtons: null,
  1841.  
  1842. //City.SetDedicatedSupport
  1843. //City.RecallDedicatedSupport
  1844. //City.get_SupportDedicatedBaseId
  1845. //System.String get_SupportDedicatedBaseName ()
  1846. updateCache: function () {
  1847. try {
  1848. MT_Cache.updateCityCache();
  1849. this.Cache = Object();
  1850.  
  1851. for (var cname in MT_Cache.Cities) {
  1852. var ncity = MT_Cache.Cities[cname].Object;
  1853. var player = ClientLib.Data.MainData.GetInstance().get_Player();
  1854. var supportData = ncity.get_SupportData();
  1855. //System.String get_PlayerName ()
  1856. this.Cache[cname] = Object();
  1857. // Movement lock
  1858. this.Cache[cname]["HasCooldown"] = ncity.get_hasCooldown();
  1859. this.Cache[cname]["CooldownEnd"] = Math.max(ncity.get_MoveCooldownEndStep(), ncity.get_MoveRestictionEndStep());
  1860. this.Cache[cname]["MoveCooldownEnd"] = ncity.get_MoveCooldownEndStep();
  1861. this.Cache[cname]["MoveLockdownEnd"] = ncity.get_MoveRestictionEndStep();
  1862. this.Cache[cname]["IsProtected"] = ncity.get_isProtected();
  1863. this.Cache[cname]["ProtectionEnd"] = ncity.get_ProtectionEndStep();
  1864. this.Cache[cname]["IsProtected"] = ncity.get_ProtectionEndStep();
  1865. this.Cache[cname]["IsAlerted"] = ncity.get_isAlerted();
  1866.  
  1867. // Supportweapon
  1868. if (supportData == null) {
  1869. this.Cache[cname]["HasSupportWeapon"] = false;
  1870. } else {
  1871. this.Cache[cname]["HasSupportWeapon"] = true;
  1872. if (ncity.get_SupportDedicatedBaseId() > 0) {
  1873. this.Cache[cname]["SupportedCityId"] = ncity.get_SupportDedicatedBaseId();
  1874. this.Cache[cname]["SupportedCityName"] = ncity.get_SupportDedicatedBaseName();
  1875. var coordId = ncity.get_SupportDedicatedBaseCoordId();
  1876. this.Cache[cname]["SupportedCityX"] = (coordId & 0xffff);
  1877. this.Cache[cname]["SupportedCityY"] = ((coordId >> 0x10) & 0xffff);
  1878. /*
  1879. var cityX = ncity.get_PosX();
  1880. var cityY = ncity.get_PosY();
  1881. var mainData = ClientLib.Data.MainData.GetInstance();
  1882. var visRegion = ClientLib.Vis.VisMain.GetInstance().get_Region();
  1883.  
  1884. var gridW = visRegion.get_GridWidth();
  1885. var gridH = visRegion.get_GridHeight();
  1886. //console.log(cname);
  1887. //console.log("x: " + cityX + " y: " + cityY);
  1888.  
  1889. var worldObj = visRegion.GetObjectFromPosition((this.Cache[cname]["SupportedCityX"]*gridW), (this.Cache[cname]["SupportedCityY"]*gridH));
  1890. //ClientLib.Vis.Region.RegionCity
  1891. if (worldObj == null) {
  1892. this.Cache[cname]["SupportTime"] = "";
  1893. } else {
  1894. console.log(cname);
  1895. //console.log(worldObj.CalibrationSupportDuration());
  1896. var weaponState = worldObj.get_SupportWeaponStatus();
  1897. //console.log(this.calcDuration(ncity, worldObj));
  1898. var cities = ClientLib.Data.MainData.GetInstance().get_Cities();
  1899. cities.set_CurrentOwnCityId(ncity.get_Id());
  1900. var status = worldObj.get_SupportWeaponStatus();
  1901. var server = mainData.get_Server();
  1902. //console.log(worldObj.CalculateSupportCalibrationEndStep(worldObj.get_SupportData(), worldObj.get_SupportWeapon()));
  1903. console.log(status);
  1904. console.log(currStep);
  1905. this.Cache[cname]["SupportTime"] = mainData.get_Time().GetTimespanString(worldObj.CalculateSupportCalibrationEndStep(worldObj.get_SupportData(), worldObj.get_SupportWeapon()), currStep);
  1906. //status.Status&ClientLib.Vis.Region.ESupportWeaponStatus.Calibrating)==ClientLib.Vis.Region.ESupportWeaponStatus.Calibrating
  1907. var currStep = ClientLib.Data.MainData.GetInstance().get_Time().GetServerStep();
  1908. //this.Cache[cname]["SupportTime"] = webfrontend.Util.getTimespanString(ClientLib.Data.MainData.GetInstance().get_Time().GetTimeSpan(Math.max(0, status.CalibrationEndStep) - currStep), false);
  1909. //this.Cache[cname]["SupportTime"] = ClientLib.Data.MainData.GetInstance().get_Time().GetTimespanString(weaponState.CalibrationEndStep, currStep);
  1910. //this.Cache[cname]["SupportTime"] = webfrontend.Util.getTimespanString(ClientLib.Data.MainData.GetInstance().get_Time().GetTimeSpan(Math.max(0, worldObj.CalculateSupportCalibrationEndStep(worldObj.get_SupportData(), worldObj.get_SupportWeapon()) - currStep)), false);
  1911. //console.log(this.Cache[cname]["SupportTime"]);
  1912. }
  1913. */
  1914. } else { // prevent reference to undefined property ReferenceError
  1915. this.Cache[cname]["SupportedCityId"] = null;
  1916. this.Cache[cname]["SupportedCityName"] = null;
  1917. this.Cache[cname]["SupportedCityX"] = null;
  1918. this.Cache[cname]["SupportedCityY"] = null;
  1919. }
  1920. this.Cache[cname]["SupportRange"] = MaelstromTools.Wrapper.GetSupportWeaponRange(ncity.get_SupportWeapon());
  1921. var techName = ClientLib.Base.Tech.GetTechNameFromTechId(supportData.get_Type(), player.get_Faction());
  1922. this.Cache[cname]["SupportName"] = ClientLib.Base.Tech.GetProductionBuildingNameFromFaction(techName, player.get_Faction());
  1923. this.Cache[cname]["SupportLevel"] = supportData.get_Level();
  1924. //this.Cache[cname]["SupportBuilding"] = ncity.get_CityBuildingsData().GetUniqueBuildingByTechName(techName);
  1925. //console.log(this.Cache[cname]["SupportBuilding"]);
  1926. }
  1927. }
  1928. } catch (e) {
  1929. console.log("MaelstromTools.BaseStatus.updateCache: ", e);
  1930. }
  1931. },
  1932. /*
  1933. calcDuration: function(currOwnCity, regionCity) {
  1934. var targetCity = MaelstromTools.Wrapper.GetCity(regionCity.get_Id());
  1935. var supportBase=regionCity.get_SupportData();
  1936. if(supportBase == null)
  1937. {
  1938. return -1;
  1939. }
  1940. var weapon=regionCity.get_SupportWeapon();
  1941. if(weapon == null)
  1942. {
  1943. return -1;
  1944. }
  1945. if(currOwnCity.get_Id() == regionCity.get_Id())
  1946. {
  1947. if(supportBase.get_Magnitude() == 0) {
  1948. return -1;
  1949. }
  1950. return 0;
  1951. }
  1952. var dx=(currOwnCity.get_X() - targetCity.get_PosX());
  1953. var dy=(currOwnCity.get_Y() - targetCity.get_PosY());
  1954. var distance=((dx * dx) + (dy * dy));
  1955. return Math.floor((weapon.pt + (weapon.tpf * Math.floor((Math.sqrt(distance) + 0.5)))));
  1956. },*/
  1957.  
  1958. setWidgetLabels: function () {
  1959. try {
  1960. this.Widget.removeAll();
  1961. var rowIdx = 1;
  1962. var colIdx = 2;
  1963.  
  1964. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Cooldown", 85, 'left');
  1965. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Protection", 85, 'left');
  1966. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Available weapon", 140, 'left');
  1967. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "Calibrated on", 140, 'left');
  1968.  
  1969. //colIdx++;
  1970. var rowIdxRecall = rowIdx;
  1971. var colIdxRecall = 0;
  1972. var supportWeaponCount = 0;
  1973.  
  1974. rowIdx++;
  1975. for (var cityName in this.Cache) {
  1976. var cityCache = this.Cache[cityName];
  1977. colIdx = 1;
  1978.  
  1979. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityName, 100, 'left', null, (cityCache.IsAlerted ? 'red' : null));
  1980.  
  1981. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.GetStepTime(cityCache.CooldownEnd), 70, 'right');
  1982. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, MaelstromTools.Wrapper.GetStepTime(cityCache.ProtectionEnd), 70, 'right');
  1983.  
  1984. if (!cityCache.HasSupportWeapon) {
  1985. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, "none", 140, 'left');
  1986. colIdx += 2;
  1987. } else {
  1988. supportWeaponCount++;
  1989. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityCache.SupportName + " (" + cityCache.SupportLevel + ")", 140, 'left');
  1990.  
  1991. if (cityCache.SupportedCityId > 0) {
  1992. MaelstromTools.Util.addLabel(this.Widget, rowIdx, colIdx++, cityCache.SupportedCityName, 140, 'left');
  1993. colIdxRecall = colIdx;
  1994. MaelstromTools.Util.addElement(this.Widget, rowIdx, colIdx++, this.getRecallButton(cityName));
  1995. } else {
  1996. colIdx += 2;
  1997. }
  1998. }
  1999.  
  2000. MaelstromTools.Util.addElement(this.Widget, rowIdx, colIdx++, MaelstromTools.Util.getAccessBaseButton(cityName));
  2001. MaelstromTools.Util.addElement(this.Widget, rowIdx, colIdx++, MaelstromTools.Util.getFocusBaseButton(cityName));
  2002.  
  2003. rowIdx++;
  2004. }
  2005.  
  2006. if (supportWeaponCount > 0 && colIdxRecall > 0) {
  2007. MaelstromTools.Util.addElement(this.Widget, rowIdxRecall, colIdxRecall, this.getRecallAllButton());
  2008. }
  2009. } catch (e) {
  2010. console.log("MaelstromTools.BaseStatus.setWidgetLabels: ", e);
  2011. }
  2012. },
  2013.  
  2014. getRecallAllButton: function () {
  2015. var button = new qx.ui.form.Button("Recall all").set({
  2016. appearance: "button-text-small",
  2017. toolTipText: "Recall all support weapons",
  2018. width: 100,
  2019. height: 20
  2020. });
  2021. button.addListener("execute", function (e) {
  2022. MaelstromTools.Util.recallAllSupport();
  2023. }, this);
  2024. return button;
  2025. },
  2026.  
  2027. getRecallButton: function (cityName) {
  2028. var button = new qx.ui.form.Button("Recall").set({
  2029. appearance: "button-text-small",
  2030. toolTipText: "Recall support to " + cityName,
  2031. width: 100,
  2032. height: 20
  2033. });
  2034. button.addListener("execute", function (e) {
  2035. MaelstromTools.Util.recallSupport(cityName);
  2036. }, this);
  2037. return button;
  2038. }
  2039. /*
  2040. getCalibrateAllOnSelectedBaseButton: function() {
  2041. var button = new qx.ui.form.Button("Calibrate all weapons on selected base").set({
  2042. appearance: "button-text-small",
  2043. toolTipText: "Calibrate all weapons",
  2044. width: 100,
  2045. height: 20
  2046. });
  2047. button.addListener("execute", function(e){
  2048. Util.calibrateWholeSupport(ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCityId());
  2049. }, this);
  2050. return button;
  2051. }*/
  2052.  
  2053.  
  2054. }
  2055. });
  2056.  
  2057. // define Statics
  2058. qx.Class.define("MaelstromTools.Statics", {
  2059. type: "static",
  2060. statics: {
  2061. Tiberium: 'Tiberium',
  2062. Crystal: 'Crystal',
  2063. Power: 'Power',
  2064. Dollar: 'Dollar',
  2065. Research: 'Research',
  2066. Vehicle: "Vehicle",
  2067. Aircraft: "Aircraft",
  2068. Infantry: "Infantry",
  2069.  
  2070. LootTypeName: function (ltype) {
  2071. switch (ltype) {
  2072. case ClientLib.Base.EResourceType.Tiberium:
  2073. return MaelstromTools.Statics.Tiberium;
  2074. break;
  2075. case ClientLib.Base.EResourceType.Crystal:
  2076. return MaelstromTools.Statics.Crystal;
  2077. break;
  2078. case ClientLib.Base.EResourceType.Power:
  2079. return MaelstromTools.Statics.Power;
  2080. break;
  2081. case ClientLib.Base.EResourceType.Gold:
  2082. return MaelstromTools.Statics.Dollar;
  2083. break;
  2084. default:
  2085. return "";
  2086. break;
  2087. }
  2088. }
  2089. }
  2090. });
  2091.  
  2092. // define Util
  2093. //ClientLib.Data.Cities.prototype.GetCityByCoord
  2094. //ClientLib.Data.City.prototype.get_HasIncommingAttack
  2095. qx.Class.define("MaelstromTools.Util", {
  2096. type: "static",
  2097. statics: {
  2098. ArrayUnique: function (array) {
  2099. var o = {};
  2100. var l = array.length;
  2101. r = [];
  2102. for (var i = 0; i < l; i++) o[array[i]] = array[i];
  2103. for (var i in o) r.push(o[i]);
  2104. return r;
  2105. },
  2106.  
  2107. ArraySize: function (array) {
  2108. var size = 0;
  2109. for (var key in array)
  2110. if (array.hasOwnProperty(key)) size++;
  2111. return size;
  2112. },
  2113.  
  2114. addLabel: function (widget, rowIdx, colIdx, value, width, textAlign, font, color, colSpan) {
  2115. try {
  2116. var label = new qx.ui.basic.Label().set({
  2117. value: Lang.gt(value)
  2118. });
  2119. if (width) {
  2120. label.setWidth(width);
  2121. }
  2122. if (textAlign) {
  2123. label.setTextAlign(textAlign);
  2124. }
  2125. if (color) {
  2126. label.setTextColor(color);
  2127. }
  2128. if (font) {
  2129. label.setFont(font);
  2130. }
  2131. if (!colSpan || colSpan == 0) {
  2132. colSpan = 1;
  2133. }
  2134.  
  2135. widget.add(label, {
  2136. row: rowIdx,
  2137. column: colIdx,
  2138. colSpan: colSpan
  2139. });
  2140. } catch (e) {
  2141. console.log("MaelstromTools.Util.addLabel: ", e);
  2142. }
  2143. },
  2144.  
  2145. addElement: function (widget, rowIdx, colIdx, element, colSpan) {
  2146. try {
  2147. if (!colSpan || colSpan == 0) {
  2148. colSpan = 1;
  2149. }
  2150. widget.add(element, {
  2151. row: rowIdx,
  2152. column: colIdx,
  2153. colSpan: colSpan
  2154. });
  2155. } catch (e) {
  2156. console.log("MaelstromTools.Util.addElement: ", e);
  2157. }
  2158. },
  2159.  
  2160. addImage: function (widget, rowIdx, colIdx, image) {
  2161. try {
  2162. widget.add(image, {
  2163. row: rowIdx,
  2164. column: colIdx
  2165. });
  2166. } catch (e) {
  2167. console.log("MaelstromTools.Util.addImage: ", e);
  2168. }
  2169. },
  2170.  
  2171. getImage: function (name) {
  2172. var image = new qx.ui.basic.Image(MT_Base.images[name]);
  2173. image.setScale(true);
  2174. image.setWidth(20);
  2175. image.setHeight(20);
  2176. return image;
  2177. },
  2178.  
  2179. getAccessBaseButton: function (cityName, viewMode) {
  2180. try {
  2181. var cityButton = new qx.ui.form.Button(null, MT_Base.images["AccessBase"]).set({
  2182. appearance: "button-detailview-small",
  2183. toolTipText: Lang.gt("Access") + " " + cityName,
  2184. width: 20,
  2185. height: 20,
  2186. marginLeft: 5
  2187. });
  2188. cityButton.setUserData("cityId", MT_Cache.Cities[cityName].ID);
  2189. cityButton.setUserData("viewMode", viewMode);
  2190. cityButton.addListener("execute", function (e) {
  2191. MaelstromTools.Util.accessBase(e.getTarget().getUserData("cityId"), e.getTarget().getUserData("viewMode"));
  2192. }, this);
  2193. return cityButton;
  2194. } catch (e) {
  2195. console.log("MaelstromTools.Util.getAccessBaseButton: ", e);
  2196. }
  2197. },
  2198.  
  2199. getFocusBaseButton: function (cityName) {
  2200. try {
  2201. var cityButton = new qx.ui.form.Button(null, MT_Base.images["FocusBase"]).set({
  2202. appearance: "button-detailview-small",
  2203. toolTipText: Lang.gt("Focus on") + " " + cityName,
  2204. width: 20,
  2205. height: 20,
  2206. marginLeft: 5
  2207. });
  2208. cityButton.setUserData("cityId", MT_Cache.Cities[cityName].ID);
  2209. cityButton.addListener("execute", function (e) {
  2210. MaelstromTools.Util.focusBase(e.getTarget().getUserData("cityId"));
  2211. }, this);
  2212. return cityButton;
  2213. } catch (e) {
  2214. console.log("MaelstromTools.Util.getFocusBaseButton: ", e);
  2215. }
  2216. },
  2217.  
  2218. accessBase: function (cityId, viewMode) {
  2219. try {
  2220. if (cityId > 0) {
  2221. var ncity = MaelstromTools.Wrapper.GetCity(cityId);
  2222.  
  2223. if (ncity != null && !ncity.get_IsGhostMode()) {
  2224. if (viewMode) {
  2225. webfrontend.gui.UtilView.openVisModeInMainWindow(viewMode, cityId, false);
  2226. } else {
  2227. webfrontend.gui.UtilView.openCityInMainWindow(cityId);
  2228. }
  2229. }
  2230. }
  2231. } catch (e) {
  2232. console.log("MaelstromTools.Util.accessBase: ", e);
  2233. }
  2234. },
  2235. focusBase: function (cityId) {
  2236. try {
  2237. if (cityId > 0) {
  2238. var ncity = MaelstromTools.Wrapper.GetCity(cityId);
  2239.  
  2240. if (ncity != null && !ncity.get_IsGhostMode()) {
  2241. webfrontend.gui.UtilView.centerCityOnRegionViewWindow(cityId);
  2242. }
  2243. }
  2244. } catch (e) {
  2245. console.log("MaelstromTools.Util.focusBase: ", e);
  2246. }
  2247. },
  2248.  
  2249. recallSupport: function (cityName) {
  2250. try {
  2251. var ncity = MT_Cache.Cities[cityName]["Object"];
  2252. ncity.RecallDedicatedSupport();
  2253. } catch (e) {
  2254. console.log("MaelstromTools.Util.recallSupport: ", e);
  2255. }
  2256. },
  2257.  
  2258. recallAllSupport: function () {
  2259. try {
  2260. MT_Cache.updateCityCache();
  2261. for (var cityName in MT_Cache.Cities) {
  2262. var ncity = MT_Cache.Cities[cityName]["Object"];
  2263. ncity.RecallDedicatedSupport();
  2264. }
  2265. } catch (e) {
  2266. console.log("MaelstromTools.Util.recallAllSupport: ", e);
  2267. }
  2268. },
  2269.  
  2270. checkIfSupportIsAllowed: function (selectedBase) {
  2271. try {
  2272. if (selectedBase.get_VisObjectType() != ClientLib.Vis.VisObject.EObjectType.RegionCityType) {
  2273. return false;
  2274. }
  2275. if (selectedBase.get_Type() != ClientLib.Vis.Region.RegionCity.ERegionCityType.Own && selectedBase.get_Type() != ClientLib.Vis.Region.RegionCity.ERegionCityType.Alliance) {
  2276. return false;
  2277. }
  2278. return true;
  2279. } catch (e) {
  2280. console.log("MaelstromTools.Util.checkIfSupportIsAllowed: ", e);
  2281. return false;
  2282. }
  2283. },
  2284.  
  2285. calibrateWholeSupportOnSelectedBase: function () {
  2286. if (this.checkIfSupportIsAllowed(MT_Cache.SelectedBaseForMenu)) {
  2287. this.calibrateWholeSupport(MT_Cache.SelectedBaseForMenu);
  2288. }
  2289. },
  2290.  
  2291. calibrateWholeSupport: function (targetRegionCity) {
  2292. try {
  2293. MT_Cache.updateCityCache();
  2294. for (var cityName in MT_Cache.Cities) {
  2295. var ncity = MT_Cache.Cities[cityName]["Object"];
  2296. //var targetCity = MaelstromTools.Wrapper.GetCity(targetCityId);
  2297. var weapon = ncity.get_SupportWeapon();
  2298.  
  2299. //console.log("checking support weapon for " + ncity.get_Name() + " calibrating on " + targetRegionCity.get_Name());
  2300.  
  2301. if (targetRegionCity != null && weapon != null) {
  2302. //console.log("city at " + ncity.get_X() + " / " + ncity.get_Y());
  2303. //console.log("targetRegionCity at " + targetRegionCity.get_RawX() + " / " + targetRegionCity.get_RawY());
  2304. //var distance = ClientLib.Base.Util.CalculateDistance(ncity.get_X(), ncity.get_Y(), targetRegionCity.get_RawX(), targetRegionCity.get_RawY());
  2305. var dx = (ncity.get_X() - targetRegionCity.get_RawX());
  2306. var dy = (ncity.get_Y() - targetRegionCity.get_RawY());
  2307. var distance = ((dx * dx) + (dy * dy));
  2308. var range = MaelstromTools.Wrapper.GetSupportWeaponRange(weapon);
  2309. //console.log("distance is " + distance);
  2310. //console.log("range isy " + range*range);
  2311. if (distance <= (range * range)) {
  2312. ncity.SetDedicatedSupport(targetRegionCity.get_Id());
  2313. }
  2314. }
  2315. }
  2316. } catch (e) {
  2317. console.log("MaelstromTools.Util.calibrateWholeSupport: ", e);
  2318. }
  2319. },
  2320.  
  2321. // visCity : ClientLib.Vis.Region.RegionObject
  2322. getResources: function (visCity) { // to verifier against PerforceChangelist>=376877
  2323. try {
  2324. var loot = new Object();
  2325. if (visCity.get_X() < 0 || visCity.get_Y() < 0) {
  2326. loot["LoadState"] = 0;
  2327. return loot;
  2328. }
  2329. var currentOwnCity = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity();
  2330.  
  2331. var distance = ClientLib.Base.Util.CalculateDistance(currentOwnCity.get_X(), currentOwnCity.get_Y(), visCity.get_RawX(), visCity.get_RawY());
  2332. var maxAttackDistance = ClientLib.Data.MainData.GetInstance().get_Server().get_MaxAttackDistance();
  2333. if (distance > maxAttackDistance) {
  2334. loot["LoadState"] = -1;
  2335. return loot;
  2336. }
  2337.  
  2338. var ncity = MaelstromTools.Wrapper.GetCity(visCity.get_Id());
  2339. /* ClientLib.Data.CityBuildings */
  2340. //var cityBuildings = ncity.get_CityBuildingsData();
  2341. var cityUnits = ncity.get_CityUnitsData();
  2342.  
  2343. //var buildings = MaelstromTools.Wrapper.GetBuildings(cityBuildings);
  2344. var buildings = ncity.get_Buildings().d;
  2345. var defenseUnits = MaelstromTools.Wrapper.GetDefenseUnits(cityUnits);
  2346. //var defenseUnits = MaelstromTools.Wrapper.GetDefenseUnits();
  2347.  
  2348. /*for(var u in buildings) {
  2349. console.log(buildings[u].get_MdbBuildingId());
  2350. console.log("----------------");
  2351. }*/
  2352.  
  2353. var buildingLoot = MaelstromTools.Util.getResourcesPart(buildings);
  2354. //var buildingLoot2 = MaelstromTools.Util.getResourcesPart(this.collectBuildings(ncity));
  2355.  
  2356. var unitLoot = MaelstromTools.Util.getResourcesPart(defenseUnits);
  2357.  
  2358. loot[MaelstromTools.Statics.Tiberium] = buildingLoot[ClientLib.Base.EResourceType.Tiberium] + unitLoot[ClientLib.Base.EResourceType.Tiberium];
  2359. loot[MaelstromTools.Statics.Crystal] = buildingLoot[ClientLib.Base.EResourceType.Crystal] + unitLoot[ClientLib.Base.EResourceType.Crystal];
  2360. loot[MaelstromTools.Statics.Dollar] = buildingLoot[ClientLib.Base.EResourceType.Gold] + unitLoot[ClientLib.Base.EResourceType.Gold];
  2361. loot[MaelstromTools.Statics.Research] = buildingLoot[ClientLib.Base.EResourceType.ResearchPoints] + unitLoot[ClientLib.Base.EResourceType.ResearchPoints];
  2362. loot["Factor"] = loot[MaelstromTools.Statics.Tiberium] + loot[MaelstromTools.Statics.Crystal] + loot[MaelstromTools.Statics.Dollar] + loot[MaelstromTools.Statics.Research];
  2363. loot["CPNeeded"] = currentOwnCity.CalculateAttackCommandPointCostToCoord(ncity.get_X(), ncity.get_Y());
  2364. loot["LoadState"] = (loot["Factor"] > 0 ? 1 : 0);
  2365. loot["Total"] = loot[MaelstromTools.Statics.Research] + loot[MaelstromTools.Statics.Tiberium] + loot[MaelstromTools.Statics.Crystal] + loot[MaelstromTools.Statics.Dollar];
  2366.  
  2367. /*console.log("Building loot");
  2368. console.log( buildingLoot[ClientLib.Base.EResourceType.Tiberium] + " vs " + buildingLoot2[ClientLib.Base.EResourceType.Tiberium]);
  2369. console.log( buildingLoot[ClientLib.Base.EResourceType.Crystal] + " vs " + buildingLoot2[ClientLib.Base.EResourceType.Crystal]);
  2370. console.log( buildingLoot[ClientLib.Base.EResourceType.Gold] + " vs " + buildingLoot2[ClientLib.Base.EResourceType.Gold]);
  2371. console.log( buildingLoot[ClientLib.Base.EResourceType.ResearchPoints] + " vs " + buildingLoot2[ClientLib.Base.EResourceType.ResearchPoints]);
  2372. console.log("-------------");*/
  2373. return loot;
  2374. } catch (e) {
  2375. console.log("MaelstromTools.Util.getResources", e);
  2376. }
  2377. },
  2378. /*
  2379. collectBuildings: function(ncity) {
  2380. var cityBuildings = ncity.get_CityBuildingsData();
  2381. var buildings = new Array();
  2382. var count = 0;
  2383. // ncity.GetNumBuildings()
  2384. for(var i = 0; i < 100000; i++) {
  2385. var building = cityBuildings.GetBuildingByMDBId(i);
  2386. if(!building) {
  2387. continue;
  2388. }
  2389. //console.log(building.get_TechName() + " - " + ncity.get_CityFaction() + " - " + ClientLib.Base.Tech.GetTechIdFromTechNameAndFaction(building.get_TechName(), ncity.get_CityFaction()) + " at lvl " + building.get_CurrentLevel());
  2390. buildings.push(building);
  2391. //buildings[count++] = building;
  2392. }
  2393. return buildings; //MaelstromTools.Util.ArrayUnique(buildings);
  2394. },*/
  2395.  
  2396. getResourcesPart: function (cityEntities) {
  2397. try {
  2398. var loot = [0, 0, 0, 0, 0, 0, 0, 0];
  2399. if (cityEntities == null) {
  2400. return loot;
  2401. }
  2402.  
  2403. var objcityEntities = [];
  2404. if (PerforceChangelist >= 376877) { //new
  2405. for (var o in cityEntities) objcityEntities.push(cityEntities[o]);
  2406. } else { //old
  2407. for (var i = 0; i < cityEntities.length; i++) objcityEntities.push(cityEntities[i]);
  2408. }
  2409.  
  2410. for (var i = 0; i < objcityEntities.length; i++) {
  2411. var cityEntity = objcityEntities[i];
  2412. var unitLevelRequirements = MaelstromTools.Wrapper.GetUnitLevelRequirements(cityEntity);
  2413.  
  2414. for (var x = 0; x < unitLevelRequirements.length; x++) {
  2415. loot[unitLevelRequirements[x].Type] += unitLevelRequirements[x].Count * cityEntity.get_HitpointsPercent();
  2416. if (cityEntity.get_HitpointsPercent() < 1.0) {
  2417. // destroyed
  2418.  
  2419. }
  2420. }
  2421. }
  2422.  
  2423. return loot;
  2424. } catch (e) {
  2425. console.log("MaelstromTools.Util.getResourcesPart", e);
  2426. }
  2427. }
  2428.  
  2429. /*
  2430. findBuildings: function(city) {
  2431. for (var k in city) {
  2432. if ((typeof(city[k]) == "object") && city[k] && city[k] && 0 in city[k]) {
  2433. if ((typeof(city[k][0]) == "object") && city[k][0] && "BuildingDBId" in city[k][0]) {
  2434. return city[k];
  2435. }
  2436. }
  2437. }
  2438. return [];
  2439. }*/
  2440. }
  2441. });
  2442.  
  2443. // define Wrapper
  2444. qx.Class.define("MaelstromTools.Wrapper", {
  2445. type: "static",
  2446. statics: {
  2447. GetStepTime: function (step, defaultString) {
  2448. if (!defaultString) {
  2449. defaultString = "";
  2450. }
  2451. var endTime = ClientLib.Data.MainData.GetInstance().get_Time().GetTimespanString(step, ClientLib.Data.MainData.GetInstance().get_Time().GetServerStep());
  2452. if (endTime == "00:00") {
  2453. return defaultString;
  2454. }
  2455. return endTime;
  2456. },
  2457.  
  2458. FormatNumbersCompact: function (value) {
  2459. if (PerforceChangelist >= 387751) { //new
  2460. return phe.cnc.gui.util.Numbers.formatNumbersCompact(value);
  2461. } else { //old
  2462. return webfrontend.gui.Util.formatNumbersCompact(value);
  2463. }
  2464. },
  2465.  
  2466. GetDateTimeString: function (value) {
  2467. return phe.cnc.Util.getDateTimeString(value);
  2468. },
  2469.  
  2470. FormatTimespan: function (value) {
  2471. return ClientLib.Vis.VisMain.FormatTimespan(value);
  2472. },
  2473.  
  2474. GetSupportWeaponRange: function (weapon) {
  2475. return weapon.r;
  2476. },
  2477.  
  2478. GetCity: function (cityId) {
  2479. return ClientLib.Data.MainData.GetInstance().get_Cities().GetCity(cityId);
  2480. },
  2481.  
  2482. RepairAll: function (ncity, visMode) {
  2483. var oldMode = ClientLib.Vis.VisMain.GetInstance().get_Mode();
  2484. ClientLib.Vis.VisMain.GetInstance().set_Mode(visMode);
  2485. ncity.RepairAll();
  2486. ClientLib.Vis.VisMain.GetInstance().set_Mode(oldMode);
  2487. },
  2488.  
  2489. CanRepairAll: function (ncity, viewMode) {
  2490. try {
  2491. /*var oldMode = ClientLib.Vis.VisMain.GetInstance().get_Mode();
  2492. ClientLib.Vis.VisMain.GetInstance().set_Mode(visMode);
  2493. var retVal = ncity.CanRepairAll();
  2494. ClientLib.Vis.VisMain.GetInstance().set_Mode(oldMode);
  2495. return retVal;*/
  2496.  
  2497. var repairData = ncity.get_CityRepairData();
  2498. var myRepair = repairData.CanRepair(0, viewMode);
  2499. repairData.UpdateCachedFullRepairAllCost(viewMode);
  2500. return ((myRepair != null) && (!ncity.get_IsLocked() || (viewMode != ClientLib.Vis.Mode.ArmySetup)));
  2501.  
  2502. return false;
  2503. } catch (e) {
  2504. console.log("MaelstromTools.Wrapper.CanRepairAll: ", e);
  2505. return false;
  2506. }
  2507. },
  2508. /*GetBuildings: function (cityBuildings) {
  2509. if (PerforceChangelist >= 376877) { //new
  2510. return (cityBuildings.get_Buildings() != null ? cityBuildings.get_Buildings().d : null);
  2511. } else { //old
  2512. return (cityBuildings.get_Buildings() != null ? cityBuildings.get_Buildings().l : null);
  2513. }
  2514. },*/
  2515. GetDefenseUnits: function (cityUnits) {
  2516. //GetDefenseUnits: function () {
  2517. if (PerforceChangelist >= 392583) { //endgame patch
  2518. return (cityUnits.get_DefenseUnits() != null ? cityUnits.get_DefenseUnits().d : null);
  2519. } else { //old
  2520. var defenseObjects = [];
  2521. for (var x = 0; x < 9; x++) {
  2522. for (var y = 0; y < 8; y++) {
  2523. var defenseObject = ClientLib.Vis.VisMain.GetInstance().get_DefenseSetup().GetDefenseObjectFromPosition((x * ClientLib.Vis.VisMain.GetInstance().get_City().get_GridWidth()),(y * ClientLib.Vis.VisMain.GetInstance().get_City().get_GridHeight()));
  2524. if (defenseObject !== null && defenseObject.get_CityEntity() !== null) {
  2525. defenseObjects.push(defenseObject.get_UnitDetails());
  2526. }
  2527. }
  2528. }
  2529. return defenseObjects;
  2530. }
  2531. },
  2532. GetUnitLevelRequirements: function (cityEntity) {
  2533. if (PerforceChangelist >= 376877) { //new
  2534. return (cityEntity.get_UnitLevelRepairRequirements() != null ? cityEntity.get_UnitLevelRepairRequirements() : null);
  2535. } else { //old
  2536. return (cityEntity.get_UnitLevelRequirements() != null ? cityEntity.get_UnitLevelRequirements() : null);
  2537. }
  2538. },
  2539.  
  2540. GetBaseLevel: function (ncity) {
  2541. return (Math.floor(ncity.get_LvlBase() * 100) / 100).toFixed(2);
  2542. }
  2543. /*,
  2544. GetPointsByLevelWithThresholds: function (_levelThresholds,_levelFactors,_iLevel) {
  2545. var result=0;
  2546. var lastLevel=_iLevel;
  2547. if(_levelThresholds.length != _levelFactors.length) {
  2548. return 0;
  2549. }
  2550. for (var i=(_levelThresholds.length - 1); (i >= 0); i--) {
  2551. var threshold=(_levelThresholds[i] - 1);
  2552. if(lastLevel >= threshold) {
  2553. result += ((lastLevel - threshold) * _levelFactors[i]);
  2554. lastLevel=threshold;
  2555. }
  2556. }
  2557. return result;
  2558. },
  2559. GetArmyPoints: function(_iLevel) {
  2560. var server = ClientLib.Data.MainData.GetInstance().get_Server();
  2561. var m_iArmyPointsPerLevelThresholds = server.get_ArmyPointsPerLevelThresholds();
  2562. var m_fArmyPointsPerLevel = server.get_ArmyPointsPerLevel();
  2563. _iLevel += 4;
  2564. var armyPoints = MaelstromTools.Wrapper.GetPointsByLevelWithThresholds(m_iArmyPointsPerLevelThresholds, m_fArmyPointsPerLevel, _iLevel);
  2565. return Math.min(armyPoints, server.get_MaxArmyPoints());
  2566. },
  2567. GetBuilding: function(ncity, techName) {
  2568. return ncity.get_CityBuildingsData().GetUniqueBuildingByTechName(techName)
  2569. },
  2570. GetCommandCenter: function(ncity) {
  2571. //var techName = ClientLib.Base.Tech.GetTechIdFromTechNameAndFaction(ClientLib.Base.ETechName.Command_Center, ClientLib.Data.MainData.GetInstance().get_Player().get_Faction());
  2572.  
  2573. return MaelstromTools.Wrapper.GetBuilding(ncity, ClientLib.Base.ETechName.Command_Center);
  2574. // conyard return this.GetBuildingCondition$0(ClientLib.Base.Tech.GetTechIdFromTechNameAndFaction$0(0, ClientLib.Data.MainData.GetInstance$9().get_Player$2().get_Faction$2()));
  2575. // ClientLib.Data.City.prototype.GetOffenseConditionInPercent=ClientLib.Data.City.prototype.GetOffenseConditionInPercent$0;
  2576. }*/
  2577. }
  2578. });
  2579.  
  2580. // define LocalStorage
  2581. qx.Class.define("MaelstromTools.LocalStorage", {
  2582. type: "static",
  2583. statics: {
  2584. isSupported: function () {
  2585. return typeof (Storage) !== "undefined";
  2586. },
  2587. set: function (key, value) {
  2588. try {
  2589. if (MaelstromTools.LocalStorage.isSupported()) {
  2590. localStorage["CCTA_MaelstromTools_" + key] = JSON.stringify(value);
  2591. }
  2592. } catch (e) {
  2593. console.log("MaelstromTools.LocalStorage.set: ", e);
  2594. }
  2595. },
  2596. get: function (key, defaultValueIfNotSet) {
  2597. try {
  2598. if (MaelstromTools.LocalStorage.isSupported()) {
  2599. if (localStorage["CCTA_MaelstromTools_" + key] != null && localStorage["CCTA_MaelstromTools_" + key] != 'undefined') {
  2600. return JSON.parse(localStorage["CCTA_MaelstromTools_" + key]);
  2601. }
  2602. }
  2603. } catch (e) {
  2604. console.log("MaelstromTools.LocalStorage.get: ", e);
  2605. }
  2606. return defaultValueIfNotSet;
  2607. },
  2608. clearAll: function () {
  2609. try {
  2610. if (!MaelstromTools.LocalStorage.isSupported()) {
  2611. return;
  2612. }
  2613. for (var key in localStorage) {
  2614. if (key.indexOf("CCTA_MaelstromTools_") == 0) {
  2615. localStorage.removeItem(key);
  2616. }
  2617. }
  2618. } catch (e) {
  2619. console.log("MaelstromTools.LocalStorage.clearAll: ", e);
  2620. }
  2621. }
  2622. }
  2623. });
  2624.  
  2625. // define Cache
  2626. qx.Class.define("MaelstromTools.Cache", {
  2627. type: "singleton",
  2628. extend: qx.core.Object,
  2629. members: {
  2630. CityCount: 0,
  2631. Cities: null,
  2632. SelectedBaseForMenu: null,
  2633. SelectedBaseResources: null,
  2634. SelectedBaseForLoot: null,
  2635.  
  2636. updateCityCache: function () {
  2637. try {
  2638. this.CityCount = 0;
  2639. this.Cities = Object();
  2640.  
  2641. var cities = ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities();
  2642. for (var cindex in cities.d) {
  2643. this.CityCount++;
  2644. var ncity = MaelstromTools.Wrapper.GetCity(cindex);
  2645. var ncityName = ncity.get_Name();
  2646. this.Cities[ncityName] = Object();
  2647. this.Cities[ncityName]["ID"] = cindex;
  2648. this.Cities[ncityName]["Object"] = ncity;
  2649. }
  2650. } catch (e) {
  2651. console.log("MaelstromTools.Cache.updateCityCache: ", e);
  2652. }
  2653. },
  2654.  
  2655. updateLoot: function (visCity) {
  2656. var cityId = visCity.get_Id();
  2657.  
  2658. if (this.SelectedBaseForLoot != null && cityId == this.SelectedBaseForLoot.get_Id() && this.SelectedBaseResources != null && this.SelectedBaseResources["LoadState"] > 0) {
  2659. return -2;
  2660. }
  2661. this.SelectedBaseForLoot = visCity;
  2662. this.SelectedBaseResources = MaelstromTools.Util.getResources(visCity);
  2663. return this.SelectedBaseResources["LoadState"];
  2664. }
  2665. }
  2666. });
  2667.  
  2668. // define HuffyTools.ImageRender
  2669. qx.Class.define("HuffyTools.ImageRender", {
  2670. extend: qx.ui.table.cellrenderer.AbstractImage,
  2671. construct: function (width, height) {
  2672. this.base(arguments);
  2673. if (width) {
  2674. this.__imageWidth = width;
  2675. }
  2676. if (height) {
  2677. this.__imageHeight = height;
  2678. }
  2679. this.__am = qx.util.AliasManager.getInstance();
  2680. },
  2681. members: {
  2682. __am: null,
  2683. __imageHeight: 16,
  2684. __imageWidth: 16,
  2685. // overridden
  2686. _identifyImage: function (cellInfo) {
  2687. var imageHints = {
  2688. imageWidth: this.__imageWidth,
  2689. imageHeight: this.__imageHeight
  2690. };
  2691. if (cellInfo.value == "") {
  2692. imageHints.url = null;
  2693. } else {
  2694. imageHints.url = this.__am.resolve(cellInfo.value);
  2695. }
  2696. imageHints.tooltip = cellInfo.tooltip;
  2697. return imageHints;
  2698. }
  2699. },
  2700. destruct: function () {
  2701. this.__am = null;
  2702. }
  2703. });
  2704.  
  2705. // define HuffyTools.ReplaceRender
  2706. qx.Class.define("HuffyTools.ReplaceRender", {
  2707. extend: qx.ui.table.cellrenderer.Default,
  2708. properties: {
  2709. replaceFunction: {
  2710. check: "Function",
  2711. nullable: true,
  2712. init: null
  2713. }
  2714. },
  2715. members: {
  2716. // overridden
  2717. _getContentHtml: function (cellInfo) {
  2718. var value = cellInfo.value;
  2719. var replaceFunc = this.getReplaceFunction();
  2720. // use function
  2721. if (replaceFunc) {
  2722. cellInfo.value = replaceFunc(value);
  2723. }
  2724. return qx.bom.String.escape(this._formatValue(cellInfo));
  2725. }
  2726. }
  2727. });
  2728.  
  2729. qx.Class.define("HuffyTools.CityCheckBox", {
  2730. extend: qx.ui.form.CheckBox,
  2731. members: {
  2732. HT_CityID: null
  2733. }
  2734. });
  2735.  
  2736. // define HuffyTools.UpgradePriorityGUI
  2737. qx.Class.define("HuffyTools.UpgradePriorityGUI", {
  2738. type: "singleton",
  2739. extend: MaelstromTools.DefaultObject,
  2740. members: {
  2741. HT_TabView: null,
  2742. HT_Options: null,
  2743. HT_ShowOnlyTopBuildings: null,
  2744. HT_ShowOnlyAffordableBuildings: null,
  2745. HT_CityBuildings: null,
  2746. HT_Pages: null,
  2747. HT_Tables: null,
  2748. HT_Models: null,
  2749. HT_SelectedResourceType: null,
  2750. BuildingList: null,
  2751. upgradeInProgress: null,
  2752. init: function () {
  2753. /*
  2754. Done:
  2755. - Added cost per gain to the lists
  2756. - Added building coordinates to the lists
  2757. - Only display the top affordable and not affordable building
  2758. - Persistent filter by city, top and affordable per resource type
  2759. - Reload onTabChange for speed optimization
  2760. - Estimated time until upgrade is affordable
  2761. ToDo:
  2762. - let the user decide to sort by colums he like i.e. timefactor or cost/gain and save it in the configuration
  2763. - integrate buttons to transfer resources ?
  2764.  
  2765. */
  2766. try {
  2767. this.HT_SelectedResourceType = -1;
  2768. this.IsTimerEnabled = false;
  2769. this.upgradeInProgress = false;
  2770.  
  2771. this.HT_TabView = new qx.ui.tabview.TabView();
  2772. this.HT_TabView.set({
  2773. contentPadding: 0,
  2774. appearance: "tabview",
  2775. margin: 5,
  2776. barPosition: 'left'
  2777. });
  2778. this.Widget = new qx.ui.tabview.Page("UpgradePriority");
  2779. this.Widget.setPadding(0);
  2780. this.Widget.setMargin(0);
  2781. this.Widget.setBackgroundColor("#BEC8CF");
  2782. this.Widget.setLayout(new qx.ui.layout.VBox(2));
  2783. //this.Widget.add(this.HT_Options);
  2784. this.Widget.add(this.HT_TabView, {
  2785. flex: 1
  2786. });
  2787. this.Window.setPadding(0);
  2788. this.Window.set({
  2789. resizable: true
  2790. });
  2791.  
  2792. this.Window.removeAll();
  2793. this.Window.add(this.Widget);
  2794.  
  2795. this.BuildingList = new Array;
  2796. this.HT_Models = new Array;
  2797. this.HT_Tables = new Array;
  2798. this.HT_Pages = new Array;
  2799.  
  2800. this.createTabPage(ClientLib.Base.EResourceType.Tiberium);
  2801. this.createTable(ClientLib.Base.EResourceType.Tiberium);
  2802. this.HT_Tables[ClientLib.Base.EResourceType.Tiberium].addListener("cellClick", function (e) {
  2803. this.upgradeBuilding(e, ClientLib.Base.EResourceType.Tiberium);
  2804. }, this);
  2805.  
  2806.  
  2807. this.createTabPage(ClientLib.Base.EResourceType.Crystal);
  2808. this.createTable(ClientLib.Base.EResourceType.Crystal);
  2809. this.HT_Tables[ClientLib.Base.EResourceType.Crystal].addListener("cellClick", function (e) {
  2810. this.upgradeBuilding(e, ClientLib.Base.EResourceType.Crystal);
  2811. }, this);
  2812.  
  2813. this.createTabPage(ClientLib.Base.EResourceType.Power);
  2814. this.createTable(ClientLib.Base.EResourceType.Power);
  2815. this.HT_Tables[ClientLib.Base.EResourceType.Power].addListener("cellClick", function (e) {
  2816. this.upgradeBuilding(e, ClientLib.Base.EResourceType.Power);
  2817. }, this);
  2818.  
  2819. this.createTabPage(ClientLib.Base.EResourceType.Gold);
  2820. this.createTable(ClientLib.Base.EResourceType.Gold);
  2821. this.HT_Tables[ClientLib.Base.EResourceType.Gold].addListener("cellClick", function (e) {
  2822. this.upgradeBuilding(e, ClientLib.Base.EResourceType.Gold);
  2823. }, this);
  2824.  
  2825.  
  2826. MT_Cache.updateCityCache();
  2827. this.HT_Options = new Array();
  2828. this.HT_ShowOnlyTopBuildings = new Array();
  2829. this.HT_ShowOnlyAffordableBuildings = new Array();
  2830. this.HT_CityBuildings = new Array();
  2831. for (var mPage in this.HT_Pages) {
  2832. this.createOptions(mPage);
  2833. this.HT_Pages[mPage].add(this.HT_Options[mPage]);
  2834. this.HT_Pages[mPage].add(this.HT_Tables[mPage], {
  2835. flex: 1
  2836. });
  2837. this.HT_TabView.add(this.HT_Pages[mPage]);
  2838. }
  2839.  
  2840. // Zeigen wir Dollars an !
  2841. this.HT_TabView.setSelection([this.HT_TabView.getChildren()[2]]);
  2842. this.HT_SelectedResourceType = ClientLib.Base.EResourceType.Gold;
  2843. } catch (e) {
  2844. console.log("HuffyTools.UpgradePriority.init: ", e);
  2845. }
  2846. },
  2847. createOptions: function (eType) {
  2848. var oBox = new qx.ui.layout.Flow();
  2849. var oOptions = new qx.ui.container.Composite(oBox);
  2850. oOptions.setMargin(5);
  2851. this.HT_ShowOnlyTopBuildings[eType] = new qx.ui.form.CheckBox(Lang.gt("display only top buildings"));
  2852. this.HT_ShowOnlyTopBuildings[eType].setMargin(5);
  2853. this.HT_ShowOnlyTopBuildings[eType].setValue(MaelstromTools.LocalStorage.get("UGL_TOPBUILDINGS_" + eType, true));
  2854. this.HT_ShowOnlyTopBuildings[eType].addListener("execute", this.CBChanged, this);
  2855. oOptions.add(this.HT_ShowOnlyTopBuildings[eType], {
  2856. left: 10,
  2857. top: 10
  2858. });
  2859. this.HT_ShowOnlyAffordableBuildings[eType] = new qx.ui.form.CheckBox(Lang.gt("display only affordable buildings"));
  2860. this.HT_ShowOnlyAffordableBuildings[eType].setMargin(5);
  2861. this.HT_ShowOnlyAffordableBuildings[eType].setValue(MaelstromTools.LocalStorage.get("UGL_AFFORDABLE_" + eType, true));
  2862. this.HT_ShowOnlyAffordableBuildings[eType].addListener("execute", this.CBChanged, this);
  2863. oOptions.add(this.HT_ShowOnlyAffordableBuildings[eType], {
  2864. left: 10,
  2865. top: 10,
  2866. lineBreak: true
  2867. });
  2868. this.HT_CityBuildings[eType] = new Array();
  2869. for (var cname in MT_Cache.Cities) {
  2870. var oCity = MT_Cache.Cities[cname].Object;
  2871. var oCityBuildings = new HuffyTools.CityCheckBox(cname);
  2872. oCityBuildings.HT_CityID = oCity.get_Id();
  2873. oCityBuildings.setMargin(5);
  2874. oCityBuildings.setValue(MaelstromTools.LocalStorage.get("UGL_CITYFILTER_" + eType + "_" + oCity.get_Id(), true));
  2875. oCityBuildings.addListener("execute", this.CBChanged, this);
  2876. oOptions.add(oCityBuildings, {
  2877. left: 10,
  2878. top: 10
  2879. });
  2880. this.HT_CityBuildings[eType][cname] = oCityBuildings;
  2881. }
  2882. this.HT_Options[eType] = oOptions;
  2883. },
  2884. createTable: function (eType) {
  2885. try {
  2886. this.HT_Models[eType] = new qx.ui.table.model.Simple();
  2887. this.HT_Models[eType].setColumns(["ID", Lang.gt("City"), Lang.gt("Type (coord)"), Lang.gt("to Level"), Lang.gt("Gain/h"), Lang.gt("Factor"), Lang.gt("Tiberium"), Lang.gt("Power"), Lang.gt("Tib/gain"), Lang.gt("Pow/gain"), Lang.gt("ETA"), Lang.gt("Upgrade"), "State"]);
  2888. this.HT_Tables[eType] = new qx.ui.table.Table(this.HT_Models[eType]);
  2889. this.HT_Tables[eType].setColumnVisibilityButtonVisible(false);
  2890. this.HT_Tables[eType].setColumnWidth(0, 0);
  2891. this.HT_Tables[eType].setColumnWidth(1, 90);
  2892. this.HT_Tables[eType].setColumnWidth(2, 120);
  2893. this.HT_Tables[eType].setColumnWidth(3, 55);
  2894. this.HT_Tables[eType].setColumnWidth(4, 70);
  2895. this.HT_Tables[eType].setColumnWidth(5, 60);
  2896. this.HT_Tables[eType].setColumnWidth(6, 70);
  2897. this.HT_Tables[eType].setColumnWidth(7, 70);
  2898. this.HT_Tables[eType].setColumnWidth(8, 70);
  2899. this.HT_Tables[eType].setColumnWidth(9, 70);
  2900. this.HT_Tables[eType].setColumnWidth(10, 70);
  2901. this.HT_Tables[eType].setColumnWidth(11, 40);
  2902. this.HT_Tables[eType].setColumnWidth(12, 0);
  2903. var tcm = this.HT_Tables[eType].getTableColumnModel();
  2904. tcm.setColumnVisible(0, false);
  2905. tcm.setColumnVisible(12, false);
  2906. tcm.setDataCellRenderer(4, new qx.ui.table.cellrenderer.Number().set({
  2907. numberFormat: new qx.util.format.NumberFormat().set({
  2908. maximumFractionDigits: 2,
  2909. minimumFractionDigits: 2
  2910. })
  2911. }));
  2912. tcm.setDataCellRenderer(5, new qx.ui.table.cellrenderer.Number().set({
  2913. numberFormat: new qx.util.format.NumberFormat().set({
  2914. maximumFractionDigits: 5,
  2915. minimumFractionDigits: 5
  2916. })
  2917. }));
  2918. tcm.setDataCellRenderer(6, new HuffyTools.ReplaceRender().set({
  2919. ReplaceFunction: this.formatTiberiumAndPower
  2920. }));
  2921. tcm.setDataCellRenderer(7, new HuffyTools.ReplaceRender().set({
  2922. ReplaceFunction: this.formatTiberiumAndPower
  2923. }));
  2924. tcm.setDataCellRenderer(11, new HuffyTools.ImageRender(40, 20));
  2925. } catch (e) {
  2926. console.log("HuffyTools.UpgradePriority.createTable: ", e);
  2927. }
  2928. },
  2929. createTabPage: function (resource_type) {
  2930. try {
  2931. var sName = MaelstromTools.Statics.LootTypeName(resource_type);
  2932. var oRes = new qx.ui.tabview.Page(Lang.gt(sName), MT_Base.images[sName]);
  2933. oRes.setLayout(new qx.ui.layout.VBox(2));
  2934. oRes.setPadding(5);
  2935. var btnTab = oRes.getChildControl("button");
  2936. btnTab.resetWidth();
  2937. btnTab.resetHeight();
  2938. btnTab.set({
  2939. show: "icon",
  2940. margin: 0,
  2941. padding: 0,
  2942. toolTipText: sName
  2943. });
  2944. btnTab.addListener("execute", this.TabChanged, [this, resource_type]);
  2945. this.HT_Pages[resource_type] = oRes;
  2946. return oRes;
  2947. } catch (e) {
  2948. console.log("HuffyTools.UpgradePriority.createTabPage: ", e);
  2949. }
  2950. },
  2951.  
  2952. TabChanged: function (e) {
  2953. try {
  2954. this[0].HT_SelectedResourceType = this[1];
  2955. this[0].UpgradeCompleted(null, null);
  2956. } catch (e) {
  2957. console.log("HuffyTools.UpgradePriority.TabChanged: ", e);
  2958. }
  2959. },
  2960.  
  2961. upgradeBuilding: function (e, eResourceType) {
  2962. if (this.upgradeInProgress == true) {
  2963. console.log("upgradeBuilding:", "upgrade in progress !");
  2964. return;
  2965. }
  2966. try {
  2967. if (e.getColumn() == 11) {
  2968. var buildingID = this.HT_Models[eResourceType].getValue(0, e.getRow());
  2969. var iState = parseInt(this.HT_Models[eResourceType].getValue(12, e.getRow()));
  2970. if (iState != 1) {
  2971. return;
  2972. }
  2973. if (buildingID in this.BuildingList) {
  2974. this.upgradeInProgress = true;
  2975. if (PerforceChangelist >= 382917) { //new
  2976. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", this.BuildingList[buildingID], phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, this.UpgradeCompleted), null, true);
  2977. } else { //old
  2978. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", this.BuildingList[buildingID], webfrontend.Util.createEventDelegate(ClientLib.Net.CommandResult, this, this.UpgradeCompleted), null, true);
  2979. }
  2980. }
  2981. }
  2982. } catch (e) {
  2983. console.log("HuffyTools.UpgradePriority.upgradeBuilding: ", e);
  2984. }
  2985. },
  2986. UpgradeCompleted: function (context, result) {
  2987. var self = this;
  2988. window.setTimeout(function () {
  2989. self.calc();
  2990. }, 1000);
  2991. this.upgradeInProgress = false;
  2992. },
  2993. CBChanged: function (e) {
  2994. this.UpgradeCompleted(null, null);
  2995. },
  2996. formatTiberiumAndPower: function (oValue) {
  2997. if (PerforceChangelist >= 387751) { //new
  2998. return phe.cnc.gui.util.Numbers.formatNumbersCompact(oValue);
  2999. } else { //old
  3000. return webfrontend.gui.Util.formatNumbersCompact(oValue);
  3001. }
  3002. },
  3003. updateCache: function () {
  3004. try {
  3005. if (!this.HT_TabView) {
  3006. this.init();
  3007. }
  3008. var eType = this.HT_SelectedResourceType;
  3009. var bTop = this.HT_ShowOnlyTopBuildings[eType].getValue();
  3010. MaelstromTools.LocalStorage.set("UGL_TOPBUILDINGS_" + eType, bTop);
  3011. var bAffordable = this.HT_ShowOnlyAffordableBuildings[eType].getValue();
  3012. MaelstromTools.LocalStorage.set("UGL_AFFORDABLE_" + eType, bAffordable);
  3013. var oCityFilter = new Array();
  3014. for (var cname in this.HT_CityBuildings[eType]) {
  3015. var oCityBuildings = this.HT_CityBuildings[eType][cname];
  3016. var bFilterBuilding = oCityBuildings.getValue();
  3017. MaelstromTools.LocalStorage.set("UGL_CITYFILTER_" + eType + "_" + oCityBuildings.HT_CityID, bFilterBuilding);
  3018. oCityFilter[cname] = bFilterBuilding;
  3019. }
  3020. window.HuffyTools.UpgradePriority.getInstance().collectData(bTop, bAffordable, oCityFilter, eType);
  3021. } catch (e) {
  3022. console.log("HuffyTools.UpgradePriority.updateCache: ", e);
  3023. }
  3024. },
  3025. setWidgetLabels: function () {
  3026. try {
  3027. var HuffyCalc = window.HuffyTools.UpgradePriority.getInstance();
  3028. var UpgradeList = HuffyCalc.Cache;
  3029.  
  3030. for (var eResourceType in UpgradeList) {
  3031. //var eResourceType = MaelstromTools.Statics.LootTypeName(eResourceName);
  3032. var rowData = [];
  3033.  
  3034. this.HT_Models[eResourceType].setData([]);
  3035.  
  3036. for (var mCity in UpgradeList[eResourceType]) {
  3037. for (var mBuilding in UpgradeList[eResourceType][mCity]) {
  3038. var UpItem = UpgradeList[eResourceType][mCity][mBuilding];
  3039. if (typeof (UpItem.Type) == "undefined") {
  3040. continue;
  3041. }
  3042. if (!(mBuilding in this.BuildingList)) {
  3043. this.BuildingList[UpItem.ID] = UpItem.Building;
  3044. }
  3045. var iTiberiumCosts = 0;
  3046. if (ClientLib.Base.EResourceType.Tiberium in UpItem.Costs) {
  3047. iTiberiumCosts = UpItem.Costs[ClientLib.Base.EResourceType.Tiberium];
  3048. }
  3049. var iTiberiumPerGain = 0;
  3050. if (ClientLib.Base.EResourceType.Tiberium in UpItem.Costs) {
  3051. iTiberiumPerGain = UpItem.Costs[ClientLib.Base.EResourceType.Tiberium] / UpItem.GainPerHour;
  3052. }
  3053. var iPowerCosts = 0;
  3054. if (ClientLib.Base.EResourceType.Power in UpItem.Costs) {
  3055. iPowerCosts = UpItem.Costs[ClientLib.Base.EResourceType.Power];
  3056. }
  3057. var iPowerPerGain = 0;
  3058. if (ClientLib.Base.EResourceType.Power in UpItem.Costs) {
  3059. iPowerPerGain = UpItem.Costs[ClientLib.Base.EResourceType.Power] / UpItem.GainPerHour;
  3060. }
  3061. var img = MT_Base.images["UpgradeBuilding"];
  3062. if (UpItem.Affordable == false) {
  3063. img = "";
  3064. }
  3065. var sType = UpItem.Type;
  3066. sType = sType + "(" + UpItem.PosX + ":" + UpItem.PosY + ")";
  3067. var iETA = 0;
  3068. if (UpItem.TimeTillUpgradable[ClientLib.Base.EResourceType.Tiberium] > 0) {
  3069. iETA = UpItem.TimeTillUpgradable[ClientLib.Base.EResourceType.Tiberium];
  3070. }
  3071. if (UpItem.TimeTillUpgradable[ClientLib.Base.EResourceType.Power] > iETA) {
  3072. iETA = UpItem.TimeTillUpgradable[ClientLib.Base.EResourceType.Power];
  3073. }
  3074. var sETA = "";
  3075. if (iETA > 0) {
  3076. sETA = ClientLib.Vis.VisMain.FormatTimespan(iETA);
  3077. }
  3078. var iState = 0;
  3079. if (UpItem.Affordable == true) {
  3080. iState = 1;
  3081. } else if (UpItem.AffordableByTransfer == true) {
  3082. iState = 2;
  3083. } else {
  3084. iState = 3;
  3085. }
  3086. rowData.push([UpItem.ID, mCity, sType, UpItem.Level, UpItem.GainPerHour, UpItem.Ticks, iTiberiumCosts, iPowerCosts, iTiberiumPerGain, iPowerPerGain, sETA, img, iState]);
  3087. }
  3088. }
  3089. this.HT_Models[eResourceType].setData(rowData);
  3090. }
  3091. } catch (e) {
  3092. console.log("HuffyTools.UpgradePriority.setWidgetLabels: ", e);
  3093. }
  3094. }
  3095. }
  3096. });
  3097.  
  3098. // define HuffyTools.UpgradePriority
  3099. qx.Class.define("HuffyTools.UpgradePriority", {
  3100. type: "singleton",
  3101. extend: qx.core.Object,
  3102. members: {
  3103. list_units: null,
  3104. list_buildings: null,
  3105.  
  3106. comparePrio: function (elem1, elem2) {
  3107. if (elem1.Ticks < elem2.Ticks) return -1;
  3108. if (elem1.Ticks > elem2.Ticks) return 1;
  3109. return 0;
  3110. },
  3111. getPrioList: function (city, arTechtypes, eModPackageSize, eModProduction, bOnlyTopBuildings, bOnlyAffordableBuildings) {
  3112. try {
  3113. var RSI = window.MaelstromTools.ResourceOverview.getInstance();
  3114. RSI.updateCache();
  3115. var TotalTiberium = 0;
  3116.  
  3117. for (var cityName in this.Cache) {
  3118. var cityCache = this.Cache[cityName];
  3119. var i = cityCache[MaelstromTools.Statics.Tiberium];
  3120. if (typeof (i) !== 'undefined') {
  3121. TotalTiberium += i;
  3122. //but never goes here during test.... // to optimize - to do
  3123. }
  3124. }
  3125. var resAll = new Array();
  3126. var prod = MaelstromTools.Production.getInstance().updateCache(city.get_Name());
  3127. //var buildings = MaelstromTools.Wrapper.GetBuildings(city.get_CityBuildingsData());
  3128. var buildings = city.get_Buildings().d;
  3129.  
  3130. // 376877 & old fixes
  3131. var objbuildings = [];
  3132. if (PerforceChangelist >= 376877) { //new
  3133. for (var o in buildings) objbuildings.push(buildings[o]);
  3134. } else { //old
  3135. for (var i = 0; i < buildings.length; i++) objbuildings.push(buildings[i]);
  3136. }
  3137.  
  3138.  
  3139. for (var i = 0; i < objbuildings.length; i++) {
  3140. var city_building = objbuildings[i];
  3141.  
  3142. // TODO: check for destroyed building
  3143.  
  3144. var iTechType = city_building.get_TechName();
  3145. var bSkip = true;
  3146. for (var iTypeKey in arTechtypes) {
  3147. if (arTechtypes[iTypeKey] == iTechType) {
  3148. bSkip = false;
  3149. break;
  3150. }
  3151. }
  3152. if (bSkip == true) {
  3153. continue;
  3154. }
  3155. var city_buildingdetailview = city.GetBuildingDetailViewInfo(city_building);
  3156. if (city_buildingdetailview == null) {
  3157. continue;
  3158. }
  3159. var bindex = city_building.get_Id();
  3160. var resbuilding = new Array();
  3161. resbuilding["ID"] = bindex;
  3162. resbuilding["Type"] = this.TechTypeName(parseInt(iTechType, 10));
  3163. resbuilding["PosX"] = city_building.get_CoordX();
  3164. resbuilding["PosY"] = city_building.get_CoordY();
  3165.  
  3166. resbuilding["Building"] = {
  3167. cityid: city.get_Id(),
  3168. posX: resbuilding["PosX"],
  3169. posY: resbuilding["PosY"],
  3170. isPaid: true
  3171. };
  3172.  
  3173. resbuilding["GainPerHour"] = 0;
  3174. resbuilding["Level"] = city_building.get_CurrentLevel() + 1;
  3175. for (var ModifierType in city_buildingdetailview.OwnProdModifiers.d) {
  3176. switch (parseInt(ModifierType, 10)) {
  3177. case eModPackageSize:
  3178. {
  3179. var ModOj = city_buildingdetailview.OwnProdModifiers.d[city_building.get_MainModifierTypeId()];
  3180. var Mod = (ModOj.TotalValue + ModOj.NewLvlDelta) / ClientLib.Data.MainData.GetInstance().get_Time().get_StepsPerHour();
  3181. resbuilding["GainPerHour"] += (city_buildingdetailview.OwnProdModifiers.d[ModifierType].NewLvlDelta / Mod);
  3182. break;
  3183. }
  3184. case eModProduction:
  3185. {
  3186. resbuilding["GainPerHour"] += city_buildingdetailview.OwnProdModifiers.d[ModifierType].NewLvlDelta;
  3187. break;
  3188. }
  3189. }
  3190. }
  3191. // Nutzen ins Verhältnis zu den Kosten setzten
  3192. var TechLevelData = ClientLib.Base.Util.GetTechLevelResourceRequirements_Obj(city_building.get_CurrentLevel() + 1, city_building.get_TechGameData_Obj());
  3193. var RatioPerCostType = new Object();
  3194. var sRatio = "";
  3195. var sCosts = "";
  3196. var lTicks = 0;
  3197. var bHasPower = true;
  3198. var bHasTiberium = true;
  3199. var bAffordableByTransfer = true;
  3200. var oCosts = new Array();
  3201. var oTimes = new Array();
  3202. for (var costtype in TechLevelData) {
  3203. if (typeof (TechLevelData[costtype]) == "function") {
  3204. continue;
  3205. }
  3206. if (TechLevelData[costtype].Type == "0") {
  3207. continue;
  3208. }
  3209.  
  3210. oCosts[TechLevelData[costtype].Type] = TechLevelData[costtype].Count;
  3211. if (parseInt(TechLevelData[costtype].Count) <= 0) {
  3212. continue;
  3213. }
  3214. RatioPerCostType[costtype] = TechLevelData[costtype].Count / resbuilding["GainPerHour"];
  3215. if (sCosts.length > 0) {
  3216. sCosts = sCosts + ", ";
  3217. }
  3218. sCosts = sCosts + MaelstromTools.Wrapper.FormatNumbersCompact(TechLevelData[costtype].Count) + " " + MaelstromTools.Statics.LootTypeName(TechLevelData[costtype].Type);
  3219. if (sRatio.length > 0) {
  3220. sRatio = sRatio + ", ";
  3221. }
  3222. // Upgrade affordable ?
  3223. if (city.GetResourceCount(TechLevelData[costtype].Type) < TechLevelData[costtype].Count) {
  3224. switch (TechLevelData[costtype].Type) {
  3225. case ClientLib.Base.EResourceType.Tiberium:
  3226. {
  3227. bHasTiberium = false;
  3228. if (TotalTiberium < TechLevelData[costtype].Count) {
  3229. bAffordableByTransfer = false;
  3230. }
  3231. }
  3232. break;
  3233. case ClientLib.Base.EResourceType.Power:
  3234. {
  3235. bHasPower = false;
  3236. }
  3237. break;
  3238. }
  3239. }
  3240. sRatio = sRatio + MaelstromTools.Wrapper.FormatNumbersCompact(RatioPerCostType[costtype]);
  3241.  
  3242. var techlevelData = MaelstromTools.Statics.LootTypeName(TechLevelData[costtype].Type);
  3243.  
  3244. var dCityProduction = prod[techlevelData].Delta + prod[techlevelData].ExtraBonusDelta + prod[techlevelData].POI;
  3245. if (dCityProduction > 0) {
  3246. if (lTicks < (3600 * RatioPerCostType[costtype] / dCityProduction)) {
  3247. lTicks = (3600 * RatioPerCostType[costtype] / dCityProduction);
  3248. }
  3249. }
  3250. oTimes[TechLevelData[costtype].Type] = 0;
  3251. if (oCosts[TechLevelData[costtype].Type] > city.GetResourceCount(TechLevelData[costtype].Type)) {
  3252. oTimes[TechLevelData[costtype].Type] = (3600 * (oCosts[TechLevelData[costtype].Type] - city.GetResourceCount(TechLevelData[costtype].Type))) / dCityProduction;
  3253. }
  3254. }
  3255. resbuilding["Ticks"] = lTicks;
  3256. resbuilding["Time"] = ClientLib.Vis.VisMain.FormatTimespan(lTicks);
  3257. resbuilding["Costtext"] = sCosts;
  3258. resbuilding["Costs"] = oCosts;
  3259. resbuilding["TimeTillUpgradable"] = oTimes;
  3260. resbuilding["Ratio"] = sRatio;
  3261. resbuilding["Affordable"] = bHasTiberium && bHasPower;
  3262. resbuilding["AffordableByTransfer"] = bHasPower && bAffordableByTransfer;
  3263. if (resbuilding["GainPerHour"] > 0 && (bOnlyAffordableBuildings == false || resbuilding["Affordable"] == true)) {
  3264. resAll[bindex] = resbuilding;
  3265. }
  3266. }
  3267.  
  3268.  
  3269. resAll = resAll.sort(this.comparePrio);
  3270. if (!bOnlyTopBuildings) {
  3271. return resAll;
  3272. }
  3273. var res2 = new Array();
  3274. if (MaelstromTools.Util.ArraySize(resAll) > 0) {
  3275. var iTopNotAffordable = -1;
  3276. var iTopAffordable = -1;
  3277. var iNextNotAffordable = -1;
  3278. var iLastIndex = -1;
  3279. for (var iNewIndex in resAll) {
  3280. if (resAll[iNewIndex].Affordable == true) {
  3281. if (iTopAffordable == -1) {
  3282. iTopAffordable = iNewIndex;
  3283. iNextNotAffordable = iLastIndex;
  3284. }
  3285. } else {
  3286. if (iTopNotAffordable == -1) {
  3287. iTopNotAffordable = iNewIndex;
  3288. }
  3289. }
  3290. iLastIndex = iNewIndex;
  3291. }
  3292. if (iTopAffordable == -1) {
  3293. iNextNotAffordable = iLastIndex;
  3294. }
  3295. var iIndex = 0;
  3296. if (iTopNotAffordable != -1) {
  3297. res2[iIndex++] = resAll[iTopNotAffordable];
  3298. }
  3299. if (iNextNotAffordable != -1) {
  3300. res2[iIndex++] = resAll[iNextNotAffordable];
  3301. }
  3302. if (iTopAffordable != -1) {
  3303. res2[iIndex++] = resAll[iTopAffordable];
  3304. }
  3305. }
  3306. res2 = res2.sort(this.comparePrio);
  3307. return res2;
  3308. } catch (e) {
  3309. console.log("HuffyTools.getPrioList: ", e);
  3310. }
  3311. },
  3312. TechTypeName: function (iTechType) {
  3313. switch (iTechType) {
  3314. case ClientLib.Base.ETechName.PowerPlant:
  3315. {
  3316. return Lang.gt("Powerplant");
  3317. break;
  3318. }
  3319. case ClientLib.Base.ETechName.Refinery:
  3320. {
  3321. return Lang.gt("Refinery");
  3322. break;
  3323. }
  3324. case ClientLib.Base.ETechName.Harvester_Crystal:
  3325. {
  3326. return Lang.gt("Harvester");
  3327. break;
  3328. }
  3329. case ClientLib.Base.ETechName.Harvester:
  3330. {
  3331. return Lang.gt("Harvester");
  3332. break;
  3333. }
  3334. case ClientLib.Base.ETechName.Silo:
  3335. {
  3336. return Lang.gt("Silo");
  3337. break;
  3338. }
  3339. case ClientLib.Base.ETechName.Accumulator:
  3340. {
  3341. return Lang.gt("Accumulator");
  3342. break;
  3343. }
  3344. }
  3345. return "?";
  3346. },
  3347. collectData: function (bOnlyTopBuildings, bOnlyAffordableBuildings, oCityFilter, eSelectedResourceType) {
  3348. try {
  3349. MT_Cache.updateCityCache();
  3350. this.Cache = new Object();
  3351. if (eSelectedResourceType == ClientLib.Base.EResourceType.Tiberium) {
  3352. this.Cache[ClientLib.Base.EResourceType.Tiberium] = new Object();
  3353. }
  3354. if (eSelectedResourceType == ClientLib.Base.EResourceType.Crystal) {
  3355. this.Cache[ClientLib.Base.EResourceType.Crystal] = new Object();
  3356. }
  3357. if (eSelectedResourceType == ClientLib.Base.EResourceType.Power) {
  3358. this.Cache[ClientLib.Base.EResourceType.Power] = new Object();
  3359. }
  3360. if (eSelectedResourceType == ClientLib.Base.EResourceType.Gold) {
  3361. this.Cache[ClientLib.Base.EResourceType.Gold] = new Object();
  3362. }
  3363. for (var cname in MT_Cache.Cities) {
  3364. var city = MT_Cache.Cities[cname].Object;
  3365. if (oCityFilter[cname] == false) {
  3366. continue;
  3367. }
  3368. if (eSelectedResourceType == ClientLib.Base.EResourceType.Tiberium) {
  3369. this.Cache[ClientLib.Base.EResourceType.Tiberium][cname] = this.getPrioList(city, [ClientLib.Base.ETechName.Harvester, ClientLib.Base.ETechName.Silo], ClientLib.Base.EModifierType.TiberiumPackageSize, ClientLib.Base.EModifierType.TiberiumProduction, bOnlyTopBuildings, bOnlyAffordableBuildings);
  3370. }
  3371. if (eSelectedResourceType == ClientLib.Base.EResourceType.Crystal) {
  3372. this.Cache[ClientLib.Base.EResourceType.Crystal][cname] = this.getPrioList(city, [ClientLib.Base.ETechName.Harvester, ClientLib.Base.ETechName.Silo], ClientLib.Base.EModifierType.CrystalPackageSize, ClientLib.Base.EModifierType.CrystalProduction, bOnlyTopBuildings, bOnlyAffordableBuildings);
  3373. }
  3374. if (eSelectedResourceType == ClientLib.Base.EResourceType.Power) {
  3375. this.Cache[ClientLib.Base.EResourceType.Power][cname] = this.getPrioList(city, [ClientLib.Base.ETechName.PowerPlant, ClientLib.Base.ETechName.Accumulator], ClientLib.Base.EModifierType.PowerPackageSize, ClientLib.Base.EModifierType.PowerProduction, bOnlyTopBuildings, bOnlyAffordableBuildings);
  3376. }
  3377. if (eSelectedResourceType == ClientLib.Base.EResourceType.Gold) {
  3378. this.Cache[ClientLib.Base.EResourceType.Gold][cname] = this.getPrioList(city, [ClientLib.Base.ETechName.Refinery, ClientLib.Base.ETechName.PowerPlant], ClientLib.Base.EModifierType.CreditsPackageSize, ClientLib.Base.EModifierType.CreditsProduction, bOnlyTopBuildings, bOnlyAffordableBuildings);
  3379. }
  3380. }
  3381. } catch (e) {
  3382. console.log("HuffyTools.UpgradePriority.collectData: ", e);
  3383. }
  3384. }
  3385. }
  3386. });
  3387.  
  3388. var __MTCity_initialized = false; //k undeclared
  3389.  
  3390. var Lang = window.MaelstromTools.Language.getInstance();
  3391. var MT_Cache = window.MaelstromTools.Cache.getInstance();
  3392. var MT_Base = window.MaelstromTools.Base.getInstance();
  3393. var MT_Preferences = window.MaelstromTools.Preferences.getInstance();
  3394. MT_Preferences.readOptions();
  3395.  
  3396. if (!webfrontend.gui.region.RegionCityMenu.prototype.__MTCity_showMenu) {
  3397. webfrontend.gui.region.RegionCityMenu.prototype.__MTCity_showMenu = webfrontend.gui.region.RegionCityMenu.prototype.showMenu;
  3398. }
  3399. webfrontend.gui.region.RegionCityMenu.prototype.showMenu = function (selectedVisObject) {
  3400.  
  3401. MT_Cache.SelectedBaseForMenu = selectedVisObject;
  3402. var baseStatusOverview = window.MaelstromTools.BaseStatus.getInstance();
  3403.  
  3404. if (__MTCity_initialized == false) {
  3405. //console.log(selectedBase.get_Name());
  3406. __MTCity_initialized = true;
  3407. baseStatusOverview.CityMenuButtons = new Array();
  3408.  
  3409. for (var k in this) {
  3410. try {
  3411. if (this.hasOwnProperty(k)) {
  3412. if (this[k] && this[k].basename == "Composite") {
  3413. var button = new qx.ui.form.Button(Lang.gt("Calibrate support"));
  3414. button.addListener("execute", function (e) {
  3415. MaelstromTools.Util.calibrateWholeSupportOnSelectedBase();
  3416. }, this);
  3417.  
  3418. this[k].add(button);
  3419. baseStatusOverview.CityMenuButtons.push(button);
  3420. }
  3421. }
  3422. } catch (e) {
  3423. console.log("webfrontend.gui.region.RegionCityMenu.prototype.showMenu: ", e);
  3424. }
  3425. }
  3426. }
  3427.  
  3428. var isAllowed = MaelstromTools.Util.checkIfSupportIsAllowed(MT_Cache.SelectedBaseForMenu);
  3429.  
  3430. for (var x = 0; x < baseStatusOverview.CityMenuButtons.length; ++x) {
  3431. baseStatusOverview.CityMenuButtons[x].setVisibility(isAllowed ? 'visible' : 'excluded');
  3432. }
  3433. this.__MTCity_showMenu(selectedVisObject);
  3434. };
  3435.  
  3436. if (MT_Preferences.Settings.showLoot) {
  3437. // Wrap onCitiesChange method
  3438. if (!webfrontend.gui.region.RegionNPCCampStatusInfo.prototype.__MTCity_NPCCamp) {
  3439. webfrontend.gui.region.RegionNPCCampStatusInfo.prototype.__MTCity_NPCCamp = webfrontend.gui.region.RegionNPCCampStatusInfo.prototype.onCitiesChange;
  3440. }
  3441. webfrontend.gui.region.RegionNPCCampStatusInfo.prototype.onCitiesChange = function () {
  3442. MT_Base.updateLoot(1, ClientLib.Vis.VisMain.GetInstance().get_SelectedObject(), webfrontend.gui.region.RegionNPCCampStatusInfo.getInstance());
  3443. return this.__MTCity_NPCCamp();
  3444. };
  3445.  
  3446. if (!webfrontend.gui.region.RegionNPCBaseStatusInfo.prototype.__MTCity_NPCBase) {
  3447. webfrontend.gui.region.RegionNPCBaseStatusInfo.prototype.__MTCity_NPCBase = webfrontend.gui.region.RegionNPCBaseStatusInfo.prototype.onCitiesChange;
  3448. }
  3449. webfrontend.gui.region.RegionNPCBaseStatusInfo.prototype.onCitiesChange = function () {
  3450. MT_Base.updateLoot(2, ClientLib.Vis.VisMain.GetInstance().get_SelectedObject(), webfrontend.gui.region.RegionNPCBaseStatusInfo.getInstance());
  3451. //MT_Base.updateLoot(2, ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCity(), webfrontend.gui.region.RegionNPCBaseStatusInfo.getInstance());
  3452. return this.__MTCity_NPCBase();
  3453. };
  3454.  
  3455. if (!webfrontend.gui.region.RegionCityStatusInfoEnemy.prototype.__MTCity_City) {
  3456. webfrontend.gui.region.RegionCityStatusInfoEnemy.prototype.__MTCity_City = webfrontend.gui.region.RegionCityStatusInfoEnemy.prototype.onCitiesChange;
  3457. }
  3458. webfrontend.gui.region.RegionCityStatusInfoEnemy.prototype.onCitiesChange = function () {
  3459. MT_Base.updateLoot(3, ClientLib.Vis.VisMain.GetInstance().get_SelectedObject(), webfrontend.gui.region.RegionCityStatusInfoEnemy.getInstance());
  3460. //MT_Base.updateLoot(3, ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCity(), webfrontend.gui.region.RegionCityStatusInfoEnemy.getInstance());
  3461. return this.__MTCity_City();
  3462. };
  3463. }
  3464.  
  3465. }
  3466. } catch (e) {
  3467. console.log("createMaelstromTools: ", e);
  3468. }
  3469.  
  3470. function MaelstromTools_checkIfLoaded() {
  3471. try {
  3472. if (typeof qx != 'undefined' && qx.core.Init.getApplication() && qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_NAVIGATION) && qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_NAVIGATION).isVisible()) {
  3473. createMaelstromTools();
  3474. window.MaelstromTools.Base.getInstance().initialize();
  3475. } else {
  3476. window.setTimeout(MaelstromTools_checkIfLoaded, 1000);
  3477. }
  3478. } catch (e) {
  3479. console.log("MaelstromTools_checkIfLoaded: ", e);
  3480. }
  3481. }
  3482.  
  3483. if (/commandandconquer\.com/i.test(document.domain)) {
  3484. window.setTimeout(MaelstromTools_checkIfLoaded, 1000);
  3485. }
  3486. };
  3487.  
  3488. try {
  3489. var MaelstromScript = document.createElement("script");
  3490. MaelstromScript.innerHTML = "(" + MaelstromTools_main.toString() + ")();";
  3491. MaelstromScript.type = "text/javascript";
  3492. if (/commandandconquer\.com/i.test(document.domain)) {
  3493. document.getElementsByTagName("head")[0].appendChild(MaelstromScript);
  3494. }
  3495. } catch (e) {
  3496. console.log("MaelstromTools: init error: ", e);
  3497. }
  3498. })();