模块

装备:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第1行: 第1行:
local p = {}
local p = {}
local equipmentData = mw.loadData('模块:装备/data')
local data = mw.loadData("模块:装备/data")


-- 辅助函数:解析文本模板
-- 获取星级图标文件名
local function parseText(text)
local function getStarIcon(level)
     if not text then return "" end
     return "icon_star_rating_" .. level .. ".png"
    -- 将{{文本|橙|内容}}转换为HTML
    text = text:gsub("{{文本|橙|([^}]+)}}", '<span style="color:#FF9900">%1</span>')
    return text
end
end


-- 获取装备稀有度对应的背景图片
-- 生成装备卡片HTML
local function getRarityBg(rarity)
local function generateEquipmentCard(name, equipData, level)
     local rarityMap = {
     level = level or "1"
        ["蓝"] = "bg_equipment_rarity_蓝.png",
     local base = equipData.base
        ["紫"] = "bg_equipment_rarity_紫.png",
     local levelData = equipData[level]
        ["金"] = "bg_equipment_rarity_金.png"
      
    }
     if not levelData then
    return rarityMap[rarity] or "bg_equipment_rarity_蓝.png"
         return "错误:未找到等级数据"
end
 
-- 获取装备类型对应的图标
local function getTypeIcon(equipType, rarity)
     local typeMap = {
        ["武器"] = "武器",
        ["刀"] = "武器",
        ["装甲"] = "装甲",
        ["戒指"] = "戒指"
    }
     local mappedType = typeMap[equipType] or "武器"
    return string.format("icon_equip_%s_%s.png", mappedType, rarity)
end
 
