dune-tools/character-builder/data/index.json
Vantz Stockwell f142725dd8 Skill tree: subtrees, loadout slots, label fix
Skill trees now render the way the source does: each class has three named
subtrees (e.g. Swordmaster: The Blade / The Will / The Way), each with its
own 3-col or 5-col grid, sized in 72px cells. Extractor parses subtrees
separately so the per-tree row/col coordinates are correct (previously all
22 nodes were stacked on one combined grid and overlapped). Connector
edges are mapped per-subtree too.

Loadout: new global 3-ability + 3-technique slot row at the bottom of the
Skill Trees panel. The cap is global across all 5 classes (matches the
source HTML which has `id=active-Ability-N` / `id=active-Technique-N`
without per-tree scope). Click a slot to pick from any allocated Ability
or Spice (for Ability slots) or any allocated Perk (for Technique slots);
right-click clears. Slot backgrounds use the local ability.png /
technique.png artwork copied into /icons.

Label overlap fix: constrained the name label under each node to the node
width (72px) and bumped the vertical gap from 44 to 60px so 2-3 line names
have room without bleeding into the row below.

Existing saved builds migrate cleanly — loadout normalizes to length-3
slot arrays if absent or malformed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 08:21:09 -04:00

82 lines
No EOL
1.6 KiB
JSON

{
"xp": {
"character": "character-xp.json",
"combat": "spec-combat.json",
"crafting": "spec-crafting.json",
"exploration": "spec-exploration.json",
"gathering": "spec-gathering.json",
"sabotage": "spec-sabotage.json"
},
"factions": {
"atreides": "faction-atreides.json",
"harkonnen": "faction-harkonnen.json"
},
"skills": [
{
"id": "benegesserit",
"name": "Bene Gesserit",
"file": "skills-benegesserit.json",
"subtrees": [
"Weirding Way",
"The Voice",
"Body Control"
],
"nodes": 22,
"edges": 29
},
{
"id": "mentat",
"name": "Mentat",
"file": "skills-mentat.json",
"subtrees": [
"Mental Calculus",
"Assassination",
"Tactician"
],
"nodes": 22,
"edges": 28
},
{
"id": "planetologist",
"name": "Planetologist",
"file": "skills-planetologist.json",
"subtrees": [
"Scientist",
"Explorer",
"Mechanic"
],
"nodes": 20,
"edges": 26
},
{
"id": "swordmaster",
"name": "Swordmaster",
"file": "skills-swordmaster.json",
"subtrees": [
"The Blade",
"The Will",
"The Way"
],
"nodes": 22,
"edges": 28
},
{
"id": "trooper",
"name": "Trooper",
"file": "skills-trooper.json",
"subtrees": [
"Gunnery",
"Suspensor Training",
"Tactical Tech"
],
"nodes": 22,
"edges": 28
}
],
"icons": {
"directory": "frontend/public/icons",
"served_at": "/icons/",
"count": 154,
"missing": []
}
}