Die Dokumentation für dieses Modul kann unter Modul:Champion/Doku erstellt werden
-- <pre>
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",
["res_base"] = "res",
["res_lvl"] = "resperlevel",
["ms"] = "movespeed",
["armor_base"] = "armor",
["armor_lvl"] = "armorperlevel",
["mr_base"] = "spellblock",
["mr_lvl"] = "spellblockperlevel",
["range"] = "attackrange",
["hp5_base"] = "hpregen",
["hp5_lvl"] = "hpregenperlevel",
["res5_base"] = "resregen",
["res5_lvl"] = "resregenperlevel",
["ad_base"] = "attackdamage",
["ad_lvl"] = "attackdamageperlevel",
["as_lvl"] = "attackspeedperlevel",
["as_lvl1"] = "attackspeed"
}
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
local result
if champname == "anzahl_champions" or datatype == "anzahl_champions" then
return get.anzahl_champions()
end
champname = lib.validateName(champname) --corrects for acceptable misspellings (e.g. Nunu -> Nunu & Willump)
if champname == "Rhaast" or champname == "Schattenassassine" then
result = (get[datatype](champname) or get[datatype]("Kayn"))
elseif champname == "Mega-Gnar" then
result = get[datatype](champname) or get[datatype]("Gnar")
else
result = get[datatype](champname)
end
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('Module:ChampionData/data')
--local tftData = require('Module:TFTUnitData')
local lolTable = {}
local s = ""
for champname in pairs(lolData) do
if
lolData[champname]["date"] == ("Kommend" or "N/A" or "Verworfen" or "")
or
champname == "Mega-Gnar" or champname == "Rhaast" or champname == "Schattenassassine" or champname == "Kled & Skaarl"
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{champname=champion} .. "," .. p.get{champion, "role", "csv"}
local rangetype = lolData[champion]["rangetype"]
s = s .. '<li><span class="grid-icon character-icon" data-character="' .. champion .. '" data-search="' .. search .. '" data-game="' .. games .. '" data-role="' .. role .. '" data-type="' .. rangetype .. '">[[File:' .. FN.championcircle{champion} .. '|56px|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('Modul:ChampionData/data')
local lolTable = require('Modul:ChampionData/getter').sortedList()
local tablenode = mw.html.create('table')
local convert = {
["Health"] = "hp",
["Health regen"] = "hp5",
["Mana"] = "res",
["Mana regen"] = "res5",
["Armor"] = "armor",
["Magic resist"] = "mr",
["Attack damage"] = "ad",
["Move speed"] = "ms",
["Attack speed"] = "as"
}
if _stat == "Base" then
tablenode
:addClass('sortable wikitable sticky-header')
:css('width', '100%')
:css('text-align', 'right')
:css('white-space', 'nowrap')
:newline()
elseif _stat == "Base 18" then
tablenode
:addClass('sortable wikitable sticky-header')
:css('width', '100%')
:css('text-align', 'center')
:css('white-space', 'nowrap')
:tag('caption')
:wikitext('Championgrundwerte auf Stufe 18')
:done()
:newline()
elseif _stat == "Manalos" then
tablenode
:addClass('sortable wikitable')
:css('width', '90%')
:css('text-align', 'center')
:css('white-space', 'nowrap')
:css('margin-left', '5%')
:newline()
elseif _stat == "Bewertungen" 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 _stat == "Attack speed" then
tablenode
:tag('tr')
:tag('th')
:wikitext('Champion')
:css('width', '180px')
:done()
:tag('th')
:wikitext('Grundwert')
:done()
:tag('th')
:wikitext('Skalierung')
:done()
:tag('th')
:wikitext('Bonus-AS auf Stufe 1')
:done()
:tag('th')
:wikitext('Bonus growth coefficient')
:done()
:tag('th')
:wikitext('Bonus auf Stufe 18')
:done()
:tag('th')
:wikitext('Wert auf Stufe 18')
:done()
:tag('th')
:wikitext('Zusätzliches AS benötigt, um Deckel auf Stufe 18 zu erreichen')
:done()
:done()
:newline()
elseif _stat == "Basic attack" then
tablenode
:tag('tr')
:tag('th')
:wikitext('Champion')
:css('width', '180px')
:done()
:tag('th')
:wikitext('Angriffsreichweite')
:done()
:tag('th')
:wikitext('Reichweitentyp')
:done()
:tag('th')
:wikitext('Projektilgeschwindigkeit')
:done()
:tag('th')
:wikitext('Aufbauzeit')
:done()
:tag('th')
:wikitext('Aufbauzeit-Modifizierung')
:done()
:done()
:newline()
elseif _stat == "Hitbox" then
tablenode
:tag('tr')
:tag('th')
:wikitext('Champion')
:css('width', '180px')
:done()
:tag('th')
:wikitext('Gameplayradius')
:done()
:tag('th')
:wikitext('Auswahlradius')
:done()
:tag('th')
:wikitext('Navigationsradius')
:done()
:tag('th')
:wikitext('Akquisitionsradius')
:done()
:done()
:newline()
elseif _stat == "Base" then
tablenode
:tag('tr')
:tag('th')
:wikitext('[[Champion]]s')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('[[Leben|HP]]')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('HP+')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('[[Lebensregeneration|HP5]]')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('HP5+')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('[[Mana|MP]]')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('MP+')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('[[Manaregeneration|MP5]]')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('MP5+')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('[[Angriffsschaden|AD]]')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('AD+')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('[[Angriffstempo|AS]]')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('AS+')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('[[Rüstung|AR]]')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('AR+')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('[[Magieresistenz|MR]]')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('MR+')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('[[Lauftempo|MS]]')
:css('width', '4em')
:done()
:tag('th')
:attr('data-sort-key', 'number')
:wikitext('[[Reichweite]]')
:css('width', '4em')
:done()
:done()
:newline()
elseif _stat == "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('Reichweite')
:done()
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('MS')
:done()
:done()
:newline()
elseif _stat == "Manalos" then
tablenode
:tag('tr')
:tag('th')
:wikitext('Champion')
:done()
:tag('th')
:wikitext('Secondary Resource')
:done()
:done()
:newline()
elseif _stat == "Bewertungen" then
tablenode
:tag('tr')
:tag('th')
:wikitext('Champion')
:done()
:tag('th')
:wikitext('Primär')
:done()
:tag('th')
:wikitext('Sekundär')
: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('Stil')
:done()
:tag('th')
:wikitext(frame:expandTemplate{title='tip', args={'Adaptiver Schaden',icononly='true'}})
:done()
:tag('th')
:wikitext('Schwierigkeit')
:done()
:done()
:newline()
else
tablenode
:tag('tr')
:tag('th')
:wikitext('Champion')
:css('width', '180px')
:done()
:tag('th')
:wikitext('Grundwert')
:done()
:tag('th')
:wikitext('Zuwachs pro Stufe')
:done()
:tag('th')
:wikitext('Wert auf Stufe 18')
:done()
:done()
:newline()
end
for _, champion in ipairs(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", 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')
:wikitext("[[File:" .. FN.championcircle{champion} .. "|20px|alt=" .. champion .. "|link=" .. champion .. "]] [[" .. champion .. "]] <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')
: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 - (as_base / as_ratio - 1) * 100, 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((math.floor(math.floor(windup*100*1000+0.5)/1000*100+0.5)/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()
elseif _stat == "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 res_base = FD.get{["args"]={tostring(t["res_base"])}}
local res_lvl = FD.get{["args"]={tostring(t["res_lvl"])}}
local res5_base = FD.get{["args"]={tostring(t["res5_base"])}}
local res5_lvl = FD.get{["args"]={tostring(t["res5_lvl"])}}
local ad_base = FD.get{["args"]={tostring(t["ad_base"])}}
local ad_lvl = FD.get{["args"]={tostring(t["ad_lvl"])}}
local as_base = FD.get{["args"]={tostring(t["as_base"])}}
local as_lvl = FD.get{["args"]={tostring(t["as_lvl"])}}
local armor_base = FD.get{["args"]={tostring(t["armor_base"])}}
local armor_lvl = FD.get{["args"]={tostring(t["armor_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')
:wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
:done()
:tag('td')
:attr('data-sort-value', tostring(t["hp_base"]):gsub('%.', ','))
:wikitext(hp_base)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["hp_lvl"]):gsub('%.', ','))
:wikitext('+' .. hp_lvl)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["hp5_base"]):gsub('%.', ','))
:wikitext(hp5_base)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["hp5_lvl"]):gsub('%.', ','))
:wikitext('+' .. hp5_lvl)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["res_base"]):gsub('%.', ','))
:wikitext(res_base)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["res_lvl"]):gsub('%.', ','))
:wikitext('+' .. res_lvl)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["res5_base"]):gsub('%.', ','))
:wikitext(res5_base)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["res5_lvl"]):gsub('%.', ','))
:wikitext('+' .. res5_lvl)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["ad_base"]):gsub('%.', ','))
:wikitext(ad_base)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["ad_lvl"]):gsub('%.', ','))
:wikitext('+' .. ad_lvl)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["as_base"]):gsub('%.', ','))
:wikitext(as_base)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["as_lvl"]):gsub('%.', ','))
:wikitext('+' .. as_lvl .. '%')
:done()
:tag('td')
:attr('data-sort-value', tostring(t["armor_base"]):gsub('%.', ','))
:wikitext(armor_base)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["armor_lvl"]):gsub('%.', ','))
:wikitext('+' .. armor_lvl)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["mr_base"]):gsub('%.', ','))
:wikitext(mr_base)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["mr_lvl"]):gsub('%.', ','))
:wikitext('+' .. mr_lvl)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["ms"]):gsub('%.', ','))
:wikitext(ms)
:done()
:tag('td')
:attr('data-sort-value', tostring(t["range"]):gsub('%.', ','))
:wikitext(range)
:done()
:done()
elseif _stat == "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 res_base = tonumber(t["res_base"])
local res_lvl = tonumber(t["res_lvl"])
local res_18 = FD.get{["args"]={tostring(res_base + res_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
local res5_base = tonumber(t["res5_base"])
local res5_lvl = tonumber(t["res5_lvl"])
local res5_18 = FD.get{["args"]={tostring(res5_base + res5_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
local ad_base = tonumber(t["ad_base"])
local ad_lvl = tonumber(t["ad_lvl"])
local ad_18 = FD.get{["args"]={tostring(ad_base + ad_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 armor_base = tonumber(t["armor_base"])
local armor_lvl = tonumber(t["armor_lvl"])
local armor_18 = FD.get{["args"]={tostring(armor_base + armor_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 == "Wut"
or resource == "Hitze"
or resource == "Streitlust"
or resource == "Zorn"
or resource == "Schild"
or resource == "Blutdurst"
or resource == "Mut"
or resource == "Leben"
or resource == "Fluss"
or resource == "Wildheit"
or resource == "Energie"
or resource == "Keine" then
res_18 = '-'
res5_18 = '-'
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')
:attr('data-sort-value', hp_18:gsub('%.', ','))
:wikitext(hp_18)
:css('color', 'lightgreen')
:done()
:tag('td')
:attr('data-sort-value', hp5_18:gsub('%.', ','))
:wikitext(hp5_18)
:css('color', 'lightgreen')
:done()
:tag('td')
:attr('data-sort-value', res_18:gsub('%.', ','))
:wikitext(res_18)
:css('color', 'lightblue')
:done()
:tag('td')
:attr('data-sort-value', res5_18:gsub('%.', ','))
:wikitext(res5_18)
:css('color', 'lightblue')
:done()
:tag('td')
:attr('data-sort-value', ad_18:gsub('%.', ','))
:wikitext(ad_18)
:css('color', '#ffaaaa')
:done()
:tag('td')
:wikitext(as_18)
:css('color', '#ffaaaa')
:done()
:tag('td')
:attr('data-sort-value', armor_18:gsub('%.', ','))
:wikitext(armor_18)
:css('color', '#ffffaa')
:done()
:tag('td')
:attr('data-sort-value', mr_18:gsub('%.', ','))
:wikitext(mr_18)
:css('color', '#ffffaa')
:done()
:tag('td')
:attr('data-sort-value', range:gsub('%.', ','))
:wikitext(range)
:css('color', '#ffffff')
:done()
:tag('td')
:attr('data-sort-value', ms:gsub('%.', ','))
:wikitext(ms)
:css('color', '#ffffff')
:done()
:done()
elseif _stat == "Manalos" then
-- Wut,Hitze,Streitlust,Zorn,Mana,Schild,Blutdurst,Mut,Leben,Fluss,Wildheit,Energie,Keine -- as of 1/25/2020
local resource = lolData[champion]["resource"]
if resource ~= "Mana" then
local resource_msg
if resource == nil then resource = "Keine" end
if resource == "Fluss"
or resource == "Keine" then
resource_msg = "''[[Manalos]]er Champion (benutzt '''keine sekundäre Ressource''')''"
elseif resource == "Blutdurst" then
resource_msg = "''[[Manalos]]er Champion (benutzt '''[[Manalos#Leben|Leben]]''', '''[[Manalos#Zorn|" .. mw.ustring.lower(resource) .. "]]''')''"
elseif resource == "Streitlust" then
resource_msg = "''[[Manalos]]er Champion (benutzt '''[[Manalos#Zorn|" .. mw.ustring.lower(resource) .. "]]''')''"
elseif resource == "Energie" then
resource_msg = "''[[Manalos]]er Champion (benutzt '''[[" .. mw.ustring.lower(resource) .. "]]''')''"
elseif resource == "Schild"then
resource_msg = "''[[Manalos]]er Champion (benutzt '''[[Manalos#Fluss|" .. mw.ustring.lower(resource) .. "]]''')''"
else
resource_msg = "''[[Manalos]]er Champion (benutzt '''[[Manalos#" .. resource .. "|" .. mw.ustring.lower(resource) .. "]]''')''"
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(resource_msg)
:done()
else
tablerow = nil
end
elseif _stat == "Bewertungen" 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 == "magisch" then
adaptivetype_msg = "Magisch"
elseif adaptivetype == "normal" then
adaptivetype_msg = "Normal"
else
-- adaptivetype_msg = frame:expandTemplate{title="pending for test"} .. " " .. frame:expandTemplate{title="edit", args={"Module:ChampionData/data"}}
adaptivetype_msg = "Normal" -- default physical
end
local difficulty_msg = difficulty
tablerow
:tag('td')
:attr('data-sort-value', champion)
:css('text-align', 'left')
:css('padding', '1px')
:wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
: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 FD = require('Module:Fd')
local _base = tostring(t[convert[_stat] .. "_base"])
local _lvl = tostring(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(FD.get{["args"]=tostring(_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
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
local _stat = args['datatype'] or args[1]
local _statDisplayName = args['label'] or args[2]
local _filter = 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== "Kommend" or
releasedate == "N/A" or
releasedate == "Verworfen" or
releasedate == "" then
--ignore champion
elseif _stat == 'range' and get['rangetype'](champion) ~= _filter then -- do nothing
elseif args[champion .. '_o'] then -- do nothing
else
local v = get[_stat](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 .. ' ' .. args[champion .. '_m']
end
if args[champion .. '_n'] then
displaystring = displaystring .. ' <span title="'.. args[champion .. '_n'] .. '"><sup>note</sup></span>'
end
statTable[v][champion] = 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 .. tostring(IL.champion{
["champion"] = champion,
-- ["circle"] = "true",
})
end
if modifier ~= '' then
displaystring = displaystring .. ' ' .. modifier
end
if note ~= '' then
displaystring = displaystring .. ' <span title="'.. note .. '"><sup>note</sup></span>'
end
if statTable[v] == nil then statTable[v] = {} end
if champion ~= '' then
statTable[v][champion] = displaystring
else
statTable[v][modifier] = 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(_statDisplayName or _stat)
: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 table.getn(championTable) >= threshold3col then
champcell
:css('column-count', 3)
:css('-webkit-column-count', 3)
:css('-moz-column-count', 3)
elseif table.getn(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
-- JSON to Lua function for data from
-- http://ddragon.leagueoflegends.com/cdn/<patchversion>/data/en_US/champion.json
-- TODO: Durch Bot-Funktion ersetzen!
function p.jsontolua()
local titleobject = mw.title.new("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 .. '-- <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 .. ' ["res_base"] = ' .. t['stats']['res'] .. ',\n'
s = s .. ' ["res_lvl"] = ' .. t['stats']['resperlevel'] .. ',\n'
s = s .. ' ["armor_base"] = ' .. t['stats']['armor'] .. ',\n'
s = s .. ' ["armor_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 .. ' ["res5_base"] = ' .. t['stats']['resregen'] .. ',\n'
s = s .. ' ["res5_lvl"] = ' .. t['stats']['resregenperlevel'] .. ',\n'
s = s .. ' ["ad_base"] = ' .. t['stats']['attackdamage'] .. ',\n'
s = s .. ' ["ad_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 [[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 = {
["Unterbrecher"] = "Beherrscher",
["Verzauberer"] = "Beherrscher",
["Moloch"] = "Kämpfer",
["Stürmer"] = "Kämpfer",
["Kampfmagier"] = "Magier",
["Burst"] = "Magier",
["Artillerie"] = "Magier",
["Assassine"] = "Schlächter",
["Plänkler"] = "Schlächter",
["Vorkämpfer"] = "Tank",
["Wächter"] = "Tank",
["Schütze"] = "",
["Spezialist"] = "",
}
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
function p.do_for_every_champion(frame)
local args
if frame[1] then
args = lib.arguments(frame)
elseif frame.args[1] then
args = lib.arguments(frame.args)
elseif frame:getParent() and frame:getParent().args[1] then
args = lib.arguments(frame:getParent().args)
end
if not args then return "No arguments provided" end
local get = require ('Module:ChampionData/getter')
local res = {}
local templateArgs = {}
if args["p1n"] then templateArgs[args["p1n"]] = args["p1v"] end
if args["p2n"] then templateArgs[args["p2n"]] = args["p2v"] end
if args["p3n"] then templateArgs[args["p3n"]] = args["p3v"] end
if args["p4n"] then templateArgs[args["p4n"]] = args["p4v"] end
if args["p5n"] then templateArgs[args["p5n"]] = args["p5v"] end
if args["p6n"] then templateArgs[args["p6n"]] = args["p6v"] end
if args["p7n"] then templateArgs[args["p7n"]] = args["p7v"] end
if args["p8n"] then templateArgs[args["p8n"]] = args["p8v"] end
if args["p9n"] then templateArgs[args["p9n"]] = args["p9v"] end
if args["p10n"] then templateArgs[args["p10n"]] = args["p10v"] end
for k,champ in ipairs(get.sortedList()) do
templateArgs[args["cha"] or 1] = champ
res[k] = frame:expandTemplate{title = args[1], args = templateArgs}
end
return mw.text.listToText(res, args[2] or '', args[2] or '')
end
--
-- local funtions
--
function strtoluadata(str, sep)
x = lib.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 = lib.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
-- </pre>
-- [[Kategorie:Module]]