-- 生成装备卡片(包含弹窗内容)
function p.card(frame)
     local args = frame.args
     if not args[1] and frame:getParent() then
         args = frame:getParent().args
     end
     end
      
      
     local name = args[1] or args.name
     local rarity = base.rarity
     local level = args[2] or args.level or "1"
    local art = base.art
    local value_type = base.value_type
    local value = levelData.value
    local desc = levelData.desc_global
   
    -- 生成卡片HTML
     local html = mw.html.create('div')
        :attr('class', 'equipment-card')
        :css('position', 'relative')
        :css('display', 'inline-block')
        :css('width', '150px')
        :css('height', '230px')
        :css('cursor', 'pointer')
       
    -- 背景
    html:tag('div')
        :css('position', 'absolute')
        :css('top', '0px')
        :css('left', '0px')
        :wikitext('[[File:bg_equipment_rarity_' .. rarity .. '.png|150px|link=]]')
   
    -- 装备图标
    html:tag('div')
        :css('position', 'absolute')
        :css('top', '43px')
        :css('left', '13px')
        :wikitext('[[File:' .. art .. '|124px|link=]]')
   
    -- 底部遮罩
    html:tag('div')
        :css('position', 'absolute')
        :css('bottom', '5px')
        :css('left', '5px')
        :css('width', '140px')
        :css('height', '35px')
        :css('background-color', 'rgba(0,0,0,0.5)')
        :css('border-radius', '0px 0px 8px 8px')
   
    -- 星级
    html:tag('div')
        :css('position', 'absolute')
        :css('bottom', '10px')
        :css('left', '20px')
        :wikitext('[[File:' .. getStarIcon(level) .. '|link=]]')
      
      
     if not name then
     -- 顶层蒙版
         return "错误:未指定装备名称"
    html:tag('div')
     end
        :css('position', 'absolute')
        :css('top', '0px')
        :css('left', '0px')
        :wikitext('[[File:equipment_顶层蒙版.png|150px|link=]]')
   
    -- 生成弹窗HTML(隐藏)
    local popup = mw.html.create('div')
        :attr('class', 'equipment-popup')
        :css('display', 'none')
        :css('position', 'fixed')
        :css('top', '50%')
        :css('left', '50%')
        :css('transform', 'translate(-50%, -50%)')
        :css('z-index', '1000')
        :css('width', '368px')
        :css('height', '335px')
        :css('background-color', '#343434')
        :css('border-radius', '9px')
   
    -- 弹窗背景
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '0px')
        :css('left', '0px')
        :wikitext('[[File:bg_collection_rarity_' .. rarity .. '.png|link=]]')
   
    -- 弹窗装备图标
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '40px')
        :css('left', '128px')
        :wikitext('[[File:' .. art .. '|124px|link=]]')
   
    -- 弹窗底部遮罩
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '167px')
        :css('left', '0px')
        :css('width', '368px')
        :css('height', '35px')
        :css('background-color', 'rgba(0,0,0,0.5)')
         :css('border-radius', '0px 0px 8px 8px')
   
    -- 弹窗星级
     popup:tag('div')
        :css('position', 'absolute')
        :css('top', '173px')
        :css('left', '128px')
        :wikitext('[[File:' .. getStarIcon(level) .. '|link=]]')
      
      
     if not equipmentData[name] then
     -- 装备类型图标
         return "错误:装备 '" .. name .. "' 不存在"
    popup:tag('div')
    end
        :css('position', 'absolute')
        :css('top', '205px')
        :css('left', '5px')
        :css('color', 'white')
         :wikitext('[[File:icon_equip_' .. base.type .. '_' .. rarity .. '.png|25px|link=]]')
      
      
     local equip = equipmentData[name]
     -- 装备名称
     local base = equip.base
     popup:tag('div')
    local levelData = equip[level] or equip["1"]
        :css('position', 'absolute')
        :css('top', '209px')
        :css('left', '33px')
        :css('color', 'white')
        :wikitext(name)
      
      
     -- 生成唯一ID
     -- 属性背景
     local uniqueId = "equip_" .. mw.uri.encode(name, "WIKI") .. "_" .. level .. "_" .. tostring(os.time())
     popup:tag('div')
        :css('position', 'absolute')
        :css('top', '235px')
        :css('left', '9px')
        :css('width', '350px')
        :css('height', '35px')
        :css('background-color', 'rgba(255,255,255,0.3)')
        :css('border-radius', '2px')
      
      
     -- 卡片相关
     -- 属性类型
     local rarityBg = getRarityBg(base.rarity)
     popup:tag('div')
        :css('position', 'absolute')
        :css('top', '242px')
        :css('left', '14px')
        :css('color', 'white')
        :wikitext(value_type)
      
      
     -- 弹窗相关
     -- 属性值
     local collectionBg = "bg_collection_rarity_" .. base.rarity .. ".png"
     popup:tag('div')
    local typeIcon = getTypeIcon(base.type, base.rarity)
        :css('position', 'absolute')
    local valueTypeText = base.value_type == "atk" and "攻击力" or "防御力"
        :css('top', '242px')
    local desc = parseText(levelData.desc_global)
        :css('right', '14px')
        :css('color', 'white')
        :wikitext(tostring(value))
      
      
     -- 生成完整HTML(卡片+隐藏的弹窗)
     -- 描述
     local html = string.format([=[
     popup:tag('div')
<!-- 装备卡片和弹窗容器 -->
         :css('position', 'absolute')
<div class="equipment-wrapper" style="display: inline-block;">
        :css('top', '277px')
    <!-- 装备卡片 -->
        :css('left', '10px')
    <label for="%s" class="equipment-card-label" style="cursor: pointer; display: inline-block;">
        :css('right', '10px')
         <div style="position: relative; width:150px; height: 230px;">
        :css('color', 'white')
            <div style="position: absolute; top: 0px; left: 0px;">[[File:%s|150px|link=]]</div>
        :css('font-size', '13px')
            <div style="position: absolute; top: 43px; left: 13px;">[[File:%s|124px|link=]]</div>
        :css('line-height', '1.3')
            <div style="position: absolute; bottom: 5px; left: 5px; width: 140px; height: 35px; background-color: rgba(0,0,0,0.5); border-radius: 0px 0px 8px 8px"></div>
        :wikitext(desc)
            <div style="position: absolute; bottom: 10px; left: 20px;">[[File:icon_star_rating_%s.png|link=]]</div>
            <div style="position: absolute; top: 0px; left: 0px;">[[File:equipment_顶层蒙版.png|150px|link=]]</div>
        </div>
    </label>
      
      
     <!-- 隐藏的checkbox用于控制弹窗 -->
     -- 关闭按钮
     <input type="checkbox" id="%s" class="equipment-popup-toggle" style="display: none;">
     popup:tag('div')
        :attr('class', 'equipment-popup-close')
        :css('position', 'absolute')
        :css('top', '5px')
        :css('right', '10px')
        :css('color', 'white')
        :css('font-size', '20px')
        :css('cursor', 'pointer')
        :wikitext('×')
      
      
     <!-- 弹窗遮罩和内容 -->
     -- 合并HTML
     <div class="equipment-popup-overlay">
     local container = mw.html.create('div')
        <label for="%s" class="equipment-popup-bg"></label>
        :css('display', 'inline-block')
        <div class="equipment-popup-container">
        :node(html)
            <label for="%s" class="equipment-popup-close">×</label>
        :node(popup)
            <div style="position: relative; width:368px; height: 335px; background-color: #343434; border-radius: 9px">
                <div style="position: absolute; top: 0px; left: 0px;">[[File:%s|368px|link=]]</div>
                <div style="position: absolute; top: 40px; left: 128px;">[[File:%s|124px|link=]]</div>
                <div style="position: absolute; top: 167px; left: 0px; width: 368px; height: 35px; background-color: rgba(0,0,0,0.5);"></div>
                <div style="position: absolute; top: 173px; left: 128px;">[[File:icon_star_rating_%s.png|link=]]</div>
                <div style="position: absolute; top: 205px; left: 5px;">[[File:%s|25px|link=]]</div>
                <div style="position: absolute; top: 209px; left: 33px; color: white; font-size: 16px; font-weight: bold;">%s</div>
                <div style="position: absolute; top: 235px; left: 9px; width: 350px; height: 35px; background-color: rgba(255,255,255,0.3); border-radius: 2px"></div>
                <div style="position: absolute; top: 242px; left: 14px; color: white;">%s</div>
                <div style="position: absolute; top: 242px; right: 14px; color: white;">%s</div>
                <div style="position: absolute; top: 277px; left: 10px; right: 10px; color: white; font-size: 13px; line-height: 1.4;">%s</div>
            </div>
        </div>
    </div>
</div>]=],
        uniqueId,  -- for属性
        rarityBg,
        base.art,
        level,
        uniqueId,  -- checkbox id
        uniqueId,  -- 关闭按钮的for
        uniqueId,  -- 背景遮罩的for
        collectionBg,
        base.art,
        level,
        typeIcon,
        name,
        valueTypeText,
        levelData.value,
        desc
    )
      
      
     return frame:preprocess(html)
     return tostring(container)
