模块

配队/卡牌:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
 
(未显示同一用户的13个中间版本)
第1行: 第1行:
-- Module:配队卡牌
local p = {}
local p = {}


-- 引用卡牌模块和显示模块
-- 引入依赖模块
local getArgs = require('Module:Arguments').getArgs
local cardModule = require('Module:卡牌')
local cardModule = require('Module:卡牌')
local cardDisplay = require('Module:卡牌/display')
local getArgs = require('Module:Arguments').getArgs


-- 解析卡牌数据并渲染小尺寸卡牌
-- 安全的错误输出
local function renderSmallCard(moduleName, cardName)
local function err(msg)
     if not moduleName or moduleName == "" or not cardName or cardName == "" then
    return '<span style="color: red;">' .. mw.text.encode(msg) .. '</span>'
         return ""
end
 
-- 安全的字符串处理函数
local function safeString(str)
    if not str then return "" end
    str = tostring(str)
    -- 确保字符串是有效的UTF-8
     if not mw.ustring then
        return str
    end
    -- 移除可能的BOM和其他非打印字符
    str = mw.text.trim(str)
    return str
end
 
-- 解析 card.order 字符串,返回卡牌名称数组
local function parseCardOrder(orderStr)
    orderStr = safeString(orderStr)
    if orderStr == "" then
        return {}
    end
   
    local cards = {}
    -- 保留卡牌名称中的中文标点符号
    for cardName in mw.ustring.gmatch(orderStr, '([^,]+)') do
        cardName = mw.text.trim(cardName)
        if cardName ~= "" then
            table.insert(cards, cardName)
        end
    end
   
    return cards
end
 
-- 主函数:批量显示指定战斗员的卡牌
-- 参数:
--  moduleName: 战斗员模块名(如 "凯隆")
function p.main(frame)
    local args = getArgs(frame, { removeBlank = true })
   
    local moduleName = args[1] or args.module
   
    moduleName = safeString(moduleName)
    if moduleName == "" then
         return err("错误: 未指定战斗员模块名")
     end
     end
      
      
     -- 加载卡牌数据模块
     -- 加载战斗员卡牌数据模块
     local success, dataModule = pcall(require, 'Module:卡牌/' .. moduleName)
     local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName)
     if not success or not dataModule then
     if not success or not cardData then
         return '<span style="color:red;">找不到模块: ' .. moduleName .. '</span>'
         return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"')
     end
     end
      
      
     local moduleInfo = dataModule.info or {}
     -- 获取 card.order
     local cardDataWrapper = dataModule[cardName]
     local orderData = cardData.order
     if not cardDataWrapper or not cardDataWrapper.base then
     if not orderData then
         return '<span style="color:red;">找不到卡牌: ' .. cardName .. '</span>'
         return err('错误: 模块 "' .. moduleName .. '" 没有定义 card.order')
     end
     end
      
      
     -- 解析卡牌数据
     -- 如果 order 是表格,取第一个元素
     local cardInfo = cardModule.parseCardData(
     local orderStr = orderData
         cardDataWrapper.base,
    if type(orderData) == "table" then
        moduleName,
         if #orderData == 0 then
        cardName,
            return err('错误: card.order 为空')
         moduleInfo,
         end
         { isVariant = false }
         orderStr = orderData[1]
     )
     end
      
      
     if not cardInfo then
    orderStr = safeString(orderStr)
         return '<span style="color:red;">无法解析卡牌数据</span>'
     if orderStr == "" then
         return err('错误: card.order 为空或格式错误')
     end
     end
      
      
     -- 生成唯一ID
     -- 解析卡牌顺序
     local cardId = "team-card-" .. moduleName .. "-" .. cardName .. "-" .. os.time()
     local cardNames = parseCardOrder(orderStr)
    if #cardNames == 0 then
        return err('错误: card.order 解析后为空,原始值: ' .. mw.text.encode(orderStr))
    end
      
      
     -- 计算词典显示
     -- 直接构建 HTML 而不是调用 batch
     local dictDisplay = ""
     local html = {}
     if cardInfo.dictTokens and type(cardInfo.dictTokens) == 'table' then
     table.insert(html, '<div style="display:flex;gap:0px;flex-wrap:wrap;">')
        local parts = {}
   
        for _, t in ipairs(cardInfo.dictTokens) do
    for i, cardName in ipairs(cardNames) do
            local value = mw.text.trim(t.value or '')
        -- 为每张卡牌创建独立的 frame
             if value ~= '' then
        local subFrame = {
                if t.type == 'template' then
             args = {moduleName, cardName},
                    table.insert(parts, '{{词典|' .. value .. '}}')
            getParent = function() return frame end
                elseif t.type == 'text' then
         }
                    table.insert(parts, value)
         table.insert(html, cardModule.main(subFrame))
                end
            end
         end
         if #parts > 0 then
            local color = cardInfo.dictColor == 'green' and '#b5f651' or '#f2ba02'
            dictDisplay = '<span style="color: ' .. color .. '">[' .. table.concat(parts, '/') .. ']</span><br>'
        end
     end
     end
      
      
     -- 使用卡牌显示模块渲染小卡牌
     table.insert(html, '</div>')
     return cardDisplay.renderSmallCard(cardInfo, cardId, dictDisplay)
   
     return table.concat(html, '')
