模块

装备:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第1行: 第1行:
local p = {}
local Equipment = {}


-- 调试函数
-- 从数据模块加载装备数据
function p.debug(frame)
local equipmentData = require("模块:装备/data")
    local args = frame:getParent().args
    local result = "调试信息:\n"
   
    for k, v in pairs(args) do
        result = result .. "key [" .. tostring(k) .. "] = [" .. tostring(v) .. "]\n"
    end
   
    return "<pre>" .. result .. "</pre>"
end


-- 主函数
-- 生成装备显示HTML
function p.show(frame)
function Equipment.renderEquipment(equipName, level)
     -- 直接使用 frame.args 而不是 frame:getParent().args
     level = level or "1"  -- 默认等级为1
    local args = frame.args
      
      
     -- 如果 frame.args 为空,则尝试 getParent
     local equip = equipmentData[equipName]
     if not next(args) then
     if not equip then
         args = frame:getParent().args
         return "<div class='error'>找不到装备:" .. equipName .. "</div>"
     end
     end
      
      
     local name = args[1] or args['name']
     local base = equip.base
     local level = args[2] or args['level'] or "1"
     local levelData = equip[level]
      
      
    -- 去除空白
     if not levelData then
     if name then
         return "<div class='error'>找不到装备等级:" .. level .. "</div>"
         name = mw.text.trim(name)
    end
    if level then
        level = mw.text.trim(level)
     end
     end
      
      
     if not name or name == "" then
     -- 生成装备卡片HTML
        return "错误:未指定装备名称 (请先使用 {{#invoke:装备|debug|窃取者的短刀|1}} 调试)"
    local html = [=[
     end
<div class="equipment-card" data-equip-name="]=] .. equipName .. [=[" data-equip-level="]=] .. level .. [=[" style="position: relative; display: inline-block; width:150px; height: 230px;">
  <div style="position: absolute; top: 0px; left: 0px;">[[File:bg_equipment_rarity_]=] .. base.rarity .. [=[.png|150px|link=]]</div>
  <div style="position: absolute; top: 43px; left: 13px;">[[File:]=] .. base.art .. [=[|124px|link=]]</div>
  <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>
  <div style="position: absolute; bottom: 10px; left: 20px; ">[[File:icon_star_rating_]=] .. level .. [=[.png|link=]]</div>
  <div style="position: absolute; top: 0px; left: 0px;">[[File:equipment_顶层蒙版.png|150px|link=]]</div>
</div>
]=]
 
     return html
end
 
-- 生成装备详情弹窗HTML
function Equipment.renderEquipmentDetail(equipName, level)
    level = level or "1"  -- 默认等级为1
      
      
     local data = mw.loadData("模块:装备/data")
     local equip = equipmentData[equipName]
    local equipData = data[name]
     if not equip then
   
         return "<div class='error'>找不到装备:" .. equipName .. "</div>"
     if not equipData then
         return "错误:未找到装备 [" .. name .. "]"
     end
     end
      
      
     local base = equipData.base
     local base = equip.base
     local levelData = equipData[level]
     local levelData = equip[level]
      
      
     if not levelData then
     if not levelData then
         return "错误:未找到等级数据 " .. level
         return "<div class='error'>找不到装备等级:" .. level .. "</div>"
     end
     end
      
      
     local rarity = base.rarity
    -- 生成装备详情弹窗HTML
    local art = base.art
     local html = [=[
    local value_type = base.value_type
<div class="equipment-detail" style="position: relative; display: inline-block; width:368px; height: 335px; background-color: #343434; border-radius: 9px">
    local value = levelData.value
  <div style="position: absolute; top: 0px; left: 0px;">[[File:bg_collection_rarity_]=] .. base.rarity .. [=[.png|link=]]</div>
    local desc = levelData.desc_global
  <div style="position: absolute; top: 40px; left: 128px;">[[File:]=] .. base.art .. [=[|124px|link=]]</div>
  <div style="position: absolute; top: 167px; left: 0px; width: 368px; height: 35px; background-color: rgba(0,0,0,0.5); border-radius: 0px 0px 8px 8px"></div>
  <div style="position: absolute; top: 173px; left: 128px; ">[[File:icon_star_rating_]=] .. level .. [=[.png|link=]]</div>
  <div style="position: absolute; top: 205px; left: 5px; color: white">[[File:icon_equip_]=] .. base.type .. [=[_]=] .. base.rarity .. [=[.png|25px|link=]]</div>
  <div style="position: absolute; top: 209px; left: 33px; color: white">]=] .. equipName .. [=[</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">]=] .. base.value_type .. [=[</div>
  <div style="position: absolute; top: 242px; right: 14px; color: white">]=] .. levelData.value .. [=[</div>
  <div style="position: absolute; top: 277px; left: 10px; color: white">]=] .. levelData.desc_global .. [=[</div>
</div>
]=]
 
    return html
