配队/卡牌:修订间差异
来自卡厄思梦境WIKI
无编辑摘要 |
无编辑摘要 |
||
| 第1行: | 第1行: | ||
local p = {} | local p = {} | ||
-- 使用官方参数解析器 | |||
local getArgs = require('Module:Arguments').getArgs | local getArgs = require('Module:Arguments').getArgs | ||
-- | -- 引入卡牌模块 | ||
local cardModule = require('Module:卡牌') | local cardModule = require('Module:卡牌') | ||
| 第10行: | 第12行: | ||
end | end | ||
-- | -- 安全地从页面获取属性值 | ||
local function | local function getProperty(pageName, propertyName) | ||
if not pageName or pageName == '' then | |||
if not | |||
return nil | return nil | ||
end | end | ||
local | -- 构造完整页面名(如果需要命名空间) | ||
if not | local fullPageName = pageName | ||
if not pageName:match(':') then | |||
fullPageName = '战斗员:' .. pageName | |||
end | |||
-- 检查页面是否存在 | |||
local title = mw.title.new(fullPageName) | |||
if not title or not title.exists then | |||
return nil | return nil | ||
end | end | ||
-- | -- 尝试获取属性 | ||
local ok, result = pcall(function() | |||
return mw.ext.cargo.query( | |||
'战斗员', | |||
propertyName, | |||
{ where = '_pageName="' .. fullPageName .. '"' } | |||
) | |||
end) | |||
if value then | if ok and result and result[1] and result[1][propertyName] then | ||
return result[1][propertyName] | |||
end | |||
-- 如果 Cargo 失败,尝试直接从页面源码解析 | |||
local content = title:getContent() | |||
if content then | |||
local pattern = '|' .. propertyName .. '%s*=%s*([^\n|]*)' | |||
local value = content:match(pattern) | |||
if value then | |||
value = mw.text.trim(value) | |||
if value ~= '' then | |||
return value | |||
end | |||
end | end | ||
end | end | ||
| 第37行: | 第59行: | ||
end | end | ||
-- | -- 解析卡牌字符串(格式:模块名|卡牌名 或 模块名|卡牌名|变体类型|变体参数|变体索引) | ||
local function | local function parseCardString(cardStr) | ||
if not cardStr or cardStr == '' then | |||
return nil | |||
end | |||
cardStr = mw.text.trim(cardStr) | |||
local parts = {} | |||
for part in cardStr:gmatch('([^|]+)') do | |||
table.insert(parts, mw.text.trim(part)) | |||
end | |||
if #parts < 2 then | |||
return nil | |||
end | end | ||
return | return { | ||
moduleName = parts[1], | |||
cardName = parts[2], | |||
variantType = parts[3], | |||
variantParam = parts[4], | |||
variantIndex = parts[5] | |||
} | |||
end | end | ||
| 第58行: | 第88行: | ||
function p.main(frame) | function p.main(frame) | ||
local args = getArgs(frame, { removeBlank = true }) | local args = getArgs(frame, { removeBlank = true }) | ||
if not | -- 第一个参数是战斗员名称 | ||
local characterName = args[1] | |||
if not characterName or characterName == '' then | |||
return err('错误: 未指定战斗员名称') | return err('错误: 未指定战斗员名称') | ||
end | end | ||
-- | -- 定义要读取的卡牌字段列表(按顺序) | ||
local | local cardFields = { | ||
'自我意识技能', | '自我意识技能', | ||
'起始卡牌_1', | '起始卡牌_1', | ||
| 第84行: | 第109行: | ||
} | } | ||
-- | -- 收集所有卡牌数据 | ||
local | local cardDataList = {} | ||
for _, | for _, fieldName in ipairs(cardFields) do | ||
local | local cardStr = getProperty(characterName, fieldName) | ||
if cardStr and cardStr ~= '' then | |||
if | local cardData = parseCardString(cardStr) | ||
if cardData then | |||
local | table.insert(cardDataList, cardData) | ||
if | |||
end | end | ||
end | end | ||
| 第111行: | 第123行: | ||
-- 如果没有找到任何卡牌 | -- 如果没有找到任何卡牌 | ||
if # | if #cardDataList == 0 then | ||
return err('错误: 战斗员 "' .. | return err('错误: 战斗员 "' .. characterName .. '" 没有配置任何卡牌') | ||
end | end | ||
-- | -- 使用 batch 渲染所有卡牌 | ||
local batchArgs = {} | |||
for _, cardData in ipairs(cardDataList) do | |||
table.insert(batchArgs, cardData.moduleName) | |||
table.insert(batchArgs, cardData.cardName) | |||
table.insert(batchArgs, cardData.variantType or '') | |||
table.insert(batchArgs, cardData.variantParam or '') | |||
table.insert(batchArgs, cardData.variantIndex or '') | |||
end | |||
-- 创建一个模拟的 frame 调用 batch | |||
local batchFrame = { | local batchFrame = { | ||
args = batchArgs, | args = batchArgs, | ||
| 第122行: | 第144行: | ||
return cardModule.batch(batchFrame) | return cardModule.batch(batchFrame) | ||
end | end | ||
return p | return p | ||
2025年10月18日 (六) 22:22的版本
此模块的文档可以在模块:配队/卡牌/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
-- 安全地从页面获取属性值
local function getProperty(pageName, propertyName)
if not pageName or pageName == '' then
return nil
end
-- 构造完整页面名(如果需要命名空间)
local fullPageName = pageName
if not pageName:match(':') then
fullPageName = '战斗员:' .. pageName
end
-- 检查页面是否存在
local title = mw.title.new(fullPageName)
if not title or not title.exists then
return nil
end
-- 尝试获取属性
local ok, result = pcall(function()
return mw.ext.cargo.query(
'战斗员',
propertyName,
{ where = '_pageName="' .. fullPageName .. '"' }
)
end)
if ok and result and result[1] and result[1][propertyName] then
return result[1][propertyName]
end
-- 如果 Cargo 失败,尝试直接从页面源码解析
local content = title:getContent()
if content then
local pattern = '|' .. propertyName .. '%s*=%s*([^\n|]*)'
local value = content:match(pattern)
if value then
value = mw.text.trim(value)
if value ~= '' then
return value
end
end
end
return nil
end
-- 解析卡牌字符串(格式:模块名|卡牌名 或 模块名|卡牌名|变体类型|变体参数|变体索引)
local function parseCardString(cardStr)
if not cardStr or cardStr == '' then
return nil
end
cardStr = mw.text.trim(cardStr)
local parts = {}
for part in cardStr:gmatch('([^|]+)') do
table.insert(parts, mw.text.trim(part))
end
if #parts < 2 then
return nil
end
return {
moduleName = parts[1],
cardName = parts[2],
variantType = parts[3],
variantParam = parts[4],
variantIndex = parts[5]
}
end
-- 主函数
function p.main(frame)
local args = getArgs(frame, { removeBlank = true })
-- 第一个参数是战斗员名称
local characterName = args[1]
if not characterName or characterName == '' then
return err('错误: 未指定战斗员名称')
end
-- 定义要读取的卡牌字段列表(按顺序)
local cardFields = {
'自我意识技能',
'起始卡牌_1',
'起始卡牌_2',
'起始卡牌_3',
'起始卡牌_4',
'独特卡牌_1',
'独特卡牌_2',
'独特卡牌_3',
'独特卡牌_4'
}
-- 收集所有卡牌数据
local cardDataList = {}
for _, fieldName in ipairs(cardFields) do
local cardStr = getProperty(characterName, fieldName)
if cardStr and cardStr ~= '' then
local cardData = parseCardString(cardStr)
if cardData then
table.insert(cardDataList, cardData)
end
end
end
-- 如果没有找到任何卡牌
if #cardDataList == 0 then
return err('错误: 战斗员 "' .. characterName .. '" 没有配置任何卡牌')
end
-- 使用 batch 渲染所有卡牌
local batchArgs = {}
for _, cardData in ipairs(cardDataList) do
table.insert(batchArgs, cardData.moduleName)
table.insert(batchArgs, cardData.cardName)
table.insert(batchArgs, cardData.variantType or '')
table.insert(batchArgs, cardData.variantParam or '')
table.insert(batchArgs, cardData.variantIndex or '')
end
-- 创建一个模拟的 frame 调用 batch
local batchFrame = {
args = batchArgs,
getParent = function() return frame end
}
return cardModule.batch(batchFrame)
end
return p