模块:配队/卡牌
来自卡厄思梦境WIKI
此模块的文档可以在模块:配队/卡牌/doc创建
local p = {}
-- 引入依赖模块
local getArgs = require('Module:Arguments').getArgs
local cardModule = require('Module:卡牌')
-- 安全的错误输出
local function err(msg)
return '<span style="color: red;">' .. mw.text.encode(msg) .. '</span>'
end
-- 解析 card.order 字符串,返回卡牌名称数组
local function parseCardOrder(orderStr)
if not orderStr or orderStr == "" then
return {}
end
local cards = {}
-- 支持逗号(中英文)和顿号分隔
orderStr = mw.text.trim(orderStr)
for cardName in orderStr:gmatch('([^,、]+)') do
cardName = mw.text.trim(cardName)
if cardName ~= "" then
table.insert(cards, cardName)
end
end
return cards
end
-- 主函数:批量显示指定战斗员的卡牌
-- 参数:
-- moduleName: 战斗员模块名(如 "凯隆")
-- size: 可选,"small"(默认)或 "medium" 或 "large"
function p.main(frame)
local args = getArgs(frame, { removeBlank = true })
local moduleName = args[1] or args.module
local size = args[2] or args.size or "small"
if not moduleName or moduleName == "" then
return err("错误: 未指定战斗员模块名")
end
-- 加载战斗员卡牌数据模块
local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName)
if not success or not cardData then
return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"')
end
-- 获取 card.order
local orderData = cardData.order
if not orderData or (type(orderData) == "table" and #orderData == 0) then
return err('错误: 模块 "' .. moduleName .. '" 没有定义 card.order')
end
-- 如果 order 是表格,取第一个元素
local orderStr = orderData
if type(orderData) == "table" then
orderStr = orderData[1] or ""
end
-- 解析卡牌顺序
local cardNames = parseCardOrder(orderStr)
if #cardNames == 0 then
return err('错误: card.order 为空或格式错误')
end
-- 构建批量调用参数
local batchArgs = {}
for i, cardName in ipairs(cardNames) do
-- 每张卡牌需要5个参数:模块名、卡牌名、变体类型(nil)、变体参数(nil)、变体索引(nil)
table.insert(batchArgs, moduleName)
table.insert(batchArgs, cardName)
table.insert(batchArgs, nil)
table.insert(batchArgs, nil)
table.insert(batchArgs, nil)
end
-- 调用 Module:卡牌 的 batch 函数
local subFrame = {
args = batchArgs,
getParent = function() return frame end
}
return cardModule.batch(subFrame)
end
-- 自定义函数:允许指定特定卡牌列表
-- 用法:{{#invoke:配队/卡牌|custom|模块名|卡牌1|卡牌2|卡牌3|...}}
function p.custom(frame)
local args = getArgs(frame, { removeBlank = true })
local moduleName = args[1]
if not moduleName or moduleName == "" then
return err("错误: 未指定战斗员模块名")
end
-- 收集所有卡牌名称(从第2个参数开始)
local cardNames = {}
local i = 2
while args[i] do
local cardName = mw.text.trim(args[i])
if cardName ~= "" then
table.insert(cardNames, cardName)
end
i = i + 1
end
if #cardNames == 0 then
return err("错误: 未指定任何卡牌")
end
-- 构建批量调用参数
local batchArgs = {}
for _, cardName in ipairs(cardNames) do
table.insert(batchArgs, moduleName)
table.insert(batchArgs, cardName)
table.insert(batchArgs, nil)
table.insert(batchArgs, nil)
table.insert(batchArgs, nil)
end
-- 调用 Module:卡牌 的 batch 函数
local subFrame = {
args = batchArgs,
getParent = function() return frame end
}
return cardModule.batch(subFrame)
end
-- 显示指定战斗员的所有卡牌(包括灵光一闪、神光一闪变体)
-- 用法:{{#invoke:配队/卡牌|all|模块名}}
function p.all(frame)
local args = getArgs(frame, { removeBlank = true })
local moduleName = args[1]
if not moduleName or moduleName == "" then
return err("错误: 未指定战斗员模块名")
end
-- 加载战斗员卡牌数据模块
local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName)
if not success or not cardData then
return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"')
end
-- 收集所有卡牌名称(除了 info 和 order)
local cardNames = {}
for cardName, _ in pairs(cardData) do
if cardName ~= "info" and cardName ~= "order" and type(cardData[cardName]) == "table" then
table.insert(cardNames, cardName)
end
end
table.sort(cardNames) -- 按字母顺序排序
if #cardNames == 0 then
return err("错误: 模块中没有找到任何卡牌")
end
-- 构建批量调用参数
local batchArgs = {}
for _, cardName in ipairs(cardNames) do
table.insert(batchArgs, moduleName)
table.insert(batchArgs, cardName)
table.insert(batchArgs, nil)
table.insert(batchArgs, nil)
table.insert(batchArgs, nil)
end
-- 调用 Module:卡牌 的 batch 函数
local subFrame = {
args = batchArgs,
getParent = function() return frame end
}
return cardModule.batch(subFrame)
end
return p