end
 
-- 生成装备列表
function Equipment.renderEquipmentList(filter)
    filter = filter or {}
    local html = "<div class='equipment-list'>"
      
      
     -- 生成卡片HTML
     for equipName, equipData in pairs(equipmentData) do
    local html = mw.html.create('div')
        -- 应用筛选条件
         :attr('class', 'equipment-card')
        local shouldShow = true
         :css('position', 'relative')
        if filter.rarity and equipData.base.rarity ~= filter.rarity then
         :css('display', 'inline-block')
            shouldShow = false
         :css('width', '150px')
         end
        :css('height', '230px')
         if filter.type and equipData.base.type ~= filter.type then
         :css('cursor', 'pointer')
            shouldShow = false
         end
         if filter.area and equipData.base.area ~= filter.area then
            shouldShow = false
         end
          
          
    html:tag('div')
         if shouldShow then
         :css('position', 'absolute')
            html = html .. Equipment.renderEquipment(equipName, "1") -- 默认显示1级
        :css('top', '0px')
         end
         :css('left', '0px')
    end
        :wikitext('[[File:bg_equipment_rarity_' .. rarity .. '.png|150px|link=]]')
      
      
     html:tag('div')
     html = html .. "</div>"
        :css('position', 'absolute')
    return html
         :css('top', '43px')
end
        :css('left', '13px')
 
        :wikitext('[[File:' .. art .. '|124px|link=]]')
-- 列出所有可用的装备名称
function Equipment.listEquipmentNames()
    local names = {}
    for equipName, _ in pairs(equipmentData) do
         table.insert(names, equipName)
    end
    return names
end
 
