The West Fortbattle Tool

Fort battle tools for The West!

  1. // ==UserScript==
  2. // @name The West Fortbattle Tool
  3. // @namespace The West Fortbattle Tool
  4. // @author westernblumi (updated by Tom Robert)
  5. // @description Fort battle tools for The West!
  6. // @include https://*.the-west.*/game.php*
  7. // @version 1.20
  8. // @grant none
  9. // ==/UserScript==
  10. // translation:westernblumi(German & English),pepe100(Spanish),Ruslan Jackson(Italiano)
  11. (function (fn) {
  12. var script = document.createElement('script');
  13. script.setAttribute('type', 'application/javascript');
  14. script.textContent = '(' + fn.toString() + ')();';
  15. document.body.appendChild(script);
  16. document.body.removeChild(script);
  17. })(function () {
  18. TWFBT = {
  19. version: '1.20',
  20. name: 'TW Fortbattle Tool',
  21. website: '//gf.qytechs.cn/scripts/22880',
  22. url: '//tomrobert.safe-ws.de/',
  23. langs: {
  24. en: {
  25. attack: 'Attack',
  26. bonusByClothes: 'Bonus by Clothes',
  27. bonusBySets: 'Bonus by Sets',
  28. bonusBySkill: 'Bonus by skill',
  29. bonusDefault: 'Defaultbonus',
  30. bonusTotal: 'Total',
  31. calcBonus: 'Calculate fort battle bonus',
  32. calculator: 'Calculator',
  33. clear: 'Clear Window',
  34. clothes: 'Clothes',
  35. damageBonus: 'Damage',
  36. defense: 'Defense',
  37. newFormula: 'new formula',
  38. oldFormula: 'old formula',
  39. pa: 'Premium (soldier and worker fort battle bonus)',
  40. pitfall: 'Setting traps',
  41. resistance: 'Resistance',
  42. scriptName: 'The West Fortbattle Tool',
  43. showFurtherStatistics: 'Show more statistics',
  44. team: 'Team',
  45. player: 'Player',
  46. playerCount: 'Number of players',
  47. survivingPlayerCount: 'Surviving players',
  48. offlinePlayerCount: 'Offline players',
  49. maxhp: 'Maximum healthpoints',
  50. starthp: 'Health at the start of the battle',
  51. finishedhp: 'Health at the end of the battle',
  52. totalcauseddamage: 'Total damage inflicted',
  53. hitcount: 'Hits',
  54. misscount: 'Misses',
  55. dodgecount: 'Dodges',
  56. takenhits: 'Hits taken',
  57. crithits: 'Critical Hits',
  58. diedwhen: 'Average lifetime',
  59. onlinecount: 'Average online rounds',
  60. takendamage: 'Taken damage',
  61. charlevel: 'Average level',
  62. criticalHits: 'Critical hits',
  63. points: 'Points',
  64. ranking: 'Ranking',
  65. town: 'Town',
  66. attacker: 'Attacker',
  67. defender: 'Defender',
  68. charclass: 'Class',
  69. side: 'Side',
  70. playerName: 'Player name',
  71. offliner: 'Offline players',
  72. totalShots: 'Total shots',
  73. hitPercentage: 'Hits in %',
  74. dodgePercentage: 'Dodges in %',
  75. damagePerHit: 'Damage per hit',
  76. averageWeaponDamage: 'Average weapon damage',
  77. shotsPerPlayer: 'Shots',
  78. order: 'Order of movement',
  79. rank: 'Rank',
  80. weapons: 'Weapons',
  81. weapon: 'Weapon',
  82. damageBuff: 'Damage buff',
  83. noBuff: 'No damage buff',
  84. sectorBonus: 'Sector bonus',
  85. timeOfDeath: 'Time of death',
  86. round: 'Round',
  87. kos: 'KO\'s',
  88. damage: 'Damage',
  89. lifepointsAtRoundEnd: 'Lifepoints at the end of the round',
  90. passedOutDuringFight: 'Enemys passed out during that round',
  91. rounds: 'Rounds',
  92. importBattle: 'Import battle',
  93. importSuccessfull: 'Import successfull',
  94. importError: 'Import not successfull, the text contains errors',
  95. exportBattle: 'Export battle',
  96. overview: 'Overview',
  97. exportWeapons: 'Export weapons',
  98. exportRanking: 'Export ranking',
  99. exportOrderOfMovement: 'Export order of movement',
  100. exportTimeOfDeath: 'Export time of death',
  101. statistic: 'Statistic',
  102. pasteExport: 'Paste the text you got at the battle export',
  103. exportRounds: 'Export rounds',
  104. export: 'Export',
  105. exportBattleDescription: 'Here you can export the battle and e.g. import it at a later time',
  106. exportSingleStatisticDescription: 'Here you can export various statastics for using it in Excel',
  107. playdeadcount: 'Active adventurer bonus (invisibility)',
  108. },
  109. de: {
  110. attack: 'Angriff',
  111. bonusByClothes: 'Bonus durch Kleidung',
  112. bonusBySets: 'Bonus durch Sets',
  113. bonusBySkill: 'Bonus durch Skillung',
  114. bonusDefault: 'Grundbonus',
  115. bonusTotal: 'Gesamt',
  116. calcBonus: 'Berechne Fortkampfbonus',
  117. calculator: 'Rechner',
  118. clear: 'Lösche Berechnungen',
  119. clothes: 'Kleidung',
  120. damageBonus: 'Schaden',
  121. defense: 'Verteidigung',
  122. newFormula: 'neue Formel',
  123. oldFormula: 'alte Formel',
  124. pa: 'Premium (Soldaten und Arbeiterbonus)',
  125. pitfall: 'Fallen stellen',
  126. resistance: 'Widerstand',
  127. scriptName: 'The West FK Tool',
  128. showFurtherStatistics: 'Zeige weitere Statistiken',
  129. team: 'Team',
  130. player: 'Spieler',
  131. playerCount: 'Spielerzahl',
  132. survivingPlayerCount: 'Überlebende Spieler',
  133. offlinePlayerCount: 'Offliner',
  134. maxhp: 'Maximale Lebenspunkte',
  135. starthp: 'Lebenspunkte am Anfang',
  136. finishedhp: 'Lebenspunkte am Ende',
  137. totalcauseddamage: 'Schaden',
  138. hitcount: 'Treffer',
  139. misscount: 'Fehlschüsse',
  140. dodgecount: 'Ausweicher',
  141. takenhits: 'Eingesteckte Treffer',
  142. crithits: 'Kritische Treffer',
  143. diedwhen: 'Durchschnittliche Lebensdauer',
  144. onlinecount: 'Durchschnittliche Anzahl an Onlinerunden',
  145. takendamage: 'Eingesteckter Schaden',
  146. charlevel: 'Level',
  147. criticalHits: 'Kritische Treffer',
  148. points: 'Punktzahl',
  149. ranking: 'Rangliste',
  150. town: 'Stadt',
  151. attacker: 'Angreifer',
  152. defender: 'Verteidiger',
  153. charclass: 'Klasse',
  154. side: 'Seite',
  155. playerName: 'Spielername',
  156. offliner: 'Offliner',
  157. totalShots: 'Abgegebene Schüsse',
  158. hitPercentage: 'Treffer in %',
  159. dodgePercentage: 'Ausweicher in %',
  160. damagePerHit: 'Schaden pro Treffer',
  161. averageWeaponDamage: 'Durchschnittlicher Waffenschaden',
  162. shotsPerPlayer: 'Abgegebene Schüsse',
  163. order: 'Zugreihenfolge',
  164. rank: 'Rang',
  165. weapons: 'Waffen',
  166. weapon: 'Waffe',
  167. damageBuff: 'Schadensbuff',
  168. noBuff: 'Kein Schadensbuff',
  169. sectorBonus: 'Sektorbonus',
  170. timeOfDeath: 'Todeszeitpunkt',
  171. round: 'Runde',
  172. kos: 'KO\'s',
  173. damage: 'Schaden',
  174. lifepointsAtRoundEnd: 'Lebenspunkte am Ende der Runde',
  175. passedOutDuringFight: 'Ko geschossen in dieser Runde',
  176. rounds: 'Runden',
  177. importBattle: 'Kampf importieren',
  178. importSuccessfull: 'Das Importieren war erfolgreich',
  179. importError: 'Das Importieren war nicht möglich, da der Text fehlerhaft ist',
  180. exportBattle: 'Kampf exportieren',
  181. overview: 'Übersicht',
  182. exportWeapons: 'Waffen exportieren',
  183. exportRanking: 'Rangliste exportieren',
  184. exportOrderOfMovement: 'Zugreihenfolge exportieren',
  185. exportTimeOfDeath: 'Todeszeitpunkte exportieren',
  186. statistic: 'Statistik',
  187. pasteExport: 'Füge hier den Text ein, den du beim Exportieren erhalten hast',
  188. exportRounds: 'Runden exportieren',
  189. export: 'Export',
  190. exportBattleDescription: 'Hier kannst du den Kampf exportieren und z.B. für den FK Player verwenden oder ihn später wieder Importieren',
  191. exportSingleStatisticDescription: 'Hier kannst du verschiedenen Einzelstatistiken exportieren und in Excel verwenden',
  192. playdeadcount: 'Aktiver Abenteurer-Bonus (Ghost)',
  193. },
  194. es: {
  195. attack: 'Ataque',
  196. bonusByClothes: 'Bono por Ropas',
  197. bonusBySets: 'Bono por Conjuntos',
  198. bonusBySkill: 'Bono por Habilidad',
  199. bonusDefault: 'Bono por Defecto',
  200. bonusTotal: 'Total',
  201. calcBonus: 'Calcular Bono de Batalla',
  202. calculator: 'Calculadora',
  203. clear: 'Limpiar Ventana',
  204. clothes: 'Ropa',
  205. damageBonus: 'Daño',
  206. defense: 'Defensa',
  207. newFormula: 'fórmula nueva',
  208. oldFormula: 'fórmula antigua',
  209. pa: 'Premium (bonus Soldado/Trabajador)',
  210. pitfall: 'Poner trampas',
  211. resistance: 'Resistencia',
  212. scriptName: 'The West Fortbattle Tool',
  213. showFurtherStatistics: 'Mostrar más estadísticas',
  214. team: 'Equipo',
  215. player: 'Jugador',
  216. playerCount: 'Número de jugadores',
  217. survivingPlayerCount: 'Jugadores supervivientes',
  218. offlinePlayerCount: 'Jugadores Off',
  219. maxhp: 'Puntos de salud máximos',
  220. starthp: 'Vida al inicio de la batalla',
  221. finishedhp: 'Vida al final de la batalla',
  222. totalcauseddamage: 'Total daño causado',
  223. hitcount: 'Aciertos realizados',
  224. misscount: 'Fallos',
  225. dodgecount: 'Eludidos',
  226. takenhits: 'Aciertos recibidos',
  227. crithits: 'Críticos',
  228. diedwhen: 'Tiempo de vida promedio',
  229. onlinecount: 'Media de rondas On',
  230. takendamage: 'Daño recibido',
  231. charlevel: 'Nivel medio',
  232. criticalHits: 'Críticos',
  233. points: 'Puntos',
  234. ranking: 'Ranking',
  235. town: 'Ciudad',
  236. attacker: 'Atacante',
  237. defender: 'Defensor',
  238. charclass: 'Clase',
  239. side: 'Lado',
  240. playerName: 'Nombre jugador',
  241. offliner: 'Jugadores Off',
  242. totalShots: 'Total disparos',
  243. hitPercentage: '% Aciertos',
  244. dodgePercentage: '% Eludidos',
  245. damagePerHit: 'Daño por acierto',
  246. averageWeaponDamage: 'Daño medio arma',
  247. shotsPerPlayer: 'Disparos',
  248. order: 'Orden de movimientos',
  249. rank: 'Rango',
  250. weapons: 'Armas',
  251. weapon: 'Arma',
  252. damageBuff: 'Buff de Daño',
  253. noBuff: 'Sin Buff de Daño',
  254. sectorBonus: 'Bonus de Sector',
  255. timeOfDeath: 'Hora de la muerte',
  256. round: 'Ronda',
  257. kos: 'Desmayos',
  258. damage: 'Daño',
  259. lifepointsAtRoundEnd: 'Puntos de vida al final de la ronda',
  260. passedOutDuringFight: 'Enemigos desmayados durante esa ronda',
  261. rounds: 'Rondas',
  262. importBattle: 'Importar batalla',
  263. importSuccessfull: 'Importación correcta',
  264. importError: 'Importación incorrecta, el texto contiene errores',
  265. exportBattle: 'Exportar batalla',
  266. overview: 'Resumen',
  267. exportWeapons: 'Exportar armas',
  268. exportRanking: 'Exportar clasificación',
  269. exportOrderOfMovement: 'Exportar orden de movimientos',
  270. exportTimeOfDeath: 'Exportar Hora de la muerte',
  271. statistic: 'Estadística',
  272. pasteExport: 'Paste the text you got at the battle export',
  273. exportRounds: 'Exportar rondas',
  274. export: 'Exportar',
  275. exportBattleDescription: 'Aquí puedes exportar la batalla para, por ejemplo, importarla más tarde',
  276. exportSingleStatisticDescription: 'Aquí puedes exportar varias estadísticas para usarlas en Excel',
  277. playdeadcount: 'Bono de aventurero activo (Invisibilidad)',
  278. },
  279. it: {
  280. language: 'Italiano',
  281. attack: 'Attaco',
  282. bonusByClothes: 'Bonus dei Vestiti',
  283. bonusBySets: 'Bonus dei Set Sets',
  284. bonusBySkill: 'Bonus delle skill',
  285. bonusDefault: 'Bonus di default',
  286. bonusTotal: 'Totale',
  287. calcBonus: 'Calcola il bonus batalgie forti',
  288. calculator: 'Calcolatrice',
  289. clear: 'Axxera Finestra',
  290. clothes: 'Vestiti',
  291. damageBonus: 'Danno',
  292. defense: 'Bonus difesa',
  293. newFormula: 'nuova formula',
  294. oldFormula: 'vecchia formula',
  295. pa: 'Premium (Bonus bataglia forte per il soldato e lavoratore)',
  296. pitfall: 'Trappole',
  297. resistance: 'Resistenza',
  298. scriptName: 'The West Tool per le Batagli Forti',
  299. showFurtherStatistics: 'Show more statistics',
  300. team: 'Team',
  301. player: 'Player',
  302. playerCount: 'Number of players',
  303. survivingPlayerCount: 'Surviving players',
  304. offlinePlayerCount: 'Offline players',
  305. maxhp: 'Maximum healthpoints',
  306. starthp: 'Health at the start of the battle',
  307. finishedhp: 'Health at the end of the battle',
  308. totalcauseddamage: 'Total damage inflicted',
  309. hitcount: 'Hits',
  310. misscount: 'Misses',
  311. dodgecount: 'Dodges',
  312. takenhits: 'Hits taken',
  313. crithits: 'Critical Hits',
  314. diedwhen: 'Average lifetime',
  315. onlinecount: 'Average online rounds',
  316. takendamage: 'Taken damage',
  317. charlevel: 'Average level',
  318. criticalHits: 'Kritische Treffer',
  319. points: 'Points',
  320. ranking: 'Ranking',
  321. town: 'Town',
  322. attacker: 'Attacker',
  323. defender: 'Defender',
  324. charclass: 'Class',
  325. side: 'Side',
  326. playerName: 'Player name',
  327. offliner: 'Offline players',
  328. totalShots: 'Total shots',
  329. hitPercentage: 'Hits in %',
  330. dodgePercentage: 'Dodges in %',
  331. damagePerHit: 'Damage per hit',
  332. averageWeaponDamage: 'Average weapon damage',
  333. shotsPerPlayer: 'Shots',
  334. order: 'Order of movement',
  335. rank: 'Rank',
  336. weapons: 'Weapons',
  337. weapon: 'Weapon',
  338. damageBuff: 'Damage buff',
  339. noBuff: 'No damage buff',
  340. sectorBonus: 'Sector bonus',
  341. timeOfDeath: 'Time of death',
  342. round: 'Round',
  343. kos: 'KO\'s',
  344. damage: 'Damage',
  345. lifepointsAtRoundEnd: 'Lifepoints at the end of the round',
  346. passedOutDuringFight: 'Enemys passed out during that round',
  347. rounds: 'Rounds',
  348. importBattle: 'Import battle',
  349. importSuccessfull: 'Import successfull',
  350. importError: 'Import not successfull, the text contains errors',
  351. exportBattle: 'Export battle',
  352. overview: 'Overview',
  353. exportWeapons: 'Export weapons',
  354. exportRanking: 'Export ranking',
  355. exportOrderOfMovement: 'Export order of movement',
  356. exportTimeOfDeath: 'Export time of death',
  357. statistic: 'Statistic',
  358. pasteExport: 'Paste the text you got at the battle export',
  359. exportRounds: 'Export rounds',
  360. export: 'Export',
  361. exportBattleDescription: 'Here you can export the battle and e.g. import it at a later time',
  362. exportSingleStatisticDescription: 'Here you can export various statastics for using it in Excel',
  363. playdeadcount: 'Active adventurer bonus (invisibility)',
  364. },
  365. },
  366. side: 'attack',
  367. formula: 'newFormula',
  368. Images: {
  369. settings: 'data:image/jpeg;base64,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',
  370. charClasses: 'data:image/png;base64,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',
  371. },
  372. updateLang: function () {
  373. var lgs = TWFBT.langs,
  374. lg = [localStorage.getItem('scriptsLang'), Game.locale.substr(0, 2)];
  375. TWFBT.lang = lgs[lg[0]] ? lg[0] : lgs[lg[1]] ? lg[1] : 'en';
  376. TWFBTlang = lgs[TWFBT.lang];
  377. },
  378. };
  379. TWFBT.updateLang();
  380. TWFBT.Skript = {
  381. init: function () {
  382. TWFBT.Statistics.init();
  383. TWFBT.PreBattleChars.init();
  384. var styling = $('<style>').text('.TWFBT_left { position: relative; left: 28px; top: 20px;} .TWFBT_textarea {left: 20px; top: 25px;} .TWFBT_button {left: 25px; top: 30px;}');
  385. $('head').append(styling);
  386. var menuContainer = $('<div class="menulink" onClick="TWFBT.GUI.openTWFBTWindow();" title="' + TWFBTlang.scriptName + '">').css('background-image', 'url(' + TWFBT.Images.settings + ')').css('background-position', '0px 0px').on("mouseenter", function () {
  387. $(this).css('background-position', '-25px 0px');
  388. }).on('mouseleave', function () {
  389. $(this).css('background-position', '0px 0px');
  390. });
  391. $('#ui_menubar').append($('<div id="TWFBT_menubutton" class="ui_menucontainer">').append(menuContainer).append('<div class="menucontainer_bottom">'));
  392. },
  393. };
  394. var charclasses = {
  395. '-1': 'greenhorn',
  396. '0': 'adventurer',
  397. '1': 'duelist',
  398. '2': 'worker',
  399. '3': 'soldier',
  400. };
  401. TWFBT.GUI = {
  402. openTWFBTWindow: function () {
  403. TWFBT.GUI.open();
  404. TWFBT.GUI.calcSkill();
  405. },
  406. open: function () {
  407. TWFBT.GUI.window = wman.open('TWFBT', TWFBTlang.scriptName, 'noreload nocloseall').setMiniTitle(TWFBT.name);
  408. TWFBT.GUI.window.dontCloseAll = true;
  409. TWFBT.GUI.window.addTab(TWFBTlang.calculator, 'TWFBTCalcSkill', TWFBT.GUI.calcSkill);
  410. TWFBT.GUI.window.addTab(TWFBTlang.importBattle, 'TWFBTBattleImporterTab', TWFBT.GUI.showBattleImporter);
  411. },
  412. getDefault: function (tab) {
  413. TWFBT.GUI.window.clearContentPane().activateTab(tab);
  414. },
  415. showBattleImporter: function () {
  416. TWFBT.GUI.getDefault('TWFBTBattleImporterTab');
  417. var input = new west.gui.Textarea().setId("TWFBTbattleImporterInput").setWidth(635).setHeight(260);
  418. var importButton = new west.gui.Button(TWFBTlang.importBattle, function () {
  419. try {
  420. TWFBT.Statistics.stats.result = JSON.parse(input.getContent());
  421. MessageSuccess(TWFBTlang.importSuccessfull).show();
  422. TWFBT.Statistics.openStatsGUIOpen();
  423. } catch (err) {
  424. MessageError(TWFBTlang.importError).show();
  425. }
  426. }).getMainDiv();
  427. $(importButton).addClass("TWFBT_button");
  428. $(TWFBT.GUI.window.getContentPane()).append($("<span class='TWFBT_left strong'>" + TWFBTlang.pasteExport + ":<br></span>"),
  429. input.getMainDiv().addClass('TWFBT_textarea'), importButton);
  430. },
  431. calcSkill: function () {
  432. TWFBT.GUI.getDefault('TWFBTCalcSkill');
  433. var featScroll = new west.gui.Scrollpane();
  434. $(featScroll.getMainDiv()).css({
  435. 'margin-top': '10px'
  436. });
  437. var calcButton = new west.gui.Button(TWFBTlang.calcBonus, function () {
  438. TWFBT.Calculator.getLoader();
  439. });
  440. var clearButton = new west.gui.Button(TWFBTlang.clear, function () {
  441. clearTable();
  442. });
  443. if (TWFBT.pa === undefined)
  444. TWFBT.pa = Premium.hasBonus('character');
  445. if (TWFBT.characterClass === undefined)
  446. TWFBT.characterClass = Character.charClass;
  447. var paCheckbox = new west.gui.Checkbox().setLabel(TWFBTlang.pa).setCallback(function (t) {
  448. TWFBT.pa = t;
  449. }).setSelected(TWFBT.pa, 1);
  450. var charClassBox = new west.gui.Combobox();
  451. for (var p in charclasses) {
  452. p = charclasses[p];
  453. charClassBox.addItem(p, Game.InfoHandler.getLocalString4Charclass(p));
  454. }
  455. charClassBox.addListener(function (val) {
  456. TWFBT.characterClass = val;
  457. }).select(TWFBT.characterClass);
  458. var modeBox = new west.gui.Combobox()
  459. .addItem('attack', TWFBTlang.attack)
  460. .addItem('defense', TWFBTlang.defense)
  461. .addListener(function (val) {
  462. TWFBT.side = val;
  463. }).select(TWFBT.side);
  464. featScroll.appendContent([modeBox.getMainDiv(), '&emsp;',
  465. paCheckbox.getMainDiv(), '&emsp;',
  466. charClassBox.getMainDiv(), '<br>',
  467. calcButton.getMainDiv(),
  468. clearButton.getMainDiv(), '<table border="1" id="TWFBTCalculatorTable"></table>']);
  469. $(TWFBT.GUI.window.getContentPane()).append(featScroll.getMainDiv());
  470. var clearTable = function () {
  471. $('#TWFBTCalculatorTable').empty();
  472. };
  473. },
  474. };
  475. TWFBT.Calculator = {
  476. resetValues: function () {
  477. TWFBT.Calculator.values = {
  478. offense_defaultbonus: 25,
  479. defense_defaultbonus: 10,
  480. offense_fortbattlebonus: 0,
  481. defense_fortbattlebonus: 0,
  482. offense_setbonus: 0,
  483. defense_setbonus: 0,
  484. damageSector: 0,
  485. resistance: 0,
  486. };
  487. },
  488. getLoader: function () {
  489. if (!window.BattleCalc)
  490. $.getScript('//tw-calc.net/js/battle-calculator-core.js', function () {
  491. TWFBT.Calculator.calcSkills();
  492. }).fail(function () {
  493. alert('TWFBT error: ' + JSON.stringify(arguments))
  494. });
  495. else
  496. this.calcSkills();
  497. },
  498. calcSkills: function () {
  499. this.resetValues();
  500. if (!BattleCalc.getItemBonus_twfbt) {
  501. BattleCalc.getItemBonus_twfbt = BattleCalc.getItemBonus;
  502. BattleCalc.getItemBonus = function () {
  503. var b = BattleCalc.getItemBonus_twfbt.apply(this, arguments),
  504. tcv = TWFBT.Calculator.values;
  505. tcv.offense_fortbattlebonus += b.offense || 0;
  506. tcv.defense_fortbattlebonus += b.defense || 0;
  507. tcv.damageSector += b.damage || 0;
  508. tcv.resistance += b.resistance || 0;
  509. return b;
  510. };
  511. BattleCalc.getSetBonus_twfbt = BattleCalc.getSetBonus;
  512. BattleCalc.getSetBonus = function () {
  513. var c = BattleCalc.getSetBonus_twfbt.apply(this, arguments),
  514. tcw = TWFBT.Calculator.values;
  515. tcw.offense_setbonus += c.offense || 0;
  516. tcw.defense_setbonus += c.defense || 0;
  517. tcw.damageSector += c.damage || 0;
  518. tcw.resistance += c.resistance || 0;
  519. return c;
  520. };
  521. }
  522. this.input = {
  523. charClass: TWFBT.characterClass,
  524. premium: TWFBT.pa,
  525. level: Character.level,
  526. skills: {
  527. health: CharacterSkills.skills.health.getPointsWithBonus(),
  528. leadership: CharacterSkills.skills.leadership.getPointsWithBonus(),
  529. pitfall: CharacterSkills.skills.pitfall.getPointsWithBonus(),
  530. hide: CharacterSkills.skills.hide.getPointsWithBonus(),
  531. dodge: CharacterSkills.skills.dodge.getPointsWithBonus(),
  532. aim: CharacterSkills.skills.aim.getPointsWithBonus()
  533. },
  534. map_position: 0,
  535. bonus: {}
  536. };
  537. this.result = BattleCalc.coreCalc(this.input, 1);
  538. this.showData();
  539. },
  540. showData: function () {
  541. var CSkN = CharacterSkills.keyNames,
  542. trs = this.result[TWFBT.side],
  543. tv = this.values,
  544. side = TWFBT.side == 'attack' ? 'hide' : 'pitfall';
  545. content = $('<tr></tr>');
  546. content.append('<th colspan="9">' + TWFBTlang[TWFBT.side] + '</th>');
  547. $('#TWFBTCalculatorTable').append(content);
  548. content = $('<tr><th>' +
  549. CSkN.leadership + '</th><th>' +
  550. CSkN[side] + '</th><th>' +
  551. CSkN.aim + '</th><th>' +
  552. CSkN.dodge + '</th><th>' +
  553. TWFBTlang.bonusBySkill + '</th><th>' +
  554. TWFBTlang.bonusByClothes + '</th><th>' +
  555. TWFBTlang.bonusBySets + '</th><th>' +
  556. TWFBTlang.bonusDefault + '</th><th>' +
  557. TWFBTlang.bonusTotal + '</th></tr>');
  558. $('#TWFBTCalculatorTable').append(content);
  559. content = $('<tr></tr>');
  560. content.append('<td align="center">' + this.input.skills.leadership + '</td>' +
  561. '<td align="center">' + this.input.skills[side] + '</td>' +
  562. '<td align="center">' + this.input.skills.aim + '</td>' +
  563. '<td align="center">' + this.input.skills.dodge + '</td>' +
  564. '<td align="center">' + Math.round((trs.hit - tv.offense_defaultbonus - tv.offense_setbonus - tv.offense_fortbattlebonus) * 100) / 100 + '<br>' + Math.round((trs.dodge - tv.defense_defaultbonus - tv.defense_setbonus - tv.defense_fortbattlebonus) * 100) / 100 + '</td>' +
  565. '<td align="center">' + tv.offense_fortbattlebonus + '<br>' + tv.defense_fortbattlebonus + '</td>' +
  566. '<td align="center">' + tv.offense_setbonus + '<br>' + tv.defense_setbonus + '</td>' +
  567. '<td align="center">' + tv.offense_defaultbonus + '<br>' + tv.defense_defaultbonus + '</td>' +
  568. '<td align="center">' + trs.hit + '<br>' + trs.dodge + '</td>');
  569. $('#TWFBTCalculatorTable').append(content);
  570. content = $('<tr></tr>');
  571. content.append('<th>' + TWFBTlang.damageBonus + '</th><td align="center" style="vertical-align:middle;" colspan="2">' + this.result.damage + '<br>(' + tv.damageSector + ' ' + TWFBTlang.sectorBonus + ')</td>' +
  572. '<th colspan="2">' + TWFBTlang.resistance + '</th><td align="center" style="vertical-align:middle;">' + trs.resistance + '<br>(' + tv.resistance + ' ' + TWFBTlang.clothes + ')</td>' +
  573. '<th colspan="2">' + CSkN.health + '</th><td align="center" style="vertical-align:middle;">' + this.result.health + '</td>');
  574. $('#TWFBTCalculatorTable').append(content);
  575. content = $('<tr></tr>');
  576. var item_string = '';
  577. for (var item in Wear.wear) {
  578. var item_obj = Wear.wear[item].obj;
  579. var popup = new ItemPopup(item_obj, {
  580. character: {
  581. level: Character.level
  582. }
  583. }).popup;
  584. item_string += '<a class="itemlink hasMousePopup" href="javascript:void(0)" title="' + popup.getXHTML().escapeHTML() + '">' + item_obj.name + '<img width="15" height="15" src="' + item_obj.image + '"> </a>';
  585. }
  586. content.append('<th>' + TWFBTlang.clothes + '</th><td align="left" colspan="8">' + item_string + '</td>');
  587. $('#TWFBTCalculatorTable').append(content);
  588. },
  589. };
  590. TWFBT.Statistics = {
  591. openStatsGUIOpen: function () {
  592. TWFBT.Statistics.openStatsGUI();
  593. TWFBT.Statistics.showOverviewTab();
  594. },
  595. openStatsGUI: function () {
  596. TWFBT.Statistics.window = wman.open('TWFBT_2', TWFBTlang.scriptName, 'noreload').setMiniTitle(TWFBT.name)
  597. .addTab(TWFBTlang.overview, 'TWFBTOverviewTab', TWFBT.Statistics.showOverviewTab)
  598. .addTab(TWFBTlang.team, 'TWFBTTesterTab1', TWFBT.Statistics.showTeamStatsTab)
  599. .addTab(TWFBTlang.player, 'TWFBTTesterTab2', TWFBT.Statistics.showPerPlayerStatsTab)
  600. .addTab(TWFBTlang.ranking, 'TWFBTTesterTab3', TWFBT.Statistics.showRankingTab)
  601. .addTab(TWFBTlang.order, 'TWFBTTesterTab4', TWFBT.Statistics.showOrderTab)
  602. .addTab(TWFBTlang.weapons, 'TWFBTTesterTab5', TWFBT.Statistics.showWeaponsTab)
  603. .addTab(TWFBTlang.timeOfDeath, 'TWFBTTesterTab6', TWFBT.Statistics.showTimeOfDeathTab)
  604. .addTab(TWFBTlang.rounds, 'TWFBTTesterTab7', TWFBT.Statistics.showRoundStatsTab);
  605. },
  606. getDefault: function (tab) {
  607. TWFBT.Statistics.window.clearContentPane().activateTab(tab);
  608. },
  609. showOverviewTab: function () {
  610. TWFBT.Statistics.getDefault('TWFBTOverviewTab');
  611. var showTeamStatsButton = new west.gui.Button(TWFBTlang.team, TWFBT.Statistics.showTeamStatsTab).getMainDiv(),
  612. showPerPlayerStatsButton = new west.gui.Button(TWFBTlang.player, TWFBT.Statistics.showPerPlayerStatsTab).getMainDiv(),
  613. showRankingButton = new west.gui.Button(TWFBTlang.ranking, TWFBT.Statistics.showRankingTab).getMainDiv(),
  614. showOrderButton = new west.gui.Button(TWFBTlang.order, TWFBT.Statistics.showOrderTab).getMainDiv(),
  615. showWeaponsButton = new west.gui.Button(TWFBTlang.weapons, TWFBT.Statistics.showWeaponsTab).getMainDiv(),
  616. showTimeOfDeathButton = new west.gui.Button(TWFBTlang.timeOfDeath, TWFBT.Statistics.showTimeOfDeathTab).getMainDiv(),
  617. showRoundStatsButton = new west.gui.Button(TWFBTlang.rounds, TWFBT.Statistics.showRoundStatsTab).getMainDiv(),
  618. input = new west.gui.Textarea().setId("TWFBTbattleExporterInput").setWidth(450).setHeight(200),
  619. exportAllButton = new west.gui.Button(TWFBTlang.exportBattle, function () {
  620. TWFBT.Statistics.exportFunction(input, JSON.stringify(TWFBT.Statistics.stats.result));
  621. }).getMainDiv(),
  622. exportRankingButton = new west.gui.Button(TWFBTlang.exportRanking, function () {
  623. TWFBT.Statistics.exportFunction(input, TWFBT.Statistics.exportRankingStatistics());
  624. }).getMainDiv(),
  625. exportOrderOfMovementButton = new west.gui.Button(TWFBTlang.exportOrderOfMovement, function () {
  626. TWFBT.Statistics.exportFunction(input, TWFBT.Statistics.exportOrderOfMovementStatistics());
  627. }).getMainDiv(),
  628. exportWeaponsButton = new west.gui.Button(TWFBTlang.exportWeapons, function () {
  629. TWFBT.Statistics.exportFunction(input, TWFBT.Statistics.exportWeaponStatistics());
  630. }).getMainDiv(),
  631. exportTimeOfDeathButton = new west.gui.Button(TWFBTlang.exportTimeOfDeath, function () {
  632. TWFBT.Statistics.exportFunction(input, TWFBT.Statistics.exportTimeOfDeathStatistics());
  633. }).getMainDiv(),
  634. exportRoundsButton = new west.gui.Button(TWFBTlang.exportRounds, function () {
  635. TWFBT.Statistics.exportFunction(input, TWFBT.Statistics.exportRoundStatistics());
  636. }).getMainDiv();
  637. $(TWFBT.Statistics.window.getContentPane()).append($("<span class='TWFBT_left strong'>" + TWFBTlang.statistic + ' ' + TWFBTlang.overview + ":<br></span>"), showTeamStatsButton, showPerPlayerStatsButton, showRankingButton, showOrderButton, '<br><br>', showWeaponsButton, showTimeOfDeathButton, showRoundStatsButton, '<br><br>', $("<span class='TWFBT_left strong'>" + TWFBTlang.export + ":<br></span>"), "<span class='TWFBT_left'>" + TWFBTlang.exportBattleDescription + ":<br></span>", exportAllButton, "<br><br><br><span class='TWFBT_left'>" + TWFBTlang.exportSingleStatisticDescription + ":<br></span>", exportRankingButton, exportOrderOfMovementButton, exportWeaponsButton, '<br><br>', exportTimeOfDeathButton, exportRoundsButton);
  638. $('.TWFBT_2 .tw2gui_button').addClass("TWFBT_button");
  639. },
  640. showTeamStatsTab: function () {
  641. var that = TWFBT.Statistics;
  642. that.getDefault('TWFBTTesterTab1');
  643. var featScroll = new west.gui.Scrollpane();
  644. $(featScroll.getMainDiv()).css({
  645. 'margin-top': '5px'
  646. });
  647. featScroll.appendContent([that.getProgressBar(that.stats.result.attackerlist.length, that.stats.result.defenderlist.length, TWFBTlang.playerCount),
  648. that.getPBv(that.getOffliner()),
  649. that.getPBv(that.getSurvivingPlayer()),
  650. that.getPBv(that.getValueSums('totalcauseddamage')),
  651. that.getPBv(that.getTotalShots()),
  652. that.getPBv(that.getValueSums('crithits')),
  653. that.getPBv(that.getValueSums('playdeadcount')),
  654. that.getPBv(that.getValueSums('maxhp')),
  655. that.getPBv(that.getValueSums('starthp')),
  656. that.getPBv(that.getValueSums('finishedhp')),
  657. that.getProgressBarWithSingleStat(that.getHitPercentage('attacker')),
  658. that.getProgressBarWithSingleStat(that.getHitPercentage('defender')),
  659. that.getProgressBarWithSingleStat(that.getDodgePercentage('attacker')),
  660. that.getProgressBarWithSingleStat(that.getDodgePercentage('defender')),
  661. that.getPBv(that.getValueSums('hitcount')),
  662. that.getPBv(that.getValueSums('misscount')),
  663. that.getPBv(that.getValueSums('dodgecount')),
  664. that.getPBv(that.getValueSums('takenhits')),
  665. that.getPBv(that.getCharClasses(0)),
  666. that.getPBv(that.getCharClasses(1)),
  667. that.getPBv(that.getCharClasses(2)),
  668. that.getPBv(that.getCharClasses(3)),
  669. that.getPBv(that.getCharClasses(-1))]);
  670. var buffs = that.getBuffs();
  671. for (var buff in buffs[0])
  672. if (buffs[0].hasOwnProperty(buff))
  673. if (buff != '0-0')
  674. featScroll.appendContent(that.getProgressBar(buffs[0][buff], buffs[1][buff], TWFBTlang.damageBuff + ' +' + buff));
  675. else
  676. featScroll.appendContent(that.getProgressBar(buffs[0][buff], buffs[1][buff], TWFBTlang.noBuff));
  677. $(that.window.getContentPane()).append(featScroll.getMainDiv());
  678. },
  679. showPerPlayerStatsTab: function () {
  680. var that = TWFBT.Statistics;
  681. that.getDefault('TWFBTTesterTab2');
  682. var featScroll = new west.gui.Scrollpane();
  683. $(featScroll.getMainDiv()).css({
  684. 'margin-top': '5px'
  685. });
  686. featScroll.appendContent([that.getPBv(that.getAverage('charlevel')),
  687. that.getPBv(that.getAverage('maxhp')),
  688. that.getPBv(that.getAverage('starthp')),
  689. that.getPBv(that.getAverage('finishedhp')),
  690. that.getPBv(that.getAverage('totalcauseddamage')),
  691. that.getPBv(that.getDamagerPerHit()),
  692. that.getPBv(that.getAverageWeaponDamage()),
  693. that.getPBv(that.getAverageLifetime()),
  694. that.getPBv(that.getAverageOnlineTime()),
  695. that.getPBv(that.getShotsPerPlayer()),
  696. that.getPBv(that.getAverage('takendamage')),
  697. that.getPBv(that.getAverage('hitcount')),
  698. that.getPBv(that.getAverage('dodgecount'))]);
  699. $(that.window.getContentPane()).append(featScroll.getMainDiv());
  700. },
  701. showRankingTab: function () {
  702. TWFBT.Statistics.showRanking('points_desc');
  703. },
  704. showRanking: function (sort) {
  705. var that = TWFBT.Statistics;
  706. that.getDefault('TWFBTTesterTab3');
  707. var currArray = that.getPlayerRanking();
  708. switch (sort) {
  709. case "takenhits":
  710. currArray.sort(that.sortByTakenHits);
  711. break;
  712. case "takenhits_desc":
  713. currArray.sort(that.sortByTakenHits).reverse();
  714. break;
  715. case "dodgecount":
  716. currArray.sort(that.sortByDodgeCount);
  717. break;
  718. case "dodgecount_desc":
  719. currArray.sort(that.sortByDodgeCount).reverse();
  720. break;
  721. case "totalcauseddamage":
  722. currArray.sort(that.sortByTotalCausedDamage);
  723. break;
  724. case "totalcauseddamage_desc":
  725. currArray.sort(that.sortByTotalCausedDamage).reverse();
  726. break;
  727. case "charclass":
  728. currArray.sort(that.sortByCharclass);
  729. break;
  730. case "charclass_desc":
  731. currArray.sort(that.sortByCharclass).reverse();
  732. break;
  733. case "side":
  734. currArray.sort(that.sortBySide);
  735. break;
  736. case "side_desc":
  737. currArray.sort(that.sortBySide).reverse();
  738. break;
  739. case "points":
  740. currArray.sort(that.sortByRankingValue);
  741. break;
  742. case "points_desc":
  743. currArray.sort(that.sortByRankingValue).reverse();
  744. break;
  745. case "name_desc":
  746. currArray.sort(that.sortByName).reverse();
  747. break;
  748. //case "name":
  749. default:
  750. sort = "name";
  751. currArray.sort(that.sortByName);
  752. }
  753. var thName = $('<a>' + TWFBTlang.playerName + '</a>').click(function () {
  754. that.showRanking(sort == 'name_desc' ? 'name' : 'name_desc');
  755. return false;
  756. });
  757. var thPoints = $('<a>' + TWFBTlang.points + '</a>').click(function () {
  758. that.showRanking(sort == 'points_desc' ? 'points' : 'points_desc');
  759. return false;
  760. });
  761. var thSide = $('<a>' + TWFBTlang.side + '</a>').click(function () {
  762. that.showRanking(sort == 'side_desc' ? 'side' : 'side_desc');
  763. return false;
  764. });
  765. var thCharclass = $('<a>' + TWFBTlang.charclass + '</a>').click(function () {
  766. that.showRanking(sort == 'charclass_desc' ? 'charclass' : 'charclass_desc');
  767. return false;
  768. });
  769. var thTotalCausedDamage = $(that.getReportIcon(TWFBTlang.totalcauseddamage, '0 -51px')).click(function () {
  770. that.showRanking(sort == 'totalcauseddamage_desc' ? 'totalcauseddamage' : 'totalcauseddamage_desc');
  771. return false;
  772. });
  773. var thTakenHits = $(that.getReportIcon(TWFBTlang.takenhits, '0 -102px')).click(function () {
  774. that.showRanking(sort == 'takenhits_desc' ? 'takenhits' : 'takenhits_desc');
  775. return false;
  776. });
  777. var thDodgeCount = $(that.getReportIcon(TWFBTlang.dodgecount, '0 -153px')).click(function () {
  778. that.showRanking(sort == 'dodgecount_desc' ? 'dodgecount' : 'dodgecount_desc');
  779. return false;
  780. });
  781. var mytable = new west.gui.Table().setId('TWFBT_ranking_table')
  782. .addColumn("TWFBT_ranking_name")
  783. .addColumn("TWFBT_ranking_points")
  784. .addColumn("TWFBT_ranking_side")
  785. .addColumn("TWFBT_ranking_charclass")
  786. .addColumn("TWFBT_ranking_totalcauseddamage")
  787. .addColumn("TWFBT_ranking_takenhits")
  788. .addColumn("TWFBT_ranking_dodgecount")
  789. .appendToCell("head", "TWFBT_ranking_name", thName)
  790. .appendToCell("head", "TWFBT_ranking_points", thPoints)
  791. .appendToCell("head", "TWFBT_ranking_side", thSide)
  792. .appendToCell("head", "TWFBT_ranking_charclass", thCharclass)
  793. .appendToCell("head", "TWFBT_ranking_totalcauseddamage", thTotalCausedDamage)
  794. .appendToCell("head", "TWFBT_ranking_takenhits", thTakenHits)
  795. .appendToCell("head", "TWFBT_ranking_dodgecount", thDodgeCount);
  796. $.each(currArray, function (index, player_obj) {
  797. mytable.appendRow(null, 'TWFBTRankingRow_' + index)
  798. .appendToCell(-1, "TWFBT_ranking_name", '<a href="#" onClick="PlayerProfileWindow.open(' + player_obj.westid + ');">' + player_obj.name + '</a>')
  799. .appendToCell(-1, "TWFBT_ranking_points", player_obj.formulaValue)
  800. .appendToCell(-1, "TWFBT_ranking_side", '<div style="color: ' + (player_obj.side == 'attacker' ? 'red' : 'blue') + ';">' + TWFBTlang[player_obj.side] + '</div>')
  801. .appendToCell(-1, "TWFBT_ranking_charclass", '<img title="' + Game.InfoHandler.getLocalString4Charclass(charclasses[player_obj.charclass]) + '" src="images/class_choose/class_' + charclasses[player_obj.charclass] + '.png">')
  802. .appendToCell(-1, "TWFBT_ranking_totalcauseddamage", player_obj.totalcauseddamage)
  803. .appendToCell(-1, "TWFBT_ranking_takenhits", player_obj.takenhits)
  804. .appendToCell(-1, "TWFBT_ranking_dodgecount", player_obj.dodgecount);
  805. });
  806. var styling = $('<style>').text('.remove-link { width:20px; } .TWFBT_ranking_name { width:190px; padding-left: 5px;} .TWFBT_ranking_points { text-align:center; width:80px; } .TWFBT_ranking_side { text-align:center; width:120px; } .TWFBT_ranking_charclass { text-align:center; width:60px; } .TWFBT_ranking_totalcauseddamage { text-align:center; width:80px; } .TWFBT_ranking_dodgecount { text-align:center; width:70px; } .TWFBT_ranking_takenhits { text-align:center; width:60px; }');
  807. $('head').append(styling);
  808. $(that.window.getContentPane()).empty();
  809. $(that.window.getContentPane()).append(mytable.getMainDiv());
  810. $('#TWFBT_ranking_table').css({
  811. 'margin-top': '5px'
  812. });
  813. $('#TWFBT_ranking_table > div.trows > div.tbody > div.tw2gui_scrollpane').css({
  814. 'height': '290px'
  815. });
  816. },
  817. showOrderTab: function () {
  818. var that = TWFBT.Statistics;
  819. that.getDefault('TWFBTTesterTab4');
  820. var currArray = that.getOrderOfMovement();
  821. /*var thName = $('<a>'+TWFBTlang.playerName+'</a>').click(function(){ TWFBT.Statistics.showRanking(sort == 'name' ? 'name_desc' : 'name'); return false; });
  822. var thPoints = $('<a>'+TWFBTlang.points+'</a>').click(function(){ TWFBT.Statistics.showRanking(sort == 'points' ? 'points_desc' : 'points'); return false; });
  823. var thSide = $('<a>'+TWFBTlang.side+'</a>').click(function(){ TWFBT.Statistics.showRanking(sort == 'side' ? 'side_desc' : 'side'); return false; });
  824. var thCharclass = $('<a>'+TWFBTlang.charclass+'</a>').click(function(){ TWFBT.Statistics.showRanking(sort == 'charclass' ? 'charclass_desc' : 'charclass'); return false; });
  825. var thTotalCausedDamage = $(getReportIcon(TWFBTlang.totalcauseddamage, '0 -51px')).click(function(){ TWFBT.Statistics.showRanking(sort == 'totalcauseddamage' ? 'totalcauseddamage_desc' : 'totalcauseddamage'); return false; });
  826. var thTakenHits = $(getReportIcon(TWFBTlang.takenhits, '0 -102px')).click(function(){ TWFBT.Statistics.showRanking(sort == 'takenhits' ? 'takenhits_desc' : 'takenhits'); return false; });
  827. var thDodgeCount = $(getReportIcon(TWFBTlang.dodgecount, '0 -153px')).click(function(){ TWFBT.Statistics.showRanking(sort == 'dodgecount' ? 'dodgecount_desc' : 'dodgecount'); return false; });
  828. */
  829. var mytable = new west.gui.Table().setId('TWFBT_order_table')
  830. .addColumn("TWFBT_order_attackerRank")
  831. .addColumn("TWFBT_order_attackerName")
  832. .addColumn("TWFBT_order_defenderRank")
  833. .addColumn("TWFBT_order_defenderName")
  834. .appendToCell("head", "TWFBT_order_attackerRank", TWFBTlang.rank)
  835. .appendToCell("head", "TWFBT_order_attackerName", TWFBTlang.attacker)
  836. .appendToCell("head", "TWFBT_order_defenderRank", TWFBTlang.rank)
  837. .appendToCell("head", "TWFBT_order_defenderName", TWFBTlang.defender);
  838. $.each(currArray, function (index, player_obj) {
  839. mytable.appendRow(null, 'TWFBTOrderRow_' + index)
  840. .appendToCell(-1, "TWFBT_order_attackerRank", player_obj.attackerRank)
  841. .appendToCell(-1, "TWFBT_order_attackerName", '<a href="#" onClick="PlayerProfileWindow.open(' + player_obj.attackerId + ');">' + player_obj.attackerName + '</a>')
  842. .appendToCell(-1, "TWFBT_order_defenderRank", player_obj.defenderRank)
  843. .appendToCell(-1, "TWFBT_order_defenderName", '<a href="#" onClick="PlayerProfileWindow.open(' + player_obj.defenderId + ');">' + player_obj.defenderName + '</a>');
  844. });
  845. var styling = $('<style>').text('.remove-link { width:20px; } .TWFBT_order_attackerRank { width:50px; text-align: center;} .TWFBT_order_defenderRank { width:50px; text-align: center;} .TWFBT_order_attackerName { width:195px;} .TWFBT_order_defenderName{ width:195px;}');
  846. $('head').append(styling);
  847. $(that.window.getContentPane()).empty();
  848. $(that.window.getContentPane()).append(mytable.getMainDiv());
  849. $('#TWFBT_order_table').css({
  850. 'margin-top': '5px',
  851. 'width': '523px',
  852. 'margin-Left': '87px',
  853. });
  854. $('#TWFBT_order_table > div.trows > div.tbody > div.tw2gui_scrollpane').css({
  855. 'height': '290px'
  856. });
  857. },
  858. showWeaponsTab: function () {
  859. var that = TWFBT.Statistics;
  860. that.getDefault('TWFBTTesterTab5');
  861. var currArray = that.getWeapons();
  862. var mytable = new west.gui.Table().setId('TWFBT_weapons_table')
  863. .addColumn("TWFBT_weapons_attacker")
  864. .addColumn("TWFBT_weapons_defender")
  865. .addColumn("TWFBT_weapons_id")
  866. .appendToCell("head", "TWFBT_weapons_attacker", TWFBTlang.attacker)
  867. .appendToCell("head", "TWFBT_weapons_defender", TWFBTlang.defender)
  868. .appendToCell("head", "TWFBT_weapons_id", TWFBTlang.weapon);
  869. $.each(currArray, function (index, object) {
  870. var item = ItemManager.get(object.weaponId);
  871. var popup = new ItemPopup(item, {
  872. character: {
  873. level: 150
  874. }
  875. }).popup;
  876. mytable.appendRow(null, 'TWFBTWeaponsRow_' + index)
  877. .appendToCell(-1, "TWFBT_weapons_attacker", '<div style="color: red;font-weight: bold;">' + (object.attackerWeaponsAmount || '') + '</div>')
  878. .appendToCell(-1, "TWFBT_weapons_defender", '<div style="color: blue;font-weight: bold;">' + (object.defenderWeaponsAmount || '') + '</div>')
  879. .appendToCell(-1, "TWFBT_weapons_id", '<a class="itemlink hasMousePopup" href="javascript:void(0)" title="' + popup.getXHTML().escapeHTML() + '">' + item.name + ' <img width="26" height="26" src="' + item.image + '"></a> <img width="15" height="12" src="images/items/item_level.png"> ' + item.item_level);
  880. });
  881. var styling = $('<style>').text('.TWFBT_weapons_attacker { width:100px; text-align: center;} .TWFBT_weapons_defender { width:100px; text-align: center;} .TWFBT_weapons_id { width:400px;}');
  882. $('head').append(styling);
  883. $(that.window.getContentPane()).empty();
  884. $(that.window.getContentPane()).append(mytable.getMainDiv());
  885. $('#TWFBT_weapons_table').css({
  886. 'margin-top': '5px',
  887. });
  888. $('#TWFBT_weapons_table > div.trows > div.tbody > div.tw2gui_scrollpane').css({
  889. 'height': '290px'
  890. });
  891. },
  892. showTimeOfDeathTab: function () {
  893. var that = TWFBT.Statistics;
  894. that.getDefault('TWFBTTesterTab6');
  895. var currArrays = that.getTimeOfDeath(),
  896. attacker = currArrays[0],
  897. defender = currArrays[1],
  898. row,
  899. mytable = new west.gui.Table().setId('TWFBT_timeOfDeath_table')
  900. .addColumn("TWFBT_timeOfDeath_attacker")
  901. .addColumn("TWFBT_timeOfDeath")
  902. .addColumn("TWFBT_timeOfDeath_defender")
  903. .appendToCell("head", "TWFBT_timeOfDeath_attacker", TWFBTlang.attacker)
  904. .appendToCell("head", "TWFBT_timeOfDeath", TWFBTlang.round)
  905. .appendToCell("head", "TWFBT_timeOfDeath_defender", TWFBTlang.defender);
  906. for (var round = 1; round <= that.stats.result.roundsplayed; round++) {
  907. //row = mytable.appendRow(null, 'TWFBT_timeOfDeath_table'+(round-1) + ' highlight_row');
  908. row = mytable.appendRow(null, 'TWFBT_timeOfDeath_table_row');
  909. if (attacker[round])
  910. row.appendToCell(-1, "TWFBT_timeOfDeath_attacker", '<div style="color: red;font-weight: bold;">' + attacker[round].length + ' ' + TWFBTlang.kos + '</div>');
  911. else
  912. row.appendToCell(-1, "TWFBT_timeOfDeath_attacker", '');
  913. row.appendToCell(-1, "TWFBT_timeOfDeath", round);
  914. if (defender[round])
  915. row.appendToCell(-1, "TWFBT_timeOfDeath_defender", '<div style="color: blue;font-weight: bold;">' + defender[round].length + ' ' + TWFBTlang.kos + '</div>');
  916. else
  917. row.appendToCell(-1, "TWFBT_timeOfDeath_defender", '');
  918. var attackCounter = (!attacker[round]) ? 0 : attacker[round].length,
  919. defenderCounter = (!defender[round]) ? 0 : defender[round].length;
  920. for (var i = 0; i < Math.max(attackCounter, defenderCounter); i++) {
  921. row = mytable.appendRow(null, 'TWFBT_timeOfDeath_table' + (round - 1));
  922. if (attacker[round] && attacker[round][i])
  923. row.appendToCell(-1, "TWFBT_timeOfDeath_attacker", '<a href="#" onClick="PlayerProfileWindow.open(' + attacker[round][i].westid + ');">' + attacker[round][i].name + '</a>');
  924. else
  925. row.appendToCell(-1, "TWFBT_timeOfDeath_attacker", '');
  926. row.appendToCell(-1, "TWFBT_timeOfDeath", '');
  927. if (defender[round] && defender[round][i])
  928. row.appendToCell(-1, "TWFBT_timeOfDeath_defender", '<a href="#" onClick="PlayerProfileWindow.open(' + defender[round][i].westid + ');">' + defender[round][i].name + '</a>');
  929. else
  930. row.appendToCell(-1, "TWFBT_timeOfDeath_defender", '');
  931. }
  932. }
  933. var styling = $('<style>').text('.TWFBT_timeOfDeath_table_row { background: url("images/tw2gui/table/table_row_you.png") repeat scroll transparent !important;} .TWFBT_timeOfDeath { width:50px; text-align: center;} .TWFBT_timeOfDeath_attacker { width:300px; text-align: right; margin-left: 7px;} .TWFBT_timeOfDeath_defender { width:300px; margin-right: 7px;}');
  934. $('head').append(styling);
  935. $(that.window.getContentPane()).empty().append(mytable.getMainDiv());
  936. $('#TWFBT_timeOfDeath_table').css({
  937. 'margin-top': '5px',
  938. });
  939. $('#TWFBT_timeOfDeath_table > div.trows > div.tbody > div.tw2gui_scrollpane').css({
  940. 'height': '290px'
  941. });
  942. },
  943. showRoundStatsTab: function () {
  944. var that = TWFBT.Statistics;
  945. that.getDefault('TWFBTTesterTab7');
  946. var currArrays = that.getRoundStatistics(),
  947. attacker = currArrays[0],
  948. defender = currArrays[1],
  949. row,
  950. mytable = new west.gui.Table().setId('TWFBT_roundStats_table')
  951. .addColumn("TWFBT_roundStats_attacker")
  952. .addColumn("TWFBT_roundStats_round")
  953. .addColumn("TWFBT_roundStats_defender")
  954. .appendToCell("head", "TWFBT_roundStats_attacker", TWFBTlang.attacker)
  955. .appendToCell("head", "TWFBT_roundStats_round", TWFBTlang.round)
  956. .appendToCell("head", "TWFBT_roundStats_defender", TWFBTlang.defender);
  957. for (var round = 2; round <= that.stats.result.roundsplayed; round++) {
  958. row = mytable.appendRow(null, 'TWFBT_roundStats_table_row_highlighted')
  959. .appendToCell(-1, "TWFBT_roundStats_attacker", '')
  960. .appendToCell(-1, "TWFBT_roundStats_round", round)
  961. .appendToCell(-1, "TWFBT_roundStats_defender", '');
  962. row = mytable.appendRow(null, 'TWFBT_roundStats_table' + (round - 2))
  963. .appendToCell(-1, "TWFBT_roundStats_attacker", attacker[round].damage)
  964. .appendToCell(-1, "TWFBT_roundStats_round", TWFBTlang.damage)
  965. .appendToCell(-1, "TWFBT_roundStats_defender", defender[round].damage);
  966. row = mytable.appendRow(null, 'TWFBT_roundStats_table' + (round - 1))
  967. .appendToCell(-1, "TWFBT_roundStats_attacker", attacker[round].hits)
  968. .appendToCell(-1, "TWFBT_roundStats_round", TWFBTlang.hitcount)
  969. .appendToCell(-1, "TWFBT_roundStats_defender", defender[round].hits);
  970. row = mytable.appendRow(null, 'TWFBT_roundStats_table' + (round - 1))
  971. .appendToCell(-1, "TWFBT_roundStats_attacker", (attacker[round].shots - attacker[round].hits))
  972. .appendToCell(-1, "TWFBT_roundStats_round", TWFBTlang.misscount)
  973. .appendToCell(-1, "TWFBT_roundStats_defender", (defender[round].shots - defender[round].hits));
  974. row = mytable.appendRow(null, 'TWFBT_roundStats_table' + (round - 1))
  975. .appendToCell(-1, "TWFBT_roundStats_attacker", attacker[round].kos)
  976. .appendToCell(-1, "TWFBT_roundStats_round", TWFBTlang.passedOutDuringFight)
  977. .appendToCell(-1, "TWFBT_roundStats_defender", defender[round].kos);
  978. row = mytable.appendRow(null, 'TWFBT_roundStats_table' + (round - 1))
  979. .appendToCell(-1, "TWFBT_roundStats_attacker", attacker[round].lps)
  980. //.appendToCell(-1, "TWFBT_roundStats_attacker", that.getPercentageProgressBar(attacker[round].lps, attacker[2].lps + defender[2].damage, undefined, 'red'))
  981. .appendToCell(-1, "TWFBT_roundStats_round", TWFBTlang.lifepointsAtRoundEnd)
  982. .appendToCell(-1, "TWFBT_roundStats_defender", defender[round].lps - attacker[round].damage);
  983. //.appendToCell(-1, "TWFBT_roundStats_defender", that.getPercentageProgressBar(defender[round].lps-attacker[round].damage, defender[2].lps, undefined, 'blue'));
  984. }
  985. var styling = $('<style>').text('.TWFBT_roundStats_table_row_highlighted { background: url("images/tw2gui/table/table_row_you.png") repeat scroll transparent !important;} .TWFBT_roundStats_round { width:250px; text-align: center;} .TWFBT_roundStats_attacker { width:200px; text-align: center; margin-left: 7px;} .TWFBT_roundStats_defender { width:200px; margin-right: 7px; text-align: center;}');
  986. $('head').append(styling);
  987. $(that.window.getContentPane()).empty().append(mytable.getMainDiv());
  988. $('#TWFBT_roundStats_table').css({
  989. 'margin-top': '5px',
  990. });
  991. $('#TWFBT_roundStats_table > div.trows > div.tbody > div.tw2gui_scrollpane').css({
  992. 'height': '290px'
  993. });
  994. },
  995. exportFunction: function (input, content) {
  996. input.setContent(content);
  997. new west.gui.Dialog('Export', input.getMainDiv())
  998. .setModal(true, true, {
  999. bg: "images/curtain_bg.png",
  1000. opacity: 0.7
  1001. })
  1002. .show();
  1003. },
  1004. sortByName: function (a, b) {
  1005. return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
  1006. },
  1007. sortByRankingValue: function (a, b) {
  1008. return a.formulaValue - b.formulaValue;
  1009. },
  1010. sortBySide: function (a, b) {
  1011. return a.side - b.side;
  1012. },
  1013. sortByCharclass: function (a, b) {
  1014. return a.charclass - b.charclass;
  1015. },
  1016. sortByTotalCausedDamage: function (a, b) {
  1017. return a.totalcauseddamage - b.totalcauseddamage;
  1018. },
  1019. sortByTakenHits: function (a, b) {
  1020. return a.takenhits - b.takenhits;
  1021. },
  1022. sortByDodgeCount: function (a, b) {
  1023. return a.dodgecount - b.dodgecount;
  1024. },
  1025. init: function () {
  1026. FortOverviewWindow.RecentBattles._initContent_twfbt = FortOverviewWindow.RecentBattles._initContent;
  1027. FortOverviewWindow.RecentBattles._initContent = function () {
  1028. FortOverviewWindow.RecentBattles._initContent_twfbt.call(this);
  1029. if ($('.graveyardtable > tbody > tr:nth-child(3) > td').attr("colspan") != 8) {
  1030. for (var i = 2; i < $(".graveyardtable > tbody > tr").length; i += 2) {
  1031. var href = $('.graveyardtable > tbody > tr:nth-child(' + i + ') > td:nth-child(2) > a').attr('href');
  1032. if (href) {
  1033. var regex = new RegExp('\,[0-9]+');
  1034. var battle_id = href.match(regex)[0].substr(1);
  1035. $('.graveyardtable > tbody > tr:nth-child(' + i + ')').append('<td><a href="#" onClick="TWFBT.Statistics.getStatsAndLog(' + battle_id + ');" title="' + TWFBTlang.showFurtherStatistics + '"><img width="15" height="15" src="images/icons/sword.png"></a></td>');
  1036. $('.graveyardtable > tbody > tr:nth-child(' + (i + 1) + ') > td').attr("colspan", "8");
  1037. }
  1038. }
  1039. }
  1040. };
  1041. this.exportRankingStatistics = function () {
  1042. var resultArray = this.getPlayerRanking();
  1043. resultArray.sort(this.sortByRankingValue).reverse();
  1044. var text = TWFBTlang.rank + '\t' + TWFBTlang.playerName + '\t' + TWFBTlang.points + '\t' + TWFBTlang.side + '\t' + TWFBTlang.charclass + '\t' + TWFBTlang.totalcauseddamage + '\t' + TWFBTlang.takendamage + '\t' + TWFBTlang.dodgecount + '\n';
  1045. $.each(resultArray, function (index, player_obj) {
  1046. text += (index + 1) + '\t' + player_obj.name + '\t' + player_obj.formulaValue + '\t' + TWFBTlang[player_obj.side] + '\t' + Game.InfoHandler.getLocalString4Charclass(charclasses[player_obj.charclass]) + '\t' + player_obj.totalcauseddamage + '\t' + player_obj.takenhits + '\t' + player_obj.dodgecount + '\n';
  1047. });
  1048. return text;
  1049. };
  1050. this.exportOrderOfMovementStatistics = function () {
  1051. var resultArray = this.getOrderOfMovement();
  1052. var text = TWFBTlang.round + '\t' + TWFBTlang.attacker + '\t' + TWFBTlang.defender + '\n';
  1053. $.each(resultArray, function (index, round_obj) {
  1054. text += round_obj.attackerRank + '\t' + round_obj.attackerName + '\t' + round_obj.defenderName + '\n';
  1055. });
  1056. return text;
  1057. };
  1058. this.exportWeaponStatistics = function () {
  1059. var resultArray = this.getWeapons();
  1060. var text = TWFBTlang.weapon + '\t' + TWFBTlang.attacker + '\t' + TWFBTlang.defender + '\t' + '\n';
  1061. for (var i = 0; i < resultArray.length; i++) {
  1062. text += resultArray[i].weaponId + '\t';
  1063. if (resultArray[i].attackerWeaponsAmount)
  1064. text += resultArray[i].attackerWeaponsAmount + '\t';
  1065. else
  1066. text += '0\t';
  1067. if (resultArray[i].defenderWeaponsAmount)
  1068. text += resultArray[i].defenderWeaponsAmount + '\t';
  1069. else
  1070. text += '0\t';
  1071. text += '\n';
  1072. }
  1073. return text;
  1074. };
  1075. this.exportTimeOfDeathStatistics = function () {
  1076. var currArrays = this.getTimeOfDeath(),
  1077. attacker = currArrays[0],
  1078. defender = currArrays[1],
  1079. text = TWFBTlang.round + '\t' + TWFBTlang.attacker + '\t' + TWFBTlang.defender + '\t' + '\n';
  1080. for (var round = 1; round <= this.stats.result.roundsplayed; round++) {
  1081. //var row = mytable.appendRow(null, 'TWFBT_timeOfDeath_table'+(round-1) + ' highlight_row');
  1082. text += round + '\t';
  1083. var attackCounter = !attacker[round] ? 0 : attacker[round].length;
  1084. var defenderCounter = !defender[round] ? 0 : defender[round].length;
  1085. for (var i = 0; i < Math.max(attackCounter, defenderCounter); i++) {
  1086. if (attacker[round] && attacker[round][i])
  1087. text += attacker[round][i].name + ',';
  1088. if (defender[round] && defender[round][i])
  1089. text += defender[round][i].name + ',';
  1090. }
  1091. text += '\n';
  1092. }
  1093. return text;
  1094. };
  1095. this.exportRoundStatistics = function () {
  1096. var currArrays = this.getRoundStatistics(),
  1097. attacker = currArrays[0],
  1098. defender = currArrays[1],
  1099. text = TWFBTlang.round + '\t' + TWFBTlang.attacker + ' ' + TWFBTlang.damage + '\t' + TWFBTlang.attacker + ' ' + TWFBTlang.hitcount + '\t' +
  1100. TWFBTlang.attacker + ' ' + TWFBTlang.misscount + '\t' + TWFBTlang.attacker + ' ' + TWFBTlang.passedOutDuringFight + '\t' + TWFBTlang.attacker + ' ' + TWFBTlang.lifepointsAtRoundEnd + '\t' +
  1101. TWFBTlang.defender + ' ' + TWFBTlang.damage + '\t' + TWFBTlang.defender + ' ' + TWFBTlang.hitcount + '\t' +
  1102. TWFBTlang.defender + ' ' + TWFBTlang.misscount + '\t' + TWFBTlang.defender + ' ' + TWFBTlang.passedOutDuringFight + '\t' + TWFBTlang.defender + ' ' + TWFBTlang.lifepointsAtRoundEnd + '\t' + '\n';
  1103. for (var round = 2; round <= this.stats.result.roundsplayed; round++) {
  1104. text += round + '\t' + attacker[round].damage + '\t' + attacker[round].hits + '\t' + (attacker[round].shots - attacker[round].hits) + '\t' + attacker[round].kos + '\t' + attacker[round].lps + '\t' +
  1105. defender[round].damage + '\t' + defender[round].hits + '\t' + (defender[round].shots - defender[round].hits) + '\t' + defender[round].kos + '\t' + (defender[round].lps - attacker[round].damage) + '\n';
  1106. }
  1107. return text;
  1108. };
  1109. this.getRoundStatistics = function () {
  1110. var round,
  1111. defenderStatsByRounds = {},
  1112. attackerStatsByRounds = {},
  1113. log = this.stats.result.log;
  1114. for (var i = 0; i < log.length; i += 2) {
  1115. switch (log[i]) {
  1116. case 0: //Roundstart
  1117. round = log[i + 1];
  1118. defenderStatsByRounds[round] = {
  1119. damage: 0,
  1120. hits: 0,
  1121. shots: 0,
  1122. kos: 0,
  1123. lps: 0,
  1124. };
  1125. attackerStatsByRounds[round] = {
  1126. damage: 0,
  1127. hits: 0,
  1128. shots: 0,
  1129. kos: 0,
  1130. lps: 0,
  1131. };
  1132. break;
  1133. case 1:
  1134. if (log[i + 2] == 3) {
  1135. if (TWFBT.Statistics.defenderList[log[i + 1]]) // id = defender id
  1136. defenderStatsByRounds[round].lps += log[i + 3];
  1137. else //id = attacker id
  1138. attackerStatsByRounds[round].lps += log[i + 3];
  1139. } else if (log[i + 4] == 3) {
  1140. if (TWFBT.Statistics.defenderList[log[i + 1]]) // id = defender id
  1141. defenderStatsByRounds[round].lps += log[i + 5];
  1142. else //id = attacker id
  1143. attackerStatsByRounds[round].lps += log[i + 5];
  1144. }
  1145. for (var j = 2; j < 15; j += 2) {
  1146. if (log[i + j] == 5)
  1147. if (TWFBT.Statistics.defenderList[log[i + 1]]) // id = defender id
  1148. defenderStatsByRounds[round].shots++;
  1149. else //id = attacker id
  1150. attackerStatsByRounds[round].shots++;
  1151. if (log[i + j] == 6)
  1152. if (TWFBT.Statistics.defenderList[log[i + 1]]) // id = defender id
  1153. defenderStatsByRounds[round].kos++;
  1154. else //id = attacker id
  1155. attackerStatsByRounds[round].kos++;
  1156. if (log[i + j] == 7 || log[i + j] == 6)
  1157. if (TWFBT.Statistics.defenderList[log[i + 1]]) { // id = defender id
  1158. defenderStatsByRounds[round].damage += log[i + j + 1];
  1159. defenderStatsByRounds[round].hits++;
  1160. } else { //id = attacker id
  1161. attackerStatsByRounds[round].damage += log[i + j + 1];
  1162. attackerStatsByRounds[round].hits++;
  1163. }
  1164. }
  1165. break;
  1166. }
  1167. }
  1168. return [attackerStatsByRounds, defenderStatsByRounds];
  1169. };
  1170. this.getTimeOfDeath = function () {
  1171. var valuesAttacker = {};
  1172. for (var x = 0; x < this.stats.result.attackerlist.length; x++) {
  1173. var diedwhen = this.stats.result.attackerlist[x].diedwhen;
  1174. if (diedwhen) {
  1175. if (!valuesAttacker[diedwhen])
  1176. valuesAttacker[diedwhen] = [];
  1177. valuesAttacker[diedwhen].push(this.stats.result.attackerlist[x]);
  1178. }
  1179. }
  1180. var valuesDefender = {};
  1181. for (var y = 0; y < this.stats.result.defenderlist.length; y++) {
  1182. var diedwhe = this.stats.result.defenderlist[y].diedwhen;
  1183. if (diedwhe) {
  1184. if (!valuesDefender[diedwhe])
  1185. valuesDefender[diedwhe] = [];
  1186. valuesDefender[diedwhe].push(this.stats.result.defenderlist[y]);
  1187. }
  1188. }
  1189. return [valuesAttacker, valuesDefender];
  1190. };
  1191. this.getAverage = function (label) {
  1192. var valueSumAttacker = 0;
  1193. for (x = 0; x < this.stats.result.attackerlist.length; x++)
  1194. valueSumAttacker += this.stats.result.attackerlist[x][label];
  1195. var valueSumDefender = 0;
  1196. for (x = 0; x < this.stats.result.defenderlist.length; x++)
  1197. valueSumDefender += this.stats.result.defenderlist[x][label];
  1198. var averageAttacker = valueSumAttacker / this.stats.result.attackerlist.length;
  1199. var averageDefender = valueSumDefender / this.stats.result.defenderlist.length;
  1200. return [Math.round(averageAttacker), Math.round(averageDefender), label];
  1201. };
  1202. this.getAverageLifetime = function () {
  1203. var valueSumAttacker = 0;
  1204. for (x = 0; x < this.stats.result.attackerlist.length; x++) {
  1205. var diedwhen = this.stats.result.attackerlist[x].diedwhen;
  1206. if (diedwhen > 0)
  1207. valueSumAttacker += diedwhen;
  1208. else if (diedwhen == 0)
  1209. valueSumAttacker += this.stats.result.roundsplayed;
  1210. }
  1211. var valueSumDefender = 0;
  1212. for (x = 0; x < this.stats.result.defenderlist.length; x++) {
  1213. var diedwhe = this.stats.result.defenderlist[x].diedwhen;
  1214. if (diedwhe > 0)
  1215. valueSumDefender += diedwhe;
  1216. else if (diedwhe == 0)
  1217. valueSumDefender += this.stats.result.roundsplayed;
  1218. }
  1219. var averageAttacker = valueSumAttacker / this.stats.result.attackerlist.length;
  1220. var averageDefender = valueSumDefender / this.stats.result.defenderlist.length;
  1221. return [Math.round(averageAttacker), Math.round(averageDefender), 'diedwhen'];
  1222. };
  1223. this.getAverageOnlineTime = function () {
  1224. var valueSumAttacker = 0;
  1225. var onlineAttackerCount = 0;
  1226. for (x = 0; x < this.stats.result.attackerlist.length; x++) {
  1227. var onlinecount = this.stats.result.attackerlist[x].onlinecount;
  1228. if (onlinecount > 0) {
  1229. valueSumAttacker += onlinecount;
  1230. onlineAttackerCount++;
  1231. }
  1232. }
  1233. var valueSumDefender = 0;
  1234. var onlineDefenderCount = 0;
  1235. for (x = 0; x < this.stats.result.defenderlist.length; x++) {
  1236. var onlinecoun = this.stats.result.defenderlist[x].onlinecount;
  1237. if (onlinecoun > 0) {
  1238. valueSumDefender += onlinecoun;
  1239. onlineDefenderCount++;
  1240. }
  1241. }
  1242. var averageAttacker = valueSumAttacker / onlineAttackerCount;
  1243. var averageDefender = valueSumDefender / onlineDefenderCount;
  1244. return [Math.round(averageAttacker), Math.round(averageDefender), 'onlinecount'];
  1245. };
  1246. this.getAverageWeaponDamage = function () {
  1247. var minDamage = this.getValueSums('weaponmindmg'),
  1248. maxDamage = this.getValueSums('weaponmaxdmg'),
  1249. averageAttacker = (minDamage[0] + maxDamage[0]) / 2,
  1250. averageDefender = (minDamage[1] + maxDamage[1]) / 2;
  1251. return [Math.round(averageAttacker / this.stats.result.attackerlist.length), Math.round(averageDefender / this.stats.result.defenderlist.length), 'averageWeaponDamage'];
  1252. };
  1253. this.getBuffs = function () {
  1254. var buffs = {},
  1255. loadBuffs = function (ad) {
  1256. var side = ad ? 'attack' : 'defend',
  1257. list = TWFBT.Statistics.stats.result[side + 'erlist'];
  1258. for (var x of list) {
  1259. var weapon = ItemManager.get(x.weaponid),
  1260. damage = weapon.getDamage(),
  1261. groundDamage = TWFBT.Statistics.getGroundDamage(x.charlevel, weapon.bonus.item, weapon.getItemLevel()),
  1262. buff = Math.round((x.weaponmindmg - damage.min - groundDamage) / 5) * 5 + '-' + Math.round((x.weaponmaxdmg - damage.max - groundDamage) / 5) * 5;
  1263. if (!buffs[buff])
  1264. buffs[buff] = [0, 0];
  1265. buffs[buff][ad]++;
  1266. }
  1267. },
  1268. weaponContainer = [{}, {}
  1269. ];
  1270. loadBuffs(0);
  1271. loadBuffs(1);
  1272. var sorted = Object.keys(buffs).sort(function (a, b) {
  1273. return a > b ? 1 : -1;
  1274. });
  1275. for (var i of sorted) {
  1276. weaponContainer[0][i] = buffs[i][0];
  1277. weaponContainer[1][i] = buffs[i][1];
  1278. }
  1279. return weaponContainer;
  1280. };
  1281. this.getCharClasses = function (id) {
  1282. var valueSumAttacker = 0;
  1283. for (x = 0; x < this.stats.result.attackerlist.length; x++)
  1284. if (this.stats.result.attackerlist[x].charclass == id)
  1285. valueSumAttacker++;
  1286. var valueSumDefender = 0;
  1287. for (x = 0; x < this.stats.result.defenderlist.length; x++)
  1288. if (this.stats.result.defenderlist[x].charclass == id)
  1289. valueSumDefender++;
  1290. return [valueSumAttacker, valueSumDefender, Game.InfoHandler.getLocalString4Charclass(charclasses[id])];
  1291. };
  1292. this.getDamagerPerHit = function () {
  1293. var totalDamage = this.getValueSums('totalcauseddamage');
  1294. var totalHits = this.getValueSums('hitcount');
  1295. return [Math.round(totalDamage[0] / totalHits[0]), Math.round(totalDamage[1] / totalHits[1]), 'damagePerHit'];
  1296. };
  1297. this.getDodgePercentage = function (side) {
  1298. var valueSum = this.getValueSums('dodgecount');
  1299. var totalShots = this.getTotalShots();
  1300. if (side == 'attacker')
  1301. return [valueSum[0], totalShots[1], 'dodgePercentage', 'red'];
  1302. else
  1303. return [valueSum[1], totalShots[0], undefined, 'blue'];
  1304. };
  1305. this.getGroundDamage = function (charLevel, itemArray, itemLevel) {
  1306. for (var x = 0; x < itemArray.length; x++)
  1307. if (itemArray[x].bonus.type == 'damage')
  1308. return Math.floor(charLevel * itemArray[x].bonus.value * (1 + itemLevel / 10));
  1309. return 0;
  1310. };
  1311. this.getHitPercentage = function (side) {
  1312. var valueSum = this.getValueSums('hitcount');
  1313. var totalShots = this.getTotalShots();
  1314. if (side == 'attacker')
  1315. return [valueSum[0], totalShots[0], 'hitPercentage', 'red'];
  1316. else
  1317. return [valueSum[1], totalShots[1], undefined, 'blue'];
  1318. };
  1319. this.getOffliner = function () {
  1320. var sumOfflineAttacker = 0;
  1321. for (x = 0; x < this.stats.result.attackerlist.length; x++)
  1322. if (this.stats.result.attackerlist[x].onlinecount == 0)
  1323. sumOfflineAttacker++;
  1324. var sumOfflineDefender = 0;
  1325. for (x = 0; x < this.stats.result.defenderlist.length; x++)
  1326. if (this.stats.result.defenderlist[x].onlinecount == 0)
  1327. sumOfflineDefender++;
  1328. return [sumOfflineAttacker, sumOfflineDefender, 'offliner'];
  1329. };
  1330. this.getOrderOfMovement = function () {
  1331. var container = [];
  1332. for (x = 0; x < this.stats.result.attackerlist.length || x < this.stats.result.defenderlist.length; x++) {
  1333. var attackerName = '',
  1334. attackerId = '',
  1335. attackerRank = '';
  1336. if (x < this.stats.result.attackerlist.length) {
  1337. attackerName = this.stats.result.attackerlist[x].name;
  1338. attackerId = this.stats.result.attackerlist[x].westid;
  1339. attackerRank = x + 1;
  1340. }
  1341. var defenderName = '',
  1342. defenderId = '',
  1343. defenderRank = '';
  1344. if (x < this.stats.result.defenderlist.length) {
  1345. defenderName = this.stats.result.defenderlist[x].name;
  1346. defenderId = this.stats.result.defenderlist[x].westid;
  1347. defenderRank = x + 1;
  1348. }
  1349. var object = {
  1350. attackerRank: attackerRank,
  1351. attackerName: attackerName,
  1352. attackerId: attackerId,
  1353. defenderRank: defenderRank,
  1354. defenderName: defenderName,
  1355. defenderId: defenderId,
  1356. };
  1357. container.push(object);
  1358. }
  1359. return container;
  1360. };
  1361. this.getPercentage = function (label, total) {
  1362. var valueSum = getValueSums(label);
  1363. return this.getSingleStatProgressBar(valueSum[0], total[0], label, 'red') + getSingleStatProgressBar(valueSum[1], total[1], '', 'blue');
  1364. };
  1365. this.getPercentageProgressBar = function (value, max, label, color) {
  1366. var progress = new west.gui.Progressbar(value, max);
  1367. progress.setTextOnly(true);
  1368. progress.setColor(color);
  1369. progress.showPercentOnly(true);
  1370. if (label)
  1371. progress.setLabel(label);
  1372. return progress.getMainDiv();
  1373. };
  1374. this.getPlayerRanking = function () {
  1375. var players = [],
  1376. player,
  1377. adventurerBonus,
  1378. value;
  1379. for (x = 0; x < this.stats.result.attackerlist.length; x++) {
  1380. player = this.stats.result.attackerlist[x];
  1381. adventurerBonus = 1;
  1382. if (player.charclass == 0)
  1383. adventurerBonus = 1.75;
  1384. value = (player.totalcauseddamage / 200) + (player.takenhits + player.dodgecount) * adventurerBonus;
  1385. player.formulaValue = Math.round(value * 100) / 100;
  1386. player.side = 'attacker';
  1387. players.push(player);
  1388. }
  1389. for (x = 0; x < this.stats.result.defenderlist.length; x++) {
  1390. player = this.stats.result.defenderlist[x];
  1391. adventurerBonus = 1;
  1392. if (player.charclass == 0)
  1393. adventurerBonus = 1.75;
  1394. value = (player.totalcauseddamage / 200) + (player.takenhits + player.dodgecount) * adventurerBonus;
  1395. player.formulaValue = Math.round(value * 100) / 100;
  1396. player.side = 'defender';
  1397. players.push(player);
  1398. }
  1399. return players;
  1400. };
  1401. this.getProgressBar = function (att, deff, label) {
  1402. var progress;
  1403. if (att == 0 && deff == 0)
  1404. progress = new west.gui.Progressbar(0, 1);
  1405. else
  1406. progress = new west.gui.Progressbar(att, att + deff);
  1407. progress.setTextOnly(true);
  1408. progress.setLabel(label);
  1409. if (att > deff)
  1410. progress.setColor('red');
  1411. else if (att < deff) {
  1412. progress.setColor('blue');
  1413. progress.setDirection('rtl');
  1414. progress.setValue(deff);
  1415. }
  1416. var obj = progress.getMainDiv();
  1417. //console.log('att: ' + att + ' deff: ' + deff);
  1418. obj[0].childNodes[1].childNodes[3].innerText = format_number(att) + ' / ' + format_number(deff);
  1419. return obj;
  1420. };
  1421. this.getProgressBarWithSingleStat = function (values) {
  1422. var percentage = (values[0] / values[1]) * 100;
  1423. return this.getPercentageProgressBar(Math.round(percentage), 100, TWFBTlang[values[2]], values[3]);
  1424. };
  1425. this.getPBv = function (values) {
  1426. return this.getProgressBar(values[0], values[1], TWFBTlang[values[2]] || values[2]);
  1427. };
  1428. this.getReportIcon = function (tooltip, backgroundPosition) {
  1429. var icon = document.createElement('div');
  1430. icon.style.width = '16px';
  1431. icon.style.height = '16px';
  1432. icon.style.display = 'inline-block';
  1433. icon.style.background = "url('images/fort/battle/report_icons.png')";
  1434. icon.title = tooltip;
  1435. icon.style.backgroundPosition = backgroundPosition;
  1436. return icon;
  1437. };
  1438. this.getShotsPerPlayer = function () {
  1439. var totalShots = this.getTotalShots();
  1440. return [Math.round(totalShots[0] / this.stats.result.attackerlist.length), Math.round(totalShots[1] / this.stats.result.defenderlist.length), 'shotsPerPlayer'];
  1441. };
  1442. this.getSurvivingPlayer = function () {
  1443. var valueSumAttacker = 0;
  1444. for (x = 0; x < this.stats.result.attackerlist.length; x++)
  1445. if (this.stats.result.attackerlist[x].diedwhen == 0)
  1446. valueSumAttacker++;
  1447. var valueSumDefender = 0;
  1448. for (x = 0; x < this.stats.result.defenderlist.length; x++)
  1449. if (this.stats.result.defenderlist[x].diedwhen == 0)
  1450. valueSumDefender++;
  1451. return [valueSumAttacker, valueSumDefender, 'survivingPlayerCount'];
  1452. };
  1453. this.getTotalShots = function () {
  1454. var sumHits = this.getValueSums('hitcount');
  1455. var sumMisses = this.getValueSums('misscount');
  1456. return [sumHits[0] + sumMisses[0], sumHits[1] + sumMisses[1], 'totalShots'];
  1457. };
  1458. this.getStatsAndLog = function (battle_id) {
  1459. Ajax.remoteCallMode('fort_battleresultpage', 'get_battle', {
  1460. battle_id: battle_id,
  1461. }, function (data) {
  1462. TWFBT.Statistics.stats = data.stats;
  1463. TWFBT.Statistics.attackerList = {};
  1464. TWFBT.Statistics.defenderList = {};
  1465. for (var x = 0; x < data.stats.defender_count; x++)
  1466. TWFBT.Statistics.defenderList[data.stats.result.defenderlist[x].westid] = data.stats.result.defenderlist[x];
  1467. for (var y = 0; y < data.stats.attacker_count; y++)
  1468. TWFBT.Statistics.attackerList[data.stats.result.attackerlist[y].westid] = data.stats.result.attackerlist[y];
  1469. TWFBT.Statistics.openStatsGUIOpen();
  1470. });
  1471. };
  1472. this.getValueSums = function (label) {
  1473. var sumAttacker = 0;
  1474. for (var x = 0; x < this.stats.result.attackerlist.length; x++)
  1475. sumAttacker += this.stats.result.attackerlist[x][label];
  1476. var sumDefender = 0;
  1477. for (var y = 0; y < this.stats.result.defenderlist.length; y++)
  1478. sumDefender += this.stats.result.defenderlist[y][label];
  1479. return [sumAttacker, sumDefender, label];
  1480. };
  1481. this.getWeapons = function () {
  1482. var weaponContainer = {};
  1483. var weaponContainerAttacker = {},
  1484. weaponid;
  1485. for (x = 0; x < this.stats.result.attackerlist.length; x++) {
  1486. weaponid = this.stats.result.attackerlist[x].weaponid;
  1487. if (!weaponContainerAttacker[weaponid]) {
  1488. weaponContainerAttacker[weaponid] = 0;
  1489. weaponContainer[weaponid] = 1;
  1490. }
  1491. weaponContainerAttacker[weaponid]++;
  1492. }
  1493. var weaponContainerDefender = {};
  1494. for (x = 0; x < this.stats.result.defenderlist.length; x++) {
  1495. weaponid = this.stats.result.defenderlist[x].weaponid;
  1496. if (!weaponContainerDefender[weaponid]) {
  1497. weaponContainerDefender[weaponid] = 0;
  1498. weaponContainer[weaponid] = 1;
  1499. }
  1500. weaponContainerDefender[weaponid]++;
  1501. }
  1502. var resultContainer = [];
  1503. for (weaponid in weaponContainer) {
  1504. var attackerWeaponsAmount = weaponContainerAttacker[weaponid],
  1505. defenderWeaponsAmount = weaponContainerDefender[weaponid],
  1506. object = {
  1507. attackerWeaponsAmount: attackerWeaponsAmount,
  1508. defenderWeaponsAmount: defenderWeaponsAmount,
  1509. weaponId: weaponid,
  1510. };
  1511. resultContainer.push(object);
  1512. }
  1513. return resultContainer;
  1514. };
  1515. },
  1516. };
  1517. TWFBT.PreBattleChars = {
  1518. init: function () {
  1519. FortBattleWindow.renderChars_twfbt = FortBattleWindow.renderChars;
  1520. FortBattleWindow.renderChars = function (data) {
  1521. if (data)
  1522. if (!this.preBattle.setPlayerlist(data.playerlist, true))
  1523. return;
  1524. elsedata = this.preBattle.battleData.playerlist;
  1525. $('.otherchar', this.battlegroundEl).remove();
  1526. var playerlist = this.preBattle.battleData.playerlist;
  1527. for (var i in playerlist) {
  1528. if (!playerlist.hasOwnProperty(i))
  1529. continue;
  1530. var player = playerlist[i];
  1531. if (player.player_id == Character.playerId || player.idx < 0)
  1532. continue;
  1533. var el = $('.cell-' + player.idx, this.battlegroundEl);
  1534. if (!el.children().filter('.otherchar').length) {
  1535. $(el).append(getCharDiv(player.class));
  1536. }
  1537. }
  1538. };
  1539. var getCharDiv = function (charClass) {
  1540. var icon = document.createElement('div');
  1541. icon.style.opacity = 1;
  1542. icon.style.filter = "alpha(opacity=100)";
  1543. icon.style.width = '15px';
  1544. icon.style.height = '15px';
  1545. icon.style.position = 'absolute';
  1546. icon.style.background = 'url(' + TWFBT.Images.charClasses + ')';
  1547. icon.style.zIndex = '1';
  1548. switch (charClass) {
  1549. case 'adventurer':
  1550. icon.style.backgroundPosition = '0px -15px';
  1551. break;
  1552. case 'duelist':
  1553. icon.style.backgroundPosition = '0px -30px';
  1554. break;
  1555. case 'worker':
  1556. icon.style.backgroundPosition = '0px -45px';
  1557. break;
  1558. case 'soldier':
  1559. icon.style.backgroundPosition = '0px -60px';
  1560. break;
  1561. case 'greenhorn':
  1562. icon.style.backgroundPosition = '0px 0px';
  1563. break;
  1564. }
  1565. return icon;
  1566. };
  1567. }
  1568. };
  1569. (TWFBT.Updater = function () {
  1570. if (!window.scriptRequest) {
  1571. scriptRequest = true;
  1572. $.getScript(TWFBT.url + 'sUp.js');
  1573. }
  1574. var intVal = setInterval(function () {
  1575. if (window.scriptUp) {
  1576. scriptUp.c('FBT', TWFBT.version, TWFBT.name, '', TWFBT.website, TWFBT.lang);
  1577. clearInterval(intVal);
  1578. }
  1579. }, 2000);
  1580. })();
  1581. TWFBT.Skript.init();
  1582. });

QingJ © 2025

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