New script hzla.github.io

27/08/2024, 13:23:14

// ==UserScript==
// @name        New script hzla.github.io
// @namespace   Violentmonkey Scripts
// @match       https://hzla.github.io/Dynamic-Calc/*
// @grant       GM_addStyle
// @version     1.1
// @author      -
// @license MIT
// @require https://code.jquery.com/jquery-3.6.0.min.js
// @description 27/08/2024, 13:23:14
// ==/UserScript==

var leftTable = $('table')[0].rows
var rightTable = $('table')[2].rows

var c = leftTable[0].cells[3].classList
c.add("evs")

leftTable[7].insertCell(-1)
leftTable[7].cells[7]

var c2 = rightTable[0].cells[3].classList
c2.add("evs")

var blocks = $('.info-selectors')
// for(var i = 0; i < 2; i++){
  var speedIcon = document.createElement('img')
  speedIcon.className = 'speed-icon'
  blocks.append(speedIcon)
// }

// console.log('' + performCalculations)

function performCalculations() {
	var p1info = $("#p1");
	var p2info = $("#p2");
	var p1 = createPokemon(p1info);
	var p2 = createPokemon(p2info);
	var p1field = createField();
	var p2field = p1field.clone().swap();





	damageResults = calculateAllMoves(damageGen, p1, p1field, p2, p2field);
	p1 = damageResults[0][0].attacker;
	p2 = damageResults[1][0].attacker;
	var battling = [p1, p2];
	p1.maxDamages = [];
	p2.maxDamages = [];


	if ($('#SpeL').prop('checked')) {
		p1.stats.spe = Math.floor(p1.stats.spe * 1.1);
		p1info.find(".sp .totalMod").css('color', '#bd93f9');
	} else {
		p1info.find(".sp .totalMod").attr('style', '');
	}

	p1info.find(".sp .totalMod").text(p1.stats.spe);

	p2info.find(".sp .totalMod").text(p2.stats.spe);
	var fastestSide = p1.stats.spe > p2.stats.spe ? 0 : p1.stats.spe === p2.stats.spe ? "tie" : 1;

	var result, maxDamage;
	var bestResult;
	var zProtectAlerted = false;
	var is100 = false;

	for (var i = 0; i < 4; i++) {
		// P1
		result = damageResults[0][i];
		maxDamage = result.range()[1] * p1.moves[i].hits;
		if (!zProtectAlerted && maxDamage > 0 && p1.item.indexOf(" Z") === -1 && p1field.defenderSide.isProtected && p1.moves[i].isZ) {
			alert('Although only possible while hacking, Z-Moves fully damage through protect without a Z-Crystal');
			zProtectAlerted = true;
		}
		p1.maxDamages.push({moveOrder: i, maxDamage: maxDamage});
		p1.maxDamages.sort(function (firstMove, secondMove) {
			return secondMove.maxDamage - firstMove.maxDamage;
		});
		$(resultLocations[0][i].move + " + label").text(p1.moves[i].name.replace("Hidden Power", "HP"));

		if(p1.moves[i].category == 'Status' && result.moveDesc(notation).split("(")[0] == '0 - 0%'){
			$(resultLocations[0][i].damage).text('Status');
		}
		else{

			$(resultLocations[0][i].damage).text(result.moveDesc(notation));

			if (["Avalanche", "Payback", "Assurance", "Revenge", "Retaliate", "Stomping Tantrum"].indexOf(p1.moves[i].name) != -1) {
				$(resultLocations[0][i].damage).text(result.moveDesc(notation) + " (can double power)");
			}
		}

		// P2
		result = damageResults[1][i];
		maxDamage = result.range()[1] * p2.moves[i].hits;
		if (!zProtectAlerted && maxDamage > 0 && p2.item.indexOf(" Z") === -1 && p2field.defenderSide.isProtected && p2.moves[i].isZ) {
			alert('Although only possible while hacking, Z-Moves fully damage through protect without a Z-Crystal');
			zProtectAlerted = true;
		}
		p2.maxDamages.push({moveOrder: i, maxDamage: maxDamage});
		p2.maxDamages.sort(function (firstMove, secondMove) {
			return secondMove.maxDamage - firstMove.maxDamage;
		});
		$(resultLocations[1][i].move + " + label").text(p2.moves[i].name.replace("Hidden Power", "HP"));
		if(p2.moves[i].category == 'Status' && result.moveDesc(notation).split("(")[0] == '0 - 0%'){
			$(resultLocations[1][i].damage).text('Status');
		}
		else{$(resultLocations[1][i].damage).text(result.moveDesc(notation));}

		var dmgInfo = $(resultLocations[1][i].damage).text();


		if (moveProbabilities[i] != 0) {

			if (!is100) {
				var probability = '  \(' + (Math.round(moveProbabilities[i] * 1000) / 10).toString() + '% top roll\)';
				if (moveProbabilities[i] == 1) {
					is100 = true;
				}
				$(resultLocations[1][i].damage).text(dmgInfo + probability)
			}
		}

		if (["Avalanche", "Payback", "Assurance", "Revenge", "Retaliate", "Stomping Tantrum"].indexOf(p2.moves[i].name) != -1) {
			$(resultLocations[1][i].damage).text($(resultLocations[1][i].damage).text()+ " (can double power)");
		}




		// BOTH
		var bestMove;
		if (fastestSide === "tie") {
			// Technically the order should be random in a speed tie, but this non-determinism makes manual testing more difficult.
			// battling.sort(function () { return 0.5 - Math.random(); });
			bestMove = battling[0].maxDamages[0].moveOrder;
			var chosenPokemon = battling[0] === p1 ? "0" : "1";
			bestResult = $(resultLocations[chosenPokemon][bestMove].move);
			$('.speed-icon').attr('src', "https://github.com/AFalsePrayer/gen3-calc/blob/master/src/img/speed-tie.png?raw=true");
		} else {
			bestMove = battling[fastestSide].maxDamages[0].moveOrder;
			bestResult = $(resultLocations[fastestSide][bestMove].move);
			$('.speed-icon')[1 - fastestSide].src = "https://github.com/AFalsePrayer/gen3-calc/blob/master/src/img/speed-slower.png?raw=true";
			$('.speed-icon')[fastestSide].src = "https://github.com/AFalsePrayer/gen3-calc/blob/master/src/img/speed-faster.png?raw=true"
		}
	}
	if ($('.locked-move').length) {
		bestResult = $('.locked-move');
	} else {
		stickyMoves.setSelectedMove(bestResult.prop("id"));
	}
	bestResult.prop("checked", true);
	bestResult.change();
	$("#resultHeaderL").text(p1.name + "'s Moves (select one to show detailed results)");
	$("#resultHeaderR").text(p2.name + "'s Moves (select one to show detailed results)");
}

var script = document.createElement('script');
script.innerHTML = '' + performCalculations

document.getElementsByTagName('head')[0].appendChild(script);

GM_addStyle('td:has(.evs){display:none !important;} .evs{display:none !important;} table{width: 60%;  text-align: center;} .speed-icon{width:40px;margin:20px;}')