模块:战斗员图鉴
来自卡厄思梦境WIKI
此模块的文档可以在模块:战斗员图鉴/doc创建
local p = {}
local characterData = mw.loadData("模块:战斗员图鉴/筛选")
function p.loadCharacterData(characterName)
return characterData[characterName]
end
-- 使用更底层的方法加载模块,避免依赖追踪
function p.loadCharacterDataSilent(characterName)
-- 首先检查页面是否存在
local title = mw.title.new("模块:战斗员/" .. characterName)
if not title or not title.exists then
return nil
end
-- 使用 pcall 保护调用,防止错误中断执行
local success, result = pcall(function()
-- 尝试使用 mw.loadData 加载模块(不追踪依赖)
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
-- 如果 mw.loadData 失败,尝试使用 require(作为备选方案)
local success2, result2 = pcall(function()
-- 临时禁用依赖追踪(如果可能)
local originalAddWarning = mw.addWarning
mw.addWarning = function() end -- 临时禁用警告
local module = require("模块:战斗员/" .. characterName)
-- 恢复警告函数
mw.addWarning = originalAddWarning
return module
end)
if success2 and result2 and result2.data then
return result2.data
end
return nil
end
-- 批量加载所有角色数据(静默方式)
function p.loadAllCharacterDataSilent()
local allData = {}
local characters = p.getAllCharacters()
for _, characterName in ipairs(characters) do
local data = p.loadCharacterDataSilent(characterName)
if data then
allData[characterName] = data
end
end
return allData
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.loadCharacterDataSilent(targetCharacter)
if data then
return p.renderCharacterCard(data)
else
return '<span class="error">错误:找不到角色数据 - ' .. targetCharacter .. '</span>'
end
end
-- 一次性静默加载所有角色数据
local allCharacters = p.loadAllCharacterDataSilent()
-- 显示所有角色
local result = {}
local characters = p.getAllCharacters()
for _, characterName in ipairs(characters) do
local data = allCharacters[characterName]
if data then
table.insert(result, p.renderCharacterCard(data))
end
end
return table.concat(result, '')
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)
local data = p.loadCharacterDataSilent(characterName)
return p.renderCharacterCard(data)
end
-- 获取角色数据函数(使用静默加载)
function p.getCharacterData(characterName)
return p.loadCharacterDataSilent(characterName)
end
-- 调试函数:检查加载状态
function p.debugLoadStatus(frame)
local args = frame:getParent().args
local characterName = args[1] or "蕾欧娜"
local result = {}
table.insert(result, "=== 调试信息 ===")
-- 检查页面是否存在
local title = mw.title.new("模块:战斗员/" .. characterName)
table.insert(result, "页面存在: " .. (title and title.exists and "是" or "否"))
-- 尝试加载数据
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
return table.concat(result, "<br/>")
end
-- 高级静默加载函数(更深度避免依赖追踪)
function p.loadCharacterDataDeepSilent(characterName)
-- 方法1:尝试直接访问模块内容
local success1, result1 = pcall(function()
local title = mw.title.new("模块:战斗员/" .. characterName)
if not title or not title.exists then
return nil
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
return result1.data or result1
end
-- 备选方法:常规静默加载
return p.loadCharacterDataSilent(characterName)
end
return p