欢迎查看本站wiki待办,一起参与施工!如有建议或想法,也欢迎加入wiki学会洽谈区QQ群:471292177~目前急缺人手,详情请查看:学会会员招募中
由于近期有用户滥用本wiki内容,再次声明请遵循WIKI社区规则。如有违反会被封禁ip以及用户,被封禁用户会进行公开,请查看封禁公示
欢迎查看本站wiki待办,一起参与施工!如有建议或想法,也欢迎加入wiki学会洽谈区QQ群:471292177~目前急缺人手,详情请查看:学会会员招募中
由于近期有用户滥用本wiki内容,再次声明请遵循WIKI社区规则。如有违反会被封禁ip以及用户,被封禁用户会进行公开,请查看封禁公示
全站通知:

模块:数据库

来自苏丹的游戏WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
{{#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