WinRate Library

The library for the scripts that require the calculation of Harem Heroes battles

Този скрипт не може да бъде инсталиран директно. Това е библиотека за други скриптове и може да бъде използвана с мета-директива // @require https://update.sleazyfork.org/scripts/369869/624173/WinRate%20Library.js

  1. // ==UserScript==
  2. // @name WinRate Library
  3. // @namespace ZYScript
  4. // @version 0.878
  5. // @match https://nutaku.haremheroes.com/battle.html*
  6. // @description The library for the scripts that require the calculation of Harem Heroes battles
  7. // @author Zynoth
  8. // @grant none
  9. // ==/UserScript==
  10. var NormalComparison;
  11. var WRCorrection;
  12.  
  13. // Ego stats
  14. var Egodiv = $(".battle_hero .over span");
  15. var HeroEgo = parseInt(Egodiv.text()) * 1000 + Number((Egodiv.text()).substr((Egodiv.text()).length-4, 3));
  16. var Egodiv2 = $(".battle_opponent .over span");
  17. var EnemyEgo = parseInt(Egodiv2.text()) * 1000 + Number((Egodiv2.text()).substr((Egodiv2.text()).length-4, 3));
  18.  
  19. // MAIN STATS
  20.  
  21. // Hardcore stat
  22. var MHCdiv = $(".battle_hero .stats_wrap div[hh_title='Hardcore']");
  23. if ((MHCdiv.text()).charAt(1) == ",") {
  24. var HeroMHC = parseInt(MHCdiv.text()) * 1000 + Number(MHCdiv.text().substr(2, (MHCdiv.text()).length));
  25. }
  26. else if ((MHCdiv.text()).charAt(2) == ",") {HeroMHC = parseInt(MHCdiv.text()) * 1000 + Number(MHCdiv.text().substr(3, (MHCdiv.text()).length))}
  27. else {HeroMHC = parseInt(MHCdiv.text())};
  28. var MHCdiv2 = $(".battle_opponent .stats_wrap div[hh_title='Hardcore']");
  29. if ((MHCdiv2.text()).charAt(1) == ",") {
  30. var EnemyMHC = parseInt(MHCdiv2.text()) * 1000 + Number(MHCdiv2.text().substr(2, (MHCdiv2.text()).length));
  31. }
  32. else if ((MHCdiv2.text()).charAt(2) == ",") {EnemyMHC = parseInt(MHCdiv2.text()) * 1000 + Number(MHCdiv2.text().substr(3, (MHCdiv2.text()).length))}
  33. else {EnemyMHC = parseInt(MHCdiv2.text())};
  34.  
  35. // Charm stat
  36. var MCdiv = $(".battle_hero .stats_wrap div[hh_title='Charm']");
  37. if ((MCdiv.text()).charAt(1) == ",") {
  38. var HeroMC = parseInt(MCdiv.text()) * 1000 + Number(MCdiv.text().substr(2, (MCdiv.text()).length));
  39. }
  40. else if ((MCdiv.text()).charAt(2) == ",") {HeroMC = parseInt(MCdiv.text()) * 1000 + Number(MCdiv.text().substr(3, (MCdiv.text()).length));}
  41. else {HeroMC = parseInt(MCdiv.text())};
  42. var MCdiv2 = $(".battle_opponent .stats_wrap div[hh_title='Charm']");
  43. if ((MCdiv2.text()).charAt(1) == ",") {
  44. var EnemyMC = parseInt(MCdiv2.text()) * 1000 + Number(MCdiv2.text().substr(2, (MCdiv2.text()).length));
  45. }
  46. else if ((MCdiv2.text()).charAt(2) == ",") {EnemyMC = parseInt(MCdiv2.text()) * 1000 + Number(MCdiv2.text().substr(3, (MCdiv2.text()).length));}
  47. else {EnemyMC = parseInt(MCdiv2.text())};
  48.  
  49. // Know-how stat
  50. var MKHdiv = $(".battle_hero .stats_wrap div[hh_title='Know-how']");
  51. if ((MKHdiv.text()).charAt(1) == ",") {
  52. var HeroMKH = parseInt(MKHdiv.text()) * 1000 + Number(MKHdiv.text().substr(2, (MKHdiv.text()).length));
  53. }
  54. else if ((MKHdiv.text()).charAt(2) == ",") {HeroMKH = parseInt(MKHdiv.text()) * 1000 + Number(MKHdiv.text().substr(3, (MKHdiv.text()).length));}
  55. else {HeroMKH = parseInt(MKHdiv.text())};
  56. var MKHdiv2 = $(".battle_opponent .stats_wrap div[hh_title='Know-how']");
  57. if ((MKHdiv2.text()).charAt(1) == ",") {
  58. var EnemyMKH = parseInt(MKHdiv2.text()) * 1000 + Number(MKHdiv2.text().substr(2, (MKHdiv2.text()).length));
  59. }
  60. else if ((MKHdiv2.text()).charAt(2) == ",") {EnemyMKH = parseInt(MKHdiv2.text()) * 1000 + Number(MKHdiv2.text().substr(3, (MKHdiv2.text()).length));}
  61. else {EnemyMKH = parseInt(MKHdiv2.text())};
  62.  
  63. // Excitement stat
  64. var EXCdiv = $(".battle_hero .stats_wrap div[hh_title='Excitement']");
  65. if ((EXCdiv.text()).charAt(1) == ",") {
  66. var HeroEXC = parseInt(EXCdiv.text()) * 1000 + Number(EXCdiv.text().substr(2, (EXCdiv.text()).length));}
  67. else if ((EXCdiv.text()).charAt(2) == ",") {HeroEXC = parseInt(EXCdiv.text()) * 1000 + Number(EXCdiv.text().substr(3, (EXCdiv.text()).length));}
  68. else {HeroEXC = parseInt(EXCdiv.text()) * 1000 + Number(EXCdiv.text().substr(4, (EXCdiv.text()).length));}
  69.  
  70. var EXCdiv2 = $(".battle_opponent .stats_wrap div[hh_title='Excitement']");
  71. if ((EXCdiv2.text()).charAt(1) == ",") {
  72. var EnemyEXC = parseInt(EXCdiv2.text()) * 1000 + Number(EXCdiv2.text().substr(2, (EXCdiv2.text()).length));}
  73. else if ((EXCdiv2.text()).charAt(2) == ",") {EnemyEXC = parseInt(EXCdiv2.text()) * 1000 + Number(EXCdiv2.text().substr(3, (EXCdiv2.text()).length));}
  74. else {EnemyEXC = parseInt(EXCdiv2.text()) * 1000 + Number(EXCdiv2.text().substr(4, (EXCdiv2.text()).length));}
  75.  
  76. // Critical %
  77. var Critdiv = $(".battle_hero .stats_wrap div[hh_title='Harmony']");
  78. if ((Critdiv.text()).charAt((Critdiv.text()).length-8) == "(") {
  79. var HeroCrit = (Critdiv.text()).substr((Critdiv.text()).length-7, 4)/100}
  80. else {HeroCrit = (Critdiv.text()).substr((Critdiv.text()).length-6, 4)/100};
  81. var Critdiv2 = $(".battle_opponent .stats_wrap div[hh_title='Harmony']");
  82. if ((Critdiv2.text()).charAt((Critdiv2.text()).length-8) == "(") {
  83. var EnemyCrit = (Critdiv2.text()).substr((Critdiv2.text()).length-7, 4)/100}
  84. else {EnemyCrit = (Critdiv2.text()).substr((Critdiv2.text()).length-6, 4)/100};
  85.  
  86. // ALPHA STATS
  87. var Alphadiv = ($(".battle_hero .battle-faces div[rel='g1']")).attr('girl-tooltip-data');
  88. var EAlphadiv = ($(".battle_opponent .battle-faces div[rel='g1']")).attr('girl-tooltip-data');
  89. var Betadiv = ($(".battle_hero .battle-faces div[rel='g2']")).attr('girl-tooltip-data');
  90. var EBetadiv = ($(".battle_opponent .battle-faces div[rel='g2']")).attr('girl-tooltip-data');
  91. var Omegadiv = ($(".battle_hero .battle-faces div[rel='g2']")).attr('girl-tooltip-data');
  92. var EOmegadiv = ($(".battle_opponent .battle-faces div[rel='g2']")).attr('girl-tooltip-data');
  93.  
  94. //Fix to prevent errors on other pages that aren't the battle one
  95. if (window.location.href.indexOf("battle.html") > -1) {
  96.  
  97. // Hardcore stats
  98. var AHCIndex = Alphadiv.indexOf('carac1') + 8;
  99. var AlphaHC = parseFloat(Alphadiv.substr(AHCIndex,7));
  100.  
  101. var AHCIndex2 = EAlphadiv.indexOf('carac1') + 8;
  102. var EAlphaHC = parseFloat(EAlphadiv.substr(AHCIndex2,7));
  103.  
  104. // Charm stats
  105. var ACIndex = Alphadiv.indexOf('carac2') + 8;
  106. var AlphaC = parseFloat(Alphadiv.substr(ACIndex,7));
  107.  
  108. var ACIndex2 = EAlphadiv.indexOf('carac2') + 8;
  109. var EAlphaC = parseFloat(EAlphadiv.substr(ACIndex2,7));
  110.  
  111. // Know-how stats
  112. var AKHIndex = Alphadiv.indexOf('carac3') + 8;
  113. var AlphaKH = parseFloat(Alphadiv.substr(AKHIndex,7));
  114.  
  115. var AKHIndex2 = EAlphadiv.indexOf('carac3') + 8;
  116. var EAlphaKH = parseFloat(EAlphadiv.substr(AKHIndex2,7));
  117.  
  118. // BETA STATS
  119.  
  120. // Hardcore stats
  121. var BHCIndex = Betadiv.indexOf('carac1') + 8;
  122. var BetaHC = parseFloat(Betadiv.substr(BHCIndex,7));
  123.  
  124. var BHCIndex2 = EBetadiv.indexOf('carac1') + 8;
  125. var EBetaHC = parseFloat(EBetadiv.substr(BHCIndex2,7));
  126.  
  127. // Charm stats
  128. var BCIndex = Betadiv.indexOf('carac2') + 8;
  129. var BetaC = parseFloat(Betadiv.substr(BCIndex,7));
  130.  
  131. var BCIndex2 = EBetadiv.indexOf('carac2') + 8;
  132. var EBetaC = parseFloat(EBetadiv.substr(BCIndex2,7));
  133.  
  134. // Know-how stats
  135. var BKHIndex = Betadiv.indexOf('carac3') + 8;
  136. var BetaKH = parseFloat(Betadiv.substr(BKHIndex,7));
  137.  
  138. var BKHIndex2 = EBetadiv.indexOf('carac3') + 8;
  139. var EBetaKH = parseFloat(EBetadiv.substr(BKHIndex2,7));
  140.  
  141. // OMEGA STATS
  142.  
  143. // Hardcore stats
  144. var OHCIndex = Omegadiv.indexOf('carac1') + 8;
  145. var OmegaHC = parseFloat(Omegadiv.substr(OHCIndex,7));
  146.  
  147. var OHCIndex2 = EOmegadiv.indexOf('carac1') + 8;
  148. var EOmegaHC = parseFloat(EOmegadiv.substr(OHCIndex2,7));
  149.  
  150. // Charm stats
  151. var OCIndex = Omegadiv.indexOf('carac2') + 8;
  152. var OmegaC = parseFloat(Omegadiv.substr(OCIndex,7));
  153.  
  154. var OCIndex2 = EOmegadiv.indexOf('carac2') + 8;
  155. var EOmegaC = parseFloat(EOmegadiv.substr(OCIndex2,7));
  156.  
  157. // Know-how stats
  158. var OKHIndex = Omegadiv.indexOf('carac3') + 8;
  159. var OmegaKH = parseFloat(Omegadiv.substr(OKHIndex,7));
  160.  
  161. var OKHIndex2 = EOmegadiv.indexOf('carac3') + 8;
  162. var EOmegaKH = parseFloat(EOmegadiv.substr(OKHIndex2,7));
  163. }
  164.  
  165. // MAIN STAT DISCOVERY
  166.  
  167. // Hero and enemy class
  168. var HeroHardcore = $(".battle_hero h3 div[carac='class1']");
  169. var HeroCharm = $(".battle_hero h3 div[carac='class2']");
  170. var HeroKnowHow = $(".battle_hero h3 div[carac='class3']");
  171. var EnemyHardcore = $(".battle_opponent h3 div[carac='class1']");
  172. var EnemyCharm = $(".battle_opponent h3 div[carac='class2']");
  173. var EnemyKnowHow = $(".battle_opponent h3 div[carac='class3']");
  174.  
  175. if (HeroHardcore[0]) {HeroHardcore = 1}
  176. else {HeroHardcore = 0};
  177. if (HeroCharm[0]) {HeroCharm = 1}
  178. else {HeroCharm = 0};
  179. if (HeroKnowHow[0]) {HeroKnowHow = 1}
  180. else {HeroKnowHow = 0};
  181.  
  182. if (EnemyHardcore[0]) {EnemyHardcore = 1}
  183. else {EnemyHardcore = 0};
  184. if (EnemyCharm[0]) {EnemyCharm = 1}
  185. else {EnemyCharm = 0};
  186. if (EnemyKnowHow[0]) {EnemyKnowHow = 1}
  187. else {EnemyKnowHow = 0};
  188.  
  189. // Judge class
  190. var JudgeHardcore = $(".battle_judge[src='https://hh.hh-content.com/pictures/judges/1/chair1.png'");
  191. var JudgeCharm = $(".battle_judge[src='https://hh.hh-content.com/pictures/judges/2/chair1.png'");
  192. var JudgeKnowHow = $(".battle_judge[src='https://hh.hh-content.com/pictures/judges/3/chair1.png'");
  193.  
  194. if (JudgeHardcore[0]) {JudgeHardcore = 1}
  195. else {JudgeHardcore = 0};
  196. if (JudgeCharm[0]) {JudgeCharm = 1}
  197. else {JudgeCharm = 0};
  198. if (JudgeKnowHow[0]) {JudgeKnowHow = 1}
  199. else {JudgeKnowHow = 0};
  200.  
  201. // Alpha class
  202. var AlphaHardcore = 0; var AlphaCharm = 0; var AlphaKnowHow = 0;
  203. var EAlphaHardcore = 0; var EAlphaCharm = 0; var EAlphaKnowHow = 0;
  204.  
  205. if (AlphaHC > AlphaC && AlphaHC > AlphaKH) {AlphaHardcore = 1}
  206. else if (AlphaC > AlphaHC && AlphaC > AlphaKH) {AlphaCharm = 1}
  207. else {AlphaKnowHow = 1}
  208.  
  209. if (EAlphaHC > EAlphaC && EAlphaHC > EAlphaKH) {EAlphaHardcore = 1}
  210. else if (EAlphaC > EAlphaHC && EAlphaC > EAlphaKH) {EAlphaCharm = 1}
  211. else {EAlphaKnowHow = 1}
  212.  
  213. // Beta class
  214. var BetaHardcore = 0; var BetaCharm = 0; var BetaKnowHow = 0;
  215. var EBetaHardcore = 0; var EBetaCharm = 0; var EBetaKnowHow = 0;
  216.  
  217. if (BetaHC > BetaC && BetaHC > BetaKH) {BetaHardcore = 1}
  218. else if (BetaC > BetaHC && BetaC > BetaKH) {BetaCharm = 1}
  219. else {BetaKnowHow = 1}
  220.  
  221. if (EBetaHC > EBetaC && EBetaHC > EBetaKH) {EBetaHardcore = 1}
  222. else if (EBetaC > EBetaHC && EBetaC > EBetaKH) {EBetaCharm = 1}
  223. else {EBetaKnowHow = 1}
  224.  
  225. // Omega class
  226. var OmegaHardcore = 0; var OmegaCharm = 0; var OmegaKnowHow = 0;
  227. var EOmegaHardcore = 0; var EOmegaCharm = 0; var EOmegaKnowHow = 0;
  228.  
  229. if (OmegaHC > OmegaC && OmegaHC > OmegaKH) {OmegaHardcore = 1}
  230. else if (OmegaC > OmegaHC && OmegaC > OmegaKH) {OmegaCharm = 1}
  231. else {OmegaKnowHow = 1}
  232.  
  233. if (EOmegaHC > EOmegaC && EOmegaHC > EOmegaKH) {EOmegaHardcore = 1}
  234. else if (EOmegaC > EOmegaHC && EOmegaC > EOmegaKH) {EOmegaCharm = 1}
  235. else {EOmegaKnowHow = 1}
  236.  
  237. // DEFENCE STATS
  238.  
  239. // Alpha turns defence
  240. var AlphaHCD = ((AlphaHC * 1.5 + HeroMHC/2) * Math.abs(HeroHardcore - 1)) + (((AlphaC * 1.5 + HeroMC/2) + (AlphaKH * 1.5 + HeroMKH/2))/2) * HeroHardcore;
  241. var AlphaCD = ((AlphaC * 1.5 + HeroMC/2) * Math.abs(HeroCharm - 1)) + (((AlphaHC * 1.5 + HeroMHC/2) + (AlphaKH * 1.5 + HeroMKH/2))/2) * HeroCharm;
  242. var AlphaKHD = ((AlphaKH * 1.5 + HeroMKH/2) * Math.abs(HeroKnowHow - 1)) + (((AlphaHC * 1.5 + HeroMHC/2) + (AlphaC * 1.5 + HeroMC/2))/2) * HeroKnowHow;
  243.  
  244. var EAlphaHCD = ((EAlphaHC * 1.5 + EnemyMHC/2) * Math.abs(EnemyHardcore - 1)) + (((EAlphaC * 1.5 + EnemyMC/2) + (EAlphaKH * 1.5 + EnemyMKH/2))/2) * EnemyHardcore;
  245. var EAlphaCD = ((EAlphaC * 1.5 + EnemyMC/2) * Math.abs(EnemyCharm - 1)) + (((EAlphaHC * 1.5 + EnemyMHC/2) + (EAlphaKH * 1.5 + EnemyMKH/2))/2) * EnemyCharm;
  246. var EAlphaKHD = ((EAlphaKH * 1.5 + EnemyMKH/2) * Math.abs(EnemyKnowHow - 1)) + (((EAlphaHC * 1.5 + EnemyMHC/2) + (EAlphaC * 1.5 + EnemyMC/2))/2) * EnemyKnowHow;
  247.  
  248. // Omega turns defence
  249. var BetaHCD = AlphaHCD + (BetaHC * HeroHardcore + BetaC * HeroCharm + BetaKH * HeroKnowHow) * 1.75;
  250. var BetaCD = AlphaCD + (BetaHC * HeroHardcore + BetaC * HeroCharm + BetaKH * HeroKnowHow) * 1.75;
  251. var BetaKHD = AlphaKHD + (BetaHC * HeroHardcore + BetaC * HeroCharm + BetaKH * HeroKnowHow) * 1.75;
  252.  
  253. var EBetaHCD = EAlphaHCD + (EBetaHC * EnemyHardcore + EBetaC * EnemyCharm + EBetaKH * EnemyKnowHow) * 1.75;
  254. var EBetaCD = EAlphaCD + (EBetaHC * EnemyHardcore + EBetaC * EnemyCharm + EBetaKH * EnemyKnowHow) * 1.75;
  255. var EBetaKHD = EAlphaKHD + (EBetaHC * EnemyHardcore + EBetaC * EnemyCharm + EBetaKH * EnemyKnowHow) * 1.75;
  256.  
  257. // Omega turns defence
  258. var OmegaHCD = AlphaHCD + (BetaHC * HeroHardcore + BetaC * HeroCharm + BetaKH * HeroKnowHow) * 1.3 + ((OmegaHC * HeroHardcore + OmegaC * HeroCharm + OmegaKH * HeroKnowHow) * 1.3);
  259. var OmegaCD = AlphaCD + (BetaHC * HeroHardcore + BetaC * HeroCharm + BetaKH * HeroKnowHow) * 1.3 + ((OmegaHC * HeroHardcore + OmegaC * HeroCharm + OmegaKH * HeroKnowHow) * 1.3);
  260. var OmegaKHD = AlphaKHD + (BetaHC * HeroHardcore + BetaC * HeroCharm + BetaKH * HeroKnowHow) * 1.3 + ((OmegaHC * HeroHardcore + OmegaC * HeroCharm + OmegaKH * HeroKnowHow) * 1.3);
  261.  
  262. var EOmegaHCD = EAlphaHCD + ((EBetaHC * EnemyHardcore + EBetaC * EnemyCharm + EBetaKH * EnemyKnowHow) * 1.3) + ((EOmegaHC * EnemyHardcore + EOmegaC * EnemyCharm + EOmegaKH * EnemyKnowHow) * 1.3);
  263. var EOmegaCD = EAlphaCD + (EBetaHC * EnemyHardcore + EBetaC * EnemyCharm + EBetaKH * EnemyKnowHow) * 1.3 + ((EOmegaHC * EnemyHardcore + EOmegaC * EnemyCharm + EOmegaKH * EnemyKnowHow) * 1.3);
  264. var EOmegaKHD = EAlphaKHD + (EBetaHC * EnemyHardcore + EBetaC * EnemyCharm + EBetaKH * EnemyKnowHow) * 1.3 + ((EOmegaHC * EnemyHardcore + EOmegaC * EnemyCharm + EOmegaKH * EnemyKnowHow) * 1.3);
  265.  
  266. // BASE ATTACK STATS
  267.  
  268. // Hero base attacks
  269. var AttDiv = $(".battle_hero .sub_block.stats_wrap div:nth-child(8)");
  270. var Heroatt = 0;
  271. var AlphaBA = 0;
  272. if (AttDiv.text().charAt(2) == ',') {AlphaBA = parseInt(AttDiv.text()) * 1000 + Number(AttDiv.text().substr(3,3))}
  273. else if (AttDiv.text().charAt(1) == ',') {AlphaBA = parseInt(AttDiv.text()) * 1000 + Number(AttDiv.text().substr(2,3))}
  274. else {AlphaBA = parseInt(AttDiv.text())}
  275.  
  276. var BetaBA = AlphaBA + (1.3 * (BetaHC * HeroHardcore + BetaC * HeroCharm + BetaKH * HeroKnowHow));
  277. var OmegaBA = BetaBA + (1.3 * (OmegaHC * HeroHardcore + OmegaC * HeroCharm + OmegaKH * HeroKnowHow));
  278.  
  279. //Enemy base attacks
  280. var EAttDiv = $(".battle_opponent .sub_block.stats_wrap div:nth-child(8)");
  281. var Enemyatt = 0;
  282. var EAlphaBA = 0;
  283. if (EAttDiv.text().charAt(2) == ',') {EAlphaBA = parseInt(EAttDiv.text()) * 1000 + Number(EAttDiv.text().substr(3,3))}
  284. else if (EAttDiv.text().charAt(1) == ',') {EAlphaBA = parseInt(EAttDiv.text()) * 1000 + Number(EAttDiv.text().substr(2,3))}
  285. else {EAlphaBA = parseInt(AttDiv.text())}
  286.  
  287. var EBetaBA = EAlphaBA + (1.3 * (EBetaHC * EnemyHardcore + EBetaC * EnemyCharm + EBetaKH * EnemyKnowHow));
  288. var EOmegaBA = EBetaBA + (1.3 * (EOmegaHC * EnemyHardcore + EOmegaC * EnemyCharm + EOmegaKH * EnemyKnowHow));
  289.  
  290. // ACTUAL ATTACK VALUES
  291.  
  292. // Hero actual attacks
  293. var AlphaAA = AlphaBA - (EAlphaHCD * HeroHardcore + EAlphaCD * HeroCharm + EAlphaKHD * HeroKnowHow);
  294. var BetaAA = BetaBA - (EBetaHCD * HeroHardcore + EBetaCD * HeroCharm + EBetaKHD * HeroKnowHow);
  295. var OmegaAA = OmegaBA - (EOmegaHCD * HeroHardcore + EOmegaCD * HeroCharm + EOmegaKHD * HeroKnowHow);
  296. if (AlphaAA < 0) {AlphaAA = 0}; if (BetaAA < 0) {BetaAA = 0}; if (OmegaAA < 0) {OmegaAA = 0};
  297.  
  298. // Enemy actual attacks
  299. var EAlphaAA = EAlphaBA - (AlphaHCD * EnemyHardcore + AlphaCD * EnemyCharm + AlphaKHD * EnemyKnowHow);
  300. var EBetaAA = EBetaBA - (BetaHCD * EnemyHardcore + BetaCD * EnemyCharm + BetaKHD * EnemyKnowHow);
  301. var EOmegaAA = EOmegaBA - (OmegaHCD * EnemyHardcore + OmegaCD * EnemyCharm + OmegaKHD * EnemyKnowHow);
  302. if (EAlphaAA < 0) {EAlphaAA = 0}; if (EBetaAA < 0) {EBetaAA = 0}; if (EOmegaAA < 0) {EOmegaAA = 0};
  303.  
  304. // EXCITEMENT BURSTS
  305.  
  306. // Hero Ex burst
  307. var AlphaExBurst = (AlphaBA * 1.5) - (EAlphaHCD * HeroHardcore + EAlphaCD * HeroCharm + EAlphaKHD * HeroKnowHow);
  308. var BetaExBurst = (BetaBA * 1.5) - (EBetaHCD * HeroHardcore + EBetaCD * HeroCharm + EBetaKHD * HeroKnowHow);
  309. var OmegaExBurst = (OmegaBA * 1.5) - (EOmegaHCD * HeroHardcore + EOmegaCD * HeroCharm + EOmegaKHD * HeroKnowHow);
  310.  
  311. // Enemy Ex burst
  312. var EAlphaExBurst = (EAlphaBA * 1.5) - (AlphaHCD * EnemyHardcore + AlphaCD * EnemyCharm + AlphaKHD * EnemyKnowHow);
  313. var EBetaExBurst = (EBetaBA * 1.5) - (BetaHCD * EnemyHardcore + BetaCD * EnemyCharm + BetaKHD * EnemyKnowHow);
  314. var EOmegaExBurst = (EOmegaBA * 1.5) - (OmegaHCD * EnemyHardcore + OmegaCD * EnemyCharm + OmegaKHD * EnemyKnowHow);
  315.  
  316. // BATTLE TURNS SIMULATION
  317.  
  318. // First excitement threeshold
  319. var HeroExA = Math.ceil(HeroEXC/(AlphaAA * 2)) + 1;
  320. var EnemyExA = Math.ceil(EnemyEXC/(EAlphaAA * 2)) + 1;
  321. var HeroExB = Math.ceil(HeroEXC/(BetaAA * 2)) + HeroExA + 1;
  322. var EnemyExB = Math.ceil(EnemyEXC/(EBetaAA * 2)) + EnemyExA + 1;
  323. var HeroExO = Math.ceil(HeroEXC/(OmegaAA * 2)) + HeroExB + 1;
  324. var EnemyExO = Math.ceil(EnemyEXC/(EOmegaAA * 2)) + EnemyExB + 1;
  325. var HeroExOS = Math.ceil(HeroEXC/(OmegaAA * 2)) + 1;
  326. var EnemyExOS = Math.ceil(EnemyEXC/(EOmegaAA * 2)) + 1;
  327.  
  328. // Calculation for the judges
  329. var BetaAppear = Math.min(HeroExA, EnemyExA);
  330.  
  331. // Battle turns without criticals
  332. var HeroTurns = 0;
  333. var EnemyTurns = 0;
  334. var HeroHPleft = HeroEgo;
  335. var EnemyHPleft = EnemyEgo;
  336. var HeroExleft = HeroEXC;
  337. var EnemyExleft = EnemyEXC;
  338. var OmExCount = 0;
  339. var EOmExCount = 0;
  340. var BT;
  341. var test = 0;
  342.  
  343. for(BT = 1; BT < 40; BT++) {
  344. if (BT < HeroExA) {
  345. EnemyHPleft -= AlphaAA;
  346. HeroExleft -= AlphaBA * 2;
  347. if (EnemyHPleft > 0) {
  348. if(HeroExleft - (AlphaBA * 2) > 0) {EnemyTurns = BT + (EnemyHPleft/AlphaAA)}
  349. else if(HeroExleft - (AlphaBA * 2) <= 0) {EnemyTurns = BT + (EnemyHPleft/AlphaExBurst)}};}
  350. if (BT < EnemyExA) {
  351. HeroHPleft -= EAlphaAA;
  352. EnemyExleft -= EAlphaBA * 2;
  353. if (HeroHPleft > 0) {
  354. if(EnemyExleft - (EAlphaBA * 2) > 0) {HeroTurns = BT + (HeroHPleft/EAlphaAA)}
  355. else if(EnemyExleft - (EAlphaBA * 2) <= 0) {HeroTurns = BT + (HeroHPleft/EAlphaExBurst)}};}
  356. if (BT == HeroExA) {
  357. EnemyHPleft -= AlphaExBurst;
  358. HeroExleft = EnemyEXC;
  359. if (EnemyHPleft > 0) {EnemyTurns = BT + (EnemyHPleft/BetaAA)};}
  360. if (BT == EnemyExA) {
  361. HeroHPleft -= EAlphaExBurst;
  362. EnemyExleft = EnemyEXC;
  363. if (HeroHPleft > 0) {HeroTurns = BT + (HeroHPleft/EBetaAA)};}
  364. if (BT < HeroExB) { if (BT > HeroExA) {
  365. EnemyHPleft -= BetaAA;
  366. HeroExleft -= BetaBA * 2;
  367. if (EnemyHPleft > 0) {
  368. if(HeroExleft - (BetaBA * 2) > 0) {EnemyTurns = BT + (EnemyHPleft/BetaAA)}
  369. else if(HeroExleft - (BetaBA * 2) <= 0) {EnemyTurns = BT + (EnemyHPleft/BetaExBurst)}};}}
  370. if (BT < EnemyExB) { if (BT > EnemyExA) {
  371. HeroHPleft -= EBetaAA;
  372. EnemyExleft -= EBetaBA * 2;
  373. if (HeroHPleft > 0) {
  374. if(EnemyExleft - (EBetaBA * 2) > 0) {HeroTurns = BT + (HeroHPleft/EBetaAA)}
  375. else if(EnemyExleft - (EBetaBA * 2) <= 0) {HeroTurns = BT + (HeroHPleft/EBetaExBurst)}};}}
  376. if (BT == HeroExB) {
  377. EnemyHPleft -= BetaExBurst;
  378. HeroExleft = EnemyEXC;
  379. if (EnemyHPleft > 0) {EnemyTurns = (BT) + (EnemyHPleft/OmegaAA)};}
  380. if (BT == EnemyExB) {
  381. HeroHPleft -= EBetaExBurst;
  382. EnemyExleft = EnemyEXC;
  383. if (HeroHPleft > 0) {HeroTurns = (BT) + (HeroHPleft/EOmegaAA)};}
  384. if (BT > HeroExB) {if (BT < HeroExO) {
  385. EnemyHPleft -= OmegaAA;
  386. HeroExleft -= OmegaBA * 2;
  387. if (EnemyHPleft > 0) {
  388. if(HeroExleft - (OmegaBA * 2) > 0) {EnemyTurns = BT + (EnemyHPleft/OmegaAA)}
  389. else if(HeroExleft - (OmegaBA * 2) <= 0) {EnemyTurns = BT + (EnemyHPleft/OmegaExBurst)}};}}
  390. if (BT > EnemyExB) { if (BT < EnemyExO) {
  391. HeroHPleft -= EOmegaAA;
  392. EnemyExleft -= EOmegaBA * 2;
  393. if (HeroHPleft > 0) {
  394. if(EnemyExleft - (EOmegaBA * 2) > 0) {HeroTurns = BT + (HeroHPleft/EOmegaAA)}
  395. else if(EnemyExleft - (EOmegaBA * 2) <= 0) {HeroTurns = BT + (HeroHPleft/EOmegaExBurst)}};}}
  396. if (BT == HeroExO) {
  397. EnemyHPleft -= OmegaExBurst;
  398. HeroExleft = EnemyEXC;
  399. if (EnemyHPleft > 0) {EnemyTurns = (BT) + (EnemyHPleft/OmegaAA)}}
  400. if (BT == EnemyExO) {
  401. HeroHPleft -= EOmegaExBurst;
  402. EnemyExleft = EnemyEXC;
  403. if (HeroHPleft > 0) {HeroTurns = (BT) + (HeroHPleft/EOmegaAA)}}
  404. if (BT > HeroExO) { if (OmExCount < HeroExOS) {
  405. EnemyHPleft -= OmegaAA;
  406. HeroExleft -= OmegaBA * 2;
  407. if (EnemyHPleft > 0) {
  408. if(HeroExleft - (OmegaBA * 2) > 0) {EnemyTurns = BT + (EnemyHPleft/OmegaAA)}
  409. else if(HeroExleft - (OmegaBA * 2) <= 0) {EnemyTurns = BT + (EnemyHPleft/OmegaExBurst)}};
  410. OmExCount += 1;}}
  411. if (BT > EnemyExO) { if (EOmExCount < EnemyExOS) {
  412. HeroHPleft -= EOmegaAA;
  413. EnemyExleft -= EOmegaBA * 2;
  414. if (HeroHPleft > 0) {
  415. if(EnemyExleft - (EOmegaBA * 2) > 0) {HeroTurns = BT + (HeroHPleft/EOmegaAA)}
  416. else if(EnemyExleft - (EOmegaBA * 2) <= 0) {HeroTurns = BT + (HeroHPleft/EOmegaExBurst)}};
  417. EOmExCount += 1;}}
  418. if (OmExCount == HeroExOS) {
  419. EnemyHPleft -= (OmegaExBurst - OmegaAA);
  420. HeroExleft = EnemyEXC;
  421. if (EnemyHPleft > 0) {EnemyTurns = BT + (EnemyHPleft/OmegaAA)};
  422. OmExCount = 0;}
  423. if (EOmExCount == EnemyExOS) {
  424. HeroHPleft -= (EOmegaExBurst - EOmegaAA);
  425. EnemyExleft = EnemyEXC;
  426. if (HeroHPleft > 0) {HeroTurns = (BT) + (HeroHPleft/EOmegaAA)};
  427. EOmExCount = 0;}
  428. }
  429.  
  430. if (EAlphaBA < (AlphaHCD * EnemyHardcore + AlphaCD * EnemyCharm + AlphaKHD * EnemyKnowHow)) {HeroTurns = "∞"}
  431. if (AlphaBA < (EAlphaHCD * HeroHardcore + EAlphaCD * HeroCharm + EAlphaKHD * HeroKnowHow)) {EnemyTurns = "∞"}
  432.  
  433. var HeroLeftOver = HeroTurns - Math.floor(HeroTurns);
  434. var EnemyLeftOver = EnemyTurns - Math.floor(EnemyTurns);
  435.  
  436. var MinTurnsNC = Math.min(EnemyTurns, HeroTurns);
  437.  
  438. // CRITICAL TURNS CALCULATION
  439.  
  440. // Wild burst criticals calculated as turns
  441. var DamageC1 = AlphaHardcore * 0.5;
  442. var DamageC2 = BetaHardcore * 0.5;
  443. var DamageC3 = OmegaHardcore * 0.5;
  444.  
  445. var EDamageC1 = EAlphaHardcore * 0.5;
  446. var EDamageC2 = EBetaHardcore * 0.5;
  447. var EDamageC3 = EOmegaHardcore * 0.5;
  448.  
  449. // Narcissism criticals calculated as turns
  450. var DefenceC1 = AlphaCharm * ((AlphaHCD * EnemyHardcore + AlphaCD * EnemyCharm + AlphaKHD * EnemyKnowHow)/EAlphaAA);
  451. var DefenceC2 = BetaCharm * ((AlphaHCD * EnemyHardcore + AlphaCD * EnemyCharm + AlphaKHD * EnemyKnowHow)/EAlphaAA);
  452. var DefenceC3 = OmegaCharm * ((AlphaHCD * EnemyHardcore + AlphaCD * EnemyCharm + AlphaKHD * EnemyKnowHow)/EAlphaAA);
  453.  
  454. var EDefenceC1 = EAlphaCharm * ((EAlphaHCD * HeroHardcore + EAlphaCD * HeroCharm + EAlphaKHD * HeroKnowHow)/AlphaAA);
  455. var EDefenceC2 = EBetaCharm * ((EAlphaHCD * HeroHardcore + EAlphaCD * HeroCharm + EAlphaKHD * HeroKnowHow)/AlphaAA);
  456. var EDefenceC3 = EOmegaCharm * ((EAlphaHCD * HeroHardcore + EAlphaCD * HeroCharm + EAlphaKHD * HeroKnowHow)/AlphaAA);
  457.  
  458. // Healing criticals calculated as turns
  459. var HealC1 = AlphaKnowHow * (((HeroEgo * 1.1)/(Math.max(EAlphaAA, EOmegaAA))) - (HeroEgo/(Math.max(EAlphaAA, EOmegaAA))));
  460. var HealC2 = BetaKnowHow * (((HeroEgo * 1.1)/(Math.max(EAlphaAA, EOmegaAA))) - (HeroEgo/(Math.max(EAlphaAA, EOmegaAA))));
  461. var HealC3 = OmegaKnowHow * (((HeroEgo * 1.1)/(Math.max(EAlphaAA, EOmegaAA))) - (HeroEgo/(Math.max(EAlphaAA, EOmegaAA))));
  462.  
  463. var EHealC1 = EAlphaKnowHow * (((EnemyEgo * 1.1)/(Math.min(AlphaAA, OmegaAA))) - (EnemyEgo/(Math.min(AlphaAA, OmegaAA))));
  464. var EHealC2 = EBetaKnowHow * (((EnemyEgo * 1.1)/(Math.min(AlphaAA, OmegaAA))) - (EnemyEgo/(Math.min(AlphaAA, OmegaAA))));
  465. var EHealC3 = EOmegaKnowHow * (((EnemyEgo * 1.1)/(Math.min(AlphaAA, OmegaAA))) - (EnemyEgo/(Math.min(AlphaAA, OmegaAA))));
  466.  
  467. // Criticals probabilities
  468. var CritRounds = Math.round(MinTurnsNC * HeroCrit);
  469. var ECritRounds = Math.round(MinTurnsNC * EnemyCrit);
  470. var NCritRounds = CritRounds - 1;
  471. var ENCritRounds = ECritRounds - 1;
  472. var PCritRounds = CritRounds + 1;
  473. var EPCritRounds = ECritRounds + 1;
  474.  
  475. if (ECritRounds < 0) {ECritRounds = 0}
  476. if (CritRounds < 0) {CritRounds = 0}
  477. if (ENCritRounds < 0) {ENCritRounds = 0}
  478. if (NCritRounds < 0) {NCritRounds = 0}
  479.  
  480. // Actual calculation of critical rounds
  481. var TotalDC = 0;
  482. var TotalHC = 0;
  483. var ETotalDC = 0;
  484. var ETotalHC = 0;
  485. var TotalDCNR = 0;
  486. var TotalHCNR = 0;
  487. var ETotalDCNR = 0;
  488. var ETotalHCNR = 0;
  489. var TotalDCBR = 0;
  490. var TotalHCBR = 0;
  491. var ETotalDCBR = 0;
  492. var ETotalHCBR = 0;
  493. var CurrentCrit = 0;
  494. var CT;
  495.  
  496. for (CT = 0; CT < CritRounds; CT++) {
  497. CurrentCrit += 1;
  498. if (CurrentCrit == 1) {
  499. TotalDC += DamageC1;
  500. TotalHC += DefenceC1 + HealC1;}
  501. else if (CurrentCrit == 2) {
  502. TotalDC += DamageC2;
  503. TotalHC += DefenceC2 + HealC2;}
  504. else if (CurrentCrit == 3) {
  505. TotalDC += DamageC3;
  506. TotalHC += DefenceC3 + HealC3;
  507. CurrentCrit = 0;}
  508. }
  509.  
  510. CurrentCrit = 0;
  511. CT = 0;
  512.  
  513. for (CT = 0; CT < ECritRounds; CT++) {
  514. CurrentCrit += 1;
  515. if (CurrentCrit == 1) {
  516. ETotalDC += EDamageC1;
  517. ETotalHC += EDefenceC1 + EHealC1;}
  518. else if (CurrentCrit == 2) {
  519. ETotalDC += EDamageC2;
  520. ETotalHC += EDefenceC2 + EHealC2;}
  521. else if (CurrentCrit == 3) {
  522. ETotalDC += EDamageC3;
  523. ETotalHC += EDefenceC3 + EHealC3;
  524. CurrentCrit = 0;}
  525. }
  526.  
  527. CurrentCrit = 0;
  528. CT = 0;
  529.  
  530. for (CT = 0; CT < NCritRounds; CT++) {
  531. CurrentCrit += 1;
  532. if (CurrentCrit == 1) {
  533. TotalDCNR += DamageC1;
  534. TotalHCNR += DefenceC1 + EHealC1;}
  535. else if (CurrentCrit == 2) {
  536. TotalDCNR += DamageC2;
  537. TotalHCNR += DefenceC2 + EHealC2;}
  538. else if (CurrentCrit == 3) {
  539. TotalDCNR += DamageC3;
  540. TotalHCNR += DefenceC3 + EHealC3;
  541. CurrentCrit = 0;}
  542. }
  543.  
  544. CurrentCrit = 0;
  545. CT = 0;
  546.  
  547. for (CT = 0; CT < ENCritRounds; CT++) {
  548. CurrentCrit += 1;
  549. if (CurrentCrit == 1) {
  550. ETotalDCNR += EDamageC1;
  551. ETotalHCNR += EDefenceC1 + EHealC1;}
  552. else if (CurrentCrit == 2) {
  553. ETotalDCNR += EDamageC2;
  554. ETotalHCNR += EDefenceC2 + EHealC2;}
  555. else if (CurrentCrit == 3) {
  556. ETotalDCNR += EDamageC3;
  557. ETotalHCNR += EDefenceC3 + EHealC3;
  558. CurrentCrit = 0;}
  559. }
  560.  
  561. CurrentCrit = 0;
  562. CT = 0;
  563.  
  564. for (CT = 0; CT < PCritRounds; CT++) {
  565. CurrentCrit += 1;
  566. if (CurrentCrit == 1) {
  567. TotalDCBR += DamageC1;
  568. TotalHCBR += DefenceC1 + HealC1;}
  569. else if (CurrentCrit == 2) {
  570. TotalDCBR += DamageC2;
  571. TotalHCBR += DefenceC2 + HealC2;}
  572. else if (CurrentCrit == 3) {
  573. TotalDCBR += DamageC3;
  574. TotalHCBR += DefenceC3 + HealC3;
  575. CurrentCrit = 0;}
  576. }
  577.  
  578. CurrentCrit = 0;
  579. CT = 0;
  580.  
  581. for (CT = 0; CT < EPCritRounds; CT++) {
  582. CurrentCrit += 1;
  583. if (CurrentCrit == 1) {
  584. ETotalDCBR += EDamageC1;
  585. ETotalHCBR += EDefenceC1 + EHealC1;}
  586. else if (CurrentCrit == 2) {
  587. ETotalDCBR += EDamageC2;
  588. ETotalHCBR += EDefenceC2 + EHealC2;}
  589. else if (CurrentCrit == 3) {
  590. ETotalDCBR += EDamageC3;
  591. ETotalHCBR += EDefenceC3 + EHealC3;
  592. CurrentCrit = 0;}
  593. }
  594.  
  595. // FINAL ROUNDS CALCULATION
  596. var HeroNormalRounds = Math.ceil(HeroTurns - ETotalDC + TotalHC);
  597. var HeroBestRounds = Math.ceil(HeroTurns - ETotalDCNR + TotalHCBR);
  598. var HeroBadRounds = HeroTurns - ETotalDCBR + TotalHCNR;
  599.  
  600. var EnemyNormalRounds = Math.ceil(EnemyTurns - TotalDC + ETotalHC);
  601. var EnemyBestRounds = Math.ceil(EnemyTurns - TotalDCNR + ETotalHCBR);
  602. var EnemyBadRounds = EnemyTurns - TotalDCBR + ETotalHCNR;
  603.  
  604. var MinTurns = Math.min(HeroNormalRounds, EnemyNormalRounds);
  605.  
  606. // JUDGES DAMAGE BOOST CALCULATION (To be discounted from the hero's worst rounds)
  607. var EnemyBoost = 0;
  608. var HeroBoost = 0;
  609.  
  610. // Judge boost
  611. if (EAlphaHardcore == 1 && AlphaHardcore == 0 && JudgeHardcore == 1){
  612. if (MinTurns > BetaAppear) {EnemyBoost += Math.round(MinTurns/(BetaAppear * 2)) * (0.07 * BetaAppear)}
  613. else {EnemyBoost += 0.07 * MinTurns}};
  614.  
  615. if (EAlphaCharm == 1 && AlphaCharm == 0 && JudgeCharm == 1){
  616. if (MinTurns > BetaAppear) {EnemyBoost += Math.round(MinTurns/(BetaAppear * 2)) * (0.07 * BetaAppear)}
  617. else {EnemyBoost += 0.07 * MinTurns}};
  618.  
  619. if (EAlphaKnowHow == 1 && AlphaKnowHow == 0 && JudgeKnowHow == 1){
  620. if (MinTurns > BetaAppear) {EnemyBoost += Math.round(MinTurns/(BetaAppear * 2)) * (0.07 * BetaAppear)}
  621. else {EnemyBoost += 0.07 * MinTurns}};
  622.  
  623. if (AlphaHardcore == 1 && EAlphaHardcore == 0 && JudgeHardcore == 1) {HeroBoost += Math.round(MinTurns/(BetaAppear * 2)) * (0.07 * BetaAppear)};
  624. if (AlphaCharm == 1 && EAlphaCharm == 0 && JudgeCharm == 1) {HeroBoost += Math.round(MinTurns/(BetaAppear * 2)) * (0.07 * BetaAppear)};
  625. if (AlphaKnowHow == 1 && EAlphaKnowHow == 0 && JudgeKnowHow == 1) {HeroBoost += Math.round(MinTurns/(BetaAppear * 2)) * (0.07 * BetaAppear)};
  626.  
  627. var HeroWorstRounds = Math.ceil(HeroBadRounds - EnemyBoost);
  628. var EnemyWorstRounds = Math.ceil(EnemyBadRounds - HeroBoost);
  629.  
  630. // WIN RATES
  631. var WinRate = 0;
  632.  
  633. EnemyBadRounds = Math.ceil(EnemyTurns - TotalDCBR + ETotalHCNR);
  634. HeroBadRounds = Math.ceil(HeroTurns - ETotalDCBR + TotalHCNR);
  635.  
  636. if (NormalComparison == false) {WinRate = 1}
  637.  
  638. // Under normal conditions
  639. if (HeroNormalRounds - EnemyNormalRounds >= 0) {WinRate = 1}
  640.  
  641. // This checks how your rounds are compared to the enemy
  642. if (HeroBestRounds - EnemyBestRounds < 0) {WinRate -=0.1110}
  643. if (HeroBestRounds - EnemyNormalRounds < 0) {WinRate -=0.1110}
  644. if (HeroBestRounds - EnemyBadRounds < 0) {WinRate -=0.1110}
  645. if (HeroNormalRounds - EnemyBestRounds < 0) {WinRate -=0.1110}
  646. if (HeroNormalRounds - EnemyNormalRounds < 0) {WinRate -=0.1120}
  647. if (HeroNormalRounds - EnemyBadRounds < 0) {WinRate -=0.1110}
  648. if (HeroBadRounds - EnemyBestRounds < 0) {WinRate -=0.1110}
  649. if (HeroBadRounds - EnemyNormalRounds < 0) {WinRate -=0.1110}
  650. if (HeroBadRounds - EnemyBadRounds < 0) {WinRate -=0.1110}
  651.  
  652. // This is a safecheck for judges round calculations on worst rounds
  653. if (HeroBestRounds - EnemyBadRounds > 0 && HeroBestRounds - EnemyWorstRounds < 0) {WinRate -=0.02}
  654. if (HeroNormalRounds - EnemyBadRounds > 0 && HeroNormalRounds - EnemyWorstRounds < 0) {WinRate -=0.02}
  655. if (HeroBadRounds - EnemyBadRounds > 0 && HeroBadRounds - EnemyWorstRounds < 0) {WinRate -=0.02}
  656. if (HeroWorstRounds - EnemyBestRounds < 0 && HeroBadRounds - EnemyBestRounds > 0) {WinRate -=0.02}
  657. if (HeroWorstRounds - EnemyNormalRounds < 0 && HeroBadRounds - EnemyNormalRounds > 0) {WinRate -=0.02}
  658. if (HeroWorstRounds - EnemyBadRounds < 0 && HeroBadRounds - EnemyBadRounds > 0) {WinRate -=0.02}
  659.  
  660. // Fix to prevent values over 100%
  661. if (WinRate > 1) {WinRate = 1}
  662.  
  663. // Deductions from the judges
  664. if (HeroNormalRounds - EnemyNormalRounds == 0 && HeroLeftOver - ETotalDCBR + TotalHCNR <= 0.28) {
  665. if (EAlphaHardcore == 1) {
  666. if (JudgeKnowHow == 1) {WinRate -=0.006}}
  667. if (EAlphaCharm == 1) {
  668. if (JudgeHardcore == 1) {WinRate -=0.006}}
  669. if (EAlphaKnowHow == 1) {
  670. if (JudgeHardcore == 1) {WinRate -=0.006}}
  671. }
  672.  
  673. // Fix to prevent negative
  674. if (WinRate < 0) {WinRate = 0}