Module:Skills
Jump to navigation
Jump to search
Documentation for this module may be created at Module:Skills/doc
local p = { }
local util = require("Module:Util")
local skills = mw.loadData("Module:Skills/List")
local orderedSkills = util.spairs(skills, function(t,a,b) return t[a].name < t[b].name end)
local errorMsg = "'''Invalid Skill Name. Refer to [[Module:Skills]] for help.'''"
function p.isValid (frame)
local skill = p.getSkill(frame)
return skill ~= nil and "true" or "false"
end
function p.validFlashSkill (mon, s)
local skill = getSkill(s)
local hasType = sharesType(mon["type"], skill.typeRequirements)
local hasProperty = sharesProperty(mon.skillProperties, skill.propertyRequirements)
local familyAllowed = true
for _, family in ipairs(skill.restrictedFamilies) do
if family == mon["familyName"] then
familyAllowed = false
break
end
end
return hasType and hasProperty and familyAllowed
end
function sharesType (monType, requirements)
if tablelength(requirements) > 0 then
for _, t in pairs(requirements) do
if string.lower(monType) == string.lower(t) then
return true
end
end
return false
end
return true
end
function sharesProperty (properties, requirements)
if tablelength(requirements) > 0 then
for _, required in pairs(requirements) do
for _, property in pairs(properties) do
if required == property then
return true
end
end
end
return false
end
return true
end
function tablelength(T)
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
end
function getSkill (skill)
for k, v in pairs(skills) do
if v["name"] == skill or k == skill then
return v
end
end
end
function p.getSkill (frame)
local skill = frame.args[1] or frame.args["skill"]
for k, v in pairs(skills) do
if v["name"] == skill or k == skill then
return v
end
end
end
function p.getSkillID (frame)
local skill = frame.args[1] or frame.args["skill"]
for k, v in pairs(skills) do
if v["name"] == skill or k == skill then
return k
end
end
end
function p.getSkillParamOrDefault (frame, param, valueIfNil)
local skill = p.getSkill(frame)
if skill == nil then
return errorMsg
end
return skill[param] or valueIfNil
end
function p.getName (frame)
return p.getSkillParamOrDefault(frame, "name", "???")
end
function p.getSP (frame)
return p.getSkillParamOrDefault(frame, "sp", 0)
end
function p.getType (frame)
return p.getSkillParamOrDefault(frame, "type", "N/A")
end
function p.getPower (frame)
return p.getSkillParamOrDefault(frame, "power", "-")
end
function p.getAccuracy (frame)
return p.getSkillParamOrDefault(frame, "accuracy", "-")
end
function p.getDescription (frame)
return p.getSkillParamOrDefault(frame, "desc", "N/A")
end
function p.getCategory (frame)
return p.getSkillParamOrDefault(frame, "category", "N/A")
end
function p.getPriority (frame)
return p.getSkillParamOrDefault(frame, "priority", "Normal")
end
function p.getContact (frame)
local skill = p.getSkill(frame)
local yesNo = frame.args[2] or frame.args["yesNo"]
if skill == nil then
return errorMsg
end
local result = skill["contact"] or (skill["contact"] == nil and skill["category"]=="Physical")
if yesNo then
result = result and "yes" or "no"
end
return result
end
function p.getTarget (frame)
return p.getSkillParamOrDefault(frame, "target", "N/A")
end
function p.getStrikes (frame)
local skill = p.getSkill(frame)
if skill == nil then
return errorMsg
end
if skill.strikes ~= nil then
return p.calculateStrikes(skill.strikes)
end
return skill.getStrikes or 1
end
function p.getStrikeOdds (frame)
local skill = p.getSkill(frame)
if skill == nil then
return errorMsg
end
if skill.strikes ~= nil then
if lengthOf(skill.strikes) > 1 then
local output = ""
for i = 1, lengthOf(skill.strikes), 1 do
output = output .. "*" .. skill.strikes[i][1] .. " (" .. skill.strikes[i][2] .. "%)"
if i < lengthOf(skill.strikes) then
output = output .. "\n"
end
end
return output
end
end
return ""
end
function p.calculateStrikes (strikes)
if lengthOf(strikes) == 1 then
return strikes[1][1]
end
local min = 99
local max = -1
for i = 1, lengthOf(strikes), 1 do
local v = strikes[i][1]
if v < min then
min = v
end
if v > max then
max = v
end
end
return min .. "-" .. max
end
function lengthOf (t)
local count = 0
for k,v in pairs(t) do count = count + 1 end
return count
end
function p.getAllSkillsOfType (f)
local t = f.args[1] or f.args["type"]
local wikitext = '{{SkillList|Start|type=false}}\n'
for k, v in orderedSkills do
if v["type"] == t then
wikitext = wikitext .. '{{SkillList|'.. v.name ..'|type=false}}\n'
end
end
wikitext = wikitext .. '{{SkillList|End}}'
return f:preprocess(wikitext)
end
function p.getAllSkills (f)
local wikitext = {'{{SkillList|Start}}\n'}
for k, v in orderedSkills do
local type = v.type or "N/A"
local sp = v.sp or 0
local power = v.power or "-"
local acc = v.accuracy or "-"
local category = v.category or "N/A"
local target = v.target or "N/A"
local contact = v["contact"] or (v["contact"] == nil and v["category"]=="Physical")
contact = contact and "yes" or "no"
table.insert(wikitext, '{{SkillList/export|allskills|name='.. v.name ..'|id='.. k ..'|type='.. type ..'|sp='.. sp ..'|power='.. power ..'|acc='.. acc ..'|category='.. category ..'|contact='.. contact ..'|target='.. target ..'}}\n')
end
table.insert(wikitext, '{{SkillList|End}}')
return f:preprocess(table.concat(wikitext))
end
return p