模块

模块:ArtsData/source

来自蒙纳多研究本部

头号云​(留言 | 贡献)2026年10月13日 (二) 01:39的版本

此模块的文档可以在模块: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 普查分组:XC1 连锁攻击分支类别)
-- 0=无连锁(蒙纳多/连斩/超频等天赋系)1=物理单体 2=减益附加 3=侧面/移动系
-- 4=倒地/击倒系 5=吹飞/击退系 6=自身辅助·治疗系 7=仇恨/防御操作系 8=增益附加系
local CHAIN_TYPE = {
  [0] = "无",
  [1] = "物理单体",
  [2] = "减益附加",
  [3] = "侧面",
  [4] = "倒地",
  [5] = "吹飞",
  [6] = "辅助",
  [7] = "仇恨操作",
  [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