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
Register
Advertisement

Documentation for this module may be created at Module:Ability progression/doc

-- <pre>
local p = {}
local lib         = require('Module:Feature')
local col         = require('Module:Color')
local userError   = require('Dev:User error')
local fd_get      = require('Module:fd').get
local fd_getmulti = require('Module:fd').getmulti

function p.test(frame)
    local args; if frame.args[1] then args = frame.args else args = frame:getParent().args end
    local doubleto = "yes"
    return string.gsub(doubleto, "true", "")
end

function p.pp(frame)
    local args; if frame.args[1] then args = frame.args else args = frame:getParent().args end
        
    local start2, end2
    local values, values2    = "", ""
    local count, countstatic = 30, 30
    local fill,  fill1       = 18, 18
    local to, to1            = 0, 0
    
    local displayformula     = args["formula"]
    local round              = args["round"] or 2
    if round == "false" then
        round = nil
    end
    local round1             = args["round1"]
    local key                = args["key"] or ""
    local key1               = args["key1"]
    local label              = args["label"]
    local label1             = args["label1"] or args["type"]
    local orig               = lib.split(args[1] or "", "%;")
    local orig1              = lib.split(args[2] or "", "%;")
    local _, bot_to_hits     = string.gsub(args[1] or "", "to", "")
    local _, top_to_hits     = string.gsub(args[2] or "", "to", "")
    local _, bot_x_hits      = string.gsub(args[1] or "", "x",  "")
    local _, top_x_hits      = string.gsub(args[2] or "", "x",  "")
	local i = 1
	
    if bot_to_hits + bot_x_hits ~= 0 or top_to_hits + top_x_hits ~= 0 then
        local lastvalue = ""
        while orig[i] ~= nil and orig[i] ~= "" do
            if (string.find(orig[i], "to") ~= nil or string.find(orig[i], "x") ~= nil) and string.find(orig[i], "%<") == nil then
                local start
                if string.find(orig[i], "to") ~= nil then
                    start = string.sub(orig[i], 1, string.find(orig[i], "to") - 1)
                end
                if string.find(orig[i], "x") == nil and pcall(expr, start .. "*2") ~= false then
                    local finish, times
                    if string.find(orig[i], "by") ~= nil then
                        finish, times = orig[i]:match".* *to *([^ ]*) *by *([^ ]*)"
                    else
                        if string.find(orig[i], "for") ~= nil then
                            finish, times = orig[i]:match".* *to *([^ ]*) *for *([^ ]*)"
                        else
                            finish = orig[i]:match".* *to *([^ ]*)"
                        end
                    end
                    if finish ~= nil and pcall(expr, finish .. "*2") ~= false and ((times ~= "" and times ~= nil and pcall(expr, times .. "*2") ~= false) or times == "" or times == nil) then
                        start = tonumber(expr(start))
                        finish = tonumber(expr(finish))
                        if times ~= "" and times ~= nil then
                            times = tonumber(expr(times))
                            if string.find(orig[i], "by") ~= nil then
                                times = rounding(math.abs(finish - start) / times + 1, 0)
                            end
                            fill = fill - times
                            if string.find(orig[i], "by") ~= nil and lastvalue == start then
                                fill = fill + 1
                            end
                        else
                            to = 1
                        end
                        lastvalue = finish
                    else
                        fill = fill - 1
                    end
                else
                    local times, doubleto
                    if string.find(orig[i], "for") then
                        doubleto, times = orig[i]:match"(.*) *for *([^ ]*)"
                    else
                        doubleto = orig[i]
                    end
                    
                    local _, occurences = string.gsub(orig[i], "to", "") 
                    if occurences > 0 and ((times ~= "" and times ~= nil and pcall(expr, times .. "*2") ~= false) or times == "" or times == nil) then
                        local times2 = 2
                        doubleto = string_to_formula(doubleto, times2)
                    end
                    
                    local useformula = string.gsub(doubleto, "then", "1")
                    if useformula ~= nil and pcall(expr, string.gsub(useformula, "x", "1") .. "*2") ~= false and ((times ~= "" and times ~= nil and pcall(expr, times .. "*2") ~= false) or times == "" or times == nil) then
                        if times ~= "" and  times ~= nil then
                            times = tonumber(expr(times))  
                            fill = fill - times
                        else
                            to = 1
                        end
                    else
                        fill = fill - 1
                    end
                end
            else
                fill = fill - 1
                if pcall(expr, string.gsub(orig[i], "then", lastvalue) .. "*2") ~= false then
                    lastvalue = expr(string.gsub(orig[i], "then", lastvalue))
                end
            end
            i = i + 1
        end
    end
    
    i = 1
    
    if bot_to_hits + bot_x_hits ~= 0 or top_to_hits + top_x_hits ~= 0 then
        local lastvalue1 = ""
        while orig1[i] ~= nil and orig1[i] ~= "" do
            if (string.find(orig1[i], "to") ~= nil or string.find(orig1[i], "x") ~= nil) and string.find(orig1[i], "%<") == nil then
                local start1
                if string.find(orig1[i], "to") ~= nil then
                    start1 = string.sub(orig1[i], 1, string.find(orig1[i], "to") - 1)
                end
                if string.find(orig1[i], "x") == nil and pcall(expr, start1 .. "*2") ~= false then
                    local finish1, times1
                    if string.find(orig1[i], "by") ~= nil then
                        finish1, times1 = orig1[i]:match".* *to *([^ ]*) *by *([^ ]*)"
                    else
                        if string.find(orig1[i], "for") ~= nil then
                            finish1, times1 = orig1[i]:match".* *to *([^ ]*) *for *([^ ]*)"
                        else
                            finish1 = orig1[i]:match".* *to *([^ ]*)"
                        end
                    end
                    if finish1 ~= nil and pcall(expr, finish1 .. "*2") ~= false and ((times1 ~= "" and  times1 ~= nil and pcall(expr, times1 .. "*2") ~= false) or times1 == "" or times1 == nil) then
                        start1 = tonumber(expr(start1))
                        finish1 = tonumber(expr(finish1))
                        if times1 ~= "" and times1 ~= nil then
                            times1 = tonumber(expr(times1))
                            if string.find(orig1[i], "by") ~= nil then
                                times1 = rounding(math.abs(finish1 - start1) / times1 + 1, 0)
                            end
                            fill1 = fill1 - times1
                            if string.find(orig1[i], "by") ~= nil and lastvalue1 == start1 then
                                fill1 = fill1 + 1
                            end
                        else
                            to1 = 1
                        end
                        lastvalue1 = finish1
                    else
                        fill1 = fill1 - 1
                    end
                else
                    local times1, doubleto1
                    if string.find(orig1[i], "for") then
                        doubleto1, times1 = orig1[i]:match"(.*) *for *([^ ]*)"
                    else
                        doubleto1 = orig1[i]
                    end
                    
                    local _, occurences1 = string.gsub(orig1[i], "to", "") 
                    if occurences1 > 0 and ((times1 ~= "" and times1 ~= nil and pcall(expr, times1 .. "*2") ~= false) or times1 == "" or times1 == nil) then
                        local times2 = 2
                        doubleto1 = string_to_formula(doubleto1, times2)
                    end
                    
                    local useformula1 = string.gsub(doubleto1, "then", "1")
                    if useformula1 ~= nil and pcall(expr, string.gsub(useformula1, "x", "1") .. "*2") ~= false and ((times1 ~= "" and  times1 ~= nil and pcall(expr, times1 .. "*2") ~= false) or times1 == "" or times1 == nil) then
                        if times1 ~= "" and times1 ~= nil then
                            times1 = tonumber(expr(times1))  
                            fill1 = fill1 - times1
                        else
                            to1 = 1
                        end
                    else
                        fill1 = fill1 - 1
                    end
                end
            else
                fill1 = fill1 - 1
                if pcall(expr, string.gsub(orig1[i], "then", lastvalue1) .. "*2") ~= false then
                    lastvalue1 = expr(string.gsub(orig1[i], "then", lastvalue1))
                end
            end
            i = i + 1
        end
    end
	
	
    if 18 - fill >= 18 - fill1 then
        if to == 0 then
            fill1 = fill1 - fill
        end
    else
        if to1 == 0 then
            fill = fill - fill1
        end
    end
	
	
    if fill < 0 then
        fill = 0
    end
	
    if fill1 < 0 then
        fill1 = 0
    end
    
    local lastvalue = ""
    i = 1
    while orig[i] ~= nil and orig[i] ~= "" do
        if (string.find(orig[i], "to") ~= nil or string.find(orig[i], "x") ~= nil) and string.find(orig[i], "%<") == nil then
            local start
            if string.find(orig[i], "to") ~= nil then
                start = string.sub(orig[i], 1, string.find(orig[i], "to") - 1)
            end
            if string.find(orig[i], "x") == nil and pcall(expr, start .. "*2") ~= false then
                local finish, times
                if string.find(orig[i], "by") ~= nil then
                    finish, times = orig[i]:match".* *to *([^ ]*) *by *([^ ]*)"
                else
                    if string.find(orig[i], "for") ~= nil then
                        finish, times = orig[i]:match".* *to *([^ ]*) *for *([^ ]*)"
                    else
                        finish = orig[i]:match".* *to *([^ ]*)"
                    end
                end
                if finish ~= nil and pcall(expr, finish .. "*2") ~= false and ((times ~= "" and times ~= nil and pcall(expr, times .. "*2") ~= false) or times == "" or times == nil) then
                    start = tonumber(expr(start))
                    finish = tonumber(expr(finish))
                    if displayformula == nil and orig[2] == nil then
                        start2 = start
                        finish2 = finish
                    end
                    if times == "" or  times == nil then
                        times = fill
                        fill = 0
                    else
                        times = tonumber(expr(times))
                        if string.find(orig[i], "by") ~= nil then
                            times = tonumber(rounding(math.abs(finish - start) / times + 1, 0))
                        end
                    end
                    local x
                    if lastvalue == start then
                        x = 2
                        if string.find(orig[i], "by") == nil then
                            times = times + 1
                        end
                    else
                        x = 1
                    end
                    lastvalue = finish
                    count = count - times
                    if count < 0 then
                        return userError("Maximum size exceeded", "LuaError")
                    end
					
					local formula = start
                    local scale = (finish - start) / (times - 1)
					
                    while x <= times do
                        if x ~= 1 then
                            formula = formula + scale
                        end
                        local values3 = rounding(formula, round)
                        if values == "" then
                            values = fd(values3)
                            values2 = values3
                        else
                            values = values .. " / " .. fd(values3)
                            values2 = values2 .. " / " .. values3
                        end
                        x = x + 1
                    end
                else
                    count = count - 1
                    if count < 0 then
                        return userError("Maximum size exceeded", "LuaError")
                    end
                    local values3 = orig[i]
                    lastvalue = orig[i]
                    if values == "" then
                        values = fd(values3)
                        values2 = values3
                    else
                        values = values .. " / " .. fd(values3)
                        values2 = values2 .. " / " .. values3
                    end
                end
            else
                local times, doubleto
                if string.find(orig[i], "for") then
                    doubleto, times = orig[i]:match"(.*) *for *([^ ]*)"
                else
                    doubleto = orig[i]
                end
                local _, occurences = string.gsub(orig[i], "to", "") 
                if occurences > 0 and ((times ~= "" and times ~= nil and pcall(expr, times .. "*2") ~= false) or times == "" or times == nil) then
                    local times2
                    if times == "" or times == nil then
                        times2 = fill
                    else
                        times2 = tonumber(expr(times))  
                    end
                    doubleto = string_to_formula(doubleto, times2)
                end
                local useformula = string.gsub(doubleto, "then", lastvalue)
                if useformula ~= nil and pcall(expr, string.gsub(useformula, "x", "1") .. "*2") ~= false and ((times ~= "" and times ~= nil and pcall(expr, times .. "*2") ~= false) or times == "" or times == nil) then
                    if displayformula == nil and orig[2] == nil then
                        useformula2 = useformula
                    end
					if times == "" or times == nil then
                        times = fill
                        fill = 0
                    else
                        times = tonumber(expr(times))  
                    end
                    local x = 1
                    while x <= times do
                        count = count - 1
                        if count < 0 then
                            return userError("Maximum size exceeded", "LuaError")
                        end
                        local formula = string.gsub(useformula, "x", x)
                        local values3 = expr(formula)
                        lastvalue = values3
                        values3 = rounding(values3, round)
                        if values == "" then
                            values = fd(values3)
                            values2 = values3
                        else
                            values = values .. " / " .. fd(values3)
                            values2 = values2 .. " / " .. values3
                        end
                        x = x + 1
                    end
                else
                    count = count - 1
                    if count < 0 then
                        return userError("Maximum size exceeded", "LuaError")
                    end
                    local values3 = orig[i]
                    if values == "" then
                        values = fd(values3)
                        values2 = values3
                    else
                        values = values .. " / " .. fd(values3)
                        values2 = values2 .. " / " .. values3
                    end
                end
            end
        else
            count = count - 1
            if count < 0 then
                return userError("Maximum size exceeded", "LuaError")
            end
            local values3
            if pcall(expr, string.gsub(orig[i], "then", lastvalue) .. "*2") ~= false then
                values3 = expr(string.gsub(orig[i], "then", lastvalue))
                lastvalue = values3
                values3 = rounding(values3, round)
            else
                values3 = orig[i]
            end
            if values == "" then
                values = fd(values3)
                values2 = values3
            else
                values = values .. " / " .. fd(values3)
                values2 = values2 .. " / " .. values3
            end
        end
        i = i + 1
    end
    
    local s = ""
    s = s .. '<span class="pp-tooltip2" style="position:relative; border-bottom:1px dotted; cursor:help;'
    
    if args["color"] ~= nil then
        s = s .. " color:" .. col.keyword{args["color"]} .. ";"
    end
    s = s .. '"'
    
    if label ~= nil then
        s = s .. ' data-bot_label="' .. label .. '"'
    end
    
    if label1 ~= nil then
        s = s .. ' data-top_label="' .. string.gsub(string.gsub(label1, "'''", ""), "''", "") .. '"'
    end
    
    if displayformula ~= nil then
        s = s .. ' data-displayformula="' .. displayformula .. '"'
    end
    
    if useformula2 ~= nil then
        s = s .. ' data-useformula="' .. useformula2 .. '"'
    end
    
    if values2 ~= nil then
        s = s .. ' data-bot_values="' .. values2 .. '"'
    end
    
    if args[2] ~= nil then
        s = s .. ' data-top_values="' .. args[2] .. '"'
    end
    
    if round ~= 2 and round ~= nil then
        s = s .. ' data-bot_round="' .. round .. '"'
    end
    
    if round1 ~= nil then
        s = s .. ' data-top_round="' .. round1 .. '"'
    end
    
    if key ~= "" then
        s = s .. ' data-bot_key="' .. key .. '"'
    end
    
    if key1 ~= nil then
        s = s .. ' data-top_key="' .. key1 .. '"'
    end
    
    if start2 ~= nil then
        s = s .. ' data-start="' .. start2  .. '"'
        s = s .. ' data-finish="' .. finish2 .. '"'
    end
    
    if top_to_hits + top_x_hits ~= 0 or start2 ~= nil then
        s = s .. ' data-top_fill="' .. fill1 .. '"'
    end
    
    s = s .. ">"
    
    if (countstatic - count > 5 and args["changedisplay"] ~= "true") or (countstatic - count <= 5 and args["changedisplay"] == "true") then
        s = s .. fd(string.sub(values2, 1, (string.find(values2, "%/") or 1) - 2)) .. key .. " &minus; " .. fd(last(values2, "/")) .. key
    else
        s = s .. values .. key
    end
    
    if args["showtype"] ~= "false" then
        s = s .. " (based on " .. (args["type"] or args["label1"] or "level") .. ")" 
    end
    
    s = s .. "</span>"
     
    return s
