模块

模块:配队/装备

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献2025年10月19日 (日) 16:25的版本 (创建页面,内容为“-- 模块:配队/装备 local p = {} local data = mw.loadData('模块:装备/data') -- 稀有度映射 local rarityMap = { ["蓝"] = "蓝", ["金"] = "金", ["彩"] = "彩" } -- 稀有度排序权重 local rarityOrder = { ["彩"] = 1, ["金"] = 2, ["蓝"] = 3 } -- 类型排序权重 local typeOrder = { ["武器"] = 1, ["装甲"] = 2, ["戒指"] = 3 } -- 辅助函数:格式化ID为文件名 local function formatIdToFile…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

此模块的文档可以在模块:配队/装备/doc创建

-- 模块:配队/装备
local p = {}
local data = mw.loadData('模块:装备/data')

-- 稀有度映射
local rarityMap = {
    ["蓝"] = "蓝",
    ["金"] = "金", 
    ["彩"] = "彩"
}

-- 稀有度排序权重
local rarityOrder = {
    ["彩"] = 1,
    ["金"] = 2,
    ["蓝"] = 3
}

-- 类型排序权重
local typeOrder = {
    ["武器"] = 1,
    ["装甲"] = 2,
    ["戒指"] = 3
}

-- 辅助函数:格式化ID为文件名
local function formatIdToFilename(id)
    if not id then
        return "0000"
    end
    
    local idStr = tostring(id)
    local numId = tonumber(idStr)
    if numId then
        return string.format("%04d", numId)
    end
    
    return idStr
end

-- 单个装备显示
function p.single(frame)
    local args = frame.args
    local name = args[1] or args.name
    
    if not name or not data[name] then
        return "装备不存在: " .. (name or "未指定")
    end
    
    local equip = data[name]
    local artFile = string.format("relic_%s.png", formatIdToFilename(equip.id))
    
    -- 创建装备卡片
    local html = mw.html.create('div')
        :cssText('position:relative;width:124px;height:124px;display:inline-block;margin:5px;')
    
    -- 稀有度边框
    html:tag('div')
        :cssText('position:absolute;top:0px;left:0px')
        :wikitext(string.format('[[File:Frame item rarity %s.png|124px|link=]]', equip.rarity))
    
    -- 内边框
    html:tag('div')
        :cssText('position:absolute;top:7px;left:7px;width:110px;height:110px;border:1px solid #fff;border-radius: 4px')
    
    -- 装备图片
    html:tag('div')
        :cssText('position:absolute;top:6px;left:6px')
        :wikitext(string.format('[[File:%s|112px|link=]]', artFile))
    
    -- 装备名称(带描边效果)
    html:tag('div')
        :cssText('position:absolute;bottom:6px;left:6px')
        :wikitext(frame:preprocess(string.format('{{描边|黑|%s}}', equip.name or name)))
    
    return tostring(html)
end

-- 显示指定类型的所有装备
function p.byType(frame)
    local args = frame.args
    local equipType = args[1] or args.type or "武器"
    
    local html = mw.html.create('div')
        :cssText('display:flex;flex-wrap:wrap;')
    
    -- 创建装备列表并排序
    local equipList = {}
    for equipName, equipData in pairs(data) do
        if equipData.type == equipType then
            table.insert(equipList, {
                name = equipName,
                data = equipData,
                rarityOrder = rarityOrder[equipData.rarity] or 999,
                id = equipData.id or 0
            })
        end
    end
    
    -- 按稀有度和ID排序
    table.sort(equipList, function(a, b)
        if a.rarityOrder ~= b.rarityOrder then
            return a.rarityOrder < b.rarityOrder
        end
        return a.id > b.id
    end)
    
    -- 生成装备卡片
    for _, item in ipairs(equipList) do
        local equipName = item.name
        local equipData = item.data
        local artFile = string.format("relic_%s.png", formatIdToFilename(equipData.id))
        
        -- 创建单个装备卡片
        local cardDiv = html:tag('div')
            :cssText('position:relative;width:124px;height:124px;display:inline-block;margin:5px;')
        
        -- 稀有度边框
        cardDiv:tag('div')
            :cssText('position:absolute;top:0px;left:0px')
            :wikitext(string.format('[[File:Frame item rarity %s.png|124px|link=]]', equipData.rarity))
        
        -- 内边框
        cardDiv:tag('div')
            :cssText('position:absolute;top:7px;left:7px;width:110px;height:110px;border:1px solid #fff;border-radius: 4px')
        
        -- 装备图片
        cardDiv:tag('div')
            :cssText('position:absolute;top:6px;left:6px')
            :wikitext(string.format('[[File:%s|112px|link=]]', artFile))
        
        -- 装备名称(带描边效果)
        cardDiv:tag('div')
            :cssText('position:absolute;bottom:6px;left:6px')
            :wikitext(frame:preprocess(string.format('{{描边|黑|%s}}', equipName)))
    end
    
    return tostring(html)
end

-- 显示所有装备
function p.all(frame)
    local html = mw.html.create('div')
        :cssText('display:flex;flex-wrap:wrap;')
    
    -- 创建装备列表并排序
    local equipList = {}
    for equipName, equipData in pairs(data) do
        table.insert(equipList, {
            name = equipName,
            data = equipData,
            rarityOrder = rarityOrder[equipData.rarity] or 999,
            typeOrder = typeOrder[equipData.type] or 999,
            id = equipData.id or 0
        })
    end
    
    -- 按稀有度、类型和ID排序
    table.sort(equipList, function(a, b)
        if a.rarityOrder ~= b.rarityOrder then
            return a.rarityOrder < b.rarityOrder
        end
        if a.typeOrder ~= b.typeOrder then
            return a.typeOrder < b.typeOrder
        end
        return a.id > b.id
    end)
    
    -- 生成装备卡片
    for _, item in ipairs(equipList) do
        local equipName = item.name
        local equipData = item.data
        local artFile = string.format("relic_%s.png", formatIdToFilename(equipData.id))
        
        -- 创建单个装备卡片
        local cardDiv = html:tag('div')
            :cssText('position:relative;width:124px;height:124px;display:inline-block;margin:5px;')
        
        -- 稀有度边框
        cardDiv:tag('div')
            :cssText('position:absolute;top:0px;left:0px')
            :wikitext(string.format('[[File:Frame item rarity %s.png|124px|link=]]', equipData.rarity))
        
        -- 内边框
        cardDiv:tag('div')
            :cssText('position:absolute;top:7px;left:7px;width:110px;height:110px;border:1px solid #fff;border-radius: 4px')
        
        -- 装备图片
        cardDiv:tag('div')
            :cssText('position:absolute;top:6px;left:6px')
            :wikitext(string.format('[[File:%s|112px|link=]]', artFile))
        
        -- 装备名称(带描边效果)
        cardDiv:tag('div')
            :cssText('position:absolute;bottom:6px;left:6px')
            :wikitext(frame:preprocess(string.format('{{描边|黑|%s}}', equipName)))
    end
    
    return tostring(html)
end

-- 按稀有度显示装备
function p.byRarity(frame)
    local args = frame.args
    local rarity = args[1] or args.rarity or "蓝"
    
    local html = mw.html.create('div')
        :cssText('display:flex;flex-wrap:wrap;')
    
    -- 创建装备列表并排序
    local equipList = {}
    for equipName, equipData in pairs(data) do
        if equipData.rarity == rarity then
            table.insert(equipList, {
                name = equipName,
                data = equipData,
                typeOrder = typeOrder[equipData.type] or 999,
                id = equipData.id or 0
            })
        end
    end
    
    -- 按类型和ID排序
    table.sort(equipList, function(a, b)
        if a.typeOrder ~= b.typeOrder then
            return a.typeOrder < b.typeOrder
        end
        return a.id > b.id
    end)
    
    -- 生成装备卡片
    for _, item in ipairs(equipList) do
        local equipName = item.name
        local equipData = item.data
        local artFile = string.format("relic_%s.png", formatIdToFilename(equipData.id))
        
        -- 创建单个装备卡片
        local cardDiv = html:tag('div')
            :cssText('position:relative;width:124px;height:124px;display:inline-block;margin:5px;')
        
        -- 稀有度边框
        cardDiv:tag('div')
            :cssText('position:absolute;top:0px;left:0px')
            :wikitext(string.format('[[File:Frame item rarity %s.png|124px|link=]]', equipData.rarity))
        
        -- 内边框
        cardDiv:tag('div')
            :cssText('position:absolute;top:7px;left:7px;width:110px;height:110px;border:1px solid #fff;border-radius: 4px')
        
        -- 装备图片
        cardDiv:tag('div')
            :cssText('position:absolute;top:6px;left:6px')
            :wikitext(string.format('[[File:%s|112px|link=]]', artFile))
        
        -- 装备名称(带描边效果)
        cardDiv:tag('div')
            :cssText('position:absolute;bottom:6px;left:6px')
            :wikitext(frame:preprocess(string.format('{{描边|黑|%s}}', equipName)))
    end
    
    return tostring(html)
end

return p