全站通知:
模块:数据库
刷
历
编
跳到导航
跳到搜索
{{#invoke:数据库|卡面图片|id=|name=|pic=}}
使用id传入最准确
name的作用是辅助找到id,在name相同的卡中会返回最小的id,然后用这个id找卡面
pic可以指定这张卡的哪一张立绘(不传入时即为初始立绘,传入时要求pic>=1)
local p = {}
local image_data = mw.loadData('模块:卡面数据库内容')
local image_handle = require('模块:卡牌资源内容')
local card_data = require('模块:卡牌数据库内容').cards_set
local sound_module = require('模块:音频数据库内容')
local sound_data = sound_module.sound_set or {}
p["卡牌信息"] = function(frame)
local card_id = tonumber(frame.args["ID"])
if not card_id then
return "Invalid ID."
end
local card = card_data[card_id]
if not card then
return "ID not found."
end
local output = {}
-- 设置基础信息
frame:callParserFunction{name='#vardefine', args={'名字', card.name}}
frame:callParserFunction{name='#vardefine', args={'身份', card.title}}
frame:callParserFunction{name='#vardefine', args={'卡牌介绍', card.text}}
frame:callParserFunction{name='#vardefine', args={'品级', card.rare}}
-- 处理音频数据
local sound_id = tostring(card_id) -- 将ID转换为字符串用于查找
local sound_files = sound_data[sound_id]
if sound_files and #sound_files > 0 then
-- 将音频文件数组转换为字符串,用顿号分隔
local sound_text = table.concat(sound_files, "、")
frame:callParserFunction{name='#vardefine', args={'音频文件', sound_text}}
-- 如果需要单独访问每个音频文件,也可以设置多个变量
for i, sound_file in ipairs(sound_files) do
frame:callParserFunction{name='#vardefine', args={'音频文件' .. i, sound_file}}
end
else
-- 如果没有音频数据,设置空值
frame:callParserFunction{name='#vardefine', args={'音频文件', ''}}
end
-- 原有的标签处理代码
local tag_module = require('模块:Tag对照内容')
local tag_translation = tag_module.tag_translation
local allowed_attr = tag_module.allowed_attr
if card.tag then
local tag_text = {}
local attr_text = {}
for tag_name, value in pairs(card.tag) do
local zh_name = tag_translation[tag_name] or tag_name
table.insert(tag_text, zh_name)
if allowed_attr[zh_name] and value ~= nil then
attr_text[zh_name] = tostring(value)
end
end
table.sort(tag_text)
frame:callParserFunction{name='#vardefine', args={'标签', table.concat(tag_text, "、")}}
if next(attr_text) ~= nil then
frame:callParserFunction{
name = '#vardefine',
args = {'属性', frame:expandTemplate{title='属性', args=attr_text}}
}
end
end
if card.equips then
frame:callParserFunction{name='#vardefine', args={'装备栏', table.concat(card.equips, "、")}}
end
end
p["卡面图片"] = function(frame)
local args = frame.args or {}
local name = args.name or args[1]
local id = tonumber(args.id)
id = id and card_data[id] and id or p.nameToMinId[name] or ""
local resource_id = image_handle.getResourceID(id)
local pic = args.pic or "" -- 支持字符串数字(如"1")或纯数字(如2)
-- 先确保 resource_id 和对应的卡片数据有效
if resource_id and card_data[resource_id] then
local baseName = card_data[resource_id].name
local hasValidPic = false
local picNum = 0
-- 验证 pic 是否为有效正整数(非空、能转数字、≥1、无小数)
if pic then
picNum = tonumber(pic)
hasValidPic = picNum ~= nil and picNum >= 1
end
if hasValidPic then
-- 有效 pic:拼接「基础名-三位补零数字-无背景
local picStr = string.format("%03d", picNum)
return baseName .. "-" .. picStr .. "-无背景"
else
-- 无效/无 pic:拼接「基础名-无背景」
return baseName .. "-无背景"
end
else
-- 若 resource_id 无效,仍返回空字符串(保持原逻辑兼容)
return image_data[name] or "resource_id".. resource_id.."id"..id
end
end
-- 功能:根据卡牌 ID 返回音频文件名列表(例如 {"flj001","flj002"})
p.getAudioList = function(card_id)
-- 允许传入数字或字符串
local id = nil
if type(card_id) == "table" and card_id.args then
id = tostring(card_id.args["ID"] or "")
else
id = tostring(card_id or "")
end
if id == "" then
return nil
end
local list = sound_data[id]
if list and type(list) == "table" then
local new_list = {}
for i, v in ipairs(list) do
-- 替换下划线为空格
new_list[i] = string.gsub(v, "_", " ")
end
return new_list
end
return list
end
-- 2. 生成反向对照表:name → 最小id
p.nameToMinId = {} -- 最终的反向映射表(键:名字,值:该名字对应的最小ID)
-- 遍历原始数据的所有卡牌
for _, card in pairs(card_data) do
local cardName = card.name
local cardId = tonumber(card.id)
if type(cardName) == "string" and cardName ~= "" then
-- 逻辑:如果名字还没记录,直接存ID;如果已记录,对比取更小的ID
if not p.nameToMinId[cardName] then
p.nameToMinId[cardName] = cardId -- 第一次遇到该名字,存当前ID
else
if cardId < p.nameToMinId[cardName] then
p.nameToMinId[cardName] = cardId -- 遇到更小的ID,更新
end
end
end
end
return p

沪公网安备 31011002002714 号