187 lines
4.9 KiB
Markdown
187 lines
4.9 KiB
Markdown
---
|
||
Level_of_Influence: 2
|
||
Faction: "[[House Tenrae]]"
|
||
SMH_Acronym:
|
||
Tags:
|
||
- npc
|
||
Knows About HQ: "False"
|
||
---
|
||
|
||
# Eosaf Tenrae
|
||
*Admiral of the Navy, Head of House Tenrae*
|
||
|
||
## 🎨 Artwork
|
||
![[Eosaph Tenrae.png]]
|
||
*Optional caption / alt text*
|
||
|
||
---
|
||
|
||
## 🧑 NPC Overview
|
||
- **Full Name:** Eosaph Tenrae
|
||
- **Race / Ancestry:** Elf
|
||
- **Gender / Pronouns:** Male, He/Him
|
||
- **Occupation / Role:** Admiral of the Navy
|
||
- **Faction / Allegiance:** [[House Tenrae]]
|
||
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||
- **Notable Traits:** (quirks, mannerisms, appearance)
|
||
- **First Impression:** (how the party perceives them)
|
||
|
||
---
|
||
|
||
## 🤝 Relationship with Party
|
||
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||
- **Notes on Influence:** (what actions improve/worsen standing)
|
||
- ***Discovery Skills***
|
||
- DC 15 Sailing Lore
|
||
- DC 18 Society
|
||
- DC 18 Y'athyr Lore
|
||
- DC 20 Perception
|
||
- ***Influence Skills***
|
||
- DC 18 Valentia Lore
|
||
- DC 18 Arcana
|
||
- DC 18 Athletics
|
||
- DC 20 Society
|
||
- DC 22 Diplomacy
|
||
- DC 22 Performance
|
||
- ***Weaknesses***
|
||
- Expressing an interest and discussing the city's reconstruction efforts, as well as Valentia reduces the influence DC by 4.
|
||
- ***Resistances***
|
||
- ***Biases***
|
||
|
||
---
|
||
|
||
## 🧠 Intel (auto)
|
||
```dataviewjs
|
||
const THIS = dv.current();
|
||
const thisName = String(THIS.file.name);
|
||
const thisLC = thisName.toLowerCase();
|
||
|
||
// Scan faction & NPC notes that have Intel arrays
|
||
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||
|
||
// Does an Intel entry reference THIS NPC?
|
||
function mentionsThisNPC(entry) {
|
||
const sum = String(entry.summary ?? "");
|
||
|
||
// 1) Explicit wikilink in summary
|
||
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||
|
||
// 2) Source field (string/link/list)
|
||
const src = entry.source;
|
||
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||
for (const s of arr) {
|
||
if (typeof s === "string") {
|
||
// quoted link or plain text
|
||
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||
// if they typed just the name
|
||
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||
} else if (s && typeof s === "object" && s.path) {
|
||
// wikilink object
|
||
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||
if (base === thisLC) return true;
|
||
}
|
||
}
|
||
|
||
// Optional (looser): plain text mention in summary
|
||
// return sum.toLowerCase().includes(thisLC);
|
||
|
||
return false;
|
||
}
|
||
|
||
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||
const rows = [];
|
||
|
||
// Own Intel (from this NPC note)
|
||
for (const it of (THIS.Intel ?? [])) {
|
||
rows.push({
|
||
from: THIS.file.link,
|
||
date: it.date ?? "",
|
||
type: it.type ?? "",
|
||
summary: String(it.summary ?? ""),
|
||
session: it.session ?? "",
|
||
source: it.source ?? "",
|
||
rel: it.reliability ?? "",
|
||
cred: it.credibility ?? "",
|
||
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||
});
|
||
}
|
||
|
||
// Mentions elsewhere
|
||
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||
for (const it of (p.Intel ?? [])) {
|
||
if (mentionsThisNPC(it)) {
|
||
rows.push({
|
||
from: p.file.link,
|
||
date: it.date ?? "",
|
||
type: it.type ?? "",
|
||
summary: String(it.summary ?? ""),
|
||
session: it.session ?? "",
|
||
source: it.source ?? "",
|
||
rel: it.reliability ?? "",
|
||
cred: it.credibility ?? "",
|
||
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
// Sort newest first
|
||
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||
|
||
if (!rows.length) {
|
||
dv.paragraph("_No intel yet._");
|
||
} else {
|
||
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||
dv.table(
|
||
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||
);
|
||
}
|
||
```
|
||
|
||
```button
|
||
name ➕ Add Intel
|
||
type command
|
||
action Templater: Insert Add Intel Entry to NPC
|
||
```
|
||
|
||
---
|
||
|
||
## 🏛️ Relations & Factions
|
||
- **Primary Faction:** [[House Tenrae]]
|
||
- **Allied Factions:** [[Faction A]], [[Faction B]]
|
||
- **Rival Factions:** [[Faction C]]
|
||
- **Personal Enemies / Allies:** [[NPC or PC]]
|
||
|
||
---
|
||
|
||
## 📖 History & Background
|
||
- **Origin / Past:**
|
||
- **Known Motivations:**
|
||
- **Secrets / Rumors:**
|
||
|
||
---
|
||
|
||
## 🎭 Roleplay Notes
|
||
- **Personality:** (e.g., stern, practical, loyal)
|
||
- **Speech Style / Quirks:** (catchphrases, accent, tics)
|
||
- **Appearance Details:** (clothing, scars, distinguishing features)
|
||
|
||
---
|
||
|
||
## 🗺️ Miscellaneous
|
||
- **Current Location:**
|
||
- **Important Items / Assets:**
|
||
- **Plot Hooks / Ties to PCs:**
|
||
- **Session Notes / Updates:**
|
||
- 2025-11-24: …
|
||
|
||
---
|
||
|
||
## 🔗 Connections
|
||
- **Related NPCs:**
|
||
- [[NPC A]] (Mentor)
|
||
- [[NPC B]] (Rival)
|
||
- **PC Ties:** (how the party knows them)
|