模块

模块:CharStat

来自蒙纳多研究本部

此模块的文档可以在模块:CharStat/doc创建

-- 模块:CharStat — XC1 DE 人物固有属性(实时 XBDB,两点式展示,不插值)
-- 数据链:bdat_common.BTL_pclist(人物),每行仅 1 次调用
-- 展示口径:基准等级进标题;只列人物固有数值(HP/力量/以太力/敏捷)。
--   装备派生项(自动攻击伤害/物理防御/以太防御/暴击率/格挡率/重量)不展示——随换装变化,非固有数值
-- SMW:渲染时顺带 mw.smw.subobject 建档(9 项 Char* 数值属性),与宝珠/宝箱同款「渲染即建档」
-- row_id 白名单必须在 post 调用之前校验(XBDB 异常抛在 PHP 层,pcall 拦不住)
-- 约定:只用 -- 行注释;表构造器不用裸中文键;不截断字符串
local p = {}
local post = require("Module:RequestHelper").post
local getArgs = require("Module:Arguments").getArgs
local html = require("Module:Html")

local MAX_ROW = 27

-- ====== SMW 注解(人物侧 9 项固有数值,属性页必须先于本模块建档,见《上线流程》) ======
-- 属性:CharLv   Number — 基准等级(BTL_pclist.lv,两点式起点)
-- 属性:CharHp / CharHp99     Number — 基准等级 HP / 99 级 HP
-- 属性:CharStr / CharStr99   Number — 力量两点值
-- 属性:CharEth / CharEth99   Number — 以太力两点值
-- 属性:CharAgi / CharAgi99   Number — 敏捷两点值
-- 只写 bdat 直读的固有数值;装备派生值不入 SMW
local function annotate(d)
  local smw = mw.smw
  if smw == nil then return end  -- SemanticScribunto 不可用时静默跳过,页面照常渲染
  smw.subobject({
    CharLv = tonumber(d.lv),
    CharHp = tonumber(d.hp),
    CharHp99 = tonumber(d.hp_lv99),
    CharStr = tonumber(d.str),
    CharStr99 = tonumber(d.str_lv99),
    CharEth = tonumber(d.eth),
    CharEth99 = tonumber(d.eth_lv99),
    CharAgi = tonumber(d.agi),
    CharAgi99 = tonumber(d.agi_lv99)
  })
end

local function render(d)
  local lv = tonumber(d.lv) or "-"
  local name = d.name or ("row " .. tostring(d.row_id))
  local head = name .. (tonumber(d.guest) == 1 and "(客串)" or "") .. " Lv." .. lv
  local schema = {"属性", "基准", "99 级"}
  local rows = {
    {"HP", tonumber(d.hp), tonumber(d.hp_lv99)},
    {"力量", tonumber(d.str), tonumber(d.str_lv99)},
    {"以太力", tonumber(d.eth), tonumber(d.eth_lv99)},
    {"敏捷", tonumber(d.agi), tonumber(d.agi_lv99)}
  }
  return html.h3(head) .. html.wikitable(schema, rows, {class = "xbtable"})
end

function p.main(frame)
  local args = getArgs(frame)
  local rowId = tonumber(args[1])
  -- 白名单前置校验:1~27 的整数,否则不触发任何 post
  if rowId == nil or rowId % 1 ~= 0 or rowId < 1 or rowId > MAX_ROW then
    return "CharStat:row_id 必须是 1~" .. MAX_ROW .. " 的整数"
  end
  local d = post("bdat_common.BTL_pclist", rowId)
  if type(d) ~= "table" or d.row_id == nil then
    return "CharStat:未取得 row " .. rowId .. " 的数据"
  end
  annotate(d)  -- 渲染即建档:数据归到当前页面,本片段只能贴在该角色自己的页面上
  return render(d)
end

return p