{#
# Read-only character sheet. Table-shaped where the paper sheet itself is
# (ability scores, skills, attacks); the prose helpers (_line, _section, mod)
# are borrowed from the enemy stat block, another 5e sheet.
# {% import 'characters/_sheet.html.twig' as cs %}
# {{ cs.block(character) }}
#}
{% macro block(c) %}
{% import 'enemy/_statblock.html.twig' as sb %}
- Race
- {{ c.race ?: '—' }}
- Class & level
- {{ c.characterClass ? c.characterClass ~ ' ' ~ c.level : '—' }}
- Background
- {{ c.background ?: '—' }}
- Alignment
- {{ c.alignment ?: '—' }}
- Player
- {{ c.playerName ?: '—' }}
- Experience
- {{ c.experiencePoints is not null ? c.experiencePoints ~ ' XP' : '—' }}
- Armor Class
- {{ c.armorClass ?? '—' }}
- Initiative
- {{ c.initiative is not null ? sb.mod(c.initiative) : '—' }}
- Speed
- {{ c.speed ?: '—' }}
- Hit Points
-
{%- if c.currentHitPoints is not null or c.hitPointMaximum is not null -%}
{{ c.currentHitPoints ?? '?' }}{{ c.hitPointMaximum ? ' / ' ~ c.hitPointMaximum }}{{ c.temporaryHitPoints ? ' (+' ~ c.temporaryHitPoints ~ ' temp)' }}
{%- else -%}—{%- endif -%}
- Hit Dice
- {{ c.hitDice ?: '—' }}
- Proficiency Bonus
- {{ sb.mod(c.proficiencyBonus) }}
- Passive Perception
- {{ c.passivePerception }}
- Inspiration
- {{ c.inspiration ? 'Yes' : '—' }}
| Ability | Score | Mod | Save |
{% for ability in constant('App\\Entity\\Character::ABILITIES') %}
{% set score = c.abilityScore(ability) %}
| {{ ability }} |
{{ score }} |
{{ sb.mod(c.abilityModifier(score)) }} |
{{ sb.mod(c.saveModifier(ability)) }}{{ c.isProficientInSave(ability) ? ' ●' }} |
{% endfor %}
| Skill | Abl. | Mod |
{% for skill, ability in constant('App\\Entity\\Character::SKILLS') %}
{% set proficient = c.isProficientInSkill(skill) or c.hasExpertiseInSkill(skill) %}
| {{ skill }}{{ c.hasExpertiseInSkill(skill) ? ' ●●' : (proficient ? ' ●') }} |
{{ ability|slice(0, 3) }} |
{{ sb.mod(c.skillModifier(skill)) }} |
{% endfor %}
{% if c.attacks is not empty %}
Attacks & Spellcasting
| Name | Atk Bonus | Damage/Type | Range |
{% for atk in c.attacks %}
| {{ atk.name }} |
{{ atk.bonus }} |
{{ atk.damage }} |
{{ atk.range }} |
{% endfor %}
{% endif %}
{{ sb._section('Spellcasting', c.spellcasting) }}
{{ sb._section('Features & Traits', c.featuresTraits) }}
{{ sb._section('Other Proficiencies & Languages', c.otherProficienciesLanguages) }}
{{ sb._section('Equipment', c.equipment) }}
{% if c.personalityTraits or c.ideals or c.bonds or c.flaws %}
Personality
{{ sb._line('Traits', c.personalityTraits) }}
{{ sb._line('Ideals', c.ideals) }}
{{ sb._line('Bonds', c.bonds) }}
{{ sb._line('Flaws', c.flaws) }}
{% endif %}
{{ sb._section('Appearance', c.appearance) }}
{{ sb._section('Backstory', c.backstory) }}
{{ sb._section('Allies & Organizations', c.alliesOrganizations) }}
{{ sb._section('Treasure', c.treasure) }}
{% endmacro %}