League of Legends Wiki

Want to contribute to this wiki?
Sign up for an account, and get started!
You can even turn off ads in your preferences.

Come join the LoL Wiki community Discord server!

READ MORE

League of Legends Wiki
Advertisement

Documentation for this module may be created at Module:Base stats/doc

-- <pre>
local p    = {}
 
local lib       = require('Module:Feature')
local json      = require('Module:JSON')
local userError = require('Dev:User error')
local IL        = require('Module:ImageLink')
local wikidata = mw.loadData('Module:ChampionData/data')
local insert = table.insert
local sort = table.sort
local find = string.find
local floor = math.floor

local function jsontolua(pagename)
    local titleobject  = mw.title.new(pagename)
    local o            = json.decode(titleobject:getContent())
    
    return o
end

local function ci(champion)
    return tostring(IL.champion{
            ["champion"] = champion,
        })
end

local function fd(val)
    val=tostring(val)
    if find(val,"[0-9]") == nil or find(val,"%.") == nil then
        return val
    end
    local a,b = val:match"([0-9]*).([0-9]*)"
    return a .. ".<small>" .. b .. "</small>"
end

local function round(val)
    if val == nil or val == "" then
        return val
    end
    val = tonumber(val)
    local mult = 10^3
    local rounding=floor(val * mult + 0.5) / mult
    return rounding
end

