WinRate Library

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

Script này sẽ không được không được cài đặt trực tiếp. Nó là một thư viện cho các script khác để bao gồm các chỉ thị meta // @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}