模块:B ProjectDivide
来自Limbo Wiki Mirror
此模块的文档可以在模块: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;
