本WIKI编辑权限开放,欢迎大家共同建设
也可以 收藏本WIKI 防止迷路
编辑帮助:目录
目前Wiki编辑组急缺美术,希望有能力、有意向的老师可以参与一起建设本站
全站通知:
模块:数据库调用-执行卡
刷
历
编
跳到导航
跳到搜索
简介
本wiki中,大量通用格式的数据是通过Lua(模块)制作的[伪]数据库实现便捷更新管理。
其中涉及到的页面有
相关维护页面 | |||||||||
---|---|---|---|---|---|---|---|---|---|
数据收集表格 | 飞书文档-驱入虚空 bwiki 工作数据表 | ||||||||
Excel转Lua结构 | Widget:ExcelToLuaJson | ||||||||
具装 | 模板:具装 | 模块:数据库调用-具装 | 模块:数据库-具装 | ||||||
武器 | 模板:武器 | 模块:数据库调用-武器 | 模块:数据库-武器 | ||||||
道具 | 模板:道具 | 模块:数据库调用-道具 | 模块:数据库-道具 | ||||||
执行卡 | 模板:执行卡 | 模块:数据库调用-执行卡 | 模块:数据库-执行卡 | ||||||
稳态立方 | 模板:稳态立方索引 立方掉落 立方奖励 |
模块:数据库调用-稳态立方 | 模块:数据库-稳态立方 |
数据库更新方法
此处以具装数据库为例
- 当版本更新,或需要更新数据时,将数据更新在腾讯文档中
- 选择全部数据区块(首行为英文标签行,直到最后一条数据行),复制。
- 打开转换工具页,将复制的excel格式直接复制到上方的输入框中并点击转换.得到转换为Lua代码的数据结构
- 将转换后的lua信息复制,进入模块:数据库-具装:编辑模式,将复制过对应的数据拷贝到p.xxx中,注意保持大括号结构性完好
- 注:具装存在两个组,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 -- 返回包含函数和数据的导出表