Module:Utils
Documentation for this module may be created at Module:Utils/doc
local p = {}
local category = mw.loadJsonData("Module:Category.json")
local data = mw.loadJsonData("Module:Data.json")
local objectID = mw.loadJsonData("Module:ObjectID.json")
local condition = mw.loadJsonData("Module:Condition.json")
function p.concat(t, separator)
local str = ""
separator = separator and separator or ", "
local length = -1 - #separator
if t ~= nil then
for k, v in ipairs(t) do
str = str .. v .. separator
end
str = str:sub(1, length)
end
return str
end
function p.split(inputstr, separator)
if separator == nil then
separator = "%s"
end
local t = {}
for str in string.gmatch(inputstr, "([^"..separator.."]+)") do
table.insert(t, str)
end
return t
end
function p.length(t)
local str = 0
if t ~= nil then
for k, v in pairs(t) do
str = str + 1
end
end
return str
end
function p.find(t, property, val)
if t ~= nil then
for k, v in pairs(t) do
if v[property] == val then
return t[k]
end
end
end
return nil
end
function p.merge(t1, t2)
local t = {}
if t1 == nil and t2 == nil then
return t
elseif t1 == nil then
return t2
elseif t2 == nil then
return t1
else
for k, v in ipairs(t1) do
table.insert(t, v)
end
for k, v in ipairs(t2) do
table.insert(t, v)
end
return t
end
end
function p.getCategory(name)
for k, v in pairs(category) do
for k2, v2 in pairs(v) do
for k3, v3 in pairs(v2) do
if v3 == name then
return {k, k2}
end
end
end
end
end
function p.getDamage(obj, level)
local str = ""
if obj.eq and obj.eq.dmg then
if level or obj.lv then
local currentLevel = level and level or obj.lv
local arrValue = currentLevel - obj.lv + 1
local type = (obj.eq.mag == 1 and 'magic' or 'physical') .. ' damage ' .. (obj.eq.rng == 1 and '(range)' or '(melee)')
str = p.damageRange(obj.eq.dmg[arrValue]) .. ' ' .. type
end
elseif obj.trap and obj.trap.dmg then
str = p.damageRange(obj.trap.dmg) .. ' damage'
elseif obj.pet and obj.pet.dmg then
local currentLevel = level and level or 1
local type = obj.pet.type == 0 and ' melee' or ' range'
str = p.damageRange(obj.pet.dmg[currentLevel]) .. type .. ' damage'
end
return str
end
function p.getEffects(obj, level)
local str = ""
local objLevel = obj.lv and obj.lv or 0
local currentLevel = level and level or objLevel
local arrValue = currentLevel ~= 0 and currentLevel - objLevel + 1 or 1
if obj.pet and obj.con then
if obj.pet.type == 2 then
str = '<span style="color:#7d725d">Buffs owner with:</span><br>'
end
return str .. p.concat(obj.con, '<br>')
end
if obj.eq and obj.eq.einv then
str = '+' .. obj.eq.einv .. ' inventory slots<br>'
end
if obj.eq and obj.eq.proj then
local name = objectID[obj.eq.proj]
local proObj = data[name]
if proObj then
if proObj.proj then
str = str .. (proObj.proj.pierc > 0 and 'Projectiles pierces through enemies<br>' or '')
str = str .. (proObj.proj.bounc > 0 and 'Projectiles bounce on impact<br>' or '')
end
if proObj.expl then
if proObj.expl.dmg then
str = str .. p.damageRange(proObj.expl.dmg[arrValue]) .. ' explosive damage<br>'
end
str = str .. (proObj.expl.mine and proObj.expl.mine[arrValue] .. ' mining damage<br>' or '')
end
end
end
if obj.expl then
if obj.expl.dmg then
str = str .. p.damageRange(obj.expl.dmg[arrValue]) .. ' explosive damage<br>'
end
str = str .. (obj.expl.mine and obj.expl.mine[arrValue] .. ' mining damage<br>' or '')
end
if obj.eq and obj.eq.con then
for k, v in ipairs(obj.eq.con) do
str = str .. p.getCondition(v.id, v.val[arrValue]) .. '<br>'
end
end
if obj.eq and obj.eq.sec then
if obj.eq.mdmg then
if obj.eq.use then
str = str .. '<span style="color:rgb(183 151 53)">Use: ' .. obj.eq.use .. '</span><br>'
end
str = str .. '<span style="color:rgb(183 151 53)">Secondary use: ' .. obj.eq.sec .. '</span><br>'
str = str .. '<span style="color:rgb(197 178 119)">' .. p.damageRange(obj.eq.minion[arrValue]) .. ' ' .. obj.eq.mdmg .. ' damage</span><br>'
if obj.eq.mcon then
for k, v in ipairs(obj.eq.mcon) do
str = str .. '<span style="color:rgb(197 178 119)">' .. p.getCondition(v.id, v.val[arrValue]) .. '</span><br>'
end
end
str = str .. '<span style="color:rgb(197 178 119)">Minion lifespan: 60 sec</span><br>'
else
str = str .. '<span style="color:rgb(183 151 53)">Secondary use: ' .. obj.eq.sec .. '</span><br>'
end
end
if obj.mech then
str = str .. '<span style="color:rgb(183 151 53)">Off-hand use: ' .. obj.mech .. '</span><br>'
end
if obj.use then
str = str .. obj.use ..'<br>'
end
if obj.consum then
local once = true
for k, v in ipairs(obj.consum) do
if not string.find(v, "(only once)") then
str = str .. (once and '<span style="color:#7d725d">When eaten:</span><br>' or '')
str = str .. v .. '<br>'
once = false
end
end
once = true
for k, v in ipairs(obj.consum) do
if string.find(v, "(only once)") then
str = str .. (once and '<span style="color:#7d725d">Permanent when eaten:</span><br>' or '')
str = str .. v .. '<br>'
once = false
end
end
end
if obj.trap and obj.trap.con then
for k, v in ipairs(obj.trap.con) do
str = str .. p.getCondition(v.id, v.val) .. '<br>'
end
end
str = str:sub(1, -5)
return str
end
function p.getSetEffects(obj, frame)
local str = ""
local set = ""
if obj.set then
for k, v in ipairs(obj.set.item) do
set = set .. frame:expandTemplate{title = 'Icon', args = {objectID[v]}} .. '<br>'
end
set = set:sub(1, -5)
str = str .. p.concat(obj.set.ef, '<br>') .. '<br>' .. set
end
return str
end
function p.damageRange(damage)
local range = math.floor(damage * 0.1)
return (damage - range) .. "-" .. (damage + range)
end
function p.getCondition(id, val)
local con = condition[id]
local permanent = ""
if con.showDecimal then
val = val / 10
end
if con.skipSign then
val = math.abs(val)
elseif val >= 0 then
val = '+' .. val
end
if con.isPermanent and not con.isAdditiveWithSelf then
permanent = " (only once)"
end
return string.gsub(con.condition, "{0}", val) .. permanent
end
return p