模块

装备:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第8行: 第8行:
     ["金"] = "金",
     ["金"] = "金",
     ["彩"] = "彩"
     ["彩"] = "彩"
}
-- 区域排序权重
local areaOrder = {
    ["蓝壶"] = 1,
    ["双星之影"] = 2,
    ["雾之城市"] = 3
}
}


第21行: 第14行:
     ["彩"] = 1,
     ["彩"] = 1,
     ["金"] = 2,
     ["金"] = 2,
     [""] = 3,
     [""] = 3,
     [""] = 4
     [""] = 4
}
 
-- 类型排序权重
local typeOrder = {
    ["武器"] = 1,
    ["装甲"] = 2,
    ["戒指"] = 3
}
}


第98行: 第98行:
             name = equipName,
             name = equipName,
             data = equipData,
             data = equipData,
            areaOrder = areaOrder[equipData.area] or 999,
             rarityOrder = rarityOrder[equipData.rarity] or 999,
             rarityOrder = rarityOrder[equipData.rarity] or 999,
            typeOrder = typeOrder[equipData.type] or 999,
             id = equipData.id or 0
             id = equipData.id or 0
         })
         })
     end
     end
      
      
     -- 按照区域、稀有度、ID排序
     -- 按照稀有度、类型、ID排序
     table.sort(equipList, function(a, b)
     table.sort(equipList, function(a, b)
         -- 先按区域排序(升序)
         -- 先按稀有度排序(升序)
        if a.areaOrder ~= b.areaOrder then
            return a.areaOrder < b.areaOrder
        end
        -- 再按稀有度排序(升序)
         if a.rarityOrder ~= b.rarityOrder then
         if a.rarityOrder ~= b.rarityOrder then
             return a.rarityOrder < b.rarityOrder
             return a.rarityOrder < b.rarityOrder
        end
        -- 再按类型排序(升序)
        if a.typeOrder ~= b.typeOrder then
            return a.typeOrder < b.typeOrder
         end
         end
         -- 最后按ID排序(降序)
         -- 最后按ID排序(降序)
第125行: 第125行:
         -- 生成art文件名(使用修复后的函数)
         -- 生成art文件名(使用修复后的函数)
         local artFile = string.format("relic_%s.png", formatIdToFilename(equipData.id))
         local artFile = string.format("relic_%s.png", formatIdToFilename(equipData.id))
       
        -- 处理地区数据,支持多个地区(用英文逗号分隔)
        local areaData = equipData.area or ""
          
          
         -- 创建可筛选的卡片容器
         -- 创建可筛选的卡片容器
第130行: 第133行:
             :addClass('divsort equipment-wrapper')
             :addClass('divsort equipment-wrapper')
             :attr('data-param1', equipData.rarity)  -- 稀有度
             :attr('data-param1', equipData.rarity)  -- 稀有度
             :attr('data-param2', equipData.area or "")  -- 区域
             :attr('data-param2', areaData)  -- 区域(支持多个,用英文逗号分隔)
             :attr('data-param3', equipData.tag or "")  -- TAG(多个用逗号分隔)
             :attr('data-param3', equipData.tag or "")  -- TAG(多个用逗号分隔)
            :attr('data-sortarea', areaOrder[equipData.area] or 999)  -- 区域排序值
             :attr('data-sortrarity', rarityOrder[equipData.rarity] or 999)  -- 稀有度排序值
             :attr('data-sortrarity', rarityOrder[equipData.rarity] or 999)  -- 稀有度排序值
            :attr('data-sorttype', typeOrder[equipData.type] or 999)  -- 类型排序值
             :attr('data-sortid', equipData.id or 0)  -- ID排序值
             :attr('data-sortid', equipData.id or 0)  -- ID排序值
             :cssText('display: inline-block; margin: 5px; position: relative;')
             :cssText('display: inline-block; margin: 5px; position: relative;')

2025年10月17日 (五) 23:12的版本

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

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

-- 获取装备稀有度
local rarityMap = {
    ["蓝"] = "蓝",
    ["紫"] = "紫",
    ["金"] = "金",
    ["彩"] = "彩"
}

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

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

-- 辅助函数:根据装备基础数据计算数值
local function calculateValue(rarity, itemType, level)
    local BASE_VALUES = {
        ["蓝"] = {
            ["武器"] = { values = {25, 41, 56, 67, 74} },
            ["装甲"] = { values = {9, 15, 21, 24, 28} },
            ["戒指"] = { values = {20, 37, 54, 66, 75} },
        },
        ["紫"] = {
            ["武器"] = { values = {28, 45, 62, 74, 82} },
            ["装甲"] = { values = {10, 17, 23, 27, 31} },
            ["戒指"] = { values = {22, 41, 60, 73, 83} },
        },
        ["金"] = {
            ["武器"] = { values = {31, 50, 68, 81, 90} },
            ["装甲"] = { values = {11, 19, 25, 30, 34} },
            ["戒指"] = { values = {24, 45, 66, 80, 91} },
        },
        ["彩"] = {
            ["武器"] = { values = {31, 50, 68, 81, 90} },
            ["装甲"] = { values = {11, 19, 25, 30, 34} },
            ["戒指"] = { values = {24, 45, 66, 80, 91} },
        },
    }
    
    local levelNum = tonumber(level) or 1
    if BASE_VALUES[rarity] and BASE_VALUES[rarity][itemType] then
        return BASE_VALUES[rarity][itemType].values[levelNum]
    end
    return 0
end

-- 辅助函数:获取属性类型
local function getValueType(itemType)
    local typeMap = {
        ["武器"] = "攻击力",
        ["装甲"] = "防御力",
        ["戒指"] = "HP"
    }
    return typeMap[itemType] or ""
end

-- 辅助函数:格式化ID为文件名
local function formatIdToFilename(id)
    -- 直接返回id,不进行数字转换
    -- 这样可以支持 "1156_6" 这样的格式
    if not id then
        return "0000"
    end
    
    -- 将id转换为字符串
    local idStr = tostring(id)
    
    -- 如果id是纯数字,则格式化为4位数字字符串
    local numId = tonumber(idStr)
    if numId then
        return string.format("%04d", numId)
    end
    
    -- 如果id包含非数字字符(如下划线),直接返回原字符串
    return idStr
end

-- 生成装备卡片列表(用于筛选页面)
function p.generateCards(frame)
    local html = mw.html.create()
    
    -- 创建排序数组
    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
        -- 最后按ID排序(降序)
        return a.id > b.id
    end)
    
    -- 遍历排序后的装备列表
    for _, item in ipairs(equipList) do
        local equipName = item.name
        local equipData = item.data
        
        -- 生成art文件名(使用修复后的函数)
        local artFile = string.format("relic_%s.png", formatIdToFilename(equipData.id))
        
        -- 处理地区数据,支持多个地区(用英文逗号分隔)
        local areaData = equipData.area or ""
        
        -- 创建可筛选的卡片容器
        local cardWrapper = html:tag('div')
            :addClass('divsort equipment-wrapper')
            :attr('data-param1', equipData.rarity)  -- 稀有度
            :attr('data-param2', areaData)  -- 区域(支持多个,用英文逗号分隔)
            :attr('data-param3', equipData.tag or "")  -- TAG(多个用逗号分隔)
            :attr('data-sortrarity', rarityOrder[equipData.rarity] or 999)  -- 稀有度排序值
            :attr('data-sorttype', typeOrder[equipData.type] or 999)  -- 类型排序值
            :attr('data-sortid', equipData.id or 0)  -- ID排序值
            :cssText('display: inline-block; margin: 5px; position: relative;')
        
        -- 创建卡片和名称的容器
        local cardContainer = cardWrapper:tag('div')
            :cssText('display: flex; flex-direction: column; align-items: center;')
        
        -- 生成卡片内容
        local cardDiv = cardContainer:tag('div')
            :addClass('equipment-card')
            :attr('data-equipment', equipName)
            :attr('data-level', '5')
            :cssText('position: relative; display: inline-block; width:150px; height: 230px; cursor: pointer;')
        
        -- 背景
        cardDiv:tag('div')
            :cssText('position: absolute; top: 0px; left: 0px;')
            :wikitext(string.format('[[File:bg_equipment_rarity_%s.png|150px|link=]]', equipData.rarity))
        
        -- 装备图片
        cardDiv:tag('div')
            :cssText('position: absolute; top: 43px; left: 13px;')
            :wikitext(string.format('[[File:%s|124px|link=]]', artFile))
        
        -- 底部背景
        cardDiv:tag('div')
            :cssText('position: absolute; bottom: 5px; left: 5px; width: 140px; height: 35px; background-color: rgba(0,0,0,0.5); border-radius: 0px 0px 8px 8px')
        
        -- 星级
        cardDiv:tag('div')
            :cssText('position: absolute; bottom: 10px; left: 20px;')
            :wikitext('[[File:icon_star_rating_5.png|link=]]')
        
        -- 顶层蒙版
        cardDiv:tag('div')
            :cssText('position: absolute; top: 0px; left: 0px;')
            :wikitext('[[File:equipment_顶层蒙版.png|150px|link=]]')
        
        -- 装备名称(可点击链接)
        local nameDiv = cardContainer:tag('div')
            :addClass('equipment-name-link')
            :cssText('text-align: center; width: 150px;')
        
        -- 根据稀有度设置名称颜色
        local nameColor = '#34638c'  -- 蓝色
        if equipData.rarity == '紫' then
            nameColor = '#b14fc5'  -- 紫色
        elseif equipData.rarity == '金' then
            nameColor = '#ff9500'  -- 金色
        elseif equipData.rarity == '彩' then
            nameColor = 'linear-gradient(90deg, #ff6b6b, #ffd93d, #6bcf7f, #6b9bff, #a86bcf)'  -- 彩虹渐变
        end
        
        -- 对于彩色稀有度使用特殊样式
        if equipData.rarity == '彩' then
            nameDiv:wikitext(string.format('[[%s|<span style="background: %s; -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; font-size:14px; font-weight:bold;">%s</span>]]', 
                equipName, nameColor, equipName))
        else
            nameDiv:wikitext(string.format('[[%s|<span style="color:%s; font-size:14px; font-weight:bold;">%s</span>]]', 
                equipName, nameColor, equipName))
        end
        
        -- 生成对应的弹窗
        local popupDiv = cardWrapper:tag('div')
            :addClass('equipment-popup')
            :attr('id', 'equipment-popup-' .. mw.uri.encode(equipName))
            :cssText('position: fixed; display: none; width:368px; height: 335px; background-color: #343434; border-radius: 9px; z-index: 10000;')
        
        -- 弹窗背景
        popupDiv:tag('div')
            :cssText('position: absolute; top: 0px; left: 0px;')
            :wikitext(string.format('[[File:bg_collection_rarity_%s.png|link=]]', equipData.rarity))
        
        -- 弹窗装备图片
        popupDiv:tag('div')
            :cssText('position: absolute; top: 40px; left: 128px;')
            :wikitext(string.format('[[File:%s|124px|link=]]', artFile))
        
        -- 星级背景
        popupDiv:tag('div')
            :cssText('position: absolute; top: 167px; left: 0px; width: 368px; height: 35px; background-color: rgba(0,0,0,0.5); border-radius: 0px 0px 10px 10px ')
        
        -- 星级
        popupDiv:tag('div')
            :cssText('position: absolute; top: 173px; left: 128px;')
            :wikitext('[[File:icon_star_rating_5.png|link=]]')
        
        -- 类型图标
        popupDiv:tag('div')
            :cssText('position: absolute; top: 205px; left: 5px; color: white')
            :wikitext(string.format('[[File:icon_equip_%s_%s.png|25px|link=]]', equipData.type, equipData.rarity))
        
        -- 装备名称
        popupDiv:tag('div')
            :cssText('position: absolute; top: 208px; left: 33px; color: white')
            :wikitext(equipName)
        
        -- 属性背景
        popupDiv:tag('div')
            :cssText('position: absolute; top: 235px; left: 9px; width: 350px; height: 35px; background-color: rgba(255,255,255,0.3); border-radius: 2px')
        
        -- 属性类型
        local valueType = getValueType(equipData.type)
        popupDiv:tag('div')
            :cssText('position: absolute; top: 242px; left: 14px; color: white')
            :wikitext(valueType)
        
        -- 属性值
        local value = calculateValue(equipData.rarity, equipData.type, "5")
        popupDiv:tag('div')
            :cssText('position: absolute; top: 242px; right: 14px; color: white')
            :wikitext(value)
        
        -- 描述(使用 frame:preprocess 来处理模板)
        local desc = equipData.desc and equipData.desc[5] or ""
        local processedDesc = frame:preprocess(desc)
        popupDiv:tag('div')
            :cssText('position: absolute; top: 277px; left: 10px; right: 10px; color: white; font-size: 14px;')
            :wikitext(processedDesc)
        
        -- 关闭按钮
        popupDiv:tag('div')
            :addClass('equipment-popup-close')
            :cssText('position: absolute; top: 10px; right: 10px; width: 24px; height: 24px; cursor: pointer; color: white; font-size: 20px;')
            :wikitext('×')
    end
    
    return tostring(html)
end

-- 生成单个装备卡片
function p.card(frame)
    local args = frame.args
    local name = args[1] or args.name
    local level = args[2] or args.level or "1"
    
    if not name or not data[name] then
        return "装备不存在: " .. (name or "未指定")
    end
    
    local equip = data[name]
    
    -- 生成art文件名(使用修复后的函数)
    local artFile = string.format("relic_%s.png", formatIdToFilename(equip.id))
    
    -- 生成HTML
    local html = mw.html.create('div')
        :addClass('equipment-card')
        :attr('data-equipment', name)
        :attr('data-level', level)
        :cssText('position: relative; display: inline-block; width:150px; height: 230px; cursor: pointer;')
    
    -- 背景
    html:tag('div')
        :cssText('position: absolute; top: 0px; left: 0px;')
        :wikitext(string.format('[[File:bg_equipment_rarity_%s.png|150px|link=]]', equip.rarity))
    
    -- 装备图片
    html:tag('div')
        :cssText('position: absolute; top: 43px; left: 13px;')
        :wikitext(string.format('[[File:%s|124px|link=]]', artFile))
    
    -- 底部背景
    html:tag('div')
        :cssText('position: absolute; bottom: 5px; left: 5px; width: 140px; height: 35px; background-color: rgba(0,0,0,0.5); border-radius: 0px 0px 8px 8px')
    
    -- 星级
    html:tag('div')
        :cssText('position: absolute; bottom: 10px; left: 20px;')
        :wikitext(string.format('[[File:icon_star_rating_%s.png|link=]]', level))
    
    -- 顶层蒙版
    html:tag('div')
        :cssText('position: absolute; top: 0px; left: 0px;')
        :wikitext('[[File:equipment_顶层蒙版.png|150px|link=]]')
    
    return tostring(html)
end

return p