本WIKI编辑权限开放,欢迎大家共同建设
也可以 收藏本WIKI 防止迷路
编辑帮助:目录
目前Wiki编辑组急缺美术,希望有能力、有意向的老师可以参与一起建设本站

全站通知:

模块:数据库调用-执行卡

来自驱入虚空WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

简介

本wiki中,大量通用格式的数据是通过Lua(模块)制作的[伪]数据库实现便捷更新管理。
其中涉及到的页面有

相关维护页面
数据收集表格 飞书文档-驱入虚空 bwiki 工作数据表
Excel转Lua结构 Widget:ExcelToLuaJson
具装 模板:具装 模块:数据库调用-具装 模块:数据库-具装
武器 模板:武器 模块:数据库调用-武器 模块:数据库-武器
道具 模板:道具 模块:数据库调用-道具 模块:数据库-道具
执行卡 模板:执行卡 模块:数据库调用-执行卡 模块:数据库-执行卡
稳态立方 模板:稳态立方索引
立方掉落
立方奖励
模块:数据库调用-稳态立方 模块:数据库-稳态立方

模板:制作表格

数据库更新方法

此处以具装数据库为例

2.表格选择区域示例
3.转换工具使用示例
4.数据库更新内容示例
  1. 当版本更新,或需要更新数据时,将数据更新在腾讯文档中
  2. 选择全部数据区块(首行为英文标签行,直到最后一条数据行),复制。
  3. 打开转换工具页,将复制的excel格式直接复制到上方的输入框中并点击转换.得到转换为Lua代码的数据结构
  4. 将转换后的lua信息复制,进入模块:数据库-具装:编辑模式,将复制过对应的数据拷贝到p.xxx中,注意保持大括号结构性完好
    1. 注:具装存在两个组,role记录基础信息,和skill记录技能信息

local p = {}
-- 加载指定页面
local getJsonPage_mod = require('模块:数据库-执行卡')

-- 清理特殊词语的函数
local function cleanSpecialWords(str)
    local replacements = {["私法"] = "", ["劣质"] = "", ["粗制"] = ""}

    for word, replacement in pairs(replacements) do
        str = string.gsub(str, word, replacement)
    end
    -- 清理可能产生的多余连字符,包括空格和下划线
    str = string.gsub(str, "[%s%-_]+", "-")
    -- 清理开头和结尾的连字符
    str = string.gsub(str, "^%-", "")
    str = string.gsub(str, "%-$", "")
    return str
end

-- 具装相关参数获取获取
-- 角色获取
function p.mod(frame)
    -- 获取输入mod名
    local inputName = frame.args["name"]
    -- 替换连字符为空格
    local showName = string.gsub(inputName or "", "-", " ")
    -- 替换空格为下划线
    local findName = string.gsub(showName or "", " ", "_")

    local mType = frame.args["type"]

    local loadJson = nil
    local msg = inputName
    if mType == "具装" then
        loadJson = getJsonPage_mod.role -- 修改这里,直接访问role属性
    elseif mType == "武器" then
        loadJson = getJsonPage_mod.weapon -- 修改这里,直接访问role属性
    elseif mType == "其他" then
        loadJson = getJsonPage_mod.other -- 修改这里,直接访问role属性
    else
        return msg .. "参数错误"
    end

    for i, data in ipairs(loadJson) do
        if findName == data.name then -- 数据已确认,开始填充	   
            ModInfo_Base(frame, data)
            frame:callParserFunction{
                name = '#vardefine',
                args = {'名称', showName}
            }
            -- mod名
            frame:callParserFunction{
                name = '#vardefine',
                args = {'执行卡', inputName}
            }
            local showName = data.name
            -- 若有图标代理,使用图标代理
            if data.icon_agent and data.icon_agent ~= "" then
                showName = data.icon_agent
            else
                -- 清理特殊词语
                showName = cleanSpecialWords(showName)
            end

            frame:callParserFunction{
                name = '#vardefine',
                args = {'图标代理', showName}
            }
            break
        end
    end
