模块

战斗员图鉴:修订间差异

来自卡厄思梦境WIKI

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


-- 使用 mw.loadData 从筛选模块获取数据
local characterData = mw.loadData("模块:战斗员图鉴/筛选")
local characterData = mw.loadData("模块:战斗员图鉴/筛选")
-- 获取所有角色名称的函数(从筛选模块数据中获取)
function p.getAllCharacters()
    local characters = {}
    for name, _ in pairs(characterData) do
        table.insert(characters, name)
    end
    -- 按名称排序
    table.sort(characters)
    return characters
end
-- 从筛选模块加载角色数据
function p.loadCharacterData(characterName)
function p.loadCharacterData(characterName)
     return characterData[characterName]
     return characterData[characterName]
end
end


-- 使用更底层的方法加载模块,避免依赖追踪
-- 使用更底层的方法加载模块,避免依赖追踪(保留作为备选方案)
function p.loadCharacterDataSilent(characterName)
function p.loadCharacterDataSilent(characterName)
     -- 首先检查页面是否存在
     -- 首先尝试从筛选模块获取数据
    local data = characterData[characterName]
    if data then
        return data
    end
   
    -- 如果筛选模块中没有,再尝试从单独的角色模块加载
     local title = mw.title.new("模块:战斗员/" .. characterName)
     local title = mw.title.new("模块:战斗员/" .. characterName)
     if not title or not title.exists then
     if not title or not title.exists then
第14行: 第34行:
     end
     end
      
      
    -- 使用 pcall 保护调用,防止错误中断执行
     local success, result = pcall(function()
     local success, result = pcall(function()
        -- 尝试使用 mw.loadData 加载模块(不追踪依赖)
         return mw.loadData("模块:战斗员/" .. characterName)
         return mw.loadData("模块:战斗员/" .. characterName)
     end)
     end)
      
      
     if success and result then
     if success and result then
        -- 检查数据结构
         if result.data then
         if result.data then
             return result.data
             return result.data
         elseif type(result) == "table" then
         elseif type(result) == "table" then
            -- 如果模块直接返回数据表
             return result
             return result
         end
         end
     end
     end
      
      
     -- 如果 mw.loadData 失败,尝试使用 require(作为备选方案)
     -- 最后尝试 require
     local success2, result2 = pcall(function()
     local success2, result2 = pcall(function()
        -- 临时禁用依赖追踪(如果可能)
        local originalAddWarning = mw.addWarning
        mw.addWarning = function() end -- 临时禁用警告
       
         local module = require("模块:战斗员/" .. characterName)
         local module = require("模块:战斗员/" .. characterName)
       
        -- 恢复警告函数
        mw.addWarning = originalAddWarning
       
         return module
         return module
     end)
     end)
第51行: 第59行:
end
end


-- 批量加载所有角色数据(静默方式)
-- 批量加载所有角色数据(现在主要从筛选模块获取)
function p.loadAllCharacterDataSilent()
function p.loadAllCharacterDataSilent()
     local allData = {}
     -- 直接返回筛选模块的所有数据
    local characters = p.getAllCharacters()
     return characterData
   
    for _, characterName in ipairs(characters) do
        local data = p.loadCharacterDataSilent(characterName)
        if data then
            allData[characterName] = data
        end
    end
   
     return allData
end
end


第139行: 第138行:
end
end


-- 主函数(使用静默加载)
-- 主函数
function p.show(frame)
function p.show(frame)
     local args = frame:getParent().args
     local args = frame:getParent().args
第146行: 第145行:
     -- 如果指定了角色名,只显示该角色
     -- 如果指定了角色名,只显示该角色
     if targetCharacter ~= "" then
     if targetCharacter ~= "" then
         local data = p.loadCharacterDataSilent(targetCharacter)
         local data = p.loadCharacterData(targetCharacter)
         if data then
         if data then
             return p.renderCharacterCard(data)
             return p.renderCharacterCard(data)
第153行: 第152行:
         end
         end
     end
     end
   
    -- 一次性静默加载所有角色数据
    local allCharacters = p.loadAllCharacterDataSilent()
      
      
     -- 显示所有角色
     -- 显示所有角色
第162行: 第158行:
      
      
     for _, characterName in ipairs(characters) do
     for _, characterName in ipairs(characters) do
         local data = allCharacters[characterName]
         local data = p.loadCharacterData(characterName)
         if data then
         if data then
             table.insert(result, p.renderCharacterCard(data))
             table.insert(result, p.renderCharacterCard(data))
第171行: 第167行:
end
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
 
-- 直接调用函数(使用静默加载)
function p.showCharacter(characterName)
function p.showCharacter(characterName)
     local data = p.loadCharacterDataSilent(characterName)
     local data = p.loadCharacterData(characterName)
     return p.renderCharacterCard(data)
     return p.renderCharacterCard(data)
end
end


-- 获取角色数据函数(使用静默加载)
-- 获取角色数据函数
function p.getCharacterData(characterName)
function p.getCharacterData(characterName)
     return p.loadCharacterDataSilent(characterName)
     return p.loadCharacterData(characterName)
end
end