end

function p.pptooltip(frame)
    local args; if frame.args[1] then args = frame.args else args = frame:getParent().args end

    local label          = args["bot_label"]
    local label1         = args["top_label"]
    local round          = args["bot_round"]
    local round1         = args["top_round"]
    if round1 == "false" then
        round1 = nil
    end
    local key            = args["bot_key"]
    local key1           = args["top_key"]
    local displayformula = args["displayformula"]
    local useformula     = args["useformula"]
    local fill1          = tonumber(args["top_fill"])
    local count1         = 30
    local start          = tonumber(args["start"])
    local finish         = tonumber(args["finish"])
    
    if label1 == "" then
        label1 = "level"
    end
    
    local formulalabel1 = string.gsub(label1, "[%[%]]", "")
    
    if label == "" then
        label = "value"
    end
    
    if tonumber(round) == nil then
        round = 2
    end
    
    if round1 == "" then
        round1 = 2
    end
    
    local orig  = lib.split(args["bot_values"], " %/")
    local orig1 = lib.split(args["top_values"], "%;")
    
    local s = ""
    
    local i = 1
    local j = 1
    
    local lastvalue1 = ""
    while (orig1[i] ~= nil and orig1[i] ~= "") or (orig[j] ~= nil and orig[j] ~= "") do
        s = s .. '</th><th style="text-align: center;">'
        if orig1[1] ~= "" then
            if orig1[i] ~= nil and orig1[i] ~= "" then
                if (string.find(orig1[i], "to") ~= nil or string.find(orig1[i], "x") ~= nil) and string.find(orig1[i], "%<") == nil then
                    local start1
                    if string.find(orig1[i], "to") ~= nil then
                        start1 = string.sub(orig1[i], 1, string.find(orig1[i], "to") - 1)
                    end
                    if string.find(orig1[i], "x") == nil and pcall(expr, start1 .. "*2") ~= false then
                        local finish1, times1
                        if string.find(orig1[i], "by") ~= nil then
                            finish1, times1 = orig1[i]:match".* *to *([^ ]*) *by *([^ ]*)"
                        else
                            if string.find(orig1[i], "for") ~= nil then
                                finish1, times1 = orig1[i]:match".* *to *([^ ]*) *for *([^ ]*)"
                            else
                                finish1 = orig1[i]:match".* *to *([^ ]*)"
                            end
                        end
                        if finish1 ~= nil and pcall(expr, finish1 .. "*2") ~= false and ((times1 ~= "" and times1 ~= nil and pcall(expr, times1 .. "*2") ~= false) or times1 == "" or times1 == nil) then
                            start1  = tonumber(expr(start1))
                            finish1 = tonumber(expr(finish1))
                            if times1 == "" or times1 == nil then
                                times1 = fill1
                                fill1  = 0
                            else
                                times1 = tonumber(expr(times1))
                                if string.find(orig1[i], "by") ~= nil then
                                    times1 = tonumber(rounding(math.abs(finish1 - start1) / times1 + 1, 0))
                                end
                            end
                            if displayformula == "" and orig1[2] == nil then
                                start3  = start1
                                finish3 = finish1
                                times3  = times1
                            end
                            local x1, formula1
                            if lastvalue1 == start1 then
                                x1 = 2
                                formula1 = start1
                                if string.find(orig1[i], "by") == nil then
                                    times1 = times1 + 1
                                end
                            else
                                x1 = 1
                            end
                            
                            while x1 <= times1 do
                                count1 = count1 - 1
                                if count1 <0 then
                                    return userError("Maximum size exceeded", "LuaError")
                                end
                                if x1 == 1 then
                                    formula1 = start1
                                else
                                    formula1 = formula1 + (finish1 - start1) / (times1 - 1)
                                    if lastvalue1 == start1 and x1 == 2 then
                                    else
                                        s = s .. '</th><th style="text-align: center;">'
                                        j = j + 1
                                    end
                                end
                                s = s .. fd(rounding(formula1, round1)) .. key1
                                x1 = x1 + 1
                            end
                            
                            lastvalue1 = finish1
                        else
                            count1 = count1 - 1
                            if count1 < 0 then
                                return userError("Maximum size exceeded", "LuaError")
                            end
                            s = s .. fd(orig1[i])
                            lastvalue1 = orig1[i]
                        end
                    else
                        local times1, doubleto1
                        if string.find(orig1[i], "for") then
                            doubleto1, times1 = orig1[i]:match"(.*) *for *([^ ]*)"
                        else
                            doubleto1 = orig1[i]
                        end
                        local _, occurences1 = string.gsub(orig1[i], "to", "")
                        if occurences1 > 0 and ((times1 ~= "" and times1 ~= nil and pcall(expr, times1 .. "*2") ~= false) or times1 == "" or times1 == nil) then
                            local times2
                            if times1 == "" or times1 == nil then
                                times2 = fill1
                            else
                                times2 = tonumber(expr(times1))  
                            end
                            doubleto1 = string_to_formula(doubleto1, times2)
                        end
                        local useformula1 = string.gsub(doubleto1, "then", lastvalue1)
                        if useformula1 ~= nil and pcall(expr, string.gsub(useformula1, "x", "1") .. "*2") ~= false and ((times1 ~= "" and times1 ~= nil and pcall(expr, times1 .. "*2") ~= false) or times1 == "" or times1 == nil) then
                            if times1 == "" or times1 == nil then
                                times1 = fill1
                                fill1  = 0
                            else
                                times1 = tonumber(expr(times1))  
                            end
                            local x1 = 1
                            while x1 <= times1 do
                                count1 = count1 - 1
                                if count1 < 0 then
                                    return userError("Maximum size exceeded", "LuaError")
                                end
                                local formula1 = string.gsub(useformula1, "x", x1)
                                if x1 ~= 1 then
                                    s = s .. '</th><th style="text-align: center;">'
                                    j = j + 1
                                end
                                local values3 = expr(formula1)
                                lastvalue1 = values3
                                s = s .. fd(rounding(values3, round1)) .. key1
                                x1 = x1 + 1
                            end
                        else
                            count1 = count1 - 1
                            if count1 < 0 then
                                return userError("Maximum size exceeded", "LuaError")
                            end
                            s = s .. fd(orig1[i])
                        end
                    end
                else
                    count1 = count1 - 1
                    if count1 < 0 then
                        return userError("Maximum size exceeded", "LuaError")
                    end
                    if pcall(expr, string.gsub(orig1[i], "then", lastvalue1) .. "*2") ~= false then
                        local values3 = expr(string.gsub(orig1[i], "then", lastvalue1))
                        lastvalue1 = values3
                        s = s .. fd(rounding(values3, round1)) .. key1
                    else
                        s = s .. fd(orig1[i])
                    end
                end
            end
        else
            s = s .. j
        end
        i = i + 1
        j = j + 1
    end
    s = s .. '</th></tr>'
    s = s .. '<tr><th style="text-align: center;">' .. mw.ustring.gsub(label, "^.", mw.ustring.upper) .. '</th>'
    
    i = 1
    while orig[i] ~= nil and orig[i] ~= "" do
        s = s .. '<td>'
        s = s .. fd(orig[i])
        if pcall(expr, orig[i] .. "*2") ~= false then
            s = s .. key
        end
        s = s .. '</td>'
        i = i + 1
    end
    
    s = s .. '</tr></table>'

    local formula = ""
    
    if displayformula ~= "" then
        formula = formula .. "'''Formula:''' " .. displayformula
    else
        if orig1[1] ~= "" then
            if start ~= nil and start3 ~= nil then
                local scale  = (finish - start) / (times3 - 1)
                local scale1 = (finish3 - start3) / (times3 - 1)
                formula = formula .. "'''Formula:''' "
                if start ~= 0 then
                    formula = formula .. start .. key
                    if scale >= 0 then
                        formula = formula .. "+"
                    end
                end
                if label1 == "level" then
                    formula = formula .. scale .. key .. " for every "
                    if math.abs(scale1) ~= 1 then
                        formula = formula .. scale1
                    end
                    formula = formula .. key1 .. " " .. label1
                    if scale1 > 1 then
                        formula = formula .. "s"
                    end
                    if start3 ~= 0 and start3 ~= 1 then
                        formula = formula .. " starting from " .. label1 .. " " .. start3 .. key1 .. " and"
                    else
                        formula = formula .. ","
                    end
                    formula = formula .. " capped at " .. label1 .. " " .. finish3 .. key1
                else
                    formula = formula .. scale .. key .. " for every "
                    if math.abs(scale1) ~= 1 then
                        formula = formula .. scale1
                    end
                    formula = formula .. key1 .. " "
                    if scale1 ~= 1 then
                        formula = formula .. label1
                        if string.sub(formulalabel1, -1) ~= "s" then
                            formula = formula .. "s"
                        end
                    else
                        if string.sub(formulalabel1, -1) == "s" then
                            if string.sub(label1, -1) == "s" then
                                formula = formula .. string.sub(label1, 1, #label1 - 1)
                            else
                                formula = formula .. string.sub(label1, 1, #label1 - 3)
                            end
                        else
                            formula = formula .. label1
                        end
                    end
                    if start3 ~= 0 and start3 ~= 1 then
                        formula = formula .. " starting from " .. start3 .. key1 .. " "
                        if start3 ~= 1 then
                            formula = formula .. label1
                            if string.sub(formulalabel1, -1) ~= "s" then
                                formula = formula .. "s"
                            end
                        else
                            if string.sub(formulalabel1, -1) == "s" then
                                if string.sub(label1, -1) == "s" then
                                    formula = formula .. string.sub(label1, 1, #label1 - 1)
                                else
                                    formula = formula .. string.sub(label1, 1, #label1 - 3)
                                end
                            else
                                formula = formula .. label1
                            end
                        end
                        formula = formula .. " and"
                    else
                        formula = formula .. ","
                    end
                    formula = formula .. " capped at " .. finish3 .. key1 .. " "
                    if finish3 ~= 1 then
                        formula = formula .. label1
                        if string.sub(formulalabel1, -1) ~= "s" then
                            formula = formula .. "s"
                        end
                    else
                        if string.sub(formulalabel1, -1) == "s" then
                            if string.sub(label1, -1) == "s" then
                                formula = formula .. string.sub(label1, 1, #label1 - 1)
                            else
                                formula = formula .. string.sub(label1, 1, #label1 - 3)
                            end
                        else
                            formula = formula .. label1
                        end
                    end
                end
            end
        else
            if start ~= nil then
                local scale = (finish - start) / (fill1 - 1)
                formula = formula .. "'''Formula:''' "
                if tonumber(tostring(start)) == tonumber(tostring(scale)) then
                    formula = formula .. start .. key .. "&#42;" .. label1
                else
                    formula = formula .. (start - scale) .. key
                    if scale >= 0 then
                        formula = formula .. "+"
                        if scale == 1 then
                            formula = formula .. label1
                        else
                            formula = formula .. scale .. key .. "&#42;" .. label1
                        end
                    else
                        if scale == -1 then
                            formula = formula .. "-" .. label1
                        else
                            formula = formula .. scale .. key .. "&#42;" .. label1
                        end
                    end
                end
            end
            if useformula ~= "" then
                formula = formula .. "'''Formula:''' " .. useformula
            end
        end
    end
    
    if displayformula == "" then
        formula = string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(formula, "%/", " &divide; "), "%*", "&#42;"), "&#42;", " &times; "), "%+", " + "), "%-", " &minus; ")
        if useformula ~= "" then
            formula = string.gsub(formula, "x", label1)
        end
    else
        formula = string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(formula, "%/", "&divide;"), "%*", "&#42;"), "&#42;", "&times;"), "%+", "+"), "%-", "&minus;")
    end
    
    formula = fdmulti(formula)
    local s2 = '<div class="blue-tooltip" style="padding: 10px;">' .. formula
    s2 = s2 .. '<table class="wikitable" style="text-align: center; table-layout: fixed; margin: 0;">'
    s2 = s2 .. '<tr><th style="text-align: center;">' .. mw.ustring.gsub(label1, "^.", mw.ustring.upper)
    
    return s2 .. s .. "</div>"
