模块:B ProjectDivide

来自Limbo Wiki

此模块的文档可以在模块:B ProjectDivide/doc创建

local frame;

if not mw.loadJsonData then
    mw.loadJsonData = function(pageName)
        local str = frame:expandTemplate{title=pageName};
        return mw.text.jsonDecode(str)
    end
end


local getArgs = require('Module:Arguments').getArgs;

local p = {}

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

p.initTableFromName = makeInvokeFunc('_initTableFromName')



local levelNameList = {
    [0] = "C",
    [1] = "B",
    [2] = "A",
    [3] = "S",
}

local actionTypeNameList = {
    ACTIVE = "主动",
    PASSIVE = "被动",
    ENTRANCE = "登场"
}

local buffTypeNameList = {
    taunt = "嘲讽等级",
}

local action2TypeNameList = {
    destory = "销毁"
}

local function getStrFromNumber(number)
    if number == 0 then return "0";
    elseif number > 0 then return "+" .. number;
    else return tostring(number);
    end
end

local function getStrFromOpAndValue(operator,value)
    if operator == 0 then return "+" .. value
    elseif operator == 1 then return "+" .. (value*100) .. "%"
    elseif operator == 2 then return "+" .. value
    elseif operator == 3 then return "*" .. (value*100+100) .. "%"
    end
end

local readConditions,readCondition;
local originalJson;
function readCondition(condition)
    if condition.description then return condition.description;end
    if condition.type == "List" then return readConditions(condition);
    elseif condition.type == "event" then return "事件" .. condition.event .. "发生时"
    elseif condition.type == "condition" then return "条件" .. condition.condition .. "成立时"
    else return "未知条件:" .. mw.dumpObject(condition);
    end
end

function readConditions(cList)
    local desp = string.gsub(cList.condition,"&&"," 且 ");
    desp = string.gsub(desp,"||"," 或 ");
    for _, v in ipairs(cList.list) do
        desp = string.gsub(desp,"%[" .. v.id .. "%]",readCondition(v))
    end
    return desp;
end

local function readSelector(selector,def)
    if not selector then return def;
    elseif selector.type == "self" then return "选中自身"
    elseif selector.type == "supported" then return "选中被援助对象"
    else return "选中 未知选择器:" .. mw.dumpObject(selector);
    end
end

local function readSkill(jsonSkill)
    local skillDes = {}
    skillDes[1] = "【" .. actionTypeNameList[jsonSkill.type] .. "】" .. jsonSkill.name;

    if jsonSkill.cost ~= 0 then skillDes[2] = "(KB" .. getStrFromNumber(0 - jsonSkill.cost) .. "): ";
    else skillDes[2] = ": "
    end

    if jsonSkill.description then skillDes[3] = jsonSkill.description;
    else
        local i = 2;
        if jsonSkill.condition then
            skillDes[2] = skillDes[2] .. "当" .. readCondition(jsonSkill.condition) .. "生效:";
        end

        for _i, v in ipairs(jsonSkill.actionList) do
            i = i + 1;
            if _i ~= 1 then skillDes[i] = ";";i = i + 1;end
            
            if v.description then skillDes[i] = v.description;
            elseif v.type == "addCard" then
                skillDes[i] = readSelector(v.selector,"选中自身");
                i = i + 1;
                skillDes[i] = ",向手牌里加入"
                for _i2, v2 in ipairs(v.cards) do
                    if _i2 ~= 1 then skillDes[i] = "、";i = i + 1;end

                    i = i + 1;
                    if v2.privateID then skillDes[i] = (v2.amount or 1) .. "张 " .. originalJson[v2.privateID].name
                    else error("剩下的分支没写好!")
                    end
                end
            elseif v.type == "buff" then
                skillDes[i] = readSelector(v.selector,"选中自身");
                i = i + 1;
                skillDes[i] = ",使其"
                i = i + 1;
                skillDes[i] = buffTypeNameList[v.name] or v.name or "???";
                i = i + 1;
                skillDes[i] = "属性";
                i = i + 1;
                skillDes[i] = getStrFromOpAndValue(v.operator,v.value);
                if v.duration then
                    i = i + 1;
                    skillDes[i] = ",持续";
                    i = i + 1;
                    skillDes[i] = tostring(v.duration);
                    i = i + 1;
                    skillDes[i] = "回合";
                end
            elseif v.type == "action" then
                if v.before then
                    skillDes[i] = "等待";
                    i = i + 1;
                    skillDes[i] = tostring(v.before);
                    i = i + 1;
                    skillDes[i] = "回合后,";
                    i = i + 1;
                end
                skillDes[i] = readSelector(v.selector,"选中自身");
                i = i + 1;
                skillDes[i] = ","
                i = i + 1;
                skillDes[i] = action2TypeNameList[v.name] or v.name or "???"
                i = i + 1;
                skillDes[i] = "卡牌"
            elseif v.type == "addKB" then
                skillDes[i] = readSelector(v.selector,"选中自身");
                i = i + 1;
                skillDes[i] = ","
                i = i + 1;
                skillDes[i] = getStrFromNumber(v.value)
                i = i + 1;
                skillDes[i] = "KB"
            else skillDes[i] = "未知行为: " .. mw.dumpObject(v);
            end
        end
        i = i + 1;
        skillDes[i] = "。"
    end

     return table.concat(skillDes);
end


local cardTypeList = {
    C = function (json,isWhims)
        local list = {};
        list[1] = json.name;
        list[2] = json.EP;
        list[3] = json.BP;
        list[4] = json.KB;
        list[5] = isWhims and "异想之物" or "???";
        list[6] = levelNameList[json.level];
     -- list[7] = "Ability";
        list[8] = "???援助角色";
        list[9] = "未知编号";
        list[10] = json.description or "";

        local skills = {};
        for index, v in ipairs(json.skills) do
            skills[index] = readSkill(v);
        end
        list[7] = table.concat(skills,"\n\n");
        return frame:expandTemplate{title = "B_PD-C",args = list}
    end,--"角色卡"
    L = "置物卡",
    A = "行动卡",
    T = "反击卡",
}

local function makeTable(json)
    local func = cardTypeList[json.type];
    
    if func then return func(json,false);
    else func = cardTypeList[string.sub(json.type,1,1)];return func(json,true);
    end
end

function p._initTableFromName(args)
    frame = mw.getCurrentFrame();
    local pageName = args[1];
    local json = mw.loadJsonData(args[1])
    local limit = type(args[2]) == "string"
    originalJson = json;
    if json["name"] then
        return makeTable(json)
    elseif limit then local str = "";
        for _, v in ipairs(json) do
            if v.type == limit or v.type == (limit .. "W") then str = str .. makeTable(v) .. "\n\n"; end
        end
        return str;
    else local str = "";
        for _, v in ipairs(json) do
            str = str .. makeTable(v) .. "\n\n";
        end
        return str;
    end
    
end

return p;