-- 获取装备数据(供其他模块使用)
function Equipment.getEquipmentData(equipName, level)
    level = level or "1"  -- 默认等级为1
      
      
     html:tag('div')
     local equip = equipmentData[equipName]
        :css('position', 'absolute')
    if not equip then
        :css('bottom', '5px')
         return nil
        :css('left', '5px')
    end
        :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')
     local levelData = equip[level]
        :css('position', 'absolute')
     if not levelData then
        :css('bottom', '10px')
         return nil
        :css('left', '20px')
     end
        :wikitext('[[File:icon_star_rating_' .. level .. '.png|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:icon_star_rating_' .. level .. '.png|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('×')
   
    local container = mw.html.create('div')
        :css('display', 'inline-block')
        :node(html)
        :node(popup)
      
      
     return tostring(container)
    -- 返回装备基本数据和指定等级的数据
     return {
        base = equip.base,
        level = levelData,
        name = equipName,
        level_num = level
    }
end
end


return p
return Equipment

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

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

local Equipment = {}

-- 从数据模块加载装备数据
local equipmentData = require("模块:装备/data")

-- 生成装备显示HTML
function Equipment.renderEquipment(equipName, level)
    level = level or "1"  -- 默认等级为1
    
    local equip = equipmentData[equipName]
    if not equip then
        return "<div class='error'>找不到装备:" .. equipName .. "</div>"
    end
    
    local base = equip.base
    local levelData = equip[level]
    
    if not levelData then
        return "<div class='error'>找不到装备等级:" .. level .. "</div>"
    end
    
    -- 生成装备卡片HTML
    local html = [=[
<div class="equipment-card" data-equip-name="]=] .. equipName .. [=[" data-equip-level="]=] .. level .. [=[" style="position: relative; display: inline-block; width:150px; height: 230px;">
  <div style="position: absolute; top: 0px; left: 0px;">[[File:bg_equipment_rarity_]=] .. base.rarity .. [=[.png|150px|link=]]</div>
  <div style="position: absolute; top: 43px; left: 13px;">[[File:]=] .. base.art .. [=[|124px|link=]]</div>
  <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>
  <div style="position: absolute; bottom: 10px; left: 20px; ">[[File:icon_star_rating_]=] .. level .. [=[.png|link=]]</div>
  <div style="position: absolute; top: 0px; left: 0px;">[[File:equipment_顶层蒙版.png|150px|link=]]</div>
</div>
]=]

    return html
end

-- 生成装备详情弹窗HTML
function Equipment.renderEquipmentDetail(equipName, level)
    level = level or "1"  -- 默认等级为1
    
    local equip = equipmentData[equipName]
    if not equip then
        return "<div class='error'>找不到装备:" .. equipName .. "</div>"
    end
    
    local base = equip.base
    local levelData = equip[level]
    
    if not levelData then
        return "<div class='error'>找不到装备等级:" .. level .. "</div>"
    end
    
    -- 生成装备详情弹窗HTML
    local html = [=[
<div class="equipment-detail" style="position: relative; display: inline-block; width:368px; height: 335px; background-color: #343434; border-radius: 9px">
  <div style="position: absolute; top: 0px; left: 0px;">[[File:bg_collection_rarity_]=] .. base.rarity .. [=[.png|link=]]</div>
  <div style="position: absolute; top: 40px; left: 128px;">[[File:]=] .. base.art .. [=[|124px|link=]]</div>
  <div style="position: absolute; top: 167px; left: 0px; width: 368px; height: 35px; background-color: rgba(0,0,0,0.5); border-radius: 0px 0px 8px 8px"></div>
  <div style="position: absolute; top: 173px; left: 128px; ">[[File:icon_star_rating_]=] .. level .. [=[.png|link=]]</div>
  <div style="position: absolute; top: 205px; left: 5px; color: white">[[File:icon_equip_]=] .. base.type .. [=[_]=] .. base.rarity .. [=[.png|25px|link=]]</div>
  <div style="position: absolute; top: 209px; left: 33px; color: white">]=] .. equipName .. [=[</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">]=] .. base.value_type .. [=[</div>
  <div style="position: absolute; top: 242px; right: 14px; color: white">]=] .. levelData.value .. [=[</div>
  <div style="position: absolute; top: 277px; left: 10px; color: white">]=] .. levelData.desc_global .. [=[</div>
</div>
]=]

    return html
end

-- 生成装备列表
function Equipment.renderEquipmentList(filter)
    filter = filter or {}
    local html = "<div class='equipment-list'>"
    
    for equipName, equipData in pairs(equipmentData) do
        -- 应用筛选条件
        local shouldShow = true
        if filter.rarity and equipData.base.rarity ~= filter.rarity then
            shouldShow = false
        end
        if filter.type and equipData.base.type ~= filter.type then
            shouldShow = false
        end
        if filter.area and equipData.base.area ~= filter.area then
            shouldShow = false
        end
        
        if shouldShow then
            html = html .. Equipment.renderEquipment(equipName, "1") -- 默认显示1级
        end
    end
    
    html = html .. "</div>"
    return html
end

-- 列出所有可用的装备名称
function Equipment.listEquipmentNames()
    local names = {}
    for equipName, _ in pairs(equipmentData) do
        table.insert(names, equipName)
    end
    return names
end

-- 获取装备数据(供其他模块使用)
function Equipment.getEquipmentData(equipName, level)
    level = level or "1"  -- 默认等级为1
    
    local equip = equipmentData[equipName]
    if not equip then
        return nil
    end
    
    local levelData = equip[level]
    if not levelData then
        return nil
    end
    
    -- 返回装备基本数据和指定等级的数据
    return {
        base = equip.base,
        level = levelData,
        name = equipName,
        level_num = level
    }
end

return Equipment