Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local pinStart = {2,3,4,5,8,11,14};
- local startNames = {"Launch 1", "Launch 2", "Launch 3", "Bronze Portal", "Silver Portal", "Gold Portal", "Purple Portal"};
- local rewardTiers = {1,1,1,2,2,2,2,3,3,3,4,4,4,5,5,6,6,7};
- local tierNames = {"Lame", "Bronze", "Silver", "Gold", "Elite", "Divine", "Jackpot"};
- local rewardNames = {
- ap="AP Coupon", balls="Pachinko Balls", crusade="Crusade Misc", bp="BP Coupon", gold="Gold", kills="Kills",
- crystal="Crystals", event="Eggs", gem="Gems", jackpot="Jackpot (2000 gems, Ball Cascade)", raid="Raid Ticket", asylum="Asylum Key",
- card1="Star Card (grey)", card2="Star Card (green)", card3="Star Card (blue)", card4="Star Card (purple)", card5="Star Card (orange)",
- crusade1="Safety Charm", crusade2="Lucky Donut", crusade3="Crystal Genesis", crusade4="Chaotic Mutator", crusade5="Benign Mutator",
- candy1="2h Candy", candy2="4h Candy", candy3="8h Candy", candy4="24h Candy", candy5="72h Candy",
- };
- local rewards = {
- launch = {rng=100, {60, portal=1}, {83, portal=2}, {portal=3}},
- cascade = {rng=100, {90, portal=4}, {98, portal=5}, {portal=6}},
- crusade = {rng=100, {10, crusade1=1}, {30, crusade2=1}, {50, crusade3=1}, {75, crusade4=1}, {crusade5=1}},
- {event=1, rng=100, {30, gold=1}, {56, kills=1}, {66, card1=1}, {67, raid=1}, {portal=4}}, -- tier 1
- {event=3, rng=200, {27, gem=2}, {76, card2=1}, {77, candy1=1}, {122, kills=1}, {124, raid=1}, {140, card1=2}, {portal=5}}, -- tier 2
- {event=5, rng=200, {30, gem=5}, {60, card3=1}, {61, candy2=1}, {65, crusade=1}, {98, balls=8}, {134, card1=3}, {portal=6}}, -- tier 3
- {event=15, rng=100, {20, gem=15}, {29, card4=1}, {30, candy3=1}, {35, ap=1}, {53, balls=15}, {72, card1=6}, {portal=7}}, -- tier 4
- {event=50, rng=100, {19, gem=100}, {30, card5=1}, {33, candy4=1}, {37, crusade=2}, {62, card1=15}, {65, bp=1}, {balls=30}}, -- tier 5
- {event=200, rng=100, {24, gem=250}, {32, candy5=1}, {72, balls=75}, {95, asylum=30}, {crystal=1}}, -- tier 6
- {event=1000, rng=100, {jackpot=1, gem=2000, cascade=200}}, -- tier 7
- -- {event=1, rng=100, {18, gem=1}, {45, gold=1}, {56, kills=1}, {66, card1=1}, {68, raid=1}, {portal=4}},
- -- {event=3, rng=100, {20, gem=2}, {38, card2=1}, {39, candy1=1}, {61, kills=1}, {63, raid=1}, {70, card1=3}, {portal=5}},
- -- {event=5, rng=100, {17, gem=10}, {37, card3=1}, {38, candy2=1}, {40, crusade=1}, {55, balls=5}, {67, card1=5}, {portal=6}},
- -- {event=15, rng=100, {25, gem=20}, {33, card4=1}, {34, candy3=1}, {37, ap=1}, {55, balls=10}, {67, card1=10}, {portal=7}},
- -- {event=50, rng=100, {26, gem=100}, {40, card5=1}, {44, candy4=1}, {50, crusade=3}, {62, card1=25}, {69, bp=1}, {balls=20}},
- -- {event=200, rng=100, {26, gem=300}, {44, candy5=1}, {89, balls=50}, {crystal=1}},
- -- {event=1000, rng=100, {gem=2000, jackpot=1, cascade=200}}, -- cascade = 200
- };
- -- the goal of this first loop is to convert numbered probability
- -- (i.e. for tier one if number is between 1 and 30 give gold 1, if between 56 and 30 give kill 1, if between 67 and 100 give portal)
- -- into decimal probability (between 0 and 1)
- for k2, tier in pairs (rewards) do -- tier = launch or cascade or crusade or unnamed tiers ranging from 1 to 7
- tier.event = tier.event or 0; -- set event value to 0 when it's not defined (named tiers)
- for _, reward in ipairs (tier) do -- ipairs iterate only on not named value, i.e. it ignore even and rng and only focus on things like {30, gold=1}
- reward[1] = (reward[1] or tier.rng + 1) - 1; -- reduce first value per 1 ({30, gold=1} become {29, gold=1}) or set it to rng if no unammed value ({crystal=1} become {X, crystal=1} when X = tiers.rng)
- end -- a or b + 1 is the same as a or (b+1)
- print('--- '..(tierNames[k2] or k2) .. ' ----')
- for i = #tier, 1, -1 do -- #tier = length of tier without counting named value so it's iterating among {X,Y=Z} things and not event=X or rng=Y -- for var = start, end, step
- tier[i][1] = (tier[i][1] - (i==1 and 0 or tier[i-1][1])) / tier.rng; -- and have priority on or ; 0 is a true value so if i==1 it return 0 else it return tier[i-1][1]
- for k,v in pairs (tier[i]) do
- if type(k)=='string' then
- if rewardNames[k] == nil then
- if k == 'portal' then
- print('Portal')
- end
- else
- print(v..' ' .. rewardNames[k])
- end
- end
- end
- print(100*tier[i][1] .. '%')
- end
- end
- local rightChance = 7 / (6 + 7); -- ball have a little more chance to go the the right
- local bounces = 9;
- local function factorial(n)
- local ret = 1;
- for i = 1, n do
- ret = ret * i;
- end
- return ret;
- end
- local goals = {};
- for _, start in ipairs (pinStart) do
- goals[start] = {};
- for i = 0, bounces do
- local odds = (factorial(bounces) / (factorial(i) * factorial(bounces-i))) * rightChance^i * (1-rightChance)^(bounces-i);
- local goal = math.max(1, math.floor(start - 4.5) + i);
- local tier = rewardTiers[goal];
- goals[start][tier] = (goals[start][tier] or 0) + odds;
- end
- end
- function eval_rewards(rewardList, list, mult, level)
- if (level == 12 or mult == 0) then return; end
- list = list or setmetatable({}, {__index = function() return 0; end});
- mult = mult or 1;
- level = level or 1;
- list.event = list.event + rewardList.event * mult;
- for _, reward in ipairs (rewardList) do
- for item, amount in pairs (reward) do
- if (item ~= 1) then
- if (rewards[item]) then
- eval_rewards(rewards[item], list, amount * reward[1] * mult, level + 1);
- elseif (item == "portal") then
- eval_pin(pinStart[amount], list, reward[1] * mult, level + 1);
- else
- list[item] = list[item] + amount * reward[1] * mult;
- end
- end
- end
- end
- return list;
- end
- function eval_pin(pin, list, mult, level)
- for tier, chance in pairs (goals[pin]) do
- eval_rewards(rewards[tier], list, chance * mult, level);
- end
- end
- local list = eval_rewards(rewards.launch);
- local sorted = {};
- for k, v in pairs (list) do
- table.insert(sorted, {k, v});
- end
- table.sort(sorted, function(a,b) return a[1] < b[1]; end);
- print"\n\tPachinko average rewards per ball";
- for _, item in ipairs (sorted) do
- local str = item[2] < 0.01 and string.format("1 / %.0f", 1 / item[2]) or string.format("%.3f", item[2]);
- print (string.format("\t%-10s %s", str, rewardNames[ item[1] ]));
- end
- print();
Advertisement
Add Comment
Please, Sign In to add comment