function p.tftcompare(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    local s=""
    local jsondata = jsontolua("Template:Set/TFT.json")
    local luadata  = require('Module:TFTUnitData/data')
    local championtable={}
    local stattable={}
    local resulttable={}
    local settable = {}
    for set,setdata in pairs(jsondata["sets"]) do
            set = tonumber(set)
        for _,championdata in pairs(setdata.champions) do
            for stat,statdata in pairs(championdata.stats) do
                if stat ~= "critChance" and stat ~= "critMultiplier" then
                    if stat == "armor" then
                        stat = "arm"
                    end
                    if stat == "attackSpeed" then
                        stat = "as"
                        statdata = round(statdata)
                    end
                    if stat == "damage" then
                        stat = "ad"
                    end
                    if stat == "initialMana" then
                        stat = "startmana"
                    end
                    if stat == "magicResist" then
                        stat = "mr"
                    end
                    local championname = championdata.name
                    local wikistatdata
                    if set == 3 then
                        set = 3.5
                    end
                    if luadata[championname] == nil or luadata[championname][set] == nil or luadata[championname][set][stat] == nil then
                        if set == 3.5 then
                            set = 3
                            if luadata[championname] == nil or luadata[championname][set] == nil or luadata[championname][set][stat] == nil then
                                wikistatdata = nil
                            else
                                wikistatdata = luadata[championname][set][stat]
                            end
                        else
                            wikistatdata = nil
                        end
                    else
                        wikistatdata = luadata[championname][set][stat]
                    end
                    if tonumber(statdata)~=tonumber(wikistatdata or "") then
                        if resulttable[championname]==nil then
                            resulttable[championname]={}
                            stattable[championname]={}
                            settable[championname]={}
                            insert(championtable,championname)
                        end
                        if resulttable[championname][set]==nil then
                            resulttable[championname][set]={}
                            stattable[championname][set]={}
                            insert(settable[championname],set)
                        end
                        insert(stattable[championname][set],stat)
                        resulttable[championname][set][stat]=statdata
                    end
                 end
            end
        end
    end
    sort(championtable)
    for _,championname in pairs(championtable) do
        sort(settable[championname])
        for _,set in pairs (settable[championname]) do
            sort(stattable[championname][set])
            s=s..ci(championname).." Set " .. set .. "\n"
            for _,stat in pairs(stattable[championname][set]) do
                s=s.."*"..stat.."= "..resulttable[championname][set][stat].."\n"
            end
        end
    end
    if s == "" then
        return "Everything is updated!"
    else
        return s
    end
end

function p.oldtftcompare(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    local s=""
    local jsondata = jsontolua("Template:Set/TFT/"..args[1]..".json")
    local jsondata2  = jsontolua("Template:Set/TFT/"..args[2]..".json")
    local championtable={}
    local stattable={}
    local resulttable={}
    local settable = {}
    for set,setdata in pairs(jsondata["sets"]) do
            set = tonumber(set)
        for championindex,championdata in pairs(setdata.champions) do
            for stat,statdata in pairs(championdata.stats) do
                local championname = championdata.name
                local statdata2 = jsondata2["sets"][tostring(set)]["champions"][championindex]["stats"][stat]
                if statdata ~= statdata2 then
                    if resulttable[championname]==nil then
                        resulttable[championname]={}
                        stattable[championname]={}
                        settable[championname]={}
                        insert(championtable,championname)
                    end
                    if resulttable[championname][set]==nil then
                        resulttable[championname][set]={}
                        stattable[championname][set]={}
                        insert(settable[championname],set)
                    end
                    insert(stattable[championname][set],stat)
                    resulttable[championname][set][stat] = statdata .. " --> " .. statdata2
                end
            end
        end
    end
    sort(championtable)
    for _,championname in pairs(championtable) do
        sort(settable[championname])
        for _,set in pairs (settable[championname]) do
            sort(stattable[championname][set])
            s=s..ci(championname).." Set " .. set .. "\n"
            for _,stat in pairs(stattable[championname][set]) do
                s=s.."*"..stat.."= "..resulttable[championname][set][stat].."\n"
            end
        end
    end
    if s == "" then
        return "Everything is the same!"
    else
        return s
    end
end

function p.compare(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    local s=""
    local jsondata = jsontolua("Template:Set/champion.json")
    local championtable={}
    local stattable={}
    local resulttable={}
    for _,championdata in pairs(jsondata["data"]) do
        local championname = championdata.name
        for stat,statdata in pairs(championdata.stats) do
            if stat ~= "crit" and stat ~= "critperlevel" then
                if stat == "hp" then
                    stat = "hp_base"
                end
                if stat == "hpperlevel" then
                    stat = "hp_lvl"
                end
                if stat == "mp" then
                    stat = "mp_base"
                end
                if stat == "mpperlevel" then
                    stat = "mp_lvl"
                end
                if stat == "movespeed" then
                    stat = "ms"
                end
                if stat == "armor" then
                    stat = "arm_base"
                end
                if stat == "armorperlevel" then
                    stat = "arm_lvl"
                end
                if stat == "spellblock" then
                    stat = "mr_base"
                end
                if stat == "spellblockperlevel" then
                    stat = "mr_lvl"
                end
                if stat == "attackrange" then
                    stat = "range"
                end
                if stat == "hpregen" then
                    stat = "hp5_base"
                end
                if stat == "hpregenperlevel" then
                    stat = "hp5_lvl"
                end
                if stat == "mpregen" then
                    stat = "mp5_base"
                end
                if stat == "mpregenperlevel" then
                    stat = "mp5_lvl"
                end
                if stat == "attackdamage" then
                    stat = "dam_base"
                end
                if stat == "attackdamageperlevel" then
                    stat = "dam_lvl"
                end
                if stat == "attackspeedperlevel" then
                    stat = "as_lvl"
                end
                if stat == "attackspeed" then
                    stat = "as_base"
                end
                if tonumber(statdata) ~= tonumber(wikidata[championname]["stats"][stat]) then
                    if resulttable[championname]==nil then
                        resulttable[championname]={}
                        stattable[championname]={}
                        insert(championtable,championname)
                    end
                    insert(stattable[championname],stat)
                    resulttable[championname][stat]=statdata
                end
            end
        end
        for stat,statdata in pairs(championdata.tags) do
            if stat == 1 then
                stat = "herotype"
            end
            if stat == 2 then
                stat = "alttype"
            end
            if statdata ~= wikidata[championname][stat] then
                if resulttable[championname]==nil then
                    resulttable[championname]={}
                    stattable[championname]={}
                    insert(championtable,championname)
                end
                insert(stattable[championname],stat)
                resulttable[championname][stat]=statdata
            end
        end
        for stat,statdata in pairs(championdata) do
            if stat ~= "version" and stat ~= "name" and stat ~= "blurb" then
                if type(statdata) ~= "table" then
                    if stat == "id" then
                        stat = "apiname"
                    end
                    if stat == "key" then
                        stat = "id"
                    end
                    if stat == "partype" then
                        stat = "resource"
                    end
                    if (tonumber(statdata) or statdata) ~= wikidata[championname][stat] then
                        if resulttable[championname]==nil then
                            resulttable[championname]={}
                            stattable[championname]={}
                            insert(championtable,championname)
                        end
                        insert(stattable[championname],stat)
                        resulttable[championname][stat]=statdata
                    end
                end
            end
        end
    end
    sort(championtable)
    for _,championname in pairs(championtable) do
        sort(stattable[championname])
        s=s..ci(championname).."\n"
        for _,stat in pairs(stattable[championname]) do
            s=s.."*"..stat.."= "..resulttable[championname][stat].."\n"
        end
    end
    return "[https://leagueoflegends.fandom.com/wiki/Module:ChampionData/data?action=edit Patch Data: " .. jsondata["version"] .."]<br>"..s
end

function p.get(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    local stat3       = string.lower(args[1] or "as")
    local rangetype   = args["rangetype"]
    local sortby      = args["sortby"]
    local lvl         = args["lvl"]
    local show        = tonumber(args["show"] or 1)
    local get = args["get"]
    if rangetype~=nil then
        rangetype=string.lower(rangetype)
    end
    if sortby~=nil then
        sortby=string.lower(sortby)
    end
    local size        = tonumber(args["size"] or 5)
    local stat,stat2="",""
    if stat3=="ad" or stat3=="dam" or stat3=="attack damage" then
        stat="dam"
        stat2="AD"
    else
        if stat3=="attack speed" or stat3=="as" then
            stat="as"
            stat2="AS"
        else
            if stat3=="health" or stat3=="hp" then
                stat="hp"
                stat2="health"
            else 
                if stat3=="health regeneration" or stat3=="hp5" then
                    stat="hp5"
                    stat2="hp5"
                else 
                    if stat3=="mana" or stat3=="mp"  then
                        stat="mp"
                        stat2="mana"
                    else 
                        if stat3=="mana regeneration" or stat3=="mp5"  then
                            stat="mp5"
                            stat2="mp5"
                        else 
                            if stat3=="armor" or stat3=="armor"  then
                                stat="arm"
                                stat2="armor"
                            else 
                                if stat3=="magic resistance" or stat3=="mr"  then
                                    stat="mr"
                                    stat2="MR"
                                else 
                                    stat=stat3
                                    stat2=stat3
                                end
                            end
                        end
                    end
                end
            end
        end
    end
    if lvl~=nil and size==1 and sortby~=nil then
        return getstats(lvl,stat,stat2,frame,rangetype,sortby,size,show,get)
    else
        local s           = '{| class="wikitable"\n|+'
        if rangetype~=nil then
            s=s..mw.ustring.gsub(rangetype, "^.", mw.ustring.upper).." c"
        else
            s=s.."C"
        end
        s=s..'hampions with the '
        if sortby~=nil then
            if sortby=="top" then
                s=s.."highest "
            else
                if sortby=="bot" then
                    s=s.."lowest "
                else
                end
            end
        else
            s=s.."lowest or highest " 
        end
        s=s..stat3..' before items, runes, or abilities\n! width="100pt" | Champion Level'
        s=s..'\n! colspan="2" width="200pt" | '
        if sortby~=nil then
            if sortby=="top" then
                s=s..'Top'
            end
            if sortby=="bot" then
                s=s..'Bottom'
            end
        else
            s=s..'Top'
            if size~=1 then
                s=s.." "..size..' champions'
            else
                s=s..' champion'
            end
            s=s..'\n! colspan="2" width="200pt" | Bottom'
        end
        if size~=1 then
            s=s.." "..size..' champions'
        else
            s=s..' champion'
        end
        s=s..'\n|-\n! rowspan="'..size..'" | Level '
        if lvl~=nil then
            s=s..lvl
            s=s..getstats(lvl,stat,stat2,frame,rangetype,sortby,size)
        else
            s=s.."1"
            s=s..getstats(1,stat,stat2,frame,rangetype,sortby,size)
            s=s..'\n|-\n! colspan="5" height="5pt" |\n|-\n! rowspan="'..size..'" | Level 18'
            s=s..getstats(18,stat,stat2,frame,rangetype,sortby,size)
        end
        return s.."\n|}"
    end
end

function getstats(lvl,stat,stat2,frame,rangetype,sortby,size,show,get)
    local stats={}
    local s=""
    for champname in pairs(wikidata) do
        if  wikidata[champname]["date"] == "Upcoming" or 
            wikidata[champname]["date"] == "N/A" or
            wikidata[champname]["date"] == "Cancelled" or
            wikidata[champname]["date"] == "" then
            --ignore champion
        elseif (stat=="mp" or stat=="mp5") and wikidata[champname]["resource"]~="" and wikidata[champname]["resource"]~=nil and string.lower(wikidata[champname]["resource"])~="mana" then
        else
            if rangetype==nil or string.lower(wikidata[champname]["rangetype"])==string.lower(rangetype) then
                base=tonumber(wikidata[champname]["stats"][stat.."_base"]) or tonumber(wikidata[champname]["stats"][stat])
                xlvl=tonumber(wikidata[champname]["stats"][stat.."_lvl"]) or 0
                if stat=="as" then
                    local as_ratio = round(tonumber(wikidata[champname]["stats"]["as_ratio"])) 
                    if as_ratio == nil or as_ratio == 0 then
                        as_ratio = tonumber(wikidata[champname]["stats"]["as_base"])
                    end
                    insert(stats,{champname, base+as_ratio*xlvl/100*(lvl-1)*(0.7025+0.0175*(lvl-1))})
                else
                    insert(stats,{champname, base+xlvl*(lvl-1)*(0.7025+0.0175*(lvl-1))})
                end
            end
        end
    end
    sort(stats, function(a, b) return a[2]<b[2] end)
    if lvl~=nil and size==1 and sortby~=nil then
        if get == nil then
            if sortby=="top" then
                s = s .. fd(round(stats[#stats-show+1][2]))
            else
                s = s .. fd(round(stats[show][2]))
            end
        else
            if get == "stat" then
                if sortby == "top" then
                    s = s .. round(stats[#stats-show+1][2])
                else
                    s = s .. round(stats[show][2])
                end
            end
        end
        if get == nil then
            s = s .. " ("
        end
        if get ~= "stat" then
            if sortby=="top" then
                s = s .. ci(stats[#stats-show+1][1],frame)
            else
                s = s .. ci(stats[show][1],frame)
            end
        end
        if get == nil then
            s = s .. ")"
        end
        return s
    else
        local bot={}
        local top={}
        j=#stats
        k=1
        while j>=1 and sortby~="bot" do
            if j==#stats then
                top[k]="\n| "..k..". "..ci(stats[j][1],frame)
            else
                if stats[j][2]==stats[j+1][2] then
                    top[k]=top[k].."<br>"..k..". "..ci(stats[j][1],frame)
                else
                    top[k]=top[k].."\n| "..fd(round(stats[j+1][2])).." "..stat2
                    k=k+1
                    if k>size then
                        break
                    end
                    top[k]="\n| "..k..". "..ci(stats[j][1],frame)
                    if j==1 then
                        top[k]=top[k].."\n| "..fd(round(stats[j][2])).." "..stat2
                    end
                end
            end
            j=j-1
        end
        j=1
        k=1
        while j<=#stats and sortby~="top" do
            if j==1 then
                bot[k]="\n| "..k..". "..ci(stats[j][1],frame)
            else
                if stats[j][2]==stats[j-1][2] then
                    bot[k]=bot[k].."<br>"..k..". "..ci(stats[j][1],frame)
                else
                    bot[k]=bot[k].."\n| "..fd(round(stats[j-1][2])).." "..stat2
                    k=k+1
                    if k>size then
                        break
                    end
                    bot[k]="\n| "..k..". "..ci(stats[j][1],frame)
                    if j==#stats then
                        bot[k]=bot[k].."\n| "..fd(round(stats[j][2])).." "..stat2
                    end
                end
            end
            j=j+1
        end
        k=1
        while k<=size do
            if sortby~=nil then
                if sortby=="top" then
                    if top[k]~=nil then
                        s=s..top[k]
                    else
                        s=s.."\n|\n|"
                    end
                else
                    if sortby=="bot" then
                        if bot[k]~=nil then
                            s=s..bot[k]
                        else
                            s=s.."\n|\n|"
                        end
                    end
                end
            else
                if top[k]~=nil then
                    s=s..top[k]
                else
                    s=s.."\n|\n|"
                end
                if bot[k]~=nil then
                    s=s..bot[k]
                else
                    s=s.."\n|\n|"
                end
            end
            s=s.."\n|-"
            k=k+1
        end
        return s
    end
end

return p
-- </pre>
Advertisement