Module:Skills

From Coromon Wiki
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