FANDOM


-- <pre>
local p    = {}
 
local lib       = require('Módulo:Feature')
local json      = require('Módulo:JSON')
local userError = require('Dev:User error')
local FN        = require('Módulo:Filename')
 
local statsdata = {
    ["hp_base"]      = "hp",
    ["hp_lvl"]       = "hpperlevel",
    ["mp_base"]      = "mp",
    ["mp_lvl"]       = "mpperlevel",
    ["ms"]           = "movespeed",
    ["arm_base"]     = "armor",
    ["arm_lvl"]      = "armorperlevel",
    ["mr_base"]      = "spellblock",
    ["mr_lvl"]       = "spellblockperlevel",
    ["range"]        = "attackrange",
    ["hp5_base"]     = "hpregen",
    ["hp5_lvl"]      = "hpregenperlevel",
    ["mp5_base"]     = "mpregen",
    ["mp5_lvl"]      = "mpregenperlevel",
    ["dam_base"]     = "attackdamage",
    ["dam_lvl"]      = "attackdamageperlevel",
    ["as_lvl"]       = "attackspeedperlevel",
    ["as_lvl1"]      = "attackspeed"
}
 
function p.test(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    local lolData  = mw.loadData('Módulo:ChampionData/data')
    local lolTable = {}
 
    for champname in pairs(lolData) do
        if
            lolData[champname]["date"] == ("Próximo" or "N/A" or "Cancelado" or "")
            or 
            champname == ("Mega Gnar" or "Rhaast" or "Asesino Sombrío")
            then
            --ignore champion
        else
            table.insert(lolTable, champname)
        end
    end
    table.sort(lolTable)
 
    local s = "<table>"
    for _, champion in pairs(lolTable) do
        s = s .. "<tr><td>" .. champion .. "</td><td>" .. p.get{champion, "resource"} .. "</td><td>" .. p.get{champion, "mp_base"} .. "</td></tr>\n"
    end
    s = s .. "</table>"
 
    return s
end
 
function p.get(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    local get       = require ('Módulo:ChampionData/getter')
    local champname = args['champname'] or args[1]
    local datatype  = args['datatype']  or args[2]
    local output    = args['output']    or args[3] or nil
 
 
 
    local result = get[datatype](champname)
 
    if output ~= nil and type(result) == "table" then
        if output == "csv" then
            return lib.tbl_concat{result}
        elseif output == "custom" then 
            return frame:preprocess(lib.tbl_concat{result, prepend = args['prepend'], append = args['append'], separator = args['separator'], index = args["index"]})
        elseif output == "template" then 
            return frame:preprocess(lib.tbl_concat{result, prepend = "{{" .. args['t_name'] .. "|", append = "}}", separator = args['separator']})
        end
    elseif result == nil then
        return ""
    else
        return result
    end
end
 
function p.getRoster()
    local lolData  = mw.loadData('Módulo:ChampionData/data')
    local tftData  = require('Módulo:TFTUnitData')
    local lolTable = {}
    local s        = ""
 
    for champname in pairs(lolData) do
        if  
            lolData[champname]["date"] == ("Próximo" or "N/A" or "Cancelado" or "")
            or 
            champname == ("Mega Gnar" or "Rhaast" or "Asesino Sombrío")
            then
            --ignore champion
        else
            table.insert(lolTable, champname)
        end
 
    end
    table.sort(lolTable)
 
    for _, champion in pairs(lolTable) do
 
        --custom searches
        local search = champion
 
        if lolData[champion]["title"]    then search = search .. "," .. lolData[champion]["title"]    end
        if lolData[champion]["fullname"] then search = search .. "," .. lolData[champion]["fullname"] end
        if lolData[champion]["nickname"] then search = search .. "," .. lolData[champion]["nickname"] end
 
        --game titles
        local games = "LOL" 
 
        if tftData.checkRoster{champion} then 
            games = games .. ",TFT," .. tftData.getTooltipSets{champion}
        end
 
        --champion roles
        local role = p.mainrole{champion} .. "," .. p.get{champion, "role", "csv"}
        local rangetype = lolData[champion]["rangetype"]
        s = s .. '<li><span class="grid-icon champion-icon" data-champion="' .. champion .. '" data-search="' .. search .. '" data-game="' .. games .. '" data-role="' .. role .. '" data-type="' .. rangetype .. '">[[File:' .. FN.championcircle{champion} .. '|48px|alt=' .. champion .. '|link=' .. champion .. ']]</span></li>'
    end
 
    return s
end
 
function p.statTable(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    local _stat     = args[1]
    local lolData   = mw.loadData('Módulo:ChampionData/data')
    local lolTable  = {}
    local tablenode = mw.html.create('table')
 
    local convert   = {
        ["Health"]          = "hp",
        ["Health regen"]    = "hp5",
        ["Mana"]            = "mp",
        ["Mana regen"]      = "mp5",
        ["Armor"]           = "arm",
        ["Magic resist"]    = "mr",
        ["Attack damage"]   = "dam",
        ["Move speed"]      = "ms",
        ["Attack speed"]    = "as"
    }
 
    tablenode
        :addClass('sortable article-table sticky-header')
        :css('width', '100%')
        :css('text-align', 'center')
        :newline()
 
    if _stat == "Attack speed" then
        tablenode
            :tag('tr')
                :tag('th')
                    :wikitext('Champion')
                    :css('width', '180px')
                :done()
                :tag('th')
                    :wikitext('Base')
                :done()
                :tag('th')
                    :wikitext('Alcance VA')
                :done()
                :tag('th')
                    :wikitext('Desviación')
                :done()
                :tag('th')
                    :wikitext('Coeficiente de crecimiento de bonificación')
                :done()
                :tag('th')
                    :wikitext('Bonificación en el nivel 18')
                :done()
                :tag('th')
                    :wikitext('Valor en el nivel 18')
                :done()
                :tag('th')
                    :wikitext('VA adicional necesaria para limitar en el nivel 18')
                :done()
            :done()
            :newline()
    elseif _stat == "Basic attack" then
        tablenode
            :tag('tr')
                :tag('th')
                    :wikitext('Champion')
                    :css('width', '180px')
                :done()
                :tag('th')
                    :wikitext('Alcance de ataque')
                :done()
                :tag('th')
                    :wikitext('Tipo de alcance')
                :done()
                :tag('th')
                    :wikitext('Velocidad de misil')
                :done()
                :tag('th')
                    :wikitext('Enrollamiento')
                :done()
                :tag('th')
                    :wikitext('Modificador de enrollamiento')
                :done()
            :done()
            :newline()
    elseif _stat == "Hitbox" then
        tablenode
            :tag('tr')
                :tag('th')
                    :wikitext('Champion')
                    :css('width', '180px')
                :done()
                :tag('th')
                    :wikitext('Radio de juego')
                :done()
                :tag('th')
                    :wikitext('Radio de selección')
                :done()
                :tag('th')
                    :wikitext('Radio de trayectoria')
                :done()
                :tag('th')
                    :wikitext('Radio de adquisición')
                :done()
            :done()
            :newline()
    else
        tablenode
            :tag('tr')
                :tag('th')
                    :wikitext('Champion')
                    :css('width', '180px')
                :done()
                :tag('th')
                    :wikitext('Base')
                :done()
                :tag('th')
                    :wikitext('Coeficiente de crecimiento')
                :done()
                :tag('th')
                    :wikitext('Valor a 18')
                :done()
            :done()
            :newline()
    end
 
    for champname in pairs(lolData) do
        if  
            lolData[champname]["date"] == ("Próximo" or "N/A" or "Cancelado" or "")
            or 
            champname == ("Rhaast" or "Asesino Sombrío")
            then
            --ignore champion
        else
            table.insert(lolTable, champname)
        end
    end
    table.sort(lolTable)
 
    for _, champion in pairs(lolTable) do
        local t         = lolData[champion]["stats"]
        local tablerow  = mw.html.create('tr')
 
        if _stat == "Attack speed" then
            local as_base   = t["as_base"]
            local as_ratio  = t["as_ratio"]
            local bonus_lvl = t["as_lvl"]
            local bonus_18  = 0 + bonus_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1))
            local variation = string.format("%.f", 100 - 100 / as_base * as_ratio, 3)
 
            if variation == "-0" then
                variation = "0"
            end
 
            local disp_name = champion
            if champion == "Mega Gnar" then disp_name = "Gnar (Mega)" end
 
            if champion == "Jhin" then
                tablerow
                    :tag('td')
                        :attr('data-sort-value', disp_name)
                        :css('text-align', 'left')
                        :wikitext("[[File:" .. FN.championcircle{champion} .. "|20px|alt=" .. champion .. "|link=" .. champion .. "]] [[" .. champion .. "]] <span title='El crecimiento de Jhin aumenta su velocidad de ataque base. No gana &#39;velocida de ataque adicional&#39;.'><sup>note</sup></span>")
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.3f", as_base, 3))
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.3f", as_ratio, 3))
                    :done()
                    :tag('td')
                        :wikitext("N/A")
                    :done()
                    :tag('td')
                        :wikitext(bonus_lvl .. "%")
                    :done()
                    :tag('td')
                        :wikitext(bonus_18 .. "%")
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.3f", as_base + as_base * (bonus_18 / 100), 3))
                    :done()
                    :tag('td')
                        :attr('data-sort-value', "9999%")
                        :wikitext(string.format("%0.0f", (2.5 / as_ratio - 1) * 100 - bonus_18, 3) .. "%")
                    :done()
                :done()
            else
                tablerow
                    :tag('td')
                        :attr('data-sort-value', disp_name)
                        :css('text-align', 'left')
                        :wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.3f", as_base, 3))
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.3f", as_ratio, 3))
                    :done()
                    :tag('td')
                        :wikitext(variation .. "%")
                    :done()
                    :tag('td')
                        :wikitext(bonus_lvl .. "%")
                    :done()
                    :tag('td')
                        :wikitext(bonus_18 .. "%")
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.3f", as_base + as_ratio * (bonus_18 / 100), 3))
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.0f", (2.5 / as_ratio - 1) * 100 - bonus_18, 3) .. "%")
                    :done()
                :done()
            end
        elseif _stat == "Basic attack" then
            local windup
            if (t["attack_cast_time"] and t["attack_total_time"]) then
                windup = t["attack_cast_time"] / t["attack_total_time"]
            else
                windup = 0.3 + (t["attack_delay_offset"] or 0)
            end
 
            local windup_mod
            if t["windup_modifier"] == nil then
                windup_mod = "N/A"
            else
                windup_mod = math.floor(t["windup_modifier"] * 1000 + 0.5) / 1000
            end
 
            tablerow
                :tag('td')
                    :attr('data-sort-value', champion)
                    :css('text-align', 'left')
                    :wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
                :done()
                :tag('td')
                    :wikitext(t["range"])
                :done()
                :tag('td')
                    :wikitext(lolData[champion]["rangetype"])
                :done()
                :tag('td')
                    :wikitext(t["missile_speed"] or "N/A")
                :done()
                :tag('td')
                    :wikitext(string.format("%0.1f", windup * 100) .. "%")
                :done()
                :tag('td')
                    :wikitext(windup_mod)
                :done()
            :done()
        elseif _stat == "Hitbox" then
            tablerow
                :tag('td')
                    :attr('data-sort-value', champion)
                    :css('text-align', 'left')
                    :wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
                :done()
                :tag('td')
                    :wikitext(math.floor(t["gameplay_radius"] or 65 + 0.5))
                :done()
                :tag('td')
                    :wikitext(math.floor(t["selection_radius"] or 0 + 0.5))
                :done()
                :tag('td')
                    :wikitext(math.floor(t["pathing_radius"] or 0 + 0.5))
                :done()
                :tag('td')
                    :wikitext(math.floor(t["acquisition_radius"] or 750 + 0.5))
                :done()
            :done()
        else
            local _base = tonumber(t[convert[_stat] .. "_base"])
            local _lvl  = tonumber(t[convert[_stat] .. "_lvl"])
 
            tablerow
                :tag('td')
                    :attr('data-sort-value', champion)
                    :css('text-align', 'left')
                    :wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
                :done()
                :tag('td')
                    :wikitext(_base)
                :done()
                :tag('td')
                    :wikitext(_lvl)
                :done()
                :tag('td')
                    :wikitext((_base or 0) + (_lvl or 0) * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))
                :done()
            :done()
        end
 
        -- Add row to table
        tablenode
            :node(tablerow)
            :newline()
    end
 
    tablenode:allDone()
 
    return tostring(tablenode)
