{# Skills Container Partial - For HTMX updates #} {# Calculate available skill points: level minus unlocked skills count #} {% set skill_points = character.available_skill_points|default(character.level - (character.unlocked_skills|default([])|length), true) %}
{# Back Link #} {# Header #}

{{ character.name }}'s Skill Trees

Skill Points: {{ skill_points }}
{% set respec_cost = character.level * 100 %}
{# Flash Messages #} {% if message %}
{{ message }}
{% endif %} {% if error %}
{{ error }}
{% endif %} {# Skill Trees Grid #} {% if player_class and player_class.skill_trees %}
{% for tree in player_class.skill_trees %}
{# Tree Header #}

{{ tree.name }}

{{ tree.description }}

{# Tree Diagram (Tiers 5 to 1, top to bottom) #}
{% for tier in range(5, 0, -1) %}
Tier {{ tier }}
{% for node in tree.nodes if node.tier == tier %} {# Determine node state #} {% set is_unlocked = node.skill_id in character.unlocked_skills %} {% set prereqs_met = not node.prerequisites or (node.prerequisites | select('in', character.unlocked_skills) | list | length == node.prerequisites | length) %} {% set has_lower_tier = tier == 1 or (tree.nodes | selectattr('tier', 'equalto', tier - 1) | selectattr('skill_id', 'in', character.unlocked_skills) | list | length > 0) %} {% set can_unlock = not is_unlocked and prereqs_met and has_lower_tier and skill_points > 0 %} {% set has_prereq = node.prerequisites | length > 0 %}
{% if is_unlocked %} ✓ {% elif can_unlock %} ◇ {% else %} ◆ {% endif %}
{{ node.name }} {% if can_unlock %} {% endif %}
{% endfor %}
{% endfor %}
{% endfor %}
{# Legend #}
Unlocked
Available
Locked
{% else %}
Unable to load skill trees for this class.
{% endif %} {# Tooltip Container #}