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>
82 lines
No EOL
1.6 KiB
JSON
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": []
|
|
}
|
|
} |