全站通知:
模块:数据库
刷
历
编
跳到导航
跳到搜索
{{#invoke:数据库|卡面图片|id=|name=|pic=}}
使用id传入最准确
name的作用是辅助找到id,在name相同的卡中会返回最小的id,然后用这个id找卡面
pic可以指定这张卡的哪一张立绘(不传入时即为初始立绘,传入时要求pic>=1)
local p = {}
local image_data = mw.loadData('模块:卡面数据库内容')
local image_handle = mw.loadData('模块:卡牌资源内容/data')
local card_data = mw.loadData('模块:卡牌数据库内容/data').cards_set
local sound_module = mw.loadData('模块:音频数据库内容/data')
local sound_data = sound_module.sound_set or {}
local RARE_NUM_TO_TEXT = {
[1] = "石",
[2] = "铜",
[3] = "银",
[4] = "金"
}
local function convertRare(rareValue)
-- 若已是字符串(如"金"),直接返回(兼容外部传入/数据库文字存储)
if type(rareValue) == "string" then
-- 可选:统一文字格式(去除空格/小写转大写,按需开启)
-- rareValue = string.gsub(rareValue, "%s+", "") -- 去除空格
return rareValue ~= "" and rareValue or "铜" -- 空字符串兜底铜级
end
-- 若为数字,转为对应文字(无匹配数字兜底铜级)
if type(rareValue) == "number" then
return RARE_NUM_TO_TEXT[rareValue] or "铜"
end
-- 其他类型(nil/boolean等),兜底铜级
return "铜"
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.id2img[id] and image_handle.id2img[id][1] and image_handle.img2id[image_handle.id2img[id][1]]
local pic = args.pic or "" -- 支持字符串数字(如"1")或纯数字(如2)
mw.logObject(frame)
mw.log(id, name, resource_id)
-- 先确保 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
-- 2. 生成反向对照表:name → 最小id
p.nameToMinId = {["主角"]=2000001, ["希尔希纳"]=2000013, ["拉伊德娜"]=2000195, ["镜中的生灵"]=2001182} -- 最终的反向映射表(键:名字,值:该名字对应的最小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
p.getName = function(id)
return card_data[id].name
end
p.getType = function(id)
return card_data[id].type
end
p.getTags = function(id)
return card_data[id].tag
end
-- 修改:getRareText 函数添加 rare 转化(外部调用时返回文字格式)
p.getRareText = function(id)
local card = card_data[id]
return card and convertRare(card.rare) or "铜" -- 转化+兜底
end
p.name2id = function(name)
mw.logObject(p.nameToMinId)
return p.nameToMinId[name]
end
p.getCard = function(id)
return card_data[id]
end
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
-- 功能:根据卡牌 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
return p

沪公网安备 31011002002714 号