Module:CosmeticMachine: Difference between revisions
From MCC Island Wiki
More actions
m the 'Pull Chance' is kinda repetitive |
Noxcrew lied about the Cosmetic Machine having 400+ unique cosmetics 🥺 |
||
Line 20: | Line 20: | ||
local p = {} | local p = {} | ||
function p.getTotalUniqueCosmetics() | |||
local unique = {} | |||
for _, pullData in pairs(machineData) do | |||
for _, name in ipairs(pullData.cosmetics) do | |||
unique[name] = true | |||
end | |||
end | |||
local count = 0 | |||
for _ in pairs(unique) do | |||
count = count + 1 | |||
end | |||
return count | |||
end | |||
function p.getNoOfCosmeticsInPull(frame) | |||
local args = getArgs(frame) | |||
local cosmetics = machineData[args.pullType .. " Pull"].cosmetics | |||
local count = 0 | |||
for _ in pairs(cosmetics) do | |||
count = count + 1 | |||
end | |||
return count | |||
end | |||
function p.getPullChance(frame) | function p.getPullChance(frame) |
Revision as of 10:18, 17 July 2025
Documentation for this module may be created at Module:CosmeticMachine/doc
local getArgs = require('Module:Arguments').getArgs
local getRarity = function(name)
return require('Module:CosmeticInfo').getRarity({name=name})
end
local getType = function(name)
return require('Module:CosmeticInfo').getType({name=name})
end
local machineData = mw.loadData('Module:CosmeticMachine/Data')
local function round(n)
local frac = math.abs(n) % 1
if frac == 0 then return n end
local zeros = tostring(frac):match("%.(0*)") or ""
local places = #zeros + 2
local factor = 10 ^ places
local sign = n < 0 and -1 or 1
return math.floor(n * factor + 0.5) / factor
end
local p = {}
function p.getTotalUniqueCosmetics()
local unique = {}
for _, pullData in pairs(machineData) do
for _, name in ipairs(pullData.cosmetics) do
unique[name] = true
end
end
local count = 0
for _ in pairs(unique) do
count = count + 1
end
return count
end
function p.getNoOfCosmeticsInPull(frame)
local args = getArgs(frame)
local cosmetics = machineData[args.pullType .. " Pull"].cosmetics
local count = 0
for _ in pairs(cosmetics) do
count = count + 1
end
return count
end
function p.getPullChance(frame)
local args = getArgs(frame)
local cosmeticName = args.cosmeticName
local pullType = args.pullType .. " Pull"
local rarity = getRarity(cosmeticName)
local cType = getType(cosmeticName) or "Standard"
local pullData = machineData[pullType]
if not pullData then return 0 end
local baseRarityChance = (pullData.rarityChances[rarity]) / 100
local function countEligible(filterFunc)
local count = 0
for _, name in ipairs(pullData.cosmetics) do
if getRarity(name) == rarity and filterFunc(name) then
count = count + 1
end
end
return count
end
local chanceShare
if cType == "Exclusive" then
local exChance = pullData.exclusiveChance and (pullData.exclusiveChance[rarity] or pullData.exclusiveChance["All"] or 0)
local exclusiveCount = countEligible(function(name)
return getRarity(name) == rarity and getType(name) == cType
end)
if exclusiveCount == 0 then return 0 end
chanceShare = (baseRarityChance * (exChance / 100)) / exclusiveCount
elseif cType == "Arcane" and rarity == "Mythic" then
local arcChance = pullData.arcaneChance and pullData.arcaneChance["Mythic"] or 0
local arcaneCount = countEligible(function(name)
return getRarity(name) == "Mythic" and getType(name) == "Arcane"
end)
if arcaneCount == 0 then return 0 end
chanceShare = (baseRarityChance * (arcChance / 100)) / arcaneCount
else
local exclusiveCut = pullData.exclusiveChance and (pullData.exclusiveChance[rarity] or pullData.exclusiveChance["All"] or 0)
local arcaneCut = (rarity == "Mythic" and pullData.arcaneChance and pullData.arcaneChance["Mythic"]) or 0
local remainingChance = baseRarityChance * (1 - (exclusiveCut + arcaneCut) / 100)
local standardCount = countEligible(function(name)
return getRarity(name) == rarity and not getType(name)
end)
if standardCount == 0 then return 0 end
chanceShare = remainingChance / standardCount
end
return round(chanceShare * 100) .. "%"
end
function p.displayPullCosmetics(frame)
local args = getArgs(frame)
local pullType = args.pullType
local pullData = machineData[pullType .. " Pull"]
if not pullData then return 'No data found for pull type: ' .. pullType end
local out = {'<div class="tradeable-display">'}
local count = 0
for _, name in ipairs(pullData["cosmetics"]) do
local chance = p.getPullChance({cosmeticName = name, pullType = pullType})
local filename = name .. '.png'
local cell = string.format(
'<div><center><div class="afix" style="width: 100px">[[File:%s|link=%s]]</div></center><div style="word-wrap:break-word; text-align:center"><small>[[%s]]</small><br /><b>%s</b></div></div>',
filename, name, name, chance)
table.insert(out, cell)
count = count + 1
end
table.insert(out, '</div>')
return table.concat(out, '\n')
end
return p