end

-- 基础参数
function ModInfo_Base(frame, data)

    frame:callParserFunction{
        name = '#vardefine',
        args = {'稀有度', data.rarity}
    }
    frame:callParserFunction{
        name = '#vardefine',
        args = {'极性', data.polarity}
    }
    frame:callParserFunction{name = '#vardefine', args = {'分类', data.type}}
    frame:callParserFunction{
        name = '#vardefine',
        args = {'子分类', data.type_sub}
    }
    frame:callParserFunction{
        name = '#vardefine',
        args = {'特殊分类', data.type_sp}
    }
    frame:callParserFunction{
        name = '#vardefine',
        args = {'最高等级', data.max_lv}
    }
    frame:callParserFunction{
        name = '#vardefine',
        args = {'电量耗费', data.cost_1}
    }

    local info = data.info

    -- 替换 FxxxF 格式的内容
    info = string.gsub(data.info, "%*F([^F]+)F%*", "%1")
    info = string.gsub(info, "%(%(%((.-)%)%)%)", "%1")

    frame:callParserFunction{
        name = '#vardefine',
        args = {'介绍-文本', info}
    }

    -- 替换 FxxxF 格式的内容
    info = string.gsub(data.info, "%*F([^F]+)F%*",
                       "<font class=\"mod-font-light\">%1</font>")
    info = string.gsub(info, "%(%(%((.-)%)%)%)",
                       "<font data-id=\"%1\">[data]</font>")

    frame:callParserFunction{
        name = '#vardefine',
        args = {'介绍-格式', info}
    }

    if data.val1 ~= nil then
        local val1_parts = {}
        for part in string.gmatch(data.val1, "([^_]+)") do
            table.insert(val1_parts, part)
        end
        if #val1_parts >= 2 then
            frame:callParserFunction{
                name = '#vardefine',
                args = {'数值1类型', val1_parts[1]}
            }
            frame:callParserFunction{
                name = '#vardefine',
                args = {'数值1', val1_parts[2]}
            }
        end
    end

    if data.val2 ~= nil then
        local val2_parts = {}
        for part in string.gmatch(data.val2, "([^_]+)") do
            table.insert(val2_parts, part)
        end
        if #val2_parts >= 2 then
            frame:callParserFunction{
                name = '#vardefine',
                args = {'数值2类型', val2_parts[1]}
            }
            frame:callParserFunction{
                name = '#vardefine',
                args = {'数值2', val2_parts[2]}
            }
        end
    end

    if data.val3 ~= nil then
        local val3_parts = {}
        for part in string.gmatch(data.val3, "([^_]+)") do
            table.insert(val3_parts, part)
        end
        if #val3_parts >= 2 then
            frame:callParserFunction{
                name = '#vardefine',
                args = {'数值3类型', val3_parts[1]}
            }
            frame:callParserFunction{
                name = '#vardefine',
                args = {'数值3', val3_parts[2]}
            }
        end
    end

    if data.val4 ~= nil then
        local val4_parts = {}
        for part in string.gmatch(data.val4, "([^_]+)") do
            table.insert(val4_parts, part)
        end
        if #val4_parts >= 2 then
            frame:callParserFunction{
                name = '#vardefine',
                args = {'数值4类型', val4_parts[1]}
            }
            frame:callParserFunction{
                name = '#vardefine',
                args = {'数值4', val4_parts[2]}
            }
        end
    end
end

