Player Name: Placeholder

Column

Place Name

INPUT[select(
option(1, ℹ️General),
option(2, 🧙Description),
option(3, ⚙️Configure),
option(4, 📝GM Notes),
class(tabbed)
)]

Tabbed

NOTE

INPUT[select(
option(1, 🤹Abilities+Skills),
option(2, 💪Traits),
option(3, 📖Spell Book),
option(4, ⚔️Inventory),
option(5, 🔗Connections),
option(6, 🧑‍🤝‍🧑Relationships),
class(tabbed)
)]

Tabbed


General

items:
  - label: Race
    value: '{{frontmatter.char_race}}'
  - label: Level
    value: '{{frontmatter.level}}'
  - label: Initiative
    value: '{{frontmatter.modifier}}'

items:
  - label: Spell Save
    value: 14
  - label: AC
    value: '{{frontmatter.ac}}'
  - label: AC (Mage Armor)
    value: 15

state_key: din_health
health: '{{ frontmatter.hp }}'
reset_on: long-rest
hitdice:
  dice: d6
  value: 4
items:
  - name: Short Rest
    value: short-rest
  - name: Long Rest
    value: long-rest

Description

This is the persons description.

Configure

StatValue
StatusINPUT[template-person-status][:char_status]
RaceINPUT[template-person-race][:char_race]
ClassINPUT[template-person-class][:char_class]
LevelINPUT[number:level]
GenderINPUT[template-person-gender][:char_gender]
AgeINPUT[template-person-age-range][:char_age]
HPINPUT[number:hp]
Max HPINPUT[number:max_hp]
ACINPUT[number:ac]
ModifierINPUT[number:modifier]

GM Notes

Make notes of what you need to track in the town here.

Skills

abilities:
  strength: 10
  dexterity: 10
  constitution: 10
  intelligence: 10
  wisdom: 10
  charisma: 10
 
proficiencies:
  - intelligence
  - wisdom

proficiencies:
  - arcana
  - deception
  - history
  - insight
  - investigation

Traits

Luck Points

label: ""
state_key: din_luck_points
uses: 3
reset_on: long-rest

You have inexplicable luck that seems to kick in at just the right moment.

You have 3 luck points. Whenever you make an attack roll, an ability check, or a saving throw, you can spend one luck point to roll an additional d20. You can choose to spend one of your luck points after you roll the die, but before the outcome is determined. You choose which of the d20s is used for the attack roll, ability check, or saving throw.

You can also spend one luck point when an attack roll is made against you. Roll a d20 and then choose whether the attack uses the attacker’s roll or yours.

If more than one creature spends a luck point to influence the outcome of a roll, the points cancel each other out; no additional dice are rolled.

You regain your expended luck points when you finish a long rest.

Arcane Recovery

label: ""
state_key: din_arcane_recovery
uses: 1
reset_on: long-rest

You have learned to regain some of your magical energy by studying your spell book. Once per day when you finish a short rest, you can choose expended spell slots to recover. The spell slots can have a combined level that is equal to or less than half your wizard level (rounded up), and none of the slots can be 6th level or higher.

For example, if you’re a 4th-level wizard, you can recover up to two levels worth of spell slots. You can recover either a 2nd-level spell slot or two 1st-level spell slots.

Researcher

When you attempt to learn or recall a piece of lore, if you do not know that information, you often know where and from whom you can obtain it.

Usually, this information comes from a library, scriptorium, university, or a sage or other learned person or creature.

Your DM might rule that the knowledge you seek is secreted away in an almost inaccessible place, or that it simply cannot be found. Unearthing the deepest secrets of the multiverse can require an adventure or even a whole campaign.

Spell Book

Spell Slots

items:
  - label: "Level 1"
    state_key: din_spells_1
    reset_on: long-rest
    uses: 4
  - label: "Level 2"
    state_key: din_spell_2
    reset_on: long-rest
    uses: 2
casting_time: 1 bonus action
range: Self
duration: Concentration, up to 1 minute

Fey Touched

items:
  - label: "Misty Step"
    state_key: din_fey_touched_misty_step
    uses: 1
  - label: "Silvery Barbs"
    state_key: din_fey_touched_silvery_barbs
    uses: 1

