模块

模块:卡牌/中立

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献2025年11月1日 (六) 14:25的版本

此模块的文档可以在模块:卡牌/中立/doc创建

local p = {}

-- 使用官方参数解析器
local getArgs = require('Module:Arguments').getArgs

-- 渲染模块
local displayModule = require('Module:卡牌/display')

-- 卡牌逻辑模块
local cardModule = require('Module:卡牌')

-- 安全的错误输出
local function err(msg)
    return '<span style="color: red;">' .. mw.text.encode(msg) .. '</span>'
end

-- 显示单张中立卡牌
function p.main(frame)
    local args = getArgs(frame, { removeBlank = true })
    local cardName = args[1]
    
    if not cardName or cardName == "" then
        return err("错误: 未指定卡牌名")
    end
    
    -- 加载中立卡牌数据
    local success, neCardData = pcall(require, 'Module:卡牌/中立/data')
    if not success or not neCardData then
        return err('错误: 找不到模块 "Module:卡牌/中立/data"')
    end
    
    local cardDataWrapper = neCardData[cardName]
    if not cardDataWrapper then
        return err('错误: 找不到中立卡牌 "' .. cardName .. '"')
    end
    
    local baseData = cardDataWrapper.base
    if not baseData then
        return err('错误: 卡牌 "' .. cardName .. '" 没有 base 数据')
    end
    
    -- 构造模块信息(中立卡牌统一使用 basic 边框)
    local moduleInfo = {
        ego = "basic"
    }
    
    -- 解析卡牌数据
    local cardInfo = cardModule.parseCardData(baseData, "中立卡牌", cardName, moduleInfo, {
        isVariant = false,
        baseApText = nil,
        baseDictStr = ""
    })
    
    if not cardInfo then
        return err("错误: 解析卡牌数据失败")
    end
    
    -- 强制设置 ego 为 basic(确保边框正确)
    cardInfo.ego = "basic"
    
    -- 处理衍生卡牌
    local subCardInfo = nil
    if baseData.sub then
        subCardInfo = cardModule.parseSubCardData(baseData.sub, neCardData, moduleInfo)
    end
    
    -- 渲染卡牌
    return displayModule.render(cardInfo, subCardInfo)
end

-- 显示所有中立卡牌
function p.showAll(frame)
    local args = getArgs(frame, { removeBlank = false })
    
    -- 加载中立卡牌数据
    local success, neCardData = pcall(require, 'Module:卡牌/中立/data')
    if not success or not neCardData then
        return err('错误: 找不到模块 "Module:卡牌/中立/data"')
    end
    
    -- 收集所有卡牌名称并排序
    local cardNames = {}
    for cardName, cardData in pairs(neCardData) do
        if type(cardData) == "table" and cardData.base then
            table.insert(cardNames, cardName)
        end
    end
    table.sort(cardNames)
    
    -- 构建 HTML
    local html = {}
    
    -- 渲染每张卡牌(包装在 divsort 中以支持筛选)
    local moduleInfo = { ego = "basic" }
    for _, cardName in ipairs(cardNames) do
        local cardDataWrapper = neCardData[cardName]
        local baseData = cardDataWrapper.base
        
        if baseData then
            -- 解析卡牌数据
            local cardInfo = cardModule.parseCardData(baseData, "中立卡牌", cardName, moduleInfo, {
                isVariant = false,
                baseApText = nil,
                baseDictStr = ""
            })
            
            if cardInfo then
                -- 强制设置 ego 为 basic
                cardInfo.ego = "basic"
                
                -- 处理衍生卡牌
                local subCardInfo = nil
                if baseData.sub then
                    subCardInfo = cardModule.parseSubCardData(baseData.sub, neCardData, moduleInfo)
                end
                
                -- 提取筛选参数
                local rarity = baseData.rarity or ""
                local classStr = baseData.class or ""
                
                -- 包装卡牌渲染结果在 divsort 中,添加 data-param 属性
                table.insert(html, string.format(
                    '<div class="divsort" data-param1="%s" data-param2="%s">',
                    mw.text.encode(rarity),
                    mw.text.encode(classStr)
                ))
                table.insert(html, displayModule.render(cardInfo, subCardInfo))
                table.insert(html, '</div>')
            end
        end
    end
    
    return table.concat(html, '')
end

-- 批量显示指定的中立卡牌
function p.batch(frame)
    local args = getArgs(frame, { removeBlank = false })
    
    -- 加载中立卡牌数据
    local success, neCardData = pcall(require, 'Module:卡牌/中立/data')
    if not success or not neCardData then
        return err('错误: 找不到模块 "Module:卡牌/中立/data"')
    end
    
    local html = {}
    table.insert(html, '<div style="display:flex;gap:10px;flex-wrap:wrap;">')
    
    local moduleInfo = { ego = "basic" }
    
    -- 遍历所有参数(每个参数是一个卡牌名)
    local i = 1
    while args[i] do
        local cardName = args[i]
        
        if cardName and cardName ~= "" then
            local cardDataWrapper = neCardData[cardName]
            
            if cardDataWrapper and cardDataWrapper.base then
                local baseData = cardDataWrapper.base
                
                -- 解析卡牌数据
                local cardInfo = cardModule.parseCardData(baseData, "中立卡牌", cardName, moduleInfo, {
                    isVariant = false,
                    baseApText = nil,
                    baseDictStr = ""
                })
                
                if cardInfo then
                    -- 强制设置 ego 为 basic
                    cardInfo.ego = "basic"
                    
                    -- 处理衍生卡牌
                    local subCardInfo = nil
                    if baseData.sub then
                        subCardInfo = cardModule.parseSubCardData(baseData.sub, neCardData, moduleInfo)
                    end
                    
                    -- 渲染并添加到 HTML
                    table.insert(html, displayModule.render(cardInfo, subCardInfo))
                end
            else
                table.insert(html, err('错误: 找不到卡牌 "' .. cardName .. '"'))
            end
        end
        
        i = i + 1
    end
    
    table.insert(html, '</div>')
    return table.concat(html, '')
end

return p