模块:ArtsData/source
来自蒙纳多研究本部
此模块的文档可以在模块:ArtsData/source/doc创建
--[[
Module:ArtsData/source —— 唯一 XBDB 访问层(决策11)
-- 更新(2026-10-12):XB1DEData 新扩展已迁移 pc_arts(47 字段,含 elem/tgt/range/hate/icon 等),
-- grow_arts_* 与 ms 文本表仍未注册,desc/AP 仍走静态表,fetchDesc/fetchApTable 保持预留。
-- row_id 越界/多 ID 会整页 500 且 pcall 无效,白名单校验必须前置。
]]
local p = {}
local post = require("Module:RequestHelper").post
local lv1 = require("Module:ArtsData/lv1")
local function num0(v)
if v == nil then return 0 end
return tonumber(v) or 0
end
local VALID_IDS = {}
for _, role in pairs(lv1.roles) do
for _, id in ipairs(role.ids) do
VALID_IDS[id] = true
end
end
local cache = {}
function p.fetchArt(artId)
artId = tonumber(artId)
if not artId or not VALID_IDS[artId] then
return nil
end
local cached = cache[artId]
if cached ~= nil then
return cached
end
local ok, data = pcall(post, "bdat_common.pc_arts", artId)
if not ok or type(data) ~= "table" or not data.row_id then
cache[artId] = false
return nil
end
cache[artId] = data
return data
end
function p.fetchDesc(artId)
-- 预留:ms 文本表注册后实现(pc_arts_ms / ITM_artslist_ms)
return nil
end
function p.fetchApTable()
-- 预留:grow_arts_base/grow_arts_rate 注册后实现(AP 全实时化)
return nil
end
-- 新扩展字段映射(普查自 143 行 pc_arts,2026-10-12)
-- 元素属性(梅莉亚 12 锚点自洽验证:97雷=6 98炎=4 99冰=7 100风=8 101地=9 102水=5,
-- 召X术 103-105/111-113 完全一致;1=物理(折返强袭)、2=无属性普攻系(撕裂/爆发)、
-- 0=无(天赋/状态技)、5 水同时出现在治疗技(轻量治疗/治疗弹——治疗属水系)
-- ⚠ elem 对状态技(atk_type=3)不是攻击元素,而是状态的表现分类
-- (elem=4 集中在嘲讽/绑定/锁定等仇恨系状态 + 烧灼系),对玩家无意义 → 状态技不显示
local ELEM_TYPE = {
[0] = "无",
[1] = "物理",
[2] = "无",
[4] = "炎",
[5] = "水",
[6] = "雷",
[7] = "冰",
[8] = "风",
[9] = "地",
}
function p.elemName(data)
-- 状态技(atk_type=3)的 elem 是状态分类不是攻击属性,不显示
if num0(data.atk_type) == 3 then return nil end
return ELEM_TYPE[num0(data.elem)] or "未知"
end
-- 目标类型(tgt 值域普查:1=敌人 88、2=自身 43、3=同伴 10、11=原地 2)
local TGT_TYPE = {
[1] = "敌方单体",
[2] = "自身",
[3] = "同伴单体",
[11] = "自身(原地)",
}
function p.tgtName(data)
return TGT_TYPE[num0(data.tgt)] or nil
end
-- 范围类型(range_type 普查:0=单体 103、4=扇形 16、1=直线 8、5/6/7=圆形 5+5+5、2=周边 1)
local RANGE_TYPE = {
[0] = nil, -- 单体(不显示)
[1] = "直线",
[2] = "周边",
[4] = "扇形",
[5] = "圆形",
[6] = "圆形",
[7] = "圆形",
}
function p.rangeName(data)
local rt = num0(data.range_type)
return RANGE_TYPE[rt]
end
-- 连锁类型(chain_type:游戏原生字段,值域 0-8,中文标签为推断未定论 → 暂显示数字)
-- 普查分组行为参考——0=天赋/无倍率 1=纯单体物攻 2=攻击附异常 3=侧面系
-- 4=倒地系 5=吹飞系 6=辅助(无倍率) 7=仇恨操作系 8=有倍率的特效技
-- (8 组成员含 折返强袭/护盾/神速 等攻击+附加效果技,原拟"增益附加"误导,待实测定名)
local CHAIN_TYPE = {
[0] = "0",
[1] = "1",
[2] = "2",
[3] = "3",
[4] = "4",
[5] = "5",
[6] = "6",
[7] = "7",
[8] = "8",
}
function p.chainName(data)
return CHAIN_TYPE[num0(data.chain_type)] or "?"
end
-- 仇恨值:0 不显示;非 0 返回数值(普查分布 5~50,65 个为 0)
function p.hateText(data)
local h = num0(data.hate)
if h == 0 then return nil end
return "+" .. h
end
function p.num0(v)
return num0(v)
end
function p.isValidArtId(artId)
artId = tonumber(artId)
return artId ~= nil and VALID_IDS[artId] == true
end
-- ==================== 商店战技书(已拆分至独立模块 Module:ArtsShop) ====================
-- 商店查询/渲染由 Module:ArtsShop 独立维护(index/npc 子模块同名拆分)
-- 本模块保持战技主链路:pc_arts 白名单查询 + 预留接口
return p