IdlePixel Lucky

Calculates how lucky you are with your drops.

目前為 2023-07-24 提交的版本,檢視 最新版本

// ==UserScript==
// @name         IdlePixel Lucky
// @namespace    com.missnobody.idlepixel.lucky
// @version      1.0.75
// @description  Calculates how lucky you are with your drops.
// @author       MissNobody
// @license      MIT
// @match        *://idle-pixel.com/login/play*
// @grant        none
// @require https://gf.qytechs.cn/scripts/441206-idlepixel/code/IdlePixel+.js
// ==/UserScript==

(function()
{
    'use strict';

    let loaded = false;
    let hooked = false;

    const mapping = 
    {
        "Chicken": [ "var_chicken_kills", 
            [ "var_chicken_bones", 1, 1, 1 ],
            [ "var_chicken_raw_chicken", 1, 1, 1 ],
            [ "var_chicken_feathers", 5, 15, 1 ],
            [ "var_chicken_dotted_green_leaf", 1, 1, 3 ],
            [ "var_chicken_green_leaf", 1, 1, 10 ],
            [ "var_chicken_lime_leaf", 1, 1, 25 ],
            [ "var_chicken_gold_leaf", 1, 1, 96 ],
            [ "var_chicken_sigil", 1, 1, 1000 ],
        ],
        
        "Rat": [ "var_rat_kills",
            [ "var_rat_bones", 1, 1, 1 ],
            [ "var_rat_cheese", 1, 1, 2 ],
            [ "var_rat_dotted_green_leaf", 1, 1, 3 ],
            [ "var_rat_green_leaf", 1, 1, 10 ],
            [ "var_rat_lime_leaf", 1, 1, 25 ],
            [ "var_rat_gold_leaf", 1, 1, 96 ],
            [ "var_rat_gold_leaf", 1, 1, 1000 ]
        ],
        
        "Spider": [ "var_spider_kills",
            [ "var_spider_string", 1, 4, 1 ],
            [ "var_spider_dotted_green_leaf", 1, 1, 3 ],
            [ "var_spider_green_leaf", 1, 1, 10 ],
            [ "var_spider_lime_leaf", 1, 1, 25 ],
            [ "var_spider_gold_leaf", 1, 1, 96 ],
            [ "var_spider_sigil", 1, 1, 1000 ]
        ],
        
        "Bee": [ "var_bee_kills",
            [ "var_bee_honey", 1, 2, 1 ],
            [ "var_bee_stinger", 1, 1, 1 ],
            [ "var_bee_sigil", 1, 1, 1000 ]
        ],
    };

    class LuckyPlugin extends IdlePixelPlusPlugin
    {
        
/*
*/

        constructor()
        {
            super("Lucky",
            {
                about:
                {
                    name: GM_info.script.name,
                    version: GM_info.script.version,
                    author: GM_info.script.author,
                    description: GM_info.script.description
                }
            });
        }

        luckFactor(K, minA, maxA, N, L)
        {
            K = parseFloat(K);
            minA = parseFloat(minA);
            maxA = parseFloat(maxA);
            N = parseFloat(N);
            L = parseFloat(L);
            
            if (L === 0) return K <= N ? 0.0 : -Math.min(Math.log2(K/N), 10);

            if (minA === maxA)
            {
                let Lavg = K*minA/N;
                return (L - Lavg)/Lavg;
            }

            let Lmin = K*minA/N;
            let Lmax = K*maxA/N;
            let Lavg = (Lmin + Lmax)/2.0;

            if (L > Lmax) return (L - Lmax)/Lmax + 1.0;
            if (L > Lavg) return (L - Lavg)/(Lmax - Lavg);

            let f_num = (a, L, Lavg) => 2.0/(1 + Math.exp(Math.max(-a*(L - Lavg), -100))) - 1;
            let eq_num = (a) => f_num(a, Lmax, Lavg) - 1;

            let a = 0.1;
            let fx = eq_num(a);

            let dfx;
            let epsilon = 1e-7;

            for (let i = 0; i < 100; i++)
            {
                if (Math.abs(fx) < epsilon) break;
            
                dfx = (eq_num(a + epsilon) - fx)/epsilon;
                a = a - fx/dfx;
                fx = eq_num(a);
            }

            return f_num(a, L, Lavg);
        }

        updateCombat(calc)
        {
            try
            {
                let enemy = $('#modal-monster-lookup-content').find('center').first().text();
                let kills = $('#combat-log-body tr:has(td:contains("' + enemy + '")) td:nth-child(4)').text().replace(" Kills", "").replace(/\D/g,'');
                
                let table = $('.combat-log-table');
                let header = table.find('th:contains("Luck")');
                let rows = table.find("tr");
                let column;

                if (header.length <= 0)
                {
                    column = rows.first().children().length;
                    rows.first().append('<th style="background-color:#DEDEED;padding:10px;text-align:center;">Luck</th>');
                }
                else
                {
                    column = header.parent().children().index(header);
                    header.text("0.0");
                }

                $.each(rows, function(index, row)
                {
                    if (index > 0)
                    {
                        let columns = $(row).find('td');
                        let looted = $(columns[4]).text();
                        let amounts = $(columns[2]).text().split(' - ');
                        let minAmount, maxAmount;

                        switch (amounts.length)
                        {
                            case 1: minAmount = maxAmount = amounts[0]; break;
                            case 2: minAmount = 1.0*amounts[0]; maxAmount = 1.0*amounts[1]; break;
                            default: minAmount = maxAmount = 1;
                        }

                        let chance = $(columns[3]).text();
                        let factor;
                      
                        if (chance === "Always")
                        {
                            factor = calc(kills, minAmount, maxAmount, 1, looted);
                            factor = (Math.round(factor*100.0)/100.0).toFixed(2);
                        }
                        else
                        {
                            let chances = chance.split('/');

                            switch (chances.length)
                            {
                                case 2:
                                {
                                    factor = calc(kills, minAmount, maxAmount, chances[1].replace(/\D/g,''), looted);
                                    factor = (Math.round(factor*100.0)/100.0).toFixed(2);
                                    break;
                                }
                                
                                default: factor = "N/A";
                            }
                        }

                        let rank;

                        if (factor < -10.0) rank = "Insanely unlucky"; else
                        if (factor < -5.0) rank = "Extremely unlucky"; else
                        if (factor < -2.0) rank = "Very unlucky"; else
                        if (factor < -1.0) rank = "Unlucky"; else
                        if (factor < -0.5) rank = "Somewhat unlucky"; else
                        if (factor < -0.25) rank = "Slightly unlucky"; else
                        if (factor < 0.25) rank = "Average luck"; else
                        if (factor < 0.5) rank = "Slightly lucky"; else
                        if (factor < 1.0) rank = "Somewhat lucky"; else
                        if (factor < 2.0) rank = "Lucky"; else
                        if (factor < 5.0) rank = "Very lucky"; else
                        if (factor < 10.0) rank = "Extremely lucky"; else
                            rank = "Insanely lucky";

                        let final = rank + '<br/>(' + factor + ')';

                        if (column >= columns.length)
                        {
                            $(row).append('<td>' + final + '</td>');
                        }
                        else
                        {
                            $(columns[column]).html(final);
                        }
                    }
                });
            }
            catch (error)
            {
                console.error(error);
            }
        }

        onLogin()
        {
            loaded = true;
        }

        onPanelChanged(before, after)
        {
            if (before != after)
            {
                if (!hooked && after === 'combat-log')
                {
                    hooked = true;
       
                    let calc = this.luckFactor;
                    let update = this.updateCombat;
                    let lookup = $('#modal-monster-lookup');
 
                    if (lookup.length > 0)
                    {
                        let observer = new MutationObserver(function(mutations) { update(calc); });

                        observer.observe(lookup[0], { attributes: true });
                    }
                }
            }
        }
    }

    const plugin = new LuckyPlugin();
    IdlePixelPlus.registerPlugin(plugin);

})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址