CENTER DRIVEN Command & Conquer TA World Map

Creates a detailed map of bases and pois of the alliance and enemies.

当前为 2014-08-12 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name CENTER DRIVEN Command & Conquer TA World Map
  3. // @description Creates a detailed map of bases and pois of the alliance and enemies.
  4. // @namespace https://prodgame*.alliances.commandandconquer.com/*/index.aspx*
  5. // @include https://prodgame*.alliances.commandandconquer.com/*/index.aspx*
  6. // @version 1.5 BETA
  7. // @grant none
  8. // @author UPDATED by XDAAST | Orinially by zdoom
  9. // ==/UserScript==
  10.  
  11. (function(){
  12.  
  13. function create_cdccta_map_class()
  14. {
  15. qx.Class.define("cdccta_map",
  16. {
  17. type: "singleton",
  18. extend: qx.core.Object,
  19. construct: function()
  20. {
  21. try
  22. {
  23. var root = this;
  24. var mapButton = new qx.ui.form.Button('CD World Map').set({ enabled: false });
  25. var app = qx.core.Init.getApplication();
  26. var optionsBar = app.getOptionsBar().getLayoutParent();
  27. this.__mapButton = mapButton;
  28. optionsBar.getChildren()[0].getChildren()[2].addAt(mapButton,1);
  29. var onReady = function()
  30. {
  31. console.log('checking if data is ready');
  32. var alliance = ClientLib.Data.MainData.GetInstance().get_Alliance().get_Relationships;
  33. var world = ClientLib.Data.MainData.GetInstance().get_World();
  34. var endGame = ClientLib.Data.MainData.GetInstance().get_EndGame().get_Hubs().d;
  35. var command = ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand;
  36. var delegate = phe.cnc.Util.createEventDelegate;
  37. if(!!alliance && !!world && !!command && !!delegate && !!endGame)
  38. {
  39. var worldWidth = world.get_WorldWidth();
  40. if(!worldWidth) return;
  41. var factor = 500 / worldWidth;
  42. var hubs = [], fortress = [];
  43. for (var index in endGame)
  44. {
  45. var currentHub = endGame[index];
  46. if (currentHub.get_Type() == 1) hubs.push([(currentHub.get_X() + 2) * factor, (currentHub.get_Y() + 2) * factor]);
  47. if (currentHub.get_Type() == 3) fortress = [(currentHub.get_X() + 2) * factor, (currentHub.get_Y() + 2) * factor];
  48. }
  49. if (hubs.length > 0)
  50. {
  51. timer.stop();
  52. root.__factor = factor;
  53. root.__endGame['hubs'] = hubs;
  54. root.__endGame['fortress'] = fortress;
  55. root.__init();
  56. }
  57. console.log(hubs);
  58. }
  59. console.log(!!alliance, !!world, !!command, !!delegate, !!endGame);
  60. };
  61. var timer = new qx.event.Timer(1000);
  62. timer.addListener('interval', onReady, this);
  63. timer.start();
  64. }
  65. catch(e)
  66. {
  67. console.log(e.toString());
  68. }
  69. console.log('cdccta_map initialization completed');
  70. },
  71. destruct: function(){},
  72. members:
  73. {
  74. __mapButton: null,
  75. __allianceExist: null,
  76. __allianceName: null,
  77. __allianceId: null,
  78. __allianceHasRelations: false,
  79. __defaultAlliances: null,
  80. __selectedAlliances: null,
  81. __data: null,
  82. __totalProcesses: null,
  83. __completedProcesses: 0,
  84. __endGame: {},
  85. __isLoading: false,
  86. __factor: null,
  87. __init: function()
  88. {
  89. try
  90. {
  91. var root = this;
  92. var data = ClientLib.Data.MainData.GetInstance();
  93. var alliance_data = data.get_Alliance();
  94. var alliance_exists = alliance_data.get_Exists();
  95. if(alliance_exists)
  96. {
  97. var alliance_name = alliance_data.get_Name();
  98. var alliance_id = alliance_data.get_Id();
  99. var alliance_relations = alliance_data.get_Relationships();
  100. this.__allianceExist = true;
  101. this.__allianceId = alliance_id;
  102. this.__allianceName = alliance_name;
  103. var selectedAlliancesList = [];
  104. selectedAlliancesList[0] = [alliance_id, 'alliance', alliance_name, 0];
  105. if (alliance_relations != null)
  106. {
  107. this.__allianceHasRelations = true;
  108. alliance_relations.map(function(x)
  109. {
  110. var type = x.Relationship, id = x.OtherAllianceId, name = x.OtherAllianceName;
  111. if ((type == 3) && (selectedAlliancesList.length < 9)) selectedAlliancesList.push([id, 'enemy', name, 0]);
  112. });
  113. }
  114. this.__defaultAlliances = selectedAlliancesList;
  115. }
  116. else
  117. {
  118. this.__allianceExist = false;
  119. }
  120. if (typeof(Storage) !== 'undefined' && typeof(localStorage.cdccta_map_settings) !== 'undefined')
  121. {
  122. this.__selectedAlliances = JSON.parse(localStorage.cdccta_map_settings);
  123. }
  124. this.__mapButton.setEnabled(true);
  125. this.__mapButton.addListener('execute', function()
  126. {
  127. root.getData();
  128. cdccta_map.container.getInstance().open(1);
  129. }, this);
  130. }
  131. catch(e)
  132. {
  133. console.log(e.toString());
  134. }
  135. },
  136. getData: function()
  137. {
  138. if (this.__isLoading === true) return;
  139. this.__isLoading = true;
  140. var arr = (this.__selectedAlliances == null) ? this.__defaultAlliances : this.__selectedAlliances;
  141. if(arr != null)
  142. {
  143. this.__data = [];
  144. this.__totalProcesses = arr.length;
  145. for(var i = 0; i < arr.length; i++)
  146. {
  147. this.__getAlliance(arr[i][0], arr[i][1], arr[i][3]);
  148. }
  149. }
  150. },
  151. __getAlliance: function(aid, type, color)
  152. {
  153. try
  154. {
  155. var alliance = {}, root = this, factor = this.__factor;
  156. alliance.id = aid;
  157. alliance.players = {};
  158. var totalProcesses = this.__totalProcesses;
  159. var getBases = function(pid, pn, p, tp)
  160. {
  161. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("GetPublicPlayerInfo", { id: pid },
  162. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  163. {
  164. if (data.c != null)
  165. {
  166. var totalBases = data.c.length;
  167. var player = {};
  168. var bases = [];
  169. for (var b = 0; b < data.c.length; b++)
  170. {
  171. var id = data.c[b].i;
  172. var name = data.c[b].n;
  173. var x = data.c[b].x * factor;
  174. var y = data.c[b].y * factor;
  175. bases.push([x, y, name, id]);
  176. if((p == tp - 1) && (b == totalBases - 1))
  177. {
  178. root.__completedProcesses++;
  179. var loader = cdccta_map.container.getInstance().loader;
  180. loader.setValue('Loading: ' + root.__completedProcesses + "/" + totalProcesses);
  181. }
  182. if(root.__completedProcesses == totalProcesses) root.__onProcessComplete();
  183. }
  184. player.id = pid;
  185. player.name = pn;
  186. player.bases = bases;
  187. alliance.players[pn] = player;
  188. }
  189. }), null);
  190. };
  191. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("GetPublicAllianceInfo", { id: aid },
  192. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  193. {
  194. if (data == null) return;
  195. if (data.opois != null)
  196. {
  197. var pois = [];
  198. data.opois.map(function(poi)
  199. {
  200. pois.push({'i': poi.i, 'l': poi.l, 't': poi.t, 'x': poi.x * factor, 'y': poi.y * factor});
  201. });
  202. alliance.pois = pois;
  203. }
  204. if (data.n != null) alliance.name = data.n;
  205. if (data.m != null)
  206. {
  207. for (var p = 0; p < data.m.length; p++)
  208. {
  209. var playerName = data.m[p].n;
  210. var playerId = data.m[p].i;
  211. getBases(playerId, playerName, p, data.m.length);
  212. }
  213. root.__data.push([alliance, type, color]);
  214. }
  215. }), null);
  216. }
  217. catch(e)
  218. {
  219. console.log(e.toString());
  220. }
  221. },
  222. __onProcessComplete: function()
  223. {
  224. console.log('process completed - alliances data has been generated', this.__data);
  225. this.__isLoading = false;
  226. var win = cdccta_map.container.getInstance();
  227. win.receivedData = this.__data;
  228. win.__updateList();
  229. win.drawCanvas();
  230. win.loader.setValue('Completed');
  231. this.__totalProcess = null;
  232. this.__completedProcesses = 0;
  233. setTimeout(function(){
  234. win.loader.setValue('');
  235. }, 3000);
  236. }
  237. }
  238. });
  239. qx.Class.define("cdccta_map.container",
  240. {
  241. type: "singleton",
  242. extend: qx.ui.container.Composite,
  243. construct: function()
  244. {
  245. try
  246. {
  247. this.base(arguments);
  248. this.setLayout(new qx.ui.layout.Canvas);
  249. var worldWidth = ClientLib.Data.MainData.GetInstance().get_World().get_WorldWidth();
  250. var factor = 500 / worldWidth;
  251. this.__factor = factor;
  252. var zoomIn = new qx.ui.form.Button('+').set({ width: 30 });
  253. var zoomOut = new qx.ui.form.Button('-').set({ width: 30, enabled: false });
  254. var zoomReset = new qx.ui.form.Button('R').set({ width: 30, enabled: false });
  255. var grid = new qx.ui.container.Composite(new qx.ui.layout.Grid(3,1));
  256. var info = new qx.ui.container.Composite(new qx.ui.layout.VBox()).set({ minHeight: 300, padding: 10 });
  257. var canvasContainer = new qx.ui.container.Composite(new qx.ui.layout.VBox(1)).set({width:500, height:500});
  258. var rightBar = new qx.ui.container.Composite(new qx.ui.layout.VBox(10));
  259. var leftBar = new qx.ui.container.Composite(new qx.ui.layout.VBox(10));
  260. var widget = new qx.ui.core.Widget().set({ width: 900, height: 800 });
  261. var div = new qx.html.Element('div', null, {id: 'canvasContainer'});
  262. var li1 = new qx.ui.form.ListItem('All', null, "all");
  263. var li2 = new qx.ui.form.ListItem('My Bases', null, "bases");
  264. var li3 = new qx.ui.form.ListItem('My Alliance', null, "alliance");
  265. var li4 = new qx.ui.form.ListItem('Selected', null, "selected");
  266. var displayMode = new qx.ui.form.SelectBox().set({ height: 28 });
  267. displayMode.add(li1);
  268. displayMode.add(li2);
  269. displayMode.add(li3);
  270. displayMode.add(li4);
  271. var zoomBar = new qx.ui.container.Composite(new qx.ui.layout.HBox(15));
  272. var bothOpt = new qx.ui.form.RadioButton('Both').set({ model: "both" });
  273. var basesOpt = new qx.ui.form.RadioButton('Base').set({ model: "bases" });;
  274. var poisOpt = new qx.ui.form.RadioButton('Poi').set({ model: "pois" });
  275. var displayOptions = new qx.ui.form.RadioButtonGroup().set({ layout: new qx.ui.layout.HBox(), font :'font_size_11' });
  276. displayOptions.add(bothOpt);
  277. displayOptions.add(basesOpt);
  278. displayOptions.add(poisOpt);
  279. var allianceList = new qx.ui.form.List().set({ font :'font_size_11', height: 215 });
  280. var editAlliance = new qx.ui.form.Button('Edit Alliances').set({toolTipText:"Change the Alliances shown on Map", width:100, alignY:"top"});
  281. var label = new qx.ui.basic.Label('Transparency');
  282. var slider = new qx.ui.form.Slider().set({ minimum: 30, maximum: 100, value: 100 });
  283. var coordsField = new qx.ui.form.TextField().set({maxWidth: 100, textAlign: 'center', readOnly: 'true', alignX: 'center'});
  284. var loader = new qx.ui.basic.Label().set({ marginTop: 100 });
  285. grid.set({ minWidth: 1500, backgroundColor: '#415349', minHeight: 524, margin: 3, paddingTop: 10 });
  286. rightBar.set({ maxWidth: 130, minWidth: 130, paddingTop: 30, paddingRight: 10 });
  287. leftBar.set({ maxWidth: 130, minWidth: 130, paddingTop: 30, paddingLeft: 10 });
  288. var hints = [[zoomIn,'Zoom in'], [zoomOut,'Zoom out'], [zoomReset,'Restet zoom'], [basesOpt,'Show bases only'] , [poisOpt,'Show POIs only'], [bothOpt,'Show bases and POIs']]
  289. for(var i = 0; i < hints.length; i++)
  290. {
  291. var tooltip = new qx.ui.tooltip.ToolTip(hints[i][1]);
  292. hints[i][0].setToolTip(tooltip);
  293. }
  294. zoomBar.add(zoomIn);
  295. zoomBar.add(zoomOut);
  296. zoomBar.add(zoomReset);
  297. rightBar.add(zoomBar);
  298. rightBar.add(displayMode);
  299. rightBar.add(displayOptions);
  300. rightBar.add(allianceList);
  301. rightBar.add(editAlliance);
  302. rightBar.add(label);
  303. rightBar.add(slider);
  304. leftBar.add(coordsField);
  305. leftBar.add(info);
  306. leftBar.add(loader);
  307. canvasContainer.add(widget);
  308. widget.getContentElement().add(div);
  309. grid.add(leftBar, {row: 1, column: 1});
  310. grid.add(rightBar, {row: 1, column: 3});
  311. grid.add(canvasContainer, {row: 1, column: 2});
  312. this.info = info;
  313. this.coordsField = coordsField;
  314. this.allianceList = allianceList;
  315. this.panel = [zoomOut, zoomReset, zoomIn, displayOptions, displayMode, allianceList, editAlliance];
  316. this.loader = loader;
  317. this.zoomIn = zoomIn;
  318. this.zoomOut = zoomOut;
  319. this.zoomReset = zoomReset;
  320. //canvas
  321. var cont = document.createElement('div'),
  322. mask = document.createElement('div'),
  323. canvas = document.createElement('canvas'),
  324. ctx = canvas.getContext("2d"),
  325. root = this;
  326. cont.style.width = '500px';
  327. cont.style.height = '500px';
  328. cont.style.position = 'absolute';
  329. cont.style.overflow = 'hidden';
  330. cont.style.backgroundColor = '#0b2833';
  331. cont.style.showMinimize = !1;
  332. cont.style.showMaximize = !0;
  333. cont.style.alwaysOnTop = !1;
  334. canvas.style.position = 'absolute';
  335. canvas.style.backgroundColor = '#0b2833';
  336. mask.style.position = 'absolute';
  337. mask.style.width = '500px';
  338. mask.style.height = '500px';
  339. mask.style.background = 'url("https://www.openmerchantaccount.com/img/map_mask.png") center center no-repeat';
  340. this.canvas = canvas;
  341. this.mask = mask;
  342. this.ctx = ctx;
  343. var __zoomIn = function(){ if (root.scale < 12) root.__scaleMap('up') };
  344. var __zoomOut = function(){if (root.scale > 1) root.__scaleMap('down') };
  345. var __zoomReset = function()
  346. {
  347. canvas.width = 500;
  348. canvas.height = 500;
  349. canvas.style.left = 0;
  350. canvas.style.top = 0;
  351. root.scale = 1;
  352. root.drawCanvas();
  353. zoomIn.setEnabled(true);
  354. zoomOut.setEnabled(false);
  355. zoomReset.setEnabled(false);
  356. };
  357. cont.appendChild(canvas);
  358. cont.appendChild(mask);
  359. root.__draggable(mask);
  360. root.resetMap();
  361. slider.addListener('changeValue', function(e)
  362. {
  363. if (e.getData())
  364. {
  365. var val = e.getData() / 100;
  366. this.setOpacity(val);
  367. slider.setToolTipText(" " + val * 100 + "% ");
  368. }
  369. }, this);
  370. allianceList.addListener('changeSelection', function(e)
  371. {
  372. if ((root.__displayM == "bases") || (root.__displayM == "alliance") || !e.getData()[0]) return;
  373. var aid = e.getData()[0].getModel();
  374. root.__selectedA = aid;
  375. root.drawCanvas();
  376. }, this);
  377. displayMode.addListener('changeSelection', function(e)
  378. {
  379. var dm = e.getData()[0].getModel();
  380. root.__displayM = dm;
  381. root.__updateList();
  382. if(dm == "bases")
  383. {
  384. displayOptions.setSelection([basesOpt]);
  385. poisOpt.setEnabled(false);
  386. bothOpt.setEnabled(false);
  387. root.__displayO = "bases";
  388. }
  389. else
  390. {
  391. if(!poisOpt.isEnabled()) poisOpt.setEnabled(true);
  392. if(!bothOpt.isEnabled()) bothOpt.setEnabled(true);
  393. displayOptions.setSelection([bothOpt]);
  394. root.__displayO = "both";
  395. }
  396. root.drawCanvas();
  397. }, this);
  398. displayOptions.addListener('changeSelection', function(e)
  399. {
  400. if (!e.getData()[0]) return;
  401. var dop = e.getData()[0].getModel();
  402. root.__displayO = dop;
  403. root.drawCanvas();
  404. }, this);
  405. editAlliance.addListener('execute', function()
  406. {
  407. cdccta_map.options.getInstance().open();
  408. }, this);
  409. var desktop = qx.core.Init.getApplication().getDesktop();
  410. desktop.addListener('resize', this._onResize, this);
  411. zoomIn.addListener('execute', __zoomIn, this);
  412. zoomOut.addListener('execute', __zoomOut, this);
  413. zoomReset.addListener('execute', __zoomReset, this);
  414. this.add(grid);
  415. this.wdgAnchor = new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tl1.png").set({ width: 3, height: 32 });
  416. this.__imgTopRightCorner = new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tr.png").set({ width: 34, height: 35 });
  417. this._add(this.__imgTopRightCorner, { right: 0, top: 0, bottom: 28 });
  418. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_r.png").set({ width: 3, height: 1, allowGrowY: true, scale: true }), { right: 0, top: 35, bottom: 29 });
  419. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_br.png").set({ width: 5, height: 28, allowGrowY: true, scale: true }), { right: 0, bottom: 0 });
  420. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_b.png").set({ width: 1, height: 3, allowGrowX: true, scale: true }), { right: 5, bottom: 0, left: 5 });
  421. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_bl.png").set({ width: 5, height: 29 }), { left: 0, bottom: 0 });
  422. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_l.png").set({ width: 3, height: 1, allowGrowY: true, scale: true }), { left: 0, bottom: 29, top: 32 });
  423. this._add(this.wdgAnchor, { left: 0, top: 0 });
  424. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_tl2.png").set({ width: 25, height: 5 }), { left: 3, top: 0 });
  425. this._add(new qx.ui.basic.Image("webfrontend/ui/common/frame_basewin/frame_basewindow_t.png").set({ width: 1, height: 3, allowGrowX: true, scale: true }), { left: 28, right: 34, top: 0 });
  426. this.__btnClose = new webfrontend.ui.SoundButton(null, "FactionUI/icons/icon_close_button.png").set({ appearance: "button-close", width: 23, height: 23, toolTipText: this.tr("tnf:close base view") });
  427. this.__btnClose.addListener("execute", this._onClose, this);
  428. this._add(this.__btnClose, { top: 6, right: 5 });
  429. var onLoaded = function()
  430. {
  431. var counter = 0;
  432. var check = function()
  433. {
  434. if(counter > 60) return;
  435. var htmlDiv = document.getElementById('canvasContainer');
  436. (htmlDiv) ? htmlDiv.appendChild(cont) : setTimeout(check, 1000);
  437. console.log('retrying check for canvasContainer is loaded');
  438. counter++;
  439. };
  440. check();
  441. };
  442. onLoaded();
  443. }
  444. catch(e)
  445. {
  446. console.log(e.toString());
  447. }
  448. console.log('container creation completed');
  449. },
  450. destruct: function(){},
  451. members:
  452. {
  453. info: null,
  454. coordsField: null,
  455. panel: null,
  456. loader: null,
  457. canvas: null,
  458. mask: null,
  459. ctx: null,
  460. receivedData: null,
  461. allianceList: null,
  462. circles: [53, 85, 113, 145, 242],
  463. scale: 1,
  464. selectedBase: false,
  465. elements: [],
  466. locations: [],
  467. inProgress: false,
  468. isRadarVisible: false,
  469. __interval: null,
  470. __pointerX: null,
  471. __pointerY: null,
  472. __selectedA: null,
  473. __selectedB: null,
  474. __displayM: "all",
  475. __displayO: "both",
  476. __factor: null,
  477. __setInfo: function(base)
  478. {
  479. try
  480. {
  481. // console.log(base);
  482. var info = this.info;
  483. info.removeAll();
  484. if(!base) return;
  485. for ( var i = 0; i < base.length; i++)
  486. {
  487. var title = new qx.ui.basic.Label(base[i][0]).set({font: 'font_size_13_bold', textColor: '#FFFFFF'});
  488. var value = new qx.ui.basic.Label(base[i][1]).set({font: 'font_size_11', textColor: '#FFFFFF', marginBottom: 5});
  489. info.add(title);
  490. info.add(value);
  491. }
  492. }
  493. catch(e)
  494. {
  495. console.log(e.toString());
  496. }
  497. },
  498. __createLayout: function()
  499. {
  500. var s = this.scale, circles = this.circles, ctx = this.ctx;
  501. for (var i = 0; i < circles.length; i++) {
  502. var r = circles[i];
  503. ctx.beginPath();
  504. ctx.arc(250, 250, r, 0, Math.PI * 2, true);
  505. ctx.lineWidth = (i == 4) ? 1/s : 0.3/s;
  506. ctx.strokeStyle = '#8ce9ef';
  507. ctx.stroke();
  508. ctx.closePath();
  509. }
  510. for(var i = 0; i < 8; i++){
  511. var r = circles[4], a = (Math.PI * i / 4) - Math.PI / 8;
  512. ctx.beginPath();
  513. ctx.moveTo(250,250);
  514. ctx.lineTo((r * Math.cos(a)) + 250, (r * Math.sin(a)) + 250);
  515. ctx.lineWidth = 0.3/s;
  516. ctx.strokeStyle = '#8ce9ef';
  517. ctx.stroke();
  518. ctx.closePath();
  519. }
  520. var endGame = cdccta_map.getInstance().__endGame, hubs = endGame.hubs, fortress = endGame.fortress;
  521. var fortressX = fortress[0];
  522. var fortressY = fortress[1];
  523. var grd = ctx.createLinearGradient(fortressX, fortressY - 0.5, fortressX, fortressY + 0.5);
  524. grd.addColorStop(0, 'rgba(200, 228, 228, 0.5)');
  525. grd.addColorStop(1, 'rgba(170, 214, 118, 0.5)');
  526. ctx.beginPath();
  527. ctx.arc(fortressX - 0.2, fortressY - 0.2, 1, 0, Math.PI * 2, true);
  528. ctx.fillStyle = grd;
  529. ctx.lineWidth = 0.1;
  530. ctx.strokeStyle = '#a5fe6a';
  531. ctx.fill();
  532. ctx.stroke();
  533. ctx.closePath();
  534. for(var i = 0; i < hubs.length; i++)
  535. {
  536. var c = 'rgba(200, 228, 228, 0.5)', d = 'rgba(170, 214, 118, 0.5)', l = 1.3, b = 0.1;
  537. var x = hubs[i][0];
  538. var y = hubs[i][1];
  539. var grd = ctx.createLinearGradient(x, y, x, y+l);
  540. grd.addColorStop(0, c);
  541. grd.addColorStop(1, d);
  542. ctx.beginPath();
  543. ctx.rect(x-b, y-b, l, l);
  544. ctx.fillStyle = grd;
  545. ctx.fill();
  546. ctx.strokeStyle = '#a5fe6a';
  547. ctx.lineWidth = b;
  548. ctx.stroke();
  549. ctx.closePath();
  550. }
  551. },
  552. __createAlliance: function(name, data, type, color)
  553. {
  554. try
  555. {
  556. this.inProgress = true;
  557. var colors = {
  558. "bases": {"alliance":[["#86d3fb","#75b7d9"]], "owner":[["#ffc48b","#d5a677"]], "enemy":[["#ff8e8b","#dc7a78"],['#e25050','#cc2d2d'],['#93b7f8','#527ef2'],['#d389aa','#b14e69']], "nap":[["#ffffff","#cccccc"]], "selected":[["#ffe50e", "#d7c109"]], "ally":[["#6ce272", "#5fc664"],['#d4e17e','#b3ca47'],['#92f8f2','#52f2e8'],['#1cba1c','#108510']]},
  559. "pois": [["#add2a8","#6db064"], ["#75b9da","#4282bd"], ["#abd2d6","#6bafb7"], ["#e2e0b7","#ccc880"], ["#e5c998","#d09e53"], ["#d4a297","#b35a54"], ["#afa3b1","#755f79"]]
  560. };
  561. var owner = ClientLib.Data.MainData.GetInstance().get_Player().name, ctx = this.ctx, factor = this.__factor;
  562. var dop = this.__displayO, dmd = this.__displayM, root = this, s = this.scale;
  563. var r = (s < 3) ? 0.65 : (s > 3) ? 0.35 : 0.5;
  564. var createBase = function (x, y, bt, clr)
  565. {
  566. var c = colors.bases[bt][clr][0], d = colors.bases[bt][clr][1];
  567. var grd=ctx.createLinearGradient(x, y-r, x, y+r);
  568. grd.addColorStop(0, c);
  569. grd.addColorStop(1, d);
  570. ctx.beginPath();
  571. ctx.arc(x, y, r, 0, Math.PI * 2, true);
  572. ctx.closePath();
  573. ctx.fillStyle = grd;
  574. ctx.fill();
  575. ctx.lineWidth = 0.1;
  576. ctx.strokeStyle = '#000000';
  577. ctx.stroke();
  578. ctx.closePath();
  579. };
  580. var createPoi = function(x, y, t)
  581. {
  582. var c = colors.pois[t][0], d = colors.pois[t][1];
  583. var grd = ctx.createLinearGradient(x, y-r, x, y+r);
  584. grd.addColorStop(0, c);
  585. grd.addColorStop(1, d);
  586. ctx.beginPath();
  587. ctx.rect(x-r, y-r, r*2, r*2);
  588. ctx.fillStyle = grd;
  589. ctx.fill();
  590. ctx.strokeStyle = "#000000";
  591. ctx.lineWidth = 0.1;
  592. ctx.stroke();
  593. ctx.closePath();
  594. };
  595. if (dop != "pois")
  596. {
  597. for (var player in data.players) {
  598. for (var i = 0; i < data.players[player].bases.length; i++){
  599. var b = data.players[player].bases[i], pid = data.players[player].id;
  600. if(dmd == "bases")
  601. {
  602. if (player == owner)
  603. {
  604. this.elements.push({"x":b[0],"y":b[1],"an":name,"pn":player,"bn":b[2],"bi":b[3],"ai":data.id,"pi":pid,"type":"base"});
  605. this.locations.push([b[0]/factor, b[1]/factor]);
  606. createBase(b[0], b[1], 'owner', 0);
  607. }
  608. }
  609. else
  610. {
  611. this.elements.push({"x":b[0],"y":b[1],"an":name,"pn":player,"bn":b[2],"bi":b[3],"ai":data.id,"pi":pid,"type":"base"});
  612. this.locations.push([b[0]/factor, b[1]/factor]);
  613. (player == owner) ? createBase(b[0], b[1], 'owner', 0) : createBase(b[0], b[1], type, color);
  614. }
  615. }
  616. }
  617. }
  618. if (dop != "bases")
  619. {
  620. for (var i = 0; i < data.pois.length; i++){
  621. var x = data.pois[i].x, y = data.pois[i].y, t = data.pois[i].t, l = data.pois[i].l;
  622. createPoi(x, y, t - 2);
  623. this.elements.push({"x": x, "y": y, "an": name, "ai": data.id, "t": t, "l": l});
  624. this.locations.push([x/factor, y/factor]);
  625. }
  626. }
  627. this.inProgress = false;
  628. }
  629. catch(e)
  630. {
  631. console.log(e.toString());
  632. }
  633. },
  634. __draggable: function(mask)
  635. {
  636. try
  637. {
  638. var start, end, initCoords = [], selectedBase = false, root = this, canvas = this.canvas, c = 0;
  639. var factor = root.__factor;
  640. var displayBaseInfo = function()
  641. {
  642. try
  643. {
  644. if (!selectedBase || root.inProgress) return;
  645. var base = [];
  646. var pois = ['Tiberium', 'Crystal', 'Reactor', 'Tungesten', 'Uranium', 'Aircraft Guidance', 'Resonater'];
  647. for ( var i in selectedBase)
  648. {
  649. var txt = "", val = "";
  650. switch(i)
  651. {
  652. case "an": txt = "Alliance: "; val = selectedBase[i]; break;
  653. case "bn": txt = "Base : "; val = selectedBase[i]; break;
  654. case "pn": txt = "Player : "; val = selectedBase[i]; break;
  655. case "l" : txt = "Level : "; val = selectedBase[i]; break;
  656. case "t" : txt = "Type : "; val = pois[selectedBase[i] - 2]; break;
  657. default : txt = false;
  658. }
  659. if(txt)
  660. {
  661. base.push([txt, val]);
  662. }
  663. root.__setInfo(base);
  664. }
  665. }
  666. catch(e)
  667. {
  668. console.log(e.toString());
  669. }
  670. };
  671. var onMapHover = function(event)
  672. {
  673. var loc = root.locations, elements = root.elements, coordsField = root.coordsField;
  674. var getCoords = function()
  675. {
  676. var canvasRect = canvas.getBoundingClientRect();
  677. var x = (event.pageX - canvasRect.left), y = (event.pageY - canvasRect.top);
  678. return [x, y];
  679. };
  680. var coords = getCoords();
  681. var x = coords[0] + canvas.offsetLeft, y = coords[1] + canvas.offsetTop;
  682. if(Math.sqrt(Math.pow(x - 250, 2) + Math.pow(y - 250, 2)) > 242)
  683. {
  684. coordsField.setValue("");
  685. return;
  686. }
  687. x = Math.round(coords[0] / (root.scale * factor)); root.__pointerX = x;
  688. y = Math.round(coords[1] / (root.scale * factor)); root.__pointerY = y;
  689. coordsField.setValue(x + ":" + y);
  690. if (root.scale < 2 || root.inProgress) return;
  691. for(var i = 0; i < loc.length; i++)
  692. {
  693. var elmX = loc[i][0], elmY = loc[i][1];
  694. if ((x == elmX) && (y == elmY))
  695. {
  696. selectedBase = elements[i];
  697. displayBaseInfo();
  698. break;
  699. }
  700. else
  701. {
  702. selectedBase = false;
  703. root.__setInfo(false);
  704. }
  705. }
  706. };
  707. var onMapDrag = function(event)
  708. {
  709. if (root.scale == 1 || root.inProgress) return;
  710. var cx = canvas.offsetLeft, cy = canvas.offsetTop, mx = event.pageX, my = event.pageY;
  711. var newX = cx + mx - initCoords[0], newY = cy + my - initCoords[1];
  712. initCoords[0] = mx;
  713. initCoords[1] = my;
  714. canvas.style.top = newY + 'px';
  715. canvas.style.left = newX + 'px';
  716. };
  717. var onMapWheel = function(event)
  718. {
  719. if (root.inProgress) return;
  720. var delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail)));
  721. if((delta < 0 && root.scale <= 1) || (delta > 0 && root.scale >= 12)) return;
  722. c += delta;
  723. var str = ( Math.abs(c) % 3 == 0 ) ? ((delta < 0) ? 'down' : 'up') : false;
  724. if(str) root.__scaleMap(str);
  725. };
  726. var onMapDown = function(event){
  727. var x = event.pageX, y = event.pageY, t = new Date();
  728. initCoords = [x,y];
  729. start = t.getTime();
  730. mask.removeEventListener('mousemove', onMapHover, false);
  731. mask.addEventListener('mousemove', onMapDrag, false);
  732. };
  733. var onMapUp = function(event){
  734. var x = event.pageX, y = event.pageY, t = new Date();
  735. end = t.getTime();
  736. initCoords = [x,y];
  737. mask.removeEventListener('mousemove', onMapDrag, false);
  738. mask.addEventListener('mousemove', onMapHover, false);
  739. if (end - start < 150) webfrontend.gui.UtilView.centerCoordinatesOnRegionViewWindow(root.__pointerX, root.__pointerY);
  740. };
  741. var onMapOut = function(event){
  742. mask.removeEventListener('mousemove', onMapDrag, false);
  743. mask.addEventListener('mousemove', onMapHover, false);
  744. };
  745. mask.addEventListener('mouseup', onMapUp, false);
  746. mask.addEventListener('mousedown', onMapDown, false);
  747. mask.addEventListener('mousemove', onMapHover, false);
  748. mask.addEventListener('mouseout', onMapOut, false);
  749. mask.addEventListener('mousewheel', onMapWheel, false);
  750. mask.addEventListener('DOMMouseScroll', onMapWheel, false);
  751. }
  752. catch(e)
  753. {
  754. console.log(e.toString());
  755. }
  756. },
  757. __startRadarScan: function()
  758. {
  759. this.isRadarVisible = true;
  760. var FRAMES_PER_CYCLE = 20, FRAMERATE = 20, RINGS = 6;
  761. var canvas = this.canvas, ctx = this.ctx, canvassize = 400, animationframe = 0, root = this;
  762. var ringsize = canvassize / (2 * RINGS + 1);
  763. var radiusmax = ringsize / 2 + ringsize + (RINGS - 1) * ringsize;
  764. function animateRadarFrame() {
  765. ctx.clearRect(0, 0, canvas.width, canvas.height);
  766. root.__createLayout();
  767. var radius, alpha;
  768. for (var ringno = 0; ringno < RINGS; ringno++)
  769. {
  770. radius = ringsize / 2 + (animationframe / FRAMES_PER_CYCLE) * ringsize + ringno * ringsize;
  771. alpha = (radiusmax - radius) / radiusmax;
  772. ctx.beginPath();
  773. ctx.fillStyle = "rgba(92,178,112," + alpha + ")";
  774. ctx.arc(250, 250, radius, 0, 2 * Math.PI, false);
  775. ctx.fill();
  776. ctx.closePath();
  777. }
  778. ctx.beginPath();
  779. ctx.fillStyle = "rgb(100,194,122)";
  780. ctx.arc(250, 250, ringsize / 2, 0, 2 * Math.PI, false);
  781. ctx.fill();
  782. ctx.closePath();
  783. animationframe = (animationframe >= (FRAMES_PER_CYCLE - 1)) ? 0 : animationframe + 1;
  784. }
  785. this.__interval = setInterval(animateRadarFrame, 1000 / FRAMERATE);
  786. },
  787. __stopRadarScan: function()
  788. {
  789. if(!this.isRadarVisible) return;
  790. clearInterval(this.__interval);
  791. this.isRadarVisible = false;
  792. this.__enablePanel();
  793. },
  794. __disablePanel: function()
  795. {
  796. this.inProgress = true;
  797. for (var i = 0; i < this.panel.length; i++) this.panel[i].setEnabled(false);
  798. },
  799. __enablePanel: function()
  800. {
  801. for (var i = 0; i < this.panel.length; i++) if(i>1) this.panel[i].setEnabled(true);
  802. },
  803. __createIcon: function(color, width, height)
  804. {
  805. var canvas = document.createElement("canvas");
  806. canvas.width = width;
  807. canvas.height = height;
  808. var ctx = canvas.getContext("2d");
  809. ctx.beginPath();
  810. ctx.rect(0, 0, width, height);
  811. ctx.fillStyle = color;
  812. ctx.fill();
  813. ctx.closePath();
  814. var data = canvas.toDataURL("image/png");
  815. return data;
  816. },
  817. __updateList: function()
  818. {
  819. var dm = this.__displayM;
  820. this.__selectedA = null;
  821. this.allianceList.removeAll();
  822. var d = this.receivedData, root = this;
  823. var colors = {"enemy":["#ff807d", "#a93939", "#739bf5", "#c26b89"], "ally": ["#3bbe5d", "#c4d663", "#73f5ed", "#169f16"], "nap": ["#ffffff"], "selected": ["#ffe50e"], "alliance": ["#75b7d9"], "owner": ["#ffc48b"]};
  824. for (var i = 0; i < d.length; i++)
  825. {
  826. var name = d[i][0].name, type = d[i][1], aid = d[i][0].id, clr = d[i][2];
  827. if((dm == "all") || (dm == "selected"))
  828. {
  829. var color = colors[type][clr];
  830. var li = new qx.ui.form.ListItem(name, root.__createIcon(color, 10, 10), aid);
  831. var tooltip = new qx.ui.tooltip.ToolTip(name + " - " + type, root.__createIcon(color, 15, 15));
  832. li.setToolTip(tooltip);
  833. this.allianceList.add(li);
  834. }
  835. else
  836. {
  837. if(type == "alliance")
  838. {
  839. var li = new qx.ui.form.ListItem(name, null, aid);
  840. var tooltip = new qx.ui.tooltip.ToolTip(name + " - " + type, root.__createIcon(color, 15, 15));
  841. li.setToolTip(tooltip);
  842. this.allianceList.add(li);
  843. break;
  844. }
  845. }
  846. }
  847. },
  848. drawCanvas: function()
  849. {
  850. var dmd = this.__displayM, b = this.receivedData, list = this.allianceList;
  851. var selected = (this.__selectedA != null && typeof this.__selectedA == 'number') ? this.__selectedA : false;
  852. var mask = this.mask, n = this.scale, canvas = this.canvas, ctx = this.ctx;
  853. this.elements = [];
  854. this.locations = [];
  855. this.__stopRadarScan();
  856. canvas.width = n * 500;
  857. canvas.height = n * 500;
  858. ctx = canvas.getContext("2d");
  859. ctx.scale(n, n);
  860. this.__createLayout();
  861. for (var i = 0; i < b.length; i++)
  862. {
  863. var name = b[i][0].name, data = b[i][0], type = b[i][1], aid = b[i][0].id, color = b[i][2];
  864. if(((dmd == "alliance") || (dmd == "bases")) && (type == "alliance"))
  865. {
  866. this.__createAlliance(name, data, type, 0);
  867. break;
  868. }
  869. if(dmd == "all")
  870. {
  871. if(selected && (aid == selected))
  872. {
  873. type = 'selected';
  874. color = 0;
  875. }
  876. this.__createAlliance(name, data, type, color);
  877. }
  878. if((dmd == "selected") && selected && (aid == selected))
  879. {
  880. this.__createAlliance(name, data, type, color);
  881. break;
  882. }
  883. }
  884. },
  885. __scaleMap: function(str)
  886. {
  887. try
  888. {
  889. var newScale = (str == 'up') ? this.scale + 2 : this.scale - 2;
  890. if (newScale > 12 || newScale < 1 || this.inProgress) return;
  891. var canvas = this.canvas, ctx = this.ctx;
  892. var x = ((canvas.offsetLeft - 250) * newScale/this.scale) + 250,
  893. y = ((canvas.offsetTop - 250) * newScale/this.scale) + 250;
  894. this.scale = newScale;
  895. switch (this.scale)
  896. {
  897. case 1: this.zoomOut.setEnabled(false); this.zoomReset.setEnabled(false); this.zoomIn.setEnabled(true); break
  898. case 11: this.zoomOut.setEnabled(true); this.zoomReset.setEnabled(true); this.zoomIn.setEnabled(false); break
  899. default: this.zoomOut.setEnabled(true); this.zoomReset.setEnabled(true); this.zoomIn.setEnabled(true); break
  900. }
  901. ctx.clearRect(0, 0, canvas.width, canvas.height);
  902. this.drawCanvas();
  903. canvas.style.left = newScale == 1 ? 0 : x + 'px';
  904. canvas.style.top = newScale == 1 ? 0 : y + 'px';
  905. }
  906. catch(e)
  907. {
  908. console.log(e.toString());
  909. }
  910. },
  911. resetMap: function()
  912. {
  913. var canvas = this.canvas, ctx = this.ctx;
  914. this.scale = 1;
  915. canvas.width = 500; canvas.height = 500; canvas.style.left = 0; canvas.style.top = 0;
  916. ctx.clearRect(0, 0, canvas.width, canvas.height);
  917. this.__disablePanel();
  918. this.__startRadarScan();
  919. },
  920. open: function(faction)
  921. {
  922. var app = qx.core.Init.getApplication();
  923. var mainOverlay = app.getMainOverlay();
  924. this.setWidth(mainOverlay.getWidth());
  925. this.setMaxWidth(mainOverlay.getMaxWidth());
  926. this.setHeight(mainOverlay.getHeight());
  927. this.setMaxHeight(mainOverlay.getMaxHeight());
  928. app.getDesktop().add(this, { left: mainOverlay.getBounds().left, top: mainOverlay.getBounds().top });
  929. },
  930. _onClose: function()
  931. {
  932. var opt = cdccta_map.options.getInstance();
  933. var app = qx.core.Init.getApplication();
  934. app.getDesktop().remove(this);
  935. if(opt.isSeeable()) opt.close();
  936. },
  937. _onResize: function()
  938. {
  939. var windowWidth = window.innerWidth - 10;
  940. var width = this.getWidth();
  941. var offsetLeft = (windowWidth - width) / 2;
  942. this.setDomLeft(offsetLeft);
  943. var opt = cdccta_map.options.getInstance();
  944. if (opt.isSeeable()) opt.setDomLeft(offsetLeft + width + 5);
  945. }
  946. }
  947. });
  948. qx.Class.define('cdccta_map.options',
  949. {
  950. type: 'singleton',
  951. extend: webfrontend.gui.CustomWindow,
  952. construct: function()
  953. {
  954. try
  955. {
  956. this.base(arguments);
  957. this.setLayout(new qx.ui.layout.VBox(10));
  958. this.set({
  959. width: 200,
  960. height: 500,
  961. showMinimize: true,
  962. showMaximize: true,
  963. alwaysOnTop: true,
  964. caption: 'Alliances Shown on Map'
  965. });
  966. this.__getAlliances();
  967. var root = this;
  968. var searchBox = new qx.ui.form.TextField().set({ placeholder: 'Search...'});
  969. var list = new qx.ui.form.List().set({ height: 80 });
  970. var editList = new qx.ui.form.List().set({ height: 160, selectionMode: 'additive' });
  971. var radioButtons = [['Enemy', 'enemy'],['Ally', 'ally'],['NAP', 'nap']];
  972. var radioGroup = new qx.ui.form.RadioButtonGroup().set({ layout: new qx.ui.layout.HBox(10), textColor: '#aaaaaa' });
  973. for (var i = 0; i < radioButtons.length; i++)
  974. {
  975. var radioButton = new qx.ui.form.RadioButton(radioButtons[i][0]);
  976. radioButton.setModel(radioButtons[i][1]);
  977. radioGroup.add(radioButton);
  978. }
  979. var colors = root.__colors;
  980. var colorSelectBox = new qx.ui.form.SelectBox().set({ height: 28 });
  981. var addColors = function(type)
  982. {
  983. colorSelectBox.removeAll();
  984. for (var i = 0; i < colors[type].length; i++)
  985. {
  986. var src = root.__createIcon(colors[type][i], 60, 15);
  987. var listItem = new qx.ui.form.ListItem(null, src, i);
  988. colorSelectBox.add(listItem);
  989. }
  990. };
  991. addColors('enemy');
  992. var addButton = new qx.ui.form.Button('Add').set({ enabled: false, width: 85, toolTipText: 'Maximum allowed number of alliances is 8.' });;
  993. var removeButton = new qx.ui.form.Button('Remove').set({ enabled: false, width: 85 });;
  994. var applyButton = new qx.ui.form.Button('Apply').set({ enabled: false });;
  995. var defaultsButton = new qx.ui.form.Button('Defaults').set({ enabled: false, width: 85 });;
  996. var saveButton = new qx.ui.form.Button('Save').set({ enabled: false, width: 85 });;
  997. var hbox1 = new qx.ui.container.Composite(new qx.ui.layout.HBox(10))
  998. var hbox2 = new qx.ui.container.Composite(new qx.ui.layout.HBox(10))
  999. hbox1.add(addButton);
  1000. hbox1.add(removeButton);
  1001. hbox2.add(saveButton);
  1002. hbox2.add(defaultsButton);
  1003. this.searchBox = searchBox;
  1004. this.list = list;
  1005. this.editList = editList;
  1006. this.radioGroup = radioGroup;
  1007. this.colorSelectBox = colorSelectBox;
  1008. this.addButton = addButton;
  1009. this.removeButton = removeButton;
  1010. this.saveButton = saveButton;
  1011. this.defaultsButton = defaultsButton;
  1012. this.applyButton = applyButton;
  1013. this.add(searchBox);
  1014. this.add(list);
  1015. this.add(editList);
  1016. this.add(radioGroup);
  1017. this.add(colorSelectBox);
  1018. this.add(hbox1);
  1019. this.add(hbox2);
  1020. this.add(applyButton);
  1021. this.addListener('appear', function()
  1022. {
  1023. var cont = cdccta_map.container.getInstance()
  1024. var bounds = cont.getBounds(), left = bounds.left, top = bounds.top, width = bounds.width, height = bounds.height;
  1025. searchBox.setValue('');
  1026. list.removeAll();
  1027. addButton.setEnabled(false);
  1028. removeButton.setEnabled(false);
  1029. applyButton.setEnabled(false);
  1030. radioGroup.setSelection([ radioGroup.getSelectables()[0] ]);
  1031. colorSelectBox.setSelection([ colorSelectBox.getSelectables()[0] ]);
  1032. this.__updateList();
  1033. this.__checkDefaults();
  1034. this.__checkSavedSettings();
  1035. this.setUserBounds(left + width + 5, top, 200, height);
  1036. }, this);
  1037. searchBox.addListener('keyup', this.__searchAlliances, this);
  1038. radioGroup.addListener('changeSelection', function(e)
  1039. {
  1040. if(e.getData()[0]) addColors(e.getData()[0].getModel());
  1041. }, this);
  1042. list.addListener('changeSelection', function(e)
  1043. {
  1044. if (!e.getData()[0]) return;
  1045. var items = this.__items, aid = e.getData()[0].getModel();
  1046. (((items != null) && (items.indexOf(aid) > -1)) || (items.length > 8)) ? addButton.setEnabled(false) : addButton.setEnabled(true);
  1047. }, this);
  1048. editList.addListener('changeSelection', function(e)
  1049. {
  1050. (e.getData()[0]) ? removeButton.setEnabled(true) : removeButton.setEnabled(false);
  1051. }, this);
  1052. addButton.addListener('execute', function()
  1053. {
  1054. var aid = list.getSelection()[0].getModel(),
  1055. name = list.getSelection()[0].getLabel(),
  1056. type = radioGroup.getSelection()[0].getModel(),
  1057. color = colorSelectBox.getSelection()[0].getModel();
  1058. var li = new qx.ui.form.ListItem(name + " - " + type, root.__createIcon(colors[type][color], 15, 15), {'aid': aid, 'type': type, 'name': name, 'color': color});
  1059. editList.add(li);
  1060. list.resetSelection();
  1061. addButton.setEnabled(false);
  1062. root.__updateItems();
  1063. }, this);
  1064. removeButton.addListener('execute', function()
  1065. {
  1066. var selection = (editList.isSelectionEmpty()) ? null : editList.getSelection();
  1067. var ownAlliance = cdccta_map.getInstance().__allianceName;
  1068. if(selection != null)
  1069. {
  1070. for(var i = selection.length - 1; i > -1; i--) if(selection[i].getModel().name != ownAlliance) editList.remove(selection[i]);
  1071. root.__updateItems();
  1072. editList.resetSelection();
  1073. }
  1074. }, this);
  1075. applyButton.addListener('execute', this.__applyChanges, this);
  1076. defaultsButton.addListener('execute', this.__setDefaults, this);
  1077. saveButton.addListener('execute', this.__saveSettings, this);
  1078. }
  1079. catch(e)
  1080. {
  1081. console.log(e.toString());
  1082. }
  1083. console.log('Options Panel creation completed');
  1084. },
  1085. destruct: function()
  1086. {
  1087. },
  1088. members:
  1089. {
  1090. __data: null,
  1091. searchBox: null,
  1092. list: null,
  1093. editList: null,
  1094. radioGroup: null,
  1095. colorSelectBox: null,
  1096. addButton: null,
  1097. removeButton: null,
  1098. saveButton: null,
  1099. applyButton: null,
  1100. defaultsButton: null,
  1101. __items: null,
  1102. __colors: {"enemy":["#ff807d", "#a93939", "#739bf5", "#c26b89"], "ally": ["#3bbe5d", "#c4d663", "#73f5ed", "#169f16"], "nap": ["#ffffff"], "selected": ["#ffe50e"], "alliance": ["#75b7d9"], "owner": ["#ffc48b"]},
  1103. __getAlliances: function()
  1104. {
  1105. var root = this;
  1106. ClientLib.Net.CommunicationManager.GetInstance().SendSimpleCommand("RankingGetData",
  1107. {firstIndex: 0, lastIndex: 3000, ascending: true, view: 1, rankingType: 0, sortColumn: 2},
  1108. phe.cnc.Util.createEventDelegate(ClientLib.Net.CommandResult, this, function(context, data)
  1109. {
  1110. if(data.a != null)
  1111. {
  1112. var arr = [];
  1113. for( var i = 0; i < data.a.length; i++) arr[i] = [data.a[i].an, data.a[i].a];
  1114. root.__data = arr;
  1115. }
  1116. }), null);
  1117. },
  1118. __createIcon: function(color, width, height)
  1119. {
  1120. var canvas = document.createElement("canvas");
  1121. canvas.width = width;
  1122. canvas.height = height;
  1123. var ctx = canvas.getContext("2d");
  1124. ctx.beginPath();
  1125. ctx.rect(0,0,width,height);
  1126. ctx.fillStyle = color;
  1127. ctx.fill();
  1128. ctx.closePath();
  1129. var data = canvas.toDataURL("image/png");
  1130. return data;
  1131. },
  1132. __updateList: function()
  1133. {
  1134. var map = cdccta_map.getInstance();
  1135. var selectedItems = [], list = this.editList, root = this;
  1136. var alliancesList = (map.__selectedAlliances == null) ? map.__defaultAlliances : map.__selectedAlliances;
  1137. var colors = this.__colors;
  1138. list.removeAll();
  1139. alliancesList.map(function(a)
  1140. {
  1141. var aid = a[0], at = a[1], an = a[2], c = a[3];
  1142. var li = new qx.ui.form.ListItem(an + " - " + at, root.__createIcon(colors[at][c], 15, 15), {'aid': aid, 'type': at, 'name': an, 'color': c});
  1143. list.add(li);
  1144. selectedItems.push(aid);
  1145. });
  1146. this.__items = selectedItems;
  1147. },
  1148. __setDefaults: function()
  1149. {
  1150. var map = cdccta_map.getInstance();
  1151. var selectedItems = [], list = this.editList, root = this, colors = this.__colors;
  1152. var alliancesList = map.__defaultAlliances;
  1153. list.removeAll();
  1154. alliancesList.map(function(a)
  1155. {
  1156. var aid = a[0], at = a[1], an = a[2], c = a[3];
  1157. var li = new qx.ui.form.ListItem(an + " - " + at, root.__createIcon(colors[at][c], 15, 15), {'aid': aid, 'type': at, 'name': an, 'color': c});
  1158. list.add(li);
  1159. selectedItems.push(aid);
  1160. });
  1161. this.__items = selectedItems;
  1162. this.__currentListModified();
  1163. this.defaultsButton.setEnabled(false);
  1164. },
  1165. __searchAlliances: function()
  1166. {
  1167. var str = this.searchBox.getValue(), data = this.__data, list = this.list;
  1168. list.removeAll();
  1169. if (!data || (str == '')) return;
  1170. data.map(function(x)
  1171. {
  1172. var patt = new RegExp("^" + str + ".+$", "i");
  1173. var test = patt.test(x[0]);
  1174. if(test)
  1175. {
  1176. var listItem = new qx.ui.form.ListItem(x[0], null, x[1]);
  1177. list.add(listItem);
  1178. }
  1179. });
  1180. },
  1181. __updateItems: function()
  1182. {
  1183. var items = [], listItems = this.editList.getSelectables();
  1184. for (var i = 0; i < listItems.length; i++) items.push(listItems[i].getModel().aid);
  1185. this.__items = items;
  1186. this.__checkSavedSettings();
  1187. this.__currentListModified();
  1188. },
  1189. __applyChanges: function()
  1190. {
  1191. var selectedAlliances = [], listItems = this.editList.getSelectables();
  1192. for(var i = 0; i < listItems.length; i++)
  1193. {
  1194. var model = listItems[i].getModel(), aid = model.aid, type = model.type, name = model.name, color = model.color;
  1195. selectedAlliances.push([aid, type, name, color]);
  1196. }
  1197. cdccta_map.getInstance().__selectedAlliances = selectedAlliances;
  1198. cdccta_map.container.getInstance().resetMap();
  1199. cdccta_map.getInstance().getData();
  1200. this.close();
  1201. },
  1202. __saveSettings: function()
  1203. {
  1204. if(typeof(Storage) === 'undefined') return;
  1205. var selectedAlliances = [], listItems = this.editList.getSelectables();
  1206. for(var i = 0; i < listItems.length; i++)
  1207. {
  1208. var model = listItems[i].getModel(), aid = model.aid, type = model.type, name = model.name, color = model.color;
  1209. selectedAlliances.push([aid, type, name, color]);
  1210. }
  1211. (!localStorage.cdccta_map_settings) ? localStorage['cdccta_map_settings'] = JSON.stringify(selectedAlliances) : localStorage.cdccta_map_settings = JSON.stringify(selectedAlliances);
  1212. this.saveButton.setEnabled(false);
  1213. // console.log(localStorage.cdccta_map_settings);
  1214. },
  1215. __checkSavedSettings: function()
  1216. {
  1217. if(typeof(Storage) === 'undefined') return;
  1218. var original = (localStorage.cdccta_map_settings) ? JSON.parse(localStorage.cdccta_map_settings) : null;
  1219. var items = this.__items;
  1220. var changed = false;
  1221. if ((items != null) && (original != null) && (items.length != original.length)) changed = true;
  1222. if ((items != null) && (original != null) && (items.length == original.length))
  1223. {
  1224. original.map(function(x)
  1225. {
  1226. if (items.indexOf(x[0]) < 0) changed = true;
  1227. });
  1228. }
  1229. ((items.length > 0) && ((original === null) || changed)) ? this.saveButton.setEnabled(true) : this.saveButton.setEnabled(false);
  1230. },
  1231. __checkDefaults: function()
  1232. {
  1233. var defaults = cdccta_map.getInstance().__defaultAlliances, items = this.__items, changed = false;
  1234. if(!defaults) return;
  1235. if ((items != null) && (defaults != null) && (items.length != defaults.length)) changed = true;
  1236. if ((items != null) && (defaults != null) && (items.length == defaults.length))
  1237. {
  1238. defaults.map(function(x)
  1239. {
  1240. if (items.indexOf(x[0]) < 0) changed = true;
  1241. });
  1242. }
  1243. (changed) ? this.defaultsButton.setEnabled(true) : this.defaultsButton.setEnabled(false);
  1244. },
  1245. __currentListModified: function()
  1246. {
  1247. var map = cdccta_map.getInstance(), current = (map.__selectedAlliances == null) ? map.__defaultAlliances : map.__selectedAlliances;
  1248. var items = this.__items, changed = false;
  1249. current.map(function(x)
  1250. {
  1251. if(items.indexOf(x[0]) < 0) changed = true;
  1252. });
  1253. ((items.length > 0) && ((items.length != current.length) || (changed == true))) ? this.applyButton.setEnabled(true) : this.applyButton.setEnabled(false);
  1254. }
  1255. }
  1256. });
  1257. }
  1258. var cctaMapLoader = function()
  1259. {
  1260. var qx = window["qx"];
  1261. var ClientLib = window["ClientLib"];
  1262. var webfrontend = window["webfrontend"];
  1263. if ((typeof ClientLib == 'undefined') || (typeof qx == 'undefined') || (qx.core.Init.getApplication().initDone == false))
  1264. {
  1265. setTimeout(cctaMapLoader, 1000);
  1266. console.log('retrying....');
  1267. }
  1268. else
  1269. {
  1270. create_cdccta_map_class();
  1271. cdccta_map.getInstance();
  1272. }
  1273. };
  1274. window.setTimeout(cctaMapLoader, 10000);
  1275.  
  1276. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址