let experienceYields = { "Porygon2": 180, "Hypno": 169, "Meowth": 58, "Rowlet": 64, "Dartrix": 147, // ... }; function gamefreakSqrt(n) { let actualSqrt = Math.sqrt(n); let lowerBound = Math.floor(actualSqrt); if(lowerBound * lowerBound === n) { return lowerBound * 4096; } let bestCoeff = 0; let bestDistance = actualSqrt - lowerBound; for (let i = 1; i <= 4096; i++) { let check = lowerBound + i / 4096; let distance = Math.abs(actualSqrt - check); if (distance < bestDistance) { bestCoeff = i; bestDistance = distance; } } return lowerBound * 4096 + bestCoeff; } function getExperienceForKill(foeName, foeLevel, level, luckyEgg, affection, rotoExp, expShare, tradeExp, evolutionDue, expScaling, gen7, wild) { let expYield = experienceYields[foeName]; if (typeof expYield === "undefined") { throw new Error("Unknown Pokémon: " + foeName); } let log = false; if (expScaling) { let x = foeLevel + foeLevel + 10; let y = foeLevel + level + 10; let x2 = x * x; let y2 = y * y; let z = Math.floor(expYield * foeLevel / 5); if (expShare) { z = Math.floor(z / 2); } let exp = Math.floor(((gamefreakSqrt(x) * x2) * z) / ((gamefreakSqrt(y) * y2))) + 1; if (log) { console.log("Exp: " + exp); } // console.log(exp); if (!gen7 && !wild) { exp = Math.floor(exp * 1.5); } if (tradeExp) { exp = Math.floor(exp * 1.5); } // if (luckyEgg) { // exp = Math.floor(exp * 1.5); // } if (affection) { exp = exp * 4915; exp = Math.round(exp / 4096) } if (evolutionDue) { exp = exp * 4915; exp = Math.round(exp / 4096) } if (rotoExp) { exp = exp * 150; exp = Math.floor(exp / 100); } return Math.floor(exp); } else { let exp = Math.floor(expYield * foeLevel / 7); if (log) { console.log("Exp: " + exp); } if (!gen7 && !wild) { exp = Math.floor(exp * 1.5); } if (tradeExp) { exp = Math.floor(exp * 1.5); } if (affection) { exp = exp * 4915; exp = Math.round(exp / 4096) } if (evolutionDue) { exp = exp * 4915; exp = Math.round(exp / 4096) } return Math.floor(exp); } }