matheod

Untitled

May 30th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.94 KB | None | 0 0
  1. local pinStart = {2,3,4,5,8,11,14};
  2. local startNames = {"Launch 1", "Launch 2", "Launch 3", "Bronze Portal", "Silver Portal", "Gold Portal", "Purple Portal"};
  3.  
  4. local rewardTiers = {1,1,1,2,2,2,2,3,3,3,4,4,4,5,5,6,6,7};
  5. local tierNames = {"Lame", "Bronze", "Silver", "Gold", "Elite", "Divine", "Jackpot"};
  6.  
  7. local rewardNames = {
  8.     ap="AP Coupon", balls="Pachinko Balls", crusade="Crusade Misc", bp="BP Coupon", gold="Gold", kills="Kills",
  9.     crystal="Crystals", event="Eggs", gem="Gems", jackpot="Jackpot (2000 gems, Ball Cascade)", raid="Raid Ticket", asylum="Asylum Key",
  10.     card1="Star Card (grey)", card2="Star Card (green)", card3="Star Card (blue)", card4="Star Card (purple)", card5="Star Card (orange)",
  11.     crusade1="Safety Charm", crusade2="Lucky Donut", crusade3="Crystal Genesis", crusade4="Chaotic Mutator", crusade5="Benign Mutator",
  12.     candy1="2h Candy", candy2="4h Candy", candy3="8h Candy", candy4="24h Candy", candy5="72h Candy",
  13. };
  14.  
  15. local rewards = {
  16.     launch = {rng=100, {60, portal=1}, {83, portal=2}, {portal=3}},
  17.     cascade = {rng=100, {90, portal=4}, {98, portal=5}, {portal=6}},
  18.     crusade = {rng=100, {10, crusade1=1}, {30, crusade2=1}, {50, crusade3=1}, {75, crusade4=1}, {crusade5=1}},
  19.  
  20.     {event=1, rng=100, {30, gold=1}, {56, kills=1}, {66, card1=1}, {67, raid=1}, {portal=4}},                                                       -- tier 1
  21.     {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
  22.     {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
  23.     {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
  24.     {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
  25.     {event=200, rng=100, {24, gem=250}, {32, candy5=1}, {72, balls=75}, {95, asylum=30}, {crystal=1}},                                              -- tier 6
  26.     {event=1000, rng=100, {jackpot=1, gem=2000, cascade=200}},                                                                                      -- tier 7
  27.    
  28.     -- {event=1, rng=100, {18, gem=1}, {45, gold=1}, {56, kills=1}, {66, card1=1}, {68, raid=1}, {portal=4}},
  29.     -- {event=3, rng=100, {20, gem=2}, {38, card2=1}, {39, candy1=1}, {61, kills=1}, {63, raid=1}, {70, card1=3}, {portal=5}},
  30.     -- {event=5, rng=100, {17, gem=10}, {37, card3=1}, {38, candy2=1}, {40, crusade=1}, {55, balls=5}, {67, card1=5}, {portal=6}},
  31.     -- {event=15, rng=100, {25, gem=20}, {33, card4=1}, {34, candy3=1}, {37, ap=1}, {55, balls=10}, {67, card1=10}, {portal=7}},
  32.     -- {event=50, rng=100, {26, gem=100}, {40, card5=1}, {44, candy4=1}, {50, crusade=3}, {62, card1=25}, {69, bp=1}, {balls=20}},
  33.     -- {event=200, rng=100, {26, gem=300}, {44, candy5=1}, {89, balls=50}, {crystal=1}},
  34.     -- {event=1000, rng=100, {gem=2000, jackpot=1, cascade=200}}, -- cascade = 200
  35. };
  36.  
  37. -- the goal of this first loop is to convert numbered probability
  38. -- (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)
  39. -- into decimal probability (between 0 and 1)
  40.  
  41. for k2, tier in pairs (rewards) do -- tier = launch or cascade or crusade or unnamed tiers ranging from 1 to 7
  42.     tier.event = tier.event or 0;   -- set event value to 0 when it's not defined (named tiers)
  43.    
  44.     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}
  45.         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)
  46.     end -- a or b + 1 is the same as a or (b+1)
  47.     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
  48.         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]
  49.     end
  50. end
  51.  
  52. local rightChance = 7 / (6 + 7); -- ball have a little more chance to go the the right
  53. local bounces = 9;
  54.  
  55. local function factorial(n)
  56.     local ret = 1;
  57.     for i = 1, n do
  58.         ret = ret * i;
  59.     end
  60.     return ret;
  61. end
  62.  
  63. local goals = {};
  64. for _, start in ipairs (pinStart) do
  65.     goals[start] = {};
  66.     for i = 0, bounces do
  67.         local odds = (factorial(bounces) / (factorial(i) * factorial(bounces-i))) * rightChance^i * (1-rightChance)^(bounces-i);
  68.        
  69.         local goal = math.max(1, math.floor(start - 4.5) + i);
  70.         local tier = rewardTiers[goal];
  71.         goals[start][tier] = (goals[start][tier] or 0) + odds;
  72.     end
  73. end
  74.  
  75. function eval_rewards(rewardList, list, mult, level)
  76.     if (level == 12 or mult == 0) then return; end
  77.    
  78.     list = list or setmetatable({}, {__index = function() return 0; end});
  79.     mult = mult or 1;
  80.     level = level or 1;
  81.    
  82.     list.event = list.event + rewardList.event * mult;
  83.     for _, reward in ipairs (rewardList) do
  84.         for item, amount in pairs (reward) do
  85.             if (item ~= 1) then
  86.                 if (rewards[item]) then
  87.                     eval_rewards(rewards[item], list, amount * reward[1] * mult, level + 1);
  88.                 elseif (item == "portal") then
  89.                     eval_pin(pinStart[amount], list, reward[1] * mult, level + 1);
  90.                 else
  91.                     list[item] = list[item] + amount * reward[1] * mult;
  92.                 end
  93.             end
  94.         end
  95.     end
  96.    
  97.     return list;
  98. end
  99.  
  100. function eval_pin(pin, list, mult, level)
  101.     for tier, chance in pairs (goals[pin]) do
  102.         eval_rewards(rewards[tier], list, chance * mult, level);
  103.     end
  104. end
  105.  
  106. local list = eval_rewards(rewards.launch);
  107.  
  108. local sorted = {};
  109. for k, v in pairs (list) do
  110.     table.insert(sorted, {k, v});
  111. end
  112. table.sort(sorted, function(a,b) return a[1] < b[1]; end);
  113.  
  114. print"\n\tPachinko average rewards per ball";
  115. for _, item in ipairs (sorted) do
  116.     local str = item[2] < 0.01 and string.format("1 / %.0f", 1 / item[2]) or string.format("%.3f", item[2]);
  117.     print (string.format("\t%-10s %s", str, rewardNames[ item[1] ]));
  118. end
  119. print();
Advertisement
Add Comment
Please, Sign In to add comment