-- 使用p.contents遍历ModInfo_Base
function p.contents(frame)
    -- 获取输入mod名
    local input = frame.args["name"]

    -- 将输入的名称中的空格替换为连字符和下划线
    local repair = string.gsub(input or "", " ", "-")
    local repair2 = string.gsub(input or "", " ", "_")

    -- 获取mod类型
    local mType = frame.args["type"]

    local loadJson = getJsonPage_mod.role -- 修改这里,直接访问role属性

    -- 遍历loadJson中的数据
    for i, data in ipairs(loadJson) do
        if repair2 == data.name then -- 数据已确认,开始填充	   
            -- 调用ModInfo_Base函数,传入frame和data
            ModInfo_Base(frame, data)
            -- mod名
            frame:callParserFunction{
                name = '#vardefine',
                args = {'执行卡', input}
            }
            frame:callParserFunction{
                name = '#vardefine',
                args = {'执行卡-修正', repair}
            }
            if data.icon_agent and data.icon_agent ~= "" then
                -- 将每个字段定义为变量
                repair = data.icon_agent
            else
                -- 清理特殊词语
                repair = cleanSpecialWords(repair)
            end

            frame:callParserFunction{
                name = '#vardefine',
                args = {'图标代理', repair}
            }
            break
        end
    end
end

-- 参考核桃表,将所有mod遍历调用模板
function p.mod_list(frame)
    -- 预生成最后输出的页面内容,目的是保证其不为空
    local output = ""

    -- 循环三个列表中的数据
    for i, data in ipairs(getJsonPage_mod.role) do
        output = output .. modList_singleSet(frame, data)
    end

    for i, data in ipairs(getJsonPage_mod.weapon) do
        output = output .. modList_singleSet(frame, data)
    end

    for i, data in ipairs(getJsonPage_mod.other) do
        output = output .. modList_singleSet(frame, data)
    end

    -- 遍历所有循环,最终输出到页面中
    return output
end

function modList_singleSet(frame, data)
    -- 定义一个空表,用于存储获取后的数据
    local formattedData = {}
    -- 模板中的参数1({{{执行卡名称}}}) 通过数据库的name来设置 意为卡名称
    formattedData["执行卡名称"] = data.name

    -- 设置参数
    local iconName
    -- 当icon_agent不为空时 设置为图片代理
    if data.icon_agent ~= nil then
        iconName = data.icon_agent
        -- 否则使用修改过的原始名称
    else
        iconName = (data.name or ""):gsub("[%s_]", "-")
    end
    -- 根据状态设置图标名称
    formattedData["执行卡图标名称"] = iconName

    -- 模板中的参数2({{{执行卡稀有度}}}) 通过数据库的rarity来设置 意为卡稀有度
    formattedData["执行卡稀有度"] = data.rarity
    -- 模板中的参数3({{{执行卡极性}}}) 通过数据库的polarity来设置 意为卡极性
    formattedData["执行卡极性"] = data.polarity
    -- 模板中的参数4({{{执行卡类型}}}) 通过数据库的type来设置 意为卡类型
    formattedData["执行卡类型"] = data.type
    -- 模板中的参数5({{{执行卡子类型}}}) 通过数据库的type_sub来设置 意为卡子类型
    formattedData["执行卡子类型"] = data.type_sub
    -- 模板中的参数6({{{执行卡特殊类型}}}) 通过数据库的type_sp来设置 意为卡特殊类型
    formattedData["执行卡特殊类型"] = data.type_sp
    -- 模板中的参数7({{{执行卡最高等级}}}) 通过数据库的max_lv来设置 意为卡最高等级
    formattedData["执行卡最高等级"] = data.max_lv
    -- 模板中的参数8({{{执行卡初始消耗}}}) 通过数据库的cost_1来设置 意为卡初始消耗
    formattedData["执行卡初始消耗"] = data.cost_1
    -- 模板中的参数9({{{执行卡满级消耗}}}) 通过数据库的cost_m来设置 意为卡满级消耗
    formattedData["执行卡满级消耗"] = data.cost_m

    -- 新建一个参数 通过模板设置 (Template) 标题title 为模板名 args为上文设置的键值对
    local outputMsg = frame:expandTemplate{
        title = '执行卡索引',
        args = formattedData
    }
    return outputMsg
end

return p -- 返回包含函数和数据的导出表