Module:SkillBox

From the MapleStory Wiki, a knowledge base about everything MapleStory
Jump to navigation Jump to search


Template Documentation

Description

Template to make a table showing essential information and effects of a skill.

Usage

{{#invoke:SkillBox|create|parameter1|parameter2|parameter3
Valid parameters:

id                                  The ID of this skill. If filled in, the Show/Hide all levels button will be made available.
                                     Should only be used for 5th and 6th job skills, otherwise add the id as a comment above the skillbook, i.e. <!--id-->
skillName                           Skill icon and name. If the skill has a separate page detailing its effects at all levels, link to that.
skillType                           Active or Passive
reqLv                               Add the skill's Level Requirement
                                     Leave blank if not applicable.
masterLevel                         Maximum Level of the skill
combatOrders                        Whether this skill is affected by Combat Orders.
vSkill                              Whether it is a V Skill. If so, it will display 5 extra levels.
description                         Skill's description
formula                             Formula used by skill. Should be same formula as what is used in the detailed page. Will display values of Level 1 and
                                    masterLevel
                                     Note, if adding a negative value, the expression must be converted to its negative equivalent.
                                     Example: -{#expr:30+x} -> {#expr:-30-x}
                                    This is due to HTML parsing misinterpreting the prefixed dash.


Example

{{#invoke:SkillBox|create <!--172121000-->
|id=172121000
|skillName=[[File:Skill Strike (4th Job).png]] [[Strike#4th Job|Strike]]
|skillType=Active
|reqLv=
|masterLevel=30
|vSkill=
|combatOrders=1
|description=Pan swings his paws forward to deal damage.<br />Required Skill: <span class="darkorange-text">Strike (3rd Job) Lv. 20</span>
|formula=MP Cost: {#expr:35+floor(x/6)}, Max Enemies Hit: 7, Damage: {#expr:225+3*x}%, Number of Attacks: 6
}}

Output:

Show/hide all levels
Active Strike
Master Level 30
Description Pan swings his paws forward to deal damage.
Required Skill: Strike (3rd Job) Lv. 20
Level 1 MP Cost: 35, Max Enemies Hit: 7, Damage: 228%, Number of Attacks: 6
30 MP Cost: 40, Max Enemies Hit: 7, Damage: 315%, Number of Attacks: 6
31 MP Cost: 40, Max Enemies Hit: 7, Damage: 318%, Number of Attacks: 6
32 MP Cost: 40, Max Enemies Hit: 7, Damage: 321%, Number of Attacks: 6
Active Strike
Master Level 30
Description Pan swings his paws forward to deal damage.
Required Skill: Strike (3rd Job) Lv. 20
Level 1 MP Cost: 35, Max Enemies Hit: 7, Damage: 228%, Number of Attacks: 6
2 MP Cost: 35, Max Enemies Hit: 7, Damage: 231%, Number of Attacks: 6
3 MP Cost: 35, Max Enemies Hit: 7, Damage: 234%, Number of Attacks: 6
4 MP Cost: 35, Max Enemies Hit: 7, Damage: 237%, Number of Attacks: 6
5 MP Cost: 35, Max Enemies Hit: 7, Damage: 240%, Number of Attacks: 6
6 MP Cost: 36, Max Enemies Hit: 7, Damage: 243%, Number of Attacks: 6
7 MP Cost: 36, Max Enemies Hit: 7, Damage: 246%, Number of Attacks: 6
8 MP Cost: 36, Max Enemies Hit: 7, Damage: 249%, Number of Attacks: 6
9 MP Cost: 36, Max Enemies Hit: 7, Damage: 252%, Number of Attacks: 6
10 MP Cost: 36, Max Enemies Hit: 7, Damage: 255%, Number of Attacks: 6
11 MP Cost: 36, Max Enemies Hit: 7, Damage: 258%, Number of Attacks: 6
12 MP Cost: 37, Max Enemies Hit: 7, Damage: 261%, Number of Attacks: 6
13 MP Cost: 37, Max Enemies Hit: 7, Damage: 264%, Number of Attacks: 6
14 MP Cost: 37, Max Enemies Hit: 7, Damage: 267%, Number of Attacks: 6
15 MP Cost: 37, Max Enemies Hit: 7, Damage: 270%, Number of Attacks: 6
16 MP Cost: 37, Max Enemies Hit: 7, Damage: 273%, Number of Attacks: 6
17 MP Cost: 37, Max Enemies Hit: 7, Damage: 276%, Number of Attacks: 6
18 MP Cost: 38, Max Enemies Hit: 7, Damage: 279%, Number of Attacks: 6
19 MP Cost: 38, Max Enemies Hit: 7, Damage: 282%, Number of Attacks: 6
20 MP Cost: 38, Max Enemies Hit: 7, Damage: 285%, Number of Attacks: 6
21 MP Cost: 38, Max Enemies Hit: 7, Damage: 288%, Number of Attacks: 6
22 MP Cost: 38, Max Enemies Hit: 7, Damage: 291%, Number of Attacks: 6
23 MP Cost: 38, Max Enemies Hit: 7, Damage: 294%, Number of Attacks: 6
24 MP Cost: 39, Max Enemies Hit: 7, Damage: 297%, Number of Attacks: 6
25 MP Cost: 39, Max Enemies Hit: 7, Damage: 300%, Number of Attacks: 6
26 MP Cost: 39, Max Enemies Hit: 7, Damage: 303%, Number of Attacks: 6
27 MP Cost: 39, Max Enemies Hit: 7, Damage: 306%, Number of Attacks: 6
28 MP Cost: 39, Max Enemies Hit: 7, Damage: 309%, Number of Attacks: 6
29 MP Cost: 39, Max Enemies Hit: 7, Damage: 312%, Number of Attacks: 6
30 MP Cost: 40, Max Enemies Hit: 7, Damage: 315%, Number of Attacks: 6
31 MP Cost: 40, Max Enemies Hit: 7, Damage: 318%, Number of Attacks: 6
32 MP Cost: 40, Max Enemies Hit: 7, Damage: 321%, Number of Attacks: 6

-- <nowiki>
-- Module:SkillBox
-- A module for showing max level effects of skills
-- HT

local SkillBox = {}
local getArgs = require('Module:Arguments').getArgs


function SkillBox.createTable(args)
	local frame = mw.getCurrentFrame()
	local ret = {}
	local skillId = tonumber(args['id']) or 0                -- Skill ID
    local skillName = tostring(args['skillName'])            -- Name of skill
    local skillType = tostring(args['skillType'])            -- Active or Passive
	local reqLv = tostring(args['reqLv'] or 0)               -- Required level
	local masterLevel = tonumber(args['masterLevel'])        -- Master Level
	local combatOrders = tonumber(args['combatOrders']) or 0 -- Affected by Combat Orders?
	local vSkill = tonumber(args['vSkill']) or 0             -- Is V skill?
    local description = tostring(args['description'])        -- Skill description
    local formula = tostring(args['formula'] or '')          -- Formula
    
    local tableExpandable = skillId > 0 and masterLevel > 2
    
    if tableExpandable then
    	ret[#ret + 1] = '<div width="100%" style="max-width:1280px">' ..
				'<span class="mw-customtoggle-tblF' .. skillId ..
				' mw-customtoggle-tblS' .. skillId ..
				' wds-button" style="border:solid grey 2px;border-radius:6px;padding:5px;float:right;">' ..
				'Show/hide all levels</span></div>\n'
	end
    ret[#ret + 1] = SkillBox.createTableHeader(skillType, skillName, reqLv, description, masterLevel, skillId, tableExpandable, true, vSkill, combatOrders)
    ret[#ret + 1] = SkillBox.createRow(formula, masterLevel, tableExpandable, true, vSkill, combatOrders)
    if tableExpandable then
    	ret[#ret + 1] = SkillBox.createTableHeader(skillType, skillName, reqLv, description, masterLevel, skillId, tableExpandable, false, vSkill, combatOrders)
    	ret[#ret + 1] = SkillBox.createRow(formula, masterLevel, tableExpandable, false, vSkill, combatOrders)
    end
    return table.concat(ret)
end


function SkillBox.createTableHeader(skillType, skillName, reqLv, description, masterLevel, skillId, tableExpandable, isFirstTable, vSkill, combatOrders)
	local ret = {}
	ret[#ret + 1] = '{|class="wikitable'
	if tableExpandable then
		if isFirstTable then
			ret[#ret + 1] = ' mw-collapsible" id="mw-customcollapsible-tblF' .. skillId .. '"'
		else
			ret[#ret + 1] = ' mw-collapsible mw-collapsed" id="mw-customcollapsible-tblS' .. skillId .. '"'
		end
	else
		ret[#ret + 1] = '"'
	end
	ret[#ret + 1] = ' width="100%" style="text-align:left;max-width:1280px;"\n' ..
		'|-\n' ..
		'!style="font-size:12px"|' .. skillType ..
		'\n!colspan="2" width="20%"|' .. skillName
	if reqLv ~= '0' and reqLv ~= '' then
		ret[#ret + 1] =
			'\n|-\n' ..
			'!colspan="2" width="20%"|Level Requirement\n' ..
			'|width="80%"|' .. reqLv
	end
	ret[#ret + 1] = 
		'\n|-\n' ..
		'!colspan="2" width="20%"|Master Level\n' ..
		'|' .. masterLevel .. '\n' ..
		'|-\n' ..
		'!colspan="2" width="20%"|Description\n' ..
		'|width="80%"|' .. description
	ret[#ret + 1] = '\n|-\n'
	if masterLevel == 1 then
		ret[#ret + 1] = '!width="10%"|Level\n'
	else
		if tableExpandable then
			if isFirstTable then
				ret[#ret + 1] = '!rowspan="' .. (2 + vSkill + combatOrders * 2) .. '" width="10%"|Level\n'
			else
				ret[#ret + 1] = '!rowspan="' .. (masterLevel + vSkill * 5 + combatOrders * 2) .. '" width="10%"|Level\n'
			end
		else
			ret[#ret + 1] = '!rowspan="' .. (2 + vSkill + combatOrders * 2) .. '" width="10%"|Level\n'
		end
	end
    return table.concat(ret)
end


function SkillBox.createRow(formula, masterLevel, tableExpandable, isFirstTable, vSkill, combatOrders)
	local frame = mw.getCurrentFrame()
    local ret = {}
    local levelList = {}
    if isFirstTable then
	    if masterLevel ~= 1 then
	    	if vSkill > 0 then
	    		levelList = {1, masterLevel, masterLevel + 5}
	    	else
	    		if combatOrders > 0 then
	    			levelList = {1, masterLevel, masterLevel + 1, masterLevel + 2}
	    		else
	    			levelList = {1, masterLevel}
	    		end
	    	end
		else
			if combatOrders > 0 then
				levelList = {1, 2, 3}
			else
				levelList = {1}
			end
	    end
	else
		for i = 1, (masterLevel + vSkill * 5 + combatOrders * 2) do
			levelList[i] = i
		end
	end
    for _, i in ipairs(levelList) do
		local parsedFormula = formula:gsub(
			"{#expr:(.-)}",
			function(expr)
				return "{{#expr:" .. expr:gsub("x", i) .. "}}"
			end
		)
		local hasLogarithm = (parsedFormula:find("log") ~= 'nil')
		if hasLogarithm then
			-- log, one or more 0-9 chars, open parenthesis, one or more 0-9 chars, close parenthesis
			parsedFormula = parsedFormula:gsub(
				"log[%d]+%([%d]+%)",
				function(logarithmString)
					local baseIndex, _  = logarithmString:find("log") + 3
					local openParenthesisIndex = logarithmString:find("%(")
					local closeParenthesisIndex = logarithmString:find("%)")
					local base = tonumber(logarithmString:sub(baseIndex, openParenthesisIndex - 1))
					local xVal = tonumber(logarithmString:sub(openParenthesisIndex + 1, closeParenthesisIndex - 1))
					return tostring(math.floor(math.log10(xVal) / math.log10(base)))
				end
			)
		end
		if combatOrders > 0 and i > masterLevel then
			if i == masterLevel + 1 then
				ret[#ret + 1] = '!width="10%"|[[File:Skill Combat Orders.png|24px|link=Decent Combat Orders]] ' .. tostring(i) .. '\n|'
			else
				ret[#ret + 1] = '!width="10%"|[[File:Skill Combat Orders.png|24px|link=Combat Orders]] ' .. tostring(i) .. '\n|'
			end
		else
			ret[#ret + 1] = '!width="10%"|' .. tostring(i) .. '\n|'
		end
		ret[#ret + 1] = frame:preprocess(parsedFormula)
		if i ~= (masterLevel + vSkill * 5 + combatOrders * 2) then
			ret[#ret + 1] = '\n|-\n'
		end
	end
	ret[#ret + 1] = '\n|}\n'
    return table.concat(ret)
end

function SkillBox.create(frame)
    local args = getArgs(frame)
    return SkillBox.createTable(args)
end

function SkillBox.main(frame)
	local args = frame:getParent().args
    return SkillBox.createTable(args)
end

return SkillBox
-- </nowiki>