Custom Flunik Tools

Upgrades Offense or Defense or Buildings.

  1. // ==UserScript==
  2. // @name Custom Flunik Tools
  3. // @namespace FlunikTools
  4. // @description Upgrades Offense or Defense or Buildings.
  5. // @version 1.4.0
  6. // @author dbendure, Gryphon (Debugging/Translation)
  7. // @include http*://prodgame*.alliances.commandandconquer.com/*/index.aspx*
  8. //@grant none
  9. // ==/UserScript==
  10. (function () {
  11. var FlunikTools_main = function () {
  12. try {
  13. /*function CCTAWrapperIsInstalled() {
  14. return (typeof (CCTAWrapper_IsInstalled) != 'undefined' && CCTAWrapper_IsInstalled);
  15. }*/
  16.  
  17. function createFlunikTools() {
  18. console.log('FLUNIKTOOLS createFlunikTools');
  19.  
  20. qx.Class.define("FlunikTools.Main", {
  21. type: "singleton"
  22. , extend: qx.core.Object
  23. , members: {
  24.  
  25. button: null
  26. , popup: null
  27. , AutoUpdateButton: null
  28. , BuildingsButton: null
  29. , DefenseButton: null
  30. , OffenseButton: null
  31. , autoUpdateHandle: null
  32. , AautoUpdateHandle: null
  33. , p: 1
  34. , f: 1
  35. , g: 0
  36. , h: 1
  37. , h1: 1
  38. , r: 1
  39. , s: 1
  40. , a: 1
  41. , x: 0
  42. , y: 1
  43. , z: 1,
  44.  
  45.  
  46.  
  47. initialize: function () {
  48.  
  49. console.log('FLUNIKTOOLS initialize');
  50. /*AutoUpdateButton = new qx.ui.form.Button("All", null).set({
  51. toolTipText: "Only Upgrades Everything, even if you turn it off... stupid all button!",
  52. width: 60,
  53. height: 30,
  54. maxWidth: 60,
  55. maxHeight: 30,
  56. appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  57. center: true
  58. });*/
  59. BuildingsButton = new qx.ui.form.Button("Building", null).set({
  60. toolTipText: "Only Upgrades Buildings"
  61. , width: 63
  62. , height: 30
  63. , maxWidth: 60
  64. , maxHeight: 30
  65. , appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  66. center: true,
  67.  
  68. });
  69. DefenseButton = new qx.ui.form.Button("Defence", null).set({
  70. toolTipText: "Only Upgrades Defence"
  71. , width: 63
  72. , height: 30
  73. , maxWidth: 60
  74. , maxHeight: 30
  75. , appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  76. center: true,
  77.  
  78. });
  79. OffenseButton = new qx.ui.form.Button("Offence", null).set({
  80. toolTipText: "Only Upgrades Offence"
  81. , width: 63
  82. , height: 30
  83. , maxWidth: 60
  84. , maxHeight: 30
  85. , appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  86. center: true,
  87.  
  88. });
  89. CommandBuildingChoice = new qx.ui.form.Button("Resonly?", null).set({
  90. toolTipText: "Allows only Resource Buildings to upgrade. 1 = Resources only, 0 = All buildings."
  91. , width: 63
  92. , height: 30
  93. , maxWidth: 60
  94. , maxHeight: 30
  95. , appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  96. center: true,
  97.  
  98. });
  99. worldResBuildingChoice = new qx.ui.form.Button("World", null).set({
  100. toolTipText: "not pressed looks at everything as it is, New = harvester hungry, Old = Power plant hungry. However, both options upgrade refineries."
  101. , width: 63
  102. , height: 30
  103. , maxWidth: 60
  104. , maxHeight: 30
  105. , appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  106. center: true,
  107.  
  108. });
  109. PowerBuildingChoice = new qx.ui.form.Button("PP's", null).set({
  110. toolTipText: "P = 0 stops power plants from upgrading, P = 1 allows powers plants to upgrade."
  111. , width: 63
  112. , height: 30
  113. , maxWidth: 60
  114. , maxHeight: 30
  115. , appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  116. center: true,
  117.  
  118. });
  119. HarvBuildingChoice = new qx.ui.form.Button("TibHar", null).set({
  120. toolTipText: "T.H = 0 stops tiberium harvesters from upgrading, T.H = 1 allows tiberium harvesters to upgrade."
  121. , width: 63
  122. , height: 30
  123. , maxWidth: 60
  124. , maxHeight: 30
  125. , appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  126. center: true,
  127.  
  128. });
  129.  
  130. Harv1BuildingChoice = new qx.ui.form.Button("CryHar", null).set({
  131. toolTipText: "C.H = 0 stops crystal harvesters from upgrading, C.H = 1 allows crystal harvesters to upgrade."
  132. , width: 63
  133. , height: 30
  134. , maxWidth: 60
  135. , maxHeight: 30
  136. , appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  137. center: true,
  138.  
  139. });
  140.  
  141. RefBuildingChoice = new qx.ui.form.Button("Ref's", null).set({
  142. toolTipText: "R = 0 stops refineries from upgrading, R = 1 allows refineries to upgrade."
  143. , width: 63
  144. , height: 30
  145. , maxWidth: 60
  146. , maxHeight: 30
  147. , appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  148. center: true,
  149.  
  150. });
  151.  
  152. SiloBuildingChoice = new qx.ui.form.Button("Silo's", null).set({
  153. toolTipText: "S = 0 stops silos from upgrading, S = 1 allows silos to upgrade."
  154. , width: 63
  155. , height: 30
  156. , maxWidth: 60
  157. , maxHeight: 30
  158. , appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  159. center: true,
  160.  
  161. });
  162.  
  163. AccBuildingChoice = new qx.ui.form.Button("Acc's", null).set({
  164. toolTipText: "A = 0 stops accumulators from upgrading, A = 1 allows accumulators to upgrade."
  165. , width: 63
  166. , height: 30
  167. , maxWidth: 60
  168. , maxHeight: 30
  169. , appearance: ("button-text-small"), //"button-standard-"+factionText), button-playarea-mode-red-frame
  170. center: true,
  171.  
  172. });
  173.  
  174. button = new qx.ui.form.Button("DB.aUp");
  175. button1 = new qx.ui.form.Button("Options");
  176. popup = new qx.ui.popup.Popup(new qx.ui.layout.Grid(5)).set({
  177. width: 120
  178. , height: 30
  179. , allowGrowY: false
  180. , allowGrowX: false
  181. , padding: 5
  182. , position: "top-right"
  183. //appearance: ("button-text-small")
  184.  
  185. });
  186. popup1 = new qx.ui.popup.Popup(new qx.ui.layout.Grid(5)).set({
  187. width: 120
  188. , height: 30
  189. , allowGrowY: false
  190. , allowGrowX: false
  191. , padding: 5
  192. , position: "top-right"
  193. //appearance: ("button-text-small")
  194.  
  195. });
  196.  
  197.  
  198.  
  199.  
  200. BuildingsButton.addListener("click", function (e) {
  201. if (window.FlunikTools.Main.getInstance().autoUpdateHandle != null) {
  202. window.FlunikTools.Main.getInstance().BstopAutoUpdate();
  203. BuildingsButton.setLabel("B.OFF");
  204. //alert("Stopped auto-update");
  205.  
  206. } else {
  207. window.FlunikTools.Main.getInstance().BuildingstartAutoUpdate();
  208. BuildingsButton.setLabel("B.ON");
  209.  
  210. }
  211. }, this);
  212. DefenseButton.addListener("click", function (e) {
  213. if (window.FlunikTools.Main.getInstance().autoUpdateHandle != null) {
  214. window.FlunikTools.Main.getInstance().DstopAutoUpdate();
  215. DefenseButton.setLabel("D.OFF");
  216. //alert("Stopped auto-update");
  217. } else {
  218. window.FlunikTools.Main.getInstance().DefensestartAutoUpdate();
  219. DefenseButton.setLabel("D.ON");
  220. }
  221. }, this);
  222. OffenseButton.addListener("click", function (e) {
  223. if (window.FlunikTools.Main.getInstance().autoUpdateHandle != null) {
  224. window.FlunikTools.Main.getInstance().OstopAutoUpdate();
  225. OffenseButton.setLabel("O.OFF");
  226. //alert("Stopped auto-update");
  227. } else {
  228. window.FlunikTools.Main.getInstance().OffensestartAutoUpdate();
  229. OffenseButton.setLabel("O.ON");
  230. }
  231. }, this);
  232. CommandBuildingChoice.addListener("click", function (e) {
  233. var _this = window.FlunikTools.Main.getInstance();
  234. if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
  235. window.FlunikTools.Main.getInstance().OffFunction();
  236. CommandBuildingChoice.setLabel("R = 0");
  237. //BuildingsButton.setLabel("B.Hold");
  238. _this.x = 0;
  239. console.log(_this.x + " normal mode");
  240. //alert("Stopped auto-update");
  241. } else {
  242. window.FlunikTools.Main.getInstance().OnFunction();
  243. CommandBuildingChoice.setLabel("R = 1");
  244. //BuildingsButton.setLabel("B.Hold");
  245. //alert("Stop auto-update to return value to 0");
  246. _this.x = 1;
  247. console.log(_this.x + " ResOnly mode");
  248. }
  249. }, this);
  250. worldResBuildingChoice.addListener("click", function (e) {
  251. var _this = window.FlunikTools.Main.getInstance();
  252. if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
  253. window.FlunikTools.Main.getInstance().OffFunction();
  254. worldResBuildingChoice.setLabel("New");
  255. //BuildingsButton.setLabel("B.Hold");
  256. _this.y = 1;
  257. _this.z = 0.293;
  258. _this.g = 0;
  259. console.log("_this.y " + _this.y + " _this.z " + _this.z + " new world mode" + "_this.g" + _this.g + "tibcost");
  260. //alert("Stopped auto-update");
  261. } else {
  262. window.FlunikTools.Main.getInstance().OnFunction();
  263. worldResBuildingChoice.setLabel("Old");
  264. //BuildingsButton.setLabel("B.Hold");
  265. //alert("Stop auto-update to return value to 0");
  266. _this.y = 0.293;
  267. _this.z = 1;
  268. _this.g = 1;
  269. console.log("_this.y " + _this.y + " _this.z " + _this.z + " old world mode" + "_this.g" + _this.g + "powcost");
  270. }
  271. }, this);
  272. PowerBuildingChoice.addListener("click", function (e) {
  273. var _this = window.FlunikTools.Main.getInstance();
  274. if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
  275. window.FlunikTools.Main.getInstance().OffFunction();
  276. PowerBuildingChoice.setLabel("P = 0");
  277. //BuildingsButton.setLabel("B.Hold");
  278. _this.p = 0;
  279. console.log(_this.p + " Power off mode");
  280. //alert("Stopped auto-update");
  281. } else {
  282. window.FlunikTools.Main.getInstance().OnFunction();
  283. PowerBuildingChoice.setLabel("P = 1");
  284. //BuildingsButton.setLabel("B.Hold");
  285. //alert("Stop auto-update to return value to 0");
  286. _this.p = 1;
  287. console.log(_this.p + " Power On mode");
  288. }
  289. }, this);
  290. HarvBuildingChoice.addListener("click", function (e) {
  291. var _this = window.FlunikTools.Main.getInstance();
  292. if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
  293. window.FlunikTools.Main.getInstance().OffFunction();
  294. HarvBuildingChoice.setLabel("T.H = 0");
  295. //BuildingsButton.setLabel("B.Hold");
  296. _this.h = 0;
  297. console.log(_this.h + " Green Harvester off mode");
  298. //alert("Stopped auto-update");
  299. } else {
  300. window.FlunikTools.Main.getInstance().OnFunction();
  301. HarvBuildingChoice.setLabel("T.H = 1");
  302. //BuildingsButton.setLabel("B.Hold");
  303. //alert("Stop auto-update to return value to 0");
  304. _this.h = 1;
  305. console.log(_this.h + " Green Harvester On mode");
  306. }
  307. }, this);
  308. Harv1BuildingChoice.addListener("click", function (e) {
  309. var _this = window.FlunikTools.Main.getInstance();
  310. if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
  311. window.FlunikTools.Main.getInstance().OffFunction();
  312. Harv1BuildingChoice.setLabel("C.H = 0");
  313. //BuildingsButton.setLabel("B.Hold");
  314. _this.h1 = 0;
  315. console.log(_this.h1 + " Blue Harvester off mode");
  316. //alert("Stopped auto-update");
  317. } else {
  318. window.FlunikTools.Main.getInstance().OnFunction();
  319. Harv1BuildingChoice.setLabel("C.H = 1");
  320. //BuildingsButton.setLabel("B.Hold");
  321. //alert("Stop auto-update to return value to 0");
  322. _this.h1 = 1;
  323. console.log(_this.h1 + " Blue Harvester On mode");
  324. }
  325. }, this);
  326. RefBuildingChoice.addListener("click", function (e) {
  327. var _this = window.FlunikTools.Main.getInstance();
  328. if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
  329. window.FlunikTools.Main.getInstance().OffFunction();
  330. RefBuildingChoice.setLabel("R = 0");
  331. //BuildingsButton.setLabel("B.Hold");
  332. _this.r = 0;
  333. console.log(_this.r + " Refinery off mode");
  334. //alert("Stopped auto-update");
  335. } else {
  336. window.FlunikTools.Main.getInstance().OnFunction();
  337. RefBuildingChoice.setLabel("R = 1");
  338. //BuildingsButton.setLabel("B.Hold");
  339. //alert("Stop auto-update to return value to 0");
  340. _this.r = 1;
  341. console.log(_this.r + " Refinery On mode");
  342. }
  343. }, this);
  344. SiloBuildingChoice.addListener("click", function (e) {
  345. var _this = window.FlunikTools.Main.getInstance();
  346. if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
  347. window.FlunikTools.Main.getInstance().OffFunction();
  348. SiloBuildingChoice.setLabel("S = 0");
  349. //BuildingsButton.setLabel("B.Hold");
  350. _this.s = 0;
  351. console.log(_this.s + " Silo off mode");
  352. //alert("Stopped auto-update");
  353. } else {
  354. window.FlunikTools.Main.getInstance().OnFunction();
  355. SiloBuildingChoice.setLabel("S = 1");
  356. //BuildingsButton.setLabel("B.Hold");
  357. //alert("Stop auto-update to return value to 0");
  358. _this.s = 1;
  359. console.log(_this.s + " Silo On mode");
  360. }
  361. }, this);
  362. AccBuildingChoice.addListener("click", function (e) {
  363. var _this = window.FlunikTools.Main.getInstance();
  364. if (window.FlunikTools.Main.getInstance().AautoUpdateHandle != null) {
  365. window.FlunikTools.Main.getInstance().OffFunction();
  366. AccBuildingChoice.setLabel("A = 0");
  367. //BuildingsButton.setLabel("B.Hold");
  368. _this.a = 0;
  369. console.log(_this.a + " Accumulator off mode");
  370. //alert("Stopped auto-update");
  371. } else {
  372. window.FlunikTools.Main.getInstance().OnFunction();
  373. AccBuildingChoice.setLabel("A = 1");
  374. //BuildingsButton.setLabel("B.Hold");
  375. //alert("Stop auto-update to return value to 0");
  376. _this.a = 1;
  377. console.log(_this.a + " Accumulator On mode");
  378. }
  379. }, this);
  380.  
  381. /*AutoUpdateButton.addListener("click", function (e) {
  382. if (window.FlunikTools.Main.getInstance().autoUpdateHandle != null) {
  383. AutoUpdateButton.setLabel("F.OFF");
  384. //window.FlunikTools.Main.getInstance().stopAutoUpdate();
  385. BuildingsButton.setLabel("F.OFF");
  386. window.FlunikTools.Main.getInstance().BstopAutoUpdate();
  387. DefenseButton.setLabel("F.OFF");
  388. window.FlunikTools.Main.getInstance().DstopAutoUpdate();
  389. OffenseButton.setLabel("F.OFF");
  390. window.FlunikTools.Main.getInstance().OstopAutoUpdate();
  391. //alert("Stopped auto-update");
  392. } else {
  393. //window.FlunikTools.Main.getInstance().startAutoUpdate("Construction Yard, Command Center, Defense HQ, Defense Facility, Barracks, Factory, Airfield, Accumulator, Silo, Refinery, Power Plant, Harvester, Blade of Kane, Eye of Kane, Fist of Kane, Falcon Support, Ion Cannon Support, Skystrike Support, War Factory, Hand of Nod, Airport");
  394. AutoUpdateButton.setLabel("F.ON");
  395. window.FlunikTools.Main.getInstance().BuildingstartAutoUpdate();
  396. BuildingsButton.setLabel("F.ON");
  397. window.FlunikTools.Main.getInstance().DefensestartAutoUpdate();
  398. DefenseButton.setLabel("F.ON");
  399. window.FlunikTools.Main.getInstance().OffensestartAutoUpdate();
  400. OffenseButton.setLabel("F.ON");
  401. }
  402. }, this);*/
  403.  
  404. //popup.add(new qx.ui.basic.Atom(null, null));//new qx.ui.basic.Atom("Hello World #1", "button-text-small")
  405.  
  406. //popup.add(AutoUpdateButton, {row: 0, column: 0});
  407. popup.add(button1, {
  408. row: 1
  409. , column: 3
  410. });
  411. popup.add(worldResBuildingChoice, {
  412. row: 1
  413. , column: 1
  414. });
  415. popup.add(CommandBuildingChoice, {
  416. row: 1
  417. , column: 2
  418. });
  419. popup.add(BuildingsButton, {
  420. row: 0
  421. , column: 1
  422. });
  423. popup.add(DefenseButton, {
  424. row: 0
  425. , column: 2
  426. });
  427. popup.add(OffenseButton, {
  428. row: 0
  429. , column: 3
  430. });
  431. popup1.add(PowerBuildingChoice, {
  432. row: 0
  433. , column: 0
  434. });
  435. popup1.add(RefBuildingChoice, {
  436. row: 0
  437. , column: 1
  438. });
  439. popup1.add(HarvBuildingChoice, {
  440. row: 0
  441. , column: 2
  442. });
  443. popup1.add(Harv1BuildingChoice, {
  444. row: 0
  445. , column: 3
  446. });
  447. popup1.add(SiloBuildingChoice, {
  448. row: 0
  449. , column: 4
  450. });
  451. popup1.add(AccBuildingChoice, {
  452. row: 0
  453. , column: 5
  454. });
  455. button.addListener("click", function (e) {
  456. popup.placeToMouse(e);
  457. popup.show();
  458. }, this);
  459. button1.addListener("click", function (e) {
  460. popup1.placeToMouse(e);
  461. popup1.show();
  462. }, this);
  463.  
  464.  
  465. var app = qx.core.Init.getApplication();
  466.  
  467. /*app.getDesktop().add(BuildingsButton, {
  468. left : 0
  469. });
  470. app.getDesktop().add(DefenseButton, {
  471. left : 60
  472. });
  473. app.getDesktop().add(OffenseButton, {
  474. left : 120
  475. });
  476. app.getDesktop().add(AutoUpdateButton, {
  477. left : 180
  478. }); */
  479. app.getDesktop().add(button, {
  480. right: 128
  481. , top: 3
  482. });
  483.  
  484.  
  485.  
  486. },
  487.  
  488.  
  489. // Use
  490. // this.canUpgradeUnit(unit, city)
  491. // instead of
  492. // unit.CanUpgrade()
  493. //Thanks to KRS_L
  494. /*canUpgradeUnit: function (unit, city, placementType) {
  495. var _this = FlunikTools.Main.getInstance();
  496. var nextLevel = unit.get_CurrentLevel() + 1;
  497. var gameDataTech = unit.get_UnitGameData_Obj();
  498. var hasEnoughResources = city.HasEnoughResources(ClientLib.Base.Util.GetTechLevelResourceRequirements_Obj(nextLevel, gameDataTech));
  499. var CanUpgrade;
  500. if(placementType == ClientLib.Base.EPlacementType.Defense){
  501. CanUpgrade = city.GetUnitRecruitedInfoByCoord(ClientLib.Base.EPlacementType.Defense ,unit.get_CoordX() ,unit.get_CoordY()).CanUpgrade;
  502. }
  503. if(placementType == ClientLib.Base.EPlacementType.Offense){
  504. CanUpgrade = city.GetUnitRecruitedInfoByCoord(ClientLib.Base.EPlacementType.Offense ,unit.get_CoordX() ,unit.get_CoordY()).CanUpgrade;
  505. }
  506. if (gameDataTech == null || unit.get_IsDamaged() || city.get_IsLocked() || !hasEnoughResources || CanUpgrade == false) {
  507. return (CanUpgrade);
  508. }
  509. var id = _this.getMainProductionBuildingMdbId(gameDataTech.pt, gameDataTech.f);
  510. var building = city.get_CityBuildingsData().GetBuildingByMDBId(id);
  511. if ((building == null) || (building.get_CurrentDamage() > 0) || CanUpgrade == false) {
  512. return (CanUpgrade);
  513. }
  514. var levelReq = ClientLib.Base.Util.GetUnitLevelRequirements_Obj(nextLevel, gameDataTech);
  515. var reqTechIndexes = _this.getMissingTechIndexesFromTechLevelRequirement(levelReq, true, city);
  516. if ((reqTechIndexes != null) && (reqTechIndexes.length > 0) || CanUpgrade == false) {
  517. return (CanUpgrade);
  518. }
  519. return (CanUpgrade);
  520. },*/
  521. canUpgradeUnit: function (unit, city) {
  522. console.log('Line 531 evaluated');
  523. console.log('FLUNIKTOOLS initialize2');
  524. var _this = FlunikTools.Main.getInstance();
  525. var nextLevel = unit.get_CurrentLevel() + 1;
  526. var gameDataTech = unit.get_UnitGameData_Obj();
  527. var hasEnoughResources = city.HasEnoughResources(ClientLib.Base.Util.GetTechLevelResourceRequirements_Obj(nextLevel, gameDataTech));
  528. if (gameDataTech == null || unit.get_IsDamaged() || city.get_IsLocked() || !hasEnoughResources) {
  529. console.log('Line 536 evaluated. gameDataTech = NULL or hasEnoughResources = 0');
  530. return false;
  531. }
  532. var id = _this.getMainProductionBuildingMdbId(gameDataTech.pt, gameDataTech.f);
  533. var building = city.get_CityBuildingsData().GetBuildingByMDBId(id);
  534. if ((building == null) || (building.get_CurrentDamage() > 0)) {
  535. return false;
  536. }
  537. var levelReq = ClientLib.Base.Util.GetUnitLevelRequirements_Obj(nextLevel, gameDataTech);
  538. var reqTechIndexes = _this.getMissingTechIndexesFromTechLevelRequirement(levelReq, true, city);
  539. if ((reqTechIndexes != null) && (reqTechIndexes.length > 0)) {
  540. return false;
  541. }
  542. return true;
  543. },
  544.  
  545. getMainProductionBuildingMdbId: function (placementType, faction) {
  546. var mdbId = -1;
  547. var techNameId = -1;
  548. if (placementType == 2) {
  549. techNameId = 3;
  550. } else {
  551. techNameId = 4;
  552. }
  553. if (techNameId > 0) {
  554. mdbId = ClientLib.Base.Tech.GetTechIdFromTechNameAndFaction(techNameId, faction);
  555. }
  556. return mdbId;
  557. },
  558.  
  559. getMissingTechIndexesFromTechLevelRequirement: function (levelRequirements, breakAtFirst, city) {
  560. var reqTechIndexes = [];
  561. if (levelRequirements != null && levelRequirements.length > 0) {
  562. for (var lvlIndex = 0;
  563. (lvlIndex < levelRequirements.length); lvlIndex++) {
  564. var lvlReq = levelRequirements[lvlIndex];
  565. var requirementsMet = false;
  566. var amountCounter = lvlReq.Amount;
  567. for (var buildingIndex in city.get_Buildings().d) {
  568. if (city.get_Buildings().d[buildingIndex].get_MdbBuildingId() == lvlReq.RequiredTechId && city.get_Buildings().d[buildingIndex].get_CurrentLevel() >= lvlReq.Level) {
  569. amountCounter--;
  570. if (amountCounter <= 0) {
  571. requirementsMet = true;
  572. break;
  573. }
  574. }
  575. }
  576. if (!requirementsMet) {
  577. requirementsMet = ClientLib.Data.MainData.GetInstance().get_Player().get_PlayerResearch().IsResearchMinLevelAvailable(lvlReq.RequiredTechId, lvlReq.Level);
  578. }
  579. if (!requirementsMet) {
  580. reqTechIndexes.push(lvlIndex);
  581. if (breakAtFirst) {
  582. return reqTechIndexes;
  583. }
  584. }
  585. }
  586. }
  587. return reqTechIndexes;
  588. },
  589.  
  590. // Add the below function to your code and then use
  591. // this.canUpgradeBuilding(building, city)
  592. // instead of
  593. // building.CanUpgrade()
  594. //Thanks to KRS_L
  595.  
  596. canUpgradeBuilding: function (building, city) {
  597. var nextLevel = (building.get_CurrentLevel() + 1);
  598. var gameDataTech = building.get_TechGameData_Obj();
  599. var hasEnoughResources = city.HasEnoughResources(ClientLib.Base.Util.GetTechLevelResourceRequirements_Obj(nextLevel, gameDataTech));
  600. return (!building.get_IsDamaged() && !city.get_IsLocked() && hasEnoughResources);
  601. },
  602.  
  603.  
  604. OnFunction: function () {
  605. this.AautoUpdateHandle = 0;
  606. }
  607. , OffFunction: function () {
  608. this.AautoUpdateHandle = null;
  609. },
  610.  
  611.  
  612. BuildingstartAutoUpdate: function () {
  613.  
  614. //this.buildingsToUpdate = _buildingsToUpdate;
  615. //this.BuildingautoUpgrade();
  616. this.autoUpdateHandle = window.setInterval(this.BuildingautoUpgrade, 2000);
  617. },
  618.  
  619. OffensestartAutoUpdate: function () {
  620.  
  621. //this.buildingsToUpdate = _buildingsToUpdate;
  622. //this.OffenseautoUpgrade();
  623. this.autoUpdateHandle = window.setInterval(this.OffenseautoUpgrade, 2000);
  624. },
  625.  
  626. DefensestartAutoUpdate: function () {
  627.  
  628. //this.buildingsToUpdate = _buildingsToUpdate;
  629. //this.DefenseautoUpgrade();
  630. this.autoUpdateHandle = window.setInterval(this.DefenseautoUpgrade, 1000);
  631. },
  632.  
  633. BstopAutoUpdate: function () {
  634. window.clearInterval(this.autoUpdateHandle);
  635. this.autoUpdateHandle = null;
  636. },
  637.  
  638. DstopAutoUpdate: function () {
  639. window.clearInterval(this.autoUpdateHandle);
  640. this.autoUpdateHandle = null;
  641. },
  642.  
  643. OstopAutoUpdate: function () {
  644. window.clearInterval(this.autoUpdateHandle);
  645. this.autoUpdateHandle = null;
  646. },
  647.  
  648.  
  649. totalRepairTime: function (airRT, vehRT, infRT) {
  650.  
  651.  
  652. if ((airRT > 0) && (vehRT > 0) && (infRT > 0)) {
  653. if ((airRT > vehRT) && (airRT > infRT)) {
  654. var maxRT = airRT;
  655.  
  656. return (maxRT);
  657. }
  658. if ((vehRT > airRT) && (vehRT > infRT)) {
  659. var maxRT = vehRT;
  660.  
  661. return (maxRT);
  662. }
  663. if ((infRT > vehRT) && (infRT > airRT)) {
  664. var maxRT = infRT;
  665.  
  666. return (maxRT);
  667. }
  668.  
  669.  
  670. }
  671.  
  672. if ((airRT < 1) && (vehRT > 0) && (infRT > 0)) {
  673.  
  674. if ((vehRT > infRT)) {
  675. var maxRT = vehRT;
  676.  
  677. return (maxRT);
  678. }
  679. if ((infRT > vehRT)) {
  680. var maxRT = infRT;
  681.  
  682. return (maxRT);
  683. }
  684. }
  685.  
  686. if ((airRT > 0) && (vehRT < 1) && (infRT > 0)) {
  687. if ((airRT > infRT)) {
  688. var maxRT = airRT;
  689.  
  690. return (maxRT);
  691. }
  692.  
  693. if ((infRT > airRT)) {
  694. var maxRT = infRT;
  695.  
  696. return (maxRT);
  697. }
  698. }
  699.  
  700. if ((airRT > 0) && (vehRT > 0) && (infRT < 1)) {
  701. if ((airRT > vehRT)) {
  702. var maxRT = airRT;
  703.  
  704. return (maxRT);
  705. }
  706. if ((vehRT > airRT)) {
  707. var maxRT = vehRT;
  708.  
  709. return (maxRT);
  710. }
  711.  
  712. }
  713.  
  714. /*
  715. if (((airRT !< 1) && (vehRT !< 1 )&& (infRT !< 1))&&(airRT !> 0) && (vehRT !> 0 )&& (infRT !> 0)){
  716. var totalNoRT = 0;
  717. return (totalNoRT);
  718. }
  719. */
  720. if (((airRT < 1) && (vehRT < 1)) && (infRT > 0)) {
  721. var oneWithRT = infRT;
  722. return (oneWithRT);
  723. }
  724.  
  725. if ((vehRT > 0) && ((airRT < 1) && (infRT < 1))) {
  726. var oneWithRT = vehRT;
  727. return (oneWithRT);
  728. }
  729.  
  730. if ((airRT > 0) && ((vehRT < 1) && (infRT < 1))) {
  731. var oneWithRT = airRT;
  732. return (oneWithRT);
  733. } else {
  734. var totalNoRT = 0;
  735. return (totalNoRT);
  736. }
  737.  
  738. }
  739. , Production_Math: function (city, building_Id, Production, Package_Size, Time_To_Get_Package, LinkType0, LinkType1, LinkType2) {
  740.  
  741. if (city != null) {
  742. var Production_Value = city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].TotalValue;
  743. var Package = city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Package_Size].TotalValue;
  744. var Package_Per_Hour = city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Time_To_Get_Package].TotalValue;
  745.  
  746. if (city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].ConnectedLinkTypes.d[LinkType0] != undefined) {
  747. var type0 = city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].ConnectedLinkTypes.d[LinkType0].Value;
  748. } else {
  749. var type0 = 0;
  750. }
  751. if (city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].ConnectedLinkTypes.d[LinkType1] != undefined) {
  752. var type1 = city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].ConnectedLinkTypes.d[LinkType1].Value;
  753. } else {
  754. var type1 = 0;
  755. }
  756. if (city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].ConnectedLinkTypes.d[LinkType2] != undefined) {
  757. var type2 = city.GetBuildingCache(building_Id).DetailViewInfo.OwnProdModifiers.d[Production].ConnectedLinkTypes.d[LinkType2].Value;
  758. } else {
  759. var type2 = 0;
  760. }
  761. var Total_Production = Production_Value + (Package / (Package_Per_Hour / 3600)) + type0 + type1 + type2;
  762.  
  763. return Total_Production;
  764.  
  765. }
  766. },
  767.  
  768. Building_Object: function (city, building, type) {
  769. console.log("Line 781 evaluated. Building_Object Function commencing");
  770. if (city != null && building != null) {
  771. if (type != null) {
  772. var building_obj = {
  773. base_name: city.m_SupportDedicatedBaseName
  774. , building_name: building.get_UnitGameData_Obj().dn
  775. , Ratio: type
  776. , cityid: city.get_Id()
  777. , posX: building.get_CoordX()
  778. , posY: building.get_CoordY()
  779. , isPaid: true
  780. }
  781. } else {
  782. var building_obj = {
  783. base_name: city.m_SupportDedicatedBaseName
  784. , building_name: building.get_UnitGameData_Obj().dn
  785. , cityid: city.get_Id()
  786. , posX: building.get_CoordX()
  787. , posY: building.get_CoordY()
  788. , isPaid: true
  789. }
  790. }
  791. return building_obj;
  792.  
  793. }
  794. },
  795.  
  796.  
  797.  
  798. /*
  799. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  800. The Defense Function
  801. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  802. */
  803. DefenseautoUpgrade: function () {
  804. var _this = window.FlunikTools.Main.getInstance();
  805. var basenum = 0;
  806. for (var nCity in ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities().d) {
  807. basenum++;
  808. var city = ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities().d[nCity];
  809.  
  810. var baseName = city.m_SupportDedicatedBaseName;
  811. var Type = ClientLib.Base.EPlacementType.Defense;
  812.  
  813.  
  814. var baselvl = city.get_LvlBase();
  815. var blvlLow = baselvl + 3;
  816.  
  817.  
  818.  
  819. var defarr = new Array();
  820. var defnum = 0;
  821.  
  822. var units = city.get_CityUnitsData();
  823. var gey;
  824.  
  825. var defenceUnits = units.get_DefenseUnits();
  826. for (var nUnit in defenceUnits.d) {
  827. defnum++
  828. var unit = defenceUnits.d[nUnit];
  829.  
  830. var HQ = city.GetBuildingTypeMaxLvlByTechName(ClientLib.Base.ETechName.Defense_HQ);
  831.  
  832.  
  833. if (!_this.canUpgradeUnit(unit, city)) continue;
  834. var unitlvlup1 = unit.get_CurrentLevel() + 1;
  835. var name = unit.get_UnitGameData_Obj().dn;
  836. var canUpgrade = city.GetUnitRecruitedInfoByCoord(ClientLib.Base.EPlacementType.Defense, unit.get_CoordX(), unit.get_CoordY()).CanUpgrade;
  837. //console.log(city.GetUnitRecruitedInfoByCoord(ClientLib.Base.EPlacementType.Defense ,unit.get_CoordX() ,unit.get_CoordY()).CanUpgrade);
  838. //console.log(!_this.canUpgradeUnit(unit, city));
  839. if (unit.get_CurrentLevel() > 3) {
  840. var unitHealthperCost = _this.GetUnitMaxHealth(unit.get_CurrentLevel(), ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unit.get_MdbUnitId()), false) / (ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(unitlvlup1, unit.get_UnitGameData_Obj())[1].Count);
  841. }
  842. if (unit.get_CurrentLevel() <= 3) {
  843. var unitHealthperCost = Math.pow((_this.GetUnitMaxHealth(unit.get_CurrentLevel(), ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unit.get_MdbUnitId()), false) / (ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(unitlvlup1, unit.get_UnitGameData_Obj())[0].Count)), -1);
  844. }
  845. defarr[defnum] = unitHealthperCost;
  846. defarr.sort(function (a, b) {
  847. return b - a
  848. });
  849. //console.log(defarr[0], defarr[1]);
  850.  
  851. if ((defarr[0] >= defarr[1]) && ((unit.get_CurrentLevel() > 3) && (unit.get_CurrentLevel() <= 4)) && (defarr[1] != undefined)) {
  852.  
  853. //console.log(defarr[0], defarr[1]);
  854. defarr.shift();
  855. }
  856. if ((defarr[0] >= defarr[1]) && (unit.get_CurrentLevel() > 4) && (defarr[1] != undefined)) {
  857. defarr.sort(function (a, b) {
  858. return a - b
  859. });
  860. //console.log(defarr[0], defarr[1]);
  861. defarr.shift();
  862. }
  863.  
  864. if ((defarr[0] >= defarr[1]) && (unit.get_CurrentLevel() <= 3) && (defarr[1] != undefined)) {
  865. defarr.shift();
  866. }
  867.  
  868.  
  869. if (unitHealthperCost == defarr[0]) {
  870. var defunit_obj = {
  871. cityid: city.get_Id()
  872. , basename: city.m_SupportDedicatedBaseName
  873. , Ratio: unitHealthperCost
  874. , unitname: unit.get_UnitGameData_Obj().dn
  875. , level: unit.get_CurrentLevel()
  876. , type: "Defense"
  877. , upgradepossiblity: canUpgrade
  878. , unitId: unit.get_Id()
  879. }
  880. }
  881. /*if(_this.GetUnitMaxHealth(unit.get_CurrentLevel(), ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unit.get_MdbUnitId()), false).toString() !== "NaN"){
  882. console.log(_this.GetUnitMaxHealth(unit.get_CurrentLevel(), ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unit.get_MdbUnitId()), false));
  883. }*/
  884. }
  885. if ((defunit_obj != undefined) && (defunit_obj.Ratio == defarr[0]) && (defunit_obj.level <= (HQ - 1)) && (canUpgrade == defunit_obj.upgradepossiblity)) {
  886. //console.log(units);
  887. console.log(defunit_obj, defarr);
  888. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UnitUpgrade", defunit_obj, null, null, true);
  889. defarr = [];
  890. HQ = [];
  891. break;
  892. }
  893.  
  894. }
  895.  
  896. },
  897.  
  898.  
  899. /*
  900. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  901. The Offense Function
  902. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  903. */
  904.  
  905. OffenseautoUpgrade: function () {
  906. var _this = window.FlunikTools.Main.getInstance();
  907. var basenum = 0;
  908. for (var nCity in ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities().d) {
  909. basenum++;
  910. var city = ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities().d[nCity];
  911. var buildings = city.get_Buildings();
  912. var baseName = city.m_SupportDedicatedBaseName;
  913.  
  914. var Type = ClientLib.Base.EPlacementType.Offense;
  915.  
  916. var baselvl = city.get_LvlBase();
  917. var blvlLow = baselvl + 3;
  918.  
  919.  
  920.  
  921. var offarr = new Array();
  922. var offnum = 0;
  923.  
  924. var units = city.get_CityUnitsData();
  925.  
  926.  
  927. var offenceUnits = units.get_OffenseUnits();
  928. for (var nUnit in offenceUnits.d) {
  929. offnum++
  930. var unit = offenceUnits.d[nUnit];
  931.  
  932. if (!_this.canUpgradeUnit(unit, city)) continue;
  933. var unitlvlup1 = unit.get_CurrentLevel() + 1;
  934. var name = unit.get_UnitGameData_Obj().dn;
  935. if (unit.get_CurrentLevel() > 2) {
  936. var unitHealthperCost = _this.GetUnitMaxHealth(unit.get_CurrentLevel(), ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unit.get_MdbUnitId()), false) / (ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(unitlvlup1, unit.get_UnitGameData_Obj())[1].Count);
  937. }
  938. if (unit.get_CurrentLevel() <= 2) {
  939. var unitHealthperCost = Math.pow((_this.GetUnitMaxHealth(unit.get_CurrentLevel(), ClientLib.Res.ResMain.GetInstance().GetUnit_Obj(unit.get_MdbUnitId()), false) / (ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(unitlvlup1, unit.get_UnitGameData_Obj())[0].Count)), -1);
  940. }
  941. offarr[offnum] = unitHealthperCost;
  942. //What this does is sort the array from highest to lowest, then it dumps the first ratio with the .shift(), and upgrades the next best thing.
  943.  
  944. offarr.sort(function (a, b) {
  945. return b - a
  946. });
  947. //console.log(offarr[0], offarr[1]);
  948.  
  949. if (offarr[0] >= offarr[1] && ((unit.get_CurrentLevel() > 2) && (unit.get_CurrentLevel() <= 3)) && (offarr[1] != undefined)) {
  950.  
  951. offarr.shift();
  952.  
  953. }
  954. if (offarr[0] >= offarr[1] && (unit.get_CurrentLevel() > 3) && (offarr[1] != undefined)) {
  955. offarr.sort(function (a, b) {
  956. return a - b
  957. });
  958. offarr.shift();
  959.  
  960. }
  961. if (offarr[0] >= offarr[1] && (unit.get_CurrentLevel() <= 2) && (offarr[1] != undefined)) {
  962.  
  963. offarr.shift();
  964.  
  965. }
  966. if (unitHealthperCost == offarr[0]) {
  967. var offunit_obj = {
  968. cityid: city.get_Id()
  969. , basename: city.m_SupportDedicatedBaseName
  970. , unitname: unit.get_UnitGameData_Obj().dn
  971. , Ratio: unitHealthperCost
  972. , level: unit.get_CurrentLevel()
  973. , type: "Offense"
  974. , unitId: unit.get_Id()
  975. }
  976. }
  977.  
  978.  
  979.  
  980.  
  981. }
  982.  
  983. //console.log(offarr[1].toString());
  984.  
  985. if ((offunit_obj != undefined) && (offunit_obj.Ratio == offarr[0]) && (offunit_obj.level <= (city.get_CommandCenterLevel() - 1))) {
  986. //console.log(units);
  987.  
  988. console.log(offunit_obj, offarr);
  989. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UnitUpgrade", offunit_obj, null, null, true);
  990. offarr = [];
  991. break;
  992. }
  993.  
  994. }
  995.  
  996. },
  997.  
  998.  
  999. /*
  1000. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1001. The Building Function
  1002. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1003. */
  1004. BuildingautoUpgrade: function () {
  1005. console.log("Line 1015 evaluated. BuildingautoUpgrade function commencing");
  1006. var _this = window.FlunikTools.Main.getInstance();
  1007. var basenum = 0;
  1008. for (var nCity in ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities().d) {
  1009. basenum++;
  1010. var city = ClientLib.Data.MainData.GetInstance().get_Cities().get_AllCities().d[nCity];
  1011. var buildings = city.get_Buildings();
  1012. var baseName = city.m_SupportDedicatedBaseName;
  1013. //console.log(baseName + " x:" + _this.x + "y:" + _this.y + "z:" + _this.z);
  1014. var airRT = city.get_CityUnitsData().GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Aircraft, false);
  1015. var vehRT = city.get_CityUnitsData().GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Vehicle, false);
  1016. var infRT = city.get_CityUnitsData().GetRepairTimeFromEUnitGroup(ClientLib.Data.EUnitGroup.Infantry, false);
  1017. // var maxRT = math.Max(airRT, vehRT, infRT);
  1018.  
  1019. var baselvl = city.get_LvlBase();
  1020. var blvlLow = baselvl + 3;
  1021. var defLvl = city.get_LvlDefense();
  1022. var offLvl = city.get_LvlOffense();
  1023. //var offensehealth = city.get_CityUnitsData().GetTotalOffenseUnitHealth();
  1024. //console.log("repair time: " + _this.totalRepairTime(airRT, vehRT, infRT), infRT);
  1025. var cryMax = city.GetResourceMaxStorage(ClientLib.Base.EResourceType.Crystal);
  1026. var tibMax = city.GetResourceMaxStorage(ClientLib.Base.EResourceType.Tiberium);
  1027. var powMax = city.GetResourceMaxStorage(ClientLib.Base.EResourceType.Power);
  1028.  
  1029. var alliance = ClientLib.Data.MainData.GetInstance().get_Alliance();
  1030. var tiberiumAlly = alliance.GetPOIBonusFromResourceType(ClientLib.Base.EResourceType.Tiberium);
  1031. var tiberiumCont = city.GetResourceGrowPerHour(ClientLib.Base.EResourceType.Tiberium, false, false);
  1032. var tiberiumPac = city.GetResourceBonusGrowPerHour(ClientLib.Base.EResourceType.Tiberium);
  1033.  
  1034. console.log(baseName + " tiberiumCont " + tiberiumCont + " tiberiumPac " + tiberiumPac + " tiberiumCont * _this.y " + tiberiumCont * _this.y + " tiberiumPac * _this.y " + tiberiumPac * _this.y);
  1035. var powerAlly = alliance.GetPOIBonusFromResourceType(ClientLib.Base.EResourceType.Power);
  1036. var powerCont = city.GetResourceGrowPerHour(ClientLib.Base.EResourceType.Power, false, false);
  1037. var powerPac = city.GetResourceBonusGrowPerHour(ClientLib.Base.EResourceType.Power);
  1038.  
  1039. console.log(baseName + " powerCont " + powerCont + " powerPac " + powerPac + " powerCont * _this.z " + powerCont * _this.z + " powerPac * _this.z " + powerPac * _this.z);
  1040. var crystalAlly = alliance.GetPOIBonusFromResourceType(ClientLib.Base.EResourceType.Crystal);
  1041. var crystalCont = city.GetResourceGrowPerHour(ClientLib.Base.EResourceType.Crystal, false, false);
  1042. var crystalPac = city.GetResourceBonusGrowPerHour(ClientLib.Base.EResourceType.Crystal);
  1043.  
  1044. console.log(baseName + " crystalCont " + crystalCont + " crystalPac " + crystalPac + " crystalCont * _this.y " + crystalCont * _this.y + " crystalPac * _this.y " + crystalPac * _this.y);
  1045. var creditCont = ClientLib.Base.Resource.GetResourceGrowPerHour(city.get_CityCreditsProduction(), false);
  1046. var creditPac = ClientLib.Base.Resource.GetResourceBonusGrowPerHour(city.get_CityCreditsProduction(), false);
  1047.  
  1048. //console.log("Offlvl +1 Cost: " + ClientLib.API.Army.GetInstance().GetUpgradeCostsForAllUnitsToLevel(offLvl + 1)[0].Count + "Deflvl +1 Cost: " + ClientLib.API.Defense.GetInstance().GetUpgradeCostsForAllUnitsToLevel(defLvl + 1)[0].Count, "Building lvl +1 Cost: " + ClientLib.API.City.GetInstance().GetUpgradeCostsForAllBuildingsToLevel(blvlLow)[0].Count);
  1049.  
  1050. console.log(baseName + " creditCont " + creditCont + " creditPac " + creditPac + " creditCont * _this.z " + creditCont * _this.z + " creditPac * _this.z " + creditPac * _this.z);
  1051. //console.log(baseName, airRT, vehRT, infRT, _this.totalRepairTime(airRT, vehRT, infRT));
  1052.  
  1053. var refarr = new Array();
  1054. var refnum = 0;
  1055. var powarr = new Array();
  1056. var pownum = 0;
  1057. var hararr = new Array();
  1058. var hararr1 = new Array();
  1059. var harnum = 0;
  1060. var harnum1 = 0;
  1061. var accarr = new Array();
  1062. var accnum = 0;
  1063. var silarr = new Array();
  1064. var silnum = 0;
  1065. var maxarr = [];
  1066.  
  1067. for (var nBuildings in buildings.d) {
  1068. //console.log("Line 1077 evaluated. Upgrade Resource commencing");
  1069. var building = buildings.d[nBuildings];
  1070.  
  1071. if (!_this.canUpgradeBuilding(building, city)) continue;
  1072. var name = building.get_UnitGameData_Obj().dn;
  1073. var buildinglvlup1 = building.get_CurrentLevel() + 1;
  1074. var bulid = building.get_Id();
  1075. var tech = building.get_TechName();
  1076. /*
  1077. **************************************************************************************************************************************************************************************************************************************************************************************************************************************
  1078. Upgrade RT CC CY DHQ DFac and low level resource building Defining
  1079. **************************************************************************************************************************************************************************************************************************************************************************************************************************************
  1080. */
  1081.  
  1082. if ((tech == ClientLib.Base.ETechName.Factory) && ((_this.totalRepairTime(airRT, vehRT, infRT) == vehRT) && (_this.x == 0))) {
  1083. var offRT = building;
  1084. var offRT_obj = {
  1085. cityid: city.get_Id()
  1086. , buildingid: building.get_Id()
  1087. , basename: city.m_SupportDedicatedBaseName
  1088. , building: building.get_UnitGameData_Obj().dn
  1089. , buildTibCost: ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[0].Count
  1090. , buildPowCost: ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[1].Count
  1091. , specal: vehRT
  1092. , posX: building.get_CoordX()
  1093. , posY: building.get_CoordY()
  1094. , isPaid: true
  1095. };
  1096.  
  1097.  
  1098. }
  1099.  
  1100. if ((tech == ClientLib.Base.ETechName.Barracks) && ((_this.totalRepairTime(airRT, vehRT, infRT) == infRT) && (_this.x == 0))) {
  1101. var offRT = building;
  1102. var offRT_obj = {
  1103. cityid: city.get_Id()
  1104. , buildingid: building.get_Id()
  1105. , basename: city.m_SupportDedicatedBaseName
  1106. , building: building.get_UnitGameData_Obj().dn
  1107. , buildTibCost: ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[0].Count
  1108. , buildPowCost: ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[1].Count
  1109. , specal: infRT
  1110. , posX: building.get_CoordX()
  1111. , posY: building.get_CoordY()
  1112. , isPaid: true
  1113. };
  1114.  
  1115. }
  1116.  
  1117. if ((tech == ClientLib.Base.ETechName.Airport) && ((_this.totalRepairTime(airRT, vehRT, infRT) == airRT) && (_this.x == 0))) {
  1118. var offRT = building;
  1119. var offRT_obj = {
  1120. cityid: city.get_Id()
  1121. , buildingid: building.get_Id()
  1122. , basename: city.m_SupportDedicatedBaseName
  1123. , building: building.get_UnitGameData_Obj().dn
  1124. , buildTibCost: ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[0].Count
  1125. , buildPowCost: ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[1].Count
  1126. , specal: airRT
  1127. , posX: building.get_CoordX()
  1128. , posY: building.get_CoordY()
  1129. , isPaid: true
  1130. };
  1131.  
  1132. }
  1133.  
  1134. if ((tech == ClientLib.Base.ETechName.Construction_Yard) && ((building.get_CurrentLevel() < baselvl) && (_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0))) {
  1135. var cbuilding = building;
  1136. //console.log(name);
  1137. var building_obj = {
  1138. cityid: city.get_Id()
  1139. , buildingid: building.get_Id()
  1140. , basename: city.m_SupportDedicatedBaseName
  1141. , buildinglevel: building.get_CurrentLevel()
  1142. , building: building.get_UnitGameData_Obj().dn
  1143. , posX: building.get_CoordX()
  1144. , posY: building.get_CoordY()
  1145. , isPaid: true
  1146. };
  1147.  
  1148. }
  1149.  
  1150. if ((tech == ClientLib.Base.ETechName.Command_Center) && ((building.get_CurrentLevel() <= offLvl) && (_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0))) {
  1151. var cbuilding = building;
  1152. //console.log(name);
  1153. var building_obj = {
  1154. cityid: city.get_Id()
  1155. , buildingid: building.get_Id()
  1156. , basename: city.m_SupportDedicatedBaseName
  1157. , buildinglevel: building.get_CurrentLevel()
  1158. , building: building.get_UnitGameData_Obj().dn
  1159. , posX: building.get_CoordX()
  1160. , posY: building.get_CoordY()
  1161. , isPaid: true
  1162. };
  1163.  
  1164. }
  1165.  
  1166. if ((tech == ClientLib.Base.ETechName.Defense_HQ) && ((building.get_CurrentLevel() <= defLvl) && (_this.x == 0))) {
  1167. var cbuilding = building;
  1168. //console.log(name);
  1169. var building_obj = {
  1170. cityid: city.get_Id()
  1171. , buildingid: building.get_Id()
  1172. , basename: city.m_SupportDedicatedBaseName
  1173. , buildinglevel: building.get_CurrentLevel()
  1174. , building: building.get_UnitGameData_Obj().dn
  1175. , posX: building.get_CoordX()
  1176. , posY: building.get_CoordY()
  1177. , isPaid: true
  1178. };
  1179.  
  1180. }
  1181.  
  1182. if ((tech == ClientLib.Base.ETechName.Defense_Facility) && ((building.get_CurrentLevel() <= defLvl + 3) && (_this.x == 0))) {
  1183. var cbuilding = building;
  1184. //console.log(name);
  1185. var building_obj = {
  1186. cityid: city.get_Id()
  1187. , buildingid: building.get_Id()
  1188. , basename: city.m_SupportDedicatedBaseName
  1189. , buildinglevel: building.get_CurrentLevel()
  1190. , building: building.get_UnitGameData_Obj().dn
  1191. , posX: building.get_CoordX()
  1192. , posY: building.get_CoordY()
  1193. , isPaid: true
  1194. };
  1195.  
  1196. }
  1197.  
  1198. if (((tech == ClientLib.Base.ETechName.Support_Air) || (tech == ClientLib.Base.ETechName.Support_Ion) || (tech == ClientLib.Base.ETechName.Support_Art)) && ((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (building.get_CurrentLevel() <= defLvl + 3) && (_this.x == 0))) {
  1199. var support = building;
  1200. var support_obj = {
  1201. cityid: city.get_Id()
  1202. , buildingid: building.get_Id()
  1203. , basename: city.m_SupportDedicatedBaseName
  1204. , building: building.get_UnitGameData_Obj().dn
  1205. , buildinglevel: building.get_CurrentLevel()
  1206. , posX: building.get_CoordX()
  1207. , posY: building.get_CoordY()
  1208. , isPaid: true
  1209. };
  1210.  
  1211.  
  1212. }
  1213.  
  1214. if (
  1215. (
  1216. (tech == ClientLib.Base.ETechName.Harvester && building.get_CurrentLevel() <= 2) ||
  1217. (tech == ClientLib.Base.ETechName.Refinery && building.get_CurrentLevel() <= 2) ||
  1218. (tech == ClientLib.Base.ETechName.PowerPlant && building.get_CurrentLevel() <= 2) ||
  1219. ((tech == ClientLib.Base.ETechName.Accumulator && building.get_CurrentLevel() <= 2)) ||
  1220. ((tech == ClientLib.Base.ETechName.Silo && building.get_CurrentLevel() <= 2))
  1221. )
  1222.  
  1223.  
  1224.  
  1225.  
  1226. ) {
  1227. var lowres = building;
  1228. var LowResbuilding_obj = {
  1229. cityid: city.get_Id()
  1230. , buildingid: building.get_Id()
  1231. , type: "LowResbuilding"
  1232. , basename: city.m_SupportDedicatedBaseName
  1233. , building: building.get_UnitGameData_Obj().dn
  1234. , buildinglevel: building.get_CurrentLevel()
  1235. , posX: building.get_CoordX()
  1236. , posY: building.get_CoordY()
  1237. , isPaid: true
  1238. };
  1239. //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", building_obj, null, null, true);
  1240.  
  1241. }
  1242. /*if (name == "Refinery" || name == "Power Plant" || name == "Harvester" || name == "Accumulator" || name == "Silo") {
  1243. //if (name == "Silo") {
  1244. var building_obj = {
  1245. cityid: city.get_Id(),
  1246. posX: building.get_CoordX(),
  1247. posY: building.get_CoordY(),
  1248. isPaid: true
  1249. }*/
  1250.  
  1251. /*
  1252. **************************************************************************************************************************************************************************************************************************************************************************************************************************************
  1253. Upgrade Resource Defining
  1254. **************************************************************************************************************************************************************************************************************************************************************************************************************************************
  1255. */
  1256.  
  1257. if ((tech == ClientLib.Base.ETechName.Refinery && building.get_CurrentLevel() > 2) && (_this.r == 1)) {
  1258. var ref = building;
  1259. refnum++;
  1260. //var refObj = Object();CreditsBonusTimeToComplete
  1261. //if(refnum = 0)break;
  1262. //console.log(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[30].ConnectedLinkTypes.d[36].ProvidingToValue, city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[30].ConnectedLinkTypes.d[37].ProvidingToValue );
  1263. //OwnProdModifiers.d[30].ConnectedLinkTypes.d[36].Value OwnProdModifiers.d[30].ConnectedLinkTypes.d[37].Value
  1264.  
  1265. var refPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].TotalValue;
  1266. //var refLinkTypes = (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.PowerplantCreditBonus].Value) + (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.TiberiumCreditProduction].Value);
  1267. var refPac = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsPackageSize].TotalValue;
  1268. var refPacperH = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsBonusTimeToComplete].TotalValue;
  1269. var refCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[_this.g].Count;
  1270. var refLinkTypes0 = 0;
  1271. var refLinkTypes1 = 0;
  1272.  
  1273. if (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].ConnectedLinkTypes.d[36] != undefined) {
  1274. refLinkTypes0 = (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.PowerplantCreditBonus].Value);
  1275. //var refTotalPro = refPro + (refPac/(refPacperH/3600)) + refLinkTypes0 ;
  1276. } else {
  1277. refLinkTypes0 = 0;
  1278. }
  1279.  
  1280. if (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].ConnectedLinkTypes.d[37] != undefined) {
  1281. refLinkTypes1 = (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CreditsProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.TiberiumCreditProduction].Value);
  1282. //var refTotalPro = refPro + (refPac/(refPacperH/3600)) + refLinkTypes0 + refLinkTypes1 ;
  1283. } else {
  1284. refLinkTypes1 = 0;
  1285. }
  1286.  
  1287. var refTotalPro = refPro + (refPac / (refPacperH / 3600)) + refLinkTypes0 + refLinkTypes1;
  1288.  
  1289. var refTotalProOfLevel12 = 605 + (7260 / 6) + 484 + 605;
  1290. var refProRatio = Math.pow(((refTotalProOfLevel12 / 31608) * 100) / ((refTotalPro / refCost) * 100), -1);
  1291. refarr[refnum] = refProRatio;
  1292. // refarr[refid] = Ref;
  1293. if ((refProRatio > 0)) { /* Math.floor((Math.random()*10)+1)){*/
  1294. //console.log(((refTotalProOfLevel12/96000)*100)/((refTotalPro/refCost)*100) );
  1295. refarr.sort(function (a, b) {
  1296. return b - a
  1297. });
  1298.  
  1299.  
  1300. }
  1301. if ((Math.max(refProRatio) == refarr[0])) {
  1302. var Ref_obj = {
  1303. cityid: city.get_Id()
  1304. , basename: city.m_SupportDedicatedBaseName
  1305. , building: building.get_UnitGameData_Obj().dn
  1306. , buildinglevel: building.get_CurrentLevel()
  1307. , posX: building.get_CoordX()
  1308. , posY: building.get_CoordY()
  1309. , isPaid: true
  1310. }
  1311. //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Ref_obj, null, null, true);
  1312.  
  1313. }
  1314.  
  1315. }
  1316. if ((tech == ClientLib.Base.ETechName.PowerPlant) && (building.get_CurrentLevel() > 2) && (_this.p == 1)) {
  1317. var pow = building;
  1318. pownum++;
  1319. //var refObj = Object();CreditsBonusTimeToComplete
  1320.  
  1321. //OwnProdModifiers.d[6].ConnectedLinkTypes.d[29].Value - OwnProdModifiers.d[6].ConnectedLinkTypes.d[38].Value - OwnProdModifiers.d[30].ConnectedLinkTypes.d[42].Value
  1322.  
  1323. var powPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].TotalValue;
  1324. var powPac = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerPackageSize].TotalValue;
  1325. var powPacperH = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerBonusTimeToComplete].TotalValue;
  1326. var powCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[_this.g].Count;
  1327. var powLinkTypes0 = 0;
  1328. var powLinkTypes1 = 0;
  1329. var powLinkTypes2 = 0;
  1330. var powTotalProOfLevel12 = 605 + (7260 / 6) + 570 + 456 + 484;
  1331.  
  1332.  
  1333. if (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[29] != undefined) {
  1334. powLinkTypes0 = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.AccumulatorPowerBonus].Value;
  1335. var powLinkTypes1 = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.CrystalCreditProduction].Value;
  1336. //var powTotalPro = powPro + (powPac/(powPacperH/3600)) + powLinkTypes0 + powLinkTypes1 + powLinkTypes2 ;
  1337. //var powTotalProOfLevel12 = 605 + (7260/6) + 570 + 456 + 484;
  1338. //console.log(powLinkTypes0);
  1339. } else {
  1340. var powLinkTypes0 = 0;
  1341. }
  1342.  
  1343. if (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[38] != undefined) {
  1344. powLinkTypes1 = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.CrystalCreditProduction].Value;
  1345. //var powTotalPro = powPro + (powPac/(powPacperH/3600)) + powLinkTypes0 + powLinkTypes1 + powLinkTypes2 ;
  1346. //var powTotalProOfLevel12 = 605 + (7260/6) + 570 + 456 + 484;
  1347. //console.log(powLinkTypes1);
  1348. } else {
  1349. var powLinkTypes1 = 0;
  1350. }
  1351.  
  1352. if (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[42] != undefined) {
  1353. powLinkTypes2 = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.RefineryPowerBonus].Value;
  1354. //var powTotalPro = powPro + (powPac/(powPacperH/3600)) + powLinkTypes0 + powLinkTypes1 + powLinkTypes2 ;
  1355. //var powTotalProOfLevel12 = 605 + (7260/6) + 570 + 456 + 484;
  1356. //console.log(powLinkTypes2);
  1357. } else {
  1358. var powLinkTypes2 = 0;
  1359. }
  1360.  
  1361.  
  1362. var powTotalPro = powPro + (powPac / (powPacperH / 3600)) + powLinkTypes0 + powLinkTypes1 + powLinkTypes2;
  1363.  
  1364. //var powTotalProOfLevel12 = 605 + (7260/6) + 570 + 456 + 484;
  1365. var powProRatio = Math.pow(((powTotalProOfLevel12 / 164736) * 100) / ((powTotalPro / powCost) * 100), -1);
  1366. powarr[pownum] = powProRatio;
  1367.  
  1368. if ((powProRatio > 0)) { /* Math.floor((Math.random()*10)+1)){*/
  1369. // console.log(((powTotalProOfLevel12/96000)*100)/((powTotalPro/refCost)*100) );
  1370. powarr.sort(function (a, b) {
  1371. return b - a
  1372. });
  1373.  
  1374.  
  1375. }
  1376. if ((Math.max(powProRatio) == powarr[0])) {
  1377. var Pow_obj = {
  1378. cityid: city.get_Id()
  1379. , basename: city.m_SupportDedicatedBaseName
  1380. , building: building.get_UnitGameData_Obj().dn
  1381. , buildinglevel: building.get_CurrentLevel()
  1382. , posX: building.get_CoordX()
  1383. , posY: building.get_CoordY()
  1384. , isPaid: true
  1385. }
  1386. //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Pow_obj, null, null, true);
  1387.  
  1388. }
  1389.  
  1390. }
  1391. if ((tech == ClientLib.Base.ETechName.Harvester && building.get_CurrentLevel() > 2)) {
  1392. var harv = building;
  1393. harnum++;
  1394. harnum1++;
  1395.  
  1396. var hartibLinkTypes = 0;
  1397. var harcryLinkTypes = 0;
  1398. //OwnProdModifiers.d[1].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloTiberiumProduction].Value -
  1399.  
  1400. if ((city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[1, 25, 33]) && (_this.h == 1)) {
  1401. //console.log(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[1,25,33]);&& (powPacGain > tibPacGain)&& (powPacGain > crystalPac)
  1402.  
  1403. var hartibPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].TotalValue;
  1404. //var hartibLinkTypes = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloTiberiumProduction].Value;
  1405. var hartibPac = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumPackageSize].TotalValue;
  1406. var hartibPacperH = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumBonusTimeToComplete].TotalValue;
  1407.  
  1408. if (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloTiberiumProduction] != undefined) {
  1409. hartibLinkTypes = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloTiberiumProduction].Value;
  1410. //var harTibTotalPro = hartibPro + (hartibPac/(hartibPacperH/3600)) + hartibLinkTypes;
  1411. } else {
  1412. hartibLinkTypes = 0;
  1413. }
  1414.  
  1415. var harTibTotalPro = hartibPro + (hartibPac / (hartibPacperH / 3600)) + hartibLinkTypes;
  1416. var harCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[_this.g].Count;
  1417.  
  1418. //var harTibTotalPro = hartibPro + (hartibPac/(hartibPacperH/3600)) ;
  1419. var harTibTotalProOfLevel12 = 570 + (7260 / 6) + 380;
  1420. var harTibProRatio = Math.pow(((harTibTotalProOfLevel12 / 95040) * 100) / ((harTibTotalPro / harCost) * 100), -1);
  1421.  
  1422.  
  1423.  
  1424. hararr[harnum] = harTibProRatio;
  1425.  
  1426.  
  1427. if ((harTibProRatio > 0)) { /* Math.floor((Math.random()*10)+1)){*/
  1428. // console.log(((harTibTotalProOfLevel12/72000)*100)/((harTibTotalPro/refCost)*100) );
  1429. hararr.sort(function (a, b) {
  1430. return b - a
  1431. });
  1432. }
  1433.  
  1434.  
  1435.  
  1436. if ((Math.max(harTibProRatio) == hararr[0])) {
  1437. var Har_obj = {
  1438. cityid: city.get_Id()
  1439. , basename: city.m_SupportDedicatedBaseName
  1440. , building: building.get_UnitGameData_Obj().dn
  1441. , buildinglevel: building.get_CurrentLevel()
  1442. , type: "Tiberium"
  1443. , posX: building.get_CoordX()
  1444. , posY: building.get_CoordY()
  1445. , isPaid: true
  1446. }
  1447. //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Har_obj, null, null, true);
  1448.  
  1449. }
  1450. }
  1451. if ((city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[4, 26, 34]) && (_this.h1 == 1)) {
  1452. //console.log(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[4,26,34]);
  1453.  
  1454. //var refObj = Object();CreditsBonusTimeToComplete
  1455.  
  1456. //Production_Value = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].TotalValue;
  1457. //Package = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalPackageSize].TotalValue;
  1458. //Package_Per_Hour = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalBonusTimeToComplete].TotalValue;
  1459. //Production = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction];
  1460. //LinkType0 = Prodution.ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloCrystalProduction].Value;
  1461. //LinkType1 = ;
  1462. //LinkType2 = ;
  1463.  
  1464.  
  1465.  
  1466. var harcryPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].TotalValue;
  1467. //var harcryLinkTypes = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloCrystalProduction].Value;
  1468. var harcryPac = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalPackageSize].TotalValue;
  1469. var harcryPacperH = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalBonusTimeToComplete].TotalValue;
  1470.  
  1471. var harCryCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[_this.g].Count;
  1472.  
  1473. if (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloCrystalProduction] != undefined) {
  1474. harcryLinkTypes = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.SiloCrystalProduction].Value;
  1475. //var harCryTotalPro = harcryPro + (harcryPac/(harcryPacperH/3600)) + harcryLinkTypes;
  1476. } else {
  1477. var harcryLinkTypes = 0;
  1478. }
  1479.  
  1480. var harCryTotalPro = harcryPro + (harcryPac / (harcryPacperH / 3600)) + harcryLinkTypes;
  1481. var harCryTotalProOfLevel12 = 570 + (7260 / 6) + 380;
  1482. var harCryProRatio = Math.pow(((harCryTotalProOfLevel12 / 95040) * 100) / ((harCryTotalPro / harCryCost) * 100), -1);
  1483.  
  1484.  
  1485. hararr1[harnum1] = harCryProRatio;
  1486.  
  1487. if (harCryProRatio > 0) { // Math.floor((Math.random()*10)+1)){
  1488. //console.log(((harCryTotalProOfLevel12/96000)*100)/((harCryTotalPro/harCryCost)*100) );
  1489.  
  1490. hararr1.sort(function (a, b) {
  1491. return b - a
  1492. });
  1493.  
  1494.  
  1495. }
  1496. if ((Math.max(harCryProRatio) == hararr1[0])) {
  1497. var Har1_obj = {
  1498. cityid: city.get_Id()
  1499. , basename: city.m_SupportDedicatedBaseName
  1500. , building: building.get_UnitGameData_Obj().dn
  1501. , buildinglevel: building.get_CurrentLevel()
  1502. , type: "Crystal"
  1503. , posX: building.get_CoordX()
  1504. , posY: building.get_CoordY()
  1505. , isPaid: true
  1506. }
  1507. //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Har1_obj, null, null, true);
  1508.  
  1509. }
  1510.  
  1511. }
  1512.  
  1513. }
  1514. if ((tech == ClientLib.Base.ETechName.Accumulator) && (building.get_CurrentLevel() > 2) && (_this.a == 1)) {
  1515. var acc = building;
  1516. accnum++;
  1517. console.log("accnum = " + accnum);
  1518. //var refObj = Object();CreditsBonusTimeToComplete
  1519.  
  1520. var accLinkTypes = 0;
  1521. //OwnProdModifiers.d[6].ConnectedLinkTypes.d[41].Value
  1522.  
  1523. var accPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].TotalValue;
  1524. //var accLinkTypes = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.PowerPlantAccumulatorBonus].Value;
  1525. var accSto = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerStorage].TotalValue;
  1526. var accCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[_this.g].Count;
  1527. //var accTotalPro = accPro ;
  1528.  
  1529. if (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.PowerPlantAccumulatorBonus] != undefined) {
  1530. var accLinkTypes = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.PowerProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.PowerPlantAccumulatorBonus].Value;
  1531. //var accTotalPro = accLinkTypes;
  1532. } else {
  1533. accLinkTypes = 0;
  1534. }
  1535. var accTotalPro = accLinkTypes;
  1536. var accTotalProOfLevel12 = 456;
  1537. var accProRatio = Math.pow(((accTotalProOfLevel12 / 63360) * 100) / ((accTotalPro / accCost) * 100), -1);
  1538. accarr[accnum] = accProRatio;
  1539.  
  1540. if ((accProRatio > 0)) { /* Math.floor((Math.random()*10)+1)){*/
  1541. console.log(((accTotalProOfLevel12 / 36360) * 100) / ((accTotalPro / accCost) * 100));
  1542. accarr.sort(function (a, b) {
  1543. return b - a
  1544. });
  1545.  
  1546.  
  1547. }
  1548. if ((Math.max(accProRatio) == accarr[0])) {
  1549. var Acc_obj = {
  1550. cityid: city.get_Id()
  1551. , basename: city.m_SupportDedicatedBaseName
  1552. , building: building.get_UnitGameData_Obj().dn
  1553. , buildinglevel: building.get_CurrentLevel()
  1554. , posX: building.get_CoordX()
  1555. , posY: building.get_CoordY()
  1556. , isPaid: true
  1557. }
  1558. //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Acc_obj, null, null, true);
  1559.  
  1560. }
  1561. }
  1562. if ((tech == ClientLib.Base.ETechName.Silo) && (building.get_CurrentLevel() > 2) && (_this.s == 1)) {
  1563. var silo = building;
  1564. silnum++;
  1565. // console.log(city.GetBuildingCache(bulid).DetailViewInfo);
  1566. //OwnProdModifiers.d[1].ConnectedLinkTypes.d[39].Value - OwnProdModifiers.d[4].ConnectedLinkTypes.d[40].Value
  1567. //console.log(city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d);
  1568. var silCryLinkType = 0;
  1569. var silTibLinkType = 0;
  1570. var silTotalPro = 0;
  1571. var silCryPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].TotalValue;
  1572. //var silCryLinkType = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.HarvesterCrystalProduction].Value;
  1573. var silTibPro = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].TotalValue;
  1574. //var silTibLinkType = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.HarvesterTiberiumProduction].Value;
  1575. var silCrySto = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalStorage].TotalValue;
  1576. var silTibSto = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumStorage].TotalValue;
  1577. var silCost = ClientLib.Base.Util.GetUnitLevelResourceRequirements_Obj(buildinglvlup1, building.get_UnitGameData_Obj())[_this.g].Count;
  1578.  
  1579. if (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.HarvesterCrystalProduction] == undefined) {
  1580.  
  1581. silCryLinkType = 0;
  1582. } else {
  1583. silCryLinkType = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.CrystalProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.HarvesterCrystalProduction].Value;
  1584. //silTotalPro = silCryLinkType + silTibLinkType;
  1585. }
  1586.  
  1587. if (city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.HarvesterTiberiumProduction] == undefined) {
  1588.  
  1589. silTibLinkType = 0;
  1590. } else {
  1591. silTibLinkType = city.GetBuildingCache(bulid).DetailViewInfo.OwnProdModifiers.d[ClientLib.Base.EModifierType.TiberiumProduction].ConnectedLinkTypes.d[ClientLib.Base.ELinkType.HarvesterTiberiumProduction].Value;
  1592. //silTotalPro = silCryLinkType + silTibLinkType;
  1593. }
  1594.  
  1595.  
  1596. silTotalPro = silCryLinkType + silTibLinkType;
  1597. var silTotalProOfLevel12 = 380 + 380;
  1598. var silProRatio = Math.pow(((silTotalProOfLevel12 / 63360) * 100) / ((silTotalPro / silCost) * 100), -1);
  1599.  
  1600.  
  1601. silarr[silnum] = silProRatio;
  1602.  
  1603. if ((silProRatio >= 0)) { // Math.floor((Math.random()*10)+1)){
  1604. //console.log(((accTotalProOfLevel12/36360)*100)/((accTotalPro/accCost)*100) );
  1605. silarr.sort(function (a, b) {
  1606. return b - a
  1607. });
  1608.  
  1609.  
  1610. }
  1611. if ((Math.max(silProRatio) == silarr[0])) {
  1612. var Sil_obj = {
  1613. cityid: city.get_Id()
  1614. , basename: city.m_SupportDedicatedBaseName
  1615. , building: building.get_UnitGameData_Obj().dn
  1616. , buildinglevel: building.get_CurrentLevel()
  1617. , posX: building.get_CoordX()
  1618. , posY: building.get_CoordY()
  1619. , isPaid: true
  1620. }
  1621. //ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Sil_obj, null, null, true);
  1622.  
  1623. }
  1624. //silCryLinkType = 0;
  1625. //silTibLinkType = 0;
  1626. //silTotalPro = 0;
  1627. }
  1628. //if((Ref_obj.toString() != "undefined" || Pow_obj.toString() != "undefined" || Har_obj.toString() != "undefined" || Har1_obj.toString() != "undefined" || Acc_obj.toString() != "undefined" || Sil_obj.toString() != "undefined")&&
  1629. // (refarr.toString() != "[]" || powarr.toString() != "[]" || hararr.toString() != "[]" || hararr1.toString() != "[]" || accarr.toString() != "[]" || silarr.toString() != "[]")){
  1630.  
  1631.  
  1632. // }
  1633. //}
  1634.  
  1635.  
  1636. }
  1637.  
  1638. /* ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1639. if( (Ref_obj != undefined) || (Pow_obj != undefined) || (Har_obj != undefined) || (Har1_obj != undefined) || (Acc_obj != undefined) || (Sil_obj != undefined)){
  1640. console.log(Ref_obj, refarr);console.log(Pow_obj, powarr);console.log(Har_obj, hararr); console.log(Har1_obj, hararr1);console.log(Acc_obj, accarr);console.log(Sil_obj, silarr);
  1641. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Sil_obj, null, null, true);
  1642. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Acc_obj, null, null, true);
  1643. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Har1_obj, null, null, true);
  1644. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Har_obj, null, null, true);
  1645. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Pow_obj, null, null, true);
  1646. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Ref_obj, null, null, true);
  1647. }
  1648. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1649. */
  1650. /*
  1651. **************************************************************************************************************************************************************************************************************************************************************************************************************************************
  1652. Upgrade decisions
  1653. **************************************************************************************************************************************************************************************************************************************************************************************************************************************
  1654. */ // console.log(baseName,refnum,pownum);
  1655. maxarr = [refarr[0], powarr[0], hararr[0], hararr1[0], accarr[0], silarr[0]];
  1656. maxarr.sort(function (a, b) {
  1657. return b - a
  1658. });
  1659. // /*
  1660. if ((offRT_obj != undefined) && (_this.x == 0)) {
  1661.  
  1662. console.log(offRT_obj, _this.x);
  1663. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", offRT_obj, null, null, true);
  1664. offRT_obj = {};
  1665. break;
  1666. }
  1667.  
  1668. // */
  1669. // /*
  1670. if ((building_obj != undefined) && (_this.x == 0)) {
  1671.  
  1672. console.log(building_obj, _this.x);
  1673. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", building_obj, null, null, true);
  1674. building_obj = {};
  1675. break;
  1676.  
  1677.  
  1678. }
  1679. // */
  1680.  
  1681. if ((LowResbuilding_obj != undefined)) {
  1682. console.log(LowResbuilding_obj, _this.x);
  1683. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", LowResbuilding_obj, null, null, true);
  1684. LowResbuilding_obj = {};
  1685. break;
  1686. }
  1687. // /*
  1688. if ((support_obj != undefined) && (_this.x == 0)) {
  1689.  
  1690. console.log(support_obj, _this.x);
  1691. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", support_obj, null, null, true);
  1692. support_obj = {};
  1693.  
  1694. break;
  1695.  
  1696.  
  1697.  
  1698. }
  1699. // */
  1700.  
  1701. if ((Ref_obj != undefined) && (refarr.toString() != "") && (maxarr[0] == refarr[0]) && (((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0)) || (_this.x == 1))) { /*(_this.totalRepairTime(airRT, vehRT, infRT) < 14400)||( building.get_CurrentLevel() > 2)*/
  1702. console.log(Ref_obj, refarr, _this.x);
  1703. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Ref_obj, null, null, true);
  1704. Ref_obj = {};
  1705. refarr = [];
  1706. maxarr = [];
  1707. break;
  1708. }
  1709.  
  1710. if ((Pow_obj != undefined) && (powarr.toString() != "") && (maxarr[0] == powarr[0]) && (((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0)) || (_this.x == 1))) { /*(_this.totalRepairTime(airRT, vehRT, infRT) < 14400)||*/
  1711. console.log(Pow_obj, powarr, _this.x);
  1712. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Pow_obj, null, null, true);
  1713. Pow_obj = {};
  1714. powarr = [];
  1715. maxarr = [];
  1716. break;
  1717. }
  1718.  
  1719. if ((Har_obj != undefined) && (hararr.toString() != "") && (maxarr[0] == hararr[0]) && (((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0)) || (_this.x == 1))) { /*(_this.totalRepairTime(airRT, vehRT, infRT) < 14400)||*/
  1720. console.log(Har_obj, hararr, _this.x);
  1721. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Har_obj, null, null, true);
  1722. Har_obj = {};
  1723. hararr = [];
  1724. maxarr = [];
  1725. break;
  1726. }
  1727.  
  1728. if ((Har1_obj != undefined) && (hararr1.toString() != "") && (maxarr[0] == hararr1[0]) && (((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0)) || (_this.x == 1))) { /*(_this.totalRepairTime(airRT, vehRT, infRT) < 14400)||*/
  1729. console.log(Har1_obj, hararr1, _this.x);
  1730. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Har1_obj, null, null, true);
  1731. Har1_obj = {};
  1732. hararr1 = [];
  1733. maxarr = [];
  1734. break;
  1735. }
  1736.  
  1737. if ((Acc_obj != undefined) && (accarr.toString() != "") && (maxarr[0] == accarr[0]) && (((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0)) || (_this.x == 1))) { /*(_this.totalRepairTime(airRT, vehRT, infRT) < 14400)||*/
  1738. console.log(Acc_obj, accarr, _this.x);
  1739. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Acc_obj, null, null, true);
  1740. Acc_obj = {};
  1741. accarr = [];
  1742. maxarr = [];
  1743. break;
  1744. }
  1745.  
  1746. if ((Sil_obj != undefined) && (silarr.toString() != "") && (maxarr[0] == silarr[0]) && (((_this.totalRepairTime(airRT, vehRT, infRT) < 14400) && (_this.x == 0)) || (_this.x == 1))) { /*(_this.totalRepairTime(airRT, vehRT, infRT) < 14400)||*/
  1747. console.log(Sil_obj, silarr, _this.x);
  1748. ClientLib.Net.CommunicationManager.GetInstance().SendCommand("UpgradeBuilding", Sil_obj, null, null, true);
  1749. Sil_obj = {};
  1750. silarr = [];
  1751. maxarr = [];
  1752. break;
  1753. }
  1754. /*
  1755. **************************************************************************************************************************************************************************************************************************************************************************************************************************************
  1756. Upgrade decisions end
  1757. **************************************************************************************************************************************************************************************************************************************************************************************************************************************
  1758. */
  1759.  
  1760. }
  1761.  
  1762. }
  1763.  
  1764.  
  1765. }
  1766. });
  1767. }
  1768. } catch (e) {
  1769. console.log("createFlunikTools: ", e);
  1770. }
  1771.  
  1772. function FlunikTools_checkIfLoaded() {
  1773. try {
  1774. if (typeof qx != 'undefined' && qx.core.Init.getApplication() && qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_NAVIGATION) && qx.core.Init.getApplication().getUIItem(ClientLib.Data.Missions.PATH.BAR_NAVIGATION).isVisible()) {
  1775. createFlunikTools();
  1776. if (typeof ClientLib.API.Util.GetUnitMaxHealth == 'undefined') {
  1777. for (var key in ClientLib.Base.Util) {
  1778. var strFunction = ClientLib.Base.Util[key].toString();
  1779. if ((strFunction.indexOf("function (a,b,c)") == 0 || strFunction.indexOf("function (a,b)") == 0) &&
  1780. strFunction.indexOf("*=1.1") > -1) {
  1781. FlunikTools.Main.getInstance().GetUnitMaxHealth = ClientLib.Base.Util[key];
  1782. console.log("FlunikTools.Main.getInstance().GetUnitMaxHealth = ClientLib.Base.Util[" + key + "]");
  1783. break;
  1784. }
  1785. }
  1786. } else {
  1787. FlunikTools.Main.getInstance().GetUnitMaxHealth = ClientLib.API.Util.GetUnitMaxHealth;
  1788.  
  1789.  
  1790.  
  1791. }
  1792. // ClientLib.Data.CityUnits.prototype.get_OffenseUnits
  1793. strFunction = ClientLib.Data.CityUnits.prototype.HasUnitMdbId.toString();
  1794. var searchString = "for (var b in {d:this.";
  1795. var startPos = strFunction.indexOf(searchString) + searchString.length;
  1796. var fn_name = strFunction.slice(startPos, startPos + 6);
  1797. strFunction = "var $createHelper;return this." + fn_name + ";";
  1798. var fn = Function('', strFunction);
  1799. ClientLib.Data.CityUnits.prototype.get_OffenseUnits = fn;
  1800. console.log("ClientLib.Data.CityUnits.prototype.get_OffenseUnits = function(){var $createHelper;return this." + fn_name + ";}");
  1801.  
  1802. // ClientLib.Data.CityUnits.prototype.get_DefenseUnits
  1803. strFunction = ClientLib.Data.CityUnits.prototype.HasUnitMdbId.toString();
  1804. searchString = "for (var c in {d:this.";
  1805. startPos = strFunction.indexOf(searchString) + searchString.length;
  1806. fn_name = strFunction.slice(startPos, startPos + 6);
  1807. strFunction = "var $createHelper;return this." + fn_name + ";";
  1808. fn = Function('', strFunction);
  1809. ClientLib.Data.CityUnits.prototype.get_DefenseUnits = fn;
  1810. console.log("ClientLib.Data.CityUnits.prototype.get_DefenseUnits = function(){var $createHelper;return this." + fn_name + ";}");
  1811.  
  1812.  
  1813. FlunikTools.Main.getInstance();
  1814. window.FlunikTools.Main.getInstance().initialize();
  1815. } else {
  1816. window.setTimeout(FlunikTools_checkIfLoaded, 1000);
  1817. }
  1818. } catch (e) {
  1819. console.log("FlunikTools_checkIfLoaded: ", e);
  1820. }
  1821. }
  1822. if (/commandandconquer\.com/i.test(document.domain)) {
  1823. window.setTimeout(FlunikTools_checkIfLoaded, 1000);
  1824. }
  1825. }
  1826.  
  1827. try {
  1828. var FlunikScript = document.createElement("script");
  1829. FlunikScript.innerHTML = "(" + FlunikTools_main.toString() + ")();";
  1830. FlunikScript.type = "text/javascript";
  1831. if (/commandandconquer\.com/i.test(document.domain)) {
  1832. document.getElementsByTagName("head")[0].appendChild(FlunikScript);
  1833. }
  1834. } catch (e) {
  1835. console.log("FlunikTools: init error: ", e);
  1836. }
  1837. })();