|
|
Line 1: |
Line 1: |
| require('Module:CommonFunctions')
| |
| local getArgs = require('Module:Arguments').getArgs
| |
| local p = {} | | local p = {} |
|
| |
|
| -- Main process
| | function p.Patch(frame) |
| function p.main(frame) | | local origTemplate = frame.args.orig |
| local args = getArgs(frame);
| | local newArgs = {} |
| local is_rose = args[1] == 'Rose' and args.ecp == 'true';
| | for k, v in pairs(frame.args) do |
| | | if k ~= "orig" then |
| -- Argument init
| | newArgs[k] = v |
| local traits = args[3] or args.traits
| |
| if (traits == nil) then
| |
| traits = '-, -'
| |
| end
| |
| traits = split(traits);
| |
| for k, v in ipairs(traits) do
| |
| traits[k] = trim(v)
| |
| end
| |
| local skill = args[2] or args.skill
| |
| local default_multiplier = 100
| |
| | |
| -- Dictionary for headers
| |
| local prop = { 'MP Usage', 'Cooldown', 'Duration', 'MP Recovery', 'Max Hits' }
| |
| if is_rose then
| |
| for k, v in ipairs(prop) do
| |
| prop[k] = v:gsub('MP', 'ECP')
| |
| end
| |
| end
| |
| | |
| local prop_short = { 'mp', 'cd', 'duration', 'mp_recovery', 'hits', 'chance' }
| |
| | |
| local STR = {
| |
| LIGHT = 'Light',
| |
| CRITICAL = 'Critical',
| |
| REVERSED = 'Reversed',
| |
| HEAVY = 'Heavy',
| |
| HASTE = 'Haste',
| |
| REGEN1 = 'Regenerating (1)',
| |
| REGEN2 = 'Regenerating (2)',
| |
| KB1 = 'Killing Blow (1)',
| |
| KB2 = 'Killing Blow (2)',
| |
| RUTHLESS = 'Ruthless',
| |
| POWERFUL = 'Powerful',
| |
| USEFUL = 'Useful',
| |
| SEC = ' Seconds',
| |
| MP = ' MP',
| |
| ECP = ' ECP'
| |
| }
| |
| | |
| local details = {
| |
| { STR.LIGHT, STR.CRITICAL, STR.REVERSED },
| |
| { STR.HEAVY, STR.HASTE, STR.REGEN2, STR.RUTHLESS, STR.POWERFUL, STR.REVERSED },
| |
| { STR.KB1 },
| |
| { STR.REGEN1 },
| |
| { STR.USEFUL }
| |
| }
| |
| | |
| -- Default values
| |
| local DEFAULT = {
| |
| [STR.HEAVY] = {
| |
| cd = 120
| |
| },
| |
| [STR.LIGHT] = {
| |
| mp = 80
| |
| },
| |
| [STR.CRITICAL] = {
| |
| mp = 120
| |
| },
| |
| [STR.HASTE] = {
| |
| cd = 80
| |
| },
| |
| [STR.RUTHLESS] = {
| |
| cd = 200
| |
| },
| |
| [STR.POWERFUL] = {
| |
| cd = 150
| |
| },
| |
| [STR.REGEN1] = {
| |
| chance = 50,
| |
| mp = 50
| |
| },
| |
| [STR.REGEN2] = {
| |
| chance = 50,
| |
| cd = 50
| |
| },
| |
| [STR.REVERSED] = {
| |
| mp = 60,
| |
| cd = 150
| |
| },
| |
| [STR.USEFUL] = {
| |
| dmg = 80
| |
| }
| |
| }
| |
| | |
| local function color(char)
| |
| char = char or args[1] or args.char or 'Elsword'
| |
| return char:gsub('/', '')
| |
| end | | end |
| | end |
|
| |
|
| local buffs = args.buffs and split(args.buffs)
| | local origTemplateExpanded = frame:expandTemplate{ title = origTemplate, args = newArgs } |
| | |
| local trait_table = mw.html.create('div'):attr('class', 'content-table'):tag('table'):attr({
| |
| cellpadding = '5',
| |
| border = '1',
| |
| class = 'colortable-' .. color()
| |
| }):css({
| |
| ['border-collapse'] = 'collapse',
| |
| ['text-align'] = 'center'
| |
| })
| |
| | |
| function new_row()
| |
| return trait_table:tag('tr')
| |
| end
| |
| | |
| -- headers
| |
| local tr1 = new_row()
| |
| local tr2 = new_row()
| |
| local tr3 = new_row()
| |
| | |
| local has_pvp_values = false
| |
| for k, v in pairs(args) do
| |
| if string.find(k, '_pvp') then
| |
| has_pvp_values = true
| |
| break
| |
| end
| |
| end
| |
| | |
| local tr4
| |
| -- If pvp values exist, we need the row to place them.
| |
| if has_pvp_values and not tr4 then
| |
| tr4 = new_row()
| |
| -- Add indicator headers
| |
| tr1:tag('th'):wikitext('Mode'):attr('rowspan', 2)
| |
| tr3:tag('td'):wikitext(frame:expandTemplate {
| |
| title = 'PvE'
| |
| })
| |
| tr4:tag('td'):wikitext(frame:expandTemplate {
| |
| title = 'PvP'
| |
| })
| |
| end
| |
| | |
| -- Loop through 2 input traits.
| |
| for trait_count, trait_name in ipairs(traits) do
| |
| local th = tr1:tag('th'):wikitext(trait_name:gsub('Persistent2', 'Persistent') .. ' ' .. skill);
| |
| local th_effect;
| |
| local th_skilltext;
| |
| local default_value = DEFAULT[trait_name] or {};
| |
| | |
| -- Check if detail fields are required and which.
| |
| for detail_key, detail in ipairs(details) do
| |
| if not th_effect then
| |
| th_effect = tr2:tag('th'):wikitext('Attribute Effect');
| |
| end
| |
| if indexOf(trait_name, detail) then
| |
| local th_detail = tr2:tag('th'):wikitext(prop[detail_key]);
| |
| th:attr('colspan', tonumber(th:getAttr('colspan') or 1) + 1)
| |
| if prop[detail_key] == 'Duration' then
| |
| if (trait_name == STR.KB1 or trait_name == STR.KB2) and args.buffs then
| |
| for _, buff in ipairs(buffs) do
| |
| if trait_name == STR.KB1 then
| |
| th_detail:attr('colspan', (th_detail:getAttr('colspan') or 0) + 1)
| |
| tr2:tag('th'):wikitext(buff)
| |
| else
| |
| tr2:tag('th'):wikitext(buff)
| |
| end
| |
|
| |
| th:attr('colspan', (th:getAttr('colspan') or 1) + 1)
| |
| end
| |
| end
| |
| end
| |
| end
| |
| end
| |
| | |
|
| |
| | |
| -- Unnamed argument.
| |
| local unnamed = split(args[3 + trait_count]);
| |
| local MP_ARG = args['mp' .. trait_count] or args['mp_recovery' .. trait_count] or default_value['mp_recovery'] or
| |
| default_value['mp'];
| |
| local ECP_ARG = nil
| |
| | |
| if is_rose then
| |
| unnamed[2] = unnamed[1] or args['mp' .. trait_count]
| |
| ECP_ARG = unnamed[1] or args['mp' .. trait_count]
| |
| MP_ARG = nil
| |
| end
| |
| | |
| -- Append contents.
| |
| for detail_key, detail in ipairs(details) do
| |
| if not th_skilltext then
| |
| th_skilltext = tr3:tag('td'):attr('rowspan', has_pvp_values and 2 or 1):wikitext(frame:expandTemplate {
| |
| title = 'SkillText',
| |
| args = {
| |
| trait_name,
| |
| unnamed[1],
| |
| unnamed[2],
| |
| MP = MP_ARG,
| |
| ECP = ECP_ARG,
| |
| CD = args['cd' .. trait_count] or default_value['cd'],
| |
| DURATION = args['duration' .. trait_count],
| |
| CHANCE = args['chance' .. trait_count] or default_value['chance'],
| |
| DAMAGE = args['dmg' .. trait_count] or default_value['dmg']
| |
| }
| |
| });
| |
| end
| |
| | |
| function doDetail()
| |
| for _, modeSuffix in ipairs({ '', '_pvp' }) do
| |
| if indexOf(trait_name, detail) then
| |
| local short_detail = prop_short[detail_key]
| |
| local short_detail_improved = short_detail
| |
| local is_pvp = modeSuffix == '_pvp'
| |
| | |
| -- Fix Regen 1.
| |
| if short_detail == 'mp_recovery' then
| |
| short_detail_improved = 'mp'
| |
| end
| |
| | |
| local detail_content = args[short_detail_improved .. trait_count]
| |
| local multiplier = detail_content or default_value[short_detail_improved] or 100
| |
| local suffix = ''
| |
| if short_detail_improved == 'mp' then
| |
| suffix = STR.MP
| |
| if is_rose then
| |
| suffix = STR.ECP
| |
| end
| |
| elseif short_detail == 'cd' or short_detail == 'duration' then
| |
| suffix = STR.SEC
| |
| end
| |
| | |
| local base_detail = args[short_detail_improved .. modeSuffix]
| |
| | |
| local function calcEndValue(base)
| |
| local end_value;
| |
| if short_detail == 'hits' then
| |
| end_value = base or 0
| |
| else
| |
| end_value = (tonumber(multiplier) / 100) * tonumber(base or 0)
| |
| end
| |
| if tonumber(end_value) ~= nil and tonumber(end_value) <= 0 then
| |
| end_value = '-'
| |
| end
| |
| return end_value .. suffix
| |
| end
| |
| | |
| local end_value = calcEndValue(base_detail)
| |
| | |
| local enhanced_detail = args[short_detail_improved .. modeSuffix .. '_enhanced']
| |
| if enhanced_detail ~= nil then
| |
| end_value = end_value .. "<br/>'''" .. frame:expandTemplate {
| |
| title = 'Tt',
| |
| args = { calcEndValue(enhanced_detail) .. "'''",
| |
| "Final Enhanced Skill" }
| |
| }
| |
| end
| |
| | |
| if (is_pvp and base_detail) or not is_pvp then
| |
| local detail_text = end_value
| |
| if end_value == '-' and args['detail' .. trait_count] then
| |
| detail_text = args
| |
| ['detail' .. trait_count]
| |
| end
| |
| | |
| local detail_cell = (is_pvp and tr4 or tr3):tag('td'):wikitext(detail_text):attr('rowspan',
| |
| has_pvp_values and (not args[short_detail_improved .. '_pvp']) and 2 or 1);
| |
| end
| |
| end
| |
| end
| |
| end
| |
| | |
| doDetail()
| |
| end
| |
| end
| |
|
| |
|
| return tostring(trait_table);
| | return origTemplateExpanded |
| end | | end |
|
| |
|
| return p | | return p |