Advertisement
Guest User

Maelstrom ADDON Basescanner + growthrate + forgotten attacks

a guest
Jan 30th, 2015
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 126.52 KB | None | 0 0
  1. // ==UserScript==
  2. // @name Maelstrom ADDON Basescanner + cncoptplus growth rate + forgotten attacks
  3. // @namespace http*://prodgame*.alliances.commandandconquer.com/*/index.aspx*
  4. // @description Maelstrom ADDON Basescanner
  5. // @include http*://prodgame*.alliances.commandandconquer.com/*/index.aspx*
  6. // @include http*://chertosha.com/*
  7. // @version 1.8.4+
  8. // @author BlinDManX + chertosha
  9. // @grant none
  10. // @copyright 2012+, Claus Neumann
  11. // @license CC BY-NC-ND 3.0 - http://creativecommons.org/licenses/by-nc-nd/3.0/
  12. // @downloadURL https://chertosha.com/maelstrombasescanplus.js
  13. // ==/UserScript==
  14. (function () {
  15. var MaelstromTools_Basescanner = function () {
  16. window.__msbs_version = "1.8.4";
  17. function createMaelstromTools_Basescanner() {
  18.  
  19. qx.Class.define("Addons.BaseScannerGUI", {
  20. type : "singleton",
  21. extend : qx.ui.window.Window,
  22. construct : function () {
  23. try {
  24. this.base(arguments);
  25. console.info("Addons.BaseScannerGUI " + window.__msbs_version);
  26. this.T = Addons.Language.getInstance();
  27. this.setWidth(820);
  28. this.setHeight(400);
  29. this.setContentPadding(10);
  30. this.setShowMinimize(true);
  31. this.setShowMaximize(true);
  32. this.setShowClose(true);
  33. this.setResizable(true);
  34. this.setAllowMaximize(true);
  35. this.setAllowMinimize(true);
  36. this.setAllowClose(true);
  37. this.setShowStatusbar(false);
  38. this.setDecorator(null);
  39. this.setPadding(5);
  40. this.setLayout(new qx.ui.layout.VBox(3));
  41. this.stats.src = 'http://goo.gl/DrJ2x'; //1.5
  42.  
  43. this.FI();
  44. this.FH();
  45. this.FD();
  46. if (this.ZE == null) {
  47. this.ZE = [];
  48. }
  49. this.setPadding(0);
  50. this.removeAll();
  51.  
  52. this.add(this.ZF);
  53. this.add(this.ZN);
  54.  
  55. this.add(this.ZP);
  56. this.ZL.setData(this.ZE);
  57.  
  58. } catch (e) {
  59. console.debug("Addons.BaseScannerGUI.construct: ", e);
  60. }
  61. },
  62. members : {
  63. // pictures
  64. stats : document.createElement('img'),
  65. T : null,
  66. ZA : 0,
  67. ZB : null,
  68. ZC : null,
  69. ZD : null,
  70. ZE : null,
  71. ZF : null,
  72. ZG : null,
  73. ZH : false,
  74. ZI : true,
  75. ZJ : null,
  76. ZK : null,
  77. ZL : null,
  78. ZM : null,
  79. ZN : null,
  80. ZO : null,
  81. ZP : null,
  82. ZQ : null,
  83. ZR : [],
  84. ZT : true,
  85. ZU : null,
  86. ZV : null,
  87. ZX : null,
  88. ZY : null,
  89. ZZ : [],
  90. ZS : {},
  91. YZ : null,
  92. YY : null,
  93.  
  94. openWindow : function (title) {
  95. try {
  96. this.setCaption(title);
  97. if (this.isVisible()) {
  98. this.close();
  99. } else {
  100. MT_Cache.updateCityCache();
  101. MT_Cache = window.MaelstromTools.Cache.getInstance();
  102. var cname;
  103. this.ZC.removeAll();
  104. for (cname in MT_Cache.Cities) {
  105. var item = new qx.ui.form.ListItem(cname, null, MT_Cache.Cities[cname].Object);
  106. this.ZC.add(item);
  107. if (Addons.LocalStorage.getserver("Basescanner_LastCityID") == MT_Cache.Cities[cname].Object.get_Id()) {
  108. this.ZC.setSelection([item]);
  109. }
  110. }
  111. this.open();
  112. this.moveTo(100, 100);
  113. }
  114. } catch (e) {
  115. console.log("MaelstromTools.DefaultObject.openWindow: ", e);
  116. }
  117. },
  118. FI : function () {
  119. try {
  120. this.ZL = new qx.ui.table.model.Simple();
  121. this.ZL.setColumns(["ID", "LoadState", this.T.get("City"), this.T.get("Location"), this.T.get("Level"), this.T.get("Tiberium"), this.T.get("Crystal"), this.T.get("Dollar"), this.T.get("Research"), "Crystalfields", "Tiberiumfields", this.T.get("Building state"), this.T.get("Defense state"), this.T.get("CP"), "Growth Rate", "Sum Tib+Cry+Cre", "(Tib+Cry+Cre)/CP", "CY", "DF", this.T.get("base set up at")]);
  122. this.YY = ClientLib.Data.MainData.GetInstance().get_Player();
  123. this.ZN = new qx.ui.table.Table(this.ZL);
  124. this.ZN.setColumnVisibilityButtonVisible(false);
  125. this.ZN.setColumnWidth(0, 0);
  126. this.ZN.setColumnWidth(1, 0);
  127. this.ZN.setColumnWidth(2, Addons.LocalStorage.getserver("Basescanner_ColWidth_2", 120));
  128. this.ZN.setColumnWidth(3, Addons.LocalStorage.getserver("Basescanner_ColWidth_3", 60));
  129. this.ZN.setColumnWidth(4, Addons.LocalStorage.getserver("Basescanner_ColWidth_4", 50));
  130. this.ZN.setColumnWidth(5, Addons.LocalStorage.getserver("Basescanner_ColWidth_5", 60));
  131. this.ZN.setColumnWidth(6, Addons.LocalStorage.getserver("Basescanner_ColWidth_6", 60));
  132. this.ZN.setColumnWidth(7, Addons.LocalStorage.getserver("Basescanner_ColWidth_7", 60));
  133. this.ZN.setColumnWidth(8, Addons.LocalStorage.getserver("Basescanner_ColWidth_8", 60));
  134. this.ZN.setColumnWidth(9, Addons.LocalStorage.getserver("Basescanner_ColWidth_9", 30));
  135. this.ZN.setColumnWidth(10, Addons.LocalStorage.getserver("Basescanner_ColWidth_10", 30));
  136. this.ZN.setColumnWidth(11, Addons.LocalStorage.getserver("Basescanner_ColWidth_11", 50));
  137. this.ZN.setColumnWidth(12, Addons.LocalStorage.getserver("Basescanner_ColWidth_12", 50));
  138. this.ZN.setColumnWidth(13, Addons.LocalStorage.getserver("Basescanner_ColWidth_13", 30));
  139. this.ZN.setColumnWidth(14, Addons.LocalStorage.getserver("Basescanner_ColWidth_14", 60));
  140. this.ZN.setColumnWidth(15, Addons.LocalStorage.getserver("Basescanner_ColWidth_15", 60));
  141. this.ZN.setColumnWidth(16, Addons.LocalStorage.getserver("Basescanner_ColWidth_16", 60));
  142. this.ZN.setColumnWidth(17, Addons.LocalStorage.getserver("Basescanner_ColWidth_17", 50));
  143. this.ZN.setColumnWidth(18, Addons.LocalStorage.getserver("Basescanner_ColWidth_18", 50));
  144. this.ZN.setColumnWidth(19, Addons.LocalStorage.getserver("Basescanner_ColWidth_19", 40));
  145. var c = 0;
  146. var tcm = this.ZN.getTableColumnModel();
  147. for (c = 0; c < this.ZL.getColumnCount(); c++) {
  148. if (c == 0 || c == 1 || c == 11 || c == 12) {
  149. tcm.setColumnVisible(c, Addons.LocalStorage.getserver("Basescanner_Column_" + c, false));
  150. } else {
  151. tcm.setColumnVisible(c, Addons.LocalStorage.getserver("Basescanner_Column_" + c, true));
  152. }
  153. }
  154.  
  155. tcm.setColumnVisible(1, false);
  156. tcm.setHeaderCellRenderer(9, new qx.ui.table.headerrenderer.Icon(MT_Base.images[MaelstromTools.Statics.Crystal]), "Crystalfields");
  157. tcm.setHeaderCellRenderer(10, new qx.ui.table.headerrenderer.Icon(MT_Base.images[MaelstromTools.Statics.Tiberium], "Tiberiumfields"));
  158. tcm.setDataCellRenderer(5, new qx.ui.table.cellrenderer.Replace().set({
  159. ReplaceFunction : this.FA
  160. }));
  161. tcm.setDataCellRenderer(6, new qx.ui.table.cellrenderer.Replace().set({
  162. ReplaceFunction : this.FA
  163. }));
  164. tcm.setDataCellRenderer(7, new qx.ui.table.cellrenderer.Replace().set({
  165. ReplaceFunction : this.FA
  166. }));
  167. tcm.setDataCellRenderer(8, new qx.ui.table.cellrenderer.Replace().set({
  168. ReplaceFunction : this.FA
  169. }));
  170. tcm.setDataCellRenderer(15, new qx.ui.table.cellrenderer.Replace().set({
  171. ReplaceFunction : this.FA
  172. }));
  173. tcm.setDataCellRenderer(16, new qx.ui.table.cellrenderer.Replace().set({
  174. ReplaceFunction : this.FA
  175. }));
  176. tcm.setDataCellRenderer(19, new qx.ui.table.cellrenderer.Boolean());
  177.  
  178. this.ZN.addListener("cellDblclick", function (e) {
  179. Addons.BaseScannerGUI.getInstance().FB(e);
  180. }, this);
  181. tcm.addListener("widthChanged", function (e) {
  182. //console.log(e, e.getData());
  183. var col = e.getData().col;
  184. var width = e.getData().newWidth;
  185. Addons.LocalStorage.setserver("Basescanner_ColWidth_" + col, width);
  186. }, tcm);
  187.  
  188. } catch (e) {
  189. console.debug("Addons.BaseScannerGUI.FI: ", e);
  190. }
  191. },
  192. FB : function (e) {
  193. try {
  194. console.log("e",e.getRow(),this.ZE);
  195. var cityId = this.ZE[e.getRow()][0];
  196. var posData = this.ZE[e.getRow()][3];
  197. /* center screen */
  198. if (posData != null && posData.split(':').length == 2) {
  199. var posX = parseInt(posData.split(':')[0]);
  200. var posY = parseInt(posData.split(':')[1]);
  201. ClientLib.Vis.VisMain.GetInstance().CenterGridPosition(posX, posY);
  202. }
  203. /* and highlight base */
  204. if (cityId && !(this.ZK[4].getValue())) {
  205. //ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentCityId(cityId);
  206. //webfrontend.gui.UtilView.openCityInMainWindow(cityId);
  207. //webfrontend.gui.UtilView.openVisModeInMainWindow(1, cityId, false);
  208. var bk = qx.core.Init.getApplication();
  209. bk.getBackgroundArea().closeCityInfo();
  210. bk.getPlayArea().setView(ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupDefense, cityId, 0, 0);
  211. }
  212.  
  213. var q = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity();
  214. if (q != null)
  215. q.get_CityArmyFormationsManager().set_CurrentTargetBaseId(cityId);
  216.  
  217. } catch (ex) {
  218. console.debug("Addons.BaseScannerGUI FB error: ", ex);
  219. }
  220. },
  221. FN : function (e) {
  222. this.ZG.setLabel(this.T.get("Scan"));
  223. this.ZH = false;
  224. },
  225. CBChanged : function (e) {
  226. this.ZH = false;
  227. },
  228. FA : function (oValue) {
  229. var f = new qx.util.format.NumberFormat();
  230. f.setGroupingUsed(true);
  231. f.setMaximumFractionDigits(3);
  232. if (!isNaN(oValue)) {
  233. if (Math.abs(oValue) < 100000)
  234. oValue = f.format(Math.floor(oValue));
  235. else if (Math.abs(oValue) >= 100000 && Math.abs(oValue) < 1000000)
  236. oValue = f.format(Math.floor(oValue / 100) / 10) + "k";
  237. else if (Math.abs(oValue) >= 1000000 && Math.abs(oValue) < 10000000)
  238. oValue = f.format(Math.floor(oValue / 1000) / 1000) + "M";
  239. else if (Math.abs(oValue) >= 10000000 && Math.abs(oValue) < 100000000)
  240. oValue = f.format(Math.floor(oValue / 10000) / 100) + "M";
  241. else if (Math.abs(oValue) >= 100000000 && Math.abs(oValue) < 1000000000)
  242. oValue = f.format(Math.floor(oValue / 100000) / 10) + "M";
  243. else if (Math.abs(oValue) >= 1000000000 && Math.abs(oValue) < 10000000000)
  244. oValue = f.format(Math.floor(oValue / 1000000) / 1000) + "G";
  245. else if (Math.abs(oValue) >= 10000000000 && Math.abs(oValue) < 100000000000)
  246. oValue = f.format(Math.floor(oValue / 10000000) / 100) + "G";
  247. else if (Math.abs(oValue) >= 100000000000 && Math.abs(oValue) < 1000000000000)
  248. oValue = f.format(Math.floor(oValue / 100000000) / 10) + "G";
  249. else if (Math.abs(oValue) >= 1000000000000 && Math.abs(oValue) < 10000000000000)
  250. oValue = f.format(Math.floor(oValue / 1000000000) / 1000) + "T";
  251. else if (Math.abs(oValue) >= 10000000000000 && Math.abs(oValue) < 100000000000000)
  252. oValue = f.format(Math.floor(oValue / 10000000000) / 100) + "T";
  253. else if (Math.abs(oValue) >= 100000000000000 && Math.abs(oValue) < 1000000000000000)
  254. oValue = f.format(Math.floor(oValue / 100000000000) / 10) + "T";
  255. else if (Math.abs(oValue) >= 1000000000000000)
  256. oValue = f.format(Math.floor(oValue / 1000000000000)) + "T";
  257. };
  258. return oValue.toString();
  259. },
  260. // updateCache : function () {
  261. // try {}
  262. // catch (e) {
  263. // console.debug("Addons.BaseScannerGUI.updateCache: ", e);
  264. // }
  265. // },
  266. // setWidgetLabels : function () {
  267. // try {
  268. // if (!this.ZL) {
  269. // this.FC();
  270. // }
  271. // this.ZL.setData(this.ZE);
  272. // } catch (e) {
  273. // console.debug("Addons.BaseScannerGUI.setWidgetLabels: ", e);
  274. // }
  275. // },
  276. FH : function () {
  277. try {
  278. var oBox = new qx.ui.layout.Flow();
  279. var oOptions = new qx.ui.container.Composite(oBox);
  280. this.ZC = new qx.ui.form.SelectBox();
  281. this.ZC.setHeight(25);
  282. this.ZC.setMargin(5);
  283. MT_Cache.updateCityCache();
  284. MT_Cache = window.MaelstromTools.Cache.getInstance();
  285. var cname;
  286. for (cname in MT_Cache.Cities) {
  287. var item = new qx.ui.form.ListItem(cname, null, MT_Cache.Cities[cname].Object);
  288. this.ZC.add(item);
  289. if (Addons.LocalStorage.getserver("Basescanner_LastCityID") == MT_Cache.Cities[cname].Object.get_Id()) {
  290. this.ZC.setSelection([item]);
  291. }
  292. }
  293. this.ZC.addListener("changeSelection", function (e) {
  294. this.FP(0, 1, 200);
  295. this.ZH = false;
  296. this.ZG.setLabel(this.T.get("Scan"));
  297. }, this);
  298. oOptions.add(this.ZC);
  299.  
  300. var l = new qx.ui.basic.Label().set({
  301. value : this.T.get("CP Limit"),
  302. textColor : "white",
  303. margin : 5
  304. });
  305. oOptions.add(l);
  306.  
  307. this.ZQ = new qx.ui.form.SelectBox();
  308. this.ZQ.setWidth(50);
  309. this.ZQ.setHeight(25);
  310. this.ZQ.setMargin(5);
  311. var limiter = Addons.LocalStorage.getserver("Basescanner_Cplimiter", 25);
  312. for (var m = 11; m < 42; m += 1) {
  313. item = new qx.ui.form.ListItem("" + m, null, m);
  314. this.ZQ.add(item);
  315. if (limiter == m) {
  316. this.ZQ.setSelection([item]);
  317. }
  318. }
  319. this.ZQ.addListener("changeSelection", function (e) {
  320. this.ZE = [];
  321. this.FP(0, 1, 200);
  322. this.ZH = false;
  323. this.ZG.setLabel(this.T.get("Scan"));
  324. }, this);
  325. oOptions.add(this.ZQ);
  326.  
  327. var la = new qx.ui.basic.Label().set({
  328. value : this.T.get("min Level"),
  329. textColor : "white",
  330. margin : 5
  331. });
  332. oOptions.add(la);
  333. var minlevel = Addons.LocalStorage.getserver("Basescanner_minLevel", "1");
  334. this.ZY = new qx.ui.form.TextField(minlevel).set({
  335. width : 50
  336. });
  337. oOptions.add(this.ZY);
  338.  
  339. this.ZK = [];
  340. this.ZK[0] = new qx.ui.form.CheckBox(this.T.get("Player"));
  341. this.ZK[0].setMargin(5);
  342. this.ZK[0].setTextColor("white");
  343. this.ZK[0].setValue(Addons.LocalStorage.getserver("Basescanner_Show0", false));
  344. this.ZK[0].addListener("changeValue", function (e) {
  345. this.ZE = [];
  346. this.FP(0, 1, 200);
  347. this.ZH = false;
  348. this.ZG.setLabel(this.T.get("Scan"));
  349. }, this);
  350. oOptions.add(this.ZK[0]);
  351. this.ZK[1] = new qx.ui.form.CheckBox(this.T.get("Bases"));
  352. this.ZK[1].setMargin(5);
  353. this.ZK[1].setTextColor("white");
  354. this.ZK[1].setValue(Addons.LocalStorage.getserver("Basescanner_Show1", false));
  355. this.ZK[1].addListener("changeValue", function (e) {
  356. this.ZE = [];
  357. this.FP(0, 1, 200);
  358. this.ZH = false;
  359. this.ZG.setLabel(this.T.get("Scan"));
  360. }, this);
  361. oOptions.add(this.ZK[1]);
  362. this.ZK[2] = new qx.ui.form.CheckBox(this.T.get("Outpost"));
  363. this.ZK[2].setMargin(5);
  364. this.ZK[2].setTextColor("white");
  365. this.ZK[2].setValue(Addons.LocalStorage.getserver("Basescanner_Show2", false));
  366. this.ZK[2].addListener("changeValue", function (e) {
  367. this.ZE = [];
  368. this.FP(0, 1, 200);
  369. this.ZH = false;
  370. this.ZG.setLabel(this.T.get("Scan"));
  371. }, this);
  372. oOptions.add(this.ZK[2]);
  373. this.ZK[3] = new qx.ui.form.CheckBox(this.T.get("Camp"));
  374. this.ZK[3].setMargin(5);
  375. this.ZK[3].setTextColor("white");
  376. this.ZK[3].setValue(Addons.LocalStorage.getserver("Basescanner_Show3", true));
  377. this.ZK[3].addListener("changeValue", function (e) {
  378. this.ZE = [];
  379. this.FP(0, 1, 200);
  380. this.ZH = false;
  381. this.ZG.setLabel(this.T.get("Scan"));
  382. }, this);
  383. oOptions.add(this.ZK[3], {
  384. lineBreak : true
  385. });
  386.  
  387. this.ZG = new qx.ui.form.Button(this.T.get("Scan")).set({
  388. width : 100,
  389. minWidth : 100,
  390. maxWidth : 100,
  391. height : 25,
  392. margin : 5
  393. });
  394. this.ZG.addListener("execute", function () {
  395.  
  396. this.FE();
  397. }, this);
  398. oOptions.add(this.ZG);
  399.  
  400. var border = new qx.ui.decoration.Single(2, "solid", "blue");
  401. this.ZV = new qx.ui.container.Composite(new qx.ui.layout.Basic()).set({
  402. decorator : border,
  403. backgroundColor : "red",
  404. allowGrowX : false,
  405. height : 20,
  406. width : 200
  407. });
  408. this.ZU = new qx.ui.core.Widget().set({
  409. decorator : null,
  410. backgroundColor : "green",
  411. width : 0
  412. });
  413. this.ZV.add(this.ZU);
  414. this.ZX = new qx.ui.basic.Label("").set({
  415. decorator : null,
  416. textAlign : "center",
  417. width : 200
  418. });
  419. this.ZV.add(this.ZX, {
  420. left : 0,
  421. top : -3
  422. });
  423. oOptions.add(this.ZV);
  424.  
  425. this.YZ = new qx.ui.form.Button(this.T.get("clear Cache")).set({
  426. minWidth : 100,
  427. height : 25,
  428. margin : 5
  429. });
  430. this.YZ.addListener("execute", function () {
  431. this.ZZ = [];
  432. }, this);
  433. oOptions.add(this.YZ);
  434.  
  435. this.ZK[4] = new qx.ui.form.CheckBox(this.T.get("Only center on World"));
  436. this.ZK[4].setMargin(5);
  437. this.ZK[4].setTextColor("white");
  438. oOptions.add(this.ZK[4], {
  439. lineBreak : true
  440. });
  441.  
  442. this.ZJ = new qx.ui.form.SelectBox();
  443. this.ZJ.setWidth(150);
  444. this.ZJ.setHeight(25);
  445. this.ZJ.setMargin(5);
  446. var item = new qx.ui.form.ListItem("7 " + this.T.get(MaelstromTools.Statics.Tiberium) + " 5 " + this.T.get(MaelstromTools.Statics.Crystal), null, 7);
  447. this.ZJ.add(item);
  448. item = new qx.ui.form.ListItem("6 " + this.T.get(MaelstromTools.Statics.Tiberium) + " 6 " + this.T.get(MaelstromTools.Statics.Crystal), null, 6);
  449. this.ZJ.add(item);
  450. item = new qx.ui.form.ListItem("5 " + this.T.get(MaelstromTools.Statics.Tiberium) + " 7 " + this.T.get(MaelstromTools.Statics.Crystal), null, 5);
  451. this.ZJ.add(item);
  452. oOptions.add(this.ZJ);
  453. this.ZD = new qx.ui.form.Button(this.T.get("Get Layouts")).set({
  454. width : 120,
  455. minWidth : 120,
  456. maxWidth : 120,
  457. height : 25,
  458. margin : 5
  459. });
  460. this.ZD.addListener("execute", function () {
  461. var layout = window.Addons.BaseScannerLayout.getInstance();
  462. layout.openWindow(this.T.get("BaseScanner Layout"));
  463. }, this);
  464. this.ZD.setEnabled(false);
  465. oOptions.add(this.ZD);
  466.  
  467. this.ZB = new qx.ui.container.Composite();
  468. this.ZB.setLayout(new qx.ui.layout.Flow());
  469. this.ZB.setWidth(750);
  470. //oOptions.add(this.ZB, {flex:1});
  471.  
  472. var J = webfrontend.gui.layout.Loader.getInstance();
  473. //var L = J.getLayout("playerbar", this);
  474. //this._ZZ = J.getElement(L, "objid", 'lblplayer');
  475.  
  476.  
  477. //this.tableSettings = new qx.ui.groupbox.GroupBox("Visable Columns");
  478. //box.add(this.tableSettings, {flex:1});
  479. var k = 2;
  480. for (k = 2; k < this.ZL.getColumnCount(); k++) {
  481. var index = k - 2;
  482.  
  483. this.ZR[index] = new qx.ui.form.CheckBox(this.ZL.getColumnName(k));
  484. this.ZR[index].setValue(this.ZN.getTableColumnModel().isColumnVisible(k));
  485. this.ZR[index].setTextColor("white");
  486. this.ZR[index].index = k;
  487. this.ZR[index].table = this.ZN;
  488. this.ZR[index].addListener("changeValue", function (e) {
  489. //console.log("click", e, e.getData(), this.index);
  490. var tcm = this.table.getTableColumnModel();
  491. tcm.setColumnVisible(this.index, e.getData());
  492. Addons.LocalStorage.setserver("Basescanner_Column_" + this.index, e.getData());
  493. });
  494. this.ZB.add(this.ZR[index]);
  495. //this.tableSettings.add( this.ZR[index] );
  496. }
  497.  
  498. this.ZO = new qx.ui.form.Button("+").set({
  499. margin : 5
  500. });
  501. this.ZO.addListener("execute", function () {
  502. if (this.ZI) {
  503. oOptions.addAfter(this.ZB, this.ZO);
  504. this.ZO.setLabel("-");
  505. } else {
  506. oOptions.remove(this.ZB);
  507. this.ZO.setLabel("+");
  508. }
  509. this.ZI = !this.ZI;
  510. }, this);
  511. this.ZO.setAlignX("right");
  512. oOptions.add(this.ZO, {
  513. lineBreak : true
  514. });
  515.  
  516. this.ZF = oOptions;
  517.  
  518. } catch (e) {
  519. console.debug("Addons.BaseScannerGUI.createOptions: ", e);
  520. }
  521. },
  522. FD : function () {
  523. //0.7
  524. //var n = ClientLib.Data.MainData.GetInstance().get_Cities();
  525. //var i = n.get_CurrentOwnCity();
  526. var st = '<a href="https://sites.google.com/site/blindmanxdonate" target="_blank">Support Development of BlinDManX Addons</a>';
  527. var l = new qx.ui.basic.Label().set({
  528. value : st,
  529. rich : true,
  530. width : 800
  531. });
  532. this.ZP = l;
  533. },
  534. FE : function () {
  535. var selectedBase = this.ZC.getSelection()[0].getModel();
  536. ClientLib.Vis.VisMain.GetInstance().CenterGridPosition(selectedBase.get_PosX(), selectedBase.get_PosY()); //Load data of region
  537. ClientLib.Vis.VisMain.GetInstance().Update();
  538. ClientLib.Vis.VisMain.GetInstance().ViewUpdate();
  539. ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentCityId(selectedBase.get_Id());
  540.  
  541. if (this.ZT) {
  542. var obj = ClientLib.Data.WorldSector.WorldObjectCity.prototype;
  543. // var fa = foundfnkstring(obj['$ctor'], /=0;this\.(.{6})=g>>7&255;.*d\+=f;this\.(.{6})=\(/, "ClientLib.Data.WorldSector.WorldObjectCity", 2);
  544. var fa = foundfnkstring(obj['$ctor'], /this\.(.{6})=\(?\(?g>>8\)?\&.*d\+=f;this\.(.{6})=\(/, "ClientLib.Data.WorldSector.WorldObjectCity", 2);
  545. if (fa != null && fa[1].length == 6) {
  546. obj.getLevel = function () {
  547. return this[fa[1]];
  548. };
  549. } else {
  550. console.error("Error - ClientLib.Data.WorldSector.WorldObjectCity.Level undefined");
  551. }
  552. if (fa != null && fa[2].length == 6) {
  553. obj.getID = function () {
  554. return this[fa[2]];
  555. };
  556. } else {
  557. console.error("Error - ClientLib.Data.WorldSector.WorldObjectCity.ID undefined");
  558. }
  559.  
  560. obj = ClientLib.Data.WorldSector.WorldObjectNPCBase.prototype;
  561. //var fb = foundfnkstring(obj['$ctor'], /100;this\.(.{6})=Math.floor.*d\+=f;this\.(.{6})=\(/, "ClientLib.Data.WorldSector.WorldObjectNPCBase", 2);
  562. var fb = foundfnkstring(obj['$ctor'], /100\){0,1};this\.(.{6})=Math.floor.*d\+=f;this\.(.{6})=\(/, "ClientLib.Data.WorldSector.WorldObjectNPCBase", 2);
  563. if (fb != null && fb[1].length == 6) {
  564. obj.getLevel = function () {
  565. return this[fb[1]];
  566. };
  567. } else {
  568. console.error("Error - ClientLib.Data.WorldSector.WorldObjectNPCBase.Level undefined");
  569. }
  570. if (fb != null && fb[2].length == 6) {
  571. obj.getID = function () {
  572. return this[fb[2]];
  573. };
  574. } else {
  575. console.error("Error - ClientLib.Data.WorldSector.WorldObjectNPCBase.ID undefined");
  576. }
  577.  
  578. obj = ClientLib.Data.WorldSector.WorldObjectNPCCamp.prototype;
  579. //var fc = foundfnkstring(obj['$ctor'], /100;this\.(.{6})=Math.floor.*=-1;\}this\.(.{6})=\(/, "ClientLib.Data.WorldSector.WorldObjectNPCCamp", 2);
  580. var fc = foundfnkstring(obj['$ctor'], /100\){0,1};this\.(.{6})=Math.floor.*this\.(.{6})=\(*g\>\>(22|0x16)\)*\&.*=-1;\}this\.(.{6})=\(/, "ClientLib.Data.WorldSector.WorldObjectNPCCamp", 4);
  581. if (fc != null && fc[1].length == 6) {
  582. obj.getLevel = function () {
  583. return this[fc[1]];
  584. };
  585. } else {
  586. console.error("Error - ClientLib.Data.WorldSector.WorldObjectNPCCamp.Level undefined");
  587. }
  588. if (fc != null && fc[2].length == 6) {
  589. obj.getCampType = function () {
  590. return this[fc[2]];
  591. };
  592. } else {
  593. console.error("Error - ClientLib.Data.WorldSector.WorldObjectNPCCamp.CampType undefined");
  594. }
  595.  
  596. if (fc != null && fc[4].length == 6) {
  597. obj.getID = function () {
  598. return this[fc[4]];
  599. };
  600. } else {
  601. console.error("Error - ClientLib.Data.WorldSector.WorldObjectNPCCamp.ID undefined");
  602. }
  603. this.ZT = false;
  604. }
  605.  
  606. //Firstscan
  607. if (this.ZE == null) {
  608. this.ZH = false;
  609. this.ZG.setLabel("Pause");
  610. this.ZD.setEnabled(false);
  611. window.setTimeout("window.Addons.BaseScannerGUI.getInstance().FJ()", 1000);
  612. return;
  613. }
  614. //After Pause
  615. var c = 0;
  616. for (i = 0; i < this.ZE.length; i++) {
  617. if (this.ZE[i][1] == -1) {
  618. c++;
  619. }
  620. }
  621.  
  622. if (!this.ZH) {
  623. this.ZG.setLabel("Pause");
  624. this.ZD.setEnabled(false);
  625. if (c > 0) {
  626. this.ZH = true;
  627. window.setTimeout("window.Addons.BaseScannerGUI.getInstance().FG()", 1000);
  628. return;
  629. } else {
  630. this.ZH = false;
  631. window.setTimeout("window.Addons.BaseScannerGUI.getInstance().FJ()", 1000);
  632. }
  633. } else {
  634. this.ZH = false;
  635. this.ZG.setLabel(this.T.get("Scan"));
  636. }
  637.  
  638. },
  639. FP : function (value, max, maxwidth) {
  640. if (this.ZU != null && this.ZX != null) {
  641. this.ZU.setWidth(parseInt(value / max * maxwidth, 10));
  642. this.ZX.setValue(value + "/" + max);
  643. }
  644. },
  645. FJ : function () {
  646. try {
  647. this.ZM = {};
  648. this.ZE = [];
  649. var selectedBase = this.ZC.getSelection()[0].getModel();
  650. Addons.LocalStorage.setserver("Basescanner_LastCityID", selectedBase.get_Id());
  651. var ZQ = this.ZQ.getSelection()[0].getModel();
  652. Addons.LocalStorage.setserver("Basescanner_Cplimiter", ZQ);
  653. Addons.LocalStorage.setserver("Basescanner_minLevel", this.ZY.getValue());
  654.  
  655. var c1 = this.ZK[0].getValue();
  656. var c2 = this.ZK[1].getValue();
  657. var c3 = this.ZK[2].getValue();
  658. var c4 = this.ZK[3].getValue();
  659. var c5 = parseInt(this.ZY.getValue(), 10);
  660. //console.log("Select", c1, c2, c3,c4,c5);
  661. Addons.LocalStorage.setserver("Basescanner_Show0", c1);
  662. Addons.LocalStorage.setserver("Basescanner_Show1", c2);
  663. Addons.LocalStorage.setserver("Basescanner_Show2", c3);
  664. Addons.LocalStorage.setserver("Basescanner_Show3", c4);
  665. var posX = selectedBase.get_PosX();
  666. var posY = selectedBase.get_PosY();
  667. var scanX = 0;
  668. var scanY = 0;
  669. var world = ClientLib.Data.MainData.GetInstance().get_World();
  670. console.info("Scanning from: " + selectedBase.get_Name());
  671.  
  672. // world.CheckAttackBase (System.Int32 targetX ,System.Int32 targetY) -> ClientLib.Data.EAttackBaseResult
  673. // world.CheckAttackBaseRegion (System.Int32 targetX ,System.Int32 targetY) -> ClientLib.Data.EAttackBaseResult
  674. var t1 = true;
  675. var t2 = true;
  676. var t3 = true;
  677.  
  678. var maxAttackDistance = ClientLib.Data.MainData.GetInstance().get_Server().get_MaxAttackDistance();
  679. for (scanY = posY - Math.floor(maxAttackDistance + 1); scanY <= posY + Math.floor(maxAttackDistance + 1); scanY++) {
  680. for (scanX = posX - Math.floor(maxAttackDistance + 1); scanX <= posX + Math.floor(maxAttackDistance + 1); scanX++) {
  681. var distX = Math.abs(posX - scanX);
  682. var distY = Math.abs(posY - scanY);
  683. var distance = Math.sqrt((distX * distX) + (distY * distY));
  684. if (distance <= maxAttackDistance) {
  685. var object = world.GetObjectFromPosition(scanX, scanY);
  686. var loot = {};
  687. if (object) {
  688. //console.log(object);
  689.  
  690. if (object.Type == 1 && t1) {
  691. //console.log("object typ 1");
  692. //objfnkstrON(object);
  693. //t1 = !t1;
  694. }
  695. if (object.Type == 2 && t2) {
  696. //console.log("object typ 2");
  697. //objfnkstrON(object);
  698. //t2 = !t2;
  699. }
  700.  
  701. if (object.Type == 3 && t3) {
  702.  
  703. //console.log("object typ 3");
  704. //objfnkstrON(object);
  705. //t3 = !t3;
  706. }
  707.  
  708. if (object.Type == 3) {
  709. if (c5 <= parseInt(object.getLevel(), 10)) {
  710. //console.log(object);
  711. }
  712. }
  713.  
  714. //if(object.ConditionBuildings>0){
  715. var needcp = selectedBase.CalculateAttackCommandPointCostToCoord(scanX, scanY);
  716. if (needcp <= ZQ && typeof object.getLevel == 'function') {
  717. if (c5 <= parseInt(object.getLevel(), 10)) {
  718. // 0:ID , 1:Scanned, 2:Name, 3:Location, 4:Level, 5:Tib, 6:Kristal, 7:Credits, 8:Forschung, 9:Kristalfelder, 10:Tiberiumfelder,
  719. // 11:ConditionBuildings,12:ConditionDefense,13: CP pro Angriff , 14: defhp/offhp , 15:sum tib,krist,credits, 16: sum/cp
  720. var d = this.FL(object.getID(), 0);
  721. var e = this.FL(object.getID(), 1);
  722. if (e != null) {
  723. this.ZM[object.getID()] = e;
  724. }
  725.  
  726. if (object.Type == 1 && c1) { //User
  727. //console.log("object ID LEVEL", object.getID() ,object.getLevel() );
  728. if (d != null) {
  729. this.ZE.push(d);
  730. } else {
  731. this.ZE.push([object.getID(), - 1, this.T.get("Player"), scanX + ":" + scanY, object.getLevel(), 0, 0, 0, 0, 0, 0, 0, 0, needcp, 0, 0, 0, 0]);
  732. }
  733. }
  734. if (object.Type == 2 && c2) { //basen
  735. //console.log("object ID LEVEL", object.getID() ,object.getLevel() );
  736. if (d != null) {
  737. this.ZE.push(d);
  738. } else {
  739. this.ZE.push([object.getID(), - 1, this.T.get("Bases"), scanX + ":" + scanY, object.getLevel(), 0, 0, 0, 0, 0, 0, 0, 0, needcp, 0, 0, 0, 0]);
  740. }
  741. }
  742. if (object.Type == 3 && (c3 || c4)) { //Lager Vposten
  743. //console.log("object ID LEVEL", object.getID() ,object.getLevel() );
  744. if (d != null) {
  745. if (object.getCampType() == 2 && c4) {
  746. this.ZE.push(d);
  747. }
  748. if (object.getCampType() == 3 && c3) {
  749. this.ZE.push(d);
  750. }
  751.  
  752. } else {
  753. if (object.getCampType() == 2 && c4) {
  754. this.ZE.push([object.getID(), - 1, this.T.get("Camp"), scanX + ":" + scanY, object.getLevel(), 0, 0, 0, 0, 0, 0, 0, 0, needcp, 0, 0, 0, 0]);
  755. }
  756. if (object.getCampType() == 3 && c3) {
  757. this.ZE.push([object.getID(), - 1, this.T.get("Outpost"), scanX + ":" + scanY, object.getLevel(), 0, 0, 0, 0, 0, 0, 0, 0, needcp, 0, 0, 0, 0]);
  758. }
  759. }
  760. }
  761. }
  762. }
  763. //}
  764. }
  765. }
  766. }
  767. }
  768. this.ZH = true;
  769. this.ZL.setData(this.ZE);
  770. this.FP(0, this.ZE.length, 200);
  771. this.ZL.sortByColumn(4, false); //Sort form Highlevel to Lowlevel
  772. if (this.YY.name != "DR01D")
  773. window.setTimeout("window.Addons.BaseScannerGUI.getInstance().FG()", 50);
  774. } catch (ex) {
  775. console.debug("Maelstrom_Basescanner FJ error: ", ex);
  776. }
  777. },
  778. FG : function () {
  779. try {
  780. var retry = false;
  781. var loops = 0;
  782. var maxLoops = 10;
  783. var i = 0;
  784. var sleeptime = 150;
  785. while (!retry) {
  786. var ncity = null;
  787. var selectedid = 0;
  788. var id = 0;
  789. if (this.ZE == null) {
  790. console.warn("data null: ");
  791. this.ZH = false;
  792. break;
  793. }
  794. for (i = 0; i < this.ZE.length; i++) {
  795. // 1= "LoadState"
  796. if (this.ZE[i][1] == -1) {
  797. break;
  798. }
  799. }
  800.  
  801. if (i == this.ZE.length) {
  802. this.ZH = false;
  803. }
  804. this.FP(i, this.ZE.length, 200); //Progressbar
  805. if (this.ZE[i] == null) {
  806. console.warn("data[i] null: ");
  807. this.ZH = false;
  808. this.ZG.setLabel(this.T.get("Scan"));
  809. this.ZD.setEnabled(true);
  810. break;
  811. }
  812. posData = this.ZE[i][3];
  813. /* make sure coordinates are well-formed enough */
  814. if (posData != null && posData.split(':').length == 2) {
  815. posX = parseInt(posData.split(':')[0]);
  816. posY = parseInt(posData.split(':')[1]);
  817. /* check if there is any base */
  818. var playerbase = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity();
  819. var world = ClientLib.Data.MainData.GetInstance().get_World();
  820. var foundbase = world.CheckFoundBase(posX, posY, playerbase.get_PlayerId(), playerbase.get_AllianceId());
  821. //console.log("foundbase",foundbase);
  822. this.ZE[i][19] = (foundbase == 0) ? true : false;
  823. //var obj = ClientLib.Vis.VisMain.GetInstance().get_SelectedObject();
  824. //console.log("obj", obj);
  825. id = this.ZE[i][0];
  826. ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentCityId(id);
  827. ncity = ClientLib.Data.MainData.GetInstance().get_Cities().GetCity(id);
  828. //console.log("ncity", ncity);
  829. if (ncity != null) {
  830. if (!ncity.get_IsGhostMode()) {
  831. //if(ncity.get_Name() != null)
  832. //console.log("ncity.get_Name ", ncity.get_Name() , ncity.get_CityBuildingsData().get_Buildings());
  833. //var cityBuildings = ncity.get_CityBuildingsData();
  834. var cityUnits = ncity.get_CityUnitsData();
  835. if (cityUnits != null) { // cityUnits !=null können null sein
  836. //console.log("ncity.cityUnits", cityUnits );
  837.  
  838. var selectedBase = this.ZC.getSelection()[0].getModel();
  839. var buildings = ncity.get_Buildings().d;
  840. var defenseUnits = cityUnits.get_DefenseUnits().d;
  841. var offensivUnits = selectedBase.get_CityUnitsData().get_OffenseUnits().d;
  842. //console.log(buildings,defenseUnits,offensivUnits);
  843.  
  844. if (buildings != null) //defenseUnits !=null können null sein
  845. {
  846. var buildingLoot = getResourcesPart(buildings);
  847. var unitLoot = getResourcesPart(defenseUnits);
  848.  
  849. //console.log("buildingLoot", buildingLoot);
  850. //console.log("unitLoot", unitLoot);
  851. this.ZE[i][2] = ncity.get_Name();
  852. this.ZE[i][5] = buildingLoot[ClientLib.Base.EResourceType.Tiberium] + unitLoot[ClientLib.Base.EResourceType.Tiberium];
  853. this.ZE[i][6] = buildingLoot[ClientLib.Base.EResourceType.Crystal] + unitLoot[ClientLib.Base.EResourceType.Crystal];
  854. this.ZE[i][7] = buildingLoot[ClientLib.Base.EResourceType.Gold] + unitLoot[ClientLib.Base.EResourceType.Gold];
  855. this.ZE[i][8] = buildingLoot[ClientLib.Base.EResourceType.ResearchPoints] + unitLoot[ClientLib.Base.EResourceType.ResearchPoints];
  856. //console.log(posX,posY,"GetBuildingsConditionInPercent", ncity.GetBuildingsConditionInPercent() );
  857. if (ncity.GetBuildingsConditionInPercent() != 0) {
  858. this.ZA = 0;
  859. if (this.ZE[i][5] != 0) {
  860. var c = 0;
  861. var t = 0;
  862. var m = 0;
  863. var k = 0;
  864. var l = 0;
  865. this.ZM[id] = new Array(9);
  866. for (m = 0; m < 9; m++) {
  867. this.ZM[id][m] = new Array(8);
  868. }
  869. for (k = 0; k < 9; k++) {
  870. for (l = 0; l < 8; l++) {
  871. //console.log( ncity.GetResourceType(k,l) );
  872. switch (ncity.GetResourceType(k, l)) {
  873. case 1:
  874. /* Crystal */
  875. this.ZM[id][k][l] = 1;
  876. c++;
  877. break;
  878. case 2:
  879. /* Tiberium */
  880. this.ZM[id][k][l] = 2;
  881. t++;
  882. break;
  883. default:
  884. //none
  885. break;
  886. }
  887. }
  888. }
  889. //console.log( c,t );
  890.  
  891.  
  892. this.ZE[i][9] = c;
  893. this.ZE[i][10] = t;
  894. this.ZE[i][11] = ncity.GetBuildingsConditionInPercent();
  895. this.ZE[i][12] = ncity.GetDefenseConditionInPercent();
  896.  
  897. try {
  898. var u = offensivUnits;
  899. //console.log("OffenseUnits",u);
  900. var offhp = 0;
  901. var defhp = 0;
  902. for (var g in u) {
  903. offhp += u[g].get_Health();
  904. }
  905.  
  906. u = defenseUnits;
  907. //console.log("DefUnits",u);
  908. for (var g in u) {
  909. defhp += u[g].get_Health();
  910. }
  911.  
  912. u = buildings;
  913. //console.log("DefUnits",u);
  914. for (var g in u) {
  915. //var id=0;
  916. //console.log("MdbUnitId",u[g].get_MdbUnitId());
  917. var mid = u[g].get_MdbUnitId();
  918. //DF
  919. if (mid == 158 || mid == 131 || mid == 195) {
  920. this.ZE[i][18] = 8 - u[g].get_CoordY();
  921. }
  922. //CY
  923. if (mid == 112 || mid == 151 || mid == 177) {
  924. this.ZE[i][17] = 8 - u[g].get_CoordY();
  925. }
  926. }
  927.  
  928. //console.log("HPs",offhp,defhp, (defhp/offhp) );
  929. } catch (x) {
  930. console.debug("HPRecord", x);
  931. }
  932. //this.ZE[i][14] = (defhp / offhp);
  933. //console.log(this.ZM[id]);
  934. this.ZE[i][14] = this.maaain(id);
  935.  
  936. this.ZE[i][15] = this.ZE[i][5] + this.ZE[i][6] + this.ZE[i][7];
  937. this.ZE[i][16] = this.ZE[i][15] / this.ZE[i][13];
  938.  
  939. this.ZE[i][1] = 0;
  940. retry = true;
  941. console.info(ncity.get_Name(), " finish");
  942. this.ZA = 0;
  943. this.countlastidchecked = 0;
  944. //console.log(this.ZE[i],this.ZM[id],id);
  945. this.FK(this.ZE[i], this.ZM[id], id);
  946. //update table
  947. this.ZL.setData(this.ZE);
  948. }
  949. } else {
  950. if (this.ZA > 250) {
  951. console.info(this.ZE[i][2], " on ", posX, posY, " removed (GetBuildingsConditionInPercent == 0)");
  952. this.ZE.splice(i, 1); //entfernt element aus array
  953. this.ZA = 0;
  954. this.countlastidchecked = 0;
  955. break;
  956. }
  957. this.ZA++;
  958. }
  959. }
  960. }
  961. } else {
  962. console.info(this.ZE[i][2], " on ", posX, posY, " removed (IsGhostMode)");
  963. this.ZE.splice(i, 1); //entfernt element aus array
  964. break;
  965. }
  966. }
  967. }
  968. loops++;
  969. if (loops >= maxLoops) {
  970. retry = true;
  971. break;
  972. }
  973. }
  974.  
  975. //console.log("getResourcesByID end ", this.ZH, Addons.BaseScannerGUI.getInstance().isVisible());
  976. if (this.lastid != i) {
  977. this.lastid = i;
  978. this.countlastidchecked = 0;
  979. this.ZA = 0;
  980. } else {
  981. if (this.countlastidchecked > 16) {
  982. console.info(this.ZE[i][2], " on ", posX, posY, " removed (found no data)");
  983. this.ZE.splice(i, 1); //entfernt element aus array
  984. this.countlastidchecked = 0;
  985. } else if (this.countlastidchecked > 10) {
  986. sleeptime = 500;
  987. } else if (this.countlastidchecked > 4) {
  988. sleeptime = 250;
  989. }
  990. this.countlastidchecked++;
  991. }
  992. //console.log("this.ZH", this.ZH);
  993. if (this.ZH && Addons.BaseScannerGUI.getInstance().isVisible()) {
  994. //console.log("loop");
  995. window.setTimeout("window.Addons.BaseScannerGUI.getInstance().FG()", sleeptime);
  996. } else {
  997. this.ZG.setLabel(this.T.get("Scan"));
  998. this.ZH = false;
  999. }
  1000. } catch (e) {
  1001. console.debug("MaelstromTools_Basescanner getResources", e);
  1002. }
  1003. },
  1004. FK : function (dataa, datab, id) {
  1005. this.ZZ.push(dataa);
  1006. this.ZS[id] = datab;
  1007. },
  1008. FL : function (id, t) {
  1009. if (t == 0) {
  1010. for (var i = 0; i < this.ZZ.length; i++) {
  1011. if (this.ZZ[i][0] == id) {
  1012. return this.ZZ[i];
  1013. }
  1014. }
  1015. } else {
  1016. if (this.ZS[id]) {
  1017. return this.ZS[id];
  1018. }
  1019. }
  1020. return null;
  1021. },
  1022.  
  1023.  
  1024. maaain : function (ied)
  1025. {
  1026. var fixbld = 0;
  1027. var opty = 1;//-mySlider.conf.value;//document.getElementById("cylvl").value;
  1028. var optd = 5;//-mySlider2.conf.value;//document.getElementById("dflvl").value;
  1029. var reflag = 1;//-mySlider3.conf.value;//document.getElementById("reflvl").value;
  1030. var recovery = 0.5;//mySlider0.conf.value;//document.getElementById("mvrec").value;
  1031. //var cncoptt = document.getElementById("cncopt").value;
  1032. var alliancerank = 20;//mySlider4.conf.value;//document.getElementById("mvrec").value;
  1033. //console.log(mySlider.conf.value);
  1034.  
  1035.  
  1036. var globaa=this.initializ(); //have silo harv plnt accu defined etc
  1037. var addref=1; //whether to add refineries at all
  1038. var grid=[1, 1.25, 2.5]; var grdln=grid.length; //grid search for power weight
  1039. var gridc=[1, 1.15]; var grdcln=gridc.length; //grid search for crystal weight
  1040. //optimize over
  1041. var acnum=2; //number of accumulators to place
  1042. var opta=0.8; //weight on slots when placing accumulators: 0 for max power, 0.8 to account for slots used
  1043. var optt=3.5; //how many touches in silos to tolerate (3, 3.5, 4)
  1044. var refwghb=1.09594661; //weight on refineries 1.32 is 3 levels
  1045. //refwghb=1.32^0.33; %weight on refineries 1.32 is 3 levels
  1046. var refwgh=Math.pow(refwghb,(2-reflag));
  1047. //roi weights
  1048. // t p cry cre
  1049. var wgh=[1,1,1,refwgh];
  1050. var parms=[optt, opta, opty, optd, recovery,acnum,addref,alliancerank];
  1051. //// list of optimization options combinations
  1052. ////optt acnum opta
  1053. if (fixbld===1) { var optns=[[3.5, 1, 0.8]]; }
  1054. else {var optns=[[3, 1, 0.8], [3.5, 1, 0.8], [4, 1, 0.8], [4, 2, 0.3]];}
  1055. //cncoptt=get(handles.edit1,'String');
  1056. iqll=0;
  1057.  
  1058. var map=[[".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."]];
  1059. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) {
  1060. if (this.ZM[ied][kk2][jj2]===2){map[jj2][kk2]="t";}
  1061. if (this.ZM[ied][kk2][jj2]===1){map[jj2][kk2]="c";}
  1062. }}
  1063.  
  1064. var tmp=this.fillin_v2(map,parms);
  1065. var bld=tmp[0];
  1066. var lvl=tmp[1];
  1067.  
  1068. //progressbar(0);
  1069. var map0_=new Array();
  1070. var lvl0_=new Array();
  1071. var grrt0_=new Array();
  1072. var wgh_=new Array();
  1073. var stats0_=new Array();
  1074. var opts0_=new Array();
  1075. var bss__0=new Array();
  1076. var off__0=new Array();
  1077. var bll__0=new Array();
  1078. var ttm__0=new Array();
  1079. var hrv__0=new Array();
  1080.  
  1081. for (var iql=0;iql<optns.length;iql++) //MAIN LOOP
  1082. { //// main loop
  1083. var optt=optns[iql][0]; //how many touches in silos to tolerate (3, 3.5, 4)
  1084. var acnum=optns[iql][1]; //number of accumulators to place
  1085. var opta=optns[iql][2]; //weight on slots when placing accumulators: 0 for max power, 0.8 to account for slots used
  1086. var parms=[optt, opta, opty, optd, recovery,acnum,addref,alliancerank];
  1087. var tmp=this.fillin_v2(map,parms);
  1088. var bld=tmp[0];
  1089. var lvl=tmp[1];
  1090. //do not repeat if already done the simulation
  1091. mmin=10;
  1092. if (iqll>0)
  1093. { for (var wex=0;wex<iqll;wex++)
  1094. { var ccnntt=0;
  1095. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) {
  1096. if (bld[jj2][kk2]!==map0_[wex]) {ccnntt++;}
  1097. }}
  1098. if (ccnntt===0) { mmin=0; }
  1099. }
  1100. }
  1101.  
  1102. if (mmin>0)
  1103. {
  1104. var wgh=[1,1,1,refwgh];
  1105. var grrt_=new Array(); var map__=new Array(); var lvl__ =new Array(); var stats_=new Array();
  1106. var bss___=new Array(); var off___ =new Array(); var bll___=new Array(); var ttm___=new Array(); var hrv___=new Array();
  1107. for (var pwl=0;pwl<grid.length;pwl++)
  1108. { wgh[1]=grid[pwl];
  1109. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) {
  1110. if (bld[jj2][kk2]==="." || bld[jj2][kk2]==="t" || bld[jj2][kk2]==="c") {lvl[jj2][kk2]=0;}
  1111. else {lvl[jj2][kk2]=12;}
  1112. }}
  1113.  
  1114. var tmp=this.operate_v2(bld,lvl,map,wgh,globaa,parms);
  1115. //[bld, lvl, [bss00, bll00, off00], grrt, grrt0, str, T, ttm, ttime,bss_,off_,bll_,ttm,harvlvl]
  1116. grrt_[pwl]=[tmp[3]*100,tmp[8]/24];
  1117. map__[pwl]=tmp[0];
  1118. lvl__[pwl]=tmp[1];
  1119. stats_[pwl]=tmp[2];
  1120. bss___[pwl]=tmp[9];
  1121. off___[pwl]=tmp[10];
  1122. bll___[pwl]=tmp[11];
  1123. ttm___[pwl]=tmp[12];
  1124. hrv___[pwl]=tmp[13];
  1125.  
  1126. //progressbar((pwl+(iql-1)*(grdln+grdcln))/(1+(grdln+grdcln)*size(optns,1)));
  1127. }
  1128. var g0r=0; var m=0;
  1129. for (var ox=0;ox<grrt_.length;ox++)
  1130. { if (grrt_[ox][0]>g0r) {g0r=grrt_[ox][0];var m=ox;}}
  1131. wgh[1]=grid[m];
  1132.  
  1133. var grrt_=new Array(); var map__=new Array(); var lvl__ =new Array(); var stats_=new Array();
  1134. var bss___=new Array(); var off___ =new Array(); var bll___=new Array(); var ttm___=new Array(); var hrv___=new Array();
  1135. for (var pwl=0;pwl<gridc.length;pwl++)
  1136. { wgh[2]=gridc[pwl];
  1137. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) {
  1138. if (bld[jj2][kk2]==="." || bld[jj2][kk2]==="t" || bld[jj2][kk2]==="c") {lvl[jj2][kk2]=0;}
  1139. else {lvl[jj2][kk2]=12;}
  1140. }}
  1141.  
  1142. var tmp=this.operate_v2(bld,lvl,map,wgh,globaa,parms);
  1143. //[bld, lvl, [bss00, bll00, off00], grrt, grrt0, str, T, ttm, ttime]
  1144. grrt_[pwl]=[tmp[3]*100,tmp[8]/24];
  1145. map__[pwl]=tmp[0];
  1146. lvl__[pwl]=tmp[1];
  1147. stats_[pwl]=tmp[2];
  1148. bss___[pwl]=tmp[9];
  1149. off___[pwl]=tmp[10];
  1150. bll___[pwl]=tmp[11];
  1151. ttm___[pwl]=tmp[12];
  1152. hrv___[pwl]=tmp[13];
  1153.  
  1154. // progressbar((pwl+grdln+(iql-1)*(grdln+grdcln))/(1+(grdln+grdcln)*size(optns,1)));
  1155. }
  1156. var g0r=0; var m=0;
  1157. for (var ox=0;ox<grrt_.length;ox++)
  1158. { if (grrt_[ox][0]>g0r) {g0r=grrt_[ox][0];var m=ox;}}
  1159. wgh[2]=gridc[m];
  1160. map0_[iqll]=map__[m];
  1161. lvl0_[iqll]=lvl__[m];
  1162. grrt0_[iqll]=grrt_[m];
  1163. wgh_[iqll]=wgh;
  1164. stats0_[iqll]=stats_[m];
  1165. bss__0[iqll]=bss___[m];
  1166. off__0[iqll]=off___[m];
  1167. bll__0[iqll]=bll___[m];
  1168. ttm__0[iqll]=ttm___[m];
  1169. hrv__0[iqll]=hrv___[m];
  1170. opts0_[iqll]=optns[iql];
  1171. iqll=iqll+1;
  1172. }
  1173. }
  1174. var g0r=0; var m=0;
  1175. for (var ox=0;ox<grrt0_.length;ox++)
  1176. { if (grrt0_[ox][0]>g0r) {g0r=grrt0_[ox][0]; var m=ox;}}
  1177. var optns0=opts0_[m];
  1178. var wgh0=wgh_[m];
  1179. var bss__f=bss__0[m];
  1180. var off__f=off__0[m];
  1181. var bll__f=bll__0[m];
  1182. var ttm__f=ttm__0[m];
  1183. var hrv__f=hrv__0[m];
  1184.  
  1185. //// report best outcome
  1186. // ddat=get(handles.uitable1,'Data');
  1187. // ddat{1,2}=bname;
  1188. optt=optns0[0]; //how many touches in silos to tolerate (3, 3.5, 4)
  1189. acnum=optns0[1]; //number of accumulators to place
  1190. opta=optns0[2]; //weight on slots when placing accumulators: 0 for max power, 0.8 to account for slots used
  1191. var bldr=map0_[m]; var lvlr=lvl0_[m];
  1192. //console.log("Optimal Base Layout:")
  1193. //console.log(cncoptpluss)
  1194. //cncoptpluss=[cncoptt(1:rmv),ttx,mmp(jj0:length(mmp)),cncoptt(fnsh-1:length(cncoptt))];
  1195. //set(handles.edit2,'String',cncoptpluss);
  1196. // console.log("Growth rate: "+grrt0_[m][0].toFixed(2)+"%")
  1197. // console.log("Time to fortress: " + grrt0_[m][1].toFixed(0)+" days")
  1198. var tiblag=(3.5*(4.25-grrt0_[m][0]));
  1199. // if (tiblag>=0) { var ch1=String.fromCharCode(65+tiblag);} else {var ch1="A+";}
  1200. // console.log("Tiberium grade: "+ch1)
  1201. var crylag=1.5*(45-stats0_[m][2]);
  1202. // if ((crylag+tiblag)>=0) { var ch2=String.fromCharCode(65+crylag+tiblag);} else {var ch2="A+";}
  1203. // console.log("Crystal grade: "+ch2)
  1204. var crelag=2.5*(8-stats0_[m][0]);
  1205. ///////////console.log([stats0_[m][0],crelag]);
  1206. // if ((crelag+tiblag)>=0) { var ch3=String.fromCharCode(65+crelag+tiblag);} else {var ch3="A+";}
  1207. // console.log("Credit grade: "+ch3)
  1208. // console.log("Weight on power: "+wgh0[1])
  1209. // var eww=0;
  1210. // if (typeof variable !== 'undefined') {var eww=multiple_dataset2.length};
  1211. // the variable is defined
  1212.  
  1213. return grrt0_[m][0].toFixed(2);
  1214. },
  1215.  
  1216.  
  1217.  
  1218.  
  1219. //functions used inside are defined below
  1220.  
  1221. maxx: function (arr) { var cc=new Array(); for (var xp=0;xp<arr.length;xp++){ cc[xp]=arr[xp].sort()[arr[xp].length-1];} return cc.sort()[cc.length-1]},
  1222.  
  1223. summ: function (arr){ var cc=0; for (jj2=0;jj2<arr.length;jj2++){ for (kk2=0;kk2<arr[jj2].length;kk2++) { cc=cc+arr[jj2][kk2]; }} return cc; },
  1224.  
  1225. transpose: function (arr)
  1226. { var rows=arr.length; var cols=arr[0].length; var arrt=new Array();
  1227. for (var jj=0;jj<cols;jj++) { var arrtt=new Array(); for (var kk=0;kk<rows;kk++) { arrtt[kk]=arr[kk][jj]; } arrt[jj]=arrtt; }
  1228. return arrt; },
  1229.  
  1230. interp1: function (xgrid,ygrid,xeval)
  1231. { if (xgrid.length!==ygrid.length) {return 0;} else if (xeval<=xgrid[0]) {return ygrid[0];} else if (xeval>=xgrid[(xgrid.length-1)]) {return ygrid[(xgrid.length-1)];}
  1232. else { for(var jj=0;jj<(xgrid.length-1);jj++) { if (xeval>xgrid[jj] && xeval<=xgrid[jj+1]) { return ygrid[jj]+(ygrid[jj+1]-ygrid[jj])*(xeval-xgrid[jj])/(xgrid[jj+1]-xgrid[jj]);} } } },
  1233.  
  1234.  
  1235. operate_v2: function (bld0,lvl0,map0,wgh,globaa,parms)
  1236. {//// compute the time it takes to grow fast enough tiberium-wise
  1237. var bld=[[".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."]];
  1238. for (jj2=0;jj2<bld.length;jj2++){ for (kk2=0;kk2<bld[jj2].length;kk2++) {
  1239. bld[jj2][kk2]=bld0[jj2][kk2]; }}
  1240. var map=[[".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."]];
  1241. for (jj2=0;jj2<map.length;jj2++){ for (kk2=0;kk2<map[jj2].length;kk2++) {
  1242. map[jj2][kk2]=map0[jj2][kk2]; }}
  1243. var lvl=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1244. for (jj2=0;jj2<lvl.length;jj2++){ for (kk2=0;kk2<lvl[jj2].length;kk2++) {
  1245. lvl[jj2][kk2]=lvl0[jj2][kk2]; }}
  1246. var resrcs=[0, 0, 0, 0]; var ttime=0; var mvr=0; var balvl=12;
  1247. var alliancerank=parms[7];
  1248. var allbonus=Math.exp(7+0.2121*(balvl+1-alliancerank));
  1249. var tmp = this.payoff(bld,lvl,map,wgh,mvr,balvl,globaa,parms); //all roi // [roi,tibr,powr,cryr,crer,tibc,powc,tibw,poww,cryw,tibrb,powrb,cryrb,crerb]
  1250. var roi=tmp[0];var tibr=tmp[1];var powr=tmp[2];var cryr=tmp[3];var crer=tmp[4];var tibc=tmp[5];var powc=tmp[6];var tibw=tmp[7];var poww=tmp[8];var cryw=tmp[9];var tibrb=tmp[10];var powrb=tmp[11];var cryrb=tmp[12];var crerb=tmp[13];
  1251. var roip=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1252. var roit=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1253. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) {
  1254. if (bld[jj2][kk2]==="h" || bld[jj2][kk2]==="s")
  1255. { roip[jj2][kk2]=NaN; } else { roip[jj2][kk2]=roi[jj2][kk2]; }
  1256. if (bld[jj2][kk2]==="a" || bld[jj2][kk2]==="p")
  1257. { roit[jj2][kk2]=NaN; } else { roit[jj2][kk2]=roi[jj2][kk2]; }
  1258. }}
  1259. var ofns=globaa[14]; var ofns_s=globaa[15];
  1260. mcv=[[1, 0, 0],[2, 1800000, 0], [3, 12000000, 0],[4, 60000000, 0],[5, 250000000, 0],[6, 1000000000, 0],[7, 3900000000, 0],[8, 14800000000, 0],[9, 52000000000, 0],[10, 184000000000, 0],[11, 530000000000, 0]];
  1261. mcv[0][2]=0; for (var wl=1;wl<11;wl++) { mcv[wl][2]=mcv[(wl-1)][2]+mcv[wl][1]; }
  1262. mcv2=[[1, 8],[2, 12],[3, 18],[5, 26],[8, 40],[10, 50]];
  1263. movrec=[[7, 1],[20, 6],[30, 12],[42, 24]];
  1264. var allbonus=Math.exp(7+0.2121*(balvl+1-alliancerank));
  1265. var ttibr=this.summ(tibr)+allbonus; var tpowr=this.summ(powr)+allbonus; var tcryr=this.summ(cryr)+allbonus; var tcrer=this.summ(crer);
  1266. var tret=[ttibr,tpowr,tcryr,tcrer]; var twort=[this.summ(tibw),this.summ(poww),this.summ(cryw)];
  1267. var tt=0;
  1268. var twortt=new Array(); twortt[tt]=[twort[0]+resrcs[0],twort[1]+resrcs[1],twort[2]+resrcs[2],0+resrcs[3]];
  1269. var ttwortt=new Array(); ttwortt[tt]=twortt[tt][0]+twortt[tt][1]+twortt[tt][2]+twortt[tt][3];
  1270. var bss_=new Array(); bss_[tt]=2;
  1271. var off_=new Array(); off_[tt]=0;
  1272. var lvl_=new Array(); lvl_[tt]=lvl;
  1273. var bll_=new Array(); bll_[tt]=12;
  1274. var smm=0; var ct=0;
  1275. for (jj2=0;jj2<bld.length;jj2++){ for (kk2=0;kk2<bld[jj2].length;kk2++) {
  1276. if (bld[jj2][kk2]==="h" || bld[jj2][kk2]==="n") { smm=smm+lvl[jj2][kk2]; ct++;}
  1277. }}
  1278. var harvlvl=new Array();
  1279. harvlvl[tt]=smm/ct;
  1280. var smm=0; var ct=0;
  1281. for (jj2=0;jj2<bld.length;jj2++){ for (kk2=0;kk2<bld[jj2].length;kk2++) {
  1282. if (bld[jj2][kk2]!=="." && bld[jj2][kk2]!=="t" && bld[jj2][kk2]!=="c") { smm=smm+lvl[jj2][kk2]; ct++;}
  1283. }}
  1284. var baselvl=new Array(); baselvl[tt]=smm/ct;
  1285. var resid=new Array(); resid[tt]=[resrcs[0]/tret[0],resrcs[1]/tret[1],resrcs[2]/tret[2],resrcs[3]/tret[3]];
  1286. var ttm=new Array(); ttm[tt]=ttime;
  1287. var str=1; var nwo=0;
  1288. while (balvl<43 && ttime<(400*24)) //end at around 100G tib aka base worth at level 43
  1289. { var upgg=[0,0];var upgt=[0,0];var upgp=[0,0];
  1290. var mroi=100000000000000; var mroit=100000000000000; var mroip=100000000000000;
  1291. for (jj2=0;jj2<bld.length;jj2++){ for (kk2=0;kk2<bld[jj2].length;kk2++) {
  1292. if (roi[jj2][kk2] <mroi ) { upgg[0]=jj2; upgg[1]=kk2; mroi = roi[jj2][kk2];}
  1293. if (roit[jj2][kk2]<mroit) { upgt[0]=jj2; upgt[1]=kk2; mroit=roit[jj2][kk2];}
  1294. if (roip[jj2][kk2]<mroip) { upgp[0]=jj2; upgp[1]=kk2; mroip=roip[jj2][kk2];}
  1295. }}
  1296. if (resid[tt][0]>24) { var upg=[upgp[0],upgp[1]]; }
  1297. else if (resid[tt][1]>24) { var upg=[upgt[0],upgt[1]]; }
  1298. else { var upg=[upgg[0],upgg[1]]; }
  1299.  
  1300. if (bld[upg[0]][upg[1]]!=="q")
  1301. { var tm=[(tibc[upg[0]][upg[1]]-resrcs[0])/ttibr,(powc[upg[0]][upg[1]]-resrcs[1])/tpowr,0];
  1302. if (tm[0]>tm[1] && tm[0]>0) {var tm0=tm[0];}
  1303. else if (tm[1]>tm[0] && tm[1]>0) {var tm0=tm[1];}
  1304. else {var tm0=0;}
  1305. ttime=ttime+tm0; //accumulate resources and pay cost of upgrade
  1306. resrcs[0]=resrcs[0]+tm0*ttibr-tibc[upg[0]][upg[1]];
  1307. resrcs[1]=resrcs[1]+tm0*tpowr-powc[upg[0]][upg[1]];
  1308. resrcs[2]=resrcs[2]+tm0*tcryr;
  1309. resrcs[3]=resrcs[3]+tm0*tcrer;
  1310. lvl[upg[0]][upg[1]]=lvl[upg[0]][upg[1]]+1; //upgrade
  1311. }
  1312. else //spend crystal and power on defense
  1313. // { var tm=[(tibc[upg[0]][upg[1]]-resrcs[2])/tcryr,(powc[upg[0]][upg[1]]-resrcs[1])/tpowr,0];
  1314. //for forgotten attacks only spend tiberium 1/4 of total and full power
  1315. { var tm=[(tibc[upg[0]][upg[1]]/4-resrcs[0])/ttibr,(powc[upg[0]][upg[1]]-resrcs[1])/tpowr,0];
  1316. if (tm[0]>tm[1] && tm[0]>0) {var tm0=tm[0];}
  1317. else if (tm[1]>tm[0] && tm[1]>0) {var tm0=tm[1];}
  1318. else {var tm0=0;}
  1319. ttime=ttime+tm0; //accumulate resources and pay cost of upgrade
  1320. // resrcs[0]=resrcs[0]+tm0*ttibr;
  1321. // resrcs[2]=resrcs[2]+tm0*tcryr-tibc[upg[0]][upg[1]];
  1322. //also modified for forgotten attacis
  1323. resrcs[0]=resrcs[0]+tm0*ttibr-tibc[upg[0]][upg[1]]/4;
  1324. resrcs[1]=resrcs[1]+tm0*tpowr-powc[upg[0]][upg[1]];
  1325. resrcs[2]=resrcs[2]+tm0*tcryr;
  1326. resrcs[3]=resrcs[3]+tm0*tcrer;
  1327. lvl[upg[0]][upg[1]]=lvl[upg[0]][upg[1]]+1; //upgrade
  1328. }
  1329. lvl_[tt]=lvl;
  1330. var tmp = this.payoff(bld,lvl,map,wgh,mvr,balvl,globaa,parms); //all roi // [roi,tibr,powr,cryr,crer,tibc,powc,tibw,poww,cryw,tibrb,powrb,cryrb,crerb]
  1331. var roi=tmp[0];var tibr=tmp[1];var powr=tmp[2];var cryr=tmp[3];var crer=tmp[4];var tibc=tmp[5];var powc=tmp[6];var tibw=tmp[7];var poww=tmp[8];var cryw=tmp[9];var tibrb=tmp[10];var powrb=tmp[11];var cryrb=tmp[12];var crerb=tmp[13];
  1332. var roip=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1333. var roit=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1334. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) {
  1335. if (bld[jj2][kk2]==="h" || bld[jj2][kk2]==="s")
  1336. { roip[jj2][kk2]=NaN; } else { roip[jj2][kk2]=roi[jj2][kk2]; }
  1337. if (bld[jj2][kk2]==="a" || bld[jj2][kk2]==="p")
  1338. { roit[jj2][kk2]=NaN; } else { roit[jj2][kk2]=roi[jj2][kk2]; }
  1339. }}
  1340. var twort=[this.summ(tibw),this.summ(poww),this.summ(cryw)];
  1341. tt=tt+1;
  1342. twortt[tt]=[twort[0]+resrcs[0],twort[1]+resrcs[1],twort[2]+resrcs[2],0+resrcs[3]];
  1343. ttwortt[tt]=twortt[tt][0]+twortt[tt][1]+twortt[tt][2]+twortt[tt][3];
  1344. var smm=0; var ct=0;
  1345. for (jj2=0;jj2<bld.length;jj2++){ for (kk2=0;kk2<bld[jj2].length;kk2++) {
  1346. if (bld[jj2][kk2]==="h" || bld[jj2][kk2]==="n") { smm=smm+lvl[jj2][kk2]; ct++;}
  1347. }}
  1348. harvlvl[tt]=smm/ct;
  1349. var smm=0; var ct=0;
  1350. for (jj2=0;jj2<bld.length;jj2++){ for (kk2=0;kk2<bld[jj2].length;kk2++) {
  1351. if (bld[jj2][kk2]!=="." && bld[jj2][kk2]!=="t" && bld[jj2][kk2]!=="c") { smm=smm+lvl[jj2][kk2]; ct++;}
  1352. }}
  1353. baselvl[tt]=smm/ct;
  1354. //bnchmrk;
  1355. var offgrd=new Array(); var offval=new Array();
  1356. for (var jj=0;jj<60;jj++){ offgrd[jj]=ofns_s[jj][0]; offval[jj]=jj+1;}
  1357. var balvl=this.interp1(offgrd,offval,(twort[0]+resrcs[0]));
  1358. var bses0=this.interp1(this.transpose(mcv2)[1],this.transpose(mcv2)[0],balvl);
  1359. var offlvl=this.interp1(offgrd,offval,(resrcs[2]*(bses0-1)));
  1360. var bses=this.interp1(this.transpose(mcv)[2],this.transpose(mcv)[0],resrcs[3]*(bses0-1));
  1361. var mvr=this.interp1(this.transpose(movrec)[0],this.transpose(movrec)[1],balvl);
  1362. if (mvr>24) {mvr=24;}
  1363. var recovery=parms[4];
  1364. mvr=mvr*recovery;
  1365. //
  1366. var allbonus=Math.exp(7+0.2121*(balvl+1-alliancerank));
  1367. var ttibr=this.summ(tibr)-mvr/24*this.summ(tibrb)+allbonus; var tpowr=this.summ(powr)-mvr/24*this.summ(powrb)+allbonus; var tcryr=this.summ(cryr)-mvr/24*this.summ(cryrb)+allbonus; var tcrer=this.summ(crer)-mvr/24*this.summ(crerb);
  1368. var tret=[ttibr,tpowr,tcryr,tcrer];
  1369. bss_[tt]=bses; off_[tt]=offlvl; bll_[tt]=balvl;
  1370. resid[tt]=[resrcs[0]/tret[0],resrcs[1]/tret[1],resrcs[2]/tret[2],resrcs[3]/tret[3]];
  1371. ttm[tt]=ttime;
  1372. if (balvl>19 && str===1) //start at 100M tib
  1373. { str=tt; }
  1374. if (ttime>(180*240) && nwo===0)
  1375. { nwo=1; var off00=offlvl; var bll00=balvl; var bss00=bses; }
  1376. }
  1377. if (nwo===0) { var off00=offlvl; var bll00=balvl; var bss00=bses; }
  1378. var T=tt;
  1379. var grrt=Math.log(ttwortt[T]/ttwortt[str])/((ttm[T]-ttm[str])/24);
  1380. var grrt0=Math.log(twortt[T][0]/twortt[str][0])/((ttm[T]-ttm[str])/24);
  1381. //console.log(allbonus);
  1382. return [bld, lvl, [bss00, bll00, off00], grrt, grrt0, str, T, ttm, ttime,bss_,off_,bll_,ttm,harvlvl];
  1383. },
  1384.  
  1385. payoff: function (bld,lvl,map,wgh,mvr,balvl,globaa,parms)
  1386. { var silo=globaa[0]; var harv=globaa[1]; var plnt=globaa[2]; var accu=globaa[3]; var silo_s=globaa[4]; var harv_s=globaa[5]; var plnt_s=globaa[6]; var accu_s=globaa[7]; var defoff=globaa[8]; var defoff_s=globaa[9]; var rfnr=globaa[10]; var rfnr_s=globaa[11]; var dfns=globaa[12]; var dfns_s=globaa[13]; var ofns=globaa[14]; var ofns_s=globaa[15];
  1387. var optt=parms[0]; var opta=parms[1]; var opty=parms[2]; var optd=parms[3]; var recovery=parms[4]; var acnum=parms[5]; var addref=parms[6]; var alliancerank=parms[7];
  1388. var tibr=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1389. var powr=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1390. var cryr=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1391. var crer=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1392. var tibc=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1393. var powc=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1394. var tibw=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1395. var poww=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1396. var cryw=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1397. //bonus (non-continuous) part of returns
  1398. var tibrb=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1399. var powrb=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1400. var cryrb=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1401. var crerb=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1402. var r0=0; var c0=0;
  1403. var r1=0; var c1=0;
  1404. for (var row=0;row<8;row++)
  1405. { for (var col=0;col<9;col++)
  1406. { switch (bld[row][col])
  1407. { case "s":
  1408. var tmp=this.countadj(bld,[row,col],"h");
  1409. var tch=tmp[0]+1; if (tch>0) {var tchsgn=1;} else {var tchsgn=0;}
  1410. var tmp=this.countadj(bld,[row,col],"n");
  1411. var tchn=tmp[0]+1; if (tchn>0) {var tchnsgn=1;} else {var tchnsgn=0;}
  1412. tibr[row][col]=silo[lvl[row][col]-1][2]+tch*silo[lvl[row][col]-1][3]+tchsgn*silo[lvl[row][col]-1][4];
  1413. tibrb[row][col]=silo[lvl[row][col]-1][2];
  1414. cryr[row][col]=silo[lvl[row][col]-1][2]+tchn*silo[lvl[row][col]-1][3]+tchnsgn*silo[lvl[row][col]-1][4];
  1415. cryrb[row][col]=silo[lvl[row][col]-1][2];
  1416. tibc[row][col]=silo[lvl[row][col]-1][0];
  1417. powc[row][col]=silo[lvl[row][col]-1][1];
  1418. tibw[row][col]=silo_s[lvl[row][col]-1][0];
  1419. poww[row][col]=silo_s[lvl[row][col]-1][1];
  1420. break;
  1421. case "h":
  1422. var tmp=this.countadj(bld,[row,col],"s");
  1423. var tch=tmp[0]+1; if (tch>0) {var tchsgn=1;} else {var tchsgn=0;}
  1424. tibr[row][col]=harv[lvl[row][col]-1][2]+tch*harv[lvl[row][col]-1][3]+tchsgn*harv[lvl[row][col]-1][4];
  1425. tibrb[row][col]=harv[lvl[row][col]-1][2];
  1426. tibc[row][col]=harv[lvl[row][col]-1][0];
  1427. powc[row][col]=harv[lvl[row][col]-1][1];
  1428. tibw[row][col]=harv_s[lvl[row][col]-1][0];
  1429. poww[row][col]=harv_s[lvl[row][col]-1][1];
  1430. break;
  1431. case "y":
  1432. var tch=3; if (tch>0) {var tchsgn=1;} else {var tchsgn=0;}
  1433. var llv=lvl[row][col];
  1434. if (llv>10)
  1435. { var llv=lvl[row][col]+opty; } //CY needs to be at most opty levels below harvesters
  1436. tibr[row][col]=silo[llv-1][2]+tch*silo[llv-1][3]+tchsgn*silo[llv-1][4];
  1437. tibc[row][col]=silo[llv-1][0];
  1438. powc[row][col]=silo[llv-1][1];
  1439. tibw[row][col]=silo_s[llv-1][0];
  1440. poww[row][col]=silo_s[llv-1][1]; //use this to compute all kinds of roi
  1441. var r0=row; var c0=col; //remember the location
  1442. break;
  1443. case "q":
  1444. var tch=3; if (tch>0) {var tchsgn=1;} else {var tchsgn=0;}
  1445. var llv=lvl[row][col];
  1446. if (llv>10)
  1447. { var llv=lvl[row][col]+optd; } //defense needs to be at least optd levels below harvesters
  1448. tibr[row][col]=silo[llv-1][2]+tch*silo[llv-1][3]+tchsgn*silo[llv-1][4];
  1449. tibc[row][col]=silo[llv-1][0];
  1450. powc[row][col]=silo[llv-1][1];
  1451. tibw[row][col]=silo_s[llv-1][0];
  1452. poww[row][col]=silo_s[llv-1][1]; //use this to compute all kinds of roi
  1453. var r1=row; var c1=col; //remember the location
  1454. break;
  1455. case "n":
  1456. var tmp=this.countadj(bld,[row,col],"s");
  1457. var tch=tmp[0]+1; if (tch>0) {var tchsgn=1;} else {var tchsgn=0;}
  1458. cryr[row][col]=harv[lvl[row][col]-1][2]+tch*harv[lvl[row][col]-1][3]+tchsgn*harv[lvl[row][col]-1][4];
  1459. cryrb[row][col]=harv[lvl[row][col]-1][2];
  1460. tibc[row][col]=harv[lvl[row][col]-1][0];
  1461. powc[row][col]=harv[lvl[row][col]-1][1];
  1462. tibw[row][col]=harv_s[lvl[row][col]-1][0];
  1463. poww[row][col]=harv_s[lvl[row][col]-1][1];
  1464. break;
  1465. case "a":
  1466. var tmp=this.countadj(bld,[row,col],"p");
  1467. var tch=tmp[0]+1; if (tch>0) {var tchsgn=1;} else {var tchsgn=0;}
  1468. powr[row][col]=accu[lvl[row][col]-1][2]+tch*accu[lvl[row][col]-1][3]+tchsgn*accu[lvl[row][col]-1][4];
  1469. powrb[row][col]=accu[lvl[row][col]-1][2];
  1470. tibc[row][col]=accu[lvl[row][col]-1][0];
  1471. powc[row][col]=accu[lvl[row][col]-1][1];
  1472. tibw[row][col]=accu_s[lvl[row][col]-1][0];
  1473. poww[row][col]=accu_s[lvl[row][col]-1][1];
  1474. break;
  1475. case "p":
  1476. var tmp=this.countadj(bld,[row,col],"a");
  1477. var tch2=tmp[0]+1; if (tch2>0) {var tch2sgn=1;} else {var tch2sgn=0;}
  1478. var tmp=this.countadj(map,[row,col],"c");
  1479. var tch=tmp[0]+1; if (tch>0) {var tchsgn=1;} else {var tchsgn=0;}
  1480. powr[row][col]=plnt[lvl[row][col]-1][2]+tch*plnt[lvl[row][col]-1][3]+tch2sgn*plnt[lvl[row][col]-1][4];
  1481. powrb[row][col]=plnt[lvl[row][col]-1][2];
  1482. tibc[row][col]=plnt[lvl[row][col]-1][0];
  1483. powc[row][col]=plnt[lvl[row][col]-1][1];
  1484. tibw[row][col]=plnt_s[lvl[row][col]-1][0];
  1485. poww[row][col]=plnt_s[lvl[row][col]-1][1];
  1486. var tmp=this.countadj(bld,[row,col],"r");
  1487. var tchR=tmp[0]+1; if (tchR>0) {var tchRsgn=1;} else {var tchRsgn=0;}
  1488. crer[row][col]=tchR*plnt[lvl[row][col]-1][5];
  1489. break;
  1490. case "r":
  1491. var tmp=this.countadj(bld,[row,col],"p");
  1492. var tch2=tmp[0]+1; if (tch2>0) {var tch2sgn=1;} else {var tch2sgn=0;}
  1493. var tmp=this.countadj(map,[row,col],"t");
  1494. var tch=tmp[0]+1; if (tch>0) {var tchsgn=1;} else {var tchsgn=0;}
  1495. crer[row][col]=rfnr[lvl[row][col]-1][2]+tch*rfnr[lvl[row][col]-1][3]+tch2sgn*rfnr[lvl[row][col]-1][4];
  1496. crerb[row][col]=rfnr[lvl[row][col]-1][2];
  1497. tibc[row][col]=rfnr[lvl[row][col]-1][0];
  1498. powc[row][col]=rfnr[lvl[row][col]-1][1];
  1499. tibw[row][col]=rfnr_s[lvl[row][col]-1][0];
  1500. poww[row][col]=rfnr_s[lvl[row][col]-1][1];
  1501. break;
  1502. default:
  1503. break;
  1504. }
  1505. }
  1506. }
  1507. var roi=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1508. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) {
  1509. roi[jj2][kk2]=(tibc[jj2][kk2]+powc[jj2][kk2]*wgh[1])/(tibr[jj2][kk2]-mvr/24*tibrb[jj2][kk2]+(powr[jj2][kk2]-mvr/24*powrb[jj2][kk2])*wgh[1]+(cryr[jj2][kk2]-mvr/24*cryrb[jj2][kk2])*wgh[2]+(crer[jj2][kk2]-mvr/24*crerb[jj2][kk2])*wgh[3])/24*4;
  1510. }}
  1511. // correct CY data
  1512. if (r0>-1)
  1513. { tibr[r0][c0]=0;
  1514. if (lvl[r0][c0]>10) { var lllv=lvl[r0][c0];} else { var lllv=10;}
  1515. if (lvl[r0][c0]-(optd-opty)>10) { var lllv2=lvl[r0][c0]-(optd-opty);} else { var lllv2=10;}
  1516. tibc[r0][c0]=defoff[lllv-1][0]*2+defoff[lllv2-1][0]*2; //there are 2 buildins: CY, SUPPORT that have opty level and DF, DFHQ have optd level
  1517. powc[r0][c0]=defoff[lllv-1][1]*2+defoff[lllv2-1][1]*2;
  1518. tibw[r0][c0]=defoff_s[lllv-1][0]*2+defoff_s[lllv2-1][0]*2;
  1519. poww[r0][c0]=defoff_s[lllv-1][1]*2+defoff_s[lllv2-1][1]*2;
  1520. }
  1521. // correct DFHQ data
  1522. if (r1>-1)
  1523. { tibr[r1][c1]=0;
  1524. tibc[r1][c1]=dfns[lvl[r1][c1]-1][0]; //defense costs are in crystal instead of tiberium
  1525. powc[r1][c1]=dfns[lvl[r1][c1]-1][1];
  1526. cryw[r1][c1]=dfns_s[lvl[r1][c1]-1][0]; //defense worth are also in crystal
  1527. poww[r1][c1]=dfns_s[lvl[r1][c1]-1][1];
  1528. }
  1529. return [roi,tibr,powr,cryr,crer,tibc,powc,tibw,poww,cryw,tibrb,powrb,cryrb,crerb];
  1530. },
  1531.  
  1532. countadj: function (bldn,cntr,typ){
  1533. // counts number of buildings of certain type adjacent to a particular location in a layout
  1534. var srnd=[[cntr[0]-1,cntr[1]-1], [cntr[0]-1,cntr[1]], [cntr[0]-1,cntr[1]+1], [cntr[0],cntr[1]-1], [cntr[0],cntr[1]+1], [cntr[0]+1,cntr[1]-1], [cntr[0]+1,cntr[1]], [cntr[0]+1,cntr[1]+1]];
  1535. var ind=new Array(); var bb=new Array(); var jjs=-1; var jjs2=-1;
  1536. for (js=0;js<8;js++)
  1537. { if (srnd[js][0]>-1 && srnd[js][0]<8 && srnd[js][1]>-1 && srnd[js][1]<9)
  1538. { if (bldn[srnd[js][0]][srnd[js][1]] === typ) { jjs++; ind[jjs]=js; }
  1539. jjs2++; bb[jjs2]=bldn[srnd[js][0]][srnd[js][1]]; } }
  1540. return [jjs,bb,ind,srnd];
  1541. },
  1542.  
  1543. //INITIALIZATION PART
  1544. initializ: function (){
  1545. var silo=[[2, 0, 0, 72, 0,0],[3, 1, 0, 90, 0,0],[4, 1, 0, 125, 0,0],[20, 5, 0, 170, 0,0],[110, 28, 0, 220, 0,0],[360, 90, 0, 275, 0,0],[1100, 275, 0, 335, 0,0],[3200, 800, 0, 400, 0,0],[8800, 2200, 0, 460, 0,0],[22400, 5600, 0, 530, 0,0],[48000, 12000, 0, 610, 0,0],[63360, 15840, 0, 710, 0,0],[83630, 20900, 0, 888, 0,0],[110390, 27600, 0, 1100, 0,0],[145720, 36430, 0, 1380, 0,0],[192350, 48090, 0, 1730, 0,0],[253910, 63470, 0, 2160, 0,0],[335160, 83790, 0, 2700, 0,0],[442410, 110600, 0, 3380, 0,0],
  1546. [0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]];
  1547. for (var j=19;j<60;j++){ silo[j][0]=silo[j-1][0]*1.32; silo[j][1]=silo[j][0]/4; silo[j][2]=silo[j-1][2]*1.25; silo[j][3]=silo[j-1][3]*1.25; silo[j][4]=silo[j-1][4]*1.25;}
  1548. var harv = new Array();
  1549. for (var j = 0; j < silo.length; j++){ harv[j] = [0,0,0,0,0,0]; for (var k = 0; k < silo[j].length; k++) { harv[j][k] = silo[j][k]+0.0; } }
  1550. var tmp1=[3, 4, 6, 15, 110, 360, 1100, 3200, 8800, 22400]; var tmp2=[0, 1, 3, 12, 72, 234, 715, 2080, 5720, 14560 ]; var tmp3=[240, 300, 432, 570, 735, 920, 1120, 1330, 1560, 1800, 2050, 2360, 2950, 3680, 4600, 5760];
  1551. for (var j=1;j<60;j++) { harv[j][1]=harv[j][0]*3/4; harv[j][2]=10*harv[j][3]/3; harv[j][4]=harv[j][3]; harv[j][3]=0; if (j<10) { harv[j][0]=tmp1[j]; harv[j][1]=tmp2[j]; } if (j<16) { harv[j][2]=tmp3[j]; }}
  1552. var plnt=[[3, 0, 120, 60, 72,0],[5, 0, 150, 75, 90,0],[10, 1, 198, 100, 120,0],[46, 5, 270, 135, 160,0],[286, 28, 360, 180, 215,0],[936, 90, 460, 230, 275,0],[2860, 275, 560, 280, 335,0],[8320, 800, 660, 330, 400,0],[22880, 2200, 780, 380, 460,0],[58240, 5600, 900, 440, 530,0],[124800, 12000, 1020, 500, 610,0],[164730, 15840, 1160, 580, 700,0],[217450, 20900, 1450, 725, 875,0],[287030, 27600, 1820, 906, 1090,0],[378880, 36430, 2270, 1130, 1360,0],[500130, 48090, 2840, 1410, 1700,0],[660170, 63470, 3560, 1770, 2130,0],[871420, 83790, 4450, 2210, 2670,0],[1150000, 110600, 5560, 2760, 3330,0],
  1553. [0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]];
  1554. for (var j=19;j<60;j++){ plnt[j][0]=plnt[j-1][0]*1.32; plnt[j][1]=plnt[j-1][1]*1.32; plnt[j][2]=plnt[j-1][2]*1.25; plnt[j][3]=plnt[j-1][3]*1.25; plnt[j][4]=plnt[j-1][4]*1.25;}
  1555. var tmp4=[48, 60, 75, 100, 125, 160, 195, 230, 270, 315, 370, 430, 538, 672, 840, 1050, 1310, 1640, 2050];
  1556. for (var j=1;j<60;j++){ if (j<19) { plnt[j][5]=tmp4[j]; } else { plnt[j][5]=plnt[j-1][5]*1.25; }}
  1557. var accu=[[2, 0, 0, 48, 0,0],[3, 1, 0, 60, 0,0],[4, 1, 0, 80, 0,0],[20, 5, 0, 110, 0,0],[110, 28, 0, 145, 0,0],[360, 90, 0, 185, 0,0],[1100, 275, 0, 225, 0,0],[3200, 800, 0, 265, 0,0],[8800, 2200, 0, 310, 0,0],[22400, 5600, 0, 355, 0,0],[48000, 12000, 0, 405, 0,0],[63360, 15840, 0, 465, 0,0],[83630, 20900, 0, 581, 0,0],[110390, 27600, 0, 727, 0,0],[145720, 36430, 0, 908, 0,0],[192350, 48090, 0, 1130, 0,0],[253910, 63470, 0, 1410, 0,0],[335160, 83790, 0, 1770, 0,0],[442410, 110600, 0, 2210, 0,0],
  1558. [0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]];
  1559. for (var j=19;j<60;j++){ accu[j][0]=accu[j-1][0]*1.32; accu[j][1]=accu[j-1][1]*1.32; accu[j][2]=accu[j-1][2]*1.25; accu[j][3]=accu[j-1][3]*1.25; accu[j][4]=accu[j-1][4]*1.25;}
  1560. var rfnr=[[3, 0, 120, 60, 72,0],[4, 1, 150, 75, 90,0],[8, 2, 180, 90, 110,0],[35, 9, 240, 120, 145,0],[220, 55, 315, 160, 190,0],[720, 180, 400, 200, 240,0],[2200, 550, 485, 240, 290,0],[6400, 1600, 575, 290, 345,0],[17600, 4400, 680, 340, 410,0],[44800, 11200, 790, 400, 475,0],[96000, 24000, 925, 460, 555,0],[126720, 31680, 1080, 540, 650,0],[167270, 41810, 1350, 675, 813,0],[220790, 55190, 1680, 844, 1010,0],[291450, 72860, 2100, 1050, 1270,0],[384710, 96170, 2630, 1310, 1580,0],[507820, 126950, 3290, 1640, 1980,0],[670330, 167580, 4110, 2060, 2480,0],[884830, 221200, 5140, 2570, 3090,0],
  1561. [0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]];
  1562. var fct=[1.31999808021389, 1.31999502749370, 1.25005273120801, 1.25005273120801, 1.25008568540486];
  1563. for (var j=19;j<60;j++){ rfnr[j][0]=rfnr[j-1][0]*fct[0]; rfnr[j][1]=rfnr[j-1][1]*fct[1]; rfnr[j][2]=rfnr[j-1][2]*fct[2]; rfnr[j][3]=rfnr[j-1][3]*fct[3]; rfnr[j][4]=rfnr[j-1][4]*fct[4];}
  1564. var harv_s=[[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0]];
  1565. var silo_s=[[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0]];
  1566. var accu_s=[[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0]];
  1567. var plnt_s=[[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0]];
  1568. var rfnr_s=[[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0]];
  1569. for (var j=1;j<60;j++){ harv_s[j][0]=harv_s[j-1][0]+harv[j-1][0]; harv_s[j][1]=harv_s[j-1][1]+harv[j-1][1]; silo_s[j][0]=silo_s[j-1][0]+silo[j-1][0]; silo_s[j][1]=silo_s[j-1][1]+silo[j-1][1]; accu_s[j][0]=accu_s[j-1][0]+accu[j-1][0]; accu_s[j][1]=accu_s[j-1][1]+accu[j-1][1]; plnt_s[j][0]=plnt_s[j-1][0]+plnt[j-1][0]; plnt_s[j][1]=plnt_s[j-1][1]+plnt[j-1][1]; rfnr_s[j][0]=rfnr_s[j-1][0]+rfnr[j-1][0]; rfnr_s[j][1]=rfnr_s[j-1][1]+rfnr[j-1][1];}
  1570. var defoff_s=[[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0]];
  1571. defoff=[[10, 0],[15, 0],[30, 3],[60, 15],[440, 110],[1440, 360],[4400, 1100],[12800, 3200],[35200, 8800],[89600, 22400],[192000, 48000],[253440, 63360],[334540, 83630],[441590, 110390],[582900, 145720],[769430, 192350],[1010000, 253910],[1340000, 335160],[1760000, 442410],
  1572. [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]];
  1573. for (var j=19;j<60;j++){ defoff[j][1]=defoff[j-1][1]*1.32; defoff[j][0]=defoff[j][1]*4;}
  1574. var ofns=[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]];
  1575. var dfns=[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]];
  1576. ofns[35][0]=4028442000; for (var js=36;js<60;js++){ ofns[js][0]=ofns[js-1][0]*1.32; }
  1577. for (var js=34;js>=0;js--){ if (js<11) { ofns[js][0]=ofns[js+1][0]/3.3; } else { ofns[js][0]=ofns[js+1][0]/1.32; }}
  1578. var ofns_s=[[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0]];
  1579. var dfns_s=[[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0],[1,0]];
  1580. for (var js=0;js<60;js++){ ofns[js][1]=ofns[js][0]/4; dfns[js][0]=ofns[js][0]/2; dfns[js][1]=ofns[js][1]/2; if(js>0) { dfns_s[js][0]=dfns_s[js-1][0]+dfns[js-1][0]; dfns_s[js][1]=dfns_s[js-1][1]+dfns[js-1][1]; ofns_s[js][0]=ofns_s[js-1][0]+ofns[js-1][0]; ofns_s[js][1]=ofns_s[js-1][1]+ofns[js-1][1]; defoff_s[js][0]=defoff_s[js-1][0]+defoff[js-1][0]; defoff_s[js][1]=defoff_s[js-1][1]+defoff[js-1][1]; }}
  1581. //END INITIALIZATION PART
  1582. return [silo, harv, plnt, accu, silo_s, harv_s, plnt_s, accu_s, defoff, defoff_s, rfnr, rfnr_s, dfns, dfns_s, ofns, ofns_s];
  1583. },
  1584.  
  1585. fillin_v2: function (map,parms)
  1586. { var optt=parms[0]; var opta=parms[1]; var opty=parms[2]; var optd=parms[3]; var recovery=parms[4]; var acnum=parms[5]; var addref=parms[6];
  1587. map2=[[".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."]];
  1588. //put all possible harvesters
  1589. for (jj=0;jj<8;jj++) { for (kk=0;kk<9;kk++)
  1590. { if (map[jj][kk]==="t") { map2[jj][kk]="h"; }
  1591. else if (map[jj][kk]==="c") { map2[jj][kk]="n"; } } }
  1592. var tibcnt=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1593. var crycnt=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1594. var totcnt=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1595. // put silos in all 4 and 5 touch places
  1596. for (jj=0;jj<8;jj++) { for (kk=0;kk<9;kk++)
  1597. { var tmp=this.countadj(map,[jj,kk],"t"); tibcnt[jj][kk]=tmp[0]+1;
  1598. var tmp=this.countadj(map,[jj,kk],"c"); crycnt[jj][kk]=tmp[0]+1;
  1599. totcnt[jj][kk]=tibcnt[jj][kk]+crycnt[jj][kk];
  1600. if (tibcnt[jj][kk]+crycnt[jj][kk]>=optt) { map2[jj][kk]="s"; }
  1601. }}
  1602. // link up harvs without silos with 3 touch silos, or remove harv if not possible
  1603. for (jj=0;jj<8;jj++)
  1604. { for (kk=0;kk<9;kk++)
  1605. { if (map2[jj][kk]==="h" || map2[jj][kk]==="n")
  1606. { var tmp=this.countadj(map2,[jj,kk],"s"); var conn=tmp[0]+1;
  1607. if (conn===0)
  1608. { var tmp=this.countadj(totcnt,[jj,kk],3);
  1609. var fn=tmp[0]+1; var bb=tmp[1]; var ind=tmp[2]; var srnd=tmp[3];
  1610. if (fn>0)
  1611. { if (ind.length===1)
  1612. { map2[srnd[ind[0]][0]][srnd[ind[0]][1]]="s"; }
  1613. else
  1614. { //complicate things a bit
  1615. var dconn=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1616. //first figure out all disconnected harvesters left
  1617. for (jj1=0;jj1<8;jj1++)
  1618. { for (kk1=0;kk1<9;kk1++)
  1619. { if (map2[jj1][kk1]==="h" || map2[jj1][kk1]==="n")
  1620. { var tmp=this.countadj(map2,[jj1,kk1],"s");
  1621. var conn2=tmp[0]+1;
  1622. if (conn2===0)
  1623. { dconn[jj1][kk1]=1; }
  1624. }
  1625. }
  1626. }
  1627. //then count locations touching max number of disconnected harvesters
  1628. var cntdcnt=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1629. for (jj1=0;jj1<8;jj1++)
  1630. { for (kk1=0;kk1<9;kk1++)
  1631. { var tmp=this.countadj(dconn,[jj1,kk1],1);
  1632. cntdcnt[jj1][kk1]=tmp[0]+1;
  1633. }
  1634. }
  1635. var ttm=-10;
  1636. for (var ij=0;ij<ind.length;ij++)
  1637. { if (cntdcnt[srnd[ind[ij]][0]][srnd[ind[ij]][1]]>ttm)
  1638. { ttm=cntdcnt[srnd[ind[ij]][0]][srnd[ind[ij]][1]];
  1639. var ind1=srnd[ind[ij]][0];
  1640. var ind2=srnd[ind[ij]][1];
  1641. }
  1642. }
  1643. map2[ind1][ind2]="s";
  1644. }
  1645. }
  1646. else { map2[jj][kk]=map[jj][kk]; } //remove harv is not possible to connect
  1647. }
  1648. }
  1649. }
  1650. }
  1651. if (optt>3)
  1652. { //now some 3-touch silos might still be redundant
  1653. for (jj=0;jj<8;jj++)
  1654. { for (kk=0;kk<9;kk++)
  1655. { if (map2[jj][kk]==="s" && totcnt[jj][kk]===3) //if it's a 3-touch silo
  1656. { //test if removing it leaves any harvesters disconnected
  1657. var map3=[[".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."]];
  1658. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) { map3[jj2][kk2]=map2[jj2][kk2];}}
  1659. map3[jj][kk]=".";
  1660. //first figure out all disconnected harvesters left
  1661. var dconn=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1662. //first figure out all disconnected harvesters left
  1663. var ssm=0;
  1664. for (jj1=0;jj1<8;jj1++)
  1665. { for (kk1=0;kk1<9;kk1++)
  1666. { if (map2[jj1][kk1]==="h" || map2[jj1][kk1]==="n")
  1667. { var tmp=this.countadj(map3,[jj1,kk1],"s");
  1668. var conn2=tmp[0]+1;
  1669. if (conn2===0) { dconn[jj1][kk1]=1; }
  1670. }
  1671. ssm=ssm+dconn[jj1][kk1];
  1672. }
  1673. }
  1674. if (ssm===0) //no new disconnected harvesters
  1675. { //then worth removing this harvester
  1676. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) { map2[jj2][kk2]=map3[jj2][kk2];}}
  1677. }
  1678. }
  1679. }
  1680. }
  1681. }
  1682. // find best place for accumulators
  1683. var acm=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1684. for (jj=0;jj<8;jj++)
  1685. { for (kk=0;kk<9;kk++)
  1686. { if (map2[jj][kk]===".")
  1687. { var tmp=this.countadj(map2,[jj,kk],".");
  1688. acm[jj][kk]=tmp[0]+1;
  1689. }
  1690. else
  1691. { acm[jj][kk]=0;
  1692. }
  1693. }
  1694. }
  1695. //this lists all accumulator spots with 7 or 8 touches
  1696. var loc=new Array();
  1697. var ijkk=-1;
  1698. for (jj=0;jj<8;jj++)
  1699. { for (kk=0;kk<9;kk++)
  1700. { if (acm[jj][kk]>=6)
  1701. { ijkk++;
  1702. loc[ijkk]=[jj,kk];
  1703. }
  1704. }
  1705. }
  1706. //console.log(acm)
  1707. var cmbind=new Array();
  1708. var ijkk=-1;
  1709. if (acnum===1)
  1710. { for (jj=0;jj<loc.length;jj++)
  1711. { ijkk++;
  1712. cmbind[ijkk]=[jj];
  1713. }
  1714. }
  1715. else
  1716. { for (jj=0;jj<loc.length;jj++)
  1717. { for (kk=jj+1;kk<loc.length;kk++)
  1718. { ijkk++;
  1719. cmbind[ijkk]=[jj,kk];
  1720. }
  1721. }
  1722. }
  1723. //console.log(loc)
  1724. var crycnt_=new Array(); var ppcnt_=new Array(); var pptch_=new Array(); var refcnt=new Array(); var mapss_=new Array();
  1725. for (var ijk=0;ijk<cmbind.length;ijk++)
  1726. { //temporary map
  1727. var map3=[[".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."]];
  1728. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) { map3[jj2][kk2]=map2[jj2][kk2];}}
  1729.  
  1730. for (var woq=0;woq<cmbind[ijk].length;woq++)
  1731. { map3[loc[cmbind[ijk][woq]][0]][loc[cmbind[ijk][woq]][1]]="a"; } //place both accums
  1732. //place all powerplants
  1733. crycnt_[ijk]=0; ppcnt_[ijk]=0;
  1734. for (jj=0;jj<8;jj++)
  1735. { for (kk=0;kk<9;kk++)
  1736. { if (map3[jj][kk]===".")
  1737. { var tmp=this.countadj(map3,[jj,kk],"a");
  1738. wp=tmp[0]+1;
  1739. if (wp>0)
  1740. { var tmp=this.countadj(map,[jj,kk],"c");
  1741. crycnt_[ijk]=crycnt_[ijk]+tmp[0]+1; //count crystal touches
  1742. ppcnt_[ijk]=ppcnt_[ijk]+1; //count pplants
  1743. map3[jj][kk]="p"; //place power plant
  1744. }
  1745. }
  1746. }
  1747. }
  1748. pptch_[ijk]=0;
  1749. for (var woq=0;woq<cmbind[ijk].length;woq++)
  1750. { var tmp=this.countadj(map3,[loc[cmbind[ijk][woq]][0],loc[cmbind[ijk][woq]][1]],"p");
  1751. pptch_[ijk]=pptch_[ijk]+tmp[0]+1;
  1752. }
  1753. var ttcnt=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1754. for (jj=0;jj<8;jj++)
  1755. { for (kk=0;kk<9;kk++)
  1756. { if (map3[jj][kk]===".")
  1757. { var tmp=this.countadj(map3,[jj,kk],"t");
  1758. ttcnt[jj][kk]=tmp[0]+1;
  1759. }
  1760. }
  1761. }
  1762. refcnt[ijk]=0; //also take into account potential future refineries one might place
  1763. for (jj=0;jj<8;jj++)
  1764. { for (kk=0;kk<9;kk++)
  1765. { if (map3[jj][kk]==="p")
  1766. { var tmp1=this.countadj(ttcnt,[jj,kk],1);
  1767. var tmp2=this.countadj(ttcnt,[jj,kk],2);
  1768. var tmp3=this.countadj(ttcnt,[jj,kk],3);
  1769. refcnt[ijk]=refcnt[ijk]+tmp1[0]+1+tmp2[0]+1+tmp3[0]+1;
  1770. }
  1771. }
  1772. }
  1773. mapss_[ijk]=[[".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."]];
  1774. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) { mapss_[ijk][jj2][kk2]=map3[jj2][kk2];}}
  1775. }
  1776. //now choose best setup
  1777. //1. max pp touches net of number of power plants
  1778. //2. among equals, minimum power plants
  1779. //3. among equals, maximum pp crystal touches + discounted refinery touches
  1780. var ttt=new Array(); var ttt2=new Array(); var w0e=-10; var dcnt=0.1;
  1781. for (var ikj=0;ikj<cmbind.length;ikj++)
  1782. { ttt[ikj]=pptch_[ikj]-opta*ppcnt_[ikj];
  1783. ttt2[ikj]=crycnt_[ikj]+refcnt[ikj]*dcnt;
  1784. if (ttt[ikj]>w0e){ w0e=ttt[ikj]; }
  1785. }
  1786. var inndx=new Array(); var owl=-1;
  1787. for (var ikj=0;ikj<cmbind.length;ikj++)
  1788. { if (ttt[ikj]===w0e){ owl++; inndx[owl]=ikj; }
  1789. }
  1790. w0e=-10;
  1791. for (var ikj=0;ikj<inndx.length;ikj++)
  1792. { if (ttt2[inndx[ikj]]>w0e){ w0e=ttt2[inndx[ikj]]; owl=inndx[ikj]; }
  1793. }
  1794. //console.log(mapss_);
  1795. //console.log(owl);
  1796. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) { map2[jj2][kk2]=mapss_[owl][jj2][kk2];}}
  1797. //now fill in extra 3-touch tibs if wanted
  1798. if (optt===3.5)
  1799. { for (jj=0;jj<8;jj++)
  1800. { for (kk=0;kk<9;kk++)
  1801. { if (totcnt[jj][kk]>=3 && tibcnt[jj][kk]>0)
  1802. { map2[jj][kk]="s";
  1803. }
  1804. }
  1805. }
  1806. }
  1807. if (addref!==0)
  1808. { //add refineries and extra power plants in the remaining spots
  1809. var ocpd=0;
  1810. for (jj=0;jj<8;jj++)
  1811. { for (kk=0;kk<9;kk++)
  1812. { if (map2[jj][kk]!=="." && map2[jj][kk]!=="t" && map2[jj][kk]!=="c" && map2[jj][kk]!=="y")
  1813. { ocpd++;
  1814. }
  1815. }
  1816. }
  1817. var slots=41-ocpd-4;
  1818. var sltlft=slots+0;
  1819. //3touches and 2touches that already have pps
  1820. var rfnrtc=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1821. for (jj=0;jj<8;jj++)
  1822. { for (kk=0;kk<9;kk++)
  1823. { if (map2[jj][kk]===".") { var tmp=this.countadj(map,[jj,kk],"t"); rfnrtc[jj][kk]=tmp[0]+1; }
  1824. else { rfnrtc[jj][kk]=0; }
  1825. var tmp=this.countadj(map2,[jj,kk],"p");
  1826. if ((tmp[0]+1)>0)
  1827. { rfnrtc[jj][kk]=rfnrtc[jj][kk]+0.5;
  1828. if (rfnrtc[jj][kk]===2.5) { rfnrtc[jj][kk]=3.25; }
  1829. }
  1830. }
  1831. }
  1832.  
  1833. var b=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1834. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) { b[jj2][kk2]=rfnrtc[jj2][kk2];}}
  1835. var marfn=this.maxx(b);
  1836. while (marfn>3 && sltlft>0)
  1837. { for (var jj=0;jj<8;jj++)
  1838. { for (var kk=0;kk<9;kk++)
  1839. { if (rfnrtc[jj][kk]===marfn && sltlft>0)
  1840. { rfnrtc[jj][kk]=0;
  1841. sltlft=sltlft-1;
  1842. map2[jj][kk]="r";
  1843. }
  1844. }
  1845. }
  1846. var b=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1847. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) { b[jj2][kk2]=rfnrtc[jj2][kk2];}}
  1848. var marfn=this.maxx(b);
  1849. }
  1850. //now find all the 2touches and 3touches and minimum powerplants that can serve them
  1851. var cntn=1;
  1852. while (sltlft>1 && cntn===1)
  1853. { var rfnrtc=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1854. for (var jj=0;jj<8;jj++)
  1855. { for (var kk=0;kk<9;kk++)
  1856. { if (map2[jj][kk]===".")
  1857. { var tmp=this.countadj(map,[jj,kk],"t");
  1858. rfnrtc[jj][kk]=tmp[0]+1;
  1859. }
  1860. else
  1861. { rfnrtc[jj][kk]=0;
  1862. }
  1863. }
  1864. }
  1865. var rfnrpp=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1866. for (jj=0;jj<8;jj++)
  1867. { for (kk=0;kk<9;kk++)
  1868. { if (map2[jj][kk]===".")
  1869. { var tmp3=this.countadj(rfnrtc,[jj,kk],3);
  1870. var tmp2=this.countadj(rfnrtc,[jj,kk],2);
  1871. rfnrpp[jj][kk]=tmp2[0]+1+tmp3[0]+1;
  1872. }
  1873. else
  1874. { rfnrpp[jj][kk]=0;
  1875. }
  1876. }
  1877. }
  1878. var trgt=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1879. var trgt2=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1880. var mm=0;
  1881. var loc=[0,0];
  1882. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) {
  1883. trgt[jj2][kk2]=rfnrpp[jj2][kk2]-rfnrtc[jj2][kk2]; trgt2[jj2][kk2]=rfnrpp[jj2][kk2];
  1884. if (trgt[jj2][kk2]>mm)
  1885. { mm=trgt[jj2][kk2];
  1886. loc=[jj2,kk2];
  1887. }
  1888. }}
  1889. if (mm===0)
  1890. { for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) {
  1891. if (trgt2[jj2][kk2]>mm)
  1892. { mm=trgt2[jj2][kk2];
  1893. loc=[jj2,kk2];
  1894. }
  1895. }}
  1896. if (mm==0) { cntn=0; }
  1897. }
  1898.  
  1899. if (cntn===1)
  1900. { if (sltlft>1)
  1901. { map2[loc[0]][loc[1]]="p";
  1902. sltlft=sltlft-1;
  1903. }
  1904. var tmp=this.countadj(rfnrtc,loc,3);
  1905. var ind3=tmp[2];
  1906. var srnd3=tmp[3];
  1907. for (ii=0;ii<ind3.length;ii++)//ii=1:size(llc,1))
  1908. { if (sltlft>0)
  1909. { map2[srnd3[ind3[ii]][0]][srnd3[ind3[ii]][1]]="r";
  1910. sltlft=sltlft-1;
  1911. }
  1912. }
  1913. var tmp=this.countadj(rfnrtc,loc,2);
  1914. var ind=tmp[2];
  1915. var srnd=tmp[3];
  1916. for (ii=0;ii<ind.length;ii++)//ii=1:size(llc,1))
  1917. { if (sltlft>0)
  1918. { map2[srnd[ind[ii]][0]][srnd[ind[ii]][1]]="r";
  1919. sltlft=sltlft-1;
  1920. }
  1921. }
  1922. }
  1923. }
  1924. //1touches that already have pps
  1925. var rfnrtc=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1926. for (var jj=0;jj<8;jj++)
  1927. { for (var kk=0;kk<9;kk++)
  1928. { if (map2[jj][kk]===".")
  1929. { var tmp=this.countadj(map,[jj,kk],"t");
  1930. rfnrtc[jj][kk]=tmp[0]+1;
  1931. }
  1932. else
  1933. { rfnrtc[jj][kk]=0;
  1934. }
  1935. var tmp=this.countadj(map2,[jj,kk],"p");
  1936. if ((tmp[0]+1)>0 && rfnrtc[jj][kk]>0)
  1937. { rfnrtc[jj][kk]=rfnrtc[jj][kk]+0.5;
  1938. }
  1939. }
  1940. }
  1941. var b=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1942. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) { b[jj2][kk2]=rfnrtc[jj2][kk2];}}
  1943. var marfn=this.maxx(b);
  1944. while (marfn===1.5 && sltlft>0)
  1945. { for (var jj=0;jj<8;jj++)
  1946. { for (var kk=0;kk<9;kk++)
  1947. { if (rfnrtc[jj][kk]===marfn && sltlft>0)
  1948. { rfnrtc[jj][kk]=0;
  1949. sltlft=sltlft-1;
  1950. map2[jj][kk]="r";
  1951. }
  1952. }
  1953. }
  1954. var b=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1955. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) { b[jj2][kk2]=rfnrtc[jj2][kk2];}}
  1956. var marfn=this.maxx(b);
  1957. }
  1958. //0touches with max pp
  1959. var rfnrtc=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1960. for (var jj=0;jj<8;jj++)
  1961. { for (var kk=0;kk<9;kk++)
  1962. { if (map2[jj][kk]===".")
  1963. { var tmp=this.countadj(map2,[jj,kk],"p");
  1964. rfnrtc[jj][kk]=tmp[0]+1;
  1965. }
  1966. else { rfnrtc[jj][kk]=0; }
  1967. }
  1968. }
  1969. var b=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1970. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) { b[jj2][kk2]=rfnrtc[jj2][kk2];}}
  1971. var marfn=this.maxx(b);
  1972. while (marfn>0 && sltlft>0)
  1973. { for (var jj=0;jj<8;jj++)
  1974. { for (var kk=0;kk<9;kk++)
  1975. { if (rfnrtc[jj][kk]===marfn && sltlft>0)
  1976. { rfnrtc[jj][kk]=0;
  1977. sltlft=sltlft-1;
  1978. map2[jj][kk]="r";
  1979. }
  1980. }
  1981. }
  1982. var b=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1983. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) { b[jj2][kk2]=rfnrtc[jj2][kk2];}}
  1984. var marfn=this.maxx(b);
  1985. }
  1986. }
  1987. //remove holders for crys and tib (do not do this!)
  1988. var lvl2=[[0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0 ]];
  1989. var bld2=[[".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".",".","."]];
  1990. var cccnt=0;
  1991. for (jj2=0;jj2<8;jj2++){ for (kk2=0;kk2<9;kk2++) {
  1992. bld2[jj2][kk2]=map2[jj2][kk2];
  1993. if (bld2[jj2][kk2]==="." && cccnt===0)
  1994. {bld2[jj2][kk2]="y"; cccnt++;}
  1995. else if (bld2[jj2][kk2]==="." && cccnt===1)
  1996. {bld2[jj2][kk2]="q"; cccnt++;}
  1997. else if (bld2[jj2][kk2]==="." && cccnt===2)
  1998. {bld2[jj2][kk2]="w"; cccnt++;}
  1999. else if (bld2[jj2][kk2]==="." && cccnt===3)
  2000. {bld2[jj2][kk2]="z"; cccnt++;}
  2001. if (bld2[jj2][kk2]==="." || bld2[jj2][kk2]==="t" || bld2[jj2][kk2]==="c")
  2002. {lvl2[jj2][kk2]=0;}
  2003. else
  2004. {lvl2[jj2][kk2]=12;}
  2005. }}
  2006. return [bld2,lvl2];
  2007. }
  2008.  
  2009.  
  2010.  
  2011.  
  2012.  
  2013. }
  2014. });
  2015.  
  2016. qx.Class.define("Addons.BaseScannerLayout", {
  2017. type : "singleton",
  2018. extend : qx.ui.window.Window,
  2019. construct : function () {
  2020. try {
  2021. this.base(arguments);
  2022. console.info("Addons.BaseScannerLayout " + window.__msbs_version);
  2023. this.setWidth(820);
  2024. this.setHeight(400);
  2025. this.setContentPadding(10);
  2026. this.setShowMinimize(false);
  2027. this.setShowMaximize(true);
  2028. this.setShowClose(true);
  2029. this.setResizable(true);
  2030. this.setAllowMaximize(true);
  2031. this.setAllowMinimize(false);
  2032. this.setAllowClose(true);
  2033. this.setShowStatusbar(false);
  2034. this.setDecorator(null);
  2035. this.setPadding(10);
  2036. this.setLayout(new qx.ui.layout.Grow());
  2037.  
  2038. this.ZW = [];
  2039. this.removeAll();
  2040. this.ZZ = new qx.ui.container.Scroll();
  2041. this.ZY = new qx.ui.container.Composite(new qx.ui.layout.Flow());
  2042. this.add(this.ZZ, {
  2043. flex : 3
  2044. });
  2045. this.ZZ.add(this.ZY);
  2046. //this.FO();
  2047. } catch (e) {
  2048. console.debug("Addons.BaseScannerLayout.construct: ", e);
  2049. }
  2050. },
  2051. members : {
  2052. ZW : null,
  2053. ZZ : null,
  2054. ZY : null,
  2055. ZX : null,
  2056. openWindow : function (title) {
  2057. try {
  2058. this.setCaption(title);
  2059. if (this.isVisible()) {
  2060. this.close();
  2061. } else {
  2062. this.open();
  2063. this.moveTo(100, 100);
  2064. this.FO();
  2065. }
  2066. } catch (e) {
  2067. console.log("Addons.BaseScannerLayout.openWindow: ", e);
  2068. }
  2069. },
  2070. FO : function () {
  2071. var ZM = window.Addons.BaseScannerGUI.getInstance().ZM;
  2072. var ZE = window.Addons.BaseScannerGUI.getInstance().ZE;
  2073. this.ZX = [];
  2074. var selectedtype = window.Addons.BaseScannerGUI.getInstance().ZJ.getSelection()[0].getModel();
  2075. //console.log("FO: " , ZM.length);
  2076. var rowDataLine = null;
  2077. if (ZE == null) {
  2078. console.info("ZE null: ");
  2079. return;
  2080. }
  2081. //console.log("FO: " , ZM);
  2082. this.ZW = [];
  2083. var id;
  2084. var i;
  2085. var x;
  2086. var y;
  2087. var a;
  2088. for (id in ZM) {
  2089. for (i = 0; i < ZE.length; i++) {
  2090. if (ZE[i][0] == id) {
  2091. rowDataLine = ZE[i];
  2092. }
  2093. }
  2094.  
  2095. if (rowDataLine == null) {
  2096. continue;
  2097. }
  2098. //console.log("ST",selectedtype,rowDataLine[10]);
  2099. if (selectedtype > 4 && selectedtype < 8) {
  2100. if (selectedtype != rowDataLine[10]) {
  2101. continue;
  2102. }
  2103. } else {
  2104. continue;
  2105. }
  2106.  
  2107. posData = rowDataLine[3];
  2108. if (posData != null && posData.split(':').length == 2) {
  2109. posX = parseInt(posData.split(':')[0]);
  2110. posY = parseInt(posData.split(':')[1]);
  2111. }
  2112. var st = '<table border="2" cellspacing="0" cellpadding="0">';
  2113. var link = rowDataLine[2] + " - " + rowDataLine[3];
  2114. st = st + '<tr><td colspan="9"><font color="#FFF">' + link + '</font></td></tr>';
  2115. for (y = 0; y < 8; y++) {
  2116. st = st + "<tr>";
  2117. for (x = 0; x < 9; x++) {
  2118. var img = "";
  2119. var res = ZM[id][x][y];
  2120. //console.log("Res ",res);
  2121. switch (res == undefined ? 0 : res) {
  2122. case 2:
  2123. //console.log("Tiberium " , MT_Base.images[MaelstromTools.Statics.Tiberium] );
  2124. img = '<img width="14" height="14" src="' + MT_Base.images[MaelstromTools.Statics.Tiberium] + '">';
  2125. break;
  2126. case 1:
  2127. //console.log("Crystal ");
  2128. img = '<img width="14" height="14" src="' + MT_Base.images[MaelstromTools.Statics.Crystal] + '">';
  2129. break;
  2130. default:
  2131. img = '<img width="14" height="14" src="' + MT_Base.images["Emptypixels"] + '">';
  2132. break;
  2133. }
  2134. st = st + "<td>" + img + "</td>";
  2135. }
  2136. st = st + "</tr>";
  2137. }
  2138. st = st + "</table>";
  2139. //console.log("setWidgetLabels ", st);
  2140. var l = new qx.ui.basic.Label().set({
  2141. backgroundColor : "#303030",
  2142. value : st,
  2143. rich : true
  2144. });
  2145. l.cid = id;
  2146. this.ZX.push(id);
  2147. l.addListener("click", function (e) {
  2148.  
  2149. //console.log("clickid ", this.cid, );
  2150. //webfrontend.gui.UtilView.openCityInMainWindow(this.cid);
  2151. var bk = qx.core.Init.getApplication();
  2152. bk.getBackgroundArea().closeCityInfo();
  2153. bk.getPlayArea().setView(ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupDefense, this.cid, 0, 0);
  2154. var q = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity();
  2155. if (q != null)
  2156. q.get_CityArmyFormationsManager().set_CurrentTargetBaseId(this.cid);
  2157.  
  2158. });
  2159. l.setReturnValue = id;
  2160. this.ZW.push(l);
  2161. }
  2162. this.ZY.removeAll();
  2163. var b = 0;
  2164. var c = 0;
  2165. //console.log("this.ZW.length",this.ZW.length);
  2166. for (a = 0; a < this.ZW.length; a++) {
  2167. this.ZY.add(this.ZW[a], {
  2168. row : b,
  2169. column : c
  2170. });
  2171. c++;
  2172. if (c > 4) {
  2173. c = 0;
  2174. b++;
  2175. }
  2176. }
  2177. }
  2178. }
  2179. });
  2180.  
  2181. qx.Class.define("Addons.LocalStorage", {
  2182. type : "static",
  2183. extend : qx.core.Object,
  2184. statics : {
  2185. isSupported : function () {
  2186. return typeof(localStorage) !== "undefined";
  2187. },
  2188. isdefined : function (key) {
  2189. return (localStorage[key] !== "undefined" && localStorage[key] != null);
  2190. },
  2191. isdefineddata : function (data, key) {
  2192. return (data[key] !== "undefined" && data[key] != null);
  2193. },
  2194. setglobal : function (key, value) {
  2195. try {
  2196. if (Addons.LocalStorage.isSupported()) {
  2197. localStorage[key] = JSON.stringify(value);
  2198. }
  2199. } catch (e) {
  2200. console.debug("Addons.LocalStorage.setglobal: ", e);
  2201. }
  2202. },
  2203. getglobal : function (key, defaultValue) {
  2204. try {
  2205. if (Addons.LocalStorage.isSupported()) {
  2206. if (Addons.LocalStorage.isdefined(key)) {
  2207. return JSON.parse(localStorage[key]);
  2208. }
  2209. }
  2210. } catch (e) {
  2211. console.log("Addons.LocalStorage.getglobal: ", e);
  2212. }
  2213. return defaultValue;
  2214. },
  2215. setserver : function (key, value) {
  2216. try {
  2217. if (Addons.LocalStorage.isSupported()) {
  2218. var sn = ClientLib.Data.MainData.GetInstance().get_Server().get_Name();
  2219. var data;
  2220. if (Addons.LocalStorage.isdefined(sn)) {
  2221. try {
  2222. data = JSON.parse(localStorage[sn]);
  2223. if (!(typeof data === "object")) {
  2224. data = {};
  2225. console.debug("LocalStorage data from server not null, but not object");
  2226. }
  2227. } catch (e) {
  2228. console.debug("LocalStorage data from server not null, but parsererror", e);
  2229. data = {};
  2230. }
  2231. } else {
  2232. data = {};
  2233. }
  2234. data[key] = value;
  2235. localStorage[sn] = JSON.stringify(data);
  2236. }
  2237. } catch (e) {
  2238. console.debug("Addons.LocalStorage.setserver: ", e);
  2239. }
  2240. },
  2241. getserver : function (key, defaultValue) {
  2242. try {
  2243. if (Addons.LocalStorage.isSupported()) {
  2244. var sn = ClientLib.Data.MainData.GetInstance().get_Server().get_Name();
  2245. if (Addons.LocalStorage.isdefined(sn)) {
  2246. var data = JSON.parse(localStorage[sn]);
  2247. if (Addons.LocalStorage.isdefineddata(data, key)) {
  2248. return data[key];
  2249. }
  2250. }
  2251. }
  2252. } catch (e) {
  2253. console.log("Addons.LocalStorage.getserver: ", e);
  2254. }
  2255. return defaultValue;
  2256. }
  2257. }
  2258. });
  2259.  
  2260. if(typeof Addons.Language === 'undefined'){
  2261. qx.Class.define("Addons.Language", {
  2262. type : "singleton",
  2263. extend : qx.core.Object,
  2264. members : {
  2265. d : {},
  2266. debug : false,
  2267. addtranslateobj : function (o) {
  2268. if ( o.hasOwnProperty("main") ){
  2269. this.d[o.main.toString()] = o;
  2270. if(this.debug){
  2271. console.log("Translate Added ", o.main.toString() );
  2272. }
  2273. delete o.main;
  2274. } else {
  2275. console.debug("Addons.Language.addtranslateobj main not define");
  2276. }
  2277. },
  2278. get : function (t) {
  2279. var locale = qx.locale.Manager.getInstance().getLocale();
  2280. var loc = locale.split("_")[0];
  2281. if ( this.d.hasOwnProperty(t) ){
  2282. if ( this.d[t].hasOwnProperty(loc) ){
  2283. return this.d[t][loc];
  2284. }
  2285. }
  2286. if(this.debug){
  2287. console.debug("Addons.Language.get ", t, " not translate for locale ", loc);
  2288. }
  2289. return t;
  2290. }
  2291. }
  2292. });
  2293. }
  2294.  
  2295. qx.Class.define("qx.ui.table.cellrenderer.Replace", {
  2296. extend : qx.ui.table.cellrenderer.Default,
  2297.  
  2298. properties : {
  2299.  
  2300. replaceMap : {
  2301. check : "Object",
  2302. nullable : true,
  2303. init : null
  2304. },
  2305. replaceFunction : {
  2306. check : "Function",
  2307. nullable : true,
  2308. init : null
  2309. }
  2310. },
  2311. members : {
  2312. // overridden
  2313. _getContentHtml : function (cellInfo) {
  2314. var value = cellInfo.value;
  2315. var replaceMap = this.getReplaceMap();
  2316. var replaceFunc = this.getReplaceFunction();
  2317. var label;
  2318.  
  2319. // use map
  2320. if (replaceMap) {
  2321. label = replaceMap[value];
  2322. if (typeof label != "undefined") {
  2323. cellInfo.value = label;
  2324. return qx.bom.String.escape(this._formatValue(cellInfo));
  2325. }
  2326. }
  2327.  
  2328. // use function
  2329. if (replaceFunc) {
  2330. cellInfo.value = replaceFunc(value);
  2331. }
  2332. return qx.bom.String.escape(this._formatValue(cellInfo));
  2333. },
  2334.  
  2335. addReversedReplaceMap : function () {
  2336. var map = this.getReplaceMap();
  2337. for (var key in map) {
  2338. var value = map[key];
  2339. map[value] = key;
  2340. }
  2341. return true;
  2342. }
  2343. }
  2344. });
  2345.  
  2346.  
  2347. console.info("Maelstrom_Basescanner initalisiert");
  2348.  
  2349. var T = Addons.Language.getInstance();
  2350. T.debug = false;
  2351. T.addtranslateobj( {main:"Point", de: "Position", pt: "Position", fr: "Position"} );
  2352. T.addtranslateobj( {main:"BaseScanner Overview", de: "Basescanner Übersicht", pt: "Visão geral do scanner de base", fr: "Aperçu du scanner de base"} );
  2353. T.addtranslateobj( {main:"Scan", de: "Scannen", pt: "Esquadrinhar", fr: "Balayer"} );
  2354. T.addtranslateobj( {main:"Location", de: "Lage", pt: "localização", fr: "Emplacement"} );
  2355. T.addtranslateobj( {main:"Player", de: "Spieler", pt: "Jogador", fr: "Joueur"} );
  2356. T.addtranslateobj( {main:"Bases", de: "Bases", pt: "Bases", fr: "Bases"} );
  2357. T.addtranslateobj( {main:"Camp,Outpost", de: "Lager,Vorposten", pt: "Camp,posto avançado", fr: "Camp,avant-poste"} );
  2358. T.addtranslateobj( {main:"Camp", de: "Lager", pt: "Camp", fr: "Camp"} );
  2359. T.addtranslateobj( {main:"Outpost", de: "Vorposten", pt: "posto avançado", fr: "avant-poste"} );
  2360. T.addtranslateobj( {main:"BaseScanner Layout", de: "BaseScanner Layout", pt: "Layout da Base de Dados de Scanner", fr: "Mise scanner de base"} );
  2361. T.addtranslateobj( {main:"Show Layouts", de: "Layouts anzeigen", pt: "Mostrar Layouts", fr: "Voir Layouts"} );
  2362. T.addtranslateobj( {main:"Building state", de: "Gebäudezustand", pt: "construção do Estado", fr: "construction de l'État"} );
  2363. T.addtranslateobj( {main:"Defense state", de: "Verteidigungszustand", pt: "de Defesa do Estado", fr: "défense de l'Etat"} );
  2364. T.addtranslateobj( {main:"CP", de: "KP", pt: "CP", fr: "CP"} );
  2365. T.addtranslateobj( {main:"CP Limit", de: "KP begrenzen", pt: "CP limitar", fr: "CP limiter"} );
  2366. T.addtranslateobj( {main:"min Level", de: "min. Level", pt: "nível mínimo", fr: "niveau minimum"} );
  2367. T.addtranslateobj( {main:"clear Cache", de: "Cache leeren", pt: "limpar cache", fr: "vider le cache"} );
  2368. T.addtranslateobj( {main:"Only center on World", de: "Nur auf Welt zentrieren", pt: "Único centro no Mundial", fr: "Seul centre sur World"} );
  2369. T.addtranslateobj( {main:"base set up at", de: "Basis errichtbar", pt: "base de configurar a", fr: "mis en place à la base"} );
  2370. T.addtranslateobj( {main:"Infantry", de: "Infanterie", pt: "Infantaria", fr: "Infanterie"} );
  2371. T.addtranslateobj( {main:"Vehicle", de: "Fahrzeuge", pt: "Veículos", fr: "Vehicule"} );
  2372. T.addtranslateobj( {main:"Aircraft", de: "Flugzeuge", pt: "Aeronaves", fr: "Aviation"} );
  2373. T.addtranslateobj( {main:"Tiberium", de: "Tiberium", pt: "Tibério", fr: "Tiberium"} );
  2374. T.addtranslateobj( {main:"Crystal", de: "Kristalle", pt: "Cristal", fr: "Cristal"} );
  2375. T.addtranslateobj( {main:"Power", de: "Strom", pt: "Potência", fr: "Energie"} );
  2376. T.addtranslateobj( {main:"Dollar", de: "Credits", pt: "Créditos", fr: "Crédit"} );
  2377. T.addtranslateobj( {main:"Research", de: "Forschung", pt: "Investigação", fr: "Recherche"} );
  2378. T.addtranslateobj( {main:"-----", de: "--", pt: "--", fr: "--"} );
  2379.  
  2380.  
  2381.  
  2382.  
  2383. var MT_Lang = null;
  2384. var MT_Cache = null;
  2385. var MT_Base = null;
  2386. var fileManager = null;
  2387. var lastid = 0;
  2388. var countlastidchecked = 0;
  2389. fileManager = ClientLib.File.FileManager.GetInstance();
  2390. MT_Lang = window.MaelstromTools.Language.getInstance();
  2391. MT_Cache = window.MaelstromTools.Cache.getInstance();
  2392. MT_Base = window.MaelstromTools.Base.getInstance();
  2393.  
  2394. MT_Base.createNewImage("BaseScanner", "ui/icons/icon_item.png", fileManager);
  2395. MT_Base.createNewImage("Emptypixels", "ui/menues/main_menu/misc_empty_pixel.png", fileManager);
  2396. var openBaseScannerOverview = MT_Base.createDesktopButton(T.get("BaseScanner Overview") + "version " + window.__msbs_version, "BaseScanner", false, MT_Base.desktopPosition(2));
  2397. openBaseScannerOverview.addListener("execute", function () {
  2398. Addons.BaseScannerGUI.getInstance().openWindow(T.get("BaseScanner Overview") + " version " + window.__msbs_version);
  2399. }, this);
  2400. Addons.BaseScannerGUI.getInstance().addListener("close", Addons.BaseScannerGUI.getInstance().FN, Addons.BaseScannerGUI.getInstance());
  2401. //this.addListener("resize", function(){ }, this );
  2402.  
  2403. MT_Base.addToMainMenu("BaseScanner", openBaseScannerOverview);
  2404.  
  2405. if(typeof Addons.AddonMainMenu !== 'undefined'){
  2406. var addonmenu = Addons.AddonMainMenu.getInstance();
  2407. addonmenu.AddMainMenu("Basescanner", function () {
  2408. Addons.BaseScannerGUI.getInstance().openWindow(T.get("BaseScanner Overview") + " version " + window.__msbs_version);
  2409. },"ALT+B");
  2410. }
  2411.  
  2412. }
  2413.  
  2414. function getResourcesPart(cityEntities) {
  2415. try {
  2416. var loot = [0, 0, 0, 0, 0, 0, 0, 0];
  2417. if (cityEntities == null) {
  2418. return loot;
  2419. }
  2420.  
  2421. for (var i in cityEntities) {
  2422. var cityEntity = cityEntities[i];
  2423. var unitLevelRequirements = MaelstromTools.Wrapper.GetUnitLevelRequirements(cityEntity);
  2424.  
  2425. for (var x = 0; x < unitLevelRequirements.length; x++) {
  2426. loot[unitLevelRequirements[x].Type] += unitLevelRequirements[x].Count * cityEntity.get_HitpointsPercent();
  2427. if (cityEntity.get_HitpointsPercent() < 1.0) {
  2428. // destroyed
  2429.  
  2430. }
  2431. }
  2432. }
  2433. return loot;
  2434. } catch (e) {
  2435. console.debug("MaelstromTools_Basescanner getResourcesPart", e);
  2436. }
  2437. }
  2438.  
  2439. function objfnkstrON(obj) {
  2440. var key;
  2441. for (key in obj) {
  2442. if (typeof(obj[key]) == "function") {
  2443. var s = obj[key].toString();
  2444. console.debug(key, s);
  2445. //var protostring = s.replace(/\s/gim, "");
  2446. //console.log(key, protostring);
  2447. }
  2448. }
  2449. }
  2450.  
  2451. function foundfnkstring(obj, redex, objname, n) {
  2452. var redexfounds = [];
  2453. var s = obj.toString();
  2454. var protostring = s.replace(/\s/gim, "");
  2455. redexfounds = protostring.match(redex);
  2456. var i;
  2457. for (i = 1; i < (n + 1); i++) {
  2458. if (redexfounds != null && redexfounds[i].length == 6) {
  2459. console.debug(objname, i, redexfounds[i]);
  2460. } else if (redexfounds != null && redexfounds[i].length > 0) {
  2461. console.warn(objname, i, redexfounds[i]);
  2462. } else {
  2463. console.error("Error - ", objname, i, "not found");
  2464. console.warn(objname, protostring);
  2465. }
  2466. }
  2467. return redexfounds;
  2468. }
  2469.  
  2470. function MaelstromTools_Basescanner_checkIfLoaded() {
  2471. try {
  2472. if (typeof qx != 'undefined' && typeof MaelstromTools != 'undefined') {
  2473. createMaelstromTools_Basescanner();
  2474. } else {
  2475. window.setTimeout(MaelstromTools_Basescanner_checkIfLoaded, 1000);
  2476. }
  2477. } catch (e) {
  2478. console.debug("MaelstromTools_Basescanner_checkIfLoaded: ", e);
  2479. }
  2480. }
  2481. if (/commandandconquer\.com/i.test(document.domain)) {
  2482. window.setTimeout(MaelstromTools_Basescanner_checkIfLoaded, 10000);
  2483. }
  2484. };
  2485. try {
  2486. var MaelstromScript_Basescanner = document.createElement("script");
  2487. MaelstromScript_Basescanner.innerHTML = "(" + MaelstromTools_Basescanner.toString() + ")();";
  2488. MaelstromScript_Basescanner.type = "text/javascript";
  2489. if (/commandandconquer\.com/i.test(document.domain)) {
  2490. document.getElementsByTagName("head")[0].appendChild(MaelstromScript_Basescanner);
  2491. }
  2492. } catch (e) {
  2493. console.debug("MaelstromTools_Basescanner: init error: ", e);
  2494. }
  2495. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement