- // ==UserScript==
- // @name Tiberium Alliances Formation Saver
- // @description Allows you to save attack formations
- // @namespace https://prodgame*.alliances.commandandconquer.com/*/index.aspx*
- // @include https://prodgame*.alliances.commandandconquer.com/*/index.aspx*
- // @version 2.2
- // @author Panavia, KRS_L
- // ==/UserScript==
- (function () {
- var tafs_main = function () {
- var windowSaver;
-
- function initialize() {
- console.log("Formation Saver Loaded");
-
- qx.Class.define("webfrontend.gui.PlayArea.FormationSaver", {
- extend : qx.ui.container.Composite,
-
- construct : function () {
- qx.ui.container.Composite.call(this);
- this.setLayout(new qx.ui.layout.Canvas());
- this.add(this.init());
- },
-
- statics : {
- SaverCollapsedHeight : 48,
- SaverExpandedHeight : 245,
- },
-
- properties : {
- expanded : {
- init : true,
- apply : "expand"
- },
- },
-
- members : {
- buttonResize : null,
- containerContence : null,
- containerSaves : null,
- containerMain : null,
- buttonSave : null,
-
- init : function () {
- this.buttonResize = new webfrontend.ui.SoundButton(null, "FactionUI/icons/icon_tracker_minimise.png").set({
- width : 20,
- height : 20,
- appearance : "button-notif-cat",
- center : true,
- allowGrowX : false
- });
- this.buttonResize.addListener("click", function (e) {
- this.setExpanded(!this.getExpanded());
- }, this);
- var ba = new qx.ui.container.Composite(new qx.ui.layout.HBox().set({
- alignY : "middle"
- })).set({
- margin : 0,
- marginLeft : 6,
- marginRight : 9
- });
- ba.add(this.buttonResize);
- var labelTitle = new qx.ui.basic.Label("<b>Saver</b>");
- labelTitle.set({
- marginLeft : 4,
- rich : true
- });
- labelTitle.setTextColor("#FFFFFF");
- ba.add(labelTitle);
- this.containerContence = new qx.ui.container.Composite(new qx.ui.layout.VBox().set({
- alignX : "center"
- })).set({
- allowGrowX : true,
- margin : 0
- });
-
- containerSaves = new qx.ui.container.Composite(new qx.ui.layout.Grid(10, 2)).set({
- allowGrowX : true,
- marginLeft : 0,
- marginBottom : 5
- });
- this.containerContence.add(containerSaves);
-
- buttonSave = new qx.ui.form.Button("Save");
- buttonSave.set({
- width : 50,
- appearance : "button-text-small",
- toolTipText : "Save attack formation",
- allowGrowX : false
- });
- buttonSave.addListener("click", this.save, this);
- this.containerContence.add(buttonSave);
-
- this.containerMain = new qx.ui.container.Composite(new qx.ui.layout.VBox().set({
- alignX : "right"
- })).set({
- maxHeight : webfrontend.gui.PlayArea.FormationSaver.SaverExpandedHeight,
- width : 75,
- minHeight : 32,
- allowShrinkY : true,
- decorator : new qx.ui.decoration.Decorator().set({
- borderImage : "webfrontend/ui/common/bgr_mission_tracker.png"
- })
- });
- this.containerMain.add(ba);
- this.containerMain.add(this.containerContence, {
- flex : 1
- });
-
- return this.containerMain;
- },
-
- expand : function (bs) {
- if (!bs) {
- this.buttonResize.setIcon("FactionUI/icons/icon_tracker_maximise.png");
- this.containerMain.setMaxHeight(webfrontend.gui.PlayArea.FormationSaver.SaverCollapsedHeight);
- } else {
- this.buttonResize.setIcon("FactionUI/icons/icon_tracker_minimise.png");
- this.containerMain.setMaxHeight(webfrontend.gui.PlayArea.FormationSaver.SaverExpandedHeight);
- }
- },
-
- update : function () {
- containerSaves.removeAll();
-
- var playerCities = ClientLib.Data.MainData.GetInstance().get_Cities();
- var currentOwnCity = playerCities.get_CurrentOwnCity();
- var cityID = playerCities.get_CurrentCity().get_Id();
- var ownCityID = currentOwnCity.get_Id();
-
- var formations = this.loadFormations();
- if (!formations) {
- return;
- }
- if (!formations[cityID]) {
- return;
- }
- if (!formations[cityID][ownCityID]) {
- return;
- }
-
- var i = 0;
- for (var id in formations[cityID][ownCityID]) {
- if (id != 0) {
- i++;
- var formation = formations[cityID][ownCityID][id];
- var date = new Date(Number(formation.t));
- var toolTipText = "<div><span style='float: left'><b>" + formation.n + "</b></span><span style='float: right'> " + date.getHours() + ":" + (date.getMinutes() <= 9 ? "0" : "") + date.getMinutes() + " " + date.getDate() + "/" + (date.getMonth() + 1) + "</span></div><div style='clear: both;'></div>";
- if (formation.cy != null) {
- toolTipText += formation.cy + "% Construction Yard</br>" + formation.df + "% Defense Facility</br>" + formation.ts + "% Troop Strength</br>" + this.formatSecondsAsTime(formation.r) + " Repair Time";
- }
-
- var labelLoad = new qx.ui.basic.Label(formation.n);
- labelLoad.set({
- width : 40,
- allowGrowX : false,
- toolTipText : toolTipText
- });
- labelLoad.setTextColor("#FFFFFF");
- labelLoad.addListener("click", this.clickLoad(formation), this);
- labelLoad.addListener("mouseover", this.mouseover(labelLoad, "#BBBBBB"), this);
- labelLoad.addListener("mouseout", this.mouseout(labelLoad, "#FFFFFF"), this);
- containerSaves.add(labelLoad, {
- row : i,
- column : 1
- });
-
- var labelDelete = new qx.ui.basic.Label("<b>X</b>");
- labelDelete.set({
- width : 10,
- allowGrowX : false,
- rich : true,
- toolTipText : "Delete " + formation.n
- });
- labelDelete.setTextColor("#881717");
- labelDelete.addListener("click", this.clickDeleteF(cityID, ownCityID, id), this);
- labelDelete.addListener("mouseover", this.mouseover(labelDelete, "#550909"), this);
- labelDelete.addListener("mouseout", this.mouseover(labelDelete, "#881717"), this);
- containerSaves.add(labelDelete, {
- row : i,
- column : 2
- });
- }
- }
- },
-
- mouseover : function (label, color) {
- return function () {
- label.setTextColor(color);
- }
- },
-
- mouseout : function (label, color) {
- return function () {
- label.setTextColor(color);
- }
- },
-
- save : function () {
- try {
- var playerCities = ClientLib.Data.MainData.GetInstance().get_Cities();
- var currentOwnCity = playerCities.get_CurrentOwnCity();
- var cityID = playerCities.get_CurrentCity().get_Id();
- var ownCityID = currentOwnCity.get_Id();
-
- var newFormation = new Object();
- newFormation.t = new Date().getTime().toString();
- newFormation.n = "";
- newFormation.l = new Array();
-
- var formation = currentOwnCity.get_CityArmyFormationsManager().GetFormationByTargetBaseId(cityID);
- var armyUnits = formation.get_ArmyUnits();
- if (armyUnits == null) {
- console.log("tafs Error: You must move a unit befor saving!");
- return;
- }
- armyUnits = armyUnits.l;
- for (var i in armyUnits) {
- var unit = armyUnits[i];
- newFormation.l[i] = new Object();
- newFormation.l[i].x = unit.get_CoordX();
- newFormation.l[i].y = unit.get_CoordY();
- newFormation.l[i].e = unit.get_Enabled();
- }
-
- var formations = this.loadFormations();
- if (!formations) {
- formations = new Object();
- }
- if (!formations[cityID]) {
- formations[cityID] = new Object();
- }
- if (!formations[cityID][ownCityID]) {
- formations[cityID][ownCityID] = new Array();
- formations[cityID][ownCityID][0] = 0;
- }
- formations[cityID][ownCityID][0]++;
- newFormation.n = "Save " + formations[cityID][ownCityID][0];
-
- formations[cityID][ownCityID].push(newFormation);
- this.saveFormations(formations);
-
- windowSaver.update();
- } catch (e) {
- console.log(e);
- }
- },
-
- clickLoad : function (newFormation) {
- return function () {
- this.load(newFormation);
- }
- },
-
- load : function (newFormation) {
- try {
- var playerCities = ClientLib.Data.MainData.GetInstance().get_Cities();
- var currentOwnCity = playerCities.get_CurrentOwnCity();
- var cityID = playerCities.get_CurrentCity().get_Id();
-
- var formation = currentOwnCity.get_CityArmyFormationsManager().GetFormationByTargetBaseId(cityID);
- var armyUnits = formation.get_ArmyUnits();
- if (armyUnits == null) {
- console.log("tafs Error: You must move a unit befor loading!");
- return;
- }
- armyUnits = armyUnits.l;
-
- for (var i in newFormation.l) {
- var unitData = newFormation.l[i];
- armyUnits[i].MoveBattleUnit(unitData.x, unitData.y);
- if (unitData.e != null) {
- if (armyUnits[i].set_Enabled_Original) {
- armyUnits[i].set_Enabled_Original(unitData.e);
- } else {
- armyUnits[i].set_Enabled(unitData.e);
- }
- }
- }
-
- //formation.set_CurrentTargetBaseId(cityID);
- } catch (e) {
- console.log(e);
- }
- },
-
- clickDeleteF : function (cityID, ownCityID, id) {
- return function () {
- this.deleteF(cityID, ownCityID, id);
- }
- },
-
- deleteF : function (cityID, ownCityID, id) {
- var formations = this.loadFormations();
- if (!formations || !formations[cityID] || !formations[cityID][ownCityID])
- return;
-
- formations[cityID][ownCityID].splice(id, 1);
- if (formations[cityID][ownCityID].length <= 1) {
- delete formations[cityID][ownCityID];
- }
- var i
- for (i in formations[cityID]) {
- if (formations[cityID].hasOwnProperty(i)) {
- break;
- }
- }
- if (!i)
- delete formations[cityID];
-
- this.saveFormations(formations);
-
- windowSaver.update();
- },
-
- saveFormations : function (formations) {
- var data = JSON.stringify(formations);
- localStorage.formations = data;
- },
-
- loadFormations : function () {
- var formations = localStorage.formations;
- return formations && JSON.parse(formations);
- },
-
- 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;
- }
-
- return hr + ':' + min + ':' + sec;
- },
- }
- })
-
- windowSaver = new webfrontend.gui.PlayArea.FormationSaver();
- windowSaver.hide();
- qx.core.Init.getApplication().getPlayArea().add(windowSaver, {
- top : 55,
- right : -2
- });
-
- if (!ClientLib.Data.MainData.GetInstance().get_Cities().__tafs__set_CurrentOwnCityId) {
- ClientLib.Data.MainData.GetInstance().get_Cities().__tafs__set_CurrentOwnCityId = ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentOwnCityId;
- }
- ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentOwnCityId = function (a) {
- this.__tafs__set_CurrentOwnCityId(a);
- updateView();
- }
-
- if (!ClientLib.Data.MainData.GetInstance().get_Cities().__tafs__set_CurrentCityId) {
- ClientLib.Data.MainData.GetInstance().get_Cities().__tafs__set_CurrentCityId = ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentCityId;
- }
- ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentCityId = function (a) {
- this.__tafs__set_CurrentCityId(a);
- updateView();
- }
-
- function updateView() {
- switch (qx.core.Init.getApplication().getPlayArea().getViewMode()) {
- case ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupDefense:
- case ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupBase:
- windowSaver.update();
- windowSaver.show();
- break;
- default:
- windowSaver.hide();
- }
-
- }
- }
-
- function tafs_checkIfLoaded() {
- try {
- if (typeof qx != 'undefined') {
- a = qx.core.Init.getApplication(); // application
- mb = qx.core.Init.getApplication().getMenuBar();
- if (a && mb) {
- initialize();
- } else
- window.setTimeout(tafs_checkIfLoaded, 1000);
- } else {
- window.setTimeout(tafs_checkIfLoaded, 1000);
- }
- } catch (e) {
- if (typeof console != 'undefined')
- console.log(e);
- else if (window.opera)
- opera.postError(e);
- else
- GM_log(e);
- }
- }
-
- if (/commandandconquer\.com/i.test(document.domain)) {
- window.setTimeout(tafs_checkIfLoaded, 1000);
- }
- }
-
- // injecting, because there seem to be problems when creating game interface with unsafeWindow
- var tafsScript = document.createElement("script");
- tafsScript.innerHTML = "(" + tafs_main.toString() + ")();";
- tafsScript.type = "text/javascript";
- if (/commandandconquer\.com/i.test(document.domain)) {
- document.getElementsByTagName("head")[0].appendChild(tafsScript);
- }
- })();