宝可梦点击(Poke Clicker)辅助脚本 维他命喂养脚本

在喂养界面中倍数选项右边的下拉菜单

// ==UserScript==
// @name         宝可梦点击(Poke Clicker)辅助脚本 维他命喂养脚本
// @namespace    PokeClickerHelper
// @version      1.3
// @description  在喂养界面中倍数选项右边的下拉菜单
// @author       CoCo
// @match        https://www.pokeclicker.com
// @match        https://g8hh.github.io/pokeclicker/
// @match        https://pokeclicker.g8hh.com
// @match        https://yx.g8hh.com/pokeclicker/
// @icon         data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/319hf99fYX/fX2F/319hf8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////99fYX/fX2F/319hf8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////wAAAP8AAAD/fX2F/319hf99fYX/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAD/AAAA/wAAAP99fYX/fX2F/wAAAP8AAAD/AAAA/319hf8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/HBT//xwU//8AAAD//////319hf8AAAD/Dgim/w4Ipv8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/HBT//xwU//8cFP//HBT//wAAAP8AAAD/Dgim/w4Ipv8OCKb/Dgim/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/xwU//8cFP//HBT//xwU/44cFP//HBT//xwU//8cFP//Dgim/w4Ipv8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/HBT//xwU/47/////HBT/jhwU//8cFP//HBT//w4Ipv8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/xwU//8cFP//HBT/jhwU//8OCKb/Dgim/w4Ipv8OCKb/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/xwU//8OCKb/Dgim/w4Ipv8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAPw/AADwDwAA4AcAAOAHAADAAwAAwAMAAMADAADAAwAA4AcAAOAHAADwDwAA/D8AAP//AAD//wAA//8AAA==
// @grant        none
// @license      MIT
// @run-at       document-start
// ==/UserScript==

const LoadUAV = function () {
    if (document.readyState === 'interactive') {
        const text = `<a class="dropdown-item" id="UAV" href="#" onclick="UseAllVitamins()">按繁殖效率排序喂养</a>`;
        $('#pokemonVitaminExpandedModal div .dropdown-menu').prepend(text);
    }
    if (document.readyState === 'complete') { this.removeEventListener('readystatechange', LoadUAV) }
}
document.addEventListener('readystatechange', LoadUAV);


function attckdebuff(pokemonname) {//计算地区debuff
    if (App.game.challenges.list.regionalAttackDebuff.active()) {
        if (PokemonHelper.calcNativeRegion(pokemonname) !== player.highestRegion()) {
            return App.game.party.getRegionAttackMultiplier();
        }
    }
    return 1.0
}
function Steps(Protein, Calcium, Carbos, eggsteps) {//计算步数
    const div = 300;
    const extraCycles = (Protein + Calcium) * 20;
    const steps = eggsteps + extraCycles;
    return steps <= div ? steps : Math.round(((steps / div) ** (1 - Carbos / 70)) * div);
}

function BreedingAttackBonus(Protein, Calcium, baseAttack) {//计算攻击成长

    return baseAttack * (25 + Calcium) / 100 + Protein;
}

function BreedingEfficiency(Protein, Calcium, Carbos, eggsteps, baseAttack, pokemonid, pokemonname) {//效率计算
    return ((BreedingAttackBonus(Protein, Calcium, baseAttack) * App.game.party.getPokemon(pokemonid).calculateEVAttackBonus()) / Steps(Protein, Calcium, Carbos, eggsteps)) * GameConstants.EGG_CYCLE_MULTIPLIER * attckdebuff(pokemonname);
}

