Module:GameInfo/Skills: Difference between revisions
From SpiritVale Wiki
More actions
No edit summary Tags: Mobile edit Mobile web edit |
No edit summary Tags: Mobile edit Mobile web edit |
||
| Line 1: | Line 1: | ||
-- Module:GameInfo/Skills | -- Module:GameInfo/Skills | ||
-- Phase 4.1 — Native | -- Phase 4.1 — Native format rendering (format 1 + format 2, no adapter glue) | ||
-- | -- | ||
-- DEFINITIONS POLICY (strict): | -- DEFINITIONS POLICY (strict): | ||
| Line 13: | Line 13: | ||
-- - Meta row has its own icon slot, so meta labels always use noicon=1. | -- - Meta row has its own icon slot, so meta labels always use noicon=1. | ||
-- - Keyword pills also use noicon=1 (no extra icons in pills). | -- - Keyword pills also use noicon=1 (no extra icons in pills). | ||
-- - | -- - Native-format scaling stat pills render visible short labels/icons, | ||
-- and use a full-pill invisible Definitions hitbox only when active. | -- and use a full-pill invisible Definitions hitbox only when active. | ||
-- | -- | ||
| Line 21: | Line 21: | ||
-- | -- | ||
-- Requirements / Users (dynamic headers): | -- Requirements / Users (dynamic headers): | ||
-- - | -- - Native format accepts requirements/users as maps (title -> items[]). | ||
-- - Titles are treated as dynamic display text (no hardcoded header logic). | -- - Titles are treated as dynamic display text (no hardcoded header logic). | ||
-- - Optional __order = ["Title A","Title B", ...] may be provided to force section order. | -- - Optional __order = ["Title A","Title B", ...] may be provided to force section order. | ||
| Line 816: | Line 816: | ||
end | end | ||
local function | local function _build_meta_row_native(frame, skill_meta) | ||
skill_meta = _safe_tbl(skill_meta) | skill_meta = _safe_tbl(skill_meta) | ||
| Line 879: | Line 879: | ||
end | end | ||
local function | local function _normalize_level_native(level_obj) | ||
level_obj = _safe_tbl(level_obj) | level_obj = _safe_tbl(level_obj) | ||
| Line 1,095: | Line 1,095: | ||
end | end | ||
local function | local function _build_skill_scaling_native(frame, root_id, skill_scaling, default_level, max_level, min_level, overcap_obj) | ||
skill_scaling = _safe_tbl(skill_scaling) | skill_scaling = _safe_tbl(skill_scaling) | ||
| Line 1,111: | Line 1,111: | ||
local body = root:tag("div"):addClass("sv_skill_scaling__body") | local body = root:tag("div"):addClass("sv_skill_scaling__body") | ||
-- One-unit wrapper for damage + stat chips | |||
local cluster = body:tag("div"):addClass("sv_skill_scaling__cluster") | |||
local damage = _safe_tbl(skill_scaling.damage) | local damage = _safe_tbl(skill_scaling.damage) | ||
| Line 1,117: | Line 1,120: | ||
do | do | ||
local primary = | local primary = cluster:tag("div") | ||
:addClass("sv_skill_scaling__column") | :addClass("sv_skill_scaling__column") | ||
:addClass("sv_skill_scaling__column--primary") | :addClass("sv_skill_scaling__column--primary") | ||
| Line 1,131: | Line 1,134: | ||
do | do | ||
local stats_col = | local stats_col = cluster:tag("div") | ||
:addClass("sv_skill_scaling__column") | :addClass("sv_skill_scaling__column") | ||
:addClass("sv_skill_scaling__column--stats") | :addClass("sv_skill_scaling__column--stats") | ||
| Line 1,143: | Line 1,146: | ||
end | end | ||
end | end | ||
-- Reserved right-side column (empty for now) | |||
body:tag("div"):addClass("sv_skill_scaling__side") | |||
do | do | ||
| Line 1,371: | Line 1,377: | ||
end | end | ||
local function | local function _build_req_users_native(root_id, requirements_map, users_map) | ||
local req_groups = _map_to_groups(requirements_map, { "Skills", "Weapon Types", "Stances" }) | local req_groups = _map_to_groups(requirements_map, { "Skills", "Weapon Types", "Stances" }) | ||
local usr_groups = _map_to_groups(users_map, { "Classes", "Summons" }) | local usr_groups = _map_to_groups(users_map, { "Classes", "Summons" }) | ||
| Line 1,405: | Line 1,411: | ||
end | end | ||
local function | local function _render_legacy(frame, payload, notes_wt) | ||
local identity = _safe_tbl(payload.identity) | local identity = _safe_tbl(payload.identity) | ||
local display_name = _safe_str(identity.display_name, "Unknown Skill") | local display_name = _safe_str(identity.display_name, "Unknown Skill") | ||
| Line 1,446: | Line 1,452: | ||
end | end | ||
local function | local function _render_native(frame, payload, notes_wt) | ||
local identity = _safe_tbl(payload.identity) | local identity = _safe_tbl(payload.identity) | ||
local display_name = _safe_str(identity.display_name, "Unknown Skill") | local display_name = _safe_str(identity.display_name, "Unknown Skill") | ||
| Line 1,458: | Line 1,464: | ||
end | end | ||
local min_level, default_level, max_level = | local min_level, default_level, max_level = _normalize_level_native(payload.level) | ||
local box = GI.box({ | local box = GI.box({ | ||
| Line 1,481: | Line 1,487: | ||
box.top:node(_build_identity(frame, root_id, identity, notes_wt)) | box.top:node(_build_identity(frame, root_id, identity, notes_wt)) | ||
box.top:node( | box.top:node(_build_meta_row_native(frame, payload.skill_meta)) | ||
local reqrow = | local reqrow = _build_req_users_native(root_id, payload.requirements, payload.users) | ||
if reqrow then box.top:node(reqrow) end | if reqrow then box.top:node(reqrow) end | ||
local scaling_block, actual_default = | local scaling_block, actual_default = _build_skill_scaling_native( | ||
frame, | frame, | ||
root_id, | root_id, | ||
| Line 1,513: | Line 1,519: | ||
if payload.schema == 2 then | if payload.schema == 2 then | ||
return | return _render_native(frame, payload, notes_wt) | ||
end | end | ||
return | return _render_legacy(frame, payload, notes_wt) | ||
end | end | ||
return p | return p | ||