vault backup: 2025-10-02 17:18

This commit is contained in:
Jason McPherson
2025-10-02 17:18:20 -05:00
parent e7964ffd75
commit 8f95bf75eb
50 changed files with 3645 additions and 0 deletions
@@ -0,0 +1,6 @@
[[Faylen Valora|Faylen]] and [[Val]] go to meet with the family - and are eventually let in, with the guards outside bowing to [[Faylen Valora|Faylen]]
# Fenric [[Draycott Family|Draycott]]
- Seems to be an old friend of [[Faylen Valora]]. Doesn't believe that [[Faylen Valora|Faylen]] would ever be caught walking around Whitewater. [[Faylen Valora|Faylen]] wonders if he has learned any Gossip
- There's been a change in [[House Tassarion]] leadership.
- [[House Elidari]] has been threatening to adopt a new Chief Enforcer
@@ -0,0 +1,240 @@
---
Reputation: 0
Faction_Type:
Motto:
Ideology:
Symbol:
Colors:
Headquarters:
Territories:
-
Allies:
-
Rivals:
-
SMH_Acronym:
Intel:
- date: 2025-10-02
type: interaction
summary: Vaust informs us that [[House Asase]] has been exceeding their quota for excavations underneath the arch. It's possible that [[House Asase]] is working with [[The Archmasons]] on this endeavour.
source: "[[Lord Ellin Vaust]]"
reliability: B
credibility: 5
tags: []
- date: 2025-10-02
type: interaction
summary: We've learned that [[Iniana Asase]] runs a Soup Kitchen in the Drenches
source: "[[Kite]]"
reliability: A
credibility: 5
tags: []
- date: 2025-10-02
type: rumor
summary: The Inspector General and Auditor of Internal Affairs for Y'athyr is from this house.
source: "[[Kite]]"
reliability: A
credibility: 1
tags: []
Tags:
- faction
---
# House Asase
*One-line role/description — e.g., “Elven High House controlling Yathirs docks.”*
---
## 🎨 Artwork
![[House Asase.png]]
*Optional caption / artist credit*
---
## 🧭 Identity & Heraldry
- **Motto:** `= default(this.Motto, "—")`
- **Symbol:** `= default(this.Symbol, "—")`
- **Colors:** `= default(this.Colors, "—")`
- **Headquarters:** `= default(this.Headquarters, "—")`
- **Territories:** `= this.Territories`
---
## 📜 Ideology & Goals
- **Ideology / Alignment:** `= default(this.Ideology, "—")`
- **Primary Goals:**
-
- **Taboos / Anathema:**
-
---
## 🤝 Relationship with Party
- **Reputation:** `= this.Reputation`
---
## 🧑‍💼 Leadership & Structure
- **Leader(s):** [[NPC A]], [[NPC B]]
- **Structure:** (council, hierarchy, cells, chapters)
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
---
## 🧰 Assets & Operations
- **Resources:** (coin, troops, mages, ships, safehouses, contacts)
- **Notable Holdings:**
- **Typical Ops / Tactics:**
---
## 🕊️ Diplomacy & Relations
- **Allies:** `= this.Allies`
- **Rivals:** `= this.Rivals`
- **Stance toward “SMH” (their wording):** `= default(this.SMH_Acronym, "—")`
---
## 🧠 Intelligence & Mentions
```button
name Add Intel
type command
action Templater: Insert Add Intel Entry to Faction
```
```dataviewjs
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
const factions = dv.pages("#faction");
// mention detector (same logic as your table)
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true;
} else if (s && typeof s === "object" && s.path) {
const base = s.path.split("/").pop().replace(/\.md$/i,"").toLowerCase();
if (base === thisLC) return true;
}
}
return false;
}
const own = (THIS.Intel ?? []).length;
let mentions = 0;
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) if (mentionsThisFaction(it)) mentions++;
}
dv.paragraph(`_Entries: ${own + mentions} (own ${own} + mentions ${mentions})_`);
```
```dataviewjs
// Current faction
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
// All faction pages (including this one)
const factions = dv.pages("#faction");
// Mention detector: summary has [[This Faction]] OR source points at this faction
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true; // fallback: plain text match
} 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;
}
}
return false;
}
// Collect rows
const rows = [];
// 1) Own intel
for (const it of (THIS.Intel ?? [])) {
rows.push({
date: it.date ?? "",
from: THIS.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
source: it.source ?? "",
rel: it.reliability ?? "",
cred: it.credibility ?? "",
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
});
}
// 2) Mentions from other factions
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) {
if (mentionsThisFaction(it)) {
rows.push({
date: it.date ?? "",
from: p.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
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.table(
["Date","From Faction","Type","Summary","Source","Rel","Cred","Tags"],
rows.map(r => [r.date, r.from, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
);
}
```
> Add new entries in the **frontmatter** under `Intel:` (keep newest on top). Suggested fields: `date, type, summary, source, reliability, credibility, tags`.
---
## 🔗 Related NPCs (auto)
```dataview
TABLE link(file.name) AS NPC, number(Level_of_Influence) AS Influence, default(SMH_Acronym, "—") AS SMH
FROM #npc
WHERE file.name != "NPC Template"
AND (
Faction = this.file.link
OR lower(string(Faction)) = lower(this.file.name)
OR contains(lower(string(Faction)), lower(this.file.name))
)
SORT number(Level_of_Influence) DESC
```
---
## 📌 Plot Hooks & Notes
-
-
---
## 🗒 Session Updates
- 2025-10-02: …
@@ -0,0 +1,218 @@
---
Reputation: 0
Faction_Type: High House
Motto:
Ideology:
Symbol:
Colors:
Headquarters:
Territories:
-
Allies:
-
Rivals:
-
SMH_Acronym:
Intel:
Tags:
- faction
---
# House Calil
*One-line role/description — e.g., “Elven High House controlling Yathirs docks.”*
---
## 🎨 Artwork
![[House Calil.png]]
*Optional caption / artist credit*
---
## 🧭 Identity & Heraldry
- **Motto:** `= default(this.Motto, "—")`
- **Symbol:** `= default(this.Symbol, "—")`
- **Colors:** `= default(this.Colors, "—")`
- **Headquarters:** `= default(this.Headquarters, "—")`
- **Territories:** `= this.Territories`
---
## 📜 Ideology & Goals
- **Ideology / Alignment:** `= default(this.Ideology, "—")`
- **Primary Goals:**
-
- **Taboos / Anathema:**
-
---
## 🤝 Relationship with Party
- **Reputation:** `= this.Reputation`
---
## 🧑‍💼 Leadership & Structure
- **Leader(s):** [[NPC A]], [[NPC B]]
- **Structure:** (council, hierarchy, cells, chapters)
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
---
## 🧰 Assets & Operations
- **Resources:**
- Known to be Very Rich
- **Notable Holdings:**
- **Typical Ops / Tactics:**
---
## 🕊️ Diplomacy & Relations
- **Allies:** `= this.Allies`
- **Rivals:** `= this.Rivals`
- **Stance toward “SMH” (their wording):** `= default(this.SMH_Acronym, "—")`
---
## 🧠 Intelligence & Mentions
```button
name Add Intel
type command
action Templater: Insert Add Intel Entry to Faction
```
```dataviewjs
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
const factions = dv.pages("#faction");
// mention detector (same logic as your table)
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true;
} else if (s && typeof s === "object" && s.path) {
const base = s.path.split("/").pop().replace(/\.md$/i,"").toLowerCase();
if (base === thisLC) return true;
}
}
return false;
}
const own = (THIS.Intel ?? []).length;
let mentions = 0;
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) if (mentionsThisFaction(it)) mentions++;
}
dv.paragraph(`_Entries: ${own + mentions} (own ${own} + mentions ${mentions})_`);
```
```dataviewjs
// Current faction
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
// All faction pages (including this one)
const factions = dv.pages("#faction");
// Mention detector: summary has [[This Faction]] OR source points at this faction
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true; // fallback: plain text match
} 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;
}
}
return false;
}
// Collect rows
const rows = [];
// 1) Own intel
for (const it of (THIS.Intel ?? [])) {
rows.push({
date: it.date ?? "",
from: THIS.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
source: it.source ?? "",
rel: it.reliability ?? "",
cred: it.credibility ?? "",
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
});
}
// 2) Mentions from other factions
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) {
if (mentionsThisFaction(it)) {
rows.push({
date: it.date ?? "",
from: p.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
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.table(
["Date","From Faction","Type","Summary","Source","Rel","Cred","Tags"],
rows.map(r => [r.date, r.from, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
);
}
```
> Add new entries in the **frontmatter** under `Intel:` (keep newest on top). Suggested fields: `date, type, summary, source, reliability, credibility, tags`.
---
## 🔗 Related NPCs (auto)
```dataview
TABLE link(file.name) AS NPC, number(Level_of_Influence) AS Influence, default(SMH_Acronym, "—") AS SMH
FROM #npc
WHERE file.name != "NPC Template"
AND (
Faction = this.file.link
OR lower(string(Faction)) = lower(this.file.name)
OR contains(lower(string(Faction)), lower(this.file.name))
)
SORT number(Level_of_Influence) DESC
```
---
## 📌 Plot Hooks & Notes
-
-
---
## 🗒 Session Updates
- 2025-10-02: …
@@ -0,0 +1,217 @@
---
Reputation: 0
Faction_Type: High House
Motto:
Ideology:
Symbol:
Colors:
Headquarters:
Territories:
-
Allies:
-
Rivals:
-
SMH_Acronym:
Intel:
Tags:
- faction
---
# House Elidari
*Current Ruling House of Y'athyr*
---
## 🎨 Artwork
![[House Elidari.png]]
*Optional caption / artist credit*
---
## 🧭 Identity & Heraldry
- **Motto:** `= default(this.Motto, "—")`
- **Symbol:** `= default(this.Symbol, "—")`
- **Colors:** `= default(this.Colors, "—")`
- **Headquarters:** `= default(this.Headquarters, "—")`
- **Territories:** `= this.Territories`
---
## 📜 Ideology & Goals
- **Ideology / Alignment:** `= default(this.Ideology, "—")`
- **Primary Goals:**
-
- **Taboos / Anathema:**
-
---
## 🤝 Relationship with Party
- **Reputation:** `= this.Reputation`
---
## 🧑‍💼 Leadership & Structure
- **Leader(s):** [[NPC A]], [[NPC B]]
- **Structure:** (council, hierarchy, cells, chapters)
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
---
## 🧰 Assets & Operations
- **Resources:** (coin, troops, mages, ships, safehouses, contacts)
- **Notable Holdings:**
- **Typical Ops / Tactics:**
---
## 🕊️ Diplomacy & Relations
- **Allies:** `= this.Allies`
- **Rivals:** `= this.Rivals`
- **Stance toward “SMH” (their wording):** `= default(this.SMH_Acronym, "—")`
---
## 🧠 Intelligence & Mentions
```button
name Add Intel
type command
action Templater: Insert Add Intel Entry to Faction
```
```dataviewjs
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
const factions = dv.pages("#faction");
// mention detector (same logic as your table)
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true;
} else if (s && typeof s === "object" && s.path) {
const base = s.path.split("/").pop().replace(/\.md$/i,"").toLowerCase();
if (base === thisLC) return true;
}
}
return false;
}
const own = (THIS.Intel ?? []).length;
let mentions = 0;
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) if (mentionsThisFaction(it)) mentions++;
}
dv.paragraph(`_Entries: ${own + mentions} (own ${own} + mentions ${mentions})_`);
```
```dataviewjs
// Current faction
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
// All faction pages (including this one)
const factions = dv.pages("#faction");
// Mention detector: summary has [[This Faction]] OR source points at this faction
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true; // fallback: plain text match
} 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;
}
}
return false;
}
// Collect rows
const rows = [];
// 1) Own intel
for (const it of (THIS.Intel ?? [])) {
rows.push({
date: it.date ?? "",
from: THIS.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
source: it.source ?? "",
rel: it.reliability ?? "",
cred: it.credibility ?? "",
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
});
}
// 2) Mentions from other factions
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) {
if (mentionsThisFaction(it)) {
rows.push({
date: it.date ?? "",
from: p.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
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.table(
["Date","From Faction","Type","Summary","Source","Rel","Cred","Tags"],
rows.map(r => [r.date, r.from, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
);
}
```
> Add new entries in the **frontmatter** under `Intel:` (keep newest on top). Suggested fields: `date, type, summary, source, reliability, credibility, tags`.
---
## 🔗 Related NPCs (auto)
```dataview
TABLE link(file.name) AS NPC, number(Level_of_Influence) AS Influence, default(SMH_Acronym, "—") AS SMH
FROM #npc
WHERE file.name != "NPC Template"
AND (
Faction = this.file.link
OR lower(string(Faction)) = lower(this.file.name)
OR contains(lower(string(Faction)), lower(this.file.name))
)
SORT number(Level_of_Influence) DESC
```
---
## 📌 Plot Hooks & Notes
-
-
---
## 🗒 Session Updates
- 2025-10-02: …
@@ -0,0 +1,5 @@
[[Kite]] uncovers some letters that indicate that they have made some threats to buy the farm of [[Atmaka Sayin]].
The family is frequently involved in the production of higher end goods.
We also learn that the nearby lumbering operation is running out of land to work on, especially with the nearby trackless territory.
@@ -0,0 +1,225 @@
---
Reputation: 0
Faction_Type: High House
Motto:
Ideology:
Symbol:
Colors:
Headquarters:
Territories:
-
Allies:
-
Rivals:
-
SMH_Acronym:
Intel:
- date: 2025-10-02
type: report
summary: Oft composed of politicians and historians, members of this High House are frequently employed as advisors and ambassadors
source: Lore
reliability: A
credibility: 5
tags: []
Tags:
- faction
---
# House Noctilun
*One of the True High Houses*
---
## 🎨 Artwork
![[House Noctilun.png]]
*Optional caption / artist credit*
---
## 🧭 Identity & Heraldry
- **Motto:** `= default(this.Motto, "—")`
- **Symbol:** `= default(this.Symbol, "—")`
- **Colors:** `= default(this.Colors, "—")`
- **Headquarters:** `= default(this.Headquarters, "—")`
- **Territories:** `= this.Territories`
---
## 📜 Ideology & Goals
- **Ideology / Alignment:** `= default(this.Ideology, "—")`
- **Primary Goals:**
-
- **Taboos / Anathema:**
-
---
## 🤝 Relationship with Party
- **Reputation:** `= this.Reputation`
---
## 🧑‍💼 Leadership & Structure
- **Leader(s):** [[NPC A]], [[NPC B]]
- **Structure:** (council, hierarchy, cells, chapters)
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
---
## 🧰 Assets & Operations
- **Resources:** (coin, troops, mages, ships, safehouses, contacts)
- **Notable Holdings:** Gathering Venues - pubs, theaters, opera houses
- **Typical Ops / Tactics:**
---
## 🕊️ Diplomacy & Relations
- **Allies:** `= this.Allies`
- **Rivals:** `= this.Rivals`
- **Stance toward “SMH” (their wording):** `= default(this.SMH_Acronym, "—")`
---
## 🧠 Intelligence & Mentions
```button
name Add Intel
type command
action Templater: Insert Add Intel Entry to Faction
```
```dataviewjs
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
const factions = dv.pages("#faction");
// mention detector (same logic as your table)
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true;
} else if (s && typeof s === "object" && s.path) {
const base = s.path.split("/").pop().replace(/\.md$/i,"").toLowerCase();
if (base === thisLC) return true;
}
}
return false;
}
const own = (THIS.Intel ?? []).length;
let mentions = 0;
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) if (mentionsThisFaction(it)) mentions++;
}
dv.paragraph(`_Entries: ${own + mentions} (own ${own} + mentions ${mentions})_`);
```
```dataviewjs
// Current faction
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
// All faction pages (including this one)
const factions = dv.pages("#faction");
// Mention detector: summary has [[This Faction]] OR source points at this faction
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true; // fallback: plain text match
} 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;
}
}
return false;
}
// Collect rows
const rows = [];
// 1) Own intel
for (const it of (THIS.Intel ?? [])) {
rows.push({
date: it.date ?? "",
from: THIS.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
source: it.source ?? "",
rel: it.reliability ?? "",
cred: it.credibility ?? "",
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
});
}
// 2) Mentions from other factions
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) {
if (mentionsThisFaction(it)) {
rows.push({
date: it.date ?? "",
from: p.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
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.table(
["Date","From Faction","Type","Summary","Source","Rel","Cred","Tags"],
rows.map(r => [r.date, r.from, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
);
}
```
> Add new entries in the **frontmatter** under `Intel:` (keep newest on top). Suggested fields: `date, type, summary, source, reliability, credibility, tags`.
---
## 🔗 Related NPCs (auto)
```dataview
TABLE link(file.name) AS NPC, number(Level_of_Influence) AS Influence, default(SMH_Acronym, "—") AS SMH
FROM #npc
WHERE file.name != "NPC Template"
AND (
Faction = this.file.link
OR lower(string(Faction)) = lower(this.file.name)
OR contains(lower(string(Faction)), lower(this.file.name))
)
SORT number(Level_of_Influence) DESC
```
---
## 📌 Plot Hooks & Notes
-
-
---
## 🗒 Session Updates
- 2025-10-02: …
@@ -0,0 +1,243 @@
---
Reputation: 0
Faction_Type: High House
Motto:
Ideology:
Symbol:
Colors:
Headquarters:
Territories:
-
Allies:
- "[[House Tenrae]]"
Rivals:
-
SMH_Acronym:
Intel:
- date: 2025-10-02
type: report
summary: House Tassarion is generally known for their deaings with the craftsmanship of ships, wagons and buildings.
source: Lore
reliability: A
credibility: 5
tags:
- lore
- date: 2025-10-02
type: report
summary: "[[House Tassarion]] has been lending forces to the Master of the Port, so that they can keep things controlled."
source: "[[Session 1 - The Beginning of the End]]"
reliability: A
credibility: 5
tags: []
- date: 2025-10-02
type: report
summary: "[[House Tassarion]] has very few people holding that last name in Y'athyr. Instead, the major sub-house of Tassarion in the city is [[House Tenrae]]"
source: Lore
reliability: A
credibility: 5
tags:
- lore
Tags:
- faction
---
# House Tassarion
*One of the True High Houses*
---
## 🎨 Artwork
![[House Tassarion.png]]
*Optional caption / artist credit*
---
## 🧭 Identity & Heraldry
- **Motto:** `= default(this.Motto, "—")`
- **Symbol:** `= default(this.Symbol, "—")`
- **Colors:** `= default(this.Colors, "—")`
- **Headquarters:** `= default(this.Headquarters, "—")`
- **Territories:** `= this.Territories`
---
## 📜 Ideology & Goals
- **Ideology / Alignment:** `= default(this.Ideology, "—")`
- **Primary Goals:**
-
- **Taboos / Anathema:**
-
---
## 🤝 Relationship with Party
- **Reputation:** `= this.Reputation`
---
## 🧑‍💼 Leadership & Structure
- **Leader(s):** [[NPC A]], [[NPC B]]
- **Structure:** (council, hierarchy, cells, chapters)
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
---
## 🧰 Assets & Operations
- **Resources:** (coin, troops, mages, ships, safehouses, contacts)
- **Notable Holdings:**
- **Typical Ops / Tactics:**
---
## 🕊️ Diplomacy & Relations
- **Allies:** `= this.Allies`
- **Rivals:** `= this.Rivals`
- **Stance toward “SMH” (their wording):** `= default(this.SMH_Acronym, "—")`
---
## 🧠 Intelligence & Mentions
```button
name Add Intel
type command
action Templater: Insert Add Intel Entry to Faction
```
```dataviewjs
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
const factions = dv.pages("#faction");
// mention detector (same logic as your table)
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true;
} else if (s && typeof s === "object" && s.path) {
const base = s.path.split("/").pop().replace(/\.md$/i,"").toLowerCase();
if (base === thisLC) return true;
}
}
return false;
}
const own = (THIS.Intel ?? []).length;
let mentions = 0;
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) if (mentionsThisFaction(it)) mentions++;
}
dv.paragraph(`_Entries: ${own + mentions} (own ${own} + mentions ${mentions})_`);
```
```dataviewjs
// Current faction
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
// All faction pages (including this one)
const factions = dv.pages("#faction");
// Mention detector: summary has [[This Faction]] OR source points at this faction
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true; // fallback: plain text match
} 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;
}
}
return false;
}
// Collect rows
const rows = [];
// 1) Own intel
for (const it of (THIS.Intel ?? [])) {
rows.push({
date: it.date ?? "",
from: THIS.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
source: it.source ?? "",
rel: it.reliability ?? "",
cred: it.credibility ?? "",
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
});
}
// 2) Mentions from other factions
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) {
if (mentionsThisFaction(it)) {
rows.push({
date: it.date ?? "",
from: p.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
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.table(
["Date","From Faction","Type","Summary","Source","Rel","Cred","Tags"],
rows.map(r => [r.date, r.from, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
);
}
```
> Add new entries in the **frontmatter** under `Intel:` (keep newest on top). Suggested fields: `date, type, summary, source, reliability, credibility, tags`.
---
## 🔗 Related NPCs (auto)
```dataview
TABLE link(file.name) AS NPC, number(Level_of_Influence) AS Influence, default(SMH_Acronym, "—") AS SMH
FROM #npc
WHERE file.name != "NPC Template"
AND (
Faction = this.file.link
OR lower(string(Faction)) = lower(this.file.name)
OR contains(lower(string(Faction)), lower(this.file.name))
)
SORT number(Level_of_Influence) DESC
```
---
## 📌 Plot Hooks & Notes
-
-
---
## 🗒 Session Updates
- 2025-10-02: …
@@ -0,0 +1,217 @@
---
Reputation: 0
Faction_Type: High House
Motto:
Ideology:
Symbol:
Colors:
Headquarters:
Territories:
-
Allies:
-
Rivals:
-
SMH_Acronym:
Intel:
Tags:
- faction
---
# House Tenrae
*One-line role/description — e.g., “Elven High House controlling Yathirs docks.”*
---
## 🎨 Artwork
![[House Tenrae.png]]
*Optional caption / artist credit*
---
## 🧭 Identity & Heraldry
- **Motto:** `= default(this.Motto, "—")`
- **Symbol:** `= default(this.Symbol, "—")`
- **Colors:** `= default(this.Colors, "—")`
- **Headquarters:** `= default(this.Headquarters, "—")`
- **Territories:** `= this.Territories`
---
## 📜 Ideology & Goals
- **Ideology / Alignment:** `= default(this.Ideology, "—")`
- **Primary Goals:**
-
- **Taboos / Anathema:**
-
---
## 🤝 Relationship with Party
- **Reputation:** `= this.Reputation`
---
## 🧑‍💼 Leadership & Structure
- **Leader(s):** [[NPC A]], [[NPC B]]
- **Structure:** (council, hierarchy, cells, chapters)
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
---
## 🧰 Assets & Operations
- **Resources:** (coin, troops, mages, ships, safehouses, contacts)
- **Notable Holdings:**
- **Typical Ops / Tactics:**
---
## 🕊️ Diplomacy & Relations
- **Allies:** `= this.Allies`
- **Rivals:** `= this.Rivals`
- **Stance toward “SMH” (their wording):** `= default(this.SMH_Acronym, "—")`
---
## 🧠 Intelligence & Mentions
```button
name Add Intel
type command
action Templater: Insert Add Intel Entry to Faction
```
```dataviewjs
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
const factions = dv.pages("#faction");
// mention detector (same logic as your table)
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true;
} else if (s && typeof s === "object" && s.path) {
const base = s.path.split("/").pop().replace(/\.md$/i,"").toLowerCase();
if (base === thisLC) return true;
}
}
return false;
}
const own = (THIS.Intel ?? []).length;
let mentions = 0;
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) if (mentionsThisFaction(it)) mentions++;
}
dv.paragraph(`_Entries: ${own + mentions} (own ${own} + mentions ${mentions})_`);
```
```dataviewjs
// Current faction
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
// All faction pages (including this one)
const factions = dv.pages("#faction");
// Mention detector: summary has [[This Faction]] OR source points at this faction
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true; // fallback: plain text match
} 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;
}
}
return false;
}
// Collect rows
const rows = [];
// 1) Own intel
for (const it of (THIS.Intel ?? [])) {
rows.push({
date: it.date ?? "",
from: THIS.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
source: it.source ?? "",
rel: it.reliability ?? "",
cred: it.credibility ?? "",
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
});
}
// 2) Mentions from other factions
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) {
if (mentionsThisFaction(it)) {
rows.push({
date: it.date ?? "",
from: p.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
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.table(
["Date","From Faction","Type","Summary","Source","Rel","Cred","Tags"],
rows.map(r => [r.date, r.from, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
);
}
```
> Add new entries in the **frontmatter** under `Intel:` (keep newest on top). Suggested fields: `date, type, summary, source, reliability, credibility, tags`.
---
## 🔗 Related NPCs (auto)
```dataview
TABLE link(file.name) AS NPC, number(Level_of_Influence) AS Influence, default(SMH_Acronym, "—") AS SMH
FROM #npc
WHERE file.name != "NPC Template"
AND (
Faction = this.file.link
OR lower(string(Faction)) = lower(this.file.name)
OR contains(lower(string(Faction)), lower(this.file.name))
)
SORT number(Level_of_Influence) DESC
```
---
## 📌 Plot Hooks & Notes
-
-
---
## 🗒 Session Updates
- 2025-10-02: …
@@ -0,0 +1,221 @@
---
Reputation: 0
Faction_Type: High House
Motto:
Ideology:
Symbol:
Colors:
Headquarters:
Territories:
-
Allies:
- "[[Calen]]"
- "[[Metternich]]"
- "[[Val]]"
- "[[Kite]]"
- "[[Faylen Valora]]"
Rivals:
-
SMH_Acronym:
Intel:
Tags:
- faction
---
# House Valora
*One-line role/description — e.g., “Elven High House controlling Yathirs docks.”*
---
## 🎨 Artwork
![[House Valora.png]]
*Optional caption / artist credit*
---
## 🧭 Identity & Heraldry
- **Motto:** `= default(this.Motto, "—")`
- **Symbol:** `= default(this.Symbol, "—")`
- **Colors:** `= default(this.Colors, "—")`
- **Headquarters:** `= default(this.Headquarters, "—")`
- **Territories:** `= this.Territories`
---
## 📜 Ideology & Goals
- **Ideology / Alignment:** `= default(this.Ideology, "—")`
- **Primary Goals:**
-
- **Taboos / Anathema:**
-
---
## 🤝 Relationship with Party
- **Reputation:** `= this.Reputation`
---
## 🧑‍💼 Leadership & Structure
- **Leader(s):** [[NPC A]], [[NPC B]]
- **Structure:** (council, hierarchy, cells, chapters)
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
---
## 🧰 Assets & Operations
- **Resources:** (coin, troops, mages, ships, safehouses, contacts)
- **Notable Holdings:**
- **Typical Ops / Tactics:**
---
## 🕊️ Diplomacy & Relations
- **Allies:** `= this.Allies`
- **Rivals:** `= this.Rivals`
- **Stance toward “SMH” (their wording):** `= default(this.SMH_Acronym, "—")`
---
## 🧠 Intelligence & Mentions
```button
name Add Intel
type command
action Templater: Insert Add Intel Entry to Faction
```
```dataviewjs
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
const factions = dv.pages("#faction");
// mention detector (same logic as your table)
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true;
} else if (s && typeof s === "object" && s.path) {
const base = s.path.split("/").pop().replace(/\.md$/i,"").toLowerCase();
if (base === thisLC) return true;
}
}
return false;
}
const own = (THIS.Intel ?? []).length;
let mentions = 0;
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) if (mentionsThisFaction(it)) mentions++;
}
dv.paragraph(`_Entries: ${own + mentions} (own ${own} + mentions ${mentions})_`);
```
```dataviewjs
// Current faction
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
// All faction pages (including this one)
const factions = dv.pages("#faction");
// Mention detector: summary has [[This Faction]] OR source points at this faction
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true; // fallback: plain text match
} 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;
}
}
return false;
}
// Collect rows
const rows = [];
// 1) Own intel
for (const it of (THIS.Intel ?? [])) {
rows.push({
date: it.date ?? "",
from: THIS.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
source: it.source ?? "",
rel: it.reliability ?? "",
cred: it.credibility ?? "",
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
});
}
// 2) Mentions from other factions
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) {
if (mentionsThisFaction(it)) {
rows.push({
date: it.date ?? "",
from: p.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
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.table(
["Date","From Faction","Type","Summary","Source","Rel","Cred","Tags"],
rows.map(r => [r.date, r.from, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
);
}
```
> Add new entries in the **frontmatter** under `Intel:` (keep newest on top). Suggested fields: `date, type, summary, source, reliability, credibility, tags`.
---
## 🔗 Related NPCs (auto)
```dataview
TABLE link(file.name) AS NPC, number(Level_of_Influence) AS Influence, default(SMH_Acronym, "—") AS SMH
FROM #npc
WHERE file.name != "NPC Template"
AND (
Faction = this.file.link
OR lower(string(Faction)) = lower(this.file.name)
OR contains(lower(string(Faction)), lower(this.file.name))
)
SORT number(Level_of_Influence) DESC
```
---
## 📌 Plot Hooks & Notes
-
-
---
## 🗒 Session Updates
- 2025-10-02: …
@@ -0,0 +1,251 @@
---
Reputation: 0
Faction_Type: Gang
Motto:
Ideology:
Symbol: Hammer & Chisel
Colors:
Headquarters:
Territories:
- Whitewater
Allies:
-
Rivals:
-
SMH_Acronym:
Intel:
- date: 2025-10-02
type: interaction
summary: Vaust informs us that [[House Tenrae]] has been using [[The Archmasons]] as pseudo-mercenaries.
source: "[[Lord Ellin Vaust]]"
reliability: B
credibility: 4
tags: []
- date: 2025-10-02
type: rumor
summary: Fritch would be our best vector of getting further information on [[The Archmasons]]
source: "[[Kite]]"
reliability: C
credibility: 4
tags: []
- date: 2025-10-02
type: rumor
summary: "They are undertaking an ongoing project to excavate under the arch to build out carved out homes and save those for who are loyal or can offer something to [[The Archmasons]]. Anyone who can offer services is often compensated and provided those homes. "
source: "[[Calen]]"
reliability: B
credibility: 4
tags: []
- date: 2025-10-02
type: rumor
summary: People in Whitewater are walking on eggshells to avoid injury - it's not uncommon for someone in the way of the Arch masons getting hurt. Most could benefit from Magical Healing. Disease is not uncommon here, but most people hope for the best.
source: "[[Calen]]"
reliability: B
credibility: 4
tags: []
Tags:
- faction
---
# The Archmasons
*Ruling Faction of the Whitewater District*
---
## 🎨 Artwork
![[The Archmasons.png]]
*Optional caption / artist credit*
---
## 🧭 Identity & Heraldry
- **Motto:** `= default(this.Motto, "—")`
- **Symbol:** `= default(this.Symbol, "—")`
- **Colors:** `= default(this.Colors, "—")`
- **Headquarters:** `= default(this.Headquarters, "—")`
- **Territories:** `= this.Territories`
---
## 📜 Ideology & Goals
- **Ideology / Alignment:** `= default(this.Ideology, "—")`
- **Primary Goals:**
- Runs a Protection Racket in Whitewater
- **Taboos / Anathema:**
-
---
## 🤝 Relationship with Party
- **Reputation:** `= this.Reputation`
---
## 🧑‍💼 Leadership & Structure
- **Leader(s):** [[NPC A]], [[NPC B]]
- **Structure:** (council, hierarchy, cells, chapters)
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
---
## 🧰 Assets & Operations
- **Resources:** (coin, troops, mages, ships, safehouses, contacts)
- **Notable Holdings:**
- **Typical Ops / Tactics:**
- Protection Rackets
---
## 🕊️ Diplomacy & Relations
- **Allies:** `= this.Allies`
- **Rivals:** `= this.Rivals`
- **Stance toward “SMH” (their wording):** `= default(this.SMH_Acronym, "—")`
---
## 🧠 Intelligence & Mentions
```button
name Add Intel
type command
action Templater: Insert Add Intel Entry to Faction
```
```dataviewjs
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
const factions = dv.pages("#faction");
// mention detector (same logic as your table)
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true;
} else if (s && typeof s === "object" && s.path) {
const base = s.path.split("/").pop().replace(/\.md$/i,"").toLowerCase();
if (base === thisLC) return true;
}
}
return false;
}
const own = (THIS.Intel ?? []).length;
let mentions = 0;
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) if (mentionsThisFaction(it)) mentions++;
}
dv.paragraph(`_Entries: ${own + mentions} (own ${own} + mentions ${mentions})_`);
```
```dataviewjs
// Current faction
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
// All faction pages (including this one)
const factions = dv.pages("#faction");
// Mention detector: summary has [[This Faction]] OR source points at this faction
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true; // fallback: plain text match
} 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;
}
}
return false;
}
// Collect rows
const rows = [];
// 1) Own intel
for (const it of (THIS.Intel ?? [])) {
rows.push({
date: it.date ?? "",
from: THIS.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
source: it.source ?? "",
rel: it.reliability ?? "",
cred: it.credibility ?? "",
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
});
}
// 2) Mentions from other factions
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) {
if (mentionsThisFaction(it)) {
rows.push({
date: it.date ?? "",
from: p.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
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.table(
["Date","From Faction","Type","Summary","Source","Rel","Cred","Tags"],
rows.map(r => [r.date, r.from, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
);
}
```
> Add new entries in the **frontmatter** under `Intel:` (keep newest on top). Suggested fields: `date, type, summary, source, reliability, credibility, tags`.
---
## 🔗 Related NPCs (auto)
```dataview
TABLE link(file.name) AS NPC, number(Level_of_Influence) AS Influence, default(SMH_Acronym, "—") AS SMH
FROM #npc
WHERE file.name != "NPC Template"
AND (
Faction = this.file.link
OR lower(string(Faction)) = lower(this.file.name)
OR contains(lower(string(Faction)), lower(this.file.name))
)
SORT number(Level_of_Influence) DESC
```
---
## 📌 Plot Hooks & Notes
-
-
---
## 🗒 Session Updates
- 2025-10-02: …
@@ -0,0 +1,253 @@
---
Reputation: 0
Faction_Type: Gang
Motto:
Ideology: Semi-Communism
Symbol:
Colors:
Headquarters:
Territories:
- Drenches
Allies:
-
Rivals:
-
SMH_Acronym:
Intel:
- date: 2025-10-02
type: interaction
summary: Vaust informs us that some of the taxes that the [[Thin Wisps]] impose on those in the Drenches, end up in the hands of [[House Elidari]].
source: "[[Lord Ellin Vaust]]"
reliability: A
credibility: 5
tags: []
- date: 2025-10-02
type: interaction
summary: Maltrix in [[Session 8 - Operatic Intentions]] believes that their vision for the Drenches, is idealistic. They believe that they should be the ones running the Drenches.
source: Maltrix
reliability: A
credibility: 5
tags: []
- date: 2025-10-02
type: interaction
summary: We were explicitly warned again, by the [[Thin Wisps]] to stop snooping in their territory.
source: "[[Calen]]"
reliability: A
credibility: 5
tags: []
- date: 2025-10-02
type: interaction
summary: "[[Metternich]] received communiques from his spies from the [[Thin Wisps]], with them explicitly warning the SMH to stay off their turf."
source: "[[Session 1 - The Beginning of the End]]"
reliability: A
credibility: 5
tags: []
Tags:
- faction
---
# Thin Wisps
*Territorial Gang of the Drenches*
---
## 🎨 Artwork
![[Thin Wisps.png]]
*Optional caption / artist credit*
---
## 🧭 Identity & Heraldry
- **Motto:** `= default(this.Motto, "—")`
- **Symbol:** `= default(this.Symbol, "—")`
- **Colors:** `= default(this.Colors, "—")`
- **Headquarters:** `= default(this.Headquarters, "—")`
- **Territories:** `= this.Territories`
---
## 📜 Ideology & Goals
- **Ideology / Alignment:** `= default(this.Ideology, "—")`
- **Primary Goals:**
- Believe they should be the one's running the drenches
- **Taboos / Anathema:**
-
---
## 🤝 Relationship with Party
- **Reputation:** `= this.Reputation`
---
## 🧑‍💼 Leadership & Structure
- **Leader(s):** [[NPC A]], [[NPC B]]
- **Structure:** (council, hierarchy, cells, chapters)
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
---
## 🧰 Assets & Operations
- **Resources:** (coin, troops, mages, ships, safehouses, contacts)
- **Notable Holdings:**
- **Typical Ops / Tactics:**
- Intimidation (see intel)
- Thievery
---
## 🕊️ Diplomacy & Relations
- **Allies:** `= this.Allies`
- **Rivals:** `= this.Rivals`
- **Stance toward “SMH” (their wording):** `= default(this.SMH_Acronym, "—")`
---
## 🧠 Intelligence & Mentions
```button
name Add Intel
type command
action Templater: Insert Add Intel Entry to Faction
```
```dataviewjs
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
const factions = dv.pages("#faction");
// mention detector (same logic as your table)
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true;
} else if (s && typeof s === "object" && s.path) {
const base = s.path.split("/").pop().replace(/\.md$/i,"").toLowerCase();
if (base === thisLC) return true;
}
}
return false;
}
const own = (THIS.Intel ?? []).length;
let mentions = 0;
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) if (mentionsThisFaction(it)) mentions++;
}
dv.paragraph(`_Entries: ${own + mentions} (own ${own} + mentions ${mentions})_`);
```
```dataviewjs
// Current faction
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
// All faction pages (including this one)
const factions = dv.pages("#faction");
// Mention detector: summary has [[This Faction]] OR source points at this faction
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true; // fallback: plain text match
} 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;
}
}
return false;
}
// Collect rows
const rows = [];
// 1) Own intel
for (const it of (THIS.Intel ?? [])) {
rows.push({
date: it.date ?? "",
from: THIS.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
source: it.source ?? "",
rel: it.reliability ?? "",
cred: it.credibility ?? "",
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
});
}
// 2) Mentions from other factions
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) {
if (mentionsThisFaction(it)) {
rows.push({
date: it.date ?? "",
from: p.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
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.table(
["Date","From Faction","Type","Summary","Source","Rel","Cred","Tags"],
rows.map(r => [r.date, r.from, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
);
}
```
> Add new entries in the **frontmatter** under `Intel:` (keep newest on top). Suggested fields: `date, type, summary, source, reliability, credibility, tags`.
---
## 🔗 Related NPCs (auto)
```dataview
TABLE link(file.name) AS NPC, number(Level_of_Influence) AS Influence, default(SMH_Acronym, "—") AS SMH
FROM #npc
WHERE file.name != "NPC Template"
AND (
Faction = this.file.link
OR lower(string(Faction)) = lower(this.file.name)
OR contains(lower(string(Faction)), lower(this.file.name))
)
SORT number(Level_of_Influence) DESC
```
---
## 📌 Plot Hooks & Notes
-
-
---
## 🗒 Session Updates
- 2025-10-02: …
@@ -0,0 +1 @@
[[Kite]] is trying to find this person. They believe that they might know who might've cast a time magic spell on them.
@@ -0,0 +1,83 @@
---
Level_of_Influence: 0
Faction: "[[The Archmasons]]"
Tags:
- npc
---
# Amity Cornwallis
*Escort, Lieutenant of [[The Archmasons]]*
## 🎨 Artwork
![[Amity Cornwallis.png]]
*Optional caption / alt text*
---
## 🧑 NPC Overview
- **Full Name:** Amity Cornwallis
- **Race / Ancestry:** Elf
- **Gender / Pronouns:** She/Her
- **Occupation / Role:** Escort
- **Faction / Allegiance:** [[The Archmasons]]
- **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 14 Underworld Lore
- DC 17 Society
- DC 17 Stealth
- DC 19 Perception
- ***Influence Skills***
- DC 24 Intimidation
- DC 21 Diplomacy or Performance
- ***Weaknesses***
- Dislikes spending time with [[Ronan Elidari]] - acting in such a manner to get her away from him reduces the Influence DC by 2
- ***Resistances***
- ***Biases***
---
## 🏛️ Relations & Factions
- **Primary Faction:** [[The Archmasons]]
- **Allied Factions:** [[Faction A]], [[Faction B]]
- **Rival Factions:** [[Faction C]]
- **Personal Enemies / Allies:** [[NPC or PC]]
---
## 📖 History & Background
- **Origin / Past:**
- **Known Motivations:**
- **Secrets / Rumors:**
- Involved in an affair with [[Ronan Elidari]]
---
## 🎭 Roleplay Notes
- **Personality:** (e.g., stern, practical, loyal)
- **Speech Style / Quirks:** (catchphrases, accent, tics)
- **Appearance Details:** (clothing, scars, distinguishing features)
- Wore a very distinctive dress that she and her friends made to the event at [[Deidre Gille]]'s Winery.
---
## 🗺️ Miscellaneous
- **Current Location:**
- **Important Items / Assets:**
- **Plot Hooks / Ties to PCs:**
- **Session Notes / Updates:**
- 2025-10-02: …
---
## 🔗 Connections
- **Related NPCs:**
- [[NPC A]] (Mentor)
- [[NPC B]] (Rival)
- **PC Ties:** (how the party knows them)
@@ -0,0 +1,75 @@
---
Level_of_Influence: 0
Faction:
SMH_Acronym: Sandwich Mountain Harpoon
Tags:
- npc
---
# Atmaka Sayin
*Farmer*
## 🎨 Artwork
![[Atmaka Sayin.png]]
*Optional caption / alt text*
---
## 🧑 NPC Overview
- **Full Name:** Atmaka Sayin
- **Race / Ancestry:** Elf
- **Gender / Pronouns:** He/Him
- **Occupation / Role:** Farmer
- **Faction / Allegiance:**
- **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***
- ***Influence Skills***
- ***Weaknesses***
- ***Resistances***
- ***Biases***
---
## 🏛️ Relations & Factions
- **Primary Faction:** [[Faction Name]]
- **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-10-02: …
---
## 🔗 Connections
- **Related NPCs:**
- [[Lord Ellin Vaust]] (Benefactor)
- **PC Ties:** (how the party knows them)
@@ -0,0 +1,77 @@
---
Level_of_Influence: 0
Faction: "[[House Noctilun]]"
SMH_Acronym:
Tags:
- npc
---
# Calia Noctilun
*Talent Scout*
## 🎨 Artwork
![[Calia Noctilun.png]]
*Optional caption / alt text*
---
## 🧑 NPC Overview
- **Full Name:** [[Calia Noctilun]]
- **Race / Ancestry:** Elf
- **Gender / Pronouns:** She/Her
- **Occupation / Role:** Talent Scout
- **Faction / Allegiance:** [[House Noctilun]]
- **SMH (what THEY call it):** `= this.SMH_Acronym`
- **Notable Traits:** (quirks, mannerisms, appearance)
- **First Impression:** Mass Confusion. Information that we had previously gathered, had indicated that Calia was the tutor for Layla Springvale, the daughter of Sini Springvale -- a missing person that [[Kite]] was looking into. She clarified that she was the talent scout and that Alish Donail was the person who had actually tutored Layla.
---
## 🤝 Relationship with Party
- **Level of Influence:** `= this.Level_of_Influence` (10 to +10)
- **Notes on Influence:** (what actions improve/worsen standing)
- ***Discovery Skills***
- ***Influence Skills***
- ***Weaknesses***
- ***Resistances***
- ***Biases***
---
## 🏛️ Relations & Factions
- **Primary Faction:** [[House Noctilun]]
- However, in conversation with Calia, she mentions that she is not in the houses good graces, hence why she is stationed in Y'athyr as opposed to Ri'lesera
- **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-10-02: …
---
## 🔗 Connections
- **Related NPCs:**
- [[NPC A]] (Mentor)
- [[NPC B]] (Rival)
- **PC Ties:** (how the party knows them)
@@ -0,0 +1,82 @@
---
Level_of_Influence: 2
Faction:
Tags:
- npc
---
# Elthea Rinvale
*Diplomatic Intermediary*
## 🎨 Artwork
![[Elthea Rinvale.png]]
*Optional caption / alt text*
---
## 🧑 NPC Overview
- **Full Name:** Elthea Rinvale
- **Race / Ancestry:** Elf
- **Gender / Pronouns:** She/Her
- **Occupation / Role:** Diplomatic Envoy to the Trackless Courts
- **Faction / Allegiance:**
- **Notable Traits:** (quirks, mannerisms, appearance)
- **First Impression:** Cool
---
## 🤝 Relationship with Party
- **Level of Influence:** `= this.Level_of_Influence` (10 to +10)
- **Notes on Influence:** (what actions improve/worsen standing)
- ***Discovery Skills***
- DC 14 Trackless Lore
- DC 16 Warfare Lore
- DC 17 Society
- DC 19 Perception
- ***Influence Skills***
- DC 19 Diplomacy
- ***Weaknesses***
- Most happy when offered fresh drink/food. Reduces Influence DC by 2.
- ***Resistances***
- ***Biases***
---
## 🏛️ Relations & Factions
- **Primary Faction:** [[Faction Name]]
- **Allied Factions:** [[Faction A]], [[Faction B]]
- **Rival Factions:** [[Faction C]]
- **Personal Enemies / Allies:** [[NPC or PC]]
---
## 📖 History & Background
- **Origin / Past:**
- **Known Motivations:**
- **Secrets / Rumors:**
- Potentially annoyed with people who constantly gawk at her being an envoy to the Trackless Courts, or otherwise disrespecting her role as a diplomat.
---
## 🎭 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-10-02: …
---
## 🔗 Connections
- **Related NPCs:**
- [[NPC A]] (Mentor)
- [[NPC B]] (Rival)
- **PC Ties:** (how the party knows them)
@@ -0,0 +1,83 @@
---
Level_of_Influence: 1
Faction: "[[House Asase]]"
Tags:
- npc
---
# Iniana Asase
*Daughter of [[House Asase]]*
## 🎨 Artwork
![[Iniana Asase.png]]
*Optional caption / alt text*
---
## 🧑 NPC Overview
- **Full Name:** Iniana Asase
- **Race / Ancestry:** Elf
- **Gender / Pronouns:** She/Her
- **Occupation / Role:** Philanthropist
- **Faction / Allegiance:** [[House Asase]]
- **Notable Traits:** (quirks, mannerisms, appearance)
- **First Impression:** Bleeding Heart
---
## 🤝 Relationship with Party
- **Level of Influence:** `= this.Level_of_Influence` (10 to +10)
- **Notes on Influence:** (what actions improve/worsen standing)
- ***Discovery Skills***
- DC 17 Genealogy Lore
- DC 17 Y'ahtyr
- DC 17 Deception
- DC 19 Perception
- ***Influence Skills***
- DC 24 Intimidation
- DC 21 Performance
- DC 19 Diplomacy
- DC 14 Labor Lore
- ***Weaknesses***
- ***Resistances***
- ***Biases***
---
## 🏛️ Relations & Factions
- **Primary Faction:** [[House Asase]]
- **Allied Factions:** [[Faction A]], [[Faction B]]
- **Rival Factions:** [[Faction C]]
- **Personal Enemies / Allies:** [[NPC or PC]]
---
## 📖 History & Background
- **Origin / Past:**
- Youngest daughter of [[House Asase]]. Currently runs Soup Kitchens in the Drenches portion of Y'ahtyr
- **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-10-02: …
---
## 🔗 Connections
- **Related NPCs:**
- [[NPC A]] (Mentor)
- [[NPC B]] (Rival)
- **PC Ties:** (how the party knows them)
@@ -0,0 +1,84 @@
---
Level_of_Influence: 0
Faction:
Tags:
- npc
---
# Laughlin
*Figment Grandhall Scholar, Solicitor, Schmoozer and Fundraiser*
## 🎨 Artwork
![[Laughlin.png]]
*Optional caption / alt text*
---
## 🧑 NPC Overview
- **Full Name:** Laughlin
- **Race / Ancestry:** Elf
- **Gender / Pronouns:** He/Him
- **Occupation / Role:** Figment Grandhall Scholar, Schmoozer, Fundraiser and Solicitor
- **Faction / Allegiance:**
- **Notable Traits:** (quirks, mannerisms, appearance)
- **First Impression:** Absolute Man-Whore
---
## 🤝 Relationship with Party
- **Level of Influence:** `= this.Level_of_Influence` (10 to +10)
- **Notes on Influence:**
- ***Discovery Skills***
- DC 14 Performance
- DC 14 Espionage Lore
- DC 17 Crafting
- DC 17 Perception
- DC 19 Society
- ***Influence Skills***
- DC 24 Intimidation
- DC 22 Perception
- ***Weaknesses***
- Flirting or Offering a Deal of some sort will reduce the Influence DC by 2.
- ***Resistances***
- Showing Disinterest in his obscure subjects of discussion
- ***Biases***
- Appearing capable - either physically or politically offers a +2 to Discovery
- Refusing to dance around whispered subjects offers a -1 to Influence.
---
## 🏛️ Relations & Factions
- **Primary Faction:** [[Faction Name]]
- **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:** Renlentless Flirt, Interested in stories of near death as opposed to exploration and encounters.
- **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:**
---
## 🔗 Connections
- **Related NPCs:**
- [[NPC A]] (Mentor)
- [[NPC B]] (Rival)
- **PC Ties:** (how the party knows them)
@@ -0,0 +1,85 @@
---
Level_of_Influence: 2
Faction:
SMH_Acronym: Synchronized Mushroom Hiccup
Tags:
- npc
---
# Lord Ellin Vaust
*Local Merchant*
## 🎨 Artwork
![[Lord Ellin Vaust.png]]
*Optional caption / alt text*
---
## 🧑 NPC Overview
- **Full Name:** Ellin Vaust
- **Race / Ancestry:** Elf
- **Gender / Pronouns:** He/Him
- **Occupation / Role:** Merchant
- **Faction / Allegiance:**
- **SMH (what THEY call it):** `= default(this.SMH_Acronym, "—")`
- **Notable Traits:** (quirks, mannerisms, appearance)
- **First Impression:** (how the party perceives them)
- Initially the Party suspected that Vaust was more more well informed than he implied, and while that belief still holds. The Party is set to work with Vaust moving forward.
---
## 🤝 Relationship with Party
- **Level of Influence:** `= this.Level_of_Influence` (10 to +10)
- **Notes on Influence:** (what actions improve/worsen standing)
- ***Discovery Skills***
- ***Influence Skills***
- ***Weaknesses***
- ***Resistances***
- ***Biases***
---
## 🏛️ Relations & Factions
- **Primary Faction:** [[Faction Name]]
- **Allied Factions:** [[Faction A]], [[Faction B]]
- **Rival Factions:** [[Faction C]]
- **Personal Enemies / Allies:** [[Metternich|Metternich, under the Alias of Tallyrand]]
---
## 📖 History & Background
- **Origin / Past:**
- Father was a Craftsman and Mother was a homekeeper.
- Took advantage of what his parents were able to save in order to better his own station in life.
- Worked on the banks and docks after school and then purchased his own warehouses and distribution chains from there.
- **Known Motivations:**
- Received a letter from [[Atmaka Sayin]] begging that Lord Vaust assist with a "dog" problem that was happening in the woods outside Y'ahtyr. That probelm was dealt with in:
- [[Session 3 - Dealt with Like Dogs]]
- [[Session 4 - Aftermath of the Yeth Hounds]]
- **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:**
- Warehouses and Distrobution Centers along the Docks.
- **Plot Hooks / Ties to PCs:**
- **Session Notes / Updates:**
- 2025-10-02: …
---
## 🔗 Connections
- **Related NPCs:**
- [[NPC A]] (Mentor)
- [[NPC B]] (Rival)
- **PC Ties:** (how the party knows them)
@@ -0,0 +1,86 @@
# 🗂 NPC Influence Dashboard
> Scale: 10 … 0 … +10 (0 = Neutral; positive = more influential, negative = less)
> Source: **#npc** • Excluding: **NPC Template.md** (change the name below if yours differs)
---
## 🧾 SMH Index (who calls it what?)
```dataview
TABLE rows.file.link AS NPCs, rows.Faction AS Factions
FROM #npc
WHERE file.name != "NPC Template" AND SMH_Acronym
GROUP BY SMH_Acronym
SORT SMH_Acronym ASC
```
## 📊 Visual Bands (Emoji + Bipolar Progress Bars)
```dataviewjs
// ===== Source (tag-based; exclude template by name) =====
const PAGES = dv.pages('#npc')
.where(p => p.file.name != "NPC Template")
.where(p => Number.isFinite(+p.Level_of_Influence))
.map(p => ({
name: p.file.link,
faction: p.Faction ?? "—",
score: +p.Level_of_Influence
}));
const MAX = 10; // absolute ends: -10 .. +10
const WIDTH = 21; // must be 2*MAX+1 to center on 0
const CENTER = 10; // index of the 0 mark (10 for WIDTH=21)
// ===== Helpers =====
function tier(s) {
if (s === 0) return "😐 Neutral";
if (s <= -7) return "😡 Hostile";
if (s <= -1) return "😕 Unfriendly";
if (s >= 7) return "🛡 Allied";
return "🙂 Friendly";
}
// Build a centered gauge line like: −10 ───────┼──────── +10
// and a second line placing a ▼ under the current position.
function gauge(score) {
const idx = Math.max(0, Math.min(WIDTH - 1, Math.round(score + MAX)));
const ticks = Array(WIDTH).fill("─");
ticks[CENTER] = "┼"; // zero mark
const bar = ticks.join("");
const leftLabel = "10 ";
const rightLabel = " +10";
const line1 = `${leftLabel}${bar}${rightLabel}`;
// Use nbsp so alignment holds inside tables
const arrowOffset = leftLabel.length + idx;
const arrowLine = "&nbsp;".repeat(arrowOffset) + "▼";
return `<code>${line1}<br>${arrowLine}</code>`;
}
// ===== Groups =====
const groups = {
"😡 Hostile (10 to 7)": PAGES.filter(p => p.score <= -7),
"😕 Unfriendly (6 to 1)": PAGES.filter(p => p.score >= -6 && p.score <= -1),
"😐 Neutral (0)": PAGES.filter(p => p.score === 0),
"🙂 Friendly (+1 to +6)": PAGES.filter(p => p.score >= 1 && p.score <= 6),
"🛡 Allied (+7 to +10)": PAGES.filter(p => p.score >= 7)
};
// ===== Render =====
for (const [title, rows] of Object.entries(groups)) {
dv.header(2, title);
if (!rows.length) { dv.paragraph("_None yet._"); continue; }
dv.table(
["NPC", "Faction", "Score", "Gauge", "Tier"],
rows.map(r => [
r.name,
r.faction,
r.score,
dv.span(gauge(r.score)),
tier(r.score)
])
);
}
```
@@ -0,0 +1 @@
Professor at the Esoterium. Took over the previous office of Faylen Valora.
@@ -0,0 +1,86 @@
---
Level_of_Influence: -2
Faction: "[[House Elidari]]"
Tags:
- npc
---
# Ronan Elidari
*Captain of the Guard*
## 🎨 Artwork
![[Ronan Elidari.png]]
*Optional caption / alt text*
---
## 🧑 NPC Overview
- **Full Name:** Ronan Elidari
- **Race / Ancestry:** Elf
- **Gender / Pronouns:** He/Him
- **Occupation / Role:** Captain of the Guard
- **Faction / Allegiance:** [[House Elidari]]
- **Notable Traits:** (quirks, mannerisms, appearance)
- **First Impression:** Asshole
---
## 🤝 Relationship with Party
- **Level of Influence:** = this.Level_of_Influence (10 to +10)
- **Notes on Influence:** (what actions improve/worsen standing)
- ***Discovery Skills***
- DC 14 Warfare Lore
- DC 16 Y'athyr Lore
- DC 17 Society
- DC 19 Crafting
- DC 19 Perception
- ***Influence Skills***
- DC 24 Deception or Intimidation
- DC 22 Diplomacy
- DC 20 Y'ahtyr Lore or Althetics
- ***Weaknesses***
- ***Resistances***
- ***Biases***
- Doesn't like commoners or those not working with the High Houses. -1 to Influence or Discovery
- Likes people who are martially minded: +2 to Influence Checks
- Speaking Positively about [[House Elidari]] or the direction that the city is taking nets a +2 to Influence Checks.
---
## 🏛️ Relations & Factions
- **Primary Faction:** [[House Elidari]]
- **Allied Factions:** [[Faction A]], [[Faction B]]
- **Rival Factions:** [[House Valora]]
- **Personal Enemies / Allies:** [[Faylen Valora]]
---
## 📖 History & Background
- **Origin / Past:**
- **Known Motivations:**
- **Secrets / Rumors:**
- Involved in an affair with [[Amity Cornwallis]]
---
## 🎭 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-10-02: …
---
## 🔗 Connections
- **Related NPCs:**
- [[NPC A]] (Mentor)
- [[NPC B]] (Rival)
- **PC Ties:** (how the party knows them)
@@ -0,0 +1,4 @@
Job: Portmaster
Traits:
- Known Hardass
- Half elf born to Non-Noble Family but was recently adopted by [[House Tassarion]]
@@ -0,0 +1 @@
Alias: Tallyrand
@@ -0,0 +1 @@
That's us!
@@ -0,0 +1,10 @@
+1 Influence with People of Highwater
-1 Influence with High Class People
+2 Influence with [[Lord Ellin Vaust]]
+1 Influence with [[Iniana Asase]]
-2 Influence with [[Ronan Elidari]]
+2 Influence with [[Elthea Rinvale]]
0 Influence with [[Amity Cornwallis]]
0 Influence with [[Laughlin]]
0 Influence with [[Iniana Asase]]
0 Influence with [[Deidre Gille]]
@@ -0,0 +1,12 @@
# Session 2 - Bathhouses and Babes
## Information
Date: [[07-24-2025]]
Players: Collin, Ellisa, Len and Jason
DM: Tommy
## Overview
### Last Sessions Summary
### This Session's Summary
## Notes
1.
@@ -0,0 +1,31 @@
# Session 3 - Dealt with Like Dogs
## Information
Date: [[08-13-2025]]
Players: Collin, Ellisa, Len and Jason
DM: Tommy
## Overview
### Last Sessions Summary
### This Session's Summary
1. The party arrived outside the city in search of [[Atmaka Sayin]], responding to his plea for help that had reached [[Lord Ellin Vaust]]. Atmakas lands were plagued by a strange pack of dogs, and it fell to the group to investigate.
2. The companions split up to gather information. [[Val]] and [[Metternich]] questioned the locals with little success, while [[Kite]] and [[Calen]] searched the area for tracks. [[Faylen Valora]] spoke with the guards and learned the dogs were suspected in several disappearances: Atmakas own farmhand, some vineyard workers, and even run-ins with local loggers.
3. When the group reached Atmakas home, he described the creatures: gaunt, short-haired, smaller than greyhounds, with red, beady eyes. They lurked at the treeline, watching at dusk. He revealed that his son, a man in his late twenties, had been dragged away by the beasts; Atmaka struck one in the struggle but could not save his boy. **Calen** recognized that such behavior was unnatural for ordinary dogs and hinted they might be something far worse.
4. Atmaka led the party to the site of the attack, where blood still marked the ground. **Kite** noticed a trail of trampled brush leading into the woods, and the group set out in pursuit. Before long, they were ambushed—and discovered the truth.
5. The “dogs” were **Yeth Hounds**: wicked, intelligent hunters that thrive in darkness. They serve evil masters, delight in frightening their prey with otherworldly bays, and drag victims back to their lairs to feast at leisure. Sunlight weakens them, and they harbor a deep hatred for other canines. Whispers tie such creatures to fiendish patrons and even to the **Cult of Cerunoch**, who use them as guardians and enforcers.
## Notes
1. The group arrives outside of the city, looking for the home of [[Atmaka Sayin]], looking into the group of dogs that is bothering him. We're aware of the issue thanks to the letter that he sent to [[Lord Ellin Vaust]]
2. Information Gathering
1. [[Val]] and [[Metternich]] question some of the locals for information and don't learn much.
2. [[Kite]] and [[Calen]] investigate the surrounding areas to find tracks or presence of the rumored dogs.
3. [[Faylen Valora]] questions some of the local guardsmen and learns that the dogs are believed to be involved in a missing farmhand of [[Atmaka Sayin]], as well as some vineyard pickers. It's also noted that they have been involved in some dust ups with some local loggers.
3. Arriving at [[Atmaka Sayin]]'s House
1. We learn that the dogs have been watching, mostly - at least from what he can tell. Can see their eyes during the day near the tree line, but doesn't hear them.
2. Had his son dragged away by the dogs. Son is in his late 20's. Managed to hit one of the dogs before he was dragged off.
3. The dogs seem malnourished and skinny. Smaller than greyhounds, but similarly built. Gaunt and short-haired. Eyes are notably small, beady and red.
1. Thinking on this description, [[Calen]] learns:
1. There's dog-like creatures that may linger in the woods. Or fey creatures masquerading as animals. It would be odd for a pack of dogs to be organized like this.
4. [[Val]] asks what he believes they are watching. He's unsure, but it happens as the sun begins to set.
5. [[Atmaka Sayin]] shows us to where his son was attacked. About 1/4 mile from the treeline, he take us to the spot. There are some visible sprays of blood here, but it appears that he's left it mostly undisturbed since the incident.
1. [[Kite]] notices a trail of broken/tamped down vegetation that indicates where his son might've been dragged away.
4. We head into the woods to pursue the dogs, and eventually get ambushed by them. I able to successfully learn about the dogs though:
1. Wicked canine creatures who live for the thrill of the hunt, yeth hounds often serve evil masters as guardians and trackers. Yeth hounds resemble lean, sleek dogs with overlarge ears and narrow paws that can tread on air as easily as the ground. Despite their canine appearance, yeth hounds are remarkably intelligent, although they rarely display this intelligence except when devising intricate tactics to ensnare their quarry. Their eerie bays echo across the countryside when they are engaged in a hunt, and they particularly enjoy baying to frighten and disorient intelligent creatures. Yeth hound packs can number as many as a dozen members, each working in uncanny communion with its packmates to corner and kill their prey. Yeth hounds like to drag their victims back to their lairs to eat at their leisure, so these lairs often contain discarded treasures from the hounds' previous meals. Yeth hounds despise two things: sunlight and other canines. They hunt only at night if they can, often breaking off their hunt at dawn to retreat to a subterranean lair or den, no matter how close they had come to catching their prey. Yeth hounds usually attack wargs, wolves, and similar creatures on sight, working to drive larger or more powerful canines from their hunting areas when then can't simply overpower and kill them. Evil rangers, bestial demons, and wicked cults are frequently gifted yeth hound servants by fiendish patrons. Such hounds often serve as spies and are quick to turn against those who fail to advance the patrons' wicked aims. The cult of Cerunoch, in particular, is fond of using yeth hounds as temple guardians.
@@ -0,0 +1,17 @@
# Session 4 - Aftermath of the Yeth Hounds
## Information
Date: [[08-20-2025]]
Players: Collin, Ellisa, Len and Jason
DM: Tommy
## Overview
### Last Sessions Summary
1. The party arrived outside the city in search of [[Atmaka Sayin]], responding to his plea for help that had reached [[Lord Ellin Vaust]]. Atmakas lands were plagued by a strange pack of dogs, and it fell to the group to investigate.
2. The companions split up to gather information. [[Val]] and [[Metternich]] questioned the locals with little success, while [[Kite]] and [[Calen]] searched the area for tracks. [[Faylen Valora]] spoke with the guards and learned the dogs were suspected in several disappearances: Atmakas own farmhand, some vineyard workers, and even run-ins with local loggers.
3. When the group reached Atmakas home, he described the creatures: gaunt, short-haired, smaller than greyhounds, with red, beady eyes. They lurked at the treeline, watching at dusk. He revealed that his son, a man in his late twenties, had been dragged away by the beasts; Atmaka struck one in the struggle but could not save his boy. **Calen** recognized that such behavior was unnatural for ordinary dogs and hinted they might be something far worse.
4. Atmaka led the party to the site of the attack, where blood still marked the ground. **Kite** noticed a trail of trampled brush leading into the woods, and the group set out in pursuit. Before long, they were ambushed—and discovered the truth.
5. The “dogs” were **Yeth Hounds**: wicked, intelligent hunters that thrive in darkness. They serve evil masters, delight in frightening their prey with otherworldly bays, and drag victims back to their lairs to feast at leisure. Sunlight weakens them, and they harbor a deep hatred for other canines. Whispers tie such creatures to fiendish patrons and even to the **Cult of Cerunoch**, who use them as guardians and enforcers.
### This Session's Summary
## Notes
1. Investigating the Tarnished Necklace - +1 saves to Unholy Effect, 1/per day Bane or Bless once attuned.
2. We learn that [[House Miiran]] has been threatening [[Atmaka Sayin]] and his family, trying to purchase his property. We later learn that [[House Gille]], a subsidiary of [[House Miiran|Miiran]] is the leading family of Y'athyr mining industries.
@@ -0,0 +1,21 @@
# Session 5 - The Masquerade
## Information
Date: [[08-27-2025]]
Players: Collin, Ellisa, Len and Jason
DM: Tommy
## Overview
### Last Sessions Summary
1.
### This Session's Summary
## Notes
1. The group brainstorms ideas on how to approach the Masquerade.
1. [[Faylen Valora]] is going to talk to the [[Draycott Family|Draycott's]] to see if Val can perhaps attend the masquerade as [[Draycott Family|Fenric Draycott's]] +1
2. [[Metternich]] is going to speak with [[Lord Ellin Vaust]] to see if he can perhaps attend as his +1
2. [[Faylen Valora]] and [[Metternich]] go to speak with [[Lord Ellin Vaust]].
1. During the course of the conversation he reveals that he knows how [[Metternich]] is in the employ of [[Faylen Valora]].
2. Indicates that he received multiple invitations for the Masquerade. [[Faylen Valora]] asks if he will attend if we make it interesting for him. [[Metternich]] expands attempting to entice him with the potential failure of the High Houses, and favor with [[House Valora]] going forward.
3. [[Lord Ellin Vaust]] agrees to meet with the remainder of the party the following day.
3. The rest of the party goes to talk with some servants to see if we can dig up any information on Vaust, and the High Houses
1. We find out that we're being tailed. We're bad at surprising the guy but are able to approach him eventually.
2.
@@ -0,0 +1,19 @@
# Session 6 - Two Mysteries, and a Meeting
## Information
Date: [[09-04-2025]]
Players: Collin, Ellisa, Len and Jason
DM: Tommy
## Overview
### Last Sessions Summary
1.
### This Session's Summary
## Notes
1. Absent for the first half of the session due to Therapy.
2. Missing Person: Sini Springvale
1. Doesn't live in whitewater
2. Well liked, but doesn't have husband.
3. Dissapeared about a week ago.
4. Unusual that she'd be able to afford a house in Northpoint on her own.
5. Investigating the House
1.
@@ -0,0 +1,25 @@
# Session 7 - Meeting with Vaust
## Information
Date: [[09-17-2025]]
Players: Collin, Ellisa, Len and Jason
DM: Tommy
## Overview
### Last Sessions Summary
1.
### This Session's Summary
## Notes
1. The Caligni at the house were meant to scare off any investigators looking into Mrs. Springvale's disappearance - in which case they would have framed her disappearance on the people investigating.
2. Euzaldoph (The Scalescribe) was summoned by a man, with an accent familiar to the city - he remembers some defining features:
1. Was summoned in the Wells, somewhere that there is a conglomerate. Cloaked figures, shard blades, summoned creatures - singing, dancing and chanting.
2. The person who pulled him from the Esoterium Records Room was Professor Garandel.
3. The group cleans up Sini Springvale's house, and does some additional searching:
1. We find 84 Gold in a chest hidden behind a false wall
2. We also find a number of very fine dresses in the style of [[House Calil]].
3. A sewing room has shown little use for quite a while and no sign of materials that would've been used for the dresses found hidden behind the false wall.
4. Afterwards, the group heads to meet with [[Lord Ellin Vaust]]
1. Brief introductions play out, and he introduces himself as a merchant and proprietor of many goods in the city.
2. We share out motivations for involving ourselves in the Resistance Movement.
3. Vaust shares that he preferred the City under the guiding of House Valora pver [[House Elidari]] but, expresses some concern about those who have to close of ties with the High Houses.
1. [[House Elidari]] finds themselves more willing to be a pawn of House Evandra, while [[House Valora]] found themselves more concerned with the operations of the city.
4.
@@ -0,0 +1,34 @@
# Session 8 - Operatic Intentions
## Information
Date: [[09-24-2025]]
Players: Collin, Ellisa, Len and Jason
DM: Tommy
## Overview
### Last Sessions Summary
1.
### This Session's Summary
1.
## Notes
1. [[Calen]] and [[Val]] head over to the Opera House, in an attempt to gather some information about what might be in store for us at the Solistice Celebration and the kidnapping/disappearance of Sini Springvale - and her children.
1. Calia [[House Noctilun|Noctilun]] is practicing a Opera about the Tribunal of the Sun, a Princess who ran away with a Prince of the Tribunal of Flowers.
2. Layla is actively part of the choir and not missing, might actually be here today. She has only had the part for about a week, whereas her mother has
1. Calia was acttually just a talent scout, whereas Alish Donail, was the person who actually tutored Layla.
2. Layla's first question is if she left town?
3. Layla fought with her mother about not working for [[House Calil]] making dresses. That was two weeks ago.
4. Questioned if Sini went to get her father. Layla believes that her father is not from Y'athyr - and she doesn't know if she and her brother share the same father.
5. After the fact, [[Val]] mentions that she believes that her memory is either being altered or that she is being compelled.
6. Calia mentions that Layla had auditioned in a dress that was similar to the ones made by [[House Calil|Katarin Calil]], but was not something that she had noted being sold on the Racks. Additionally, she spoke to Lady Calil a day after Layla's audition and had seemed partially surprised.
2. Calen's Questions (hopefully for Calia, who was the tutor for Layla)
1. Do you know anything about the disappearance of Sini Springvale, and her two children, Layla and the other?
2. Do you know anything about Sini's relationship with [[House Calil]]?
1. Sini worked as a laundress. [[House Calil]] made dresses for the Opera. Standard information that we already have.
3. Do you know anything about how Sini would've been able to afford lessons for Layla at the Opera House?
1. Bust. Spoke to Layla.
4. Do you know anything about Sini's work as a laundress - or her procilivites for sewing and fabricating clothes? Anything about her potentially making/maintaining dresses that are very similar to the likes of one's produced by [[House Calil|Katarin Calil]]
1. Bust. Spoke to Layla.
5. Do you know of any connections between Sini, Layla and [[House Miiran]]?
1. Bust. Spoke to Layla.
6. Do you know anything about the Alfen Hearth Ball/Masquerade - and what all [[House Elidari]] might have in store for us or [[Faylen Valora|Faylen]]?
1. Bust. Spoke to Layla.
3. [[Kite]] and [[Metternich]] go to speak with Maltrix, who locks the door and flips the open sign to closed.
1. Maltrix provides a contact for a "Recruiter" for the Wisps.
@@ -0,0 +1,61 @@
# Session 9 - Wined, Dined, Infilitrated
## Information
Date: [[09-24-2025]]
Players: Collin, Ellisa, Len and Jason
DM: Tommy
## Overview
### Last Sessions Summary
1.
### This Session's Summary
1.
## Notes
1. Name of the game here is an influence operation...
1. Faylen can influence up to 10 people simultaneously with Group Impression
2. [[Val]] gets a +2 to Society
3. [[Kite]] gets a free discovery right off the bat.
4. [[Calen]] gets a +2 to influence for magic based traditions
1. Can use Bon Mot to reduce Influence DC
5. [[Metternich]] can use Hobnobbler to do two discoveries in a single round, can use Bon Mot to reduce the Influence DC.
2. [[Deidre Gille]]
1. Osal Planes Winemaker, under [[House Miiran]], at the Starlight Ridge Winery
2. Discovery Skills
1. DC 14 Wine Lore
2. DC 17 Crafting
3. DC 19 Perception
3. [[Iniana Asase]]
1. Daughter of [[House Asase]], organizes Soup Kitchens in the South Drenches
2. Discovery Skills
1. DC 17 Genealogy Lore
2. DC 17 Y'athyr Lore
3. DC 17 Deception
4. DC 19 Perception
4. [[Elthea Rinvale]]
1. Envoy to the Trackless Courts, Diplomatic Intermediary
2. Discovery Skills
1. DC 14 Trackless Lore
2. DC 16 Warfare Lore
3. DC 17 Society
4. DC 19 Perception
5. [[Laughlin]]
1. Figment Grandhall Scholar schmoozer, fundraiser and solicitor
2. Discovery Skills
1. DC 14 Performance
2. DC 14 Espionage Lore
3. DC 17 Crafting
4. DC 17 Perception
5. DC 19 Society
6. [[Ronan Elidari]]
1. Captain of the City Watch
2. Discovery Skills
1. DC 14 Warfare Lore
2. DC 16 Y'athyr Lore
3. DC 17 Society
4. DC 19 Crafting
5. DC 19 Perception
7. [[Amity Cornwallis]]
1. [[The Archmasons]], Escort
2. Discovery Skills
1. DC 14 Underworld Lore
2. DC 17 Society
3. DC 17 Stealth
4. DC 19 Perception
@@ -0,0 +1,44 @@
1. Name: Sezhade Omar Halasmishal XVII (Bastard Son of the Sultan)
2. Character Attributes
1. Strength: 9
2. Dexterity: 12, +1 from Assasin = 13
3. Constitution: 10, +1 from Survivor
1. HP is Equal to Con, so 11.
2. HP = 9
4. Intelligence: 10, +1 from Forbidden Knowledge
5. Charisma: 11
6. Wisdom: 10
3. Origin
1. Decadent, in the origins of a Crystal Palace
1. Talents:
1. Assassin - First attack on Unaware Autohits. Damage = Dex, +1 Dex
2. Forbidden Knowledge - Four Randomly Selected Spells., +1 Int
3. Survivor - Takes d6 minutes to find something that can be used as a knife or club. +1 Con
2. Languages: Thyrenian and Amaric
4. Weapons and Equipment
1. Start with 2 Weapons, or 1 Weapon and a Shield.
1. Scythe
2. Crossbow
2. 100 Gold from Decadent
1. Less 11, so 89 Gold.
3. Backpack - 2 Gold
4. Grappling Hook - 3 Gold
5. Rope - 5 gold
6. Light Armour - 10 Gold
7. Tent - 60
8. Mirror - 4 Gold
9. Scrolls - 4 Gold
5. Spells
1. Animate Mirror - You animate your own reflection in a mirror. It will attack anyone that passes near it (d6 damage). Lasts until dispelled or the mirror is destroyed
2. Hellhound: Turns a regular dog into a raging killing machine (Attack 11, Dodge 11, d6 damage, 10 HP). It dies at the end of the fight whatever happens.
3. War drums: The target is experiencing all the horrors of war. Roll a d6: on 1-4 the target panics, on a 5-6 they go berserk.
4. Curse of the Mute: The Target cannot speak. On a spellcasting roll of 1, the target is permanently mute.
6. Notes
1. As we're approaching the city, there are a number of miners that are waiting for a meteor to hit the ground.
2. As we continue to approach the city after talking to some minors, the meteor hits the ground, hitting an Inn.
3. I head in to try and get some people out and am able to save 5 people. Wasn't able to get out without issue and am suffering from Smoke Inhalation - have Disadvantage on next Skill Check.
4. Pharris (Tommy) is able to get about a half pound of the ore and Penny (Kate) fails to do so, lighting herself on fire.
5. The Commoner's are blaming this event on Sander? a diviner
6. We head down the road to Sander's House, though we're able to at least temporarily stave off the mob that was heading to her house.
7. Sander lives in a sort of House carved out of a Tree.
8. Path F in the Mine has some clanging sounds, sneaking ahead, there's a cold blue flame, there's a Skeletal Blacksmith working on what appears to be a support structure.
+114
View File
@@ -0,0 +1,114 @@
<%*
/* Add Intel entry to CURRENT Faction note, with vault-aware suggestions & link completion. */
const file = app.workspace.getActiveFile();
if (!file) { new Notice("Open a Faction note first."); return; }
const today = tp.date.now("YYYY-MM-DD");
// ---------- TYPE ----------
new Notice("Step 1/6 — Pick Intel TYPE");
const TYPE_OPTIONS = ["interaction","report","rumor","asset","op"];
const type = await tp.system.suggester(TYPE_OPTIONS.map(x => `Type: ${x}`), TYPE_OPTIONS);
if (!type) { new Notice("Cancelled."); return; }
// ---------- SOURCE (suggest existing notes as [[Note]]) ----------
new Notice("Step 2/6 — Choose SOURCE");
const allFiles = app.vault.getMarkdownFiles();
const names = allFiles.map(f => f.basename).sort((a,b)=>a.localeCompare(b, undefined, {sensitivity:"base"}));
const wikiChoices = ["(manual entry)…", ...names.map(n => `[[${n}]]`)];
let sourcePick = await tp.system.suggester(wikiChoices, wikiChoices);
if (!sourcePick) { new Notice("Cancelled."); return; }
let source = sourcePick === "(manual entry)…"
? (await tp.system.prompt("Source (free text or [[Link]])")) ?? ""
: sourcePick;
// ---------- SUMMARY (free text, then auto-complete [[links]]) ----------
new Notice("Step 3/6 — Write SUMMARY (you can include [[links]])");
let summary = await tp.system.prompt("Summary (what happened)?\nTip: You can include [[Note]] names; well auto-complete them next.") ?? "";
// Helper: resolve [[links]] in the summary to existing notes (prompt if ambiguous)
async function resolveWikiLinks(text) {
// Find [[...]] occurrences
const re = /\[\[([^[\]|#]+)(?:#[^\]|]+)?(?:\|[^\]]+)?\]\]/g;
let m, out = text, offset = 0;
while ((m = re.exec(text)) !== null) {
const raw = m[0], term = m[1].trim();
const exact = names.find(n => n.toLowerCase() === term.toLowerCase());
let replacement = raw;
if (exact) {
replacement = `[[${exact}]]`;
} else {
// Offer matching notes to replace this token
const matches = names.filter(n => n.toLowerCase().includes(term.toLowerCase())).slice(0,50);
const disp = [`Keep as typed: [[${term}]]`, ...matches.map(n => `→ [[${n}]]`)];
const vals = [null, ...matches];
const pick = await tp.system.suggester(disp, vals);
if (pick) replacement = `[[${pick}]]`;
}
// Splice into output string at the correct position (accounting for prior replacements)
const start = m.index + offset;
out = out.slice(0, start) + replacement + out.slice(start + raw.length);
offset += replacement.length - raw.length;
}
return out;
}
summary = await resolveWikiLinks(summary);
// Optional: append more links via suggester loop
while (true) {
const addMore = await tp.system.suggester(
["(done)","Append a wikilink…"], ["__done__","__add__"]
);
if (!addMore || addMore === "__done__") break;
const pick = await tp.system.suggester(names.map(n => `[[${n}]]`), names.map(n => `[[${n}]]`));
if (pick) summary = (summary ? summary + " " : "") + pick;
}
// ---------- RELIABILITY / CREDIBILITY ----------
new Notice("Step 4/6 — Reliability (AE)");
const relDisplay = ["A — confirmed","B — likely","C — uncertain","D — doubtful","E — unknown"];
const relValues = ["A","B","C","D","E"];
const reliability = (await tp.system.suggester(relDisplay, relValues)) ?? "C";
new Notice("Step 5/6 — Credibility (15)");
const credDisplay = ["5 — strong","4 — good","3 — fair","2 — weak","1 — very weak"];
const credValues = ["5","4","3","2","1"];
const credibility = (await tp.system.suggester(credDisplay, credValues)) ?? "3";
// ---------- TAGS (multi-select from existing vault tags) ----------
new Notice("Step 6/6 — Add TAGS (optional)");
const tagMap = app.metadataCache.getTags?.() ?? {};
let allTags = Array.from(new Set(Object.keys(tagMap).map(t => t.replace(/^#/, "")))).sort();
const chosen = new Set();
while (true) {
const remaining = allTags.filter(t => !chosen.has(t));
const display = ["(done)", "(new tag)…", ...remaining.map(t => `#${t}`)];
const values = ["__done__", "__new__", ...remaining];
const pick = await tp.system.suggester(display, values);
if (!pick || pick === "__done__") break;
if (pick === "__new__") {
const newTag = (await tp.system.prompt("New tag (without #)"))?.trim();
if (newTag) { chosen.add(newTag); if (!allTags.includes(newTag)) allTags.push(newTag); }
} else {
chosen.add(pick);
}
}
const tags = Array.from(chosen);
// ---------- Update frontmatter safely ----------
await app.fileManager.processFrontMatter(file, (fm) => {
if (!Array.isArray(fm.Intel)) fm.Intel = [];
fm.Intel.unshift({
date: today,
type,
summary,
source,
reliability,
credibility: Number(credibility),
tags
});
});
new Notice("Intel entry added.");
%>
+10
View File
@@ -0,0 +1,10 @@
# Session XX - X
## Information
Date:
Players:
DM:
## Overview
## Notes
+226
View File
@@ -0,0 +1,226 @@
---
# Reputation: -10 (very bad) … 0 (neutral) … +10 (very good)
Reputation: 0
Faction_Type: # e.g., Noble House, Guild, Cult, Order, Syndicate
Motto:
Ideology: # beliefs, alignment, edicts/anathema
Symbol:
Colors:
Headquarters:
Territories:
-
Allies:
-
Rivals:
-
SMH_Acronym:
# Intelligence & Interactions log (array of objects; keep newest on top)
Intel:
# - date: 2025-10-02
# type: interaction # interaction | report | rumor | asset | op
# summary: Met with Faylen; agreed to discreet escort for supply barge.
# source: [[Faylen Valora]] # free text or wikilink
# reliability: A # A (confirmed) … E (unknown)
# credibility: 4 # 1 (weak) … 5 (strong)
# tags: [meeting, docks, payment]
Tags:
- faction
---
# <% tp.file.title %>
*One-line role/description — e.g., “Elven High House controlling Yathirs docks.”*
---
## 🎨 Artwork
![[<% tp.file.title %>.png]]
*Optional caption / artist credit*
---
## 🧭 Identity & Heraldry
- **Motto:** `= default(this.Motto, "—")`
- **Symbol:** `= default(this.Symbol, "—")`
- **Colors:** `= default(this.Colors, "—")`
- **Headquarters:** `= default(this.Headquarters, "—")`
- **Territories:** `= this.Territories`
---
## 📜 Ideology & Goals
- **Ideology / Alignment:** `= default(this.Ideology, "—")`
- **Primary Goals:**
-
- **Taboos / Anathema:**
-
---
## 🤝 Relationship with Party
- **Reputation:** `= this.Reputation`
---
## 🧑‍💼 Leadership & Structure
- **Leader(s):** [[NPC A]], [[NPC B]]
- **Structure:** (council, hierarchy, cells, chapters)
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
---
## 🧰 Assets & Operations
- **Resources:** (coin, troops, mages, ships, safehouses, contacts)
- **Notable Holdings:**
- **Typical Ops / Tactics:**
---
## 🕊️ Diplomacy & Relations
- **Allies:** `= this.Allies`
- **Rivals:** `= this.Rivals`
- **Stance toward “SMH” (their wording):** `= default(this.SMH_Acronym, "—")`
---
## 🧠 Intelligence & Mentions
```button
name Add Intel
type command
action Templater: Insert Add Intel Entry to Faction
```
```dataviewjs
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
const factions = dv.pages("#faction");
// mention detector (same logic as your table)
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true;
} else if (s && typeof s === "object" && s.path) {
const base = s.path.split("/").pop().replace(/\.md$/i,"").toLowerCase();
if (base === thisLC) return true;
}
}
return false;
}
const own = (THIS.Intel ?? []).length;
let mentions = 0;
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) if (mentionsThisFaction(it)) mentions++;
}
dv.paragraph(`_Entries: ${own + mentions} (own ${own} + mentions ${mentions})_`);
```
```dataviewjs
// Current faction
const THIS = dv.current();
const thisName = String(THIS.file.name);
const thisLC = thisName.toLowerCase();
// All faction pages (including this one)
const factions = dv.pages("#faction");
// Mention detector: summary has [[This Faction]] OR source points at this faction
function mentionsThisFaction(entry) {
const sum = String(entry.summary ?? "");
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
const src = entry.source;
const list = Array.isArray(src) ? src : (src ? [src] : []);
for (const s of list) {
if (typeof s === "string") {
if (s.includes(`[[${thisName}]]`) || s.includes(`[[${thisName}|`)) return true;
if (s.toLowerCase() === thisLC) return true; // fallback: plain text match
} 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;
}
}
return false;
}
// Collect rows
const rows = [];
// 1) Own intel
for (const it of (THIS.Intel ?? [])) {
rows.push({
date: it.date ?? "",
from: THIS.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
source: it.source ?? "",
rel: it.reliability ?? "",
cred: it.credibility ?? "",
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
});
}
// 2) Mentions from other factions
for (const p of factions.where(p => p.file.name !== thisName)) {
for (const it of (p.Intel ?? [])) {
if (mentionsThisFaction(it)) {
rows.push({
date: it.date ?? "",
from: p.file.link,
type: it.type ?? "",
summary: String(it.summary ?? ""),
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.table(
["Date","From Faction","Type","Summary","Source","Rel","Cred","Tags"],
rows.map(r => [r.date, r.from, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
);
}
```
> Add new entries in the **frontmatter** under `Intel:` (keep newest on top). Suggested fields: `date, type, summary, source, reliability, credibility, tags`.
---
## 🔗 Related NPCs (auto)
```dataview
TABLE link(file.name) AS NPC, number(Level_of_Influence) AS Influence, default(SMH_Acronym, "—") AS SMH
FROM #npc
WHERE file.name != "NPC Template"
AND (
Faction = this.file.link
OR lower(string(Faction)) = lower(this.file.name)
OR contains(lower(string(Faction)), lower(this.file.name))
)
SORT number(Level_of_Influence) DESC
```
---
## 📌 Plot Hooks & Notes
-
-
---
## 🗒 Session Updates
- <% tp.date.now("YYYY-MM-DD") %>: …
+100
View File
@@ -0,0 +1,100 @@
# 🗂 NPC Influence Dashboard
> Scale: 10 … 0 … +10 (0 = Neutral; positive = more influential, negative = less)
---
## 😡 Hostile (10 to 7)
```dataview
TABLE link(file.name) AS NPC, Faction, Level_of_Influence
FROM "NPCs"
WHERE Level_of_Influence <= -7
SORT Level_of_Influence ASC
```
## 😕 Unfriendly (-6 to -1)
```dataview
TABLE link(file.name) AS NPC, Faction, Level_of_Influence
FROM "NPCs"
WHERE Level_of_Influence >= -6 AND Level_of_Influence <= -1
SORT Level_of_Influence ASC
```
## 😐 Neutral (0)
```dataview
TABLE link(file.name) AS NPC, Faction, Level_of_Influence
FROM "NPCs"
WHERE Level_of_Influence = 0
SORT file.name ASC
```
## 🙂 Friendly (+1 to +6)
```dataview
TABLE link(file.name) AS NPC, Faction, Level_of_Influence
FROM "NPCs"
WHERE Level_of_Influence >= 1 AND Level_of_Influence <= 6
SORT Level_of_Influence DESC
```
## 🛡 Allied (+7 to +10)
```dataview
TABLE link(file.name) AS NPC, Faction, Level_of_Influence
FROM "NPCs"
WHERE Level_of_Influence >= 7
SORT Level_of_Influence DESC
```
## 📊 Visual Bands (Emoji + Bipolar Progress Bars)
```dataview
// ===== Settings =====
const FOLDER = "NPCs";
const MAX = 10; // absolute max in either direction
// ===== Helpers =====
const tier = s =>
s === 0 ? "Neutral" :
s < 0 ? (s <= -7 ? "Hostile" : "Unfriendly") :
(s >= 7 ? "Allied" : "Friendly");
const face = s =>
s === 0 ? "😐" :
s < 0 ? (s <= -7 ? "😡" : "😕") :
(s >= 7 ? "🛡️" : "🙂");
// Bipolar bar: [LLLLL|RRRRR]
function bipolarBar(score) {
const leftFilled = Math.min(MAX, Math.max(0, -score));
const rightFilled = Math.min(MAX, Math.max(0, score));
const leftEmpty = MAX - leftFilled;
const rightEmpty = MAX - rightFilled;
const L = "█".repeat(leftFilled) + "░".repeat(leftEmpty);
const R = "█".repeat(rightFilled) + "░".repeat(rightEmpty);
return `[${L}|${R}]`;
}
// ===== Fetch =====
const pages = dv.pages(`"${FOLDER}"`)
.where(p => Number.isFinite(+p.Level_of_Influence))
.map(p => ({
name: p.file.link,
faction: p.Faction ?? "",
score: +p.Level_of_Influence
}));
const groups = {
"😡 Hostile (10 to 7)": pages.filter(p => p.score <= -7).sort((a,b)=>a.score-b.score),
"😕 Unfriendly (6 to 1)": pages.filter(p => p.score >= -6 && p.score <= -1).sort((a,b)=>a.score-b.score),
"😐 Neutral (0)": pages.filter(p => p.score === 0).sort((a,b)=>String(a.name).localeCompare(String(b.name))),
"🙂 Friendly (+1 to +6)": pages.filter(p => p.score >= 1 && p.score <= 6).sort((a,b)=>b.score-a.score),
"🛡 Allied (+7 to +10)": pages.filter(p => p.score >= 7).sort((a,b)=>b.score-a.score),
};
for (const [title, rows] of Object.entries(groups)) {
dv.header(2, title);
if (!rows.length) { dv.paragraph("_None yet._"); continue; }
dv.table(
["NPC", "Faction", "Score", "Bar", "Tier"],
rows.map(r => [r.name, r.faction, r.score, bipolarBar(r.score), `${face(r.score)} ${tier(r.score)}`])
);
}
```
+76
View File
@@ -0,0 +1,76 @@
---
# Influence: -10 (very bad) … 0 (neutral) … +10 (very good)
Level_of_Influence: 0
Faction:
SMH_Acronym: #e.g., "So Much Honor" / "Saints Marching Harbor"
Tags: [npc]
---
# <% tp.file.title %>
*Role/Description — e.g., "Captain of the Guard", "Elven Scholar", "Local Merchant"*
## 🎨 Artwork
![[<% tp.file.title %>.png]]
*Optional caption / alt text*
---
## 🧑 NPC Overview
- **Full Name:**
- **Race / Ancestry:**
- **Gender / Pronouns:**
- **Occupation / Role:**
- **Faction / Allegiance:** <% tp.frontmatter.Faction ?? "" %>
- **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***
- ***Influence Skills***
- ***Weaknesses***
- ***Resistances***
- ***Biases***
---
## 🏛️ Relations & Factions
- **Primary Faction:** [[Faction Name]]
- **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:**
- <% tp.date.now("YYYY-MM-DD") %>: …
---
## 🔗 Connections
- **Related NPCs:**
- [[NPC A]] (Mentor)
- [[NPC B]] (Rival)
- **PC Ties:** (how the party knows them)
Binary file not shown.

After

Width:  |  Height:  |  Size: 825 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 KiB