function sortresult(a, b) {//按效率排序
    return b[3] - a[3];
}
function Need(Need_amount, Used_amount, Leftover_amount) {//计算余量
    if (Need_amount - Used_amount - Leftover_amount > 0) {
        return Need_amount - Used_amount - Leftover_amount;
    }
    return 0;
}
UseAllVitamins = () => {
    let pokemonArr = App.game.party.caughtPokemon;
    let Protein;
    let Calcium;
    let Carbos;
    let baseAttack;//基础攻击力
    let eggsteps;//孵蛋步数
    let breedingEfficiency;//效率
    let max;
    let Vitamins_amount;//可用维他命总数
    let X;//记录Protein
    let Y;//记录Calcium
    let Z;//记录Carbos
    let Protein_amount;//Protein现有数量
    let Calcium_amount;//Calcium现有数量
    let Carbos_amount;//Carbos现有数量
    let result = [];//记录所有最优解
    let pokemonid;
    let pokemonname;
    let Need_Protein_amount = 0;//Protein所需数量
    let Need_Calcium_amount = 0;//Calcium所需数量
    let Need_Carbos_amount = 0;//Carbos所需数量
    let Used_Protein_amount = 0;//Protein已用数量
    let Used_Calcium_amount = 0;//Calcium已用数量
    let Used_Carbos_amount = 0;//Carbos已用数量
    PartyController.removeAllVitaminsFromParty(false);//清除所有维他命
    Vitamins_amount = (player.highestRegion() + 1) * 5;
    for (let i = 0; i < pokemonArr.length; i++) {//计算最优解并放入数组
        //初始化
        Protein = 0;
        Calcium = 0;
        Carbos = 0;
        max = 0;
        X = 0;
        Y = 0;
        Z = 0;
        pokemonid = App.game.party.caughtPokemon[i].id;//获取ID
        pokemonname = App.game.party.caughtPokemon[i].name;//获取名字
        baseAttack = App.game.party.caughtPokemon[i].baseAttack;//获取基础攻击力
        eggsteps = App.game.party.caughtPokemon[i].eggCycles * 40;//获取孵蛋步数
        for (Carbos = Vitamins_amount; Carbos > 0; Carbos--) {//计算最优解
            if (baseAttack > 100) {
                Calcium = Vitamins_amount - Carbos
            }
            else if (baseAttack <= 100) {
                Protein = Vitamins_amount - Carbos;
            }
            breedingEfficiency = BreedingEfficiency(Protein, Calcium, Carbos, eggsteps, baseAttack, pokemonid, pokemonname);
            if (breedingEfficiency > max) {
                //记录
                max = breedingEfficiency;
                X = Protein;
                Y = Calcium;
                Z = Carbos;
            }
        }
        Need_Protein_amount += X;
        Need_Calcium_amount += Y;
        Need_Carbos_amount += Z;
        result.push([X, Y, Z, max, pokemonid]);//存入数据
    }
    result.sort(sortresult);//按繁殖效率排序
    for (let j = 0; j < result.length; j++) {//喂维他命
        let flag;
        for (let i = 0; i < pokemonArr.length; i++) {
            if (App.game.party.caughtPokemon[i].id == result[j][4]) {
                //获取三种维他命现有数量(不含已使用)
                Protein_amount = player.itemList["Protein"]();
                Calcium_amount = player.itemList["Calcium"]();
                Carbos_amount = player.itemList["Carbos"]();
                if (Protein_amount < result[j][0] || Calcium_amount < result[j][1] || Carbos_amount < result[j][2])//判断是否够用
                {
                    alert("维他命不足,已结束喂药" + '\n' +
                        "距离喂下一个还需买" + '\n' +
                        "Protein:" + Need(result[j][0], Protein_amount, 0) + '\n' +
                        "Protein:" + Need(result[j][1], Calcium_amount, 0) + '\n' +
                        "Carbos:" + Need(result[j][2], Carbos_amount, 0) + '\n');
                    flag = true;
                    break;
                }
                else {
                    if (result[j][0] > 0) {
                        App.game.party.caughtPokemon[i].useVitamin(0, result[j][0]);//喂Protein
                        Used_Protein_amount += result[j][0];
                    }
                    if (result[j][1] > 0) {
                        App.game.party.caughtPokemon[i].useVitamin(1, result[j][1]);//喂Calcium
                        Used_Calcium_amount += result[j][1];
                    }
                    if (result[j][2] > 0) {
                        App.game.party.caughtPokemon[i].useVitamin(2, result[j][2]);//喂Carbos
                        Used_Carbos_amount += result[j][2];
                    }
                }
            }
        }
        if (flag) {
            break;
        }
    }
    alert("已结束喂药,距离当前已获得宝可梦完全喂满还需喂" + '\n' +
        "Protein:" + Need(Need_Protein_amount, Used_Protein_amount, player.itemList["Protein"]()) + '\n' +
        "Protein:" + Need(Need_Calcium_amount, Used_Calcium_amount, player.itemList["Calcium"]()) + '\n' +
        "Carbos:" + Need(Need_Carbos_amount, Used_Carbos_amount, player.itemList["Carbos"]()) + '\n'
    )
}