模块

模块:GemSMW

来自蒙纳多研究本部

头号云​(留言 | 贡献)2026年10月13日 (二) 21:20的版本 (创建页面,内容为“-- 模块:GemSMW —— 宝珠 SMW 注解层 -- 职责:把 xbdb 取到的宝珠数据写成 Semantic MediaWiki 行内注解(#set),供 #ask 查询。 -- 设计原则: -- 1. 注解值全部来自 GemData 取数,不手写; -- 2. 由列表/infobox 渲染时顺带调用(同一页面只注解一次,防重复 set); -- 3. 属性名带 Gem 前缀,避免与站内其他系统的同名属性冲突。 local p = {} local gemData = require("Mod…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

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

-- 模块:GemSMW —— 宝珠 SMW 注解层
-- 职责:把 xbdb 取到的宝珠数据写成 Semantic MediaWiki 行内注解(#set),供 #ask 查询。
-- 设计原则:
--   1. 注解值全部来自 GemData 取数,不手写;
--   2. 由列表/infobox 渲染时顺带调用(同一页面只注解一次,防重复 set);
--   3. 属性名带 Gem 前缀,避免与站内其他系统的同名属性冲突。

local p = {}

local gemData = require("Module:GemData")

-- ====== SMW 属性表(需在 wiki 上同步创建 Property: 页面) ======
-- Property:Gem效果值        Number   — X 级数值(列表主数值)
-- Property:Gem效果值I       Number   — I 级数值
-- Property:Gem熔炼费用      Number
-- Property:Gem归属          Text     — 共用 / 武器 / 防具
-- Property:Gem技能ID        Number   — BTL_skilllist row_id(主键锚点)
-- Property:Gem效果描述      Text     — 线上 rvs_caption($1 已填充 X 级值)

local ATTACH_LABEL = { [0] = "共用", [1] = "武器", [2] = "防具" }

local seen = {}  -- 每次页面解析内防止同一宝珠重复注解

function p.annotate(gemId, data)
  gemId = tonumber(gemId)
  if not gemId or seen[gemId] then return "" end
  seen[gemId] = true

  local v10 = gemData.valueAtRank(data, 10)
  local v1 = gemData.valueAtRank(data, 1)
  local attach = tonumber(data.attach)
  local caption = (data.rvs_caption or ""):gsub("%$1", tostring(v10))

  -- mw.smw 已由 SemanticScribunto 提供;若不可用(扩展关闭)静默跳过,页面照常渲染
  local smw = mw.smw
  if smw == nil then return "" end

  smw.set {
    ["Gem技能ID"] = gemId,
    ["Gem归属"] = ATTACH_LABEL[attach] or "未知",
    ["Gem效果值I"] = v1,
    ["Gem效果值"] = v10,
    ["Gem熔炼费用"] = tonumber(data.money or 0),
    ["Gem效果描述"] = caption,
  }
  return ""
end

-- 批量注解:给 list 渲染入口顺带调用
function p.annotateAll(gems)
  for _, gem in ipairs(gems) do
    p.annotate(gem.id, gem.data)
  end
  return ""
end

-- ====== 反向查询示例(不直接上页面,只做演示/测试) ======
-- 用法:{{#invoke:GemSMW|queryByAttach|共用}}
function p.queryByAttach(frame)
  local label = frame.args[1] or "共用"
  local smw = mw.smw
  if smw == nil then return "(SMW 不可用)" end

  local query = {
    "[[Gem归属:" .. label .. "]]",
    "?Gem效果值",
    "?Gem熔炼费用",
    sort = "Gem效果值",
    order = "desc",
  }
  local result = smw.ask(query)
  if not result or #result == 0 then return "无查询结果" end

  local out = { '| class="wikitable"', '! 宝珠 !! 效果值 !! 熔炼费用' }
  for _, row in ipairs(result) do
    out[#out + 1] = '|-'
    out[#out + 1] = '| ' .. tostring(row[1] or "?")
      .. ' || ' .. tostring(row[2] or "?")
      .. ' || ' .. tostring(row[3] or "?")
  end
  return table.concat(out, "\n")
end

return p