Known

List Spells Here

Inventory

The following items belong to = this.file.name.

Items: INPUT[inlineListSuggester(optionQuery(#Category/Quest)):char_items]

Ring of Investigation

label: ""
state_key: din_items__ring_of_investigation
uses: 3

May the ability to see also provide you with a clear vision” Grants +1 to Investigation Roles

Connections

Is the person linked to any groups or quests?

Quests: INPUT[inlineListSuggester(optionQuery(#Category/Quest)):Connected_Quests]

Groups: INPUT[inlineListSuggester(optionQuery(#Category/Group)):Connected_Groups]

Relationships

List important relationships here.

var parents = dv.current().parents ?? [];
var children = dv.current().children ?? [];
var enemies = dv.current().enemies ?? [];
var allies = dv.current().allies ?? [];
var siblings = dv.current().siblings ?? [];
var current = dv.current().file.name;
var partner = dv.current().partner ?? [];
 
dv.paragraph("```mermaid\nflowchart LR\n" +
  // Parents with internal-link on individual nodes only
  (parents.length > 0 ? parents.map((parent, index) => `P${index + 1}[${parent}]:::internal-link\nP${index + 1} --> Current\n`).join('') : '') +
  
  // Current node
  `Current[${current}]\n` +
  
  // Partner group node (no internal-link applied)
  (partner.length > 0 ? `PT[Partner]\nCurrent --> PT\n` : '') +
  
  // Individual partners with internal-link
  (partner.length > 0 ? partner.map((p, index) => `PT${index + 1}[${p}]:::internal-link\nPT --> PT${index + 1}\n`).join('') : '') +
 
  // Children group node (no internal-link applied)
  (children.length > 0 ? `C[Children]\nCurrent --> C\n${children.map((child, index) => `C${index + 1}[${child}]:::internal-link\nC --> C${index + 1}\n`).join('')}` : '') +
 
  // Siblings group node (no internal-link applied)
  (siblings.length > 0 ? `S[Siblings]\nCurrent --> S\n${siblings.map((sibling, index) => `S${index + 1}[${sibling}]:::internal-link\nS --> S${index + 1}\n`).join('')}` : '') +
 
  // Enemies group node (no internal-link applied)
  (enemies.length > 0 ? `E[Enemies]\nCurrent --> E\n${enemies.map((enemy, index) => `E${index + 1}[${enemy}]:::internal-link\nE --> E${index + 1}\n`).join('')}` : '') +
 
  // Allies group node (no internal-link applied)
  (allies.length > 0 ? `A[Allies]\nCurrent --> A\n${allies.map((ally, index) => `A${index + 1}[${ally}]:::internal-link\nA --> A${index + 1}\n`).join('')}` : '') +
 
  // Styling: Apply internal-link only to individual nodes, not group nodes
  `class ${parents.length > 0 ? parents.map((_, index) => `P${index + 1},`).join('') : ''}Current${children.length > 0 ? children.map((_, index) => `C${index + 1},`).join('') : ''}${siblings.length > 0 ? siblings.map((_, index) => `S${index + 1},`).join('') : ''}${enemies.length > 0 ? enemies.map((_, index) => `E${index + 1},`).join('') : ''}${allies.length > 0 ? allies.map((_, index) => `A${index + 1},`).join('') : ''} internal-link;`
)
const player = dv.current();
const factions = dv.pages('"3-Mechanics/Guilds and Groups"');
let tableData = [];
for (let faction of factions) {
    let factionName = faction.faction;
    let playerStanding = player.faction_standing?.[factionName] || 0;
 
    // Ensure benefits is treated as an array
    let benefitsList = Array.isArray(faction.benefits) ? faction.benefits : [];
 
    // Filter benefits the player qualifies for
    let qualifiedBenefits = benefitsList
        .filter(b => playerStanding >= b.standing)
        .map(b => b.reward)
        .join(", "); 
 
    let primaryContact = faction.primary_contact || "No contact set";
 
    tableData.push([factionName, playerStanding, qualifiedBenefits || "No benefits yet", primaryContact]);
}
dv.table(["Faction", "Your Standing", "Benefits", "Primary Contact"], tableData);