您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Tools to help the player manage their gameplay more efficiently and effectively. A non-wrapper take of Maelstrom tools with some original touch.
// ==UserScript== // @name The Green Cross - Tiberium Alliances Tools // @description Tools to help the player manage their gameplay more efficiently and effectively. A non-wrapper take of Maelstrom tools with some original touch. // @namespace http*://*.alliances.commandandconquer.com/* // @include http*://*.alliances.commandandconquer.com/* // @version 0.61 // @author Peluski17 // @Modifié par Christian_FR // Modification de la présentation de la partie gestion des POI. // Adaptation pour les coordonnées supérieures à 999:999 (mondes ayant des coordonnées en 1600:1600) // Adaptation à la mise à jour 15.3 (CellDblClick remplacé par CellDbltap) / 2 lignes concernées // @grant none // ==/UserScript== (function () { var injectFunction = function() { function createClasses() { qx.Class.define("TGCTools", { type: "singleton", extend: qx.core.Object, construct: function() { try { //Collect All Resources from other bases button /*var playArea = qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.OVL_PLAYAREA); var transAllResBtn = new qx.ui.form.Button("Transfer All"); transAllResBtn.set ({ alignY: "middle", width: 75, height: 30, toolTipText: "Transfers all resources from the other bases to this one", appearance: "button-text-small" }); transAllResBtn.addListener("click", this._transferAllResources, this); playArea.add(transAllResBtn, { top: 5, right: 300 });*/ var app = qx.core.Init.getApplication() var bar = app.getOptionsBar(); var cntButton = bar.getChildren()[2]; this.managerBtn = new qx.ui.form.Button("Manager").set({alignX: "center"}); this.managerBtn.set ({ alignY: "middle", width: 75, height: 30, toolTipText: "Opens popup menu with buttons to management tools", appearance: "button-text-small" }); this.managerBtn.addListener("click", this._popupManager, this); cntButton.removeAt(0); cntButton.addAt(this.managerBtn, 1); /* //var scanBtn = new qx.ui.form.Button("", "webfrontend/ui/icons/icon_mainui_base_button.png").set var scanBtn = new qx.ui.form.Button("", "FactionUI/icons/icon_attack_start_combat.png").set ({ center: true, show: "icon", alignY: "middle", width: 40, height: 40, toolTipText: "Opens up Base Scanner", appearance: "button-text-small" }); scanBtn.addListener("click", this._openScanner, this); */ var poiBtn = new qx.ui.form.Button("", "webfrontend/battleview/neutral/gui/icn_mutants.png").set ({ center: true, show: "icon", alignY: "middle", width: 40, height: 40, toolTipText: "Opens POI Management Tool", appearance: "button-text-small" }); poiBtn.addListener("click", this._openPOIWindow, this); /* var upgradeBtn = new qx.ui.form.Button("", "FactionUI/icons/icon_mode_upgrade.png").set ({ center: true, show: "icon", alignY: "middle", width: 40, height: 40, toolTipText: "Opens Upgrade Management Tool", appearance: "button-text-small" }); upgradeBtn.addListener("click", this._openUpgradeWindow, this); */ this.managerPopup = new qx.ui.popup.Popup(new qx.ui.layout.Grid(5)).set({ width: 65, height: 65, allowGrowY: false, allowGrowX: false, padding: 5, position: "top-right" }); //this.managerPopup.add(scanBtn, {row: 0, column: 0}); this.managerPopup.add(poiBtn, {row: 0, column: 1}); //this.managerPopup.add(upgradeBtn, {row: 0, column: 2}); this.managerPopup.setAutoHide(false); //this.add(this.managerPopup); } catch(e) { console.log("Error initializing TGCTools Class: " + e.toString()); } }, destruct: function() { }, members: { managerBtn: null, managerPopup: null, attachNetEvent: function() { console.log("Need to assign correct function!"); }, formatNumbersCompact: function() { console.log("Need to assign correct function!"); }, numberWithCommas: function(x) { var parts = x.toString().split("."); parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); return parts.join("."); }, /*_transferAllResources: function() { try { playerCities = ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities(); ownCity = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity(); ownCityID = ownCity.get_Id(); //playerCities.d contains the city ID's for (var cityID in playerCities.d) { transCity = ClientLib.Data.MainData.GetInstance().get_Cities().GetCity(cityID); console.log(transCity.get_Name()); var transID = transCity.get_Id(); console.log(transID); if (transID != ownCityID) { var tib = Math.round(transCity.GetResourceCount(1) - 0.5); console.log("Tiberium: " + tib); var cry = Math.round(transCity.GetResourceCount(2) - 0.5); console.log("Crystal: " + cry); ownCity.SelfTrade(transID, 1, tib); //1 is for tiberium ownCity.SelfTrade(transID, 2, cry); } } console.log("Transfer of All Resources Complete"); } catch(e) { console.log("Error Transferring All Resources to City: " + e.toString()); } },*/ /* _openScanner: function() { if (TGCTools.BaseScanner.getInstance().isVisible()) TGCTools.BaseScanner.getInstance().close(); else { TGCTools.BaseScanner.getInstance().open(); this.managerPopup.hide(); } }, */ _openPOIWindow: function() { if (TGCTools.POIWindow.getInstance().isVisible()) { TGCTools.POIWindow.getInstance().close(); } else { TGCTools.POIWindow.getInstance().open(); this.managerPopup.hide(); } }, /* _openUpgradeWindow: function() { if (TGCTools.UpgradeWindow.getInstance().isVisible()) { TGCTools.UpgradeWindow.getInstance().close(); } else { TGCTools.UpgradeWindow.getInstance().open(); this.managerPopup.hide(); } }, */ _popupManager: function() { if (this.managerPopup.isVisible()) { this.managerPopup.hide(); } else { this.managerPopup.placeToWidget(this.managerBtn, false); this.managerPopup.show(); } } } }); /* qx.Class.define("TGCTools.BaseScanner", { type: "singleton", extend: qx.ui.window.Window, construct: function() { try { this.base(arguments); this.setLayout(new qx.ui.layout.VBox()); this.set({ width: 700, caption: "Base Scanner", padding: 5, allowMaximize: false, showMaximize: false, allowMinimize: false, showMinimize: false, }); var scanBox = new qx.ui.container.Composite(new qx.ui.layout.HBox(2)); var scanBtn = new qx.ui.form.Button("Scan").set({ allowGrowY: false, width: 60, height: 20, toolTipText: "Scans all nearby bases within 20 spaces", appearance: "button-text-small" }); scanBtn.addListener("click", function() { var ownCity = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity(); var object = ClientLib.Vis.VisMain.GetInstance().get_SelectedObject(); ClientLib.Vis.VisMain.GetInstance().set_SelectedObject(object); TGCTools.BaseScanner.getInstance()._waitForPlayerCity(ownCity); }, this); stopBtn = new qx.ui.form.Button("Stop").set({ allowGrowY: false, width: 60, height: 20, toolTipText: "Stops scan", appearance: "button-text-small" }); this.stopScan = false; stopBtn.addListener("click", this.setStopScan, this); stopBtn.setEnabled(false); //var cityTypeLabel = new qx.ui.basic.Label("City Type:").set({marginLeft: 15, marginRight: 5}); //cityTypeLabel.setTextColor("white"); this.cityTypeSelectBox = new qx.ui.form.SelectBox().set({width: 125, marginBottom: 10}); this.cityTypeSelectBox.add(new qx.ui.form.ListItem("City Type (All)", null, "0")); this.cityTypeSelectBox.add(new qx.ui.form.ListItem("Camp/Outpost Only", null, "1")); this.cityTypeSelectBox.add(new qx.ui.form.ListItem("Camp/Outpost/NPC Base", null, "2")); this.cityTypeSelectBox.add(new qx.ui.form.ListItem("Camp/Outpost/Player", null, "3")); this.cityTypeSelectBox.add(new qx.ui.form.ListItem("NPC Base Only", null, "4")); this.cityTypeSelectBox.add(new qx.ui.form.ListItem("NPC Base/Player", null, "5")); this.cityTypeSelectBox.add(new qx.ui.form.ListItem("Player Only", null, "6")); var layoutBtn = new qx.ui.form.Button("Layouts").set({ allowGrowY: false, width: 60, height: 20, toolTipText: "Opens new window that displays the layouts of the cities found.", appearance: "button-text-small" }); layoutBtn.addListener("click", this._openLayoutWindow, this); this.distanceSelectBox = new qx.ui.form.SelectBox().set({width: 125, marginBottom: 10}); this.distanceSelectBox.add(new qx.ui.form.ListItem("Distance (All)", null, "0")); for (var i = 1; i <= 20; i++) { var distSelectItem = new qx.ui.form.ListItem("<= " + i + "", null, "" + i + ""); this.distanceSelectBox.add(distSelectItem); } this.cpCostBox = new qx.ui.form.SelectBox().set({width: 125, marginBottom: 10}); this.cpCostBox.add(new qx.ui.form.ListItem("CP Cost (All)", null, "0")); for (var i = 11; i <= 45; i += 2) { var cpCostItem = new qx.ui.form.ListItem("<= " + i + "", null, "" + i + ""); this.cpCostBox.add(cpCostItem); } this.layoutSelectBox = new qx.ui.form.SelectBox().set({width: 125, marginBottom: 10}); var allLayouts = new qx.ui.form.ListItem("Layout Type (All)", null, "0"); var moreTib = new qx.ui.form.ListItem("7 Tib / 5 Cry", null, "1"); var equalTibCry = new qx.ui.form.ListItem("6 Tib / 6 Cry", null, "2"); var moreCry = new qx.ui.form.ListItem("5 Tib / 7 Cry", null, "3"); this.layoutSelectBox.add(allLayouts); this.layoutSelectBox.add(moreTib); this.layoutSelectBox.add(equalTibCry); this.layoutSelectBox.add(moreCry); scanBox.add(scanBtn); scanBox.add(stopBtn); scanBox.add(layoutBtn); scanBox.add(this.cityTypeSelectBox); scanBox.add(this.distanceSelectBox); scanBox.add(this.cpCostBox); scanBox.add(this.layoutSelectBox); this.add(scanBox); this.scanTableModel = new qx.ui.table.model.Simple(); this.scanTableModel.setColumns(["ID", "Level", "Name", "Owner", "Coords", "Distance", "CP Cost", "Loot/CP", "Total Loot", "Tiberium", "Crystals", "Credits", "RP"]); this.scanTable = new qx.ui.table.Table(this.scanTableModel); this.scanTable.setColumnWidth(1, 45); this.scanTable.setColumnWidth(4, 60); this.scanTable.setColumnWidth(5, 65); this.scanTable.setColumnWidth(6, 60); this.scanTable.getSelectionModel().setSelectionMode(qx.ui.table.selection.Model.SINGLE_SELECTION); this.scanTable.addListener("cellDbltap", function(evt) //this.scanTable.addListener("cellDblclick", function(evt) { var row = evt.getRow(); var id = parseInt(this.scanTableModel.getValueById("ID", row)); //var city = ClientLib.Data.MainData.GetInstance().get_Cities().GetCity(id); ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentCityId(id); //Set it to the right army layout setTimeout(function(){ webfrontend.gui.UtilView.openVisModeInMainWindow(ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupDefense, id, false); var city = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCity(); var ownCity = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity(); var formationManager = ownCity.get_CityArmyFormationsManager(); ownCity.get_CityArmyFormationsManager().set_CurrentTargetBaseId(city.get_Id()); }, 1000); }, this); this.add(this.scanTable); var scanStatusBox = new qx.ui.container.Composite(new qx.ui.layout.HBox(2)); this.scanStatus = new qx.ui.basic.Label(""); this.scanStatus.setTextColor("white"); scanStatusBox.add(this.scanStatus); this.add(scanStatusBox); this.resourceInfo = new Array(); this.gotResources = false; this.scannedCities = new Array(); this.tableData = new Array(); this.loopCount = 0; } catch(e) { console.log("Error initializing TGCTools Class: " + e.toString()); } }, destruct: function() { }, members: { scanTable: null, scanTableModel: null, scannedCities: null, tableData: null, scanStatus: null, distanceSelectBox: null, cpCostBox: null, layoutSelectBox: null, gotResources: null, resourceInfo: null, loopCount: null, _openLayoutWindow:function() { if (TGCTools.BaseScanner.TerrainLayout.getInstance().isVisible()) { TGCTools.BaseScanner.TerrainLayout.getInstance().close(); } else { TGCTools.BaseScanner.TerrainLayout.getInstance().open(); TGCTools.BaseScanner.TerrainLayout.getInstance().getLayouts(); } }, _waitForPlayerCity: function(ownCity) { stopBtn.setEnabled(true); if (ownCity.m_Level <= 0) { (function(ownCity) { setTimeout(function() { TGCTools.BaseScanner.getInstance()._waitForPlayerCity(ownCity); }, 1000); }(ownCity)); } else { this._scanBases(ownCity); } }, _scanBases: function(ownCity) { if(this.stopScan == true) { this.stopScan = false; this._getNextScannedCity("stop"); return; } var count = 0; if (this.scannedCities.length > 0) { this.scannedCities = new Array(); this.tableData = new Array(); var numRows = this.scanTableModel.getRowCount(); this.scanTableModel.removeRows(0, numRows, true); } this.scanStatus.setValue("Scanning for Cities - found: " + count); //var ownCity = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity(); var ownCoordsX = ownCity.get_PosX(); var ownCoordsY = ownCity.get_PosY(); var maxDist = this.distanceSelectBox.getSelection()[0].getModel(); var maxCP = this.cpCostBox.getSelection()[0].getModel(); var cityType = this.cityTypeSelectBox.getSelection()[0].getModel(); if (maxDist == "0") maxDist = 20; if (maxCP == "0") maxCP = 45; for (var x = -maxDist; x <= maxDist; x++) { if(this.stopScan == true) { this.stopScan = false; this._getNextScannedCity("stop"); return; } for (var y = -maxDist; y <= maxDist; y++) { if (x == 0 && y == 0) continue; var scanX = ownCoordsX + x; var scanY = ownCoordsY + y; var distance = ClientLib.Base.Util.CalculateDistance(ownCoordsX, ownCoordsY, scanX, scanY); if(distance > maxDist) continue; var cpCost = ownCity.CalculateAttackCommandPointCostToCoord(scanX, scanY); if (cpCost > maxCP) continue; var width = ClientLib.Vis.VisMain.GetInstance().get_Region().get_GridWidth(); var height = ClientLib.Vis.VisMain.GetInstance().get_Region().get_GridHeight(); var object = ClientLib.Vis.VisMain.GetInstance().get_Region().GetObjectFromPosition(scanX * width, scanY * height); //ClientLib.Vis.VisMain.GetInstance().get_Region().GetObjectFromPosition(245 * 128, 366 * 96); if (object != null) { cityAttr = {}; cityAttr.type = object.get_VisObjectType(); switch(cityAttr.type) { case ClientLib.Vis.VisObject.EObjectType.RegionNPCBase: cityAttr.name = "Base"; cityAttr.owner = "Forgotten"; break; case ClientLib.Vis.VisObject.EObjectType.RegionNPCCamp: cityAttr.name = "Camp/Outpost"; cityAttr.owner = "Forgotten"; break; case ClientLib.Vis.VisObject.EObjectType.RegionCityType: if (object.IsOwnBase()) continue; cityAttr.name = object.get_Name(); cityAttr.owner = object.get_PlayerName(); break; default: continue; break; } //Is it a selected type if (cityType == 1 && (cityAttr.type == ClientLib.Vis.VisObject.EObjectType.RegionCityType || cityAttr.type == ClientLib.Vis.VisObject.EObjectType.RegionNPCBase)) continue; else if (cityType == 2 && cityAttr.type == ClientLib.Vis.VisObject.EObjectType.RegionCityType) continue; else if (cityType == 3 && cityAttr.type == ClientLib.Vis.VisObject.EObjectType.RegionNPCBase) continue else if (cityType == 4 && (cityAttr.type == ClientLib.Vis.VisObject.EObjectType.RegionCityType || cityAttr.type == ClientLib.Vis.VisObject.EObjectType.RegionNPCCamp)) continue; else if (cityType == 5 && cityAttr.type == ClientLib.Vis.VisObject.EObjectType.RegionNPCCamp) continue; else if (cityType == 6 && (cityAttr.type == ClientLib.Vis.VisObject.EObjectType.RegionNPCBase || cityAttr.type == ClientLib.Vis.VisObject.EObjectType.RegionNPCCamp)) continue; if (object.get_ConditionDefense() == 0) continue; count++; this.scanStatus.setValue("Scanning for Cities - found: " + count); cityAttr.id = object.get_Id(); cityAttr.level = object.get_BaseLevel(); cityAttr.coords = scanX + ":" + scanY; cityAttr.distance = distance; cityAttr.cp = cpCost; this.scannedCities.push(cityAttr); } } } this.scanIdx = 0; this._getScannedCityData(); }, _getScannedCityData: function() { if (this.scannedCities.length == 0) return; if(this.stopScan == true) { this.stopScan = false; this._getNextScannedCity("stop"); return; } this.scanStatus.setValue("Retrieving City Information: (" + (this.scanIdx + 1) + " of " + this.scannedCities.length + ")"); var cityID = this.scannedCities[this.scanIdx].id; //Select Current Base ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentCityId(cityID); var thisCity = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCity(); var thisVisCity = ClientLib.Vis.VisMain.GetInstance().get_City(); this.loopCount = 0; this._waitForCity(thisCity, thisVisCity); }, _waitForCity: function(city, visCity) { if(this.stopScan == true) { this.stopScan = false; this._getNextScannedCity("stop"); return; } if ((visCity.get_CurrentCityId() <= 0 || city.m_Level <= 0) && this.loopCount <= 10) { this.loopCount++; (function(city, visCity) { setTimeout(function() { TGCTools.BaseScanner.getInstance()._waitForCity(city, visCity); }, 1000); }(city, visCity)); } else if (this.loopCount > 10) { this._getNextScannedCity(); return; } else { this.resourceInfo = this.getCityResourcesAndLayout(city, visCity); this._waitForResources(city, visCity); } }, _waitForResources: function(city, visCity) { if(this.stopScan == true) { this.stopScan = false; this._getNextScannedCity("stop"); return; } if (this.gotResources == false) { (function(city, visCity) { setTimeout(function() { TGCTools.BaseScanner.getInstance()._waitForResources(city, visCity); }, 1000); }(city, visCity)); } else { this.gotResources = false; this._scannedCityInfo(city, visCity); } }, _scannedCityInfo: function(city, visCity) { if(this.stopScan == true) { this.stopScan = false; this._getNextScannedCity("stop"); return; } var cityObj = this.scannedCities; idx = this.scanIdx; var info = this.resourceInfo; var layoutType = parseInt(this.layoutSelectBox.getSelection()[0].getModel()); if (layoutType == 1 && (info.tibCount != 7 && info.cryCount != 5)) { this._getNextScannedCity(); return; } else if (layoutType == 2 && (info.tibCount != 6 || info.cryCount != 6)) { this._getNextScannedCity(); return; } else if (layoutType == 3 && (info.tibCount != 5 || info.cryCount != 7)) { this._getNextScannedCity(); return; } cityData = {}; cityData.scanInfo = cityObj[idx]; cityData.loot = info.loot; cityData.layout = info.layout; var totalLoot = info.loot[1] + info.loot[2] + info.loot[3] + info.loot[6]; var lootPerCP = totalLoot / cityObj[idx].cp; this.tableData.push(cityData); //Important this.scanTableModel.addRows([[cityObj[idx].id.toString(), cityObj[idx].level, cityObj[idx].name, cityObj[idx].owner, cityObj[idx].coords, cityObj[idx].distance, cityObj[idx].cp, lootPerCP, totalLoot, info.loot[1], info.loot[2], info.loot[3], info.loot[6]]]); this._getNextScannedCity(); }, _getNextScannedCity: function(status) { this.scanIdx++; if (this.scanIdx != this.scannedCities.length && typeof status == 'undefined') this._getScannedCityData(); else { this.scanStatus.setValue("Scan Complete: Showing " + this.tableData.length + " results."); stopBtn.setEnabled(false); } }, getCityResourcesAndLayout: function(city, visCity) { try { //Pretty sure we just need the EResourceType var lootArray = {1: 0, 2: 0, 3: 0, 6: 0}; //1: Tib, 2: Cry, 3: Gold(credits) 6: RP var info = new Array(); var layout = new Array(); var tibCount = 0; var cryCount = 0; var mod = 0; for (var x = 0; x < 9; x++) { if(this.stopScan == true) { this.stopScan = false; this._getNextScannedCity("stop"); return; } for (var y = 0; y < 8; y++) { var field = {}; var fieldType = city.GetResourceType(x ,y); field.type = fieldType; field.x = x; field.y = y; layout.push(field); if (fieldType == ClientLib.Data.ECityTerrainType.CRYSTAL) cryCount++; else if (fieldType == ClientLib.Data.ECityTerrainType.TIBERIUM) tibCount++; var width = visCity.get_GridWidth(); var height = visCity.get_GridHeight(); var cityEntity = visCity.GetCityObjectFromPosition(x * width, y * height); if (cityEntity != null && cityEntity.get_CityEntity() !== null) { var buildingDetails = cityEntity.get_BuildingDetails(); mod = buildingDetails.get_HitpointsPercent(); var reqs = buildingDetails.get_UnitLevelRepairRequirements(); for (var idx2 = 0; idx2 < reqs.length; idx2++) { var type = reqs[idx2].Type; var count = reqs[idx2].Count; lootArray[type] += Math.round((mod * count) - 0.5); //Rounding otherwise floating numbers } } //Now do the same for defense units var defEntity = ClientLib.Vis.VisMain.GetInstance().get_DefenseSetup().GetDefenseObjectFromPosition(x * width, y * height); if (defEntity !== null && defEntity.get_CityEntity() !== null) { var unitDetails = defEntity.get_UnitDetails(); mod = unitDetails.get_HitpointsPercent(); var reqs = unitDetails.get_UnitLevelRepairRequirements(); for (var idx2 = 0; idx2 < reqs.length; idx2++) { var type = reqs[idx2].Type; var count = reqs[idx2].Count; lootArray[type] += Math.round((mod * count) - 0.5); //Rounding otherwise floating numbers } } } } var infoProps = {}; info.loot = lootArray; info.layout = layout; info.tibCount = tibCount; info.cryCount = cryCount; info.push(infoProps); this.gotResources = true; return info; } catch(e) { console.log(e.toString()); } }, getTableData: function() { return this.tableData; }, setStopScan: function() { this.stopScan = true; } //_getTableSelection: function() //{ // this.scanTable.getSelection() //} } }); qx.Class.define("TGCTools.BaseScanner.TerrainLayout", { type: "singleton", extend: qx.ui.window.Window, construct: function() { try { this.base(arguments); this.setLayout(new qx.ui.layout.VBox()); this.set({ width: 600, caption: "City Layouts", padding: 5, allowMaximize: false, showMaximize: false, allowMinimize: false, showMinimize: false, }); this.resourceImages = new Array(); this.resourceImages[0] = "webfrontend/ui/common/icn_res_tiberium.png"; this.resourceImages[1] = "webfrontend/ui/common/icn_res_chrystal.png"; this.scroll = new qx.ui.container.Scroll().set({ width: 300, height: 240 }); } catch(e) { console.log(e.toString()); } }, destruct: function() { }, members: { resourceImages: null, scroll: null, getLayouts: function() { var tableData = TGCTools.BaseScanner.getInstance().getTableData(); var layoutBox = new qx.ui.container.Composite(new qx.ui.layout.HBox(5)); for (var i = 0; i < tableData.length; i++) { var cityGrid = new qx.ui.container.Composite(); var cityGridLayout = new qx.ui.layout.Grid(5); cityGridLayout.setColumnMinWidth(0, 25); cityGridLayout.setColumnMinWidth(1, 25); cityGridLayout.setColumnMinWidth(2, 25); cityGridLayout.setColumnMinWidth(3, 25); cityGridLayout.setColumnMinWidth(4, 25); cityGridLayout.setColumnMinWidth(5, 25); cityGridLayout.setColumnMinWidth(6, 25); cityGridLayout.setColumnMinWidth(7, 25); cityGridLayout.setColumnMinWidth(8, 25); cityGridLayout.setRowMinHeight(0, 25); cityGridLayout.setRowMinHeight(1, 25); cityGridLayout.setRowMinHeight(2, 25); cityGridLayout.setRowMinHeight(3, 25); cityGridLayout.setRowMinHeight(4, 25); cityGridLayout.setRowMinHeight(5, 25); cityGridLayout.setRowMinHeight(6, 25); cityGridLayout.setRowMinHeight(7, 25); cityGrid.setLayout(cityGridLayout); var cityType = tableData[i].scanInfo.type; switch(cityType) { case ClientLib.Vis.VisObject.EObjectType.RegionNPCBase: cityGrid.setBackgroundColor("darkred"); cityGrid.setOpacity(0.7); break; case ClientLib.Vis.VisObject.EObjectType.RegionNPCCamp: cityGrid.setBackgroundColor("darkblue"); cityGrid.setOpacity(0.7); break; case ClientLib.Vis.VisObject.EObjectType.RegionCityType: cityGrid.setBackgroundColor("darkgreen"); cityGrid.setOpacity(0.7); break; } cityGrid.setToolTipText("Level " + tableData[i].scanInfo.level + " " + tableData[i].scanInfo.name + " @ " + tableData[i].scanInfo.coords); //for (var x = 0; x < 9; x++) //{ //for (var y = 0; y < 8; y++) //{ for (var j = 0; j < tableData[i].layout.length; j++) { var fieldType = tableData[i].layout[j].type; var cell = new qx.ui.basic.Image(); var x = tableData[i].layout[j].x; var y = tableData[i].layout[j].y; switch(fieldType) { case ClientLib.Data.ECityTerrainType.CRYSTAL: cell.setSource(this.resourceImages[1]); break; case ClientLib.Data.ECityTerrainType.TIBERIUM: cell.setSource(this.resourceImages[0]); break; } cityGrid.add(cell, {row: y, column: x}); } //} layoutBox.add(cityGrid); } this.scroll.add(layoutBox); this.add(this.scroll); } } }); */ qx.Class.define("TGCTools.POIWindow", { type: "singleton", extend: qx.ui.window.Window, construct: function() { try { this.base(arguments); this.setLayout(new qx.ui.layout.VBox(5)); this.set({ // Largeur de la fenêtre principale //width: 725, width: 500, caption: "POI Management Tool", padding: 5, allowMaximize: false, showMaximize: false, allowMinimize: false, showMinimize: false, }); //POI Struct this.poiData = { labels: { total: { score: new qx.ui.basic.Label("Total Score: "), qty: new qx.ui.basic.Label("Total Quantity: "), bonus: new qx.ui.basic.Label("Total Bonus: "), nextTier: new qx.ui.basic.Label("To Next Tier: "), nextRank: new qx.ui.basic.Label("To Next Rank: "), }, tier: { tier: new qx.ui.basic.Label("Tiers").set({textColor: "black"}), prev: new qx.ui.basic.Label("Previous:").set({textColor: "red"}), curr: new qx.ui.basic.Label("Current:").set({textColor: "blue"}), next: new qx.ui.basic.Label("Next:").set({textColor: "green"}), lower: new qx.ui.basic.Label("Lower").set({textColor: "black"}), upper: new qx.ui.basic.Label("Upper").set({textColor: "black"}), bonus: new qx.ui.basic.Label("Bonus").set({textColor: "black"}), diff: new qx.ui.basic.Label("Diff +/-").set({textColor: "black"}), }, rank: { rank: new qx.ui.basic.Label("Rankings").set({textColor: "black"}), prev: new qx.ui.basic.Label("Previous:").set({textColor: "red"}), curr: new qx.ui.basic.Label("Current:").set({textColor: "blue"}), next: new qx.ui.basic.Label("Next:").set({textColor: "green"}), alliance: new qx.ui.basic.Label("Alliance").set({textColor: "black"}), score: new qx.ui.basic.Label("Score").set({textColor: "black"}), multi: new qx.ui.basic.Label("Multiplier").set({textColor: "black"}), diff: new qx.ui.basic.Label("Diff +/-").set({textColor: "black"}), }, simulation: { sim: new qx.ui.basic.Label("Simulation").set({textColor: "black"}), prev: new qx.ui.basic.Label("Previous:").set({textColor: "red"}), curr: new qx.ui.basic.Label("Current:").set({textColor: "blue"}), score: new qx.ui.basic.Label("Score").set({textColor: "black"}), bonus: new qx.ui.basic.Label("Bonus").set({textColor: "black"}), multi: new qx.ui.basic.Label("Multiplier").set({textColor: "black"}), totalBonus: new qx.ui.basic.Label("Total Bonus").set({textColor: "black"}), }, }, counts: { total: { score: new qx.ui.basic.Label("0"), qty: new qx.ui.basic.Label("0"), bonus: new qx.ui.basic.Label("0"), nextTier: new qx.ui.basic.Label("0"), nextRank: new qx.ui.basic.Label("0"), }, tier: { prev: { lower: new qx.ui.basic.Label("0").set({textColor: "red"}), upper: new qx.ui.basic.Label("0").set({textColor: "red"}), bonus: new qx.ui.basic.Label("0").set({textColor: "red"}), diff: new qx.ui.basic.Label("0").set({textColor: "red"}), }, curr: { lower: new qx.ui.basic.Label("0").set({textColor: "blue"}), upper: new qx.ui.basic.Label("0").set({textColor: "blue"}), bonus: new qx.ui.basic.Label("0").set({textColor: "blue"}), diff: new qx.ui.basic.Label("0").set({textColor: "blue"}), }, next: { lower: new qx.ui.basic.Label("0").set({textColor: "darkgreen"}), upper: new qx.ui.basic.Label("0").set({textColor: "darkgreen"}), bonus: new qx.ui.basic.Label("0").set({textColor: "darkgreen"}), diff: new qx.ui.basic.Label("0").set({textColor: "darkgreen"}), }, }, rank: { prev: { alliance: new qx.ui.basic.Label("N/A").set({textColor: "red"}), score: new qx.ui.basic.Label("0").set({textColor: "red"}), multi: new qx.ui.basic.Label("0").set({textColor: "red"}), diff: new qx.ui.basic.Label("0").set({textColor: "red"}), }, curr: { alliance: new qx.ui.basic.Label("N/A").set({textColor: "blue"}), score: new qx.ui.basic.Label("0").set({textColor: "blue"}), multi: new qx.ui.basic.Label("0").set({textColor: "blue"}), diff: new qx.ui.basic.Label("0").set({textColor: "blue"}), }, next: { alliance: new qx.ui.basic.Label("N/A").set({textColor: "darkgreen"}), score: new qx.ui.basic.Label("0").set({textColor: "darkgreen"}), multi: new qx.ui.basic.Label("0").set({textColor: "darkgreen"}), diff: new qx.ui.basic.Label("0").set({textColor: "darkgreen"}), }, }, simulation: { prev: { score: new qx.ui.basic.Label("0").set({textColor: "red"}), bonus: new qx.ui.basic.Label("0").set({textColor: "red"}), multi: new qx.ui.basic.Label("0").set({textColor: "red"}), totalBonus: new qx.ui.basic.Label("0").set({textColor: "red"}), }, curr: { score: new qx.ui.basic.Label("0").set({textColor: "blue"}), bonus: new qx.ui.basic.Label("0").set({textColor: "blue"}), multi: new qx.ui.basic.Label("0").set({textColor: "blue"}), totalBonus: new qx.ui.basic.Label("0").set({textColor: "blue"}), }, }, }, }; //POI Table Box var tableBox = new qx.ui.container.Composite(new qx.ui.layout.VBox(5)).set({allowGrowY: false}); this.tableModel = new qx.ui.table.model.Simple(); this.tableModel.setColumns(["Level", "Coords", "Score", "Loss", "Tier", "Rank"]); //this.table = new qx.ui.table.Table(this.tableModel).set({height: 300, allowGrowX: false, width: 625, alignX: "center"}); // Largeur de la table des POI this.table = new qx.ui.table.Table(this.tableModel).set({height: 200, allowGrowX: false, width: 400, alignX: "center"}); this.table.getSelectionModel().setSelectionMode(qx.ui.table.selection.Model.MULTIPLE_INTERVAL_SELECTION); this.table.setColumnVisibilityButtonVisible(false); // définition de la largeur des colonnes de la table des POI this.table.setColumnWidth(0,30); this.table.setColumnWidth(1,70); this.table.setColumnWidth(2,90); this.table.setColumnWidth(3,90); this.table.setColumnWidth(4,50); this.table.setColumnWidth(5,50); this.table.addListener("cellDbltap", function(evt) {this.showPOILocation(evt);}, this); //this.table.addListener("cellDblclick", function(evt) {this.showPOILocation(evt);}, this); this.table.setToolTipText("Displays POI Data for selected POI Type. To go to a POI Location, double-click the intended row."); tableBox.add(this.table); //POI Total Stats var totalStatsBox1 = new qx.ui.container.Composite(new qx.ui.layout.HBox(2)).set({alignX: "center", allowGrowX: false, allowGrowY: false}); var totalStatsBox2 = new qx.ui.container.Composite(new qx.ui.layout.HBox(2)).set({alignX: "center", allowGrowX: false, allowGrowY: false}); this.poiData["labels"]["total"].score.setThemedFont("bold"); this.poiData["labels"]["total"].qty.setThemedFont("bold"); this.poiData["labels"]["total"].bonus.setThemedFont("bold"); this.poiData["labels"]["total"].nextTier.setThemedFont("bold"); this.poiData["labels"]["total"].nextRank.setThemedFont("bold"); totalStatsBox1.add(this.poiData["labels"]["total"].score); totalStatsBox1.add(this.poiData["counts"]["total"].score); totalStatsBox1.add(this.poiData["labels"]["total"].qty); totalStatsBox1.add(this.poiData["counts"]["total"].qty); totalStatsBox1.add(this.poiData["labels"]["total"].bonus); totalStatsBox1.add(this.poiData["counts"]["total"].bonus); totalStatsBox2.add(this.poiData["labels"]["total"].nextTier); totalStatsBox2.add(this.poiData["counts"]["total"].nextTier); totalStatsBox2.add(this.poiData["labels"]["total"].nextRank); totalStatsBox2.add(this.poiData["counts"]["total"].nextRank); //POI Current Stats var currStatsLayout = new qx.ui.layout.Grid(5).set({spacingX: 20, spacingY: 5}); var currStatsBox = new qx.ui.container.Composite(currStatsLayout).set({allowGrowX: false, allowGrowY: false, alignX: "center"}); this.poiData["labels"]["tier"].tier.setThemedFont("bold"); this.poiData["labels"]["tier"].prev.setThemedFont("bold"); this.poiData["labels"]["tier"].curr.setThemedFont("bold"); this.poiData["labels"]["tier"].next.setThemedFont("bold"); this.poiData["labels"]["tier"].lower.setThemedFont("bold"); this.poiData["labels"]["tier"].upper.setThemedFont("bold"); this.poiData["labels"]["tier"].bonus.setThemedFont("bold"); this.poiData["labels"]["tier"].diff.setThemedFont("bold"); this.poiData["labels"]["rank"].rank.setThemedFont("bold"); this.poiData["labels"]["rank"].prev.setThemedFont("bold"); this.poiData["labels"]["rank"].curr.setThemedFont("bold"); this.poiData["labels"]["rank"].next.setThemedFont("bold"); this.poiData["labels"]["rank"].alliance.setThemedFont("bold"); this.poiData["labels"]["rank"].score.setThemedFont("bold"); this.poiData["labels"]["rank"].multi.setThemedFont("bold"); this.poiData["labels"]["rank"].diff.setThemedFont("bold"); this.poiData["labels"]["simulation"].sim.setThemedFont("bold"); this.poiData["labels"]["simulation"].prev.setThemedFont("bold"); this.poiData["labels"]["simulation"].curr.setThemedFont("bold"); this.poiData["labels"]["simulation"].score.setThemedFont("bold"); this.poiData["labels"]["simulation"].bonus.setThemedFont("bold"); this.poiData["labels"]["simulation"].multi.setThemedFont("bold"); this.poiData["labels"]["simulation"].totalBonus.setThemedFont("bold"); this.poiData["labels"]["tier"].tier.set({alignX: "center", font: "font_size_14_bold"}); currStatsBox.add(this.poiData["labels"]["tier"].tier, {row: 0, column: 0, colSpan: 5}); //Labels currStatsBox.add(this.poiData["labels"]["tier"].prev, {row: 2, column: 0}); currStatsBox.add(this.poiData["labels"]["tier"].curr, {row: 3, column: 0}); currStatsBox.add(this.poiData["labels"]["tier"].next, {row: 4, column: 0}); currStatsBox.add(this.poiData["labels"]["tier"].lower, {row: 1, column: 1}); currStatsBox.add(this.poiData["labels"]["tier"].upper, {row: 1, column: 2}); currStatsBox.add(this.poiData["labels"]["tier"].bonus, {row: 1, column: 3}); currStatsBox.add(this.poiData["labels"]["tier"].diff, {row: 1, column: 4}); this.poiData["labels"]["rank"].rank.set({alignX: "center", font: "font_size_14_bold"}); currStatsBox.add(this.poiData["labels"]["rank"].rank, {row: 5, column: 0, colSpan: 5}); currStatsBox.add(this.poiData["labels"]["rank"].prev, {row: 7, column: 0}); currStatsBox.add(this.poiData["labels"]["rank"].curr, {row: 8, column: 0}); currStatsBox.add(this.poiData["labels"]["rank"].next, {row: 9, column: 0}); currStatsBox.add(this.poiData["labels"]["rank"].alliance, {row: 6, column: 1}); currStatsBox.add(this.poiData["labels"]["rank"].score, {row: 6, column: 2}); currStatsBox.add(this.poiData["labels"]["rank"].multi, {row: 6, column: 3}); currStatsBox.add(this.poiData["labels"]["rank"].diff, {row: 6, column: 4}); this.poiData["labels"]["simulation"].sim.set({alignX: "center", font: "font_size_14_bold"}); currStatsBox.add(this.poiData["labels"]["simulation"].sim, {row: 10, column: 0, colSpan: 5}); currStatsBox.add(this.poiData["labels"]["simulation"].prev, {row: 12, column: 0}); currStatsBox.add(this.poiData["labels"]["simulation"].curr, {row: 13, column: 0}); currStatsBox.add(this.poiData["labels"]["simulation"].score, {row: 11, column: 1}); currStatsBox.add(this.poiData["labels"]["simulation"].bonus, {row: 11, column: 2}); currStatsBox.add(this.poiData["labels"]["simulation"].multi, {row: 11, column: 3}); currStatsBox.add(this.poiData["labels"]["simulation"].totalBonus, {row: 11, column: 4}); //Counts currStatsBox.add(this.poiData["counts"]["tier"]["prev"].lower, {row: 2, column: 1}); currStatsBox.add(this.poiData["counts"]["tier"]["prev"].upper, {row: 2, column: 2}); currStatsBox.add(this.poiData["counts"]["tier"]["prev"].bonus, {row: 2, column: 3}); currStatsBox.add(this.poiData["counts"]["tier"]["prev"].diff, {row: 2, column: 4}); currStatsBox.add(this.poiData["counts"]["tier"]["curr"].lower, {row: 3, column: 1}); currStatsBox.add(this.poiData["counts"]["tier"]["curr"].upper, {row: 3, column: 2}); currStatsBox.add(this.poiData["counts"]["tier"]["curr"].bonus, {row: 3, column: 3}); currStatsBox.add(this.poiData["counts"]["tier"]["curr"].diff, {row: 3, column: 4}); currStatsBox.add(this.poiData["counts"]["tier"]["next"].lower, {row: 4, column: 1}); currStatsBox.add(this.poiData["counts"]["tier"]["next"].upper, {row: 4, column: 2}); currStatsBox.add(this.poiData["counts"]["tier"]["next"].bonus, {row: 4, column: 3}); currStatsBox.add(this.poiData["counts"]["tier"]["next"].diff, {row: 4, column: 4}); currStatsBox.add(this.poiData["counts"]["rank"]["prev"].alliance, {row: 7, column: 1}); currStatsBox.add(this.poiData["counts"]["rank"]["prev"].score, {row: 7, column: 2}); currStatsBox.add(this.poiData["counts"]["rank"]["prev"].multi, {row: 7, column: 3}); currStatsBox.add(this.poiData["counts"]["rank"]["prev"].diff, {row: 7, column: 4}); currStatsBox.add(this.poiData["counts"]["rank"]["curr"].alliance, {row: 8, column: 1}); currStatsBox.add(this.poiData["counts"]["rank"]["curr"].score, {row: 8, column: 2}); currStatsBox.add(this.poiData["counts"]["rank"]["curr"].multi, {row: 8, column: 3}); currStatsBox.add(this.poiData["counts"]["rank"]["curr"].diff, {row: 8, column: 4}); currStatsBox.add(this.poiData["counts"]["rank"]["next"].alliance, {row: 9, column: 1}); currStatsBox.add(this.poiData["counts"]["rank"]["next"].score, {row: 9, column: 2}); currStatsBox.add(this.poiData["counts"]["rank"]["next"].multi, {row: 9, column: 3}); currStatsBox.add(this.poiData["counts"]["rank"]["next"].diff, {row: 9, column: 4}); currStatsBox.add(this.poiData["counts"]["simulation"]["prev"].score, {row: 12, column: 1}); currStatsBox.add(this.poiData["counts"]["simulation"]["prev"].bonus, {row: 12, column: 2}); currStatsBox.add(this.poiData["counts"]["simulation"]["prev"].multi, {row: 12, column: 3}); currStatsBox.add(this.poiData["counts"]["simulation"]["prev"].totalBonus, {row: 12, column: 4}); currStatsBox.add(this.poiData["counts"]["simulation"]["curr"].score, {row: 13, column: 1}); currStatsBox.add(this.poiData["counts"]["simulation"]["curr"].bonus, {row: 13, column: 2}); currStatsBox.add(this.poiData["counts"]["simulation"]["curr"].multi, {row: 13, column: 3}); currStatsBox.add(this.poiData["counts"]["simulation"]["curr"].totalBonus, {row: 13, column: 4}); //Buttons var buttonBox = new qx.ui.container.Composite(new qx.ui.layout.HBox(7)).set({allowGrowX: false, allowGrowY: false, alignX: "center"}); this.selectBox = new qx.ui.form.SelectBox(); this.selectBox.add(new qx.ui.form.ListItem("Tiberium", "webfrontend/ui/common/icn_res_tiberium.png", "4")); this.selectBox.add(new qx.ui.form.ListItem("Crystal", "webfrontend/ui/common/icn_res_chrystal.png", "5")); this.selectBox.add(new qx.ui.form.ListItem("Reactor", "webfrontend/ui/common/icn_res_power.png", "6")); this.selectBox.add(new qx.ui.form.ListItem("Tungsten", "FactionUI/icons/icon_alliance_bonus_inf.png", "7")); this.selectBox.add(new qx.ui.form.ListItem("Uranium", "FactionUI/icons/icon_alliance_bonus_tnk.png", "8")); this.selectBox.add(new qx.ui.form.ListItem("Aircraft", "FactionUI/icons/icon_alliance_bonus_air.png", "9")); this.selectBox.add(new qx.ui.form.ListItem("Resonator", "FactionUI/icons/icon_def_army_points.png", "10")); this.selectBox.setToolTipText("Choose a POI Type you want to view."); this.selectBox.addListener("changeSelection", function(e) { var numRows = TGCTools.POIWindow.getInstance().tableModel.getRowCount(); TGCTools.POIWindow.getInstance().tableModel.removeRows(0, numRows, true); }); var updateBtn = new qx.ui.form.Button("Update").set({height: 35, allowGrowX: false, allowGrowY: false, alignX: "center", rich: true}); var simulateBtn = new qx.ui.form.Button("Simulate").set({height: 35, allowGrowX: false, allowGrowY: false, alignX: "center", rich: true}); var listBtn = new qx.ui.form.Button("Add to List").set({height: 35, allowGrowX: false, allowGrowY: false, alignX: "center", rich: true}); updateBtn.setToolTipText("Updates the table below with <br />POI's from selected POI type."); simulateBtn.setToolTipText("Simulates releasing selected POI's. <br /> To select multiple POI's hold ctrl and click on a row."); listBtn.setToolTipText("Add selected POIs to list for pasting into message. <br />For each POI you can copy the selected POIs. <br />" + "Each time you click the button for the same POI, <br /> it rewrites the data for that POI type. <br /><br />To paste the message, hit Alt-L. <br /> To clear the list, hit Alt-C."); simulateBtn.addListener("click", function() { var selection = this.getPOISelection(); this.currPOIType = selection - 2; this.isSimulation = true; this.getRankingData(selection); this.doSimulation(); }, this); simulateBtn.setEnabled(false); updateBtn.addListener("click", function() { var numRows = this.tableModel.getRowCount(); this.tableModel.removeRows(0, numRows, true); var selection = this.getPOISelection(); this.currPOIType = selection - 2; this.isSimulation = false; simulateBtn.setEnabled(true); this.getRankingData(selection); }, this); listBtn.addListener("click", this.addToList, this); //For copying POI List for messaging addEventListener("keyup", this.onKeyPress, false); buttonBox.add(this.selectBox); buttonBox.add(updateBtn); buttonBox.add(simulateBtn); buttonBox.add(listBtn); var poiContainer = new qx.ui.container.Composite(new qx.ui.layout.VBox(5)).set({allowGrowY: false, alignX: "center", decorator: "main", padding: 5}); poiContainer.setBackgroundColor("lightgray"); poiContainer.add(totalStatsBox1); poiContainer.add(totalStatsBox2); poiContainer.add(currStatsBox); poiContainer.add(buttonBox); poiContainer.add(tableBox); var scrollBox = new qx.ui.container.Scroll().set({ width: 725, height: 600 }); scrollBox.add(poiContainer); this.add(scrollBox); this.rankingData = new Array(); this.msgList = {4: "", 5: "", 6: "", 7: "", 8: "", 9: "", 10: ""}; this.__ranking = new ClientLib.Data.Ranking.Ranking(); phe.cnc.Util.attachNetEvent(this.__ranking, "FireReceivedCount", ClientLib.Data.Ranking.RankingReceivedCount, this, this.__onRankingReceivedCount); phe.cnc.Util.attachNetEvent(this.__ranking, "FireReceivedData", ClientLib.Data.Ranking.RankingReceivedData, this, this.__onRankingReceivedData); } catch(e) { console.log("Failed POIWindow Constructor: " + e.toString()); } }, destruct: function() { }, members: { __ranking: null, rankingData: null, currPOIType: null, isSimulation: null, msgList: null, getPOISelection: function() { var selection = parseInt(this.selectBox.getSelection()[0].getModel()); return selection; }, updatePOIList: function() { if (this.isSimulation) return; var alliance = ClientLib.Data.MainData.GetInstance().get_Alliance(); var allianceID = alliance.get_Id(); var alliancePOIList = alliance.get_OwnedPOIs(); var poiList = []; var totalScore = 0; var baseValue = 0; //Grab the POIs under the current selected type for (var idx in alliancePOIList) { if (alliancePOIList[idx].t == this.currPOIType) { poiList.push(alliancePOIList[idx]); } } poiList = this.sortPOIList(poiList); //Get Total Score totalScore = this.getTotalScore(allianceID); var rankData = this.getRankMultiplier(allianceID); baseValue = this.getBaseValue(totalScore); this.calculatePOIData(poiList, totalScore, rankData, baseValue); this.updatePOIStats(poiList, totalScore, rankData, baseValue); }, updatePOIStats: function(poiList, totalScore, rankData, baseValue) { //Totals //totalScore passed in var totalQty = poiList.length; var totalBonus = baseValue * (1 + (rankData.multiplier / 100)); var toNextTier = ClientLib.Base.PointOfInterestTypes.GetNextScore(totalScore) - totalScore; if (rankData.rank == 1) var toNextRank = "N/A"; else var toNextRank = this.getRankScore(rankData.rank-1) - totalScore; //Tiers var prevUpper = this.getTierLowerBound(totalScore) - 1; var prevLower = this.getTierLowerBound(prevUpper); //hack var prevBonus = this.getBaseValue(prevUpper); //upper or lower works var currLower = this.getTierLowerBound(totalScore); var currUpper = ClientLib.Base.PointOfInterestTypes.GetNextScore(totalScore) - 1; var currBonus = this.getBaseValue(totalScore); var nextLower = currUpper + 1; var nextUpper = ClientLib.Base.PointOfInterestTypes.GetNextScore(nextLower) - 1; var nextBonus = this.getBaseValue(nextLower); var prevDiff = currBonus - prevBonus; var currDiff = 0; var nextDiff = nextBonus - currBonus; //Ranks var prevAlliance = this.getAllianceName(rankData.rank+1); var prevScore = this.getRankScore(rankData.rank+1); var prevMulti = ClientLib.Base.PointOfInterestTypes.GetBoostModifierByRank(rankData.rank+1); var currAlliance = this.getAllianceName(rankData.rank); var currScore = totalScore; var currMulti = rankData.multiplier; var currRankDiff = 0; if (rankData.rank == 1) { var nextAlliance = "N/A"; var nextScore = "N/A"; var nextMulti = "N/A"; var nextRankDiff = "N/A"; } else { var nextAlliance = this.getAllianceName(rankData.rank-1); var nextScore = this.getRankScore(rankData.rank-1); var nextMulti = ClientLib.Base.PointOfInterestTypes.GetBoostModifierByRank(rankData.rank-1); var nextRankDiff = nextScore - currScore; } var prevRankDiff = currScore - prevScore; //Set Values //Total this.poiData["counts"]["total"].score.setValue(TGCTools.getInstance().numberWithCommas(totalScore)); this.poiData["counts"]["total"].qty.setValue(TGCTools.getInstance().numberWithCommas(totalQty)); if (this.currPOIType < 5) this.poiData["counts"]["total"].bonus.setValue(TGCTools.getInstance().numberWithCommas(totalBonus) + "/hr"); else this.poiData["counts"]["total"].bonus.setValue(totalBonus + "%"); this.poiData["counts"]["total"].nextTier.setValue(TGCTools.getInstance().numberWithCommas(toNextTier)); if (rankData.rank != 1) this.poiData["counts"]["total"].nextRank.setValue(TGCTools.getInstance().numberWithCommas(toNextRank)); else this.poiData["counts"]["total"].nextRank.setValue(toNextRank); //Tiers this.poiData["counts"]["tier"]["prev"].lower.setValue(TGCTools.getInstance().numberWithCommas(prevLower)); this.poiData["counts"]["tier"]["prev"].upper.setValue(TGCTools.getInstance().numberWithCommas(prevUpper)); this.poiData["counts"]["tier"]["curr"].lower.setValue(TGCTools.getInstance().numberWithCommas(currLower)); this.poiData["counts"]["tier"]["curr"].upper.setValue(TGCTools.getInstance().numberWithCommas(currUpper)); this.poiData["counts"]["tier"]["next"].lower.setValue(TGCTools.getInstance().numberWithCommas(nextLower)); this.poiData["counts"]["tier"]["next"].upper.setValue(TGCTools.getInstance().numberWithCommas(nextUpper)); if (this.currPOIType < 5) { this.poiData["counts"]["tier"]["prev"].bonus.setValue(TGCTools.getInstance().numberWithCommas(prevBonus) + "/hr"); this.poiData["counts"]["tier"]["curr"].bonus.setValue(TGCTools.getInstance().numberWithCommas(currBonus) + "/hr"); this.poiData["counts"]["tier"]["next"].bonus.setValue(TGCTools.getInstance().numberWithCommas(nextBonus) + "/hr"); } else { this.poiData["counts"]["tier"]["prev"].bonus.setValue(TGCTools.getInstance().numberWithCommas(prevBonus) + "%"); this.poiData["counts"]["tier"]["curr"].bonus.setValue(TGCTools.getInstance().numberWithCommas(currBonus) + "%"); this.poiData["counts"]["tier"]["next"].bonus.setValue(TGCTools.getInstance().numberWithCommas(nextBonus) + "%"); } this.poiData["counts"]["tier"]["prev"].diff.setValue(TGCTools.getInstance().numberWithCommas(prevDiff)); this.poiData["counts"]["tier"]["curr"].diff.setValue(TGCTools.getInstance().numberWithCommas(currDiff)); this.poiData["counts"]["tier"]["next"].diff.setValue(TGCTools.getInstance().numberWithCommas(nextDiff)); //Ranks this.poiData["counts"]["rank"]["prev"].alliance.setValue(prevAlliance); this.poiData["counts"]["rank"]["prev"].score.setValue(TGCTools.getInstance().numberWithCommas(prevScore)); this.poiData["counts"]["rank"]["prev"].multi.setValue(TGCTools.getInstance().numberWithCommas(prevMulti) + "%"); this.poiData["counts"]["rank"]["prev"].diff.setValue(TGCTools.getInstance().numberWithCommas(prevRankDiff)); this.poiData["counts"]["rank"]["curr"].alliance.setValue(currAlliance); this.poiData["counts"]["rank"]["curr"].score.setValue(TGCTools.getInstance().numberWithCommas(currScore)); this.poiData["counts"]["rank"]["curr"].multi.setValue(TGCTools.getInstance().numberWithCommas(currMulti) + "%"); this.poiData["counts"]["rank"]["curr"].diff.setValue(TGCTools.getInstance().numberWithCommas(currRankDiff)); this.poiData["counts"]["rank"]["next"].alliance.setValue(nextAlliance); if (rankData.rank != 1) { this.poiData["counts"]["rank"]["next"].score.setValue(TGCTools.getInstance().numberWithCommas(nextScore)); this.poiData["counts"]["rank"]["next"].multi.setValue(TGCTools.getInstance().numberWithCommas(nextMulti) + "%"); this.poiData["counts"]["rank"]["next"].diff.setValue(TGCTools.getInstance().numberWithCommas(nextRankDiff)); } else { this.poiData["counts"]["rank"]["next"].score.setValue(nextScore); this.poiData["counts"]["rank"]["next"].multi.setValue(nextMulti); this.poiData["counts"]["rank"]["next"].diff.setValue(nextRankDiff); } }, getAllianceName: function(rank) { if (typeof this.rankingData != 'undefined') { //find next rank score for (var idx in this.rankingData) { var info = this.rankingData[idx]; if (info.poir == rank) { return info.an; } } } }, calculatePOIData: function(poiList, totalScore, rankData, baseValue) { if (typeof poiList != 'undefined') { var tierBufferSum = 0; var rankBufferSum = 0; var currTierLowerBound = this.getTierLowerBound(totalScore); var currRankLowerBound = this.getRankLowerBound(rankData.rank); var poiInfo = {}; var poiArray = []; for (var idx in poiList) { var poi = poiList[idx]; var newTotalScore = totalScore - poi.score; var newBaseValue = this.getBaseValue(newTotalScore); var newRankMultiplier = this.calculateNewRankMultiplier(newTotalScore, rankData.rank); var isNeededForTier = "Hold"; if (tierBufferSum >= currTierLowerBound) isNeededForTier = "Buffer"; tierBufferSum += poi.score; var isNeededForRank = "Hold"; if (rankBufferSum >= currRankLowerBound) isNeededForRank = "Buffer"; rankBufferSum += poi.score; //Calculate Loss var totalBonus = baseValue * (1 + (rankData.multiplier / 100)); var newTotalBonus = newBaseValue * (1 + (newRankMultiplier / 100)); var loss = totalBonus - newTotalBonus; poiInfo = { "type": poi.type, "score": poi.score, "coords": poi.x + ":" + poi.y, "level": poi.level, "loss": loss, "tier": isNeededForTier, "rank": isNeededForRank } poiArray.push(poiInfo); } this.displayPOIData(poiArray); } }, displayPOIData: function(data) { if (data != undefined) { var displayData = []; for (var idx in data) { var poi = data[idx]; this.tableModel.addRows([[poi.level, poi.coords, poi.score, poi.loss, poi.tier, poi.rank]]); } } }, calculateNewRankMultiplier: function(score, rank) { if (typeof this.rankingData != 'undefined') { //find next rank score for (var idx in this.rankingData) { var info = this.rankingData[idx]; if (info.poir == (rank + 1)) { if (info.pois <= score) return ClientLib.Base.PointOfInterestTypes.GetBoostModifierByRank(rank); else return this.calculateNewRankMultiplier(score, (rank + 1)); } } } }, getRankScore: function(rank) { if (typeof this.rankingData != 'undefined') { for (var idx in this.rankingData) { var alliance = this.rankingData[idx]; if (alliance.poir == rank) { return alliance.pois; } } } }, getRankLowerBound: function(rank) { if (typeof this.rankingData != 'undefined') { for (var idx in this.rankingData) { var alliance = this.rankingData[idx]; if (alliance.poir == (rank + 1)) { return alliance.pois; } } } }, //From an online source /*numberWithCommas: function(x) { var parts = x.toString().split("."); parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); return parts.join("."); },*/ getTierLowerBound: function(score) { var tiers = []; tiers.push(1); tiers.push(4); tiers.push(9); tiers.push(16); tiers.push(27); tiers.push(50); tiers.push(90); tiers.push(160); tiers.push(260); tiers.push(420); tiers.push(750); tiers.push(1300); tiers.push(2200); tiers.push(3600); tiers.push(5700); tiers.push(9700); tiers.push(16400); tiers.push(28000); tiers.push(44000); tiers.push(68000); tiers.push(115000); tiers.push(190000); tiers.push(330000); tiers.push(510000); tiers.push(800000); tiers.push(1350000); tiers.push(2200000); tiers.push(3600000); tiers.push(6000000); tiers.push(9000000); tiers.push(15000000); tiers.push(25000000); tiers.push(42000000); tiers.push(65000000); tiers.push(100000000); tiers.push(165000000); tiers.push(270000000); tiers.push(450000000); tiers.push(1000000000); // Modifications éventuelles /* getTierLowerBound: function(score) { var tiers = []; tiers.push(1); tiers.push(5); tiers.push(15); tiers.push(50); tiers.push(150); tiers.push(500); tiers.push(1200); tiers.push(2500); tiers.push(4000); tiers.push(7000); tiers.push(11000); tiers.push(18000); tiers.push(27000); tiers.push(42000); tiers.push(70000); tiers.push(120000); tiers.push(190000); tiers.push(300000); tiers.push(450000); tiers.push(750000); tiers.push(1200000); tiers.push(2000000); tiers.push(3000000); tiers.push(4500000); tiers.push(7000000); tiers.push(11000000); tiers.push(17000000); tiers.push(25000000); tiers.push(35000000); tiers.push(47000000); tiers.push(70000000); tiers.push(140000000); tiers.push(150000000); tiers.push(160000000); tiers.push(170000000); tiers.push(180000000); tiers.push(190000000); tiers.push(200000000); tiers.push(210000000); */ // for (var idx in tiers) { if (score <= tiers[idx]) { if (idx == 0) return 0; else if (score < tiers[idx]) return tiers[idx-1]; else return tiers[idx]; } } }, getRankingData: function(poiType) { //4-10 //ClientLib.Data.Ranking.ERankingType.BonusTiberium: //ClientLib.Data.Ranking.ERankingType.BonusCrystal: //ClientLib.Data.Ranking.ERankingType.BonusPower: //ClientLib.Data.Ranking.ERankingType.BonusInfantry: //ClientLib.Data.Ranking.ERankingType.BonusVehicles: //ClientLib.Data.Ranking.ERankingType.BonusAircraft: //ClientLib.Data.Ranking.ERankingType.BonusDefense: this.__ranking.RequestCount(ClientLib.Data.Ranking.EViewType.Alliance, poiType); }, __onRankingReceivedCount: function(data) { if (data != undefined) this.__ranking.RequestData(0, data, ClientLib.Data.Ranking.ESortColumn.Rank, ClientLib.Data.Ranking.ESortDirection.Ascending); }, __onRankingReceivedData: function(data) { if (data != undefined) { this.rankingData = data; this.updatePOIList(); } }, sortPOIList: function(obj) { var arr = []; for (var idx in obj) { arr.push({ 'type': obj[idx].t, 'level': obj[idx].l, 'x': obj[idx].x, 'y': obj[idx].y, 'score': ClientLib.Base.PointOfInterestTypes.GetScoreByLevel(obj[idx].l) }); } arr.sort(function(a, b) { return b.level - a.level; }); return arr; // returns array }, getTotalScore: function(allianceID) { if (typeof this.rankingData != 'undefined') { for (var idx in this.rankingData) { if (this.rankingData[idx].a == allianceID) return this.rankingData[idx].pois; } } }, getRankMultiplier: function(allianceID) { if (typeof this.rankingData != 'undefined') { for (var idx in this.rankingData) { if (this.rankingData[idx].a == allianceID) { var rankInfo = { "rank" : this.rankingData[idx].poir, "multiplier" : ClientLib.Base.PointOfInterestTypes.GetBoostModifierByRank(this.rankingData[idx].poir) }; return rankInfo; } } } }, getBaseValue: function(totalScore) { return ClientLib.Base.PointOfInterestTypes.GetBonusByType(this.currPOIType, totalScore); }, showPOILocation: function(evt) { var row = evt.getRow(); var coords = ""; coords = this.tableModel.getValueById("Coords", row); if (coords != "") { if (coords.substring(4,5)==":") { var x = parseInt(coords.substring(0, 4)); var y = parseInt(coords.substring(5)); } else { var x = parseInt(coords.substring(0, 3)); var y = parseInt(coords.substring(4)); } var view = ClientLib.Vis.VisMain.GetInstance().GetActiveView(); view.CenterGridPosition(x, y); } }, doSimulation: function() { //Grab Selection Data var selection = []; var tableModel = this.tableModel; var table = this.table; if (typeof table != undefined) { table.getSelectionModel().iterateSelection(function(index) { selection.push(tableModel.getRowData(index)); }); } else { return; } var alliance = ClientLib.Data.MainData.GetInstance().get_Alliance(); var allianceID = alliance.get_Id(); var alliancePOIList = alliance.get_OwnedPOIs(); var poiList = []; var totalScore = 0; var baseValue = 0; //Grab the POIs under the current selected type for (var idx in alliancePOIList) { if (alliancePOIList[idx].t == this.currPOIType) { var isUnselected = true; //Check if it is selected for (var idx2 in selection) { if (selection[idx2][1] == (alliancePOIList[idx].x + ":" + alliancePOIList[idx].y)) { isUnselected = false; break; } } if (isUnselected == true) { totalScore += ClientLib.Base.PointOfInterestTypes.GetScoreByLevel(alliancePOIList[idx].l) poiList.push(alliancePOIList[idx]); } } } poiList = this.sortPOIList(poiList); //Previous var prevScore = this.getTotalScore(allianceID); var prevBonus = this.getBaseValue(prevScore); var rankData = this.getRankMultiplier(allianceID); var prevMulti = rankData.multiplier; var prevTotalBonus = prevBonus * (1 + (prevMulti / 100)); var currScore = totalScore; var currBonus = this.getBaseValue(currScore); var currMulti = this.calculateNewRankMultiplier(currScore, rankData.rank); var currTotalBonus = currBonus * (1 + (currMulti / 100)); //Update Simulation Data this.poiData["counts"]["simulation"]["prev"].score.setValue(TGCTools.getInstance().numberWithCommas(prevScore)); this.poiData["counts"]["simulation"]["curr"].score.setValue(TGCTools.getInstance().numberWithCommas(currScore)); if (this.currPOIType < 5) { this.poiData["counts"]["simulation"]["prev"].bonus.setValue(TGCTools.getInstance().numberWithCommas(prevBonus) + "/hr"); this.poiData["counts"]["simulation"]["prev"].totalBonus.setValue(TGCTools.getInstance().numberWithCommas(prevTotalBonus) + "/hr"); this.poiData["counts"]["simulation"]["curr"].bonus.setValue(TGCTools.getInstance().numberWithCommas(currBonus) + "/hr"); this.poiData["counts"]["simulation"]["curr"].totalBonus.setValue(TGCTools.getInstance().numberWithCommas(currTotalBonus) + "/hr"); } else { this.poiData["counts"]["simulation"]["prev"].bonus.setValue(prevBonus + "%"); this.poiData["counts"]["simulation"]["prev"].totalBonus.setValue(prevTotalBonus + "%"); this.poiData["counts"]["simulation"]["curr"].bonus.setValue(currBonus + "%"); this.poiData["counts"]["simulation"]["curr"].totalBonus.setValue(currTotalBonus + "%"); } this.poiData["counts"]["simulation"]["prev"].multi.setValue(prevMulti + "%"); this.poiData["counts"]["simulation"]["curr"].multi.setValue(currMulti + "%"); }, addToList: function() { var selection = []; var tableModel = this.tableModel; var table = this.table; if (typeof table != undefined) { table.getSelectionModel().iterateSelection(function(index) { selection.push(tableModel.getRowData(index)); }); } else { return; } var poiType = this.getPOISelection(); var poiMsg = ""; if (selection.length != 0) { switch(poiType) { case 4: poiMsg += "[b][u]Tiberium[/u][/b] \r"; break; case 5: poiMsg += "[b][u]Crystal[/u][/b] \r"; break; case 6: poiMsg += "[b][u]Reactor[/u][/b] \r"; break; case 7: poiMsg += "[b][u]Tungsten[/u][/b] \r"; break; case 8: poiMsg += "[b][u]Uranium[/u][/b] \r"; break; case 9: poiMsg += "[b][u]Aircraft[/u][/b] \r"; break; case 10: poiMsg += "[b][u]Resonator[/u][/b] \r"; break; } for (var idx in selection) { var level = parseInt(selection[idx][0]); var coords = selection[idx][1]; var points = ClientLib.Base.PointOfInterestTypes.GetScoreByLevel(level); poiMsg += "L" + level + " [coords]" + coords + "[/coords] (" + points + ")\r"; } } this.msgList[poiType] = poiMsg; }, /** Want to thank this script (http://userscripts.org/scripts/show/158800) and its author for the idea */ onKeyPress: function(event) { var key = String.fromCharCode(event.keyCode); if (event.altKey && key == "L") { var inputField = document.querySelector('input:focus, textarea:focus'); if (inputField != null) { var msg = ""; var msgList = TGCTools.POIWindow.getInstance().getMsgList(); if (typeof msgList != 'undefined') { for (var idx = 4; idx < 11; idx++) { if (msgList[idx] != "") { msg += msgList[idx] + "\r"; } } inputField.value += msg; } } } else if (event.altKey && key == "C") { var msgList = TGCTools.POIWindow.getInstance().getMsgList(); if (typeof msgList != 'undefined') { for (var idx = 4; idx < 11; idx++) { msgList[idx] = ""; } } } }, getMsgList: function() { return this.msgList; } } }); /* qx.Class.define("TGCTools.UpgradeWindow", { type: "singleton", extend: qx.ui.window.Window, construct: function() { this.base(arguments); this.setLayout(new qx.ui.layout.VBox(5)); this.set({ width: 600, caption: "Upgrade Management Tool", padding: 5, allowMaximize: false, showMaximize: false, allowMinimize: false, showMinimize: false, }); var upgradeLevelBox = new qx.ui.container.Composite(new qx.ui.layout.VBox(5)).set({decorator: "pane-light-opaque", padding: 10}); var upgradeBaseBox = new qx.ui.container.Composite(new qx.ui.layout.HBox(5)); var baseLabel = new qx.ui.basic.Label("Base Level: ").set({allowGrowX: false, allowGrowY: false, font: "font_size_14_bold"}); this.baseTextField = new qx.ui.form.TextField(); this.baseTextField.setToolTipText("Enter desired level to upgrade to"); var baseUpgradeBtn = new qx.ui.form.Button("","FactionUI/icons/icon_building_detail_upgrade.png"); baseUpgradeBtn.setShow("icon"); baseUpgradeBtn.setToolTipText("Upgrades all buildings to desired level if resources exist."); baseUpgradeBtn.addListener("click", this.baseUpgradeAllLevel, this); var baseUpgradeOneBtn = new qx.ui.form.Button("+1").set({allowGrowX: false, allowGrowY: false, height: 35, font: "font_size_14_bold"}); baseUpgradeOneBtn.addListener("click", this.baseUpgradeOneLevel, this); baseUpgradeOneBtn.setToolTipText("Upgrades all buildings by one level if resources exist."); this.baseUpgradeMaximizeBtn = new qx.ui.form.Button("Maximize").set({allowGrowX: false, allowGrowY: false, height: 35}); this.baseUpgradeMaximizeBtn.setToolTipText("Upgrades production buildings that maximize gain/costs based on selected resource type."); this.baseUpgradeMaximizeBtn.addListener("click", this.baseUpgradeMaximizeLevel, this); this.baseUpgradeMaximizeSelect = new qx.ui.form.SelectBox().set({allowGrowX: false, allowGrowY: false, height: 35}); this.baseUpgradeMaximizeSelect.add(new qx.ui.form.ListItem("Tiberium", "webfrontend/ui/common/icn_res_tiberium.png", "1")); this.baseUpgradeMaximizeSelect.add(new qx.ui.form.ListItem("Crystal", "webfrontend/ui/common/icn_res_chrystal.png", "2")); this.baseUpgradeMaximizeSelect.add(new qx.ui.form.ListItem("Power", "webfrontend/ui/common/icn_res_power.png", "5")); this.baseUpgradeMaximizeSelect.add(new qx.ui.form.ListItem("Credits", "webfrontend/ui/common/icn_res_dollar.png", "3")); this.baseUpgradeMaximizeSelect.setToolTipText("Select desired resource to maximize by gain/cost."); upgradeBaseBox.add(baseLabel); upgradeBaseBox.add(this.baseTextField); upgradeBaseBox.add(baseUpgradeBtn); upgradeBaseBox.add(baseUpgradeOneBtn); upgradeBaseBox.add(this.baseUpgradeMaximizeBtn); upgradeBaseBox.add(this.baseUpgradeMaximizeSelect); upgradeLevelBox.add(upgradeBaseBox); this.add(upgradeLevelBox); this.numMaximizeSteps = 0; }, destruct: function() { }, members: { numMaximizeSteps: null, baseUpgradeAllLevel: function() { var newLevel = parseInt(this.baseTextField.getValue()); if (isNaN(newLevel)) return; if (newLevel > 51) newLevel = 51; if (newLevel < 0) newLevel = 0; //Based on Topper's Example if (PerforceChangelist <= 384441) newLevel--; ClientLib.API.City.GetInstance().UpgradeAllBuildingsToLevel(newLevel); this.baseTextField.setValue(""); }, baseUpgradeOneLevel: function() { var currOwnCity = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity(); ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentCityId(currOwnCity.get_Id()); var visCity = ClientLib.Vis.VisMain.GetInstance().get_City(); var width = visCity.get_GridWidth(); var height = visCity.get_GridHeight(); for (var x = 0; x < 9; x++) { for (var y = 0; y < 8; y++) { var cityEntity = visCity.GetCityObjectFromPosition(x * width, y * height); if (cityEntity != null) { if (cityEntity.get_VisObjectType() == ClientLib.Vis.VisObject.EObjectType.CityBuildingType) { ClientLib.API.City.GetInstance().UpgradeBuildingToLevel(cityEntity.get_BuildingDetails(), (cityEntity.get_BuildingLevel() + 1)); } } } } }, baseUpgradeMaximizeLevel: function() { this.baseUpgradeMaximizeBtn.setEnabled(false); this.baseUpgradeMaximizeSelect.setEnabled(false); var currOwnCity = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity(); ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentCityId(currOwnCity.get_Id()); var visCity = ClientLib.Vis.VisMain.GetInstance().get_City(); var width = visCity.get_GridWidth(); var height = visCity.get_GridHeight(); var buildingsData = currOwnCity.get_Buildings().d; var buildings = []; for (var idx in buildingsData) { var tName = buildingsData[idx].get_TechName(); //If not a production type then skip switch(parseInt(tName)) { case 1: case 2: case 10: case 11: case 15: case 16: break; default: continue; break; } var objData = buildingsData[idx].get_TechGameData_Obj(); var detailView = currOwnCity.GetBuildingDetailViewInfo(buildingsData[idx]); if (detailView == null) continue; var level = buildingsData[idx].get_CurrentLevel(); if (level == 51) continue; var upgradeReqs = ClientLib.Base.Util.GetTechLevelResourceRequirements_Obj(level + 1, objData); //Gain per hour if upgraded from Maelstrom tools var upgradeGPH = {1: 0, 2: 0, 3: 0, 5: 0}; var totalGPH = 0; for (var type in detailView.OwnProdModifiers.d) { switch (parseInt(type)) { case ClientLib.Base.EModifierType.TiberiumPackageSize: case ClientLib.Base.EModifierType.CrystalPackageSize: case ClientLib.Base.EModifierType.PowerPackageSize: case ClientLib.Base.EModifierType.CreditsPackageSize: var ModOj = detailView.OwnProdModifiers.d[buildingsData[idx].get_MainModifierTypeId()]; var Mod = (ModOj.TotalValue + ModOj.NewLvlDelta) / ClientLib.Data.MainData.GetInstance().get_Time().get_StepsPerHour(); totalGPH += (detailView.OwnProdModifiers.d[type].NewLvlDelta / Mod); switch(parseInt(type)) { case ClientLib.Base.EModifierType.TiberiumPackageSize: upgradeGPH[1] += (detailView.OwnProdModifiers.d[type].NewLvlDelta / Mod); break; case ClientLib.Base.EModifierType.CrystalPackageSize: upgradeGPH[2] += (detailView.OwnProdModifiers.d[type].NewLvlDelta / Mod); break; case ClientLib.Base.EModifierType.PowerPackageSize: upgradeGPH[5] += (detailView.OwnProdModifiers.d[type].NewLvlDelta / Mod); break; case ClientLib.Base.EModifierType.CreditsPackageSize: upgradeGPH[3] += (detailView.OwnProdModifiers.d[type].NewLvlDelta / Mod); break; } break; case ClientLib.Base.EModifierType.TiberiumProduction: case ClientLib.Base.EModifierType.CrystalProduction: case ClientLib.Base.EModifierType.PowerProduction: case ClientLib.Base.EModifierType.CreditsProduction: totalGPH += detailView.OwnProdModifiers.d[type].NewLvlDelta; switch(parseInt(type)) { case ClientLib.Base.EModifierType.TiberiumProduction: upgradeGPH[1] += detailView.OwnProdModifiers.d[type].NewLvlDelta; break; case ClientLib.Base.EModifierType.CrystalProduction: upgradeGPH[2] += detailView.OwnProdModifiers.d[type].NewLvlDelta; break; case ClientLib.Base.EModifierType.PowerProduction: upgradeGPH[5] += detailView.OwnProdModifiers.d[type].NewLvlDelta; break; case ClientLib.Base.EModifierType.CreditsProduction: upgradeGPH[3] += detailView.OwnProdModifiers.d[type].NewLvlDelta; break; } break; } } //Check if building produces any gain for selecte resource. If not, continue var selection = parseInt(this.baseUpgradeMaximizeSelect.getSelection()[0].getModel()); if (upgradeGPH[selection] == 0) continue; //Determine upgrade var totalCosts = 0; for (var costs in upgradeReqs) { //don't need functions if (typeof upgradeReqs[costs] == 'function') continue; //don't need 0 costs if (upgradeReqs[costs].Type == 0) continue; totalCosts += upgradeReqs[costs].Count; } var hasResources = currOwnCity.HasEnoughResources(upgradeReqs); if (!hasResources) continue; var gainPerCostRatio = (upgradeGPH[selection] / totalCosts) * 100; var visBuilding = visCity.GetCityObjectFromPosition(buildingsData[idx].get_CoordX() * width, buildingsData[idx].get_CoordY() * height); var upgradeInfo = { "nLevel": level + 1, "gpcr": gainPerCostRatio, "x": buildingsData[idx].get_CoordX(), "y": buildingsData[idx].get_CoordY(), "data": buildingsData[idx], "detail": visBuilding.get_BuildingDetails(), "tech": objData }; buildings.push(upgradeInfo); } if (buildings.length == 0) { this.baseUpgradeMaximizeBtn.setEnabled(true); this.baseUpgradeMaximizeSelect.setEnabled(true); return; } //Sort by GCPR buildings = this.sortBuildingList(buildings); //Have list now time to maximize this.doMaximizeUpgrading(buildings, currOwnCity); }, doMaximizeUpgrading: function(buildings, currOwnCity) { if (buildings.length == 0) { this.baseUpgradeMaximizeBtn.setEnabled(true); this.baseUpgradeMaximizeSelect.setEnabled(true); return; } //Upgrade the first one ClientLib.API.City.GetInstance().UpgradeBuildingToLevel(buildings[0].detail, buildings[0].nLevel); //Now we need to recalculate the next gpcr if (buildings[0].nLevel == 51) { buildings = this.removeItemFromArray(buildings, 0, 1); this.waitToMaximizeAgain(buildings, currOwnCity); return; } else { buildings[0].nLevel = buildings[0].nLevel + 1; } var upgradeReqs = ClientLib.Base.Util.GetTechLevelResourceRequirements_Obj(buildings[0].nLevel, buildings[0].tech); //Check to make sure player has enough to purchase upgrade if (!currOwnCity.HasEnoughResources(upgradeReqs)) { buildings = this.removeItemFromArray(buildings, 0, 1); this.waitToMaximizeAgain(buildings, currOwnCity); return; } //Get Total Costs var totalCosts = 0; for (var costs in upgradeReqs) { //don't need functions if (typeof upgradeReqs[costs] == 'function') continue; //don't need 0 costs if (upgradeReqs[costs].Type == 0) continue; totalCosts += upgradeReqs[costs].Count; } //Get GainsPerHour var upgradeGPH = {1: 0, 2: 0, 3: 0, 5: 0}; var detailView = currOwnCity.GetBuildingDetailViewInfo(buildings[0].data); for (var type in detailView.OwnProdModifiers.d) { switch (parseInt(type)) { case ClientLib.Base.EModifierType.TiberiumPackageSize: case ClientLib.Base.EModifierType.CrystalPackageSize: case ClientLib.Base.EModifierType.PowerPackageSize: case ClientLib.Base.EModifierType.CreditsPackageSize: var ModOj = detailView.OwnProdModifiers.d[buildings[0].data.get_MainModifierTypeId()]; var Mod = (ModOj.TotalValue + ModOj.NewLvlDelta) / ClientLib.Data.MainData.GetInstance().get_Time().get_StepsPerHour(); //totalGPH += (detailView.OwnProdModifiers.d[type].NewLvlDelta / Mod); switch(parseInt(type)) { case ClientLib.Base.EModifierType.TiberiumPackageSize: upgradeGPH[1] += (detailView.OwnProdModifiers.d[type].NewLvlDelta / Mod); break; case ClientLib.Base.EModifierType.CrystalPackageSize: upgradeGPH[2] += (detailView.OwnProdModifiers.d[type].NewLvlDelta / Mod); break; case ClientLib.Base.EModifierType.PowerPackageSize: upgradeGPH[5] += (detailView.OwnProdModifiers.d[type].NewLvlDelta / Mod); break; case ClientLib.Base.EModifierType.CreditsPackageSize: upgradeGPH[3] += (detailView.OwnProdModifiers.d[type].NewLvlDelta / Mod); break; } break; case ClientLib.Base.EModifierType.TiberiumProduction: case ClientLib.Base.EModifierType.CrystalProduction: case ClientLib.Base.EModifierType.PowerProduction: case ClientLib.Base.EModifierType.CreditsProduction: //totalGPH += detailView.OwnProdModifiers.d[type].NewLvlDelta; switch(parseInt(type)) { case ClientLib.Base.EModifierType.TiberiumProduction: upgradeGPH[1] += detailView.OwnProdModifiers.d[type].NewLvlDelta; break; case ClientLib.Base.EModifierType.CrystalProduction: upgradeGPH[2] += detailView.OwnProdModifiers.d[type].NewLvlDelta; break; case ClientLib.Base.EModifierType.PowerProduction: upgradeGPH[5] += detailView.OwnProdModifiers.d[type].NewLvlDelta; break; case ClientLib.Base.EModifierType.CreditsProduction: upgradeGPH[3] += detailView.OwnProdModifiers.d[type].NewLvlDelta; break; } break; } } //Make sure gains are present var selection = parseInt(this.baseUpgradeMaximizeSelect.getSelection()[0].getModel()); if (upgradeGPH[selection] == 0) { buildings = this.removeItemFromArray(buildings, 0, 1); this.waitToMaximizeAgain(buildings, currOwnCity); return; } var gainPerCostRatio = (upgradeGPH[selection] / totalCosts) * 100; buildings[0].gpcr = gainPerCostRatio; //Sort again buildings = this.sortBuildingList(buildings); this.waitToMaximizeAgain(buildings, currOwnCity); }, waitToMaximizeAgain: function(buildings, currOwnCity) { (function(buildings, currOwnCity) { setTimeout(function() { TGCTools.UpgradeWindow.getInstance().doMaximizeUpgrading(buildings, currOwnCity); }, 500); }(buildings, currOwnCity)); }, removeItemFromArray: function(array, index, howMany) { array.splice(index, howMany); return array; }, sortBuildingList: function(obj) { var arr = []; for (var idx in obj) { arr.push({ 'nLevel': obj[idx].nLevel, 'gpcr': obj[idx].gpcr, 'x': obj[idx].x, 'y': obj[idx].y, "data": obj[idx].data, "detail": obj[idx].detail, "tech": obj[idx].tech }); } arr.sort(function(a, b) { return b.gpcr - a.gpcr; }); return arr; // returns array } } });*/ } function waitForGame() { try { if (typeof qx != 'undefined' && typeof qx.core != 'undfined' && typeof qx.core.Init != 'undefined') { var app = qx.core.Init.getApplication(); if (app.initDone == true) { try { createClasses(); console.log("Creating phe.cnc function wraps"); //Current Server patch (World 52 - US East Coast) uses phe if (typeof phe.cnc.Util.attachNetEvent == 'undefined') TGCTools.getInstance().attachNetEvent = webfrontend.gui.Util.attachNetEvent; else TGCTools.getInstance().attachNetEvent = phe.cnc.Util.attachNetEvent; //Current Server patch (World 52 - US East Coast) uses webfrontend if (typeof phe.cnc.gui.util == 'undefined') TGCTools.getInstance().formatNumbersCompact = webfrontend.gui.Util.formatNumbersCompact; else TGCTools.getInstance().formatNumbersCompact = phe.cnc.gui.util.Numbers.formatNumbersCompact; TGCTools.BaseScanner.getInstance(); } catch(e) { console.log("Simulator initialization error:"); console.log(e); } } else window.setTimeout(waitForGame, 1000); } else { window.setTimeout(waitForGame, 1000); } } catch (e) { if (typeof console != 'undefined') console.log(e); else if (window.opera) opera.postError(e); else GM_log(e); } } window.setTimeout(waitForGame, 1000); }; var script = document.createElement("script"); var txt = injectFunction.toString(); script.innerHTML = "(" + txt + ")();"; script.type = "text/javascript"; document.getElementsByTagName("head")[0].appendChild(script); })();