// ==UserScript==
// @name C&C Tiberium Alliances Combat Simulator
// @description Allows you to simulate combat before actually attacking.
// @namespace http://userscripts.org/scripts/show/145717
// @include https://prodgame*.alliances.commandandconquer.com/*/index.aspx*
// @version 2.0
// @author Quor | WildKatana | Updated by CodeEcho, PythEch, Matthias Fuchs, Enceladus, KRS_L, TheLuminary, Panavia2, Da Xue
// @require http://sizzlemctwizzle.com/updater.php?id=145717
// ==/UserScript==
webfrontend = unsafeWindow["webfrontend"];
qx = unsafeWindow["qx"];
ClientLib = unsafeWindow["ClientLib"];
var buttons = {
attack: {
layout: {
save: null, // buttonLayoutSave
load: null, // buttonLayoutLoad
deletef: null, // buttonLayoutDelete
},
simulate: null, // buttonSimulateCombat
unlock: null, // buttonUnlockAttack
unlockReset: null, // buttonUnlockReset
tools: null, // buttonTools
},
simulate: {
back: null // buttonReturnSetup
}
}
var stats = {
spoils: {
tiberium: null, // tiberiumSpoils
crystal: null, // crystalSpoils
credit: null, // creditSpoils
research: null // researchSpoils
},
health: {
infantry: null, // lastInfantryPercentage
vehicle: null, // lastVehiclePercentage
aircraft: null, // lastAirPercentage
overall: null, // lastPercentage
},
repair: {
infantry: null, // lastInfantryRepairTime
vehicle: null, // lastVehicleRepairTime
aircraft: null, // lastAircraftRepairTime
overall: null // lastRepairTime
},
damage: {
units: {
overall: null // lastEnemyUnitsPercentage
},
structures: {
construction: null, // lastCYPercentage
defense: null, // lastDFPercentage
command: null, // lastCCPercentage
overall: null // lastEnemyBuildingsPercentage
},
overall: null // lastEnemyPercentage
},
time: null,
supportlvl: null
}
var labels = {
health: {
infantry: null, // infantryTroopStrengthLabel
vehicle: null, // vehicleTroopStrengthLabel
aircraft: null, // airTroopStrengthLabel
overall: null // simTroopDamageLabel
},
damage: {
units: {
infantry: null, // infantryTroopStrengthLabel
vehicle: null, // vehicleTroopStrengthLabel
structure: null, // structureTroopStrengthLabel
overall: null // enemyUnitsStrengthLabel
},
structures: {
construction: null, // CYTroopStrengthLabel
defense: null, // DFTroopStrengthLabel
command: null, // CCTroopStrengthLabel
support: null, // enemySupportStrengthLabel
overall: null // enemyBuildingsStrengthLabel
},
overall: null, // enemyTroopStrengthLabel
outcome: null // simVictoryLabel
},
repair: {
overall: null // simRepairTimeLabel
},
time: null, // simTimeLabel
supportlvl: null // enemySupportLevelLabel
}
// Using EA's API (Limited Support)
function CreateTweak() {
var TASuite = {};
qx.Class.define("TASuite.main", {
type: "singleton",
extend: qx.core.Object,
members: {
buttons: {
attack: {
layout: {
save: null, // buttonLayoutSave
load: null, // buttonLayoutLoad
},
simulate: null, // buttonSimulateCombat
unlock: null, // buttonUnlockAttack
unlockReset: null, // buttonUnlockReset
tools: null, // buttonTools
},
simulate: {
back: null // buttonReturnSetup
}
},
stats: {
spoils: {
tiberium: null, // tiberiumSpoils
crystal: null, // crystalSpoils
credit: null, // creditSpoils
research: null // researchSpoils
},
health: {
infantry: null, // lastInfantryPercentage
vehicle: null, // lastVehiclePercentage
aircraft: null, // lastAirPercentage
overall: null, // lastPercentage
},
repair: {
infantry: null, // lastInfantryRepairTime
vehicle: null, // lastVehicleRepairTime
aircraft: null, // lastAircraftRepairTime
overall: null // lastRepairTime
},
damage: {
units: {
overall: null // lastEnemyUnitsPercentage
},
structures: {
construction: null, // lastCYPercentage
defense: null, // lastDFPercentage
command: null, // lastCCPercentage
overall: null // lastEnemyBuildingsPercentage
},
overall: null // lastEnemyPercentage
}
},
labels: {
health: {
infantry: null, // infantryTroopStrengthLabel
vehicle: null, // vehicleTroopStrengthLabel
aircraft: null, // airTroopStrengthLabel
overall: null // simTroopDamageLabel
},
damage: {
units: {
overall: null // enemyUnitsStrengthLabel
},
structures: {
construction: null, // CYTroopStrengthLabel
defense: null, // DFTroopStrengthLabel
command: null, // CCTroopStrengthLabel
support: null, // enemySupportStrengthLabel
overall: null // enemyBuildingsStrengthLabel
},
overall: null, // enemyTroopStrengthLabel
outcome: null // simVictoryLabel
},
repair: {
overall: null // simRepairTimeLabel
},
time: null, // simTimeLabel
supportlevel: null // enemySupportLevelLabel
},
add_ViewModeChange: null,
add_ArmyChanged: null,
attacker_modules: null,
defender_modules: null,
units: null,
units_list: null,
saved_units: null,
layoutsList: null,
layoutsLabelText: null,
battleResultsBox: null,
statsPage: null,
totalSeconds: null,
isPlayerCity: null,
initializeStats: function (tabView) {
// ////////////////Stats ////////////////////
this.statsPage = new qx.ui.tabview.Page("Stats");
this.statsPage.setLayout(new qx.ui.layout.VBox(5));
this.statsPage.setPadding(1);
tabView.add(this.statsPage);
// The Enemy Vertical Box
var eVBox = new qx.ui.container.Composite();
eVBox.setLayout(new qx.ui.layout.VBox(5));
eVBox.setThemedFont("bold");
eVBox.setThemedPadding(2);
eVBox.setThemedBackgroundColor("#eef");
this.statsPage.add(eVBox);
// The Enemy Troop Strength Label
var eHBox1 = new qx.ui.container.Composite();
eHBox1.setLayout(new qx.ui.layout.HBox(5));
eHBox1.add(new qx.ui.basic.Label("Enemy Base: "));
this.labels.damage.overall = new qx.ui.basic.Label("100");
eHBox1.add(this.labels.damage.overall);
this.labels.damage.overall.setTextColor("red");
eVBox.add(eHBox1);
// Units
var eHBox4 = new qx.ui.container.Composite();
eHBox4.setLayout(new qx.ui.layout.HBox(5));
eHBox4.add(new qx.ui.basic.Label("Defences: "));
this.labels.damage.units.overall = new qx.ui.basic.Label("100");
eHBox4.add(this.labels.damage.units.overall);
this.labels.damage.units.overall.setTextColor("green");
eVBox.add(eHBox4);
// Buildings
var eHBox5 = new qx.ui.container.Composite();
eHBox5.setLayout(new qx.ui.layout.HBox(5));
eHBox5.add(new qx.ui.basic.Label("Buildings: "));
this.labels.damage.structures.overall = new qx.ui.basic.Label("100");
eHBox5.add(this.labels.damage.structures.overall);
this.labels.damage.structures.overall.setTextColor("green");
eVBox.add(eHBox5);
// Command Center
var eHBox2 = new qx.ui.container.Composite();
eHBox2.setLayout(new qx.ui.layout.HBox(5));
eHBox2.add(new qx.ui.basic.Label("Construction Yard: "));
this.labels.damage.structures.construction = new qx.ui.basic.Label("100");
eHBox2.add(this.labels.damage.structures.construction);
this.labels.damage.structures.construction.setTextColor("red");
eVBox.add(eHBox2);
// Defense Facility
var eHBox3 = new qx.ui.container.Composite();
eHBox3.setLayout(new qx.ui.layout.HBox(5));
eHBox3.add(new qx.ui.basic.Label("Defense Facility: "));
this.labels.damage.structures.defense = new qx.ui.basic.Label("100");
eHBox3.add(this.labels.damage.structures.defense);
this.labels.damage.structures.defense.setTextColor("red");
eVBox.add(eHBox3);
// Command Center
var eHBox6 = new qx.ui.container.Composite();
eHBox6.setLayout(new qx.ui.layout.HBox(5));
eHBox6.add(new qx.ui.basic.Label("Command Center: "));
this.labels.damage.structures.command = new qx.ui.basic.Label("100"), eHBox6.add(this.labels.damage.structures.command);
this.labels.damage.structures.command.setTextColor("red");
eVBox.add(eHBox6);
// The Support Horizontal Box
var hboxSupportContainer = new qx.ui.container.Composite();
hboxSupportContainer.setLayout(new qx.ui.layout.HBox(5));
this.labels.supportlevel = new qx.ui.basic.Label("Suport lvl ");
hboxSupportContainer.add(this.labels.supportlevel);
this.labels.damage.structures.support = new qx.ui.basic.Label("--: 100");
hboxSupportContainer.add(this.labels.damage.structures.support);
this.labels.damage.structures.support.setTextColor("red");
eVBox.add(hboxSupportContainer);
// The Troops Vertical Box
var tVBox = new qx.ui.container.Composite();
tVBox.setLayout(new qx.ui.layout.VBox(5));
tVBox.setThemedFont("bold");
tVBox.setThemedPadding(2);
tVBox.setThemedBackgroundColor("#eef");
this.statsPage.add(tVBox);
// The Repair Time Label
var tHBox1 = new qx.ui.container.Composite();
tHBox1.setLayout(new qx.ui.layout.HBox(5));
tHBox1.add(new qx.ui.basic.Label("Repair Time: "));
this.labels.repair.overall = new qx.ui.basic.Label("0:00:00");
tHBox1.add(this.labels.repair.overall);
this.labels.repair.overall.setTextColor("blue");
tVBox.add(tHBox1);
// The Troop Strength Label
var tHBox5 = new qx.ui.container.Composite();
tHBox5.setLayout(new qx.ui.layout.HBox(5));
tHBox5.add(new qx.ui.basic.Label("Overall: "));
this.labels.health.overall = new qx.ui.basic.Label("100");
tHBox5.add(this.labels.health.overall);
this.labels.health.overall.setTextColor("blue");
tVBox.add(tHBox5);
// The Infantry Troop Strength Label
var tHBox2 = new qx.ui.container.Composite();
tHBox2.setLayout(new qx.ui.layout.HBox(5));
tHBox2.add(new qx.ui.basic.Label("Infantry: "));
this.labels.health.infantry = new qx.ui.basic.Label("100");
tHBox2.add(this.labels.health.infantry);
this.labels.health.infantry.setTextColor("green");
tVBox.add(tHBox2);
// The Vehicle Troop Strength Label
var tHBox3 = new qx.ui.container.Composite();
tHBox3.setLayout(new qx.ui.layout.HBox(5));
tHBox3.add(new qx.ui.basic.Label("Vehicle: "));
this.labels.health.vehicle = new qx.ui.basic.Label("100");
tHBox3.add(this.labels.health.vehicle);
this.labels.health.vehicle.setTextColor("green");
tVBox.add(tHBox3);
// The Air Troop Strength Label
var tHBox4 = new qx.ui.container.Composite();
tHBox4.setLayout(new qx.ui.layout.HBox(5));
tHBox4.add(new qx.ui.basic.Label("Aircraft: "));
this.labels.health.aircraft = new qx.ui.basic.Label("100");
tHBox4.add(this.labels.health.aircraft);
this.labels.health.aircraft.setTextColor("green");
tVBox.add(tHBox4);
// The inner Vertical Box
var vBox = new qx.ui.container.Composite();
vBox.setLayout(new qx.ui.layout.VBox(5));
vBox.setThemedFont("bold");
vBox.setThemedPadding(2);
vBox.setThemedBackgroundColor("#eef");
// The Victory Label
var hBox2 = new qx.ui.container.Composite();
hBox2.setLayout(new qx.ui.layout.HBox(5));
hBox2.add(new qx.ui.basic.Label("Outcome: "));
this.labels.damage.outcome = new qx.ui.basic.Label("Unknown");
hBox2.add(this.labels.damage.outcome);
this.labels.damage.outcome.setTextColor("green");
vBox.add(hBox2);
// The Battle Time Label
var hBox1 = new qx.ui.container.Composite();
hBox1.setLayout(new qx.ui.layout.HBox(5));
hBox1.add(new qx.ui.basic.Label("Battle Time: "));
this.labels.time = new qx.ui.basic.Label("120");
hBox1.add(this.labels.time);
this.labels.time.setTextColor("black");
vBox.add(hBox1);
this.statsPage.add(vBox);
},
initializeLayout: function (tabView) {
// ////////////////Layouts ////////////////////
var layoutPage = new qx.ui.tabview.Page("Layouts");
layoutPage.setLayout(new qx.ui.layout.VBox());
tabView.add(layoutPage);
this.layoutsList = new qx.ui.form.List();
this.layoutsList.set({
height: 200,
width: 180,
selectionMode: "one"
});
layoutPage.add(this.layoutsList);
// Add the two buttons for save and load
var layHBox = new qx.ui.container.Composite();
layHBox.setLayout(new qx.ui.layout.HBox(5));
// Load button
this.buttons.attack.layout.load = new qx.ui.form.Button("Load");
this.buttons.attack.layout.load.set({
width: 80,
appearance: "button-text-small",
toolTipText: "Load this saved layout."
});
this.buttons.attack.layout.load.addListener("click", this.loadCityLayout, this);
layHBox.add(this.buttons.attack.layout.load);
// Delete button
this.buttonLayoutDelete = new qx.ui.form.Button("Delete");
this.buttonLayoutDelete.set({
width: 80,
appearance: "button-text-small",
toolTipText: "Delete this saved layout."
});
this.buttonLayoutDelete.addListener("click", this.deleteCityLayout,
this);
layHBox.add(this.buttonLayoutDelete);
layoutPage.add(layHBox);
var layVBox = new qx.ui.container.Composite();
layVBox.setLayout(new qx.ui.layout.VBox(5));
layVBox.setThemedFont("bold");
layVBox.setThemedPadding(2);
layVBox.setThemedBackgroundColor("#eef");
// The Label Textbox
var layHBox2 = new qx.ui.container.Composite();
layHBox2.setLayout(new qx.ui.layout.HBox(5));
layHBox2.add(new qx.ui.basic.Label("Name: "));
this.layoutsLabelText = new qx.ui.form.TextField();
layHBox2.add(this.layoutsLabelText);
layVBox.add(layHBox2);
this.buttons.attack.layout.save = new qx.ui.form.Button("Save");
this.buttons.attack.layout.save.set({
width: 80,
appearance: "button-text-small",
toolTipText: "Save this layout."
});
this.buttons.attack.layout.save.addListener("click", this.saveCityLayout, this);
layVBox.add(this.buttons.attack.layout.save);
layoutPage.add(layVBox);
},
initializeInfo: function (tabView) {
// //////////////// Info ////////////////////
var infoPage = new qx.ui.tabview.Page("Info");
infoPage.setLayout(new qx.ui.layout.VBox(5));
tabView.add(infoPage);
// The Help Vertical Box
var pVBox = new qx.ui.container.Composite();
pVBox.setLayout(new qx.ui.layout.VBox(5));
pVBox.setThemedFont("bold");
pVBox.setThemedPadding(2);
pVBox.setThemedBackgroundColor("#eef");
infoPage.add(pVBox);
var proHelpBar = new qx.ui.basic.Label().set({
value: "<a target='_blank' href='http://userscripts.org/scripts/discuss/130344'>Forums</a>",
rich: true
});
pVBox.add(proHelpBar);
// The Spoils
var psVBox = new qx.ui.container.Composite();
psVBox.setLayout(new qx.ui.layout.VBox(5));
psVBox.setThemedFont("bold");
psVBox.setThemedPadding(2);
psVBox.setThemedBackgroundColor("#eef");
infoPage.add(psVBox);
psVBox.add(new qx.ui.basic.Label("Spoils"));
// Tiberium
this.stats.spoils.tiberium = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_tiberium.png");
psVBox.add(this.stats.spoils.tiberium);
// Crystal
this.stats.spoils.crystal = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_chrystal.png");
psVBox.add(this.stats.spoils.crystal);
// Credits
this.stats.spoils.credit = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_dollar.png");
psVBox.add(this.stats.spoils.credit);
// Research
this.stats.spoils.research = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_research_mission.png");
psVBox.add(this.stats.spoils.research);
this.battleResultsBox.add(tabView);
},
initialize: function () {
this.add_ViewModeChange = (new ClientLib.Vis.ViewModeChange).LEUXCZ(this, this.onViewChange); //
this.add_ArmyChanged = (new $I.QUXOEF).LEUXCZ(this, this.onUnitMoved); //
this.buttons.attack.simulate = new qx.ui.form.Button("Simulate");
this.buttons.attack.simulate.set({
width: 58,
appearance: "button-text-small",
toolTipText: "Start Combat Simulation"
});
this.buttons.attack.simulate.addListener("click", this.startSimulation, this);
this.buttons.simulate.back = new qx.ui.form.Button("Setup");
this.buttons.simulate.back.set({
width: 80,
appearance: "button-text-small",
toolTipText: "Return to Combat Setup"
});
this.buttons.simulate.back.addListener("click", this.returnSetup, this);
var replayBar = qx.core.Init.getApplication().getReportReplayOverlay();
replayBar.add(this.buttons.simulate.back, {
top: 10,
left: 0
});
var armyBar = qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_ATTACKSETUP);
this.buttons.attack.unlock = new qx.ui.form.Button("Unlock");
this.buttons.attack.unlock.set({
width: 55,
height: 46,
appearance: "button-text-small",
toolTipText: "Unlock Attack Button"
});
this.buttons.attack.unlock.addListener("click", this.unlockAttacks, this);
this.buttons.attack.unlock.setOpacity(0.5);
armyBar.add(this.buttons.attack.unlock, {
top: 102,
right: 4
});
this.buttons.attack.unlockReset = new qx.ui.form.Button("Unlock");
this.buttons.attack.unlockReset.set({
width: 55,
height: 42,
appearance: "button-text-small",
toolTipText: "Unlock Reset Button"
});
this.buttons.attack.unlockReset.addListener("click", this.unlockResets, this);
this.buttons.attack.unlockReset.setOpacity(0.5);
armyBar.add(this.buttons.attack.unlockReset, {
top: 59,
right: 4
});
this.buttons.attack.tools = new qx.ui.form.Button("Tools");
this.buttons.attack.tools.set({
width: 58,
appearance: "button-text-small",
toolTipText: "Open Simulator Tools"
});
this.buttons.attack.tools.addListener("click", this.toggleTools, this);
var battleUnitData = $I.PJNPPV.prototype;
if (!battleUnitData.set_Enabled_Original) {
battleUnitData.set_Enabled_Original = battleUnitData.set_Enabled;
}
battleUnitData.set_Enabled = function (a) {
this.set_Enabled_Original(a);
var ta = window.TASuite.main.getInstance();
ta.onUnitMoved();
};
_this = this;
setTimeout(
function () {
try {
// Get the active modules
// Doing this the hard and unreliable way for now, until
// we figure out a better way
_this.attacker_modules = {};
_this.attacker_modules.l = [];
var g = ClientLib.Res.ResMain.GetInstance();
// Get the player faction
// var gdi_unit_ids = g.GetFactionUnitIds(1);
// var nod_unit_ids = g.GetFactionUnitIds(2);
// var forgotten_unit_ids = g.GetFactionUnitIds(3);
var player_research = ClientLib.Data.MainData.GetInstance().get_Player().get_PlayerResearch();
for (var i in g.EUIRZQ.units) { //
var ug = g.GetUnit_Obj(i);
var research = player_research.GetResearchItemFomMdbId(ug.tl);
var modules = ug.m;
for (var j in modules) {
var module = modules[j];
if (research && module.r.length > 0) {
try {
// This is an upgradeable ability
var required_level = module.r[0].l;
var current_level = research.get_CurrentLevel();
if (current_level >= required_level) {
_this.attacker_modules.l.push(module.i);
}
} catch (e) {
console.log(e);
}
} else {
_this.attacker_modules.l.push(module.i);
}
}
}
// Get the defender modules
_this.defender_modules = _this.attacker_modules;
ClientLib.Vis.VisMain.GetInstance().add_ViewModeChange(
_this.add_ViewModeChange);
armyBar.add(_this.buttons.attack.tools, {
top: 74,
right: 62
});
armyBar.add(_this.buttons.attack.simulate, {
top: 112,
right: 62
});
} catch (e) {
console.log(e);
}
}, 10000);
// The Battle Simulator box
this.battleResultsBox = new qx.ui.window.Window("Battle Simulator");
this.battleResultsBox.setPadding(1);
this.battleResultsBox.setLayout(new qx.ui.layout.VBox(1));
this.battleResultsBox.setShowMaximize(false);
this.battleResultsBox.setShowMinimize(false);
this.battleResultsBox.moveTo(125, 125);
this.battleResultsBox.setHeight(300);
this.battleResultsBox.setWidth(200);
var tabView = new qx.ui.tabview.TabView();
tabView.setPadding(5);
this.battleResultsBox.add(tabView);
this.initializeStats(tabView);
this.initializeLayout(tabView);
this.initializeInfo(tabView);
},
closeToolsBox: function () {
try {
var units = this.getCityPreArmyUnits();
if (units) {
units.remove_ArmyChanged(this.add_ArmyChanged);
}
this.battleResultsBox.close();
} catch (e) {
console.log(e);
}
},
toggleTools: function () {
var units = this.getCityPreArmyUnits();
this.units = units.get_ArmyUnits().l;
var cityFaction = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCity().get_CityFaction();
this.isPlayerCity = false;
if ((cityFaction === ClientLib.Base.EFactionType.GDIFaction) || (cityFaction === ClientLib.Base.EFactionType.NODFaction)) this.isPlayerCity = true;
if (this.battleResultsBox.isVisible()) {
this.closeToolsBox();
} else {
// Add the event listener for armybar
try {
units.remove_ArmyChanged(this.add_ArmyChanged);
units.add_ArmyChanged(this.add_ArmyChanged);
} catch (e) {
console.log(e);
}
this.updateLayoutsList();
this.calculateLoot();
this.calculateSimResults();
this.updateStatsWindow();
this.battleResultsBox.open();
}
},
getCityPreArmyUnits: function () {
var armyBar = qx.core.Init.getApplication().getUIItem(
ClientLib.Data.Missions.PATH.BAR_ATTACKSETUP);
var units = null;
for (var key in armyBar) {
try {
if (armyBar[key] instanceof ClientLib.Data.CityPreArmyUnits) { // ClientLib.Data.CityPreArmyUnits renamed to $I.UIG = $I.NSVPME *CHECKED*
units = armyBar[key];
break;
}
} catch (e) {}
}
return units;
},
calculateLoot: function () {
// Adapted from the CNC Loot script:
// http://userscripts.org/scripts/show/135953
var city = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCity();
var num = 0;
var spoils = {
1: 0,
2: 0,
3: 0,
6: 0,
7: 0
};
if (city.get_CityBuildingsData().HWFIJH !== null) {
// every building
num = city.get_CityBuildingsData().HWFIJH.l.length;
for (var j = num; --j >= 0;) {
var building = city.get_CityBuildingsData().HWFIJH.l[j];
// TODO: check for destroyed building
var mod = building.get_HitpointsPercent();
for (var i = building.MNNADO.rer.length; --i >= 0;) {
spoils[building.MNNADO.rer[i].t] += mod * building.MNNADO.rer[i].c;
}
}
}
// every unit
if (city.get_CityUnitsData().TXDWUM !== null) {
num = city.get_CityUnitsData().TXDWUM.l.length;
for (j = num; --j >= 0;) {
var unit = city.get_CityUnitsData().TXDWUM.l[j];
mod = unit.get_HitpointsPercent();
for (i = unit.MNNADO.rer.length; --i >= 0;) {
spoils[unit.MNNADO.rer[i].t] += mod * unit.MNNADO.rer[i].c;
}
}
}
this.stats.spoils.tiberium.setLabel(this.formatNumberWithCommas(spoils[1]));
this.stats.spoils.crystal.setLabel(this.formatNumberWithCommas(spoils[2]));
this.stats.spoils.credit.setLabel(this.formatNumberWithCommas(spoils[3]));
this.stats.spoils.research.setLabel(this.formatNumberWithCommas(spoils[6]));
},
calculateSimResults: function () {
var battleground = this.setupBattleground(this.getCityPreArmyUnits());
// Run the simulation until it's done
while (battleground.DHSWQJ.OAEJMD(false)) {}
// DoStep$0 was renamed to OAEJMD, m_Simulation was renamed to DHSWQJ
this.calculateTroopStrengths(battleground);
},
onUnitMoved: function (sender, e) {
if (this.battleResultsBox.isVisible()) {
var ta = window.TASuite.main.getInstance();
//ta.calculateSimResults();
//ta.updateStatsWindow();
}
},
calculateTroopStrengths: function (battleground) {
var battleground = ClientLib.Vis.VisMain.GetInstance().get_Battleground();
var total_hp = 0;
var end_hp = 0;
var e_total_hp = 0;
var e_end_hp = 0;
var eb_total_hp = 0;
var eb_end_hp = 0;
var eu_total_hp = 0;
var eu_end_hp = 0;
var i_end_hp = 0;
var v_end_hp = 0;
var a_end_hp = 0;
var v_total_hp = 0;
var a_total_hp = 0;
var i_total_hp = 0;
this.stats.damage.structures.defense = 0;
this.stats.damage.structures.construction = 0;
this.stats.damage.structures.command = 0;
this.SupportLevel = 0;
this.lastSupportPercentage = 0;
this.stats.repair.infantry = 0;
this.stats.repair.vehicle = 0;
this.stats.repair.aircraft = 0;
var own_city = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity();
var crd = own_city.get_CityRepairData();
var cud = own_city.get_CityUnitsData();
var repair_times = own_city.get_CityUnitsData().EDTHDX.d; // m_FullRawRepairTimeForUnitGroupTypes renamed to EDTHDX
var r_types = ClientLib.Base.EResourceType;
var entities = battleground.NNXRBC.d; // m_Entities has been renamed to NNXRBC
for (var i in entities) {
var entity = entities[i];
var i_entity = entity.QXYJOG; // get_Entity$0() has been removed. Propery is $I.TQL - QXYJOG
var a_entity = entity.GUXBBT; // ??? has been renamed to GUXBBT
var current_hp = i_entity.HOTKDN; // m_iHitpointsCurrent has been renamed to HOTKDN
var max_hp = i_entity.EUJPNP; // m_iHitpoints has been renamed to EUJPNP
if (a_entity.XPEHRJ === 2) { // ??? has been renamed to XPEHRJ, Attacker is 2
// This is one of the good guys
end_hp += current_hp;
total_hp += max_hp;
switch (a_entity.TRKXAB) { // movement type has been renamed toTRKXAB
case ClientLib.Base.EUnitMovementType.Air:
case ClientLib.Base.EUnitMovementType.Air2:
a_end_hp += current_hp;
a_total_hp += max_hp;
break;
case ClientLib.Base.EUnitMovementType.Feet:
i_end_hp += current_hp;
i_total_hp += max_hp;
break;
case ClientLib.Base.EUnitMovementType.Track:
case ClientLib.Base.EUnitMovementType.Wheel:
v_end_hp += current_hp;
v_total_hp += max_hp;
break;
case ClientLib.Base.EUnitMovementType.Structure:
break;
}
} else {
// Enemy Overall
e_total_hp += max_hp;
e_end_hp += current_hp;
if (i_entity.XZXAQZ >= 200 && i_entity.XZXAQZ <= 205) {
this.SupportLevel = parseInt(i_entity.BGYEIQ); // m_iLevel has been renamed to BGYEIQ
this.lastSupportPercentage = (current_hp / max_hp) * 100;
} else {
switch (i_entity.XZXAQZ) {
// m_MDCTypeId has been renamed to XZXAQZ
case 112:
// GDI YARD
case 151:
// NOD CY
case 177:
// FOR CY
this.stats.damage.structures.construction = (current_hp / max_hp) * 100;
break;
case 158:
// NOD DF
case 131:
// GDI DF
case 195:
// FOR DF
this.stats.damage.structures.defense = (current_hp / max_hp) * 100;
break;
case 111:
// GDI CC
case 159:
// NOD CC
this.stats.damage.structures.command = (current_hp / max_hp) * 100;
break;
}
}
switch (a_entity.TRKXAB) {
case ClientLib.Base.EUnitMovementType.Structure:
// Enemy Building
eb_total_hp += max_hp;
eb_end_hp += current_hp;
break;
default:
// Enemy Defence
eu_total_hp += max_hp;
eu_end_hp += current_hp;
break;
}
}
}
// Get MaxHealth for UnitTypes
var totalInfantryHealth = 0;
var totalVehicleHealth = 0;
var totalAirHealth = 0;
for (var i in this.units) {
switch (this.units[i].get_UnitGameData_Obj().at) {
case ClientLib.Data.EUnitGroup.Infantry:
totalInfantryHealth += (this.units[i].get_MaxHealth() * 16);
break;
case ClientLib.Data.EUnitGroup.Vehicle:
totalVehicleHealth += (this.units[i].get_MaxHealth() * 16);
break;
case ClientLib.Data.EUnitGroup.Aircraft:
totalAirHealth += (this.units[i].get_MaxHealth() * 16);
break;
default:
alert("CombatSim: Unknown UnitType found!");
break;
}
}
// Calculate Percentages
this.stats.health.infantry = i_total_hp ? (i_end_hp / i_total_hp) * 100 : 100;
this.stats.health.vehicle = v_total_hp ? (v_end_hp / v_total_hp) * 100 : 100;
this.stats.health.aircraft = a_total_hp ? (a_end_hp / a_total_hp) * 100 : 100;
this.totalSeconds = (battleground.DHSWQJ.NHMXEO * battleground.get_TimePerStep()) / 1000;
this.stats.damage.units.overall = (eu_end_hp / eu_total_hp) * 100;
this.stats.damage.structures.overall = (eb_end_hp / eb_total_hp) * 100;
this.stats.damage.overall = (e_end_hp / e_total_hp) * 100;
this.stats.health.overall = end_hp ? (end_hp / total_hp) * 100 : 0;
// Calculate the repair time
crd.ConvertRepairCost = crd.JBTHHM; // ConvertRepairCost has been renamed to JBTHHM
this.stats.repair.infantry = crd.ConvertRepairCost(
r_types.RepairChargeInf,
repair_times[ClientLib.Data.EUnitGroup.Infantry], (1 - (i_end_hp + totalInfantryHealth - i_total_hp) / (totalInfantryHealth ? totalInfantryHealth : 1)));
this.stats.repair.aircraft = crd.ConvertRepairCost(
r_types.RepairChargeAir,
repair_times[ClientLib.Data.EUnitGroup.Aircraft], (1 - (a_end_hp + totalAirHealth - a_total_hp) / (totalAirHealth ? totalAirHealth : 1)));
this.stats.repair.vehicle = crd.ConvertRepairCost(
r_types.RepairChargeVeh,
repair_times[ClientLib.Data.EUnitGroup.Vehicle], (1 - (v_end_hp + totalVehicleHealth - v_total_hp) / (totalVehicleHealth ? totalVehicleHealth : 1)));
this.stats.repair.overall = Math.max(this.stats.repair.vehicle,
this.stats.repair.aircraft, this.stats.repair.infantry);
},
setLabelColor: function (obj, val, dir) {
var colors = ['black', 'blue', 'green', 'red'];
var color = colors[0];
var v = val;
if (dir >= 0) v = 100.0 - v;
if (v > 99.99) color = colors[3];
else if (v > 50) color = colors[2];
else if (v > 0) color = colors[1];
obj.setTextColor(color);
},
updateLabel100: function (obj, val, dir) {
this.setLabelColor(obj, val, dir);
obj.setValue(val.toFixed(2).toString());
},
updateLabel100time: function (obj, val, dir, time) {
var s = val.toFixed(2).toString() + " @ ";
s += this.formatSecondsAsTime(time, "h:mm:ss");
this.setLabelColor(obj, val, dir);
obj.setValue(s);
},
updateStatsWindow: function () {
var colors = ['black', 'blue', 'green', 'red'];
var s = "";
var n = 0;
if (this.stats.damage.structures.construction === 0) {
s = "Total Victory";
n = 0;
} else if (this.stats.damage.structures.overall < 100) {
s = "Victory";
n = 1;
} else {
s = "Total Defeat";
n = 3;
}
this.labels.damage.outcome.setValue(s);
this.labels.damage.outcome.setTextColor(colors[n]);
this.updateLabel100(this.labels.damage.overall, this.stats.damage.overall, - 1);
this.updateLabel100(this.labels.damage.units.overall, this.stats.damage.units.overall, - 1);
this.updateLabel100(this.labels.damage.structures.overall, this.stats.damage.structures.overall, - 1);
this.updateLabel100(this.labels.damage.structures.construction, this.stats.damage.structures.construction, - 1);
this.updateLabel100(this.labels.damage.structures.defense, this.stats.damage.structures.defense, - 1);
// Command Center
if (this.isPlayerCity) this.updateLabel100(this.labels.damage.structures.command, this.stats.damage.structures.command, - 1);
else {
this.labels.damage.structures.command.setValue("--");
this.labels.damage.structures.command.setTextColor("green");
}
// SUPPORT
var SLabel = (this.SupportLevel > 0) ? this.SupportLevel.toString() : '--';
this.labels.supportlevel.setValue('Suport lvl ' + SLabel + ': ');
this.updateLabel100(this.labels.damage.structures.support, this.lastSupportPercentage, - 1);
// ATTACKER
this.setLabelColor(this.labels.repair.overall, this.stats.repair.overall / 14400.0, - 1); // max is 4h
this.labels.repair.overall.setValue(this.formatSecondsAsTime(this.stats.repair.overall, "h:mm:ss"));
// OVERALL
this.updateLabel100(this.labels.health.overall, this.stats.health.overall, 1);
// INF
this.updateLabel100time(this.labels.health.infantry, this.stats.health.infantry, 1, this.stats.repair.infantry);
// VEH
this.updateLabel100time(this.labels.health.vehicle, this.stats.health.vehicle, 1, this.stats.repair.vehicle);
// AIR
this.updateLabel100time(this.labels.health.aircraft, this.stats.health.aircraft, 1, this.stats.repair.aircraft);
// BATTLE TIME
this.setLabelColor(this.labels.time, this.totalSeconds / 120.0, - 1); // max is 120s
this.labels.time.setValue(this.totalSeconds.toFixed(2).toString());
},
formatNumberWithCommas: function (x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
},
formatSecondsAsTime: function (secs, format) {
var hr = Math.floor(secs / 3600);
var min = Math.floor((secs - (hr * 3600)) / 60);
var sec = Math.floor(secs - (hr * 3600) - (min * 60));
if (hr < 10) hr = "0" + hr;
if (min < 10) min = "0" + min;
if (sec < 10) sec = "0" + sec;
if (format !== null) {
var formatted_time = format.replace('hh', hr);
formatted_time = formatted_time.replace('h', hr * 1 + "");
formatted_time = formatted_time.replace('mm', min);
formatted_time = formatted_time.replace('m', min * 1 + "");
formatted_time = formatted_time.replace('ss', sec);
formatted_time = formatted_time.replace('s', sec * 1 + "");
return formatted_time;
} else {
return hr + ':' + min + ':' + sec;
}
},
unlockAttacks: function () {
var armyBar = qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_ATTACKSETUP);
armyBar.remove(this.buttons.attack.unlock);
var _this = this;
setTimeout(function () {
armyBar.add(_this.buttons.attack.unlock);
}, 2000);
},
unlockResets: function () {
var armyBar = qx.core.Init.getApplication().getUIItem(
ClientLib.Data.Missions.PATH.BAR_ATTACKSETUP);
armyBar.remove(this.buttons.attack.unlockReset);
var _this = this;
setTimeout(function () {
armyBar.add(_this.buttons.attack.unlockReset);
}, 2000);
},
onViewChange: function (oldMode, newMode) {
try {
if (oldMode !== webfrontend.gui.PlayArea.PlayArea.modes.EMode_CombatSetupDefense || newMode !== webfrontend.gui.PlayArea.PlayArea.modes.EMode_PlayerOffense) {
// Close the stats box
this.closeToolsBox();
this.battleResultsBox.close();
}
} catch (e) {
console.log(e);
}
},
returnSetup: function () {
// Set the scene again, just in case it didn't work the first time
var app = qx.core.Init.getApplication();
var player_cities = ClientLib.Data.MainData.GetInstance().get_Cities();
var current_city = player_cities.get_CurrentCity();
try {
app.getPlayArea().setView(webfrontend.gui.PlayArea.PlayArea.modes.EMode_CombatSetupDefense, localStorage.ta_sim_last_city, 0, 0);
} catch (e) {
app.getPlayArea().setView(webfrontend.gui.PlayArea.modes.EMode_CombatSetupDefense, localStorage.ta_sim_last_city, 0, 0);
}
},
setupBattleground: function (offense_units) {
try {
var mainData = ClientLib.Data.MainData.GetInstance();
var player_cities = mainData.get_Cities();
var current_city = player_cities.get_CurrentCity();
var own_city = player_cities.get_CurrentOwnCity();
// Bust the cache
// own_city.get_CityArmyFormationsManager().ZJG.d[own_city.get_CityArmyFormationsManager().XJG].UpdateFormation();
localStorage.ta_sim_last_city = current_city.get_Id();
var alliance = ClientLib.Data.MainData.GetInstance().get_Alliance();
var combatData = (new ClientLib.Data.Combat).$ctor();
// var combatData = (new $I.CM).QB();
combatData.MCXRNN = 1; // Version is MCXRNN
var unitData = own_city.get_CityUnitsData().YDBIOO().l; // Attacker Units renamed to YDBIOO
if (offense_units) {
offense_units = offense_units.SXMOWS.l;
} else {
offense_units = own_city.get_CityArmyFormationsManager().GetFormationByTargetBaseId(current_city.get_Id()).get_ArmyUnits().l;
}
var data = new Array();
for (var i = 0; i < unitData.length; i++) {
if (offense_units[i].get_Enabled()) {
var info = new Object();
info.h = unitData[i].get_Health();
info.i = unitData[i].get_MdbUnitId();
info.l = unitData[i].get_CurrentLevel();
info.x = offense_units[i].get_CoordX();
info.y = offense_units[i].get_CoordY();
data.push(info);
}
}
combatData.UJWJOI = data; // Attackers renamed to UJWJOI
data = new Array();
if (current_city.get_CityUnitsData().TXDWUM !== null) { // empty defender army
unitData = current_city.get_CityUnitsData().TXDWUM.l; // defender units
for (i = 0; i < unitData.length; i++) {
info = new Object();
info.h = unitData[i].get_Health();
info.i = unitData[i].get_MdbUnitId();
info.l = unitData[i].get_CurrentLevel();
info.x = unitData[i].get_CoordX();
info.y = unitData[i].get_CoordY();
data.push(info);
}
}
combatData.PMEAOH = data; // Defenders renamed to PMEAOH
data = new Array();
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 8; j++) {
var terrainType = current_city.GetResourceType(i, (j + 8));
var unitType = -1;
switch (terrainType) {
case ClientLib.Data.ECityTerrainType.FOREST:
unitType = ClientLib.Base.EUnit.Forest;
break;
case ClientLib.Data.ECityTerrainType.BRIAR:
unitType = ClientLib.Base.EUnit.Scrub;
break;
case ClientLib.Data.ECityTerrainType.SWAMP:
unitType = ClientLib.Base.EUnit.Swamp;
break;
case ClientLib.Data.ECityTerrainType.WATER:
unitType = ClientLib.Base.EUnit.Water;
break;
}
if (unitType !== -1) {
info = new Object();
info.h = 100;
info.i = unitType;
info.l = 1;
info.x = i;
info.y = j;
data.push(info);
}
}
}
combatData.YDPGXU = data; // Terrain renamed to YDPGXU
unitData = current_city.get_CityBuildingsData().HWFIJH.l; // City buildings renamed to HWFIJH
data = new Array();
for (i = 0; i < unitData.length; i++) {
info = new Object();
info.h = unitData[i].get_Health();
info.i = unitData[i].get_MdbUnitId();
info.l = unitData[i].get_CurrentLevel();
info.x = unitData[i].get_CoordX();
info.y = unitData[i].get_CoordY();
data.push(info);
}
combatData.YBXPKT = data; // Buildings renamed to YBXPKT
combatData.XDMLON = null; // Support Structures renamed to XDMLON
combatData.MALBMJ = 8696244; // Start Step - this is just a random number - renamed to MALBMJ
combatData.m_CombatSteps = 1;
combatData.m_BoostInfantry = alliance.get_POIInfantryBonus();
combatData.m_BoostVehicle = alliance.get_POIVehicleBonus();
combatData.m_BoostAir = alliance.get_POIAirBonus();
combatData.m_BoostDefense = current_city.get_AllianceDefenseBonus();
combatData.m_AttackerBaseId = own_city.get_Id();
combatData.m_AttackerBaseName = own_city.get_Name();
combatData.m_AttackerPlayerId = own_city.get_PlayerId();
combatData.m_AttackerPlayerName = own_city.get_PlayerName();
combatData.m_AttackerAllianceId = own_city.get_AllianceId();
combatData.m_AttackerAllianceName = own_city.get_AllianceName();
combatData.m_DefenderBaseId = current_city.get_Id();
combatData.m_DefenderBaseName = current_city.get_Name();
combatData.m_DefenderPlayerId = current_city.get_PlayerId();
combatData.m_DefenderPlayerName = current_city.get_OwnerName();
combatData.m_DefenderAllianceId = current_city.get_AllianceId();
combatData.m_DefenderAllianceName = current_city.get_OwnerAllianceName();
combatData.m_DefenderBlockStep = 0;
combatData.m_AttackTimeStamp = new Date().getTime();
var resourceLayout = new Object();
resourceLayout.l = new Array();
combatData.m_ResourceLayout = resourceLayout;
combatData.m_DefenderFaction = current_city.get_CityFaction();
combatData.m_AttackerModules = this.attacker_modules;
combatData.m_DefenderModules = this.defender_modules;
if (((combatData.m_DefenderFaction === ClientLib.Base.EFactionType.FORFaction) || (combatData.m_DefenderFaction === ClientLib.Base.EFactionType.NPCBase)) || (combatData.m_DefenderFaction === ClientLib.Base.EFactionType.NPCCamp)) {
combatData.FGCUFQ(); // This might not be needed
}
combatData.m_MaxDuration = 120;
combatData.m_Complete = false;
combatData.SXOUOX = null; // Debug renamed to SXOUOX
var battleground = ClientLib.Vis.VisMain.GetInstance().get_Battleground();
battleground.Reset();
battleground.QPRVSK = combatData; // m_currentreplay
battleground.InitBattle();
battleground.MYAZHR(combatData); // Set combat data
battleground.StartBattle();
return battleground;
} catch (e) {
console.log(e);
}
},
startSimulation: function () {
try {
var app = qx.core.Init.getApplication();
var player_cities = ClientLib.Data.MainData.GetInstance().get_Cities();
var current_city = player_cities.get_CurrentCity();
try {
app.getPlayArea().setView(webfrontend.gui.PlayArea.PlayArea.modes.EMode_CombatReplay, current_city.get_Id(), 0, 0);
} catch (e) {
app.getPlayArea().setView(webfrontend.gui.PlayArea.modes.EMode_CombatReplay, current_city.get_Id(), 0, 0);
}
//var battleground = this.setupBattleground();
// Set the scene again, just in case it didn't work the first time
try {
app.getPlayArea().setView(webfrontend.gui.PlayArea.PlayArea.modes.EMode_CombatReplay, current_city.get_Id(), 0, 0);
} catch (e) {
app.getPlayArea().setView(webfrontend.gui.PlayArea.modes.EMode_CombatReplay, current_city.get_Id(), 0, 0);
}
this.battleResultsBox.close();
} catch (e) {
console.log(e);
}
},
updateLayoutsList: function () {
this.layoutsList.removeAll();
// Load the saved layouts for this city
var city_layouts = this.loadCityLayouts();
if (city_layouts) {
for (var i in city_layouts) {
var layout = city_layouts[i];
var item = new qx.ui.form.ListItem(layout.label, null, layout.id);
this.layoutsList.add(item);
};
}
},
deleteCityLayout: function () {
try {
var layouts = this.loadLayouts();
var current_city = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCity().get_Id();
var own_city = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity().get_Id();
var lid = this.layoutsList.getSelection()[0].getModel();
if (layouts && typeof layouts[current_city] !== 'undefined' && typeof layouts[current_city][own_city] !== 'undefined' && typeof layouts[current_city][own_city][lid] !== 'undefined') {
delete layouts[current_city][own_city][lid];
this.saveLayouts(layouts);
this.updateLayoutsList();
}
} catch (e) {
console.log(e);
}
},
loadCityLayout: function () {
try {
this.toggleTools();
var city_layouts = this.loadCityLayouts();
var lid = this.layoutsList.getSelection()[0].getModel();
if (city_layouts && typeof city_layouts[lid] !== 'undefined') {
// Load the selected city layout
var saved_units = city_layouts[lid].layout;
this.restoreFormation(saved_units);
}
this.toggleTools();
} catch (e) {
console.log(e);
}
},
saveCityLayout: function () {
try {
// Save the current layout for this city
var current_city = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCity().get_Id();
var own_city = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity().get_Id();
var layouts = this.loadLayouts();
this.saveFormation();
var lid = new Date().getTime().toString();
var title = this.layoutsLabelText.getValue();
if (!title) return;
title += " (TS: " + this.stats.health.overall.toFixed(2).toString() + ")";
var city_layouts = this.loadCityLayouts();
if (!layouts.hasOwnProperty(current_city)) {
layouts[current_city] = {};
}
if (!layouts[current_city].hasOwnProperty(own_city)) {
layouts[current_city][own_city] = city_layouts;
}
layouts[current_city][own_city][lid] = {
id: lid,
label: title,
layout: this.saved_units,
};
this.saveLayouts(layouts);
this.updateLayoutsList();
this.layoutsLabelText.setValue("");
} catch (e) {
console.log(e);
}
},
loadLayouts: function () {
var temp = localStorage.tasim_layouts;
if (temp) return JSON.parse(temp);
return {};
},
loadCityLayouts: function () {
var temp = localStorage.tasim_layouts;
if (temp) {
var layouts = JSON.parse(temp);
var current_city = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCity().get_Id();
var own_city = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity().get_Id();
if (layouts.hasOwnProperty(current_city) && layouts[current_city].hasOwnProperty(own_city)) {
return layouts[current_city][own_city];
}
}
return {};
},
saveLayouts: function (layouts) {
// TODO - Remove cities that are no longer existing
localStorage.tasim_layouts = JSON.stringify(layouts);
},
restoreFormation: function (saved_units) {
var sUnits = saved_units || this.saved_units;
var units = this.getCityPreArmyUnits();
var units_list = units.get_ArmyUnits().l;
for (var idx = 0; idx < sUnits.length; idx++) {
var saved_unit = sUnits[idx];
var uid = saved_unit.id;
for (var i = 0;
(i < units_list.length); i++) {
if (units_list[i].get_Id() === uid) {
units_list[i].MoveBattleUnit(saved_unit.x, saved_unit.y);
if (saved_unit.enabled === undefined) units_list[i].set_Enabled(true);
else units_list[i].set_Enabled(saved_unit.enabled);
}
}
}
units.CLEZCG(); // UpdateArmyLayout$0() has been renamed to CLEZCG()
units.WRKUTR(); // RefreshData() has been renamed to WRKUTR()
},
saveFormation: function () {
this.saved_units = [];
for (var i = 0;
(i < this.units.length); i++) {
var unit = this.units[i];
var armyUnit = {};
armyUnit.x = unit.get_CoordX();
armyUnit.y = unit.get_CoordY();
armyUnit.id = unit.get_Id();
armyUnit.enabled = unit.get_Enabled();
this.saved_units.push(armyUnit);
}
},
}
});
}
////////////////
//Tools window//
var toolsbtn;
var battleResultsBox;
function initializeTools() {
// The Battle Simulator box
qx = unsafeWindow["qx"];
var armyBar = qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_ATTACKSETUP);
/////////
//Tools//
toolsbtn = new qx.ui.form.Button("Stats");
toolsbtn.set({
width: 64,
height: 26,
appearance: "button-text-small",
toolTipText: "Update Battle Simulation Statistics"
});
toolsbtn.addListener("click", function (){toolclick();});
armyBar.add(toolsbtn, {
left: 12,
top: 89
});
battleResultsBox = (new qx.ui.window.Window("Battle Simulator", "FactionUI/icons/icon_loading_logo.gif")).set({
contentPaddingTop: 0,
contentPaddingBottom: 2,
contentPaddingRight: 2,
contentPaddingLeft: 6,
showMaximize: false,
showMinimize: false
});
battleResultsBox.getChildControl("icon").set({
scale: true,
width: 25,
height: 25
})
battleResultsBox.setLayout(new qx.ui.layout.HBox);
battleResultsBox.moveTo(125, 125);
var tabView = (new qx.ui.tabview.TabView).set({
contentPaddingTop: 3,
contentPaddingBottom: 6,
contentPaddingRight: 7,
contentPaddingLeft: 3
});
battleResultsBox.add(tabView);
var statsPage = new qx.ui.tabview.Page("Stats");
statsPage.setLayout(new qx.ui.layout.VBox(1)), tabView.add(statsPage);
var t = new qx.ui.container.Composite,n = new qx.ui.layout.Grid;
n.setColumnAlign(1, "right", "middle"), n.setColumnFlex(0, 1), t.setLayout(n), t.setThemedFont("bold"), t.setThemedBackgroundColor("#eef");
statsPage.add(t);
// The Enemy Troop Strength Label
t.add(new qx.ui.basic.Label("Enemy Base:"), {
row: 0,
column: 0
}), labels.damage.overall = new qx.ui.basic.Label(" - "), t.add(labels.damage.overall, {
row: 0,
column: 1
}), t.add(new qx.ui.basic.Label("Defences:"), {
row: 1,
column: 0
}), labels.damage.units.overall = new qx.ui.basic.Label(" - "), t.add(labels.damage.units.overall, {
row: 1,
column: 1
}), labels.supportlvl = new qx.ui.basic.Label(""), t.add(labels.supportlvl, {
row: 4,
column: 0
}), labels.damage.structures.support = new qx.ui.basic.Label(""), t.add(labels.damage.structures.support, {
row: 4,
column: 1
}), t.add(new qx.ui.basic.Label("Buildings:"), {
row: 3,
column: 0
}), labels.damage.structures.overall = new qx.ui.basic.Label(" - "), t.add(labels.damage.structures.overall, {
row: 3,
column: 1
}), t.add(new qx.ui.basic.Label(""), {
row: 5,
column: 0
}), labels.damage.structures.command = new qx.ui.basic.Label(""), t.add(labels.damage.structures.command, {
row: 5,
column: 1
}), t.add(new qx.ui.basic.Label("Defense Facility:"), {
row: 6,
column: 0
}), labels.damage.structures.defense = new qx.ui.basic.Label(" - "), t.add(labels.damage.structures.defense, {
row: 6,
column: 1
}), t.add(new qx.ui.basic.Label("Construction Yard:"), {
row: 7,
column: 0,
width: 120
}), labels.damage.structures.construction = new qx.ui.basic.Label(" - "), t.add(labels.damage.structures.construction, {
row: 7,
column: 1,
width: 40
}), t = new qx.ui.container.Composite; n = new qx.ui.layout.Grid, n.setColumnAlign(1, "right", "middle"), n.setColumnFlex(0, 1), t.setLayout(n), t.setThemedFont("bold"), t.setThemedBackgroundColor("#eef"), statsPage.add(t);
t.add(new qx.ui.basic.Label("Overall:"), {
row: 0,
column: 0
}), labels.health.overall = new qx.ui.basic.Label(" - "), t.add(labels.health.overall, {
row: 0,
column: 1
}), t.add(new qx.ui.basic.Label("Infantry:"), {
row: 1,
column: 0
}), labels.health.infantry = new qx.ui.basic.Label(" - "), t.add(labels.health.infantry, {
row: 1,
column: 1
}), t.add(new qx.ui.basic.Label("Vehicle:"), {
row: 2,
column: 0
}), labels.health.vehicle = new qx.ui.basic.Label(" - "), t.add(labels.health.vehicle, {
row: 2,
column: 1
}), t.add(new qx.ui.basic.Label("Aircraft:"), {
row: 3,
column: 0
}), labels.health.aircraft = new qx.ui.basic.Label(" - "), t.add(labels.health.aircraft, {
row: 3,
column: 1
}), t = new qx.ui.container.Composite, n = new qx.ui.layout.Grid, n.setColumnAlign(1, "right", "middle"), n.setColumnFlex(0, 1), t.setLayout(n), t.setThemedFont("bold"), t.setThemedBackgroundColor("#eef"), statsPage.add(t);
t.add(new qx.ui.basic.Label("Outcome:"), {
row: 0,
column: 0
}), labels.damage.outcome = new qx.ui.basic.Label("Unknown"), t.add(labels.damage.outcome, {
row: 0,
column: 1
}), t.add(new qx.ui.basic.Label("Battle Time:"), {
row: 1,
column: 0
}), labels.time = new qx.ui.basic.Label(" - "), t.add(labels.time, {
row: 1,
column: 1
});
////////////////// Info ////////////////////
var infoPage = new qx.ui.tabview.Page("Loot");
infoPage.setLayout(new qx.ui.layout.VBox(5));
tabView.add(infoPage);
// The Help Vertical Box
var pVBox = new qx.ui.container.Composite();
pVBox.setLayout(new qx.ui.layout.VBox(5));
pVBox.setThemedFont("bold");
pVBox.setThemedPadding(2);
pVBox.setThemedBackgroundColor("#eef");
infoPage.add(pVBox);
var proHelpBar = new qx.ui.basic.Label().set({
value: "<a target='_blank' href='http://userscripts.org/scripts/discuss/145717'>Forums</a>",
rich: true
});
pVBox.add(proHelpBar);
// The Spoils
var psVBox = new qx.ui.container.Composite();
psVBox.setLayout(new qx.ui.layout.VBox(5));
psVBox.setThemedFont("bold");
psVBox.setThemedPadding(2);
psVBox.setThemedBackgroundColor("#eef");
infoPage.add(psVBox);
psVBox.add(new qx.ui.basic.Label("Spoils"));
// Tiberium
stats.spoils.tiberium = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_tiberium.png");
psVBox.add(stats.spoils.tiberium);
// Crystal
stats.spoils.crystal = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_chrystal.png");
psVBox.add(stats.spoils.crystal);
// Credits
stats.spoils.credit = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_dollar.png");
psVBox.add(stats.spoils.credit);
// Research
stats.spoils.research = new qx.ui.basic.Atom("0", "webfrontend/ui/common/icn_res_research_mission.png");
psVBox.add(stats.spoils.research);
battleResultsBox.add(tabView);
}
var wrapperinjected = false;
var timer;
function toolclick()
{
CCTAWrapper_IsInstalled = unsafeWindow["CCTAWrapper_IsInstalled"];
if (!wrapperinjected || typeof CCTAWrapper_IsInstalled == "undefined" || !CCTAWrapper_IsInstalled) {
injectwrapper();
wrapperinjected = true;
setTimeout(toolclick,1000);
return;
}
wrapperinjected = true;
if (battleResultsBox.isVisible()) {
//battleResultsBox.close();
} else {
battleResultsBox.open();
}
if (loadBase())
{
var city = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCity();
var ownCity = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity();
ownCity.get_CityArmyFormationsManager().set_CurrentTargetBaseId(city.get_Id());
var unitqq = ClientLib.Vis.VisMain.GetInstance().get_Battleground();
unitqq.SimulateBattle();
toolsbtn.set({enabled: false});
timer=10100;
tooltimer();
setTimeout(function() {
while (unitqq.get_Simulation().DoStep(false)) {}
calcTroops(unitqq);
}, 1000);
calcResources();
}
}
function tooltimer()
{
if(timer>1000)
{
toolsbtn.setLabel(Math.floor(timer/1000));
timer-=1000;
setTimeout(function () {
tooltimer();
}, 1000)
}
else
{
setTimeout(function () {
toolsbtn.set({enabled: true});
toolsbtn.setLabel("Update");
}, timer)
}
}
////////
//Data//
var Data = null;
function getData(city) {
var b = Data.Bypass;
if(typeof(b.rdy) == 'undefined') {
b = getBypass(city, b);//b must be obj to pass via reference
}
l = {};
try {
var o;
l.Buildings = [];
l.Defences = [];
l.Offences = [];
if(b.keys.Buildings!==undefined) {
o = city.get_CityBuildingsData()[b.keys.Buildings];
if(o!==null) l.Buildings = o.l;
}
if(b.keys.Defences!==undefined) {
o = city.get_CityUnitsData()[b.keys.Defences];
if(o!==null) l.Defences = o.l;
}
if(b.keys.Offences!==undefined) {
o = city.get_CityUnitsData()[b.keys.Offences];
if(o!==null) l.Offences = o.l;
}
l.rdy = true;
} catch (e) {
console.warn('getData: ', e);
}
return l;
}
function getBypass(city, b) {
if(b.rdy === undefined) {
// get keys
b.keys = {};
//b.dnucKeys = {};
try {
b = getKeys(city.get_CityUnitsData(), b);
b = getKeys(city.get_CityBuildingsData(), b);
var o;
o = city.get_CityBuildingsData()[b.keys.Buildings].l;
b.keys.Hitpoints = getKeyHitpoints(o);//Buildings
b.rdy = true;
} catch (e) {
console.warn('getBypass: ', e);
}
}
console.dir(b.keys);
return b;
}
function getKeys(list, b) {
for (var k in list) {
var o = list[k];
if (o === null) continue;
if (typeof(o.l) == 'undefined') continue;
if (o.l.length === 0) continue;
var m = getKey(o.l[0],'mt');//dnuc & mt=MoveType
if(typeof(m) == 'undefined') continue;
if(typeof(b.keys.Type) == 'undefined') {
b.keys.Type = m;//MoveType & dnucKeys aviable in this branch
//alert(m);
}
if(typeof(o.l[0].GetUnitGroupType) == 'undefined') {
if(typeof(b.keys.Resources) == 'undefined') {
b.keys.Resources = getResKey(o.l[0],'Count');//Resouces
}
// buildings
b.keys.Buildings = k;
} else {
// units
if(o.l[0].GetUnitGroupType()) {
//1-attack
b.keys.Offences = k;
} else {
//0-defend
b.keys.Defences = k;
}
}
}
return b;
}
function getKey(list, find) {
for (var k in list) {
var o = list[k];
if (o === null) continue;
if (o[find] === undefined) continue;
if (find != 'l') {
//console.info('getKey',k);
return k;
}
if (o.l.length === 0) continue;
//console.info('getKey',k);
return k;
}
return undefined;
}
function getResKey(list,find) {
for (var k in list) {
var o = list[k];
if (o === null) continue;
if (!Array.isArray(o)) continue;
if (o.length===0) continue;
if (typeof(o[0][find]) == 'undefined') continue;
return k;
}
}
function getKeyHitpoints(l) {
var unit = l[0];
s = unit.get_IsAlive.toString();//get_HitpointsPercent
var sa = 'this.';
var sb = '()';
var a = s.indexOf(sa) + sa.length;
var t = s.substr(a);
var b = t.indexOf(sb);
var k = t.substr(0, b);
//console.info('a',a,'b',b,'k',k);
return k;
}
////////
//Info//
function loadBase() {
try {
if (Data === null) Data = {lastSelectedBaseId: -1, Bypass: {}};
var r = Data;
r.selectedBaseId = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCityId();
r.selectedOwnBaseId = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCityId();
if (r.lastSelectedBaseId !== r.selectedBaseId) r.loaded = false;
r.lastSelectedBaseId = r.selectedBaseId;
r.IsOwnBase = r.selectedBaseId === r.selectedOwnBaseId;
r.cc = ClientLib.Data.MainData.GetInstance().get_Cities();
r.ec = r.cc.GetCity(r.selectedBaseId);// it is very nice function
if(r.ec === null) return false;
if(r.ec.get_CityBuildingsData() === null) return false;
r.oc = r.cc.get_CurrentOwnCity();
if(r.oc === null) return false;
if(r.oc.get_CityBuildingsData() === null) return false;
r.ol = getData(r.oc);
r.el = getData(r.ec);// Buildings Defence Offence
if(typeof(r.ol)=='undefined') return false;
if(typeof(r.el)=='undefined') return false;
if(typeof(Data.Bypass.rdy)=='undefined') return false;
if(r.el.Buildings.length === 0) return false;
// for testing
//MHTools();
r.loaded = true;
//flagBaseLoaded = true;
return true;
} catch (e) {
console.warn("loadBase: ", e);
console.dir("Data:",Data);
return false;
}
}
function calcResources() {
try {
if (!Data.loaded) return;
var el = Data.el;
var loots = [0, 0, 0, 0, 0, 0, 0, 0];
// enemy buildings
for (var j in el.Buildings) {
var building = el.Buildings[j];
var mod = building.get_HitpointsPercent(); // 0-1 , 1 means 100%
var resourcesList = building[Data.Bypass.keys.Resources];
for (var i in resourcesList) {
loots[resourcesList[i].Type] += mod * resourcesList[i].Count;// resourcesList[i].Type resourcesList[i].Count
}
}
// enemy defences
for (var j in el.Defences) {
var unit = el.Defences[j];
var mod = unit.get_HitpointsPercent(); // 0-1 , 1 means 100%
var resourcesList = unit[Data.Bypass.keys.Resources];
for (var i in resourcesList) {
loots[resourcesList[i].Type] += mod * resourcesList[i].Count;
}
}
stats.spoils.tiberium.setLabel(formatNumberWithCommas(loots[1]));
stats.spoils.crystal.setLabel(formatNumberWithCommas(loots[2]));
stats.spoils.credit.setLabel(formatNumberWithCommas(loots[3]));
stats.spoils.research.setLabel(formatNumberWithCommas(loots[6]));
} catch (e) {
console.warn("calcResources: ", e);
console.dir("Bypass:",MHLoot.Data.Bypass);
}
}
function calcTroops(battleground) {
try {
//console.log(battleground);
var b,w,E,S,x,T,N=0,C=0,k=0,t=0,n=0,r=0,i=0,s=0,o=0,u=0,a=0,f=0,l=0,c=0,h=0,p=0,d=0;var g=ClientLib.Res.ResMain.GetInstance().GetGamedata().units;var entities=battleground.get_Entities().d;var m=ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity().get_CityRepairData();for(var i in entities){w=entities[i].get_Entity();E=g[w.get_MDCTypeId()];if(E.r.length<=1){continue}S=w.get_iHitpointsCurrent(),x=w.get_iHitpoints(),T=ClientLib.Base.Util.GetUnitLevelData(w.get_iLevel(),E);console.log(E);if(w.get_eAlignment()==1){n+=S,t+=x;switch(E.at){case ClientLib.Base.EUnitType.Air:c+=S,p+=x,k+=calculateRepairCost(T,ClientLib.Base.EResourceType.RepairChargeAir,S/x,m);break;case ClientLib.Base.EUnitType.Infantry:f+=S,d+=x,N+=calculateRepairCost(T,ClientLib.Base.EResourceType.RepairChargeInf,S/x,m);break;case ClientLib.Base.EUnitType.Tank:l+=S,h+=x,C+=calculateRepairCost(T,ClientLib.Base.EResourceType.RepairChargeVeh,S/x,m);break;default:}}else{r+=x,i+=S;if(w.get_MDCTypeId()>=200&&w.get_MDCTypeId()<=205){stats.supportlvl=w.get_iLevel(),stats.damage.structures.support=S/x*100}else{switch(w.get_MDCTypeId()){case 112:case 151:case 177:stats.damage.structures.construction=S/x*100;break;case 158:case 131:case 195:stats.damage.structures.defense=S/x*100;break;case 111:case 159:stats.damage.structures.command=S/x*100;break;default:}}switch(E.pt){case ClientLib.Base.EPlacementType.Structure:s+=x,o+=S;break;default:u+=x,a+=S}}}
stats.health.overall = n ? n / t * 100 : 0;
stats.health.infantry = d ? f / d * 100 : 100;
stats.health.vehicle = h ? l / h * 100 : 100;
stats.health.aircraft = p ? c / p * 100 : 100;
stats.damage.units.overall = a / u * 100;
stats.damage.structures.overall = o / s * 100;
stats.damage.overall = i / r * 100;
stats.repair.overall = Math.max(N,k,C);
stats.repair.infantry = N;
stats.repair.aircraft = k;
stats.repair.vehicle = C;
stats.time=(battleground.get_BattleDuration()/1000);
updateStatsWindow();
} catch (e) {
console.warn("calcTroops: ", e);
//console.dir("Bypass:",MHLoot.Data.Bypass);
}
}
function calculateRepairCost(e, t, n, r) {
if (n >= 1) {
return 0;
}
var ii = e.length,s;
while (ii--) {
s = e[ii];
if (s.Type == t) {
return r.ConvertRepairCost(s.Type, s.Count, 1 - n);
}
}
return 0;
}
function setLabelColor(e, t, n) {
var r = ["green", "blue", "black", "red"],
i = r[0],
s = t;
n >= 0 && (s = 100 - s), s > 99.99 ? (i = r[3]) : s > 50 ? (i = r[2]) : s > 0 && (i = r[1]), e.setTextColor(i);
}
function updateLabel100(e, t, n) {
setLabelColor(e, t, n), e.setValue(t.toFixed(2).toString());
}
function updateLabel100time(e, t, n, r) {
var i = t.toFixed(2).toString() + " @ ";
i += formatSecondsAsTime(r), setLabelColor(e, t, n), e.setValue(i);
}
function updateStatsWindow() {
var e = ["black", "blue", "green", "red"],
t = "",
n = 0;
stats.damage.structures.construction === 0 ? (t = "Total Victory", n = 0) : stats.damage.structures.overall < 100 ? (t = "Victory", n = 1) : (t = "Total Defeat", n = 3);
labels.damage.outcome.setValue(t), labels.damage.outcome.setTextColor(e[n]);
updateLabel100(labels.damage.overall, stats.damage.overall, - 1);
updateLabel100(labels.damage.units.overall, stats.damage.units.overall, - 1);
updateLabel100(labels.damage.structures.overall, stats.damage.structures.overall, - 1);
updateLabel100(labels.damage.structures.construction, stats.damage.structures.construction, - 1);
updateLabel100(labels.damage.structures.defense, stats.damage.structures.defense, - 1);
//mnm.nnnmm ? updateLabel100(labels.damage.structures.command, stats.damage.structures.command, - 1) : (labels.damage.structures.command.setValue("--"),labels.damage.structures.command.setTextColor("green"));
//var r = stats.supportlvl > 0 ? stats.supportlvl.toString() : "--";
//labels.supportlvl.setValue("Suport lvl " + r + ": ");
//updateLabel100(labels.damage.structures.support,stats.damage.structures.support, - 1);
updateLabel100time(labels.health.overall, stats.health.overall, 1, stats.repair.overall);
updateLabel100time(labels.health.infantry, stats.health.infantry, 1, stats.repair.infantry);
updateLabel100time(labels.health.vehicle, stats.health.vehicle, 1, stats.repair.vehicle);
updateLabel100time(labels.health.aircraft, stats.health.aircraft, 1, stats.repair.aircraft);
setLabelColor(labels.time, stats.time / 120, - 1);
labels.time.setValue(stats.time.toFixed(2).toString());
}
function formatNumberWithCommas(e) {
return Math.floor(e).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
function formatSecondsAsTime(e, t) {
var n = Math.floor(e / 3600),
r = Math.floor((e - n * 3600) / 60),
i = Math.floor(e - n * 3600 - r * 60);
r < 10 && (r = "0" + r), i < 10 && (i = "0" + i);
return n + ":" + r + ":" + i;
}
//////////////
//Formations//
function getCityPreArmyUnits() {
ClientLib = unsafeWindow["ClientLib"];
var ownCity = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity();
var formationManager = ownCity.get_CityArmyFormationsManager();
return formationManager.GetFormationByTargetBaseId(formationManager.get_CurrentTargetBaseId());
}
function restoreFormation(saved_units) {
var sUnits = saved_units;
var units = getCityPreArmyUnits();
var units_list = units.get_ArmyUnits().l;
for (var idx = 0; idx < sUnits.length; idx++) {
var saved_unit = sUnits[idx];
var uid = saved_unit.id;
for (var i = 0; (i < units_list.length); i++) {
if (units_list[i].get_Id() === uid) {
units_list[i].MoveBattleUnit(saved_unit.x, saved_unit.y);
if (saved_unit.enabled === undefined) units_list[i].set_Enabled(true);
else units_list[i].set_Enabled(saved_unit.enabled);
}
}
}
units.UpdateFormation(true); //this works and USES the API so works for both servers
}
function shiftFormation(direction) { //left right up down
if (!direction) var direction = window.prompt("indicate a direction to shift units: up(u), down(d), left(l) or right(r)");
if (direction == "up" || direction == "u") var v_shift = -1;
if (direction == "down" || direction == "d") var v_shift = 1;
if (direction == "left" || direction == "l") var h_shift = -1;
if (direction == "right" || direction == "r") var h_shift = 1;
if (!v_shift) var v_shift = 0;
if (!h_shift) var h_shift = 0;
units = getCityPreArmyUnits().get_ArmyUnits().l;
var Army = [];
//read army, consider use saveFormation(?)
for (var i = 0; (i < this.units.length); i++) {
var unit = this.units[i];
var armyUnit = {};
var x = unit.get_CoordX() + h_shift;
switch (x) {
case 9:
x = 0;
break;
case -1:
x = 8;
break;
}
var y = unit.get_CoordY() + v_shift;
switch (y) {
case 4:
y = 0;
break;
case -1:
y = 3;
break;
}
armyUnit.x = x;
armyUnit.y = y;
armyUnit.id = unit.get_Id();
armyUnit.enabled = unit.get_Enabled();
Army.push(armyUnit);
}
restoreFormation(Army);
}
//Basic simulate functions
var lock = false;
function initSimulateBattle() {
qx = unsafeWindow["qx"];
ClientLib = unsafeWindow["ClientLib"];
var armyBar = qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_ATTACKSETUP);
////////////
//Simulate//
var simulatebtn = new qx.ui.form.Button("Simulate");
simulatebtn.set({
width: 64,
height: 26,
appearance: "button-text-small",
toolTipText: "Start Combat Simulation"
});
simulatebtn.addListener("click", function () {
qx = unsafeWindow["qx"];
ClientLib = unsafeWindow["ClientLib"];
webfrontend = unsafeWindow["webfrontend"];
if (lock) return;
qx = unsafeWindow["qx"];
var city = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentCity();
var ownCity = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity();
var app = qx.core.Init.getApplication();
if (city.get_OwnerAllianceId() != 0) {
alert("Not allowed for PvP!");
return;
}
var mainData = ClientLib.Data.MainData.GetInstance();
var player_cities = mainData.get_Cities();
var current_city = player_cities.get_CurrentCity();
localStorage.ta_sim_last_city = current_city.get_Id();
ownCity.get_CityArmyFormationsManager().set_CurrentTargetBaseId(city.get_Id());
ClientLib.Vis.VisMain.GetInstance().get_Battleground().SimulateBattle();
app.getPlayArea().setView(webfrontend.gui.PlayArea.PlayArea.modes.EMode_CombatReplay, city.get_Id(), 0, 0);
lock = true;
simulatebtn.setOpacity(0.2);
setTimeout(function () {
simulatebtn.setOpacity(1.0);
lock = false;
}, 10100)
}, this)
armyBar.add(simulatebtn, {
left: 12,
top: 126
});
//////////
//Unlock//
var unlockbtn = new qx.ui.form.Button("Unlock");
unlockbtn.set({
width: 55,
height: 46,
appearance: "button-text-small",
toolTipText: "Unlock Attack Button"
});
unlockbtn.setOpacity(0.5);
unlockbtn.addListener("click", function () {
qx = unsafeWindow["qx"];
var armyBar = qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_ATTACKSETUP);
armyBar.remove(unlockbtn);
setTimeout(function () {
armyBar.add(unlockbtn, {
top: 107,
right: 4
});
}, 2000);
}, this);
armyBar.add(unlockbtn, {
top: 107,
right: 4
});
////////
//Back//
var backbtn = new qx.ui.form.Button("Setup");
backbtn.set({
width: 50,
height: 24,
appearance: "button-text-small",
toolTipText: "Return to Combat Setup"
});
backbtn.addListener("click", function () {
qx = unsafeWindow["qx"];
var app = qx.core.Init.getApplication();
var player_cities = ClientLib.Data.MainData.GetInstance().get_Cities();
var current_city = player_cities.get_CurrentCity();
try {
app.getPlayArea().setView(webfrontend.gui.PlayArea.PlayArea.modes.EMode_CombatSetupDefense, localStorage.ta_sim_last_city, 0, 0);
} catch (e) {
app.getPlayArea().setView(webfrontend.gui.PlayArea.modes.EMode_CombatSetupDefense, localStorage.ta_sim_last_city, 0, 0);
}
}, this);
var replayBar = qx.core.Init.getApplication().getReportReplayOverlay();
replayBar.add(backbtn, {
top: 37,
left: 255
});
/////////
//Shift//
var arrows = {};
arrows.ShiftFormationLeft = new qx.ui.form.Button("←");
arrows.ShiftFormationLeft.set(
{
width: 30,
appearance: "button-text-small",
toolTipText: "Shift units Left"
});
arrows.ShiftFormationLeft.addListener("click", function(){shiftFormation('l');}, this);
arrows.ShiftFormationRight = new qx.ui.form.Button("→");
arrows.ShiftFormationRight.set(
{
width: 30,
appearance: "button-text-small",
toolTipText: "Shift units RIGHT"
});
arrows.ShiftFormationRight.addListener("click", function(){shiftFormation('r');}, this);
arrows.ShiftFormationUp = new qx.ui.form.Button("↑");
arrows.ShiftFormationUp.set(
{
width: 30,
appearance: "button-text-small",
toolTipText: "Shift units UP"
});
arrows.ShiftFormationUp.addListener("click", function(){shiftFormation('u');}, this);
arrows.ShiftFormationDown = new qx.ui.form.Button("↓");
arrows.ShiftFormationDown.set(
{
width: 30,
appearance: "button-text-small",
toolTipText: "Shift units DOWN"
});
arrows.ShiftFormationDown.addListener("click", function(){shiftFormation('d');}, this);
armyBar.add(arrows.ShiftFormationUp,
{
top: 17,
left: 29
});
armyBar.add(arrows.ShiftFormationLeft,
{
top: 34,
left: 12
});
armyBar.add(arrows.ShiftFormationRight,
{
top: 34,
left: 46
});
armyBar.add(arrows.ShiftFormationDown,
{
top: 51,
left: 29
});
}
//////////////////////////////////////////////////
//infernal wrapper by infernal me
//149068
//Version: 0.372798
//////////////////////////////////////////////////
function injectwrapper() {
var CCTAWrapper_main = function () {
try {
gni = function(o, idx){
var i = 0;
for (k in o){
if (i == idx){
return k;
}
i++;
}
return '';
}
gbi = function(n, o, idx){_log(n);_logp(o);var i=0;for(k in o){i++;if(i==idx) return o[k];}}
sbi = function(n, o, idx, v){_log(n);_logp(o);var i=0;for(k in o){i++;if(i==idx) o[k]=v;}}
_log = function(){
if(typeof console != 'undefined') console.log(arguments);
else if(window.opera) opera.postError(arguments);
else GM_log(arguments);
}
hmm = []
CCTAWrapper = []
_show = function(o){var ks=[];var i=0; for (k in o)ks[i++]=k;return ks;}
_logp = function(o){_log(_show(o));}
//_log('have fun :)')
wrapper = {
_val_or_def: function(val, def) {
if(typeof val != 'undefined') return val;
return def;
},
_prop_name: function(prop_map) {return prop_map[this.versions[this.version]];},
_prop_index: function(prop_map) {return prop_map[this.versions[this.version]+1];},
versions: {'368132': 0, '372393': 2, '372567': 4, '372798': 6},
version: null,//'368132',
init_wrap: function(wrap) {
try {
var fn = wrap[0]
var to_name = wrap[1]
var tp_name = wrap[2]
var sp_map = wrap[3]
if(wrap.length == 5) var opt_so_name = wrap[4];
var so_name = this._val_or_def(opt_so_name, to_name)
var sp_index = sp_map[this._index]
//_log('testing '+to_name+'.'+tp_name+'='+sp_name+':'+sp_index+':'+sp_map[this._name])
switch (fn){
case 0:
var sp_name = gni(eval(so_name), sp_index)
var eval_str = to_name+"."+tp_name+" = "+so_name+"."+sp_name;
break;
case 1:
var sp_name = gni(eval(so_name+'.prototype'), sp_index)
var eval_str = to_name+".prototype."+tp_name+" = "+so_name+".prototype."+sp_name;
break;
case 2:
var sp_name = gni(eval("(new "+so_name+")"), sp_index)
var eval_str = to_name+".prototype."+tp_name+" = function(){return this."+sp_name+";}"
break;
case 3:
var sp_name = gni(eval("(new "+so_name+")"), sp_index)
var eval_str = to_name+".prototype."+tp_name+" = function(value){this."+sp_name+"=value;}"
break;
}
//hmm.push([sp_map[this._name], sp_name])
CCTAWrapper.push(eval_str);
//console.log(eval_str);
eval(eval_str);
} catch(e) {
_log(e)
}
},
wraps: [
[0, 'System', 'EventHandler', ['UXDRTN', 515, 'NGTHZJ', 529, 'JCSGJY', 529, 'KFYAAI', 529]],
[1, 'System.EventHandler', '$ctor', ['NKAYQG', 1, 'MIARKA', 1, 'EWWHOL', 1, 'ZAXRBM', 1]],
[1, 'ClientLib.Vis.ViewModeChange', '$ctor', ['NKAYQG', 1, 'MIARKA', 1, 'EWWHOL', 1, 'ZAXRBM', 1]],
[0, 'SharedLib', 'Combat', ['ABMZCA', 479, 'IDXMKY', 489, 'ADKXKR', 489, 'HXFPLA', 489]],
[0, 'SharedLib.Combat', 'CbtSetup', ['PIZEIS', 511, 'NRUUGI', 523, 'WHLOUM', 523, 'KLFTJR', 523], 'SharedLib'],
[0, 'SharedLib.Combat', 'CbtSimulation', ['MTNICQ', 514, 'DZXTYL', 526, 'ACBTHR', 526, 'HVADQY', 526], 'SharedLib'],
[2, 'ClientLib.Vis.Battleground.Battleground', 'get_Entities', ['VMKWMN', 47, 'XSWELH', 32, 'KMBRZW', 32, 'SUEDOE', 32]],
[1, 'SharedLib.Combat.CbtSimulation', 'DoStep', ['RVQKEM', 24, 'OWGEVP', 26, 'UZQRCL', 26, 'DCQBPW', 26]],
[2, 'SharedLib.Combat.CbtSimulation', 'get_iCombatStep', ['XPJFXB', 12, 'VMUZIL', 13, 'DRBCLE', 13, 'LNMEAH', 13]],
[0, 'SharedLib.Combat', 'CbtEntity', ['RMODUK', 517, 'JTEOOI', 531, 'JCGAHG', 531, 'ECRBKG', 531], 'SharedLib'],
[2, 'SharedLib.Combat.CbtEntity', 'get_eAlignment', ['VTZLJN', 12, 'DGCHHX', 16, 'FNFYRU', 16, 'OZMCXW', 16]],
[2, 'SharedLib.Combat.CbtEntity', 'get_iHitpoints', ['FOYNHE', 20, 'WVNYBU', 24, 'KZYUFV', 24, 'YSIGTS', 24]],
[2, 'SharedLib.Combat.CbtEntity', 'get_iHitpointsCurrent', ['BVCBXJ', 21, 'JRPGGY', 25, 'TQGPMJ', 25, 'FKIJLL', 25]],
[2, 'SharedLib.Combat.CbtEntity', 'get_MDCTypeId', ['ADPYGJ', 9, 'LWEMLL', 13, 'DOHVCH', 13, 'NYWTBP', 13]],
[2, 'SharedLib.Combat.CbtEntity', 'get_iLevel', ['XAWKEE', 33, 'BBOCMN', 40, 'VLRZBZ', 40, 'BVTEXJ', 40]],
[0, 'ClientLib.Base.Util', 'GetUnitLevelData', ['MYJUVV', 35, 'NSRLEW', 36, 'LBVSBJ', 36, 'UAETGG', 36]],
[0, 'ClientLib.Data', 'World', ['DHZVSV', 225, 'FBIHPA', 222, 'ZNNOJA', 222, 'RXBFAJ', 222], 'SharedLib'],
[2, 'ClientLib.Data.World', 'getSectors', ['EBJZUK', 2, 'USDXCN', 8, 'XKDXDO', 8, 'DXWDMU', 8]],
[2, 'ClientLib.Data.CityUnits', 'get_FullRawRepairTimeForUnitGroupTypes', ['IKDTVE', 6, 'OTDSKU', 6, 'KJXNLV', 6, 'EGPVJG', 6]],
[1, 'ClientLib.Data.CityUnits', 'get_OffenseUnits', ['VPNCHY', 68, 'YFPFEA', 68, 'VQTZWZ', 68, 'LFLRDX', 68]],
[1, 'ClientLib.Data.CityUnits', 'get_DefenseUnits', ['BFENHD', 69, 'BVLEOM', 69, 'KSNJIL', 69, 'OZUZHB', 69]],
[0, 'ClientLib.Data', 'CityRepair', ['KBVZQX', 295, 'XSCVQY', 302, 'EMJXEK', 302, 'OGYYVR', 302], 'SharedLib'],
[1, 'ClientLib.Data.CityRepair', 'CanRepair', ['JPPHSL', 51, 'KPJOGJ', 51, 'CJNJHS', 51, 'ELLALQ', 51]],
[1, 'ClientLib.Data.CityRepair', 'UpdateCachedFullRepairAllCost', ['IMVKOC', 63, 'FPXIRL', 63, 'USKKAR', 63, 'EUNASQ', 63]],
[1, 'ClientLib.Data.CityRepair', 'ConvertRepairCost', ['SPZDZS', 54, 'KTBNUH', 54, 'SZMDMZ', 54, 'AEQAYN', 54]],
[1, 'ClientLib.Data.CityPreArmyUnits', 'RefreshData', ['UPLGQX', 20, 'AYSULX', 20, 'GGASDX', 20, 'WWOZKG', 20]],
[2, 'ClientLib.Data.City', 'getResourceLayout', ['TTZXUV', 50, 'VEVRWH', 51, 'LTUGHT', 51, 'DIKBFF', 51]],
[2, 'ClientLib.Data.CityBuildings', 'get_Buildings', ['QQXUFW', 2, 'KXNWER', 2, 'MJZVZV', 2, 'YJFUGH', 2]],
[2, 'ClientLib.Data.CityEntity', 'get_UnitLevelRequirements', ['JSPNOJ', 2, 'ELBALP', 2, 'GPJTIV', 2, 'MYYNWB', 2]],
[1, 'ClientLib.Data.CityEntity', 'get_UnitLevelRepairCost', ['get_UnitLevelRequirements', 67, 'get_UnitLevelRequirements', 69, 'get_UnitLevelRequirements', 69, 'get_UnitLevelRequirements', 69]],
[3, 'ClientLib.Data.Combat', 'set_Version', ['QVVMKN', 2, 'JVAKKQ', 1, 'SWINUM', 1, 'IIEPGR', 1]],
[3, 'ClientLib.Data.Combat', 'set_StartStep', ['ILFZUG', 3, 'FIGZGC', 3, 'XNBJZC', 3, 'TNMYVN', 3]],
[3, 'ClientLib.Data.Combat', 'set_Attacker', ['OYABQD', 4, 'TRRERK', 4, 'PYFENC', 4, 'YORRBM', 4]],
[3, 'ClientLib.Data.Combat', 'set_Defender', ['UQJQSW', 5, 'ZSTKUP', 5, 'MSSCZL', 5, 'DWOQYP', 5]],
[3, 'ClientLib.Data.Combat', 'set_Blocker', ['ZBVZOD', 6, 'KFQWVW', 6, 'IQSLLP', 6, 'KHZCWR', 6]],
[3, 'ClientLib.Data.Combat', 'set_Buildings', ['DFGGIB', 7, 'FSVKTA', 7, 'OPLYEK', 7, 'CZWYBW', 7]],
[3, 'ClientLib.Data.Combat', 'set_Supports', ['DZOZGI', 8, 'PTSGBE', 8, 'PIHBNH', 8, 'ZHUQEN', 8]],
[3, 'ClientLib.Data.Combat', 'set_Debug', ['GNSESK', 36, 'LEEPKR', 38, 'JNJGAB', 38, 'UQGSLK', 38]],
[1, 'ClientLib.Data.Combat', 'setNPCNames', ['DUVWXR', 44, 'GOAFQJ', 46, 'ZUQXYT', 46, 'ZYQOUF', 46]],
[0, 'ClientLib.Vis.Battleground', 'BattlegroundEntity', ['BLEBFL', 516, 'QGVOPO', 530, 'KOBQGP', 530, 'ZMJNME', 530], 'System'],
[2, 'ClientLib.Vis.Battleground.BattlegroundEntity', 'get_Entity', ['ILLYJL', 25, 'RVVLCA', 25, 'KZYXTD', 25, 'UIKENY', 25]],
[2, 'ClientLib.Vis.Battleground.BattlegroundEntity', 'get_UnitType', ['KPWXBD', 1, 'IQTKIG', 1, 'CIZUDY', 1, 'ODLTMA', 1]],
[2, 'ClientLib.Vis.Battleground.Battleground', 'get_Simulation', ['YPYRGP', 44, 'QRDUJM', 29, 'WQOTHV', 29, 'WVQJYL', 29]],
[3, 'ClientLib.Vis.Battleground.Battleground', 'set_CurrentReplay', ['YMADLI', 79, 'OMDYHD', 54, 'FMVUZS', 54, 'YNIYUR', 54]],
[1, 'ClientLib.Vis.Battleground.Battleground', 'setCombatData', ['ZMQRGW', 182, 'ADMYQP', 159, 'GREBVM', 159, 'JEQDDM', 159]],
[2, 'ClientLib.Res.ResMain', 'get_Gamedata', ['YMIGZX', 1, 'BQKOXH', 1, 'FEPVKS', 1, 'BMONHF', 1]]
//[2, 'SharedLib.Combat.CbtSetup', 'get_Entities', ['VMKWMN', 48, 'XSWELH', 0]],//??
//[1, 'ClientLib.Data.CityPreArmyUnits', 'UpdateArmyLayout', ['CIVNTG', 0, 'JKGIUG', 0]],// Should not be needed
],
init: function() {
try{
this._name = this.versions[this.version]
this._index = this._name + 1
System = $I
SharedLib = $I
for (var i in this.wraps) this.init_wrap(this.wraps[i]);
}catch(e){
_log(e)
}
}
}
function createCCTAWrapper() {
console.log('CCTAWrapper loaded');
console.log('Wrapper loading '+PerforceChangelist);
wrapper.version = '' + PerforceChangelist
wrapper.init()
console.log('Wrapper loaded')
//console.log(hmm)
//console.log(CCTAWrapper)
}
} catch (e) {
console.log("createCCTAWrapper: ", e);
}
function CCTAWrapper_checkIfLoaded() {
try {
if (typeof qx !== 'undefined') {
createCCTAWrapper();
} else {
window.setTimeout(CCTAWrapper_checkIfLoaded, 1000);
}
} catch (e) {
CCTAWrapper_IsInstalled = false;
console.log("CCTAWrapper_checkIfLoaded: ", e);
}
}
if (/commandandconquer\.com/i.test(document.domain)) {
window.setTimeout(CCTAWrapper_checkIfLoaded, 1000);
}
}
try {
var CCTAWrapper = document.createElement("script");
CCTAWrapper.innerHTML = "var CCTAWrapper_IsInstalled = true; (" + CCTAWrapper_main.toString() + ")();";
CCTAWrapper.type = "text/javascript";
if (/commandandconquer\.com/i.test(document.domain)) {
document.getElementsByTagName("head")[0].appendChild(CCTAWrapper);
}
} catch (e) {
console.log("CCTAWrapper: init error: ", e);
}
}
function waitForClientLib() {
ClientLib = unsafeWindow["ClientLib"];
qx = unsafeWindow["qx"];
if ((typeof ClientLib == 'undefined') || (typeof qx == 'undefined') || (qx.core.Init.getApplication().initDone == false)) {
setTimeout(waitForClientLib, 1000);
return;
}
initSimulateBattle();
initializeTools();
};
function startup() {
setTimeout(waitForClientLib, 1000);
};
startup();
0 comments:
Post a Comment