Module:ONGEKI Difficulty

Documentation for this module may be created at Module:ONGEKI Difficulty/doc

local p={}
local function VerToNum(args)
	return tonumber(mw.text.trim(mw.getCurrentFrame():expandTemplate{title='VerToNum',args=args}))
end

function p.ongeki_difficulty_multi(frame)
    args=frame:getParent().args
    local version_range_borders = {6,8}
    local result = "オンゲキ "
    if VerToNum({"ongeki", args[1]}) < version_range_borders[1] then
        result = result .. "to R.E.D. difficulty rated from 1 to 14+, "
    else
        result = result .. "difficulty rated "
    end
    -- since #args can't be used, and there's no removals in R.E.D. and older anyway (except ikazuchi nazo which doesn't use this template), i'm removing the period, and moving the comma to the above branch
    -- although there's only two ranges, the loops below shall remain to be future-proof
    local i = 0
    local in_range = {}
    for i = 1, #version_range_borders do
        in_range[i] = false
    end
    local ranges_text = {
        "1 to 15 from R.E.D. PLUS to bright",
        "1 to 15+ from bright MEMORY onwards"
    }
    local j = 1
    local endvernum = nil
    for i = 1, 99, 2 do -- again, ugly hack
        if args[i] == nil then break end
        local startvernum = VerToNum({"ongeki", args[i]})
        endvernum = VerToNum({"ongeki", args[i + 1]})
        if endvernum == nil then
            endvernum = 99
        end
        for j = 1, #version_range_borders do
            local cond = true
            if j + 1 <= #version_range_borders then
                cond = startvernum < version_range_borders[j + 1]
            end
            if endvernum >= version_range_borders[j] and cond then
                in_range[j] = true
            end
        end
    end
    local included_ranges = {}
    for j = 1, #in_range do
        if in_range[j] then
            table.insert(included_ranges, j)
        end
    end
    if #included_ranges == 1 and VerToNum({"ongeki", args[1]}) < version_range_borders[1] then -- first range special case
        result = result .. "and " .. ranges_text[included_ranges[1]] .. "."
        -- print(result)
    else
        for j = 1, #included_ranges do
            result = result .. ranges_text[included_ranges[j]]
            if j == #included_ranges then -- last range
                result = result .. "."
            elseif j == #included_ranges - 1 then -- second to last range
                result = result .. ", and "
            else
                result = result .. ", "
            end
        end
    end
    result = result .. "<br>[[Category:Songs]][[Category:ONGEKI Songs]]"
    if endvernum ~= 99 then
        result = result .. "[[Category:ONGEKI Removed Songs]]"
    end
    return result
end

return p