模块

战斗员图鉴:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第3行: 第3行:
-- 获取所有战斗员模块的函数
-- 获取所有战斗员模块的函数
function p.getAllCharacters()
function p.getAllCharacters()
    -- 这里需要手动维护角色列表,因为MediaWiki无法直接枚举所有模块
    -- 你需要在添加新角色时更新这个列表
     local characters = {
     local characters = {
         "蕾欧娜",
         "蕾欧娜",
第50行: 第48行:
end
end


-- 渲染单个角色卡片
-- 渲染单个角色卡片 - 关键修改:使用span包装并设置样式
function p.renderCharacterCard(data, isInline)
function p.renderCharacterCard(data)
     if not data then
     if not data then
         return ""
         return ""
第66行: 第64行:
     local rarityClass = p.getRarityClass(rarity)
     local rarityClass = p.getRarityClass(rarity)
      
      
     -- 构建HTML字符串而不是使用mw.html,避免换行问题
     -- 使用span作为最外层容器,并且不包含任何换行符
     local html = '<div class="character-card" style="position: relative; width: 150px; height: 280px; overflow: hidden; display: inline-block; margin: 5px; vertical-align: top;">'
     local html = '<span class="character-card-wrapper" style="display: inline-block; vertical-align: top; margin: 0; padding: 0;">'
   
    html = html .. '<div class="character-card" style="position: relative; width: 150px; height: 280px; overflow: hidden; margin: 5px; vertical-align: top;">'
    -- 背景
     html = html .. '<div style="position: absolute; top: 0px; left: 0px; width: 150px; height: 280px; background-color: #2a2f40; border-radius: 0px 25px 0px 0px; z-index: 0;"></div>'
     html = html .. '<div style="position: absolute; top: 0px; left: 0px; width: 150px; height: 280px; background-color: #2a2f40; border-radius: 0px 25px 0px 0px; z-index: 0;"></div>'
   
    -- 职业图标
     html = html .. '<div style="position: absolute; top: 5px; left: 5px; z-index: 1;">[[File:' .. jobIcon .. '|25px|link=]]</div>'
     html = html .. '<div style="position: absolute; top: 5px; left: 5px; z-index: 1;">[[File:' .. jobIcon .. '|25px|link=]]</div>'
   
    -- 属性图标
     html = html .. '<div style="position: absolute; top: 35px; left: 5px; z-index: 1;">[[File:' .. attributeIcon .. '|25px|link=]]</div>'
     html = html .. '<div style="position: absolute; top: 35px; left: 5px; z-index: 1;">[[File:' .. attributeIcon .. '|25px|link=]]</div>'
   
    -- 角色立绘
     html = html .. '<div style="position: absolute; bottom: 0px; left: 0px; z-index: 1;">[[File:' .. characterImage .. '|150px|link=]]</div>'
     html = html .. '<div style="position: absolute; bottom: 0px; left: 0px; z-index: 1;">[[File:' .. characterImage .. '|150px|link=]]</div>'
   
    -- 角色名称背景
     html = html .. '<div style="position: absolute; bottom: 5px; left: 0px; width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.5); color: white; text-align: right; padding-right: 8px; padding-top: 3px; z-index: 2;">' .. name .. '</div>'
     html = html .. '<div style="position: absolute; bottom: 5px; left: 0px; width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.5); color: white; text-align: right; padding-right: 8px; padding-top: 3px; z-index: 2;">' .. name .. '</div>'
   
    -- 稀有度样式
     html = html .. '<div class="' .. rarityClass .. '" style="position: absolute; left: 0px; bottom: 0px; z-index: 2;"></div>'
     html = html .. '<div class="' .. rarityClass .. '" style="position: absolute; left: 0px; bottom: 0px; z-index: 2;"></div>'
   
    -- 顶层蒙版
     html = html .. '<div style="position: absolute; left: 0px; bottom: 0px; z-index: 99;">[[File:战斗员图鉴_顶层蒙版.png|link=]]</div>'
     html = html .. '<div style="position: absolute; left: 0px; bottom: 0px; z-index: 99;">[[File:战斗员图鉴_顶层蒙版.png|link=]]</div>'
   
     html = html .. '</div></span>'
     html = html .. '</div>'
   
    -- 如果是内联显示,去掉可能的换行
    if isInline then
        html = html:gsub('\n', '')
    end
      
      
     return html
     return html
第104行: 第83行:
     local args = frame:getParent().args
     local args = frame:getParent().args
     local targetCharacter = args[1] or args["角色"] or ""
     local targetCharacter = args[1] or args["角色"] or ""
    local inline = args["inline"] or args["内联"] or "true"
      
      
     -- 如果指定了角色名,只显示该角色
     -- 如果指定了角色名,只显示该角色
第110行: 第88行:
         local data = p.loadCharacterData(targetCharacter)
         local data = p.loadCharacterData(targetCharacter)
         if data then
         if data then
             return p.renderCharacterCard(data, inline == "true")
             return p.renderCharacterCard(data)
         else
         else
             return '<span class="error">错误:找不到角色数据 - ' .. targetCharacter .. '</span>'
             return '<span class="error" style="color: #ff0000; font-weight: bold;">错误:找不到角色数据 - ' .. targetCharacter .. '</span>'
         end
         end
     end
     end
第120行: 第98行:
     local characters = p.getAllCharacters()
     local characters = p.getAllCharacters()
      
      
    -- 添加容器样式
     table.insert(result, '<div class="character-gallery" style="font-size: 0; line-height: 0;">')
     table.insert(result, '<div class="character-gallery" style="display: flex; flex-wrap: wrap; gap: 10px; align-items: flex-start;">')
      
      
     for _, characterName in ipairs(characters) do
     for _, characterName in ipairs(characters) do
         local data = p.loadCharacterData(characterName)
         local data = p.loadCharacterData(characterName)
         if data then
         if data then
             table.insert(result, p.renderCharacterCard(data, false))
             table.insert(result, p.renderCharacterCard(data))
         end
         end
     end
     end
第140行: 第117行:
     local result = {}
     local result = {}
      
      
    -- 添加容器开始标签
     table.insert(result, '<div class="character-gallery" style="font-size: 0; line-height: 0;">')
     table.insert(result, '<div class="character-gallery" style="display: flex; flex-wrap: wrap; gap: 10px; align-items: flex-start;">')
      
      
    -- 处理所有参数
     for i = 1, 20 do
     for i = 1, 20 do -- 支持最多20个角色
         local characterName = args[i]
         local characterName = args[i]
         if characterName and characterName ~= "" then
         if characterName and characterName ~= "" then
             local data = p.loadCharacterData(characterName)
             local data = p.loadCharacterData(characterName)
             if data then
             if data then
                 table.insert(result, p.renderCharacterCard(data, false))
                 table.insert(result, p.renderCharacterCard(data))
             else
             else
                 table.insert(result, '<span class="error">错误:找不到角色数据 - ' .. characterName .. '</span>')
                 table.insert(result, '<span class="error" style="color: #ff0000; font-weight: bold;">错误:找不到角色数据 - ' .. characterName .. '</span>')
             end
             end
         end
         end
     end
     end
      
      
    -- 添加容器结束标签
     table.insert(result, '</div>')
     table.insert(result, '</div>')
      
      
第162行: 第136行:
end
end


-- 直接调用函数(用于其他模块调用)
-- 直接调用函数
function p.showCharacter(characterName)
function p.showCharacter(characterName)
     local data = p.loadCharacterData(characterName)
     local data = p.loadCharacterData(characterName)
     return p.renderCharacterCard(data, true)
     return p.renderCharacterCard(data)
end
end


-- 获取角色数据函数(用于其他模块调用)
-- 获取角色数据函数
function p.getCharacterData(characterName)
function p.getCharacterData(characterName)
     return p.loadCharacterData(characterName)
     return p.loadCharacterData(characterName)

2025年9月24日 (三) 21:00的版本

此模块的文档可以在模块:战斗员图鉴/doc创建

local p = {}

-- 获取所有战斗员模块的函数
function p.getAllCharacters()
    local characters = {
        "蕾欧娜",
        -- 在这里添加其他角色名称
    }
    return characters
end

-- 安全地加载角色数据
function p.loadCharacterData(characterName)
    local success, characterModule = pcall(require, "模块:战斗员/" .. characterName)
    if success and characterModule and characterModule.data then
        return characterModule.data
    else
        return nil
    end
end

-- 获取稀有度对应的CSS类
function p.getRarityClass(rarity)
    return "rarity-" .. (rarity or "1")
end

-- 获取职业图标文件名
function p.getJobIcon(job)
    if job then
        return "icon_职业_" .. job .. ".png"
    else
        return "icon_职业_未知.png"
    end
end

-- 获取属性图标文件名
function p.getAttributeIcon(attribute)
    if attribute then
        return "icon_属性_" .. attribute .. ".png"
    else
        return "icon_属性_未知.png"
    end
end

-- 获取角色立绘文件名
function p.getCharacterImage(characterName)
    return "战斗员图鉴_" .. characterName .. ".png"
end

-- 渲染单个角色卡片 - 关键修改:使用span包装并设置样式
function p.renderCharacterCard(data)
    if not data then
        return ""
    end
    
    local name = data["名称"] or "未知"
    local rarity = data["稀有度"] or "1"
    local job = data["职业"] or ""
    local attribute = data["属性"] or ""
    
    local jobIcon = p.getJobIcon(job)
    local attributeIcon = p.getAttributeIcon(attribute)
    local characterImage = p.getCharacterImage(name)
    local rarityClass = p.getRarityClass(rarity)
    
    -- 使用span作为最外层容器,并且不包含任何换行符
    local html = '<span class="character-card-wrapper" style="display: inline-block; vertical-align: top; margin: 0; padding: 0;">'
    html = html .. '<div class="character-card" style="position: relative; width: 150px; height: 280px; overflow: hidden; margin: 5px; vertical-align: top;">'
    html = html .. '<div style="position: absolute; top: 0px; left: 0px; width: 150px; height: 280px; background-color: #2a2f40; border-radius: 0px 25px 0px 0px; z-index: 0;"></div>'
    html = html .. '<div style="position: absolute; top: 5px; left: 5px; z-index: 1;">[[File:' .. jobIcon .. '|25px|link=]]</div>'
    html = html .. '<div style="position: absolute; top: 35px; left: 5px; z-index: 1;">[[File:' .. attributeIcon .. '|25px|link=]]</div>'
    html = html .. '<div style="position: absolute; bottom: 0px; left: 0px; z-index: 1;">[[File:' .. characterImage .. '|150px|link=]]</div>'
    html = html .. '<div style="position: absolute; bottom: 5px; left: 0px; width: 150px; height: 30px; background-color: rgba(0, 0, 0, 0.5); color: white; text-align: right; padding-right: 8px; padding-top: 3px; z-index: 2;">' .. name .. '</div>'
    html = html .. '<div class="' .. rarityClass .. '" style="position: absolute; left: 0px; bottom: 0px; z-index: 2;"></div>'
    html = html .. '<div style="position: absolute; left: 0px; bottom: 0px; z-index: 99;">[[File:战斗员图鉴_顶层蒙版.png|link=]]</div>'
    html = html .. '</div></span>'
    
    return html
end

-- 主函数
function p.show(frame)
    local args = frame:getParent().args
    local targetCharacter = args[1] or args["角色"] or ""
    
    -- 如果指定了角色名,只显示该角色
    if targetCharacter ~= "" then
        local data = p.loadCharacterData(targetCharacter)
        if data then
            return p.renderCharacterCard(data)
        else
            return '<span class="error" style="color: #ff0000; font-weight: bold;">错误:找不到角色数据 - ' .. targetCharacter .. '</span>'
        end
    end
    
    -- 显示所有角色
    local result = {}
    local characters = p.getAllCharacters()
    
    table.insert(result, '<div class="character-gallery" style="font-size: 0; line-height: 0;">')
    
    for _, characterName in ipairs(characters) do
        local data = p.loadCharacterData(characterName)
        if data then
            table.insert(result, p.renderCharacterCard(data))
        end
    end
    
    table.insert(result, '</div>')
    
    return table.concat(result, '')
end

-- 批量显示角色函数
function p.showMultiple(frame)
    local args = frame:getParent().args
    local result = {}
    
    table.insert(result, '<div class="character-gallery" style="font-size: 0; line-height: 0;">')
    
    for i = 1, 20 do
        local characterName = args[i]
        if characterName and characterName ~= "" then
            local data = p.loadCharacterData(characterName)
            if data then
                table.insert(result, p.renderCharacterCard(data))
            else
                table.insert(result, '<span class="error" style="color: #ff0000; font-weight: bold;">错误:找不到角色数据 - ' .. characterName .. '</span>')
            end
        end
    end
    
    table.insert(result, '</div>')
    
    return table.concat(result, '')
end

-- 直接调用函数
function p.showCharacter(characterName)
    local data = p.loadCharacterData(characterName)
    return p.renderCharacterCard(data)
end

-- 获取角色数据函数
function p.getCharacterData(characterName)
    return p.loadCharacterData(characterName)
end

return p