matheod

Patchinko separate

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