end
end


-- 批量显示装备(用于装备列表页面)
-- 主函数
function p.list(frame)
function p.show(frame)
     local args = frame.args
     local args = frame:getParent().args
     if not args[1] and frame:getParent() then
     local name = args[1] or args['name']
         args = frame:getParent().args
    local level = args[2] or args['level'] or "1"
   
    if not name then
         return "错误:未指定装备名称"
     end
     end
      
      
     local html = '<div class="equipment-list">'
     local equipData = data[name]
    if not equipData then
        return "错误:未找到装备 " .. name
    end
      
      
     local i = 1
     -- 添加JS初始化脚本(仅添加一次)
     while args[i] do
     mw.loader.load('ext.gadget.equipment-popup')
        local parts = mw.text.split(args[i], "|")
        local name = parts[1]
        local level = parts[2] or "1"
       
        if name and equipmentData[name] then
            -- 调用card函数生成单个装备
            local cardFrame = {
                args = {name, level},
                preprocess = frame.preprocess,
                getParent = function() return nil end
            }
            html = html .. p.card(cardFrame)
        end
        i = i + 1
    end
      
      
    html = html .. '</div>'
     return generateEquipmentCard(name, equipData, level)
     return html
end
end


return p
return p

2025年10月17日 (五) 15:45的版本

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

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

-- 获取星级图标文件名
local function getStarIcon(level)
    return "icon_star_rating_" .. level .. ".png"
end

