// ==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);
})();