end
end


-- 主函数:显示战斗员的配队卡牌(直接传参版本)
-- 自定义函数:允许指定特定卡牌列表
function p.main(frame)
-- 用法:{{#invoke:配队/卡牌|custom|模块名|卡牌1|卡牌2|卡牌3|...}}
     local args = getArgs(frame)
function p.custom(frame)
     local args = getArgs(frame, { removeBlank = true })
   
    local moduleName = safeString(args[1])
    if moduleName == "" then
        return err("错误: 未指定战斗员模块名")
    end
   
    -- 收集所有卡牌名称(从第2个参数开始)
    local cardNames = {}
    local i = 2
    while args[i] do
        local cardName = safeString(args[i])
        if cardName ~= "" then
            table.insert(cardNames, cardName)
        end
        i = i + 1
    end
   
    if #cardNames == 0 then
        return err("错误: 未指定任何卡牌")
    end
   
    -- 直接构建 HTML
     local html = {}
     local html = {}
    table.insert(html, '<div style="display:flex;gap:0px;flex-wrap:wrap;">')
      
      
     -- 开始容器
     for _, cardName in ipairs(cardNames) do
     table.insert(html, '<div class="combatant-cards" style="margin: 20px 0;">')
        local subFrame = {
            args = {moduleName, cardName},
            getParent = function() return frame end
        }
        table.insert(html, cardModule.main(subFrame))
    end
   
     table.insert(html, '</div>')
      
      
     -- 标题
     return table.concat(html, '')
     local title = args.title or '配队卡牌'
end
    table.insert(html, '<h3 style="margin-bottom: 15px;">' .. title .. '</h3>')
 
-- 显示指定战斗员的所有卡牌(按字母顺序)
-- 用法:{{#invoke:配队/卡牌|all|模块名}}
function p.all(frame)
     local args = getArgs(frame, { removeBlank = true })
      
      
     -- 卡牌容器
     local moduleName = safeString(args[1])
     table.insert(html, '<div style="display:flex;gap:15px;flex-wrap:wrap;align-items:flex-start;">')
     if moduleName == "" then
        return err("错误: 未指定战斗员模块名")
    end
      
      
     -- 按顺序处理卡牌
     -- 加载战斗员卡牌数据模块
     local cardOrder = {
     local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName)
        {param = '自我意识技能', label = '自我意识技能'},
    if not success or not cardData then
        {param = '起始卡牌1', label = '起始卡牌1'},
         return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"')
        {param = '起始卡牌2', label = '起始卡牌2'},
     end
        {param = '起始卡牌3', label = '起始卡牌3'},
         {param = '起始卡牌4', label = '起始卡牌4'},
        {param = '独特卡牌1', label = '独特卡牌1'},
        {param = '独特卡牌2', label = '独特卡牌2'},
        {param = '独特卡牌3', label = '独特卡牌3'},
        {param = '独特卡牌4', label = '独特卡牌4'}
     }
      
      
     for _, cardInfo in ipairs(cardOrder) do
     -- 收集所有卡牌名称(除了 info 和 order)
        local cardValue = args[cardInfo.param]
    local cardNames = {}
        if cardValue and cardValue ~= "" then
    for cardName, _ in pairs(cardData) do
            -- 解析卡牌值(格式:模块名|卡牌名 或 模块名/卡牌名)
        if cardName ~= "info" and cardName ~= "order" and type(cardData[cardName]) == "table" then
            local moduleName, cardName
            table.insert(cardNames, cardName)
           
            -- 尝试用 | 分割
            moduleName, cardName = string.match(tostring(cardValue), "^([^|]+)|(.+)$")
           
            -- 如果失败,尝试用 / 分割
            if not moduleName then
                moduleName, cardName = string.match(tostring(cardValue), "^([^/]+)/(.+)$")
            end
           
            -- 如果还是失败,尝试用空格分割
            if not moduleName then
                moduleName, cardName = string.match(tostring(cardValue), "^(%S+)%s+(.+)$")
            end
           
            if moduleName and cardName then
                -- 添加卡牌槽位
                table.insert(html, '<div class="card-slot" style="display:flex;flex-direction:column;align-items:center;">')
               
                -- 添加标签(可选)
                if args.showLabels ~= "false" then
                    table.insert(html, '<div style="font-size:12px;color:#666;margin-bottom:5px;">' .. cardInfo.label .. '</div>')
                end
               
                -- 渲染小尺寸卡牌
                table.insert(html, renderSmallCard(moduleName, cardName))
               
                table.insert(html, '</div>')
            else
                -- 如果无法解析,显示错误
                table.insert(html, '<div class="card-slot" style="display:flex;flex-direction:column;align-items:center;">')
                if args.showLabels ~= "false" then
                    table.insert(html, '<div style="font-size:12px;color:#666;margin-bottom:5px;">' .. cardInfo.label .. '</div>')
                end
                table.insert(html, '<span style="color:red;">无法解析: ' .. tostring(cardValue) .. '</span>')
                table.insert(html, '</div>')
            end
         end
         end
     end
     end
      
      
     table.insert(html, '</div>') -- 结束卡牌容器
    table.sort(cardNames)  -- 按字母顺序排序
     table.insert(html, '</div>') -- 结束主容器
   
    if #cardNames == 0 then
        return err("错误: 模块中没有找到任何卡牌")
    end
   
    -- 直接构建 HTML
    local html = {}
     table.insert(html, '<div style="display:flex;gap:0px;flex-wrap:wrap;">')
   
    for _, cardName in ipairs(cardNames) do
        local subFrame = {
            args = {moduleName, cardName},
            getParent = function() return frame end
        }
        table.insert(html, cardModule.main(subFrame))
    end
   
     table.insert(html, '</div>')
      
      
     return table.concat(html, '')
     return table.concat(html, '')
end
end


-- 简化版本:直接显示卡牌列表
-- 调试函数:显示 card.order 的原始内容
function p.show(frame)
function p.debug(frame)
     local args = getArgs(frame)
     local args = getArgs(frame, { removeBlank = true })
    local moduleName = safeString(args[1])
   
    if moduleName == "" then
        return err("错误: 未指定战斗员模块名")
    end
   
    local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName)
    if not success or not cardData then
        return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"')
    end
   
    local orderData = cardData.order
     local html = {}
     local html = {}
      
      
     table.insert(html, '<div style="display:flex;gap:15px;flex-wrap:wrap;align-items:flex-start;">')
     table.insert(html, '<div style="background:#f9f9f9;border:1px solid #ccc;padding:0px;margin:10px 0;">')
    table.insert(html, '<b>调试信息:</b><br>')
    table.insert(html, '<b>order 类型:</b>' .. type(orderData) .. '<br>')
      
      
     -- 遍历所有参数
     if type(orderData) == "table" then
    local i = 1
        table.insert(html, '<b>order 长度:</b>' .. #orderData .. '<br>')
    while args[i] do
        for i, v in ipairs(orderData) do
        local cardValue = args[i]
             table.insert(html, '<b>order[' .. i .. ']:</b>' .. mw.text.encode(tostring(v)) .. '<br>')
        if cardValue and cardValue ~= "" then
            -- 解析卡牌值
            local moduleName, cardName
           
            -- 尝试用 | 分割
            moduleName, cardName = string.match(tostring(cardValue), "^([^|]+)|(.+)$")
              
            -- 如果失败,尝试用 / 分割
            if not moduleName then
                moduleName, cardName = string.match(tostring(cardValue), "^([^/]+)/(.+)$")
            end
           
            if moduleName and cardName then
                table.insert(html, renderSmallCard(moduleName, cardName))
            end
         end
         end
         i = i + 1
    else
         table.insert(html, '<b>order 值:</b>' .. mw.text.encode(tostring(orderData)) .. '<br>')
    end
   
    local orderStr = type(orderData) == "table" and orderData[1] or orderData
    local cardNames = parseCardOrder(orderStr)
   
    table.insert(html, '<b>解析后的卡牌数量:</b>' .. #cardNames .. '<br>')
    for i, name in ipairs(cardNames) do
        table.insert(html, '<b>' .. i .. '.</b> ' .. mw.text.encode(name) .. '<br>')
     end
     end
      
      
第178行: 第237行:
end
end


-- 从SMW属性读取(需要在页面模板中使用)
-- 配队模拟器专用:显示带有元数据的卡牌
function p.fromSMW(frame)
function p.deck(frame)
     local args = getArgs(frame)
     local args = getArgs(frame, { removeBlank = true })
   
    local moduleName = safeString(args[1])
    if 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 then
        return err('错误: 模块 "' .. moduleName .. '" 没有定义 card.order')
    end
   
    -- 如果 order 是表格,取第一个元素
    local orderStr = orderData
    if type(orderData) == "table" then
        if #orderData == 0 then
            return err('错误: card.order 为空')
        end
        orderStr = orderData[1]
    end
   
    orderStr = safeString(orderStr)
    if orderStr == "" then
        return err('错误: card.order 为空或格式错误')
    end
   
    -- 解析卡牌顺序
    local cardNames = parseCardOrder(orderStr)
    if #cardNames == 0 then
        return err('错误: card.order 解析后为空')
    end
   
    -- 构建带有特殊标记的 HTML
     local html = {}
     local html = {}
    table.insert(html, '<div class="deck-cards-container" style="display:flex;gap:0px;flex-wrap:wrap;min-height:360px;">')
      
      
     -- 获取当前页面
     for i, cardName in ipairs(cardNames) do
    local title = mw.title.getCurrentTitle()
        -- 为每张卡牌创建包装器,包含元数据
    local pageName = args[1] or title.text
        table.insert(html, '<div class="deck-card-wrapper" data-module="' .. mw.text.encode(moduleName) .. '" data-card="' .. mw.text.encode(cardName) .. '" style="display:inline-block;">')
       
        -- 调用原始的卡牌显示
        local subFrame = {
            args = {moduleName, cardName},
            getParent = function() return frame end
        }
        table.insert(html, cardModule.main(subFrame))
       
        table.insert(html, '</div>')
    end
      
      
     -- 尝试从frame获取SMW数据(在模板调用时)
     table.insert(html, '</div>')
    local cardData = {
        skill = args['自我意识技能'],
        start1 = args['起始卡牌_1'],
        start2 = args['起始卡牌_2'],
        start3 = args['起始卡牌_3'],
        start4 = args['起始卡牌_4'],
        unique1 = args['独特卡牌_1'],
        unique2 = args['独特卡牌_2'],
        unique3 = args['独特卡牌_3'],
        unique4 = args['独特卡牌_4']
    }
      
      
     -- 构建参数
     return table.concat(html, '')
    local newArgs = {
        title = args.title or (pageName .. ' - 配队卡牌'),
        showLabels = args.showLabels,
        ['自我意识技能'] = cardData.skill,
        ['起始卡牌1'] = cardData.start1,
        ['起始卡牌2'] = cardData.start2,
        ['起始卡牌3'] = cardData.start3,
        ['起始卡牌4'] = cardData.start4,
        ['独特卡牌1'] = cardData.unique1,
        ['独特卡牌2'] = cardData.unique2,
        ['独特卡牌3'] = cardData.unique3,
        ['独特卡牌4'] = cardData.unique4
    }
   
    -- 创建新frame并调用main
    local newFrame = mw.getCurrentFrame():newChild{ args = newArgs }
    return p.main(newFrame)
end
end


return p
return p

2025年11月1日 (六) 16:57的最新版本

此模块的文档可以在模块:配队/卡牌/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 safeString(str)
    if not str then return "" end
    str = tostring(str)
    -- 确保字符串是有效的UTF-8
    if not mw.ustring then
        return str
    end
    -- 移除可能的BOM和其他非打印字符
    str = mw.text.trim(str)
    return str
end

-- 解析 card.order 字符串,返回卡牌名称数组
local function parseCardOrder(orderStr)
    orderStr = safeString(orderStr)
    if orderStr == "" then
        return {}
    end
    
    local cards = {}
    -- 保留卡牌名称中的中文标点符号
    for cardName in mw.ustring.gmatch(orderStr, '([^,]+)') do
        cardName = mw.text.trim(cardName)
        if cardName ~= "" then
            table.insert(cards, cardName)
        end
    end
    
    return cards
end

-- 主函数:批量显示指定战斗员的卡牌
-- 参数:
--   moduleName: 战斗员模块名(如 "凯隆")
function p.main(frame)
    local args = getArgs(frame, { removeBlank = true })
    
    local moduleName = args[1] or args.module
    
    moduleName = safeString(moduleName)
    if 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 then
        return err('错误: 模块 "' .. moduleName .. '" 没有定义 card.order')
    end
    
    -- 如果 order 是表格,取第一个元素
    local orderStr = orderData
    if type(orderData) == "table" then
        if #orderData == 0 then
            return err('错误: card.order 为空')
        end
        orderStr = orderData[1]
    end
    
    orderStr = safeString(orderStr)
    if orderStr == "" then
        return err('错误: card.order 为空或格式错误')
    end
    
    -- 解析卡牌顺序
    local cardNames = parseCardOrder(orderStr)
    if #cardNames == 0 then
        return err('错误: card.order 解析后为空,原始值: ' .. mw.text.encode(orderStr))
    end
    
    -- 直接构建 HTML 而不是调用 batch
    local html = {}
    table.insert(html, '<div style="display:flex;gap:0px;flex-wrap:wrap;">')
    
    for i, cardName in ipairs(cardNames) do
        -- 为每张卡牌创建独立的 frame
        local subFrame = {
            args = {moduleName, cardName},
            getParent = function() return frame end
        }
        table.insert(html, cardModule.main(subFrame))
    end
    
    table.insert(html, '</div>')
    
    return table.concat(html, '')
end

-- 自定义函数:允许指定特定卡牌列表
-- 用法:{{#invoke:配队/卡牌|custom|模块名|卡牌1|卡牌2|卡牌3|...}}
function p.custom(frame)
    local args = getArgs(frame, { removeBlank = true })
    
    local moduleName = safeString(args[1])
    if moduleName == "" then
        return err("错误: 未指定战斗员模块名")
    end
    
    -- 收集所有卡牌名称(从第2个参数开始)
    local cardNames = {}
    local i = 2
    while args[i] do
        local cardName = safeString(args[i])
        if cardName ~= "" then
            table.insert(cardNames, cardName)
        end
        i = i + 1
    end
    
    if #cardNames == 0 then
        return err("错误: 未指定任何卡牌")
    end
    
    -- 直接构建 HTML
    local html = {}
    table.insert(html, '<div style="display:flex;gap:0px;flex-wrap:wrap;">')
    
    for _, cardName in ipairs(cardNames) do
        local subFrame = {
            args = {moduleName, cardName},
            getParent = function() return frame end
        }
        table.insert(html, cardModule.main(subFrame))
    end
    
    table.insert(html, '</div>')
    
    return table.concat(html, '')
end

-- 显示指定战斗员的所有卡牌(按字母顺序)
-- 用法:{{#invoke:配队/卡牌|all|模块名}}
function p.all(frame)
    local args = getArgs(frame, { removeBlank = true })
    
    local moduleName = safeString(args[1])
    if 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
    
    -- 直接构建 HTML
    local html = {}
    table.insert(html, '<div style="display:flex;gap:0px;flex-wrap:wrap;">')
    
    for _, cardName in ipairs(cardNames) do
        local subFrame = {
            args = {moduleName, cardName},
            getParent = function() return frame end
        }
        table.insert(html, cardModule.main(subFrame))
    end
    
    table.insert(html, '</div>')
    
    return table.concat(html, '')
end

-- 调试函数:显示 card.order 的原始内容
function p.debug(frame)
    local args = getArgs(frame, { removeBlank = true })
    local moduleName = safeString(args[1])
    
    if moduleName == "" then
        return err("错误: 未指定战斗员模块名")
    end
    
    local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName)
    if not success or not cardData then
        return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"')
    end
    
    local orderData = cardData.order
    local html = {}
    
    table.insert(html, '<div style="background:#f9f9f9;border:1px solid #ccc;padding:0px;margin:10px 0;">')
    table.insert(html, '<b>调试信息:</b><br>')
    table.insert(html, '<b>order 类型:</b>' .. type(orderData) .. '<br>')
    
    if type(orderData) == "table" then
        table.insert(html, '<b>order 长度:</b>' .. #orderData .. '<br>')
        for i, v in ipairs(orderData) do
            table.insert(html, '<b>order[' .. i .. ']:</b>' .. mw.text.encode(tostring(v)) .. '<br>')
        end
    else
        table.insert(html, '<b>order 值:</b>' .. mw.text.encode(tostring(orderData)) .. '<br>')
    end
    
    local orderStr = type(orderData) == "table" and orderData[1] or orderData
    local cardNames = parseCardOrder(orderStr)
    
    table.insert(html, '<b>解析后的卡牌数量:</b>' .. #cardNames .. '<br>')
    for i, name in ipairs(cardNames) do
        table.insert(html, '<b>' .. i .. '.</b> ' .. mw.text.encode(name) .. '<br>')
    end
    
    table.insert(html, '</div>')
    
    return table.concat(html, '')
end

-- 配队模拟器专用:显示带有元数据的卡牌
function p.deck(frame)
    local args = getArgs(frame, { removeBlank = true })
    
    local moduleName = safeString(args[1])
    if 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 then
        return err('错误: 模块 "' .. moduleName .. '" 没有定义 card.order')
    end
    
    -- 如果 order 是表格,取第一个元素
    local orderStr = orderData
    if type(orderData) == "table" then
        if #orderData == 0 then
            return err('错误: card.order 为空')
        end
        orderStr = orderData[1]
    end
    
    orderStr = safeString(orderStr)
    if orderStr == "" then
        return err('错误: card.order 为空或格式错误')
    end
    
    -- 解析卡牌顺序
    local cardNames = parseCardOrder(orderStr)
    if #cardNames == 0 then
        return err('错误: card.order 解析后为空')
    end
    
    -- 构建带有特殊标记的 HTML
    local html = {}
    table.insert(html, '<div class="deck-cards-container" style="display:flex;gap:0px;flex-wrap:wrap;min-height:360px;">')
    
    for i, cardName in ipairs(cardNames) do
        -- 为每张卡牌创建包装器,包含元数据
        table.insert(html, '<div class="deck-card-wrapper" data-module="' .. mw.text.encode(moduleName) .. '" data-card="' .. mw.text.encode(cardName) .. '" style="display:inline-block;">')
        
        -- 调用原始的卡牌显示
        local subFrame = {
            args = {moduleName, cardName},
            getParent = function() return frame end
        }
        table.insert(html, cardModule.main(subFrame))
        
        table.insert(html, '</div>')
    end
    
    table.insert(html, '</div>')
    
    return table.concat(html, '')
end

return p