-- 生成装备卡片HTML
local function generateEquipmentCard(name, equipData, level)
    level = level or "1"
    local base = equipData.base
    local levelData = equipData[level]
    
    if not levelData then
        return "错误:未找到等级数据"
    end
    
    local rarity = base.rarity
    local art = base.art
    local value_type = base.value_type
    local value = levelData.value
    local desc = levelData.desc_global
    
    -- 生成卡片HTML
    local html = mw.html.create('div')
        :attr('class', 'equipment-card')
        :css('position', 'relative')
        :css('display', 'inline-block')
        :css('width', '150px')
        :css('height', '230px')
        :css('cursor', 'pointer')
        
    -- 背景
    html:tag('div')
        :css('position', 'absolute')
        :css('top', '0px')
        :css('left', '0px')
        :wikitext('[[File:bg_equipment_rarity_' .. rarity .. '.png|150px|link=]]')
    
    -- 装备图标
    html:tag('div')
        :css('position', 'absolute')
        :css('top', '43px')
        :css('left', '13px')
        :wikitext('[[File:' .. art .. '|124px|link=]]')
    
    -- 底部遮罩
    html:tag('div')
        :css('position', 'absolute')
        :css('bottom', '5px')
        :css('left', '5px')
        :css('width', '140px')
        :css('height', '35px')
        :css('background-color', 'rgba(0,0,0,0.5)')
        :css('border-radius', '0px 0px 8px 8px')
    
    -- 星级
    html:tag('div')
        :css('position', 'absolute')
        :css('bottom', '10px')
        :css('left', '20px')
        :wikitext('[[File:' .. getStarIcon(level) .. '|link=]]')
    
    -- 顶层蒙版
    html:tag('div')
        :css('position', 'absolute')
        :css('top', '0px')
        :css('left', '0px')
        :wikitext('[[File:equipment_顶层蒙版.png|150px|link=]]')
    
    -- 生成弹窗HTML(隐藏)
    local popup = mw.html.create('div')
        :attr('class', 'equipment-popup')
        :css('display', 'none')
        :css('position', 'fixed')
        :css('top', '50%')
        :css('left', '50%')
        :css('transform', 'translate(-50%, -50%)')
        :css('z-index', '1000')
        :css('width', '368px')
        :css('height', '335px')
        :css('background-color', '#343434')
        :css('border-radius', '9px')
    
    -- 弹窗背景
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '0px')
        :css('left', '0px')
        :wikitext('[[File:bg_collection_rarity_' .. rarity .. '.png|link=]]')
    
    -- 弹窗装备图标
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '40px')
        :css('left', '128px')
        :wikitext('[[File:' .. art .. '|124px|link=]]')
    
    -- 弹窗底部遮罩
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '167px')
        :css('left', '0px')
        :css('width', '368px')
        :css('height', '35px')
        :css('background-color', 'rgba(0,0,0,0.5)')
        :css('border-radius', '0px 0px 8px 8px')
    
    -- 弹窗星级
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '173px')
        :css('left', '128px')
        :wikitext('[[File:' .. getStarIcon(level) .. '|link=]]')
    
    -- 装备类型图标
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '205px')
        :css('left', '5px')
        :css('color', 'white')
        :wikitext('[[File:icon_equip_' .. base.type .. '_' .. rarity .. '.png|25px|link=]]')
    
    -- 装备名称
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '209px')
        :css('left', '33px')
        :css('color', 'white')
        :wikitext(name)
    
    -- 属性背景
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '235px')
        :css('left', '9px')
        :css('width', '350px')
        :css('height', '35px')
        :css('background-color', 'rgba(255,255,255,0.3)')
        :css('border-radius', '2px')
    
    -- 属性类型
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '242px')
        :css('left', '14px')
        :css('color', 'white')
        :wikitext(value_type)
    
    -- 属性值
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '242px')
        :css('right', '14px')
        :css('color', 'white')
        :wikitext(tostring(value))
    
    -- 描述
    popup:tag('div')
        :css('position', 'absolute')
        :css('top', '277px')
        :css('left', '10px')
        :css('right', '10px')
        :css('color', 'white')
        :css('font-size', '13px')
        :css('line-height', '1.3')
        :wikitext(desc)
    
    -- 关闭按钮
    popup:tag('div')
        :attr('class', 'equipment-popup-close')
        :css('position', 'absolute')
        :css('top', '5px')
        :css('right', '10px')
        :css('color', 'white')
        :css('font-size', '20px')
        :css('cursor', 'pointer')
        :wikitext('×')
    
    -- 合并HTML
    local container = mw.html.create('div')
        :css('display', 'inline-block')
        :node(html)
        :node(popup)
    
    return tostring(container)
end

-- 主函数
function p.show(frame)
    local args = frame:getParent().args
    local name = args[1] or args['name']
    local level = args[2] or args['level'] or "1"
    
    if not name then
        return "错误:未指定装备名称"
    end
    
    local equipData = data[name]
    if not equipData then
        return "错误:未找到装备 " .. name
    end
    
    -- 添加JS初始化脚本(仅添加一次)
    mw.loader.load('ext.gadget.equipment-popup')
    
    return generateEquipmentCard(name, equipData, level)
end

return p