Module:ChampionData

-- local p = {} local lib      = require('Module:Feature') local json     = require('Module:JSON') local userError = require('Dev:User error') local FN       = require('Module: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('Module:ChampionData/data') local lolTable = {}

for champname in pairs(lolData) do       if            lolData[champname]["date"] == ("Upcoming" or "N/A" or "Cancelled" or "") or            champname == ("Gnar (Mega)" or "Rhaast" or "Shadow Assassin") then --ignore champion else table.insert(lolTable, champname) end end table.sort(lolTable) local s = " " 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 ('Module: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 if champname == "Nunu" or champname == "Willump"       then champname = "Nunu & Willump" end if champname == "Quinn & Valor" or champname == "Valor"         then champname = "Quinn"   end if champname == "Shadow Assassin" or champname == "Rhaast"        then champname = "Kayn"    end if champname == "Lamb" or champname == "Wolf"          then champname = "Kindred" end if champname == "Mega Gnar"     then champname = "Gnar (Mega)" end 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 = "", separator = args['separator']}) end elseif result == nil then return "" else return result end end

function p.getRoster local lolData = mw.loadData('Module:ChampionData/data') local tftData = require('Module:TFTUnitData') local lolTable = {} local s       = "" for champname in pairs(lolData) do       if              lolData[champname]["date"] == ("Upcoming" or "N/A" or "Cancelled" or "") or            champname == ("Gnar (Mega)" or "Rhaast" or "Shadow Assassin") 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 .. ' ' 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('Module: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('AS Ratio') :done :tag('th') :wikitext('Deviation') :done :tag('th') :wikitext('Bonus growth coefficient') :done :tag('th') :wikitext('Bonus at level 18') :done :tag('th') :wikitext('Value at level 18') :done :tag('th') :wikitext('Additional AS needed to cap at level 18') :done :done :newline elseif _stat == "Basic attack" then tablenode :tag('tr') :tag('th') :wikitext('Champion') :css('width', '180px') :done :tag('th') :wikitext('Attack range') :done :tag('th') :wikitext('Range type') :done :tag('th') :wikitext('Missile speed') :done :tag('th') :wikitext('Windup') :done :tag('th') :wikitext('Windup modifier') :done :done :newline elseif _stat == "Hitbox" then tablenode :tag('tr') :tag('th') :wikitext('Champion') :css('width', '180px') :done :tag('th') :wikitext('Gameplay radius') :done :tag('th') :wikitext('Selection radius') :done :tag('th') :wikitext('Pathing radius') :done :tag('th') :wikitext('Acquisition radius') :done :done :newline else tablenode :tag('tr') :tag('th') :wikitext('Champion') :css('width', '180px') :done :tag('th') :wikitext('Base') :done :tag('th') :wikitext('Growth coefficient') :done :tag('th') :wikitext('Value at 18') :done :done :newline end for champname in pairs(lolData) do       if              lolData[champname]["date"] == ("Upcoming" or "N/A" or "Cancelled" or "") or            champname == ("Rhaast" or "Shadow Assassin") 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 if champion == "Jhin" then tablerow :tag('td') :attr('data-sort-value', champion) :css('text-align', 'left') :wikitext(" " .. champion .. " note ") :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', champion) :css('text-align', 'left') :wikitext(' ' .. 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 = string.format("%0.1f", t["windup_modifier"]) end tablerow :tag('td') :attr('data-sort-value', champion) :css('text-align', 'left') :wikitext(' ' .. 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(' ' .. 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(' ' .. 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/ /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('Module: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 .. '-- \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 .. '-- \n' -- pre needs to be splitted with .. cause of Lua/Mediawiki weirdness

s = s .. '-- '   return 'Copy & paste data below to Module:StatTable/data/' .. o['version'] ..  ' ' .. s .. ' Copy & paste data above to Module: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('Module: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 .. '-- \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 ~= "" 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 ~= "" then s = s .. '   ["fullname"]   = "' .. fullname                       .. '",\n' end nickname = pst2(champname, "nickname") if 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 .. '-- \n' -- pre needs to be splitted with, because of Lua weirdness s = s .. '-- '   return ' ' .. mw.text.nowiki(s) .. ' ' end

function p.main(frame) -- deprecated local o           = mw.loadData('Module: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 .. '-- \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 ~= "" 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 ~= "" then s = s .. '   ["fullname"]   = "' .. fullname                       .. '",\n' end nickname = pst2(champname, "nickname") if 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 .. '-- \n' -- pre needs to be splitted with, because of Lua weirdness s = s .. '-- '   return ' ' .. mw.text.nowiki(s) .. ' ' 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 = { ["Catcher"]   = "Controller", ["Enchanter"] = "Controller", ["Diver"]     = "Fighter", ["Juggernaut"] = "Fighter", ["Battlemage"] = "Mage", ["Burst"]     = "Mage", ["Artillery"] = "Mage", ["Assassin"]  = "Slayer", ["Skirmisher"] = "Slayer", ["Vanguard"]  = "Tank", ["Warden"]    = "Tank", ["Marksman"]  = "", ["Specialist"] = "", }   local champname = args[1] or args['champname'] local get      = require ('Module: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('Module: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('Module:StatTable/data/' .. patchid) then return mw.loadData('Module: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 -- --