Module:SongUnlock

来自Rotaeno中文维基
SSF讨论 | 贡献2023年12月14日 (四) 17:43的版本

可在Module:SongUnlock/doc创建此模块的帮助文档

local p = {}

local data = require("Module:Rotaeno Data")
local getArgs = require('Module:Arguments').getArgs

local function packName(name)
    if string.find(name, "%[")
    then
        return name
    else
        return "[["..name.."]]"
    end
end

local function makeInvokeFunc(funcName)
    return function(frame)
        local args = getArgs(frame)
        return p[funcName](args)
    end
end

p.main = makeInvokeFunc('_main')
function p._main(args)-- 生成HTML的主函数 部分代码来源:[[Module:Songtable]]

    local function doArgExist(a) -- 必须放在这,免得出问题
        local arg = args[a]
        return type(arg) == "string" and arg ~= "";
    end

    local function getResult(func,tag)
        if type(func) == "function" then return func(tag);end
        return tag:wikitext(tostring(func))
    end

    local function getCondition(lvl)
        local needRa;
        if type(lvl) == "nil" then needRa = "[音律值要求]"
        elseif lvl > 12.9 then needRa = 12;   -- 13
        elseif lvl > 12.6 then needRa = 11.7; -- 12+
        elseif lvl > 11.9 then needRa = 11.0; -- 12
        elseif lvl > 11.6 then needRa = 10.7; -- 11+
        else                   needRa = 10;   -- 11~8
        end
        return '<span style="color:#e65100">难度Ⅲ</span>评级达到S 或 [[音律值]]达到' .. tostring(needRa);
    end

    -- 从参数或者页面名称读取曲目名称
    local songName
    if args['曲名'] then songName = args['曲名']
        else songName = mw.getCurrentFrame():preprocess("{{FULLPAGENAME}}")
    end

    -- 如果是从页面名读取的,那可能因为mediawiki限制导致页面名和曲名不符。如果有这个转换规则的话,使用转换JSON进行转换。
    local covList = mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Transition.json' })["displayNameToSongName"]
    if covList[songName] then songName = covList[songName] end

    -- 生成查找函数。
    local query
    if args['id'] then
        query = data.singleSongInformation(args['id'], "id")
    else
        query = data.singleSongInformation(songName, "name")
    end

    local DefaultValue;
    local isDefault = {
        not doArgExist("难度I解禁方法"),
        not doArgExist("难度II解禁方法"),
        not doArgExist("难度III解禁方法"),
        not doArgExist("难度IV解禁方法"),
        type(args["disableAuto"]) == "nil", -- 用于判断应不应该初始化难度IV解禁方法的文本
    }
    local unlockCondition;
    

    if args["曲目解禁方法"] then -- 老版本/自定义
        unlockCondition = args["曲目解禁方法"];
    elseif args["需求旅行者徽章"] then -- 
        unlockCondition = "使用" .. args["需求旅行者徽章"] .. "个旅行者徽章解锁"
    elseif args["需求等级"] then -- 
        unlockCondition = "等级达到" .. args["需求等级"]
    elseif args["旅程模式"] then -- 
        unlockCondition = "于旅程模式 星球“" .. args["旅程模式"] .. "”内解锁"
    elseif args["章节挑战"] then -- 
        unlockCondition = "于旅程模式 星球“" .. args["章节挑战"] .. "”内解锁章节挑战"
        DefaultValue = "通关 “" .. args["章节挑战"] .. "” 章节挑战对应难度后解锁"
        isDefault[5] = false;
    elseif args["曲包"] then -- 
        if packName(args["曲包"]) == "[[星际之声]]" 
            then unlockCondition = "购买单曲 [" .. songName .. "]"
            else unlockCondition = function(tag)
                    --"购买歌曲包 [&zwnj;" .. packName(args["曲包"]) .. "&zwnj;]"
                    return tag:wikitext("购买歌曲包 [")
                                :tag("span"):wikitext(packName(args["曲包"])):done()
                                :wikitext("]")
                end
            end
    else -- 假设前面的条件没一个满足,那么理论上是忘写了
        unlockCondition = "[待补充]"
    end

    if isDefault[5] then -- 初始化难度IV解禁方法
        args["难度IV解禁方法"] = args["难度IV解禁方法"] or getCondition(query("rating4"));
        isDefault[4] = false;
    end

    DefaultValue = args["defaultValue"] or DefaultValue or "-"
    --- 构建HTML ---
    local box = mw.html.create("table"):addClass("rotable unlockTable")

    local function getDefValue(start)
        local tmp = 1;
        for i=start+1,4 do
            if isDefault[i] then tmp = tmp + 1;
            else return tmp;
            end
        end
        return tmp;
    end

    -- 第一行:通用条件
    local tag = 
        box:tag("tr"):tag("th"):wikitext("曲目解锁"):attr("rowspan", "5"):css("width", "6em"):done()
            :tag("td"):wikitext("通用条件"):css("width", "8em"):done()
            :tag("td"); tag = getResult(unlockCondition,tag):done()
        :done();

    -- 第二行:难度I
    tag = 
        box:tag("tr")
            :tag("td"):wikitext("难度Ⅰ"):css("color", "#43a047"):done()
            
    if isDefault[1] 
        then tag = tag:tag("td"):wikitext(DefaultValue):attr("rowspan",getDefValue(1));
        else tag = tag:tag("td"):wikitext(args["难度I解禁方法"])
    end
    tag:done()

    -- 第三行:难度II
    tag = 
        box:tag("tr")
            :tag("td"):wikitext("难度Ⅱ"):css("color", "#1565c0"):done()
            
    if isDefault[2] 
        then if not isDefault[1] then
                tag = tag:tag("td"):wikitext(DefaultValue):attr("rowspan",getDefValue(2));
            end
        else tag = tag:tag("td"):wikitext(args["难度II解禁方法"])
    end
    tag:done()

    -- 第四行:难度III
    tag = 
        box:tag("tr")
            :tag("td"):wikitext("难度Ⅲ"):css("color", "#e65100"):done()
            
    if isDefault[3] 
        then if not isDefault[2] then
                tag = tag:tag("td"):wikitext(DefaultValue):attr("rowspan",getDefValue(3));
            end
        else tag = tag:tag("td"):wikitext(args["难度III解禁方法"])
    end
    tag:done()

    -- 第五行:难度IV

    tag = 
        box:tag("tr")
            :tag("td"):wikitext("难度Ⅳ"):css("color", "#ab47bc"):done()
            
    if isDefault[4] 
        then if not isDefault[3] then
                tag = tag:tag("td"):wikitext(DefaultValue);
            end
        else tag = tag:tag("td"):wikitext(args["难度IV解禁方法"])
    end
    tag:done()
    
    return tostring(box)
end

return p