end

function p.ap(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    local values = ""
    local orig   = args
    local count  = 6
    local fill
    local round  = args["round"] or nil
    if args["skill"] == "R" then
        fill = 3
    else
        fill = 5
    end
    local formula
    local temp, a, b, c
    
    local i = 1
    while orig[i] ~= nil and orig[i] ~= "" do
        if (string.find(orig[i], "to") ~= nil or string.find(orig[i], "x") ~= nil) and string.find(orig[i], "%<") == nil then
            if string.find(orig[i], "to") ~= nil then
                start = string.sub(orig[i], 1, string.find(orig[i], "to") - 1)
            end
            if string.find(orig[i], "x") == nil and pcall(expr, start .. "*2") ~= false then
                finish, times = orig[i]:match".* *to *([^ ]*) *([^ ]*)"
                if finish ~= nil and pcall(expr, finish .. "*2") ~= false and ((times ~= "" and times ~= nil and pcall(expr, times .. "*2") ~= false) or times == "" or times == nil) then
                    start  = tonumber(expr(start))
                    finish = tonumber(expr(finish))
                    if times == "" or times == nil then
                        times = fill
                        fill  = 0
                    else
                        times = tonumber(expr(times))  
                    end
                    count = count - times
                    if count < 0 then
                        return userError("Maximum size exceeded", "LuaError")
                    end
                    x = 1
                    while x <= times do
                        if x == 1 then
                            formula = start
                            scale = (finish - start) / (times - 1)
                        else
                            formula = formula + scale
                        end
                        if values == "" then
                            values = fd(rounding(formula, round))
                        else
                            values = values .. " / " .. fd(rounding(formula, round))
                        end
                        x = x + 1
                    end
                else
                    count = count - 1
                    if count < 0 then
                        return userError("Maximum size exceeded", "LuaError")
                    end
                    if values == "" then
                        values = fd(rounding(orig[i], round))
                    else
                        values = values .. " / " .. fd(rounding(orig[i], round))
                    end
                end
            else
                local times
                local doubleto = orig[i]
                if last(orig[i], " ") ~= last(orig[i], "to ") then
                    times = last(orig[i], " ")
                    if pcall(expr, times .. "*2") ~= false then
                        doubleto = string.sub(doubleto, 1, #doubleto - #times)
                    else
                        times = nil
                    end
                end
                local _, occurences = string.gsub(orig[i], "to", "")
                if occurences > 0 and ((times ~= "" and times ~= nil and pcall(expr, times .. "*2") ~= false) or times == "" or times == nil) then
                    local times2
                    if times == "" or times == nil then
                        times2 = fill
                    else
                        times2 = tonumber(expr(times))  
                    end
                    doubleto = string_to_formula(doubleto, times2)
                end
                useformula = doubleto
                if useformula ~= nil and pcall(expr, string.gsub(useformula, "x", "1") .. "*2") ~= false and ((times ~= "" and times ~= nil and pcall(expr, times .. "*2") ~= false) or times == "" or times == nil) then
                    if times == "" or times == nil then
                        times = fill
                        fill = 0
                    else
                        times = tonumber(expr(times))  
                    end
                    x = 1
                    while x <= times do
                        count = count - 1
                        if count < 0 then
                            return userError("Maximum size exceeded", "LuaError")
                        end
                        formula = string.gsub(useformula, "x", x)
                        if values =="" then
                            values = fd(rounding(expr(formula), round))
                        else
                            values = values .. " / " .. fd(rounding(expr(formula), round))
                        end
                        x = x + 1
                    end
                else
                    count = count - 1
                    if count < 0 then
                        return userError("Maximum size exceeded", "LuaError")
                    end
                    if values == "" then
                        values = fd(rounding(orig[i], round))
                    else
                        values = values .. " / " .. fd(rounding(orig[i], round))
                    end
                end
            end
        else
            count = count - 1
            if count < 0 then
                return userError("Maximum size exceeded", "LuaError")
            end
            if values == "" then
                values = fd(rounding(orig[i], round))
            else
                values = values .. " / " .. fd(rounding(orig[i], round))
            end
        end
        i = i + 1
    end
    return values
end

function string_to_formula(args, times)
    local val = args
    while string.find(val, "to") ~= nil do
        local to1            = string.sub(val, 1, string.find(val, "to") - 1)
        local to2            = string.sub(val, string.find(val, "to") + 2)
        local _, occurences1 = string.gsub(to1, "%(", "")
        local _, occurences2 = string.gsub(to2, "%)", "")
        local para1          = lib.split(to1, "%(")
        local para2          = lib.split(to2, "%)")
        local start, finish  = "", ""
        local times2
        local occurences3    = 0
        local j
        
        j = occurences1 + 1
        while j >= 2 do
            if j == occurences1 + 1 then
                start = para1[j]
            else
                start = "(" .. para1[j] .. start
            end
            _, times2 = string.gsub(para1[j], "%)", "")
            occurences3 = occurences3 + times2
            if occurences1 + 2 - j > occurences3 then
                break
            end
            j = j - 1
        end
        
        if pcall(expr, start .. "*2") == false then
            return args
        end
        
        occurences3 = 0
        j = 1
        while j <= occurences2 do
            if j == 1 then
                finish = para2[j]
            else
                finish = finish .. para2[j] .. ")"
            end
            _, times2 = string.gsub(para2[j], "%(", "")
            occurences3 = occurences3 + times2
            if j > occurences3 then
                break
            end
            j = j + 1
        end
        if pcall(expr, finish .. "*2") == false then
            return args
        end
        start  = string.gsub(start, "([%-%+%*%/%^%(%)])", "%%%1")
        finish = string.gsub(finish, "([%-%+%*%/%^%(%)])", "%%%1")
        val    = string.gsub(val, start .. "to" .. finish, "(" .. start .. ")" .. "+(" .. "(" .. finish .. ")" .. "-" .. "(" .. start .. ")" .. ")/(" .. times .. "-1)*(x-1)")
    end
    return val
end    
    
function expr(val)
    if string.find(val, "[0-9]") == nil then
        return val
    end
    val = string.gsub(val," ","")
    
    local symbol={
    ["^"]=1,
    ["/"]=2,
    ["*"]=3,
    ["+"]=4,
    ["-"]=5,
    [")"]=6,
    ["("]=7
    }
    
    local getmath = {
    ["^"] = function (a,b) return a^b end,
    ["/"] = function (a,b) return a/b end,
    ["*"] = function (a,b) return a*b end,
    ["+"] = function (a,b) return a+b end,
    ["-"] = function (a,b) return a-b end
    }
    
    local symbolstack = {}
    local numberstack = {}
    
    local term=""
    for i=1,#val,1 do
    	term = term .. string.sub(val,i,i)
    	if symbol[term] == nil or ((term == "-" or term == "+") and (symbol[string.sub(val,i-1,i-1)] ~= nil or i-1 == 0) and string.sub(val,i-1,i-1) ~= ")")  then
    		if symbol[string.sub(val,i+1,i+1)] ~= nil or i == #val then
    			table.insert(numberstack,term)
    			term=""
    		end
    	else
    		if symbolstack[#symbolstack] ~= nil and symbol[symbolstack[#symbolstack]] < symbol[term] and term ~= "(" and term ~= ")" then
    			table.insert(numberstack,symbolstack[#symbolstack])
    			symbolstack[#symbolstack] = term
    		else
    			table.insert(symbolstack,term)
    		end
    		if term == ")" then
    			closed = true
    		end
    		term=""
    	end
    	if closed == true then
    		table.remove(symbolstack,#symbolstack)
    		while symbolstack[#symbolstack] ~= "(" do
    			table.insert(numberstack,symbolstack[#symbolstack])
    			table.remove(symbolstack,#symbolstack)
    		end
    		closed = false
    		table.remove(symbolstack,#symbolstack)
    	end
    end
    
    while symbolstack[#symbolstack] ~= nil do
    	table.insert(numberstack,symbolstack[#symbolstack])
    	table.remove(symbolstack,#symbolstack)
    end
    
    local tempstack = {}
    
    while numberstack[#numberstack] ~= nil do
    	if symbol[numberstack[1]] == nil then
    		table.insert(tempstack,numberstack[1])
    	else
    		table.insert(tempstack,getmath[numberstack[1]](tempstack[#tempstack-1], tempstack[#tempstack]))
    		table.remove(tempstack,#tempstack-1)
    		table.remove(tempstack,#tempstack-1)
    	end
    	table.remove(numberstack,1)
    end
    
    if tempstack[1] * 2 ~= nil then
        return tempstack[1] 
    end
end

function last(val, sign)
    return string.sub(val, 1 - (string.find(string.reverse(val), string.reverse(sign), 1, true) or 0))
end

function fd(val)
    return fd_get{args = {val}}
end

function fdmulti(val)
    return fd_getmulti{args = {val}}
end

function rounding(val, decimals)
    local round
    local val = tostring(val)
    if decimals == nil or string.find(val, "[0-9]") == nil or string.find(val, "<span") ~= nil or string.find(val, "%.") == nil then
        return val
    end
    local a, b, c, d = val:match"([^0-9]*)([0-9]*).([0-9]*)(.*)"
    val = tonumber(b .. "." .. c)
    if decimals == "abs" then
        round = math.abs(val)
    end
    if decimals == "floor" then
        round = math.floor(val)
    end
    if decimals == "ceil" then
        round = math.ceil(val)
    end
    if decimals == "trunc" then
        round = string.sub(val, 1, (string.find(val, "%.") or 0) - 1)
    end
    if round == nil then
        local mult = 10 ^ (decimals)
        round = math.floor(val * mult + 0.5) / mult
    end
    return a .. round .. d
end

return p

-- </pre>
--[[Category:Lua]]
Advertisement