-- 调试函数:检查加载状态
-- 调试函数:显示筛选模块中的所有角色
function p.debugLoadStatus(frame)
function p.debugShowAllCharacters(frame)
    local args = frame:getParent().args
    local characterName = args[1] or "蕾欧娜"
   
     local result = {}
     local result = {}
     table.insert(result, "=== 调试信息 ===")
     table.insert(result, "=== 筛选模块中的角色列表 ===")
      
      
    -- 检查页面是否存在
     local characters = p.getAllCharacters()
    local title = mw.title.new("模块:战斗员/" .. characterName)
     for i, name in ipairs(characters) do
    table.insert(result, "页面存在: " .. (title and title.exists and "是" or "否"))
         table.insert(result, i .. ". " .. name)
   
    -- 尝试加载数据
     local data = p.loadCharacterDataSilent(characterName)
     table.insert(result, "数据加载: " .. (data and "成功" or "失败"))
   
    if data then
        table.insert(result, "角色名称: " .. (data["名称"] or "未知"))
        table.insert(result, "稀有度: " .. (data["稀有度"] or "未知"))
         table.insert(result, "职业: " .. (data["职业"] or "未知"))
        table.insert(result, "属性: " .. (data["属性"] or "未知"))
     end
     end
      
      
第218行: 第191行:
end
end


-- 高级静默加载函数(更深度避免依赖追踪)
-- 调试函数:检查特定角色的数据
function p.loadCharacterDataDeepSilent(characterName)
function p.debugShowCharacterData(frame)
    -- 方法1:尝试直接访问模块内容
     local args = frame:getParent().args
     local success1, result1 = pcall(function()
    local characterName = args[1] or "蕾欧娜"
        local title = mw.title.new("模块:战斗员/" .. characterName)
   
        if not title or not title.exists then
    local data = p.loadCharacterData(characterName)
            return nil
    if not data then
        end
         return "角色 " .. characterName .. " 的数据不存在"
       
     end
        -- 使用 loadData 并忽略依赖
        local oldGetTitle = mw.title.getCurrentTitle
         mw.title.getCurrentTitle = function()
            return mw.title.new("Special:BlankPage") -- 返回虚拟页面
        end
       
        local moduleData = mw.loadData("模块:战斗员/" .. characterName)
       
        -- 恢复原函数
        mw.title.getCurrentTitle = oldGetTitle
       
        return moduleData
     end)
      
      
     if success1 and result1 then
     local result = {}
         return result1.data or result1
    table.insert(result, "=== " .. characterName .. " 的数据 ===")
    for key, value in pairs(data) do
         table.insert(result, key .. ": " .. tostring(value))
     end
     end
      
      
    -- 备选方法:常规静默加载
     return table.concat(result, "<br/>")
     return p.loadCharacterDataSilent(characterName)
end
end


return p
return p

2025年9月24日 (三) 21:44的最新版本

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

local p = {}

-- 使用 mw.loadData 从筛选模块获取数据
local characterData = mw.loadData("模块:战斗员图鉴/筛选")

-- 获取所有角色名称的函数(从筛选模块数据中获取)
function p.getAllCharacters()
    local characters = {}
    for name, _ in pairs(characterData) do
        table.insert(characters, name)
    end
    -- 按名称排序
    table.sort(characters)
    return characters
end

-- 从筛选模块加载角色数据
function p.loadCharacterData(characterName)
    return characterData[characterName]
end

-- 使用更底层的方法加载模块,避免依赖追踪(保留作为备选方案)
function p.loadCharacterDataSilent(characterName)
    -- 首先尝试从筛选模块获取数据
    local data = characterData[characterName]
    if data then
        return data
    end
    
    -- 如果筛选模块中没有,再尝试从单独的角色模块加载
    local title = mw.title.new("模块:战斗员/" .. characterName)
    if not title or not title.exists then
        return nil
    end
    
    local success, result = pcall(function()
        return mw.loadData("模块:战斗员/" .. characterName)
    end)
    
    if success and result then
        if result.data then
            return result.data
        elseif type(result) == "table" then
            return result
        end
    end
    
    -- 最后尝试 require
    local success2, result2 = pcall(function()
        local module = require("模块:战斗员/" .. characterName)
        return module
    end)
    
    if success2 and result2 and result2.data then
        return result2.data
    end
    
    return nil
end

-- 批量加载所有角色数据(现在主要从筛选模块获取)
function p.loadAllCharacterDataSilent()
    -- 直接返回筛选模块的所有数据
    return characterData
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

-- 渲染单个角色卡片
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)
    
    -- 在开始添加HTML注释来"连接"到前一个元素
    local html = '<!--\n--><div class="character-card" style="display: inline-block; vertical-align: top; position: relative; width: 150px; height: 280px; overflow: hidden; margin: 5px;">'
    
    -- 背景
    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><!--\n-->'
    
    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">错误:找不到角色数据 - ' .. targetCharacter .. '</span>'
        end
    end
    
    -- 显示所有角色
    local result = {}
    local characters = p.getAllCharacters()
    
    for _, characterName in ipairs(characters) do
        local data = p.loadCharacterData(characterName)
        if data then
            table.insert(result, p.renderCharacterCard(data))
        end
    end
    
    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

-- 调试函数:显示筛选模块中的所有角色
function p.debugShowAllCharacters(frame)
    local result = {}
    table.insert(result, "=== 筛选模块中的角色列表 ===")
    
    local characters = p.getAllCharacters()
    for i, name in ipairs(characters) do
        table.insert(result, i .. ". " .. name)
    end
    
    return table.concat(result, "<br/>")
end

-- 调试函数:检查特定角色的数据
function p.debugShowCharacterData(frame)
    local args = frame:getParent().args
    local characterName = args[1] or "蕾欧娜"
    
    local data = p.loadCharacterData(characterName)
    if not data then
        return "角色 " .. characterName .. " 的数据不存在"
    end
    
    local result = {}
    table.insert(result, "=== " .. characterName .. " 的数据 ===")
    for key, value in pairs(data) do
        table.insert(result, key .. ": " .. tostring(value))
    end
    
    return table.concat(result, "<br/>")
end

return p