模块

配队/卡牌:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第48行: 第48行:
-- 已知的卡牌模块列表(按优先级排序)
-- 已知的卡牌模块列表(按优先级排序)
local knownModules = {
local knownModules = {
     '齐尔克尼茨',
     '凯隆',
    '德洛斯',
    '尼希卢姆',
    '塞克瑞德',
    '维托尔',
    '通用',
    '状态异常',
     -- 可以继续添加更多模块
     -- 可以继续添加更多模块
}
}

2025年10月18日 (六) 22:35的版本

此模块的文档可以在模块:配队/卡牌/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 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 knownModules = {
    '凯隆',
    -- 可以继续添加更多模块
}

-- 查找卡牌所在的模块
local function findCardModule(cardName)
    if not cardName or cardName == '' then
        return nil
    end
    
    -- 遍历已知模块,查找卡牌
    for _, moduleName in ipairs(knownModules) do
        local ok, dataModule = pcall(require, 'Module:卡牌/' .. moduleName)
        if ok and dataModule then
            -- 检查卡牌是否存在于该模块
            if dataModule[cardName] then
                return moduleName
            end
        end
    end
    
    return nil
end

-- 解析卡牌字符串
-- 支持格式:
-- 1. 卡牌名
-- 2. 模块名|卡牌名
-- 3. 模块名|卡牌名|变体类型|变体参数|变体索引
local function parseCardString(cardStr)
    if not cardStr or cardStr == '' then
        return nil
    end
    
    cardStr = mw.text.trim(cardStr)
    
    -- 检查是否包含 | 分隔符
    if not cardStr:match('|') then
        -- 格式1:只有卡牌名,需要自动查找模块
        local moduleName = findCardModule(cardStr)
        if not moduleName then
            return nil, '找不到卡牌 "' .. cardStr .. '" 所在的模块'
        end
        return {
            moduleName = moduleName,
            cardName = cardStr,
            variantType = nil,
            variantParam = nil,
            variantIndex = nil
        }
    end
    
    -- 格式2或3:包含模块名
    local parts = {}
    for part in cardStr:gmatch('([^|]+)') do
        table.insert(parts, mw.text.trim(part))
    end
    
    if #parts < 2 then
        return nil, '卡牌字符串格式错误: ' .. cardStr
    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 = {}
    local errors = {}
    
    for _, fieldName in ipairs(cardFields) do
        local cardStr = getProperty(characterName, fieldName)
        if cardStr and cardStr ~= '' then
            local cardData, errMsg = parseCardString(cardStr)
            if cardData then
                table.insert(cardDataList, cardData)
            elseif errMsg then
                table.insert(errors, fieldName .. ': ' .. errMsg)
            end
        end
    end
    
    -- 如果有错误,显示错误信息
    if #errors > 0 then
        local errorHtml = {}
        table.insert(errorHtml, '<div style="color: red;">')
        table.insert(errorHtml, '解析卡牌信息时出错:<br>')
        for _, errMsg in ipairs(errors) do
            table.insert(errorHtml, '- ' .. mw.text.encode(errMsg) .. '<br>')
        end
        table.insert(errorHtml, '</div>')
        return table.concat(errorHtml, '')
    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

-- 手动更新模块列表的函数(可选)
function p.updateModules(frame)
    local args = getArgs(frame, { removeBlank = true })
    
    -- 这个函数可以用来动态更新 knownModules 列表
    -- 例如:{{#invoke:配队/卡牌|updateModules|新模块1|新模块2}}
    
    for i, moduleName in ipairs(args) do
        local found = false
        for _, existing in ipairs(knownModules) do
            if existing == moduleName then
                found = true
                break
            end
        end
        if not found then
            table.insert(knownModules, moduleName)
        end
    end
    
    return '已更新模块列表'
end

return p