end
 
-- JSON to Lua function for data from
-- http://ddragon.leagueoflegends.com/cdn/<patchversion>/data/en_US/champion.json
 
function p.jsontolua()
    local titleobject  = mw.title.new("User:Ninjamask/jsontemp")
    local o            = json.decode(titleobject:getContent())
    --local o2           = mw.loadData('Módulo:ChampionData/data')
    local s            = ""
    local championdata = {}
 
    for jsonchampname in pairs(o['data']) do
        table.insert(championdata, {jsonchampname, o['data'][jsonchampname]['name']})
    end
    table.sort(championdata, function(a, b) return a[2] < b[2] end)
 
    -- ============================
    -- = Generate lua data output =
    -- ============================
 
    s = s .. '-- <pre>\n'
    s = s .. '-- Champion data for patch version: ' .. o['version'] .. '\n'
    s = s .. '\n'
    s = s .. 'return {\n'
 
 
    for i, champname in pairs(championdata) do
        local t = o['data'][champname[1]]
 
        s = s .. '  ["' .. t['name'] .. '"] = {\n'
        s = s .. '    ["id"]         = '  .. t['key']                            .. ',\n'
        s = s .. '    ["apiname"]    = "' .. t['id']                            .. '",\n'
        s = s .. '    ["title"]      = "' .. t['title']                         .. '",\n'
 
        s = s .. '    ["attack"]     = '  .. t['info']['attack']                 .. ',\n'
        s = s .. '    ["defense"]    = '  .. t['info']['defense']                .. ',\n'
        s = s .. '    ["magic"]      = '  .. t['info']['magic']                  .. ',\n'
        s = s .. '    ["difficulty"] = '  .. t['info']['difficulty']             .. ',\n'
 
        s = s .. '    ["herotype"]   = "'  .. t['tags'][1]                      .. '",\n'
        if t['tags'][2] ~= nil then
            s = s .. '    ["alttype"]    = "'  .. t['tags'][2]                  .. '",\n'
        end
 
        s = s .. '    ["resource"]   = "'  .. t['partype']                      .. '",\n'
        s = s .. '    ["stats"] = {\n'
        s = s .. '      ["hp_base"]             = ' .. t['stats']['hp']                        .. ',\n'
        s = s .. '      ["hp_lvl"]              = ' .. t['stats']['hpperlevel']                .. ',\n'
        s = s .. '      ["mp_base"]             = ' .. t['stats']['mp']                        .. ',\n'
        s = s .. '      ["mp_lvl"]              = ' .. t['stats']['mpperlevel']                .. ',\n'
        s = s .. '      ["arm_base"]            = ' .. t['stats']['armor']                     .. ',\n'
        s = s .. '      ["arm_lvl"]             = ' .. t['stats']['armorperlevel']             .. ',\n'
        s = s .. '      ["mr_base"]             = ' .. t['stats']['spellblock']                .. ',\n'
        s = s .. '      ["mr_lvl"]              = ' .. t['stats']['spellblockperlevel']        .. ',\n'
        s = s .. '      ["hp5_base"]            = ' .. t['stats']['hpregen']                   .. ',\n'
        s = s .. '      ["hp5_lvl"]             = ' .. t['stats']['hpregenperlevel']           .. ',\n'
        s = s .. '      ["mp5_base"]            = ' .. t['stats']['mpregen']                   .. ',\n'
        s = s .. '      ["mp5_lvl"]             = ' .. t['stats']['mpregenperlevel']           .. ',\n'
        s = s .. '      ["dam_base"]            = ' .. t['stats']['attackdamage']              .. ',\n'
        s = s .. '      ["dam_lvl"]             = ' .. t['stats']['attackdamageperlevel']      .. ',\n'
        s = s .. '      ["as_base"]             = ' .. t['stats']['attackspeed']               .. ',\n'
        s = s .. '      ["as_lvl"]              = ' .. t['stats']['attackspeedperlevel']       .. ',\n'
        s = s .. '      ["range"]               = ' .. t['stats']['attackrange']               .. ',\n'
        s = s .. '      ["ms"]                  = ' .. t['stats']['movespeed']                 .. ',\n'
        s = s .. '      ["acquisition_radius"]  = ' .. p.get{t['name'], "acquisition_radius"}  .. ',\n'
        s = s .. '      ["selection_radius"]    = ' .. p.get{t['name'], "selection_radius"}    .. ',\n'
        s = s .. '      ["pathing_radius"]      = ' .. p.get{t['name'], "pathing_radius"}      .. ',\n'
        s = s .. '      ["gameplay_radius"]     = ' .. p.get{t['name'], "gameplay_radius"}     .. ',\n'
        s = s .. '      ["crit_base"]           = ' .. p.get{t['name'], "crit_base"}           .. ',\n'
        s = s .. '      ["crit_mod"]            = ' .. p.get{t['name'], "crit_mod"}            .. ',\n'
        s = s .. '      ["as_ratio"]            = ' .. p.get{t['name'], "as_ratio"}            .. ',\n'
        s = s .. '      ["windup_modifier"]     = ' .. p.get{t['name'], "windup_modifier"}     .. ',\n'
        s = s .. '      ["missile_speed"]       = ' .. p.get{t['name'], "missile_speed"}       .. ',\n'
        s = s .. '      ["attack_cast_time"]    = ' .. p.get{t['name'], "attack_cast_time"}    .. ',\n'
        s = s .. '      ["attack_total_time"]   = ' .. p.get{t['name'], "attack_total_time"}   .. ',\n'
        s = s .. '      ["attack_delay_offset"] = ' .. p.get{t['name'], "attack_delay_offset"} .. ',\n'
        s = s .. '      ["windup"]              = ' .. p.get{t['name'], "windup"}              .. ',\n'
        s = s .. '      ["aram_dmg_dealt"]      = ' .. p.get{t['name'], "aram_dmg_dealt"}      .. ',\n'
        s = s .. '      ["aram_dmg_taken"]      = ' .. p.get{t['name'], "aram_dmg_taken"}      .. ',\n'
        s = s .. '      ["aram_healing"]        = ' .. p.get{t['name'], "aram_healing"}        .. ',\n'
        s = s .. '      ["aram_shielding"]      = ' .. p.get{t['name'], "aram_shielding"}      .. ',\n'
        s = s .. '      ["urf_dmg_dealt"]       = ' .. p.get{t['name'], "urf_dmg_dealt"}       .. ',\n'
        s = s .. '      ["urf_dmg_taken"]       = ' .. p.get{t['name'], "urf_dmg_taken"}       .. ',\n'
        s = s .. '      ["urf_healing"]         = ' .. p.get{t['name'], "urf_healing"}         .. ',\n'
        s = s .. '      ["urf_shielding"]       = ' .. p.get{t['name'], "urf_shielding"}       .. '\n'
        s = s .. '    }\n'
        s = s .. '  }' .. lib.ternary(i ~= #championdata, ',\n','\n')
    end
 
    s = s .. '}\n'
    s = s .. '-- </' .. 'pre>\n' -- pre needs to be splitted with .. cause of Lua/Mediawiki weirdness
 
    s = s .. '-- [[Category:StatTable data]]'
 
    return 'Copy & paste data below to [[Módulo:StatTable/data/' .. o['version'] ..  ']]<pre>' .. s .. '</pre>Copy & paste data above to [[Módulo:StatTable/data/' .. o['version'] .. ']]'
end
 
function p.main2(frame) -- deprecated
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    local patchid      = args[1] or args['patchid'] or cmd.main{"PatchId"}
    local luadata      = loadData(patchid)
    local o            = mw.loadData('Módulo:StatTable/data/' .. patchid)
    local s            = ""
    local championdata = {}
 
    if type(luadata)     == nil then
        return userError("No data available for patch " .. patchid, "LuaError")
    end
 
    for championname in pairs(o) do
        table.insert(championdata, championname)
    end
    table.sort(championdata)
 
    -- ============================
    -- = Generate lua data output =
    -- ============================
 
    s = s .. '-- <pre>\n'
    s = s .. '-- Champion data for patch version: ' .. patchid .. '\n'
    s = s .. '\n'
    s = s .. 'return {\n'
 
 
    for i, champname in pairs(championdata) do
        local t = o[champname]
 
        -- StatTable data 
        s = s .. '  ["' .. champname .. '"] = {\n'
        s = s .. '    ["id"]         = '  .. t['id']                            .. ',\n'
        s = s .. '    ["apiname"]    = "' .. t['apiname']                       .. '",\n'
        s = s .. '    ["title"]      = "' .. t['title']                         .. '",\n'
 
        s = s .. '    ["attack"]     = '  .. t['attack']                        .. ',\n'
        s = s .. '    ["defense"]    = '  .. t['defense']                       .. ',\n'
        s = s .. '    ["magic"]      = '  .. t['magic']                         .. ',\n'
        s = s .. '    ["difficulty"] = '  .. t['difficulty']                    .. ',\n'
 
        s = s .. '    ["herotype"]   = "'  .. t['herotype']                     .. '",\n'
        if t['alttype'] ~= nil then
            s = s .. '    ["alttype"]    = "'  .. t['alttype']                  .. '",\n'
        end
 
        s = s .. '    ["resource"]   = "'  .. t['resource']                     .. '",\n'
        s = s .. '    ["stats"] = {\n'
        s = s .. '      ["hp_base"]  = '  .. t['stats']['hp_base']              .. ',\n'
        s = s .. '      ["hp_lvl"]   = '  .. t['stats']['hp_lvl']               .. ',\n'
        s = s .. '      ["mp_base"]  = '  .. t['stats']['mp_base']              .. ',\n'
        s = s .. '      ["mp_lvl"]   = '  .. t['stats']['mp_lvl']               .. ',\n'
        s = s .. '      ["arm_base"] = '  .. t['stats']['arm_base']             .. ',\n'
        s = s .. '      ["arm_lvl"]  = '  .. t['stats']['arm_lvl']              .. ',\n'
        s = s .. '      ["mr_base"]  = '  .. t['stats']['mr_base']              .. ',\n'
        s = s .. '      ["mr_lvl"]   = '  .. t['stats']['mr_lvl']               .. ',\n'
        s = s .. '      ["hp5_base"] = '  .. t['stats']['hp5_base']             .. ',\n'
        s = s .. '      ["hp5_lvl"]  = '  .. t['stats']['hp5_lvl']              .. ',\n'
        s = s .. '      ["mp5_base"] = '  .. t['stats']['mp5_base']             .. ',\n'
        s = s .. '      ["mp5_lvl"]  = '  .. t['stats']['mp5_lvl']              .. ',\n'
        s = s .. '      ["dam_base"] = '  .. t['stats']['dam_base']             .. ',\n'
        s = s .. '      ["dam_lvl"]  = '  .. t['stats']['dam_lvl']              .. ',\n'
        s = s .. '      ["as_base"]  = '  .. pst2(champname, "as_base")         .. ',\n'
        if t['stats']['as_lvl1'] ~= nil and t['stats']['as_lvl1'] ~= tonumber(pst2(champname, "as_base")) then
            s = s .. '      ["as_lvl1"]  = '     .. t['stats']['as_lvl1']       .. ',\n'
        end
        if t['stats']['attack_delay'] ~= nil then
            s = s .. '      ["attack_delay"] = ' .. t['stats']['attack_delay']  .. ',\n'
        end
        as_lvl1 = pst2(champname, "as_lvl1_bonus")
        if as_lvl1 ~= "{{{as_lvl1_bonus}}}" then
            s = s .. '      ["as_lvl1_bonus"]  = '  .. pst2(champname, "as_lvl1_bonus")         .. ',\n'
        end
        s = s .. '      ["as_lvl"]   = '  .. t['stats']['as_lvl']               .. ',\n'
        s = s .. '      ["range"]    = '  .. pst2(champname, "range")           .. ',\n'
        s = s .. '      ["ms"]       = '  .. pst2(champname, "ms")              ..  '\n'
        s = s .. '    },\n'
 
        -- Additional data from champion data templates
        fullname = pst2(champname, "fullname")
        if fullname ~= "{{{fullname}}}" then
            s = s .. '    ["fullname"]   = "' .. fullname                       .. '",\n'
        end
 
        nickname = pst2(champname, "nickname")
        if nickname ~= "{{{nickname}}}" then
            s = s .. '    ["nickname"]   = "' .. nickname                       .. '",\n'
        end
 
        s = s .. '    ["rangetype"]   = "' .. pst2(champname, "rangetype")           .. '",\n'
        s = s .. '    ["date"]        = "' .. pst2(champname, "date")                .. '",\n'
        s = s .. '    ["patch"]       = "' .. pst2(champname, "patch")               .. '",\n'
        s = s .. '    ["changes"]     = "' .. pst2(champname, "changes")             .. '",\n'
        s = s .. '    ["role"]        = {' .. strtoluadata(pst2(champname, "role"), ",") .. '},\n'
        s = s .. '    ["damage"]      = '  .. pst2(champname, "damage")              .. ',\n'
        s = s .. '    ["toughness"]   = '  .. pst2(champname, "toughness")           .. ',\n'
        s = s .. '    ["control"]     = '  .. pst2(champname, "control")             .. ',\n'
        s = s .. '    ["mobility"]    = '  .. pst2(champname, "mobility")            .. ',\n'
        s = s .. '    ["utility"]     = '  .. pst2(champname, "utility")             .. ',\n'
        s = s .. '    ["style"]       = '  .. pst2(champname, "style")               .. ',\n'
        s = s .. '    ["adaptivetype"]= "' .. pst2(champname, "adaptivetype")        .. '",\n'
        s = s .. '    ["be"]          = '  .. pst2(champname, "be")                  .. ',\n'
        s = s .. '    ["rp"]          = '  .. pst2(champname, "rp")                  .. ',\n'
        s = s .. '    ["skill_i"]     = {' .. strtoluadatai(pst2(champname, "skill_i"), ";") .. '},\n'
        s = s .. '    ["skill_q"]     = {' .. strtoluadatai(pst2(champname, "skill_q"), ";") .. '},\n'
        s = s .. '    ["skill_w"]     = {' .. strtoluadatai(pst2(champname, "skill_w"), ";") .. '},\n'
        s = s .. '    ["skill_e"]     = {' .. strtoluadatai(pst2(champname, "skill_e"), ";") .. '},\n'
        s = s .. '    ["skill_r"]     = {' .. strtoluadatai(pst2(champname, "skill_r"), ";") .. '}\n'
        s = s .. '  }' .. lib.ternary(i ~= #championdata, ',\n','\n')
    end
 
    s = s .. '}\n'
    s = s .. '-- </' .. 'pre>\n' -- pre needs to be splitted with, because of Lua weirdness
    s = s .. '-- [[Category:Lua]]'
 
    return '<pre>' .. mw.text.nowiki(s) .. '</pre>'
end
 
function p.main(frame) -- deprecated
    local o            = mw.loadData('Módulo:StatTable/data/' .. patchid)
    local s            = ""
    local championdata = {}
 
    if type(luadata)     == nil then
        return userError("No data available for patch " .. patchid, "LuaError")
    end
 
    for championname in pairs(o) do
        table.insert(championdata, championname)
    end
    table.sort(championdata)
 
    -- ============================
    -- = Generate lua data output =
    -- ============================
 
    s = s .. '-- <pre>\n'
    s = s .. '-- Champion data for patch version: ' .. patchid .. '\n'
    s = s .. '\n'
    s = s .. 'return {\n'
 
 
    for i, champname in pairs(championdata) do
        local t = o[champname]
 
        -- StatTable data 
        s = s .. '  ["' .. champname .. '"] = {\n'
        s = s .. '    ["id"]         = '  .. t['id']                            .. ',\n'
        s = s .. '    ["apiname"]    = "' .. t['apiname']                       .. '",\n'
        s = s .. '    ["title"]      = "' .. t['title']                         .. '",\n'
 
        s = s .. '    ["attack"]     = '  .. t['attack']                        .. ',\n'
        s = s .. '    ["defense"]    = '  .. t['defense']                       .. ',\n'
        s = s .. '    ["magic"]      = '  .. t['magic']                         .. ',\n'
        s = s .. '    ["difficulty"] = '  .. t['difficulty']                    .. ',\n'
 
        s = s .. '    ["herotype"]   = "'  .. t['herotype']                     .. '",\n'
        if t['alttype'] ~= nil then
            s = s .. '    ["alttype"]    = "'  .. t['alttype']                  .. '",\n'
        end
 
        s = s .. '    ["resource"]   = "'  .. t['resource']                     .. '",\n'
        s = s .. '    ["stats"] = {\n'
        s = s .. '      ["hp_base"]  = '  .. t['stats']['hp_base']              .. ',\n'
        s = s .. '      ["hp_lvl"]   = '  .. t['stats']['hp_lvl']               .. ',\n'
        s = s .. '      ["mp_base"]  = '  .. t['stats']['mp_base']              .. ',\n'
        s = s .. '      ["mp_lvl"]   = '  .. t['stats']['mp_lvl']               .. ',\n'
        s = s .. '      ["arm_base"] = '  .. t['stats']['arm_base']             .. ',\n'
        s = s .. '      ["arm_lvl"]  = '  .. t['stats']['arm_lvl']              .. ',\n'
        s = s .. '      ["mr_base"]  = '  .. t['stats']['mr_base']              .. ',\n'
        s = s .. '      ["mr_lvl"]   = '  .. t['stats']['mr_lvl']               .. ',\n'
        s = s .. '      ["hp5_base"] = '  .. t['stats']['hp5_base']             .. ',\n'
        s = s .. '      ["hp5_lvl"]  = '  .. t['stats']['hp5_lvl']              .. ',\n'
        s = s .. '      ["mp5_base"] = '  .. t['stats']['mp5_base']             .. ',\n'
        s = s .. '      ["mp5_lvl"]  = '  .. t['stats']['mp5_lvl']              .. ',\n'
        s = s .. '      ["dam_base"] = '  .. t['stats']['dam_base']             .. ',\n'
        s = s .. '      ["dam_lvl"]  = '  .. t['stats']['dam_lvl']              .. ',\n'
        s = s .. '      ["as_base"]  = '  .. pst2(champname, "as_base")         .. ',\n'
        if t['stats']['as_lvl1'] ~= nil and t['stats']['as_lvl1'] ~= tonumber(pst2(champname, "as_base")) then
            s = s .. '      ["as_lvl1"]  = '     .. t['stats']['as_lvl1']       .. ',\n'
        end
        if t['stats']['attack_delay'] ~= nil then
            s = s .. '      ["attack_delay"] = ' .. t['stats']['attack_delay']  .. ',\n'
        end
        as_lvl1 = pst2(champname, "as_lvl1_bonus")
        if as_lvl1 ~= "{{{as_lvl1_bonus}}}" then
            s = s .. '      ["as_lvl1_bonus"]  = '  .. pst2(champname, "as_lvl1_bonus")         .. ',\n'
        end
        s = s .. '      ["as_lvl"]   = '  .. t['stats']['as_lvl']               .. ',\n'
        s = s .. '      ["range"]    = '  .. pst2(champname, "range")           .. ',\n'
        s = s .. '      ["ms"]       = '  .. pst2(champname, "ms")              ..  '\n'
        s = s .. '    },\n'
 
        -- Additional data from champion data templates
        fullname = pst2(champname, "fullname")
        if fullname ~= "{{{fullname}}}" then
            s = s .. '    ["fullname"]   = "' .. fullname                       .. '",\n'
        end
 
        nickname = pst2(champname, "nickname")
        if nickname ~= "{{{nickname}}}" then
            s = s .. '    ["nickname"]   = "' .. nickname                       .. '",\n'
        end
 
        s = s .. '    ["rangetype"]   = "' .. pst2(champname, "rangetype")           .. '",\n'
        s = s .. '    ["date"]        = "' .. pst2(champname, "date")                .. '",\n'
        s = s .. '    ["patch"]       = "' .. pst2(champname, "patch")               .. '",\n'
        s = s .. '    ["changes"]     = "' .. pst2(champname, "changes")             .. '",\n'
        s = s .. '    ["role"]        = {' .. strtoluadata(pst2(champname, "role"), ",") .. '},\n'
        s = s .. '    ["damage"]      = '  .. pst2(champname, "damage")              .. ',\n'
        s = s .. '    ["toughness"]   = '  .. pst2(champname, "toughness")           .. ',\n'
        s = s .. '    ["control"]     = '  .. pst2(champname, "control")             .. ',\n'
        s = s .. '    ["mobility"]    = '  .. pst2(champname, "mobility")            .. ',\n'
        s = s .. '    ["utility"]     = '  .. pst2(champname, "utility")             .. ',\n'
        s = s .. '    ["style"]       = '  .. pst2(champname, "style")               .. ',\n'
        s = s .. '    ["adaptivetype"]= "' .. pst2(champname, "adaptivetype")        .. '",\n'
        s = s .. '    ["be"]          = '  .. pst2(champname, "be")                  .. ',\n'
        s = s .. '    ["rp"]          = '  .. pst2(champname, "rp")                  .. ',\n'
        s = s .. '    ["skill_i"]     = {' .. strtoluadatai(pst2(champname, "skill_i"), ";") .. '},\n'
        s = s .. '    ["skill_q"]     = {' .. strtoluadatai(pst2(champname, "skill_q"), ";") .. '},\n'
        s = s .. '    ["skill_w"]     = {' .. strtoluadatai(pst2(champname, "skill_w"), ";") .. '},\n'
        s = s .. '    ["skill_e"]     = {' .. strtoluadatai(pst2(champname, "skill_e"), ";") .. '},\n'
        s = s .. '    ["skill_r"]     = {' .. strtoluadatai(pst2(champname, "skill_r"), ";") .. '}\n'
        s = s .. '  }' .. lib.ternary(i ~= #championdata, ',\n','\n')
    end
 
    s = s .. '}\n'
    s = s .. '-- </' .. 'pre>\n' -- pre needs to be splitted with, because of Lua weirdness
    s = s .. '-- [[Category:Lua]]'
 
    return '<pre>' .. mw.text.nowiki(s) .. '</pre>'
end
 
function p.mainrole(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    local parentroletable = {
        ["Atrapador"]    = "Controlador",
        ["Encantador"]  = "Controlador",
        ["Atacante"]      = "Luchador",
        ["Coloso"] = "Luchador",
        ["Batalla"] = "Mago",
        ["Ráfaga"]      = "Mago",
        ["Artillería"]  = "Mago",
        ["Asesino"]   = "Aniquilador",
        ["Escaramuzador"] = "Aniquilador",
        ["Vanguardia"]   = "Tanque",
        ["Protector"]     = "Tanque",
        ["Tirador"]   = "",
        ["Especialista"] = "",
    }
 
    local champname = args[1] or args['champname'] 
    local get       = require ('Módulo:ChampionData/getter')
    local item      = get.role(champname)
    local s         = ""
 
    for i, subrole in pairs{item} do
        if i ~= 1 then
            s = s .. ","
        end
        s = s .. parentroletable[subrole]
    end
 
    return s
end
 
function p.minmaxstattable() -- work in progress
    local o            = mw.loadData('Módulo:ChampionData/data')
    local stat         = 'hp5_lvl'
    local stattable    = {}
 
    for champion in pairs(o) do
        -- mw.log(champion, o[champion].stats.hp5_base)
        table.insert(stattable, {champion, o[champion].stats.hp5_base, o[champion].stats.hp5_lvl, o[champion].stats.hp5_base + o[champion].stats.hp5_lvl * (18-1) * (0.7025 + 0.0175 * (18 - 1))})
    end
    table.sort(stattable, function(a, b) return a[2] > b[2] end)
    -- mw.log(lib.tbl(stattable))
 
    result ={}
    size = 0
    for i, t in ipairs(stattable) do
        if i == 1 then
            table.insert(result, t)
            size = size + 1
        elseif result[i-1][2] ~= t[2] then
            table.insert(result, t)
            size = size + 1
        elseif size <= 5 then
            table.insert(result, t)
        else
            break
        end
    end
 
        -- if i == 1 then
        --     table.insert(result, t)
        --     size = size + 1
        -- elseif size < 5 then
        --     if result[i-1][2] ~= t[2] then
        --         table.insert(result, t)
        --         size = size + 1
        --     end
        -- else
        --     break
        -- end
 
 
    table.sort(result, function(a, b) return a[2] < b[2] end)
    mw.log(lib.tbl(result))
end
 
--
-- local funtions
-- 
 
function strtoluadata(str, sep)
    x = mw.text.split(str, sep)
    i = 1
    s = '"' .. mw.text.trim(x[i]) .. '"'
    i = i + 1
    while i <= #x do
        s = s .. ', "' .. mw.text.trim(x[i]) .. '"'
        i = i + 1
    end
    return s
end
 
function strtoluadatai(str, sep)
    x = mw.text.split(str, sep)
    i = 1
    s = '[' .. i .. '] = "' .. mw.text.trim(x[i]) .. '"'
    i = i + 1
    while i <= #x do
        s = s .. ', [' .. i .. '] = "' .. mw.text.trim(x[i]) .. '"'
        i = i + 1
    end
    return s
end
 
function pst2(champion, stat)
    local frame = mw.getCurrentFrame()
 
    return frame:expandTemplate{
        title = 'Data ' .. champion, args = {'pst2', stat}
    }
end
 
function loadData(patchid)
    if exists('Módulo:StatTable/data/' .. patchid) then
        return mw.loadData('Módulo:StatTable/data/' .. patchid)
    end
 
    return nil
end
 
function exists(page)
    local sPage = page
 
    if sPage then 
        local _, val = pcall(package.loaders[2], sPage)
 
        if type(val) == "function" or type(val) == "string" then
           return true
        end
    end
 
    return false
end
 
return p
-- </pre>
-- [[Category:Lua]]
El contenido de la comunidad está disponible bajo CC-BY-SA a menos que se indique lo contrario.