|
|
第1行: |
第1行: |
| -- <pre> | | -- <pre> |
| local p = {} | | --- Returns the static maintenance data. |
|
| | --- Used by [[Template:Current maintenance data]] |
| | --- Syntax: {{cmd|<keyword>}} or {{current maintenance data|<keyword>}} |
| | |
| | local p = {} |
| local lib = require('Module:Feature') | | local lib = require('Module:Feature') |
| local json = require('Module:JSON') | | local userError = require('Dev:User error') |
| local FN = require('Module:Filename') | | local keyword = mw.loadData('Module:Maintenance data/data') |
|
| |
|
| local statsdata = {
| | --% Entry point to use module |
| ["hp_base"] = "hp",
| | --@ frame (table) A scribunto frame |
| ["hp_lvl"] = "hpperlevel",
| | --: (string) The return content of the keyword or "N/A" |
| ["mp_base"] = "mp",
| | function p.main(frame) |
| ["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"
| |
| }
| |
| -- wrapper template Template:Current_champion_data / Template:Ccd | |
| function p.get(frame) | |
| local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end | | 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 s = keyword[args[1]] |
| args['champname'] = args['champname'] or args[1]
| | if s == nil then |
| args['datatype'] = args['datatype'] or args[2]
| | return userError("Unrecognized parameter: ''" .. args[1] .. "''", "LuaError") |
| args['output'] = args['output'] or args[3] or nil | |
|
| |
| args['champname'] = lib.validateName(args['champname']) --corrects for acceptable misspellings (e.g. Nunu -> Nunu & Willump)
| |
|
| |
| local result = get[args['datatype']](args['champname'])
| |
|
| |
| if args['output'] ~= nil and type(result) == "table" then
| |
| if args['output'] == "csv" then | |
| return lib.tbl_concat{result}
| |
| elseif args['output'] == "custom" then
| |
| return frame:preprocess(lib.tbl_concat{result, prepend = args['prepend'], append = args['append'], separator = args['separator'], index = args["index"]})
| |
| elseif args['output'] == "template" then
| |
| return frame:preprocess(lib.tbl_concat{result, prepend = "{{" .. args['t_name'] .. "|", append = "}}", separator = args['separator']})
| |
| elseif args['output'] == "category" then
| |
| return frame:preprocess(lib.tbl_concat{result, prepend = "[[Category:" .. (args['prepend'] or ""), append = (args['append'] or "") .. "]]", separator = args['separator'] or " "})
| |
| end
| |
| elseif result == nil then
| |
| return ""
| |
| else
| |
| return result
| |
| end | | end |
| end
| |
|
| |
| -- wrapper template Template:Champion_roster, Template:Champions
| |
| function p.getRoster()
| |
| local lolData = mw.loadData('Module:ChampionData/data')
| |
| local lolTable = {}
| |
| --local lorTable = {}
| |
| local s = ""
| |
| | | |
| for champname in pairs(lolData) do | | if type(s) == "table" then |
| if
| | return s[tonumber(args[2])] |
| lolData[champname]["date"] == ("Upcoming" or "N/A" or "Cancelled" or "")
| |
| or
| |
| champname == "Mega Gnar" or champname == "Rhaast" or champname == "Shadow Assassin" or champname == "Kled & Skaarl"
| |
| then
| |
| --ignore champion
| |
| else
| |
| table.insert(lolTable, champname)
| |
| end
| |
|
| |
| end
| |
| table.sort(lolTable)
| |
|
| |
| --lorTable = lorData.getRosters{}
| |
|
| |
| 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
| |
| | |
|
| |
| --if tftData.checkRoster{champion} then
| |
| -- if games ~= "" then games = games .. "," end
| |
| -- games = games .. "TFT," .. tftData.getTooltipSets{champion}
| |
| --end
| |
|
| |
| --for i, champname in pairs(lorTable) do
| |
| -- if champname == champion then
| |
| -- if games ~= "" then games = games .. "," end
| |
| -- games = games .. "LOR"
| |
| -- break;
| |
| -- end
| |
| --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=\'lol\' data-role="' .. role .. '" data-type="' .. rangetype .. '">[[File:' .. FN.championsquare{champion} .. '|46px|alt=' .. champion .. '|link=' .. champion .. '/LoL]]</span></li>'
| |
| end
| |
|
| |
| return s
| |
| end
| |
| | |
| function p.getPositions(frame)
| |
| local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
| |
|
| |
| args['champname'] = args['champname'] or args[1]
| |
|
| |
| local get = require ('Module:ChampionData/getter')
| |
| local riot_pos = get.positions(lib.validateName(args['champname']))
| |
| local op_pos = get.op_positions(lib.validateName(args['champname']))
| |
|
| |
| local sets = {}
| |
| local hash = {}
| |
|
| |
| for _, value in pairs(riot_pos) do
| |
| if (not hash[value]) then
| |
| table.insert(sets, value)
| |
| hash[value] = true
| |
| end
| |
| end
| |
|
| |
| for _, value in pairs(op_pos) do
| |
| if (not hash[value]) then
| |
| table.insert(sets, value)
| |
| hash[value] = true
| |
| end
| |
| end
| |
|
| |
| return sets
| |
| end
| |
| | |
| function p.getChampionCount(frame)
| |
| local lolData = mw.loadData('Module:ChampionData/data')
| |
| local i = 0
| |
| local skip = {
| |
| ["Mega Gnar"] = true, ["Kled & Skaarl"] = true, ["Rhaast"] = true, ["Shadow Assassin"] = true,
| |
| ["Upcoming"] = true, ["N/A"] = true, ["Cancelled"] = true, [""] = true,
| |
| }
| |
| for k, v in pairs(lolData) do
| |
| if not skip[k] and not skip[v["date"] or "Upcoming"] then
| |
| i = i + 1
| |
| end
| |
| end
| |
| return i
| |
| end
| |
| | |
| function p.statTable(frame)
| |
| local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
| |
|
| |
| args['datatype'] = args['datatype'] or args[1]
| |
| | |
| local IL = require('Module:ImageLink')
| |
| 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"
| |
| }
| |
| if args['datatype'] == "Base" then
| |
| tablenode
| |
| :addClass('sortable wikitable sticky-header')
| |
| :css('width', '100%')
| |
| :css('text-align', 'right')
| |
| :css('white-space', 'nowrap')
| |
| :newline()
| |
| elseif args['datatype'] == "Base 18" then
| |
| tablenode
| |
| :addClass('sortable wikitable sticky-header')
| |
| :css('width', '100%')
| |
| :css('text-align', 'center')
| |
| :css('white-space', 'nowrap')
| |
| :tag('caption')
| |
| :wikitext('Champion statistics at level 18 (without skill bonuses)')
| |
| :done()
| |
| :newline()
| |
| elseif args['datatype'] == "Manaless" then
| |
| tablenode
| |
| :addClass('sortable wikitable')
| |
| :css('width', '90%')
| |
| :css('text-align', 'center')
| |
| :css('white-space', 'nowrap')
| |
| :css('margin-left', '5%')
| |
| :newline()
| |
| elseif args['datatype'] == "Ratings" then
| |
| tablenode
| |
| :addClass('sortable article-table sticky-header')
| |
| :css('width', '100%')
| |
| :css('text-align', 'center')
| |
| :css('white-space', 'nowrap')
| |
| :newline()
| |
| else
| |
| tablenode
| |
| :addClass('sortable article-table sticky-header')
| |
| :css('width', '100%')
| |
| :css('text-align', 'center')
| |
| :newline()
| |
| end
| |
| if args['datatype'] == "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('Bonus AS at level 1')
| |
| :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 args['datatype'] == "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 args['datatype'] == "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()
| |
| elseif args['datatype'] == "Base" then
| |
| tablenode
| |
| :tag('tr')
| |
| :tag('th')
| |
| :wikitext('[[Champion]]s')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[Health|HP]]')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('HP+')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[Health regeneration|HP5]]')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('HP5+')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[Mana|MP]]')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('MP+')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[Mana regeneration|MP5]]')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('MP5+')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[Attack damage|AD]]')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('AD+')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[Attack speed|AS]]')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('AS+')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[Armor|AR]]')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('AR+')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[Magic resistance|MR]]')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('MR+')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[Movement speed|MS]]')
| |
| :css('width', '4em')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[Range]]')
| |
| :css('width', '4em')
| |
| :done()
| |
| :done()
| |
| :newline()
| |
| elseif args['datatype'] == "Base 18" then
| |
| tablenode
| |
| :tag('tr')
| |
| :tag('th')
| |
| :wikitext('Champion')
| |
| :css('color', 'black')
| |
| :css('background-color', 'white')
| |
| :done()
| |
| :tag('th')
| |
| :attr('data-sort-type', 'number')
| |
| :wikitext('HP')
| |
| :css('color', 'black')
| |
| :css('background-color', 'lightgreen')
| |
| :done()
| |
| :tag('th')
| |
| :attr('data-sort-type', 'number')
| |
| :wikitext('HP5')
| |
| :css('color', 'black')
| |
| :css('background-color', 'lightgreen')
| |
| :done()
| |
| :tag('th')
| |
| :attr('data-sort-type', 'number')
| |
| :wikitext('MP')
| |
| :css('color', 'black')
| |
| :css('background-color', 'lightblue')
| |
| :done()
| |
| :tag('th')
| |
| :attr('data-sort-type', 'number')
| |
| :wikitext('MP5')
| |
| :css('color', 'black')
| |
| :css('background-color', 'lightblue')
| |
| :done()
| |
| :tag('th')
| |
| :attr('data-sort-type', 'number')
| |
| :wikitext('AD')
| |
| :css('color', 'black')
| |
| :css('background-color', '#ffaaaa')
| |
| :done()
| |
| :tag('th')
| |
| :attr('data-sort-type', 'number')
| |
| :wikitext('AS')
| |
| :css('color', 'black')
| |
| :css('background-color', '#ffaaaa')
| |
| :done()
| |
| :tag('th')
| |
| :attr('data-sort-type', 'number')
| |
| :wikitext('AR')
| |
| :css('color', 'black')
| |
| :css('background-color', '#ffffaa')
| |
| :done()
| |
| :tag('th')
| |
| :attr('data-sort-type', 'number')
| |
| :wikitext('MR')
| |
| :css('color', 'black')
| |
| :css('background-color', '#ffffaa')
| |
| :done()
| |
| :tag('th')
| |
| :attr('data-sort-type', 'number')
| |
| :wikitext('Range')
| |
| :done()
| |
| :tag('th')
| |
| :attr('data-sort-type', 'number')
| |
| :wikitext('MS')
| |
| :done()
| |
| :done()
| |
| :newline()
| |
| elseif args['datatype'] == "Manaless" then
| |
| tablenode
| |
| :tag('tr')
| |
| :tag('th')
| |
| :wikitext('Champion')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('Secondary Resource')
| |
| :done()
| |
| :done()
| |
| :newline()
| |
| elseif args['datatype'] == "Ratings" then
| |
| tablenode
| |
| :tag('tr')
| |
| :tag('th')
| |
| :wikitext('Champion')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('Primary')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('Secondary')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[File:Damage rating.png|15px|link=]]')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[File:Toughness rating.png|15px|link=]]')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[File:Control rating.png|15px|link=]]')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[File:Mobility rating.png|15px|link=]]')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('[[File:Utility rating.png|15px|link=]]')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('Style')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext(frame:expandTemplate{title='sti', args={'Adaptive Damage',icononly='true'}})
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('Difficulty')
| |
| :done()
| |
| :done()
| |
| :newline()
| |
| else | | else |
| tablenode | | return s |
| :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 lolData[champname]["date"] == "N/A"
| |
| or lolData[champname]["date"] == "Cancelled"
| |
| or lolData[champname]["date"] == ""
| |
| or
| |
| champname == ("Rhaast" or "Shadow Assassin")
| |
| or
| |
| ((args['datatype'] == "Mana" or args['datatype'] == "Mana regen") and string.lower(lolData[champname]["resource"]) ~= "mana")
| |
| 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 args['datatype'] == "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", as_base / as_ratio * 100 - 100, 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')
| |
| :node(IL.champion{["champion"] = champion, ["circle"] = "true"})
| |
| :wikitext("<span title='Jhin's growth increases his base attack speed. He does not gain 'bonus attack speed'.'><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')
| |
| :node(IL.champion{["champion"] = champion, ["circle"] = "true"})
| |
| :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 - (as_base / as_ratio - 1) * 100, 3) .. "%")
| |
| :done()
| |
| :done()
| |
| end
| |
| elseif args['datatype'] == "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')
| |
| :node(IL.champion{["champion"] = champion, ["circle"] = "true"})
| |
| :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((math.floor(math.floor(windup*100*1000+0.5)/1000*100+0.5)/100) .. "%")
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(windup_mod)
| |
| :done()
| |
| :done()
| |
| elseif args['datatype'] == "Hitbox" then
| |
| tablerow
| |
| :tag('td')
| |
| :attr('data-sort-value', champion)
| |
| :css('text-align', 'left')
| |
| :node(IL.champion{["champion"] = champion, ["circle"] = "true"})
| |
| :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()
| |
| elseif args['datatype'] == "Base" then
| |
| local FD = require('Module:Fd')
| |
|
| |
| local hp_base = FD.get{["args"]={tostring(t["hp_base"])}}
| |
| local hp_lvl = FD.get{["args"]={tostring(t["hp_lvl"])}}
| |
| local hp5_base = FD.get{["args"]={tostring(t["hp5_base"])}}
| |
| local hp5_lvl = FD.get{["args"]={tostring(t["hp5_lvl"])}}
| |
| local mp_base = FD.get{["args"]={tostring(t["mp_base"])}}
| |
| local mp_lvl = FD.get{["args"]={tostring(t["mp_lvl"])}}
| |
| local mp5_base = FD.get{["args"]={tostring(t["mp5_base"])}}
| |
| local mp5_lvl = FD.get{["args"]={tostring(t["mp5_lvl"])}}
| |
| local dam_base = FD.get{["args"]={tostring(t["dam_base"])}}
| |
| local dam_lvl = FD.get{["args"]={tostring(t["dam_lvl"])}}
| |
| local as_base = FD.get{["args"]={tostring(t["as_base"])}}
| |
| local as_lvl = FD.get{["args"]={tostring(t["as_lvl"])}}
| |
| local arm_base = FD.get{["args"]={tostring(t["arm_base"])}}
| |
| local arm_lvl = FD.get{["args"]={tostring(t["arm_lvl"])}}
| |
| local mr_base = FD.get{["args"]={tostring(t["mr_base"])}}
| |
| local mr_lvl = FD.get{["args"]={tostring(t["mr_lvl"])}}
| |
| local ms = FD.get{["args"]={tostring(t["ms"])}}
| |
| local range = FD.get{["args"]={tostring(t["range"])}}
| |
|
| |
| tablerow
| |
| :tag('td')
| |
| :attr('data-sort-value', champion)
| |
| :css('text-align', 'left')
| |
| :node(IL.champion{["champion"] = champion, ["circle"] = "true"})
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(hp_base)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext('+' .. hp_lvl)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(hp5_base)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext('+' .. hp5_lvl)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(mp_base)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext('+' .. mp_lvl)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(mp5_base)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext('+' .. mp5_lvl)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(dam_base)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext('+' .. dam_lvl)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(as_base)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext('+' .. as_lvl .. '%')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(arm_base)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext('+' .. arm_lvl)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(mr_base)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext('+' .. mr_lvl)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(ms)
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(range)
| |
| :done()
| |
| :done()
| |
| elseif args['datatype'] == "Base 18" then
| |
| local FD = require('Module:Fd')
| |
|
| |
| local hp_base = tonumber(t["hp_base"])
| |
| local hp_lvl = tonumber(t["hp_lvl"])
| |
| local hp_18 = FD.get{["args"]={tostring(hp_base + hp_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
| |
| local hp5_base = tonumber(t["hp5_base"])
| |
| local hp5_lvl = tonumber(t["hp5_lvl"])
| |
| local hp5_18 = FD.get{["args"]={tostring(hp5_base + hp5_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
| |
| local mp_base = tonumber(t["mp_base"])
| |
| local mp_lvl = tonumber(t["mp_lvl"])
| |
| local mp_18 = FD.get{["args"]={tostring(mp_base + mp_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
| |
| local mp5_base = tonumber(t["mp5_base"])
| |
| local mp5_lvl = tonumber(t["mp5_lvl"])
| |
| local mp5_18 = FD.get{["args"]={tostring(mp5_base + mp5_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
| |
| local dam_base = tonumber(t["dam_base"])
| |
| local dam_lvl = tonumber(t["dam_lvl"])
| |
| local dam_18 = FD.get{["args"]={tostring(dam_base + dam_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
| |
| local as_base = tonumber(t["as_base"])
| |
| local as_ratio = tonumber(t["as_ratio"])
| |
| local as_lvl = tonumber(t["as_lvl"])
| |
| local bonus_as_18 = 0 + as_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1))
| |
| local as_18 = string.format("%0.3f", as_base + as_ratio * (bonus_as_18 / 100), 3)
| |
| if champion == "Jhin" then as_18 = string.format("%0.3f", as_base + as_base * (bonus_as_18 / 100), 3) end
| |
| as_18 = FD.get{["args"]={as_18}}
| |
|
| |
| local arm_base = tonumber(t["arm_base"])
| |
| local arm_lvl = tonumber(t["arm_lvl"])
| |
| local arm_18 = FD.get{["args"]={tostring(arm_base + arm_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
| |
| local mr_base = tonumber(t["mr_base"])
| |
| local mr_lvl = tonumber(t["mr_lvl"])
| |
| local mr_18 = FD.get{["args"]={tostring(mr_base + mr_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
| |
| local range = FD.get{["args"]={tostring(t["range"])}}
| |
| local ms = FD.get{["args"]={tostring(t["ms"])}}
| |
|
| |
|
| |
|
| |
| local resource = lolData[champion]["resource"]
| |
| if resource == "Rage"
| |
| or resource == "Heat"
| |
| or resource == "Grit"
| |
| or resource == "Fury"
| |
| or resource == "Shield"
| |
| or resource == "Bloodthirst"
| |
| or resource == "Courage"
| |
| or resource == "Health"
| |
| or resource == "Flow"
| |
| or resource == "Soul Unbound"
| |
| or resource == "Ferocity"
| |
| or resource == "Energy"
| |
| or resource == "None" then
| |
| mp_18 = '-'
| |
| mp5_18 = '-'
| |
| end
| |
|
| |
| tablerow
| |
| :tag('td')
| |
| :attr('data-sort-value', champion)
| |
| :css('text-align', 'left')
| |
| :node(IL.champion{["champion"] = champion, ["circle"] = "true"})
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(hp_18)
| |
| :css('color', 'lightgreen')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(hp5_18)
| |
| :css('color', 'lightgreen')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(mp_18)
| |
| :css('color', 'lightblue')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(mp5_18)
| |
| :css('color', 'lightblue')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(dam_18)
| |
| :css('color', '#ffaaaa')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(as_18)
| |
| :css('color', '#ffaaaa')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(arm_18)
| |
| :css('color', '#ffffaa')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(mr_18)
| |
| :css('color', '#ffffaa')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(range)
| |
| :css('color', '#ffffff')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(ms)
| |
| :css('color', '#ffffff')
| |
| :done()
| |
| :done()
| |
| elseif args['datatype'] == "Manaless" then -- Rage, Heat, Grit, Fury, Mana, Shield, Bloodthirst, Courage, Health, Flow, Soul Unbound,Ferocity, Energy, None -- as of 8/20/2020
| |
| local resource = lolData[champion]["resource"]
| |
| if resource ~= "Mana" then
| |
| local resource_msg
| |
| if resource == nil then resource = "None" end
| |
| if resource == "Flow"
| |
| or resource == "Soul Unbound"
| |
| or resource == "None" then
| |
| resource_msg = "''[[Manaless]] champion (uses '''no secondary resource''')''"
| |
| elseif resource == "Bloodthirst" then
| |
| resource_msg = "''[[Manaless]] champion (uses '''[[Manaless#Health|health]]''', '''[[Manaless#Fury|" .. mw.ustring.lower(resource) .. "]]''')''"
| |
| elseif resource == "Grit" then
| |
| resource_msg = "''[[Manaless]] champion (uses '''[[Manaless#Fury|" .. mw.ustring.lower(resource) .. "]]''')''"
| |
| elseif resource == "Energy" then
| |
| resource_msg = "''[[Manaless]] champion (uses '''[[" .. mw.ustring.lower(resource) .. "]]''')''"
| |
| elseif resource == "Shield"then
| |
| resource_msg = "''[[Manaless]] champion (uses '''[[Manaless#Flow|" .. mw.ustring.lower(resource) .. "]]''')''"
| |
| else
| |
| resource_msg = "''[[Manaless]] champion (uses '''[[Manaless#" .. resource .. "|" .. mw.ustring.lower(resource) .. "]]''')''"
| |
| end
| |
| tablerow
| |
| :tag('td')
| |
| :attr('data-sort-value', champion)
| |
| :css('text-align', 'left')
| |
| :node(IL.champion{["champion"] = champion, ["circle"] = "true"})
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(resource_msg)
| |
| :done()
| |
| else
| |
| tablerow = nil
| |
| end
| |
| elseif args['datatype'] == "Ratings" then
| |
| local role = lolData[champion]['role']
| |
| local primary = role[1]
| |
| local secondary = role[2]
| |
| local damage = lolData[champion]['damage']
| |
| local toughness = lolData[champion]['toughness']
| |
| local control = lolData[champion]['control']
| |
| local mobility = lolData[champion]['mobility']
| |
| local utility = lolData[champion]['utility']
| |
| local style = lolData[champion]['style']
| |
| local adaptivetype = mw.ustring.lower(lolData[champion]['adaptivetype'])
| |
| local difficulty = lolData[champion]['difficulty']
| |
|
| |
| local primary_msg = ''
| |
| if primary ~= nil then
| |
| primary_msg = frame:expandTemplate{title="tip", args={primary}}
| |
| else
| |
| primary = ''
| |
| end
| |
| local secondary_msg = ''
| |
| if secondary ~= nil then
| |
| secondary_msg = frame:expandTemplate{title="tip", args={secondary}}
| |
| else
| |
| secondary = ''
| |
| end
| |
| local damage_msg = damage
| |
| local toughness_msg = toughness
| |
| local control_msg = control
| |
| local mobility_msg = mobility
| |
| local utility_msg = utility
| |
| local style_msg = frame:expandTemplate{title="Champion style", args={style, size="100px"}}
| |
| local adaptivetype_msg;
| |
| if adaptivetype == "magic" then
| |
| adaptivetype_msg = "Magic"
| |
| elseif adaptivetype == "physical" then
| |
| adaptivetype_msg = "Physical"
| |
| else
| |
| -- adaptivetype_msg = frame:expandTemplate{title="pending for test"} .. " " .. frame:expandTemplate{title="edit", args={"Module:ChampionData/data"}}
| |
| adaptivetype_msg = "Physical" -- default physical
| |
| end
| |
| local difficulty_msg = difficulty
| |
| | |
|
| |
| tablerow
| |
| :tag('td')
| |
| :attr('data-sort-value', champion)
| |
| :css('text-align', 'left')
| |
| :css('padding', '1px')
| |
| :node(IL.champion{["champion"] = champion, ["circle"] = "true"})
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(primary_msg)
| |
| :attr('data-sort-value', primary)
| |
| :css('text-align', 'left')
| |
| :css('padding', '1px')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(secondary_msg)
| |
| :attr('data-sort-value', secondary)
| |
| :css('text-align', 'left')
| |
| :css('padding', '1px')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(damage_msg)
| |
| :attr('bgcolor', '#420300')
| |
| :css('padding', '1px')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(toughness_msg)
| |
| :attr('bgcolor', '#102E00')
| |
| :css('padding', '1px')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(control_msg)
| |
| :attr('bgcolor', '#30004C')
| |
| :css('padding', '1px')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(mobility_msg)
| |
| :attr('bgcolor', '#000A4C')
| |
| :css('padding', '1px')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(utility_msg)
| |
| :attr('bgcolor', '#5d4407')
| |
| :css('padding', '1px')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(style_msg)
| |
| :attr('data-sort-value', style)
| |
| :css('padding', '1px')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(adaptivetype_msg)
| |
| :attr('data-sort-value', adaptivetype)
| |
| :css('padding', '1px')
| |
| :done()
| |
| :tag('td')
| |
| :wikitext(difficulty_msg)
| |
| :css('padding', '1px')
| |
| :done()
| |
| else
| |
| local _base = tonumber(t[convert[args['datatype']] .. "_base"])
| |
| local _lvl = tonumber(t[convert[args['datatype']] .. "_lvl"])
| |
|
| |
| tablerow
| |
| :tag('td')
| |
| :attr('data-sort-value', champion)
| |
| :css('text-align', 'left')
| |
| :node(IL.champion{["champion"] = champion, ["circle"] = "true"})
| |
| :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
| |
| if tablerow ~= nil then
| |
| tablenode
| |
| :node(tablerow)
| |
| :newline()
| |
| end
| |
| end
| |
|
| |
| tablenode:allDone()
| |
|
| |
| return tostring(tablenode)
| |
| end
| |
| | |
| -- wrapper template Template:Grouped_stat_table
| |
| function p.groupedStatTable(frame)
| |
| local args; if frame.args == nil then args = lib.arguments(frame) else
| |
| if frame:getParent().args ~= nil then args = lib.arguments(lib.mergeFrames(frame, frame:getParent())) else args = lib.arguments(frame.args) end
| |
| end
| |
|
| |
| args['datatype'] = args['datatype'] or args[1]
| |
| args['label'] = args['label'] or args[2]
| |
| args['filter'] = args['filter'] or args[3]
| |
| local lolData = mw.loadData('Module:ChampionData/data')
| |
| local get = require('Module:ChampionData/getter')
| |
| local IL = require('Module:ImageLink')
| |
|
| |
| local threshold3col = tonumber(args['3col']) or 12
| |
| local threshold2col = tonumber(args['2col']) or 8
| |
|
| |
| local statTable = {}
| |
| -- standard entries with note
| |
| for champion in pairs(lolData) do
| |
| -- filter
| |
| local releasedate = get["date"](champion)
| |
| if releasedate== "Upcoming" or
| |
| releasedate == "N/A" or
| |
| releasedate == "Cancelled" or
| |
| releasedate == "" then
| |
| --ignore champion
| |
| elseif args['datatype'] == 'range' and get['rangetype'](champion) ~= args['filter'] then -- do nothing
| |
| elseif args[champion .. '_o'] then -- do nothing
| |
| else
| |
| local v = get[args['datatype']](champion)
| |
| if v == nil then
| |
| else
| |
| if statTable[v] == nil then statTable[v] = {} end
| |
| local displaystring = {tostring(IL.champion{
| |
| ["champion"] = champion,
| |
| -- ["circle"] = "true",
| |
| })}
| |
| if args[champion .. '_m'] then
| |
| displaystring[#displaystring + 1] = ' '
| |
| displaystring[#displaystring + 1] = args[champion .. '_m']
| |
| end
| |
| if args[champion .. '_n'] then
| |
| displaystring[#displaystring + 1] = ' <span title="'
| |
| displaystring[#displaystring + 1] = args[champion .. '_n']
| |
| displaystring[#displaystring + 1] = '"><sup>note</sup></span>'
| |
| end
| |
| statTable[v][champion] = table.concat(displaystring)
| |
| end
| |
| end
| |
| end
| |
| -- custom/manual entries
| |
| local function customparams_iter(t)
| |
| local i = 0
| |
| local n = 0
| |
| for i, _ in pairs(t) do
| |
| n = n + 1
| |
| end
| |
| return function ()
| |
| i = i + 1
| |
| if i <= n and (t['c' .. i .. 'c'] or t['c' .. i .. 'm']) and t['c' .. i .. 'v'] then
| |
| return t['c' .. i .. 'c'] or '', t['c' .. i .. 'm'] or '', t['c' .. i ..'n'] or '', t['c' .. i .. 'v']
| |
| else
| |
| return nil
| |
| end
| |
| end
| |
| end
| |
| for champion, modifier, note, value in customparams_iter(args) do
| |
| local v = tonumber(value)
| |
| local displaystring = {}
| |
| if champion ~= '' then
| |
| displaystring[#displaystring + 1] = tostring(IL.champion{
| |
| ["champion"] = champion,
| |
| -- ["circle"] = "true",
| |
| })
| |
| end
| |
| if modifier ~= '' then
| |
| if champion ~= '' then
| |
| displaystring[#displaystring + 1] = ' '
| |
| end
| |
| displaystring[#displaystring + 1] = modifier
| |
| end
| |
| if note ~= '' then
| |
| displaystring[#displaystring + 1] = ' <span title="'
| |
| displaystring[#displaystring + 1] = note
| |
| displaystring[#displaystring + 1] = '"><sup>note</sup></span>'
| |
| end
| |
| if statTable[v] == nil then statTable[v] = {} end
| |
| if champion ~= '' then
| |
| statTable[v][champion] = table.concat(displaystring)
| |
| else
| |
| statTable[v][modifier] = table.concat(displaystring)
| |
| end
| |
| end
| |
|
| |
| -- table header row
| |
| local tablenode = mw.html.create('table')
| |
| tablenode
| |
| :addClass('wikitable')
| |
| :css('width', '100%')
| |
| :newline()
| |
| tablenode
| |
| :tag('tr')
| |
| :tag('th')
| |
| :wikitext(args['label'] or args['datatype'])
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('Champion')
| |
| :done()
| |
| -- :tag('th')
| |
| -- :wikitext('Notes')
| |
| -- :done()
| |
| :done()
| |
| :newline()
| |
|
| |
| -- sorting and table rows
| |
| local optionTable = {}
| |
| for option in pairs(statTable) do
| |
| table.insert(optionTable, option)
| |
| end
| |
| table.sort(optionTable, function(a,b) return a > b end)
| |
| for _, option in ipairs(optionTable) do
| |
| local tablerow = mw.html.create('tr')
| |
| local champcell = tablerow
| |
| :tag('td')
| |
| :css('text-align', 'center')
| |
| if option == tonumber('inf') then
| |
| champcell:wikitext('∞')
| |
| else
| |
| champcell:wikitext(option)
| |
| end
| |
| champcell = champcell
| |
| :done()
| |
| :newline()
| |
| :tag('td')
| |
| :tag('div')
| |
| :addClass('columntemplate')
| |
| :css('margin','0.4em 0 0.4em 0')
| |
| local championTable = {}
| |
| for champion in pairs(statTable[option]) do
| |
| table.insert(championTable, champion)
| |
| end
| |
| table.sort(championTable)
| |
| if #championTable >= threshold3col then
| |
| champcell
| |
| :css('column-count', 3)
| |
| :css('-webkit-column-count', 3)
| |
| :css('-moz-column-count', 3)
| |
| elseif #championTable >= threshold2col then
| |
| champcell
| |
| :css('column-count', 2)
| |
| :css('-webkit-column-count', 2)
| |
| :css('-moz-column-count', 2)
| |
| end
| |
| champcell = champcell
| |
| :tag('ul')
| |
| for _, champion in ipairs(championTable) do
| |
| champcell
| |
| :tag('li')
| |
| :wikitext(statTable[option][champion])
| |
| :newline()
| |
| end
| |
| tablenode
| |
| :node(tablerow)
| |
| :newline()
| |
| end
| |
| return tostring(tablenode)
| |
| end
| |
| | |
| -- wrapper template Template:List_of_champion_abilities
| |
| function p.abilitiesList(frame)
| |
| local args; if frame.args == nil then args = lib.arguments(frame) else
| |
| if frame:getParent().args ~= nil then args = lib.arguments(lib.mergeFrames(frame, frame:getParent())) else args = lib.arguments(frame.args) end
| |
| end
| |
| local lolData = mw.loadData('Module:ChampionData/data')
| |
| local IL = require('Module:ImageLink')
| |
|
| |
| local param = args[1] or args['parameter'] or nil
| |
| local value = args[2] or args['value'] or ''
| |
| local compare = args['compare'] or nil
| |
| local ignorecase = args['noignorecase'] ~= 'true'
| |
| if value and ignorecase then value = string.lower(value) end
| |
| local outformat = args['format'] or args['output'] or nil
| |
| local paramDisplayName = args['label'] or nil
| |
| local edit = args['edit'] == 'true'
| |
|
| |
| local ret = ""
| |
| if outformat == 'bullet' or outformat == 'combinedbullet' then
| |
| ret = mw.html.create('ul')
| |
| elseif outformat == 'table' then
| |
| ret = mw.html.create('table')
| |
| ret
| |
| :addClass('sortable wikitable sticky-header')
| |
| :css('width', '100%')
| |
| --:css('text-align', 'right')
| |
| :css('white-space', 'nowrap')
| |
| :newline()
| |
| local temp = ret
| |
| :tag('tr')
| |
| :tag('th')
| |
| :wikitext('Champion')
| |
| --:css('width', '180px')
| |
| --:attr('class', 'unsortable')
| |
| :done()
| |
| :tag('th')
| |
| :wikitext('Ability')
| |
| --:attr('class', 'unsortable')
| |
| :done()
| |
| if param then
| |
| temp
| |
| :tag('th')
| |
| :wikitext(paramDisplayName or param)
| |
| :done()
| |
| end
| |
| temp
| |
| :done()
| |
| :newline()
| |
| end | | end |
| local sortedChamps = {}
| |
| for champname in pairs(lolData) do
| |
| local release = lolData[champname]["date"]
| |
| if release == "Upcoming"
| |
| or release == "N/A"
| |
| or release == "Cancelled"
| |
| or release == ""
| |
| or champname == "Mega Gnar"
| |
| or champname == "Rhaast"
| |
| or champname == "Shadow Assassin"
| |
| or champname == "Kled & Skaarl"
| |
| then
| |
| --ignore champion
| |
| --skip
| |
| else
| |
| table.insert(sortedChamps, champname)
| |
| end
| |
| end
| |
| table.sort(sortedChamps)
| |
| for _, champname in ipairs(sortedChamps) do
| |
| local abilities = lolData[champname]["skills"]
| |
| local count = 0
| |
| local matched = {}
| |
| local dataprobes = {}
| |
| if param then
| |
| for _, ability in ipairs(abilities) do
| |
| local probe = mw.text.trim(frame:expandTemplate{title = "Data_" .. champname .. "/" .. ability, args = {"pst2", param}})
| |
| dataprobes[ability] = probe
| |
| if ignorecase then probe = string.lower(probe) end
| |
| if (not compare or compare == "equals" and probe == value)
| |
| or compare == "not equals" and probe ~= value
| |
| or compare == "exists" and probe ~= "{{{" .. param .. "}}}"
| |
| or compare == "exists and not empty" and (probe ~= "{{{" .. param .. "}}}" and probe ~= "")
| |
| or compare == "exists and not equals" and (probe ~= "{{{" .. param .. "}}}" and probe ~= value)
| |
| or compare == "exists and not empty and not equals" and (probe ~= "{{{" .. param .. "}}}" and probe ~= "" and probe ~= value)
| |
| or compare == "exists and not empty and not contains" and (probe ~= "{{{" .. param .. "}}}" and probe ~= "" and not string.find(probe, value))
| |
| or compare == "contains" and string.find(probe, value)
| |
| then
| |
| count = count + 1
| |
| table.insert(matched, ability)
| |
| end
| |
| end
| |
| else
| |
| matched = abilities
| |
| for _, ability in ipairs(abilities) do
| |
| count = count + 1
| |
| end
| |
| end
| |
| -- output
| |
| if outformat == 'bullet' then
| |
| for _, ability in ipairs(matched) do
| |
| local item = ret:tag('li')
| |
| if edit then
| |
| item
| |
| :node(IL.champion{args={['champion'] = champname, ['possessive'] = 'true'}})
| |
| :wikitext(" ")
| |
| :node(IL.ability{args={['champion'] = champname, ['ability'] = ability, ['edit'] = 'true'}})
| |
| :done()
| |
| :newline()
| |
| else
| |
| item
| |
| :node(IL.champion{args={['champion'] = champname, ['possessive'] = 'true'}})
| |
| :wikitext(" ")
| |
| :node(IL.ability{args={['champion'] = champname, ['ability'] = ability}})
| |
| :done()
| |
| :newline()
| |
| end
| |
| end
| |
| elseif outformat == 'combinedbullet' then
| |
| if count > 0 then
| |
| local item = ret:tag('li')
| |
| item
| |
| :node(IL.champion{args={['champion'] = champname, ['possessive'] = 'true'}})
| |
| :wikitext(" ")
| |
| if count == 1 then
| |
| for i, ability in ipairs(matched) do
| |
| if edit then
| |
| item:node(IL.ability{args={['champion'] = champname, ['ability'] = ability, ['edit'] = 'true'}})
| |
| else
| |
| item:node(IL.ability{args={['champion'] = champname, ['ability'] = ability}})
| |
| end
| |
| end
| |
| elseif count == 2 then
| |
| for i, ability in ipairs(matched) do
| |
| if edit then
| |
| item:node(IL.ability{args={['champion'] = champname, ['ability'] = ability, ['edit'] = 'true'}})
| |
| else
| |
| item:node(IL.ability{args={['champion'] = champname, ['ability'] = ability}})
| |
| end
| |
| if i == count - 1 then
| |
| item:wikitext(" and ")
| |
| end
| |
| end
| |
| else
| |
| for i, ability in ipairs(matched) do
| |
| if edit then
| |
| item:node(IL.ability{args={['champion'] = champname, ['ability'] = ability, ['edit'] = 'true'}})
| |
| else
| |
| item:node(IL.ability{args={['champion'] = champname, ['ability'] = ability}})
| |
| end
| |
| if i < count then
| |
| item:wikitext(", ")
| |
| end
| |
| if i == count - 1 then
| |
| item:wikitext("and ")
| |
| end
| |
| end
| |
| end
| |
| ret
| |
| :newline()
| |
| end
| |
| elseif outformat == 'table' then
| |
| for i, ability in ipairs(matched) do
| |
| local tablerow = mw.html.create('tr')
| |
| if i == 1 then
| |
| tablerow
| |
| :tag('td')
| |
| :node(IL.champion{args={['champion'] = champname}})
| |
| :attr('data-sort-value', champname)
| |
| :attr('rowspan', count)
| |
| :done()
| |
| end
| |
|
| |
| if edit then
| |
| tablerow
| |
| :tag('td')
| |
| :node(IL.ability{args={['champion'] = champname, ['ability'] = ability, ['edit'] = 'true'}})
| |
| :attr('data-sort-value', i)
| |
| :done()
| |
| else
| |
| tablerow
| |
| :tag('td')
| |
| :node(IL.ability{args={['champion'] = champname, ['ability'] = ability}})
| |
| :attr('data-sort-value', i)
| |
| :done()
| |
| end
| |
| if param then
| |
| local probe = dataprobes[ability]
| |
| tablerow
| |
| :tag('td')
| |
| :wikitext(probe)
| |
| :attr('data-sort-value', probe)
| |
| :done()
| |
| :done()
| |
| end
| |
| ret
| |
| :node(tablerow)
| |
| :newline()
| |
| end
| |
| else
| |
| for _, ability in ipairs(matched) do
| |
| ret = ret .. "* " .. champname .. " " .. ability .. "\n"
| |
| end
| |
| end
| |
| end
| |
| return tostring(ret)
| |
| end
| |
|
| |
| function p.abilitytochampion(frame)
| |
| local args = lib.arguments(frame.args)
| |
|
| |
| local searchedability = args[1] or args['ability'] or ''
| |
|
| |
| local lolData = mw.loadData('Module:ChampionData/data')
| |
| local wrData = mw.loadData('Module:ChampionDataWR/data')
| |
| local sortedChamps = {}
| |
| local abilitytable = {}
| |
|
| |
| -- creates list with all champions
| |
| for champname in pairs(lolData) do
| |
| local release = lolData[champname]["date"]
| |
| if champname == "Mega Gnar"
| |
| or champname == "Rhaast"
| |
| or champname == "Shadow Assassin"
| |
| or champname == "Kled & Skaarl"
| |
| then
| |
| --ignore champion
| |
| --skip
| |
| else
| |
| table.insert(sortedChamps, champname)
| |
| end
| |
| end
| |
| table.sort(sortedChamps)
| |
|
| |
| --compares the searched ability with the abilities of every champion in lol and wr
| |
| for _,champname in ipairs(sortedChamps) do
| |
| local lolabilities = lolData[champname]["skills"]
| |
| local wrabilities
| |
| if wrData[champname] then
| |
| wrabilities = wrData[champname]["skills"]
| |
| end
| |
|
| |
| for _,ability in ipairs(lolabilities) do
| |
| if ability == searchedability then
| |
| if champname == "Nunu & Willump" then return "Nunu"
| |
| else return champname
| |
| end
| |
| end
| |
| end
| |
|
| |
| if wrabilities then
| |
| for _,ability in ipairs(wrabilities) do
| |
| if ability == searchedability then
| |
| return champname
| |
| end
| |
| end
| |
| end
| |
| end
| |
| end
| |
|
| |
| -- give this template a filename containing a champion, e.g. Aatrox World Ender.png, and it will return the name of the champion
| |
| function p.filenametochampion(frame)
| |
| local args = lib.arguments(frame.args)
| |
| local cd_load = mw.loadData('Module:ChampionData/data')
| |
| local searchstr = args[1] or ''
| |
| local cd = {"Ao Shin", "Avasha", "Averdrian", "CeeCee", "Cyborg Cowboy", "Eagle Rider", "Gavid", "Iron Engineer", "Ivan", "Omen", "Priscilla", "Rob Blackblade", "Seth", "Tabu", "Tiki", "Well"}--removed champs
| |
| for champ,_ in pairs(cd_load) do cd[#cd+1] = champ end
| |
|
| |
| for _,k in ipairs(cd) do --k is championname
| |
| if k == "Nunu & Willump" then
| |
| k = "Nunu"
| |
| end
| |
| i,j = string.find(searchstr,k.." ")
| |
| if i then return k end
| |
| end
| |
| return "Error: No champion found!"
| |
| end
| |
|
| |
| function p.abilityverify(frame)
| |
| local args = lib.arguments(frame.args)
| |
| local cd = mw.loadData('Module:ChampionData/data')
| |
| local s_ability = args[1] or args['ability'] or ''
| |
| local s_champion = args[2] or args['champion'] or ''
| |
|
| |
| s_champion = lib.validateName(s_champion)
| |
|
| |
|
| |
| local v = cd[s_champion]
| |
| local spells = {}
| |
|
| |
| for i,j in pairs(v.skill_i) do spells[#spells+1] = j end
| |
| for i,j in pairs(v.skill_q) do spells[#spells+1] = j end
| |
| for i,j in pairs(v.skill_w) do spells[#spells+1] = j end
| |
| for i,j in pairs(v.skill_e) do spells[#spells+1] = j end
| |
| for i,j in pairs(v.skill_r) do spells[#spells+1] = j end
| |
| for i,j in pairs(v.skills) do spells[#spells+1] = j end
| |
|
| |
| for a,b in pairs(spells) do
| |
| if s_ability == b then
| |
| return "true"
| |
| end
| |
| end
| |
| return "false"
| |
| 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 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 .. ' ["nb_dmg_dealt"] = ' .. p.get{t['name'], "nb_dmg_dealt"} .. ',\n'
| |
| s = s .. ' ["nb_dmg_taken"] = ' .. p.get{t['name'], "nb_dmg_taken"} .. ',\n'
| |
| s = s .. ' ["nb_healing"] = ' .. p.get{t['name'], "nb_healing"} .. ',\n'
| |
| s = s .. ' ["nb_shielding"] = ' .. p.get{t['name'], "nb_shielding"} .. ',\n'
| |
| s = s .. ' ["ofa_dmg_dealt"] = ' .. p.get{t['name'], "ofa_dmg_dealt"} .. ',\n'
| |
| s = s .. ' ["ofa_dmg_taken"] = ' .. p.get{t['name'], "ofa_dmg_taken"} .. ',\n'
| |
| s = s .. ' ["ofa_healing"] = ' .. p.get{t['name'], "ofa_healing"} .. ',\n'
| |
| s = s .. ' ["ofa_shielding"] = ' .. p.get{t['name'], "ofa_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 .. ' ["usb_dmg_dealt"] = ' .. p.get{t['name'], "usb_dmg_dealt"} .. ',\n'
| |
| s = s .. ' ["usb_dmg_taken"] = ' .. p.get{t['name'], "usb_dmg_taken"} .. ',\n'
| |
| s = s .. ' ["usb_healing"] = ' .. p.get{t['name'], "usb_healing"} .. ',\n'
| |
| s = s .. ' ["usb_shielding"] = ' .. p.get{t['name'], "usb_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 [[Module:StatTable/data/' .. o['version'] .. ']]<pre>' .. s .. '</pre>Copy & paste data above to [[Module:StatTable/data/' .. o['version'] .. ']]'
| |
| 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"] = "",
| |
| }
| |
|
| |
| args['champname'] = args['champname'] or args[1]
| |
| local get = require ('Module:ChampionData/getter')
| |
| local role = get.role(args['champname'])
| |
| local s = ""
| |
|
| |
| for i, subrole in pairs(role) do
| |
| if i ~= 1 then
| |
| s = s .. ","
| |
| end
| |
| if parentroletable[subrole] ~= nil then
| |
| s = s .. parentroletable[subrole]
| |
| end
| |
| end
| |
|
| |
| return s
| |
| end
| |
|
| |
| function p.positioncategory(frame)
| |
| local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
| |
|
| |
| local category = {
| |
| ["Top"] = "[[" .. "Category:" .. "Top champion]]",
| |
| ["Jungle"] = "[[" .. "Category:" .. "Jungle champion]]",
| |
| ["Middle"] = "[[" .. "Category:" .. "Middle champion]]",
| |
| ["Bottom"] = "[[" .. "Category:" .. "Bottom champion]]",
| |
| ["Support"] = "[[" .. "Category:" .. "Support champion]]"
| |
| }
| |
|
| |
| args['champname'] = args['champname'] or args[1]
| |
| local get = require ('Module:ChampionData/getter')
| |
| local riot_pos = get.positions(lib.validateName(args['champname']))
| |
| local op_pos = get.op_positions(lib.validateName(args['champname']))
| |
| local s = ""
| |
|
| |
| for i, subpos in pairs(riot_pos) do
| |
| s = s .. category[subpos]
| |
| end
| |
|
| |
| for i, subpos in pairs(op_pos) do
| |
| s = s .. category[subpos]
| |
| end
| |
|
| |
| return s
| |
| end | | end |
|
| |
|