Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
959332aa64 | ||
|
|
11378bbe85 | ||
|
|
ddb1d073dc | ||
|
|
397ff09451 | ||
|
|
b4aae2aada | ||
|
|
84f06109c8 | ||
|
|
129d15e1aa | ||
|
|
a45e066d49 | ||
|
|
14753738ee | ||
|
|
a789bbca4f | ||
|
|
ab3587f6e8 | ||
|
|
54175b058d | ||
|
|
3dc412d3d7 | ||
|
|
5d60aeb1c5 | ||
|
|
685662c6aa | ||
|
|
eaa495fb2d | ||
|
|
505561aec7 | ||
|
|
0447eb5b8f | ||
|
|
be9ad02eb0 | ||
|
|
cccf030d31 | ||
|
|
28f89a4173 | ||
|
|
b50eb3807f | ||
|
|
b2116ea293 | ||
|
|
fc3f30a619 | ||
|
|
d8db76f9cd | ||
|
|
46b10b9d6a | ||
|
|
c4c765b634 | ||
|
|
eb7cc83e1f | ||
|
|
a2aaad0443 | ||
|
|
061394babd | ||
|
|
e869a5cf8c | ||
|
|
c5ad89f8d1 | ||
|
|
7e1783b9d2 | ||
|
|
18ded7df55 | ||
|
|
c35ec63348 | ||
|
|
0ef1f0959a | ||
|
|
e316b25396 | ||
|
|
a763b98050 | ||
|
|
a94a1ac3f3 | ||
|
|
8c0d9e9288 | ||
|
|
2271321188 | ||
|
|
4f9e1640a3 | ||
|
|
39fa77bb73 | ||
|
|
93705eac97 | ||
|
|
90dc513bf6 | ||
|
|
6b6da98287 | ||
|
|
0b1d50233e | ||
|
|
d0d8e2ca2b | ||
|
|
12e272a517 | ||
|
|
bc579453cd | ||
|
|
9b9469edd3 | ||
|
|
75824a97c9 | ||
|
|
c7870120bf | ||
|
|
ac742bacf2 | ||
|
|
38463bdec2 | ||
|
|
9a6cf36c31 | ||
|
|
b679f8755d | ||
|
|
3a34a8c118 | ||
|
|
844abe6aeb | ||
|
|
4540237ea2 | ||
|
|
010bf15a59 | ||
|
|
d1538a8057 | ||
|
|
b8dcf2cfc1 | ||
|
|
abd30b67fc | ||
|
|
3b074aa58f | ||
|
|
a238055f2a | ||
|
|
9d418d4cc7 | ||
|
|
5efe71e968 | ||
|
|
f8625dae72 | ||
|
|
7aab82cdc6 | ||
|
|
eb815b1409 | ||
|
|
774ecf054c | ||
|
|
3e997b393e | ||
|
|
540fae6ce9 | ||
|
|
44077a08d9 | ||
|
|
d75a87bc78 | ||
|
|
a6a7d0781b | ||
|
|
af8fe9865c | ||
|
|
d68cc513cd | ||
|
|
9b3bdf3599 |
@@ -0,0 +1,217 @@
|
|||||||
|
---
|
||||||
|
Reputation: 5
|
||||||
|
Faction_Type:
|
||||||
|
Motto:
|
||||||
|
Ideology:
|
||||||
|
Symbol:
|
||||||
|
Colors:
|
||||||
|
Headquarters:
|
||||||
|
Territories:
|
||||||
|
-
|
||||||
|
Allies:
|
||||||
|
-
|
||||||
|
Rivals:
|
||||||
|
-
|
||||||
|
SMH_Acronym:
|
||||||
|
Intel:
|
||||||
|
Tags:
|
||||||
|
- faction
|
||||||
|
---
|
||||||
|
|
||||||
|
# Alsatian Soldiers
|
||||||
|
*One-line role/description — e.g., “Elven High House controlling Y’athir’s docks.”*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Alsatian Soldiers.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
|
||||||
|
- 2026-07-01: …
|
||||||
@@ -14,6 +14,20 @@ Rivals:
|
|||||||
-
|
-
|
||||||
SMH_Acronym:
|
SMH_Acronym:
|
||||||
Intel:
|
Intel:
|
||||||
|
- date: 2026-07-01
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Iniana Asase]] mentions that representatives from [[House Evandra]] are visiting with [[House Asase]]. She also does not know anything about the [[House Miiran]] representatives that are in the city; she will however try to find out."
|
||||||
|
source: "[[Iniana Asase]]"
|
||||||
|
reliability: B
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
- date: 2026-02-03
|
||||||
|
type: interaction
|
||||||
|
summary: According to Freddie, those of [[House Asase]] reports to a few different houses in the iupper echelons - tha parents have connections with [[House Evandra]] which they attempt to leverage regularly. It is part of the reason that they're attempting to work around. It is also rumored that the Assase has operations in the Wells - possibly the one that is abducting all of the Halflings. The Eldest Child is more interested in his rules and books to have loyalties to anyone.'
|
||||||
|
source: "[[Freddie]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
- date: 2025-10-08
|
- date: 2025-10-08
|
||||||
type: interaction
|
type: interaction
|
||||||
summary: Says that [[House Asase]] is working to rebuild the walls of the Drenches to keep out the seaspray.
|
summary: Says that [[House Asase]] is working to rebuild the walls of the Drenches to keep out the seaspray.
|
||||||
@@ -48,10 +62,12 @@ Tags:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
# House Asase
|
|
||||||
*One-line role/description — e.g., “Elven High House controlling Y’athir’s docks.”*
|
|
||||||
|
|
||||||
---
|
# House Asase
|
||||||
|
*Child House of [[House Evandra]]*
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 🎨 Artwork
|
## 🎨 Artwork
|
||||||
![[House Asase.png]]
|
![[House Asase.png]]
|
||||||
|
|||||||
@@ -14,6 +14,13 @@ Rivals:
|
|||||||
-
|
-
|
||||||
SMH_Acronym:
|
SMH_Acronym:
|
||||||
Intel:
|
Intel:
|
||||||
|
- date: 2025-11-24
|
||||||
|
type: report
|
||||||
|
summary: "[[Marcellus Magunna]] is an Knight Atache for [[House Elidari]] and is an Archmeister who graduated from the Esoterium"
|
||||||
|
source: "[[Kite]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
- date: 2025-10-02
|
- date: 2025-10-02
|
||||||
type: interaction
|
type: interaction
|
||||||
summary: We're told by [[Fenric Draycott]] that [[House Elidari]] has been threatening to adopt a new chief enforcer.
|
summary: We're told by [[Fenric Draycott]] that [[House Elidari]] has been threatening to adopt a new chief enforcer.
|
||||||
@@ -61,7 +68,7 @@ Tags:
|
|||||||
---
|
---
|
||||||
|
|
||||||
## 🧑💼 Leadership & Structure
|
## 🧑💼 Leadership & Structure
|
||||||
- **Leader(s):** [[NPC A]], [[NPC B]]
|
- **Leader(s):** [[Cormac Elidari]]
|
||||||
- **Structure:** (council, hierarchy, cells, chapters)
|
- **Structure:** (council, hierarchy, cells, chapters)
|
||||||
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
|
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
|
||||||
|
|
||||||
@@ -81,7 +88,8 @@ Tags:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🧠 Intelligence & Mentions
|
## 🧠 Inte
|
||||||
|
lligence & Mentions
|
||||||
```button
|
```button
|
||||||
name ➕ Add Intel
|
name ➕ Add Intel
|
||||||
type command
|
type command
|
||||||
|
|||||||
@@ -14,10 +14,18 @@ Rivals:
|
|||||||
-
|
-
|
||||||
SMH_Acronym:
|
SMH_Acronym:
|
||||||
Intel:
|
Intel:
|
||||||
|
- date: 2026-01-29
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Metternich]] learns that the shipments with the black hooded, red-insignia'ed guys are going through docks that are owned by [[House Tenrae]]."
|
||||||
|
source: "[[Metternich]]"
|
||||||
|
reliability: B
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
Tags:
|
Tags:
|
||||||
- faction
|
- faction
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
# House Tenrae
|
# House Tenrae
|
||||||
*One-line role/description — e.g., “Elven High House controlling Y’athir’s docks.”*
|
*One-line role/description — e.g., “Elven High House controlling Y’athir’s docks.”*
|
||||||
|
|
||||||
@@ -53,7 +61,7 @@ Tags:
|
|||||||
---
|
---
|
||||||
|
|
||||||
## 🧑💼 Leadership & Structure
|
## 🧑💼 Leadership & Structure
|
||||||
- **Leader(s):** [[NPC A]], [[NPC B]]
|
- **Leader(s):** [[Eosaph Tenrae]]
|
||||||
- **Structure:** (council, hierarchy, cells, chapters)
|
- **Structure:** (council, hierarchy, cells, chapters)
|
||||||
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
|
- **Key Offices:** (Intelligence, Logistics, Priory, Treasury, etc.)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,221 @@
|
|||||||
|
---
|
||||||
|
Date: 2025-11-24
|
||||||
|
Session_Name: People of the South Drenches
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
- faction
|
||||||
|
Reputation: 1
|
||||||
|
Faction_Type:
|
||||||
|
Motto:
|
||||||
|
Ideology:
|
||||||
|
Symbol:
|
||||||
|
Colors:
|
||||||
|
Headquarters:
|
||||||
|
Territories:
|
||||||
|
-
|
||||||
|
Allies:
|
||||||
|
-
|
||||||
|
Rivals:
|
||||||
|
-
|
||||||
|
SMH_Acronym:
|
||||||
|
Intel:
|
||||||
|
---
|
||||||
|
|
||||||
|
# People of the South Drenches
|
||||||
|
*One-line role/description — e.g., “Elven High House controlling Y’athir’s docks.”*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[People of the South Drenches.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-11-24: …
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
Reputation: 0
|
Reputation: 8
|
||||||
Faction_Type: Gang
|
Faction_Type: Gang
|
||||||
Motto:
|
Motto:
|
||||||
Ideology: Semi-Communism
|
Ideology: Semi-Communism
|
||||||
@@ -14,6 +14,13 @@ Rivals:
|
|||||||
-
|
-
|
||||||
SMH_Acronym:
|
SMH_Acronym:
|
||||||
Intel:
|
Intel:
|
||||||
|
- date: 2026-02-03
|
||||||
|
type: interaction
|
||||||
|
summary: The [[Thin Wisps]] had agreements with [[House Valrora]] when [[Ilvara Valrora]] was steward.
|
||||||
|
source: "[[Freddie]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
- date: 2025-10-02
|
- date: 2025-10-02
|
||||||
type: interaction
|
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]].
|
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]].
|
||||||
@@ -49,6 +56,7 @@ Tags:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Thin Wisps
|
# Thin Wisps
|
||||||
*Territorial Gang of the Drenches*
|
*Territorial Gang of the Drenches*
|
||||||
|
|
||||||
@@ -73,6 +81,7 @@ Tags:
|
|||||||
- **Ideology / Alignment:** `= default(this.Ideology, "—")`
|
- **Ideology / Alignment:** `= default(this.Ideology, "—")`
|
||||||
- **Primary Goals:**
|
- **Primary Goals:**
|
||||||
- Believe they should be the one's running the drenches
|
- Believe they should be the one's running the drenches
|
||||||
|
- Believe that people who work in the various parts of the city should be running it.
|
||||||
- **Taboos / Anathema:**
|
- **Taboos / Anathema:**
|
||||||
-
|
-
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,217 @@
|
|||||||
|
---
|
||||||
|
Reputation: 1
|
||||||
|
Faction_Type:
|
||||||
|
Motto:
|
||||||
|
Ideology:
|
||||||
|
Symbol:
|
||||||
|
Colors:
|
||||||
|
Headquarters:
|
||||||
|
Territories:
|
||||||
|
-
|
||||||
|
Allies:
|
||||||
|
-
|
||||||
|
Rivals:
|
||||||
|
-
|
||||||
|
SMH_Acronym:
|
||||||
|
Intel:
|
||||||
|
Tags:
|
||||||
|
- faction
|
||||||
|
---
|
||||||
|
|
||||||
|
# Whitewater Civilians
|
||||||
|
*One-line role/description — e.g., “Elven High House controlling Y’athir’s docks.”*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Whitewater Civilians.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
|
||||||
|
- 2026-07-22: …
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
---
|
---
|
||||||
Level_of_Influence: 3
|
Level_of_Influence: 4
|
||||||
Faction: "[[The Archmasons]]"
|
Faction: "[[The Archmasons]]"
|
||||||
Tags:
|
Tags:
|
||||||
- npc
|
- npc
|
||||||
Intel:
|
Intel:
|
||||||
|
Knows About HQ: "False"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Amity Cornwallis
|
# Amity Cornwallis
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ Faction:
|
|||||||
SMH_Acronym: Sandwich Mountain Harpoon
|
SMH_Acronym: Sandwich Mountain Harpoon
|
||||||
Tags:
|
Tags:
|
||||||
- npc
|
- npc
|
||||||
|
Knows About HQ: "False"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Atmaka Sayin
|
# Atmaka Sayin
|
||||||
|
|||||||
@@ -0,0 +1,214 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 6
|
||||||
|
Faction: "[[House Asase]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2025-12-10
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Nuala Elidari]] extends an offer of adoption to [[Faylen Valrora]] into [[House Elidari]], under the stewardship of [[Avas Assase]], as well as a position as Meister under him."
|
||||||
|
session: "[[Session 13 - Summer Solistice Pt. 2]]"
|
||||||
|
source: "[[Nuala Elidari]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
- date: 2025-12-03
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Avas Assase]] expressed an interest in doing good for the lower portion of the city, and expressed thankfulness for the help with [[Iniana Asase|Iniana's]] Soup Kitchen."
|
||||||
|
session: "[[Session 12 - Summer Solistice Pt. 1]]"
|
||||||
|
source: "[[Avas Assase]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
- date: 2025-12-03
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Avas Assase]] served a stint at the Esoterium."
|
||||||
|
session: "[[Session 12 - Summer Solistice Pt. 1]]"
|
||||||
|
source: "[[Avas Assase]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Avas Assase
|
||||||
|
*Archmeister of Y'athyr*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Avas Assase.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Avas Assase
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:** He/Him
|
||||||
|
- **Occupation / Role:** Archmeister (Akin to Advisor, also deal with Administrative Duties on behalf of the Steward of the City. [[Kite]] also knows that the Archmeister mediates councils of each interest group in the city)
|
||||||
|
- **Faction / Allegiance:** [[House Asase]]
|
||||||
|
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||||||
|
- **Notable Traits:** (quirks, mannerisms, appearance)
|
||||||
|
- **First Impression:** (how the party perceives them)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Relationship with Party
|
||||||
|
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||||||
|
- **Notes on Influence:** (what actions improve/worsen standing)
|
||||||
|
- ***Discovery Skills***
|
||||||
|
- DC 15 Genealogy Lore
|
||||||
|
- DC 18 Society
|
||||||
|
- DC 18 Arcana, Religion, Occultism and Nature
|
||||||
|
- DC 20 Perception
|
||||||
|
- ***Influence Skills***
|
||||||
|
- DC 15 Valentia Lore
|
||||||
|
- DC 18 Y’athyr Lore
|
||||||
|
- DC 18 Arcana
|
||||||
|
- DC 18 Occultism
|
||||||
|
- DC 20 Religion
|
||||||
|
- DC 20 Nature
|
||||||
|
- DC 22 Diplomacy
|
||||||
|
- DC 22 Intimidation
|
||||||
|
- ***Weaknesses***
|
||||||
|
- Offering a story of magical nature reduces the Influence DC by 4.
|
||||||
|
- ***Resistances***
|
||||||
|
- Referring to him as anything other than "Archmeister Assase" increases the Influence DC by 4
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[House Asase]]
|
||||||
|
- **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-12-02: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[Iniana Asase]] (Daughter)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -1,9 +1,19 @@
|
|||||||
---
|
---
|
||||||
Level_of_Influence: 0
|
Level_of_Influence: 3
|
||||||
Faction: "[[House Noctilun]]"
|
Faction: "[[House Noctilun]]"
|
||||||
SMH_Acronym:
|
SMH_Acronym:
|
||||||
Tags:
|
Tags:
|
||||||
- npc
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2026-04-16
|
||||||
|
type: report
|
||||||
|
summary: It doesn't seem a coincidence that someone's mother who is now working for the Grand Hall dissapeared in connection with something at the Esoterium. There is a working connection between the Figment Grand Hall and The Esoterium - though [[Calia Noctinuln]] is not aware of the extent. The Esoterium is often leaned on for larger than life expression during their performances. And many of the senior staff at the Grand Hall meet with some regularity with the Esoterium to discuss how they might assist.
|
||||||
|
session: "[[Session 27 - A Many Tentacled Problem]]"
|
||||||
|
source: "[[Calia Noctilun]]"
|
||||||
|
reliability: B
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Calia Noctilun
|
# Calia Noctilun
|
||||||
@@ -19,7 +29,7 @@ Tags:
|
|||||||
- **Full Name:** [[Calia Noctilun]]
|
- **Full Name:** [[Calia Noctilun]]
|
||||||
- **Race / Ancestry:** Elf
|
- **Race / Ancestry:** Elf
|
||||||
- **Gender / Pronouns:** She/Her
|
- **Gender / Pronouns:** She/Her
|
||||||
- **Occupation / Role:** Talent Scout
|
- **Occupation / Role:** Talent Scout at the Figment Grand Hall
|
||||||
- **Faction / Allegiance:** [[House Noctilun]]
|
- **Faction / Allegiance:** [[House Noctilun]]
|
||||||
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||||||
- **Notable Traits:** (quirks, mannerisms, appearance)
|
- **Notable Traits:** (quirks, mannerisms, appearance)
|
||||||
@@ -31,7 +41,17 @@ Tags:
|
|||||||
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||||||
- **Notes on Influence:** (what actions improve/worsen standing)
|
- **Notes on Influence:** (what actions improve/worsen standing)
|
||||||
- ***Discovery Skills***
|
- ***Discovery Skills***
|
||||||
|
- DC 15 Theater Lore
|
||||||
|
- DC 18 Crafting
|
||||||
|
- DC 18 Performance
|
||||||
|
- DC 20 Perception
|
||||||
- ***Influence Skills***
|
- ***Influence Skills***
|
||||||
|
- DC 18 Singing Lore
|
||||||
|
- DC 18 Occultism
|
||||||
|
- DC 18 Performance
|
||||||
|
- DC 20 Acrobatics
|
||||||
|
- DC 20 Diplomacy
|
||||||
|
- DC 22 Intimidation
|
||||||
- ***Weaknesses***
|
- ***Weaknesses***
|
||||||
- ***Resistances***
|
- ***Resistances***
|
||||||
- ***Biases***
|
- ***Biases***
|
||||||
|
|||||||
@@ -0,0 +1,201 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 4
|
||||||
|
Faction: "[[Thin Wisps]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2026-01-07
|
||||||
|
type: interaction
|
||||||
|
summary: Works in a warehouse near warehouse row.
|
||||||
|
session: "[[Session 16 - A Meeting of Consequence]]"
|
||||||
|
source: "[[Maltrix]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
- date: 2026-01-07
|
||||||
|
type: rumor
|
||||||
|
summary: "[[Maltrix]] referred us to [[Celoisa]] as a sort-of recruiter for the [[Thin Wisps]]"
|
||||||
|
session: "[[People of the South Drenches]]"
|
||||||
|
source: "[[Maltrix]]"
|
||||||
|
reliability: B
|
||||||
|
credibility: 4
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "True"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Celosia
|
||||||
|
*Role/Description — e.g., "Captain of the Guard", "Elven Scholar", "Local Merchant"*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Celosia.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Celosia
|
||||||
|
- **Race / Ancestry:** Elf ((Grey Skinned, with Horns))
|
||||||
|
- **Gender / Pronouns:**
|
||||||
|
- **Occupation / Role:** Painter/Recruiter
|
||||||
|
- **Faction / Allegiance:** [[Thin Wisps]]
|
||||||
|
- **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***
|
||||||
|
- DC 14 Mercantile Lore
|
||||||
|
- DC 17 Thievery
|
||||||
|
- DC 19 Acrobatics
|
||||||
|
- DC 19 Society
|
||||||
|
- DC 21 Diplomacy
|
||||||
|
- DC 21 Deception
|
||||||
|
- DC 24 Intimidation
|
||||||
|
- ***Weaknesses***
|
||||||
|
- Working towards a more stable future for her and her sisters. Trying to introduce stability to Y’athyr.
|
||||||
|
- ***Resistances***
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[Thin Wisps]]
|
||||||
|
- **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:**
|
||||||
|
- 2026-01-07: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,195 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 2
|
||||||
|
Faction: "[[House Elidari]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2026-04-02
|
||||||
|
type: interaction
|
||||||
|
summary: Known Practioner of the Entire Elven Pantheon according [[Morthwyl Griffith]]
|
||||||
|
session: "[[Session 25 - A Whole Investigation]]"
|
||||||
|
source: "[[Morthwyl Griffith]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# Cormac Elidari
|
||||||
|
*Overseer of the Y'athyr City Guard, Steward of Y'athyr
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Cormac Elidari.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Cormac Elidari
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:** Male, He/Him
|
||||||
|
- **Occupation / Role:** Overseer of the City Guard, Steward of Y'ahtyr
|
||||||
|
- **Faction / Allegiance:** [[House Elidari]]
|
||||||
|
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||||||
|
- **Notable Traits:** (quirks, mannerisms, appearance)
|
||||||
|
- **First Impression:** (how the party perceives them)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Relationship with Party
|
||||||
|
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||||||
|
- **Notes on Influence:** (what actions improve/worsen standing)
|
||||||
|
- ***Discovery Skills***
|
||||||
|
- DC 15 Legal Lore
|
||||||
|
- DC 18 Society
|
||||||
|
- DC 18 Diplomacy
|
||||||
|
- DC 20 Perception
|
||||||
|
- ***Influence Skills***
|
||||||
|
- DC 22 Athletics
|
||||||
|
- DC 22 Arcana
|
||||||
|
- DC 22 Deception
|
||||||
|
- DC 25 Intimidation
|
||||||
|
- ***Weaknesses***
|
||||||
|
- ***Resistances***
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[House Elidari]]
|
||||||
|
- **Allied Factions:** [[Faction A]], [[Faction B]]
|
||||||
|
- **Rival Factions:** [[Faction C]]
|
||||||
|
- **Personal Enemies / Allies:** [[NPC or PC]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📖 History & Background
|
||||||
|
- **Origin / Past:**
|
||||||
|
- **Known Motivations:**
|
||||||
|
- **Secrets / Rumors:**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 Roleplay Notes
|
||||||
|
- **Personality:** (e.g., stern, practical, loyal)
|
||||||
|
- **Speech Style / Quirks:** (catchphrases, accent, tics)
|
||||||
|
- **Appearance Details:** (clothing, scars, distinguishing features)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗺️ Miscellaneous
|
||||||
|
- **Current Location:**
|
||||||
|
- **Important Items / Assets:**
|
||||||
|
- **Plot Hooks / Ties to PCs:**
|
||||||
|
- **Session Notes / Updates:**
|
||||||
|
- 2025-11-24: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[Nuala Elidari]] (Wife)
|
||||||
|
- [[Onora Elidari]] (Daughter)
|
||||||
|
- [[Ronan Elidari]] (Son)
|
||||||
|
- [[Kerrian Calil]] (Soon to be Son-in-law)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -13,6 +13,7 @@ Intel:
|
|||||||
reliability: A
|
reliability: A
|
||||||
credibility: 5
|
credibility: 5
|
||||||
tags: []
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Deidre Gille
|
# Deidre Gille
|
||||||
|
|||||||
@@ -0,0 +1,175 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 0
|
||||||
|
Faction: "[[House Valrora]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Elowen Valrora
|
||||||
|
*Gifted Healer, Kindest of the Valrora Family*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Elowen Valrora.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Elowen Valrora
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:** She/Her
|
||||||
|
- **Occupation / Role:** Gifted Healer, Operates from the Shrine of Alseta
|
||||||
|
- **Faction / Allegiance:** [[House Valrora]]
|
||||||
|
- **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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[House Valrora]]
|
||||||
|
- **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-12-03: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -1,10 +1,12 @@
|
|||||||
---
|
---
|
||||||
Level_of_Influence: 4
|
Level_of_Influence: 6
|
||||||
Faction:
|
Faction:
|
||||||
Tags:
|
Tags:
|
||||||
- npc
|
- npc
|
||||||
|
Knows About HQ: "False"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
# Elthea Rinvale
|
# Elthea Rinvale
|
||||||
*Diplomatic Intermediary*
|
*Diplomatic Intermediary*
|
||||||
|
|
||||||
@@ -34,9 +36,13 @@ Tags:
|
|||||||
- DC 17 Society
|
- DC 17 Society
|
||||||
- DC 19 Perception
|
- DC 19 Perception
|
||||||
- ***Influence Skills***
|
- ***Influence Skills***
|
||||||
- DC 24 Deception
|
- DC 14 Trackless Lore
|
||||||
- DC 21 Intimidation
|
- DC 17 Nature (discussing the terrain and its effects on cultural differences)
|
||||||
|
- DC 17 Acrobatics/Athletics
|
||||||
- DC 19 Diplomacy
|
- DC 19 Diplomacy
|
||||||
|
- DC 19 Religion
|
||||||
|
- DC 21 Intimidation
|
||||||
|
- DC 24 Deception
|
||||||
- ***Weaknesses***
|
- ***Weaknesses***
|
||||||
- Most happy when offered fresh drink/food. Reduces Influence DC by 2.
|
- Most happy when offered fresh drink/food. Reduces Influence DC by 2.
|
||||||
- ***Resistances***
|
- ***Resistances***
|
||||||
|
|||||||
@@ -0,0 +1,186 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 2
|
||||||
|
Faction: "[[House Tenrae]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Eosaf Tenrae
|
||||||
|
*Admiral of the Navy, Head of House Tenrae*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Eosaph Tenrae.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Eosaph Tenrae
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:** Male, He/Him
|
||||||
|
- **Occupation / Role:** Admiral of the Navy
|
||||||
|
- **Faction / Allegiance:** [[House Tenrae]]
|
||||||
|
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||||||
|
- **Notable Traits:** (quirks, mannerisms, appearance)
|
||||||
|
- **First Impression:** (how the party perceives them)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Relationship with Party
|
||||||
|
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||||||
|
- **Notes on Influence:** (what actions improve/worsen standing)
|
||||||
|
- ***Discovery Skills***
|
||||||
|
- DC 15 Sailing Lore
|
||||||
|
- DC 18 Society
|
||||||
|
- DC 18 Y'athyr Lore
|
||||||
|
- DC 20 Perception
|
||||||
|
- ***Influence Skills***
|
||||||
|
- DC 18 Valentia Lore
|
||||||
|
- DC 18 Arcana
|
||||||
|
- DC 18 Athletics
|
||||||
|
- DC 20 Society
|
||||||
|
- DC 22 Diplomacy
|
||||||
|
- DC 22 Performance
|
||||||
|
- ***Weaknesses***
|
||||||
|
- Expressing an interest and discussing the city's reconstruction efforts, as well as Valentia reduces the influence DC by 4.
|
||||||
|
- ***Resistances***
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[House Tenrae]]
|
||||||
|
- **Allied Factions:** [[Faction A]], [[Faction B]]
|
||||||
|
- **Rival Factions:** [[Faction C]]
|
||||||
|
- **Personal Enemies / Allies:** [[NPC or PC]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📖 History & Background
|
||||||
|
- **Origin / Past:**
|
||||||
|
- **Known Motivations:**
|
||||||
|
- **Secrets / Rumors:**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 Roleplay Notes
|
||||||
|
- **Personality:** (e.g., stern, practical, loyal)
|
||||||
|
- **Speech Style / Quirks:** (catchphrases, accent, tics)
|
||||||
|
- **Appearance Details:** (clothing, scars, distinguishing features)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗺️ Miscellaneous
|
||||||
|
- **Current Location:**
|
||||||
|
- **Important Items / Assets:**
|
||||||
|
- **Plot Hooks / Ties to PCs:**
|
||||||
|
- **Session Notes / Updates:**
|
||||||
|
- 2025-11-24: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -1,13 +1,24 @@
|
|||||||
---
|
---
|
||||||
Level_of_Influence: 0
|
Level_of_Influence: 13
|
||||||
Faction: "[[Draycott Family]]"
|
Faction: "[[Draycott Family]]"
|
||||||
SMH_Acronym:
|
SMH_Acronym:
|
||||||
Tags:
|
Tags:
|
||||||
- npc
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2025-12-03
|
||||||
|
type: interaction
|
||||||
|
summary: Wrecked a Schooner known as the Midnight Silver
|
||||||
|
session: "[[Session 12 - Summer Solistice Pt. 1]]"
|
||||||
|
source: "[[Fenric Draycott]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "True"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
# Fenric Draycott
|
# Fenric Draycott
|
||||||
*Role/Description — e.g., "Captain of the Guard", "Elven Scholar", "Local Merchant"*
|
*Accountant and Merchant*
|
||||||
|
|
||||||
## 🎨 Artwork
|
## 🎨 Artwork
|
||||||
![[Fenric Draycott.png]]
|
![[Fenric Draycott.png]]
|
||||||
@@ -17,9 +28,9 @@ Tags:
|
|||||||
|
|
||||||
## 🧑 NPC Overview
|
## 🧑 NPC Overview
|
||||||
- **Full Name:** Fenric Draycott
|
- **Full Name:** Fenric Draycott
|
||||||
- **Race / Ancestry:**
|
- **Race / Ancestry:** Human
|
||||||
- **Gender / Pronouns:** He/Him
|
- **Gender / Pronouns:** He/Him
|
||||||
- **Occupation / Role:**
|
- **Occupation / Role:** Accountant and Merchant
|
||||||
- **Faction / Allegiance:**
|
- **Faction / Allegiance:**
|
||||||
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||||||
- **Notable Traits:** (quirks, mannerisms, appearance)
|
- **Notable Traits:** (quirks, mannerisms, appearance)
|
||||||
@@ -31,9 +42,21 @@ Tags:
|
|||||||
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||||||
- **Notes on Influence:** (what actions improve/worsen standing)
|
- **Notes on Influence:** (what actions improve/worsen standing)
|
||||||
- ***Discovery Skills***
|
- ***Discovery Skills***
|
||||||
|
- DC 15 Nobility Lore
|
||||||
|
- DC 18 Diplomacy
|
||||||
|
- DC 18 Crafting
|
||||||
|
- DC 20 Perception
|
||||||
- ***Influence Skills***
|
- ***Influence Skills***
|
||||||
|
- DC 15 Mercantile Lore
|
||||||
|
- DC 18 Thievery
|
||||||
|
- DC 18 Society
|
||||||
|
- DC 20 Crafting
|
||||||
|
- DC 20 Diplomacy
|
||||||
|
- DC 22 Deception
|
||||||
- ***Weaknesses***
|
- ***Weaknesses***
|
||||||
|
- Acting as [[Fenric Draycott|Fenric's]] wingman or helping him enable some sort of snafu reduces the influence DC by 2.
|
||||||
- ***Resistances***
|
- ***Resistances***
|
||||||
|
- Treating [[Fenric Draycott]] as a lesser due to his station increases the checks DC by 2.
|
||||||
- ***Biases***
|
- ***Biases***
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -138,7 +161,7 @@ action Templater: Insert Add Intel Entry to NPC
|
|||||||
|
|
||||||
## 🏛️ Relations & Factions
|
## 🏛️ Relations & Factions
|
||||||
- **Primary Faction:** [[Draycott Family]]
|
- **Primary Faction:** [[Draycott Family]]
|
||||||
- **Allied Factions:** [[House Valora]]
|
- **Allied Factions:** [[House Valrora]]
|
||||||
- **Rival Factions:** [[Faction C]]
|
- **Rival Factions:** [[Faction C]]
|
||||||
- **Personal Enemies / Allies:** [[Faylen Valora]] --Ally
|
- **Personal Enemies / Allies:** [[Faylen Valora]] --Ally
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,175 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 4
|
||||||
|
Faction: "[[Thin Wisps]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "True"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Freddie
|
||||||
|
**Thin Wisp Talent Acquisition**
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Freddy.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:**
|
||||||
|
- **Race / Ancestry:** Human
|
||||||
|
- **Gender / Pronouns:**
|
||||||
|
- **Occupation / Role:** Intel
|
||||||
|
- **Faction / Allegiance:** [[Thin Wisps]]
|
||||||
|
- **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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[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:**
|
||||||
|
- 2026-02-03: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,192 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 0
|
||||||
|
Faction: "[[The Archmasons]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2026-07-08
|
||||||
|
type: op
|
||||||
|
summary: While infiltrating the Arch, we find out that [[Fritch]] has been working on the dig under the Arch - currently serving as a Dig Leader for the day we do our infiltration. We're currently not sure how he managed to end up down here, but it's plausible to assume that he got drafted down here in the shakeup of Whitewater.
|
||||||
|
session: "[[Session 33 - Infiltration of the Arch]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
- date: 2026-01-07
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Metternich]] tells [[Fritch]] that [[House Elidari]] plans to supplant [[The Archmasons]]. [[Metternich]] says that he doesn't ask for anything in return at the moment, but asks for an opportunity to solve problems."
|
||||||
|
session: "[[Session 16 - A Meeting of Consequence]]"
|
||||||
|
source: "[[Fritch]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Fritch
|
||||||
|
*Role/Description — e.g., "Captain of the Guard", "Elven Scholar", "Local Merchant"*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Fritch.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Fritch
|
||||||
|
- **Race / Ancestry:** Halfling
|
||||||
|
- **Gender / Pronouns:**
|
||||||
|
- **Occupation / Role:** Information Broker for [[The Archmasons]]
|
||||||
|
- **Faction / Allegiance:** [[The Archmasons]]
|
||||||
|
- **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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[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:**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 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:**
|
||||||
|
- 2026-01-07: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,195 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 5
|
||||||
|
Faction:
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2026-04-08
|
||||||
|
type: interaction
|
||||||
|
summary: The Alsatian Shaman warns that Halwyn is a suspect in an event that ended with several crew members of the ship being strung up by their entrails.
|
||||||
|
session: "[[Session 24 - Wells Investigation Pt. 4]]"
|
||||||
|
reliability: B
|
||||||
|
credibility: 4
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "True"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Halwyn
|
||||||
|
*Just a 'lil guy*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Halwyn.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Halwyn
|
||||||
|
- **Race / Ancestry:** Human
|
||||||
|
- **Gender / Pronouns:** Male (He/Him)
|
||||||
|
- **Occupation / Role:**
|
||||||
|
- **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***
|
||||||
|
- Nature (easy)
|
||||||
|
- Performance (normal)
|
||||||
|
- Perception (normal)
|
||||||
|
- Society (hard)
|
||||||
|
- ***Influence Skills***
|
||||||
|
- DC 15 Scribing Lore
|
||||||
|
- DC 18 Thievery
|
||||||
|
- DC 18 Nature
|
||||||
|
- DC 20 Performance
|
||||||
|
- DC 20 Diplomacy
|
||||||
|
- DC 22 Deception
|
||||||
|
- ***Weaknesses***
|
||||||
|
- Being genuinely kind or caring towards him, or offering to help with his administrative duties reduces the DC by 4.
|
||||||
|
- ***Resistances***
|
||||||
|
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[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:**
|
||||||
|
- 2026-04-02: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,213 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 9
|
||||||
|
Faction: "[[House Valrora]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2025-12-22
|
||||||
|
type: rumor
|
||||||
|
summary: "[[Calen]] notices that [[Ilvara Valrora]] seems to be carrying some internalized guilt about the state of the city."
|
||||||
|
session: "[[Session 15 - Summer Solstice Aftermath]]"
|
||||||
|
source: "[[Calen]]"
|
||||||
|
reliability: B
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
- date: 2025-12-10
|
||||||
|
type: report
|
||||||
|
summary: "[[Katarin Calil]], [[Onora Elidari]] and [[Lord Ellin Vaust]] do not applaud a toast that [[Nuala Elidari]] offers to the previous Steward, [[Ilvara Valrora]]"
|
||||||
|
session: "[[Session 13 - Summer Solistice Pt. 2]]"
|
||||||
|
source: Perception Check
|
||||||
|
reliability: B
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
- date: 2025-12-03
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Ilvara Valrora]] expresses that she has been keeping up with what the party has been up to at the point of the Masquerade, but she doesn't approve of our actions thus far."
|
||||||
|
session: "[[Session 12 - Summer Solistice Pt. 1]]"
|
||||||
|
source: "[[Ilvara Valrora]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Ilvara Valrora
|
||||||
|
*Former Master of Coin and Steward of Y'athyr*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Ilvara Valrora.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Ilvara Valrora
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:** She/Her
|
||||||
|
- **Occupation / Role:** Former Master of Coin for Y'athyr and Former Steward
|
||||||
|
- **Faction / Allegiance:** [[House Valrora]]
|
||||||
|
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||||||
|
- **Notable Traits:** (quirks, mannerisms, appearance)
|
||||||
|
- **First Impression:** (how the party perceives them)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Relationship with Party
|
||||||
|
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||||||
|
- **Notes on Influence:** (what actions improve/worsen standing)
|
||||||
|
- ***Discovery Skills***
|
||||||
|
- DC 15 Gaming Lore
|
||||||
|
- DC 18 Diplomacy
|
||||||
|
- DC 18 Society
|
||||||
|
- DC 20 Perception
|
||||||
|
- ***Influence Skills***
|
||||||
|
- DC 20 Arcana
|
||||||
|
- DC 20 Diplomacy
|
||||||
|
- DC 22 Deception
|
||||||
|
- ***Weaknesses***
|
||||||
|
- Acting with proper etiquette and manners reduces the Influence DC by 2.
|
||||||
|
- ***Resistances***
|
||||||
|
- Discussing topics that would disrupt the status quo of the city increases the check's DC by 2.
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[House Valrora]]
|
||||||
|
- **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-12-02: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:**
|
||||||
|
- [[Faylen Valora]] (Daughter)
|
||||||
|
|
||||||
@@ -1,12 +1,22 @@
|
|||||||
---
|
---
|
||||||
Level_of_Influence: 6
|
Level_of_Influence: 18
|
||||||
Faction: "[[House Asase]]"
|
Faction: "[[House Asase]]"
|
||||||
Tags:
|
Tags:
|
||||||
- npc
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2025-12-10
|
||||||
|
type: interaction
|
||||||
|
summary: In a conversation with [[Iniana Assase]] and [[Fenric Draycott]], [[Iniana Assase]] says that there has been an illness/disease spreading through the Drenches.
|
||||||
|
session: "[[Session 13 - Summer Solistice Pt. 2]]"
|
||||||
|
source: "[[Iniana Asase]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: Partial
|
||||||
---
|
---
|
||||||
|
|
||||||
# Iniana Asase
|
# Iniana Asase
|
||||||
*Daughter of [[House Asase]]*
|
*Daughter of [[House Asase]], Philanthropist and Proprietor of Soup Kitchen*
|
||||||
|
|
||||||
## 🎨 Artwork
|
## 🎨 Artwork
|
||||||
![[Iniana Asase.png]]
|
![[Iniana Asase.png]]
|
||||||
|
|||||||
@@ -0,0 +1,177 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 1
|
||||||
|
Faction: "[[House Calil]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Katarin Calil
|
||||||
|
*Fashionista, Head of House Calil*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Katarin Calil.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Katarin Calil
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:** Female, She/Her
|
||||||
|
- **Occupation / Role:** Fashionista
|
||||||
|
- **Faction / Allegiance:** [[House Calil]]
|
||||||
|
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||||||
|
- **Notable Traits:** (quirks, mannerisms, appearance)
|
||||||
|
- **First Impression:** (how the party perceives them)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Relationship with Party
|
||||||
|
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||||||
|
- **Notes on Influence:** (what actions improve/worsen standing)
|
||||||
|
- ***Discovery Skills***
|
||||||
|
- DC 15 Fashion Lore
|
||||||
|
- DC 18 Crafting Lore
|
||||||
|
- DC 18 Diplomacy
|
||||||
|
- DC 20 Perception
|
||||||
|
- ***Influence Skills***
|
||||||
|
- ***Weaknesses***
|
||||||
|
- ***Resistances***
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[House Calil]]
|
||||||
|
- **Allied Factions:** [[Faction A]], [[Faction B]]
|
||||||
|
- **Rival Factions:** [[Faction C]]
|
||||||
|
- **Personal Enemies / Allies:** [[NPC or PC]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📖 History & Background
|
||||||
|
- **Origin / Past:**
|
||||||
|
- **Known Motivations:**
|
||||||
|
- **Secrets / Rumors:**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 Roleplay Notes
|
||||||
|
- **Personality:** (e.g., stern, practical, loyal)
|
||||||
|
- **Speech Style / Quirks:** (catchphrases, accent, tics)
|
||||||
|
- **Appearance Details:** (clothing, scars, distinguishing features)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗺️ Miscellaneous
|
||||||
|
- **Current Location:**
|
||||||
|
- **Important Items / Assets:**
|
||||||
|
- **Plot Hooks / Ties to PCs:**
|
||||||
|
- **Session Notes / Updates:**
|
||||||
|
- 2025-11-24: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,191 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 2
|
||||||
|
Faction: "[[House Calil]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2025-12-10
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Kerrian Calil]] is a writer of books that his father doesn't approve of."
|
||||||
|
session: "[[Session 13 - Summer Solistice Pt. 2]]"
|
||||||
|
source: "[[Onora Elidari]]"
|
||||||
|
reliability: B
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
a
|
||||||
|
# Kerrian Calil
|
||||||
|
*Role/Description — e.g., "Captain of the Guard", "Elven Scholar", "Local Merchant"*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Kerrian Calil.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Kerrian Calil
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:** He/Him
|
||||||
|
- **Occupation / Role:**
|
||||||
|
- **Faction / Allegiance:** [[House Calil]]
|
||||||
|
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||||||
|
- **Notable Traits:** (quirks, mannerisms, appearance)
|
||||||
|
- **First Impression:** (how the party perceives them)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Relationship with Party
|
||||||
|
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||||||
|
- **Notes on Influence:** (what actions improve/worsen standing)
|
||||||
|
- ***Discovery Skills***
|
||||||
|
- DC 15 Trade Lore
|
||||||
|
- DC 18 Crafting
|
||||||
|
- DC 18 Nature
|
||||||
|
- DC 20 Perception
|
||||||
|
- ***Influence Skills***
|
||||||
|
- ***Weaknesses***
|
||||||
|
- Discussing gossip and other interpersonal drama reduces the Influence DC by 2.
|
||||||
|
- ***Resistances***
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[House Calil]]
|
||||||
|
- **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-12-02: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- Oldest Son of [[House Calil]] and [[Katarin Calil]]
|
||||||
|
- Formerly Engaged to [[Mae Valrora]]
|
||||||
|
- Engaged to: [[Onora Elidari]]
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,182 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 1
|
||||||
|
Faction: "[[House Tenrae]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Man in the White Mask
|
||||||
|
*Role/Description — e.g., "Captain of the Guard", "Elven Scholar", "Local Merchant"*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Khail Orvannis.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Khail Orvannis
|
||||||
|
- **Race / Ancestry:**
|
||||||
|
- **Gender / Pronouns:** He/Him
|
||||||
|
- **Occupation / Role:** Marshall, Personal Guard of [[Eosaph Tenrae]]
|
||||||
|
- **Faction / Allegiance:** [[House Tenrae]]
|
||||||
|
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||||||
|
- **Notable Traits:** (quirks, mannerisms, appearance)
|
||||||
|
- **First Impression:** (how the party perceives them)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Relationship with Party
|
||||||
|
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||||||
|
- **Notes on Influence:** (what actions improve/worsen standing)
|
||||||
|
- ***Discovery Skills***
|
||||||
|
- DC 15 Warfare Lore
|
||||||
|
- DC 18 Society
|
||||||
|
- DC 18 Intimidation
|
||||||
|
- DC 20 Perception
|
||||||
|
- ***Influence Skills***
|
||||||
|
- DC 20 Deception
|
||||||
|
- DC 22 Diplomacy
|
||||||
|
- DC 22 Intimidation
|
||||||
|
- ***Weaknesses***
|
||||||
|
- ***Resistances***
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[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-12-10: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,175 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 2
|
||||||
|
Faction: "[[Thin Wisps]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "True"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Kleadora
|
||||||
|
*Role/Description — e.g., "Captain of the Guard", "Elven Scholar", "Local Merchant"*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Kleadora.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:**
|
||||||
|
- **Race / Ancestry:** Elf ((Grey Skinned, with Horns))
|
||||||
|
- **Gender / Pronouns:**
|
||||||
|
- **Occupation / Role:** Thief
|
||||||
|
- **Faction / Allegiance:** [[Thin Wisps]]
|
||||||
|
- **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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[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:**
|
||||||
|
- 2026-02-03: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -4,6 +4,7 @@ Faction:
|
|||||||
Tags:
|
Tags:
|
||||||
- npc
|
- npc
|
||||||
Intel:
|
Intel:
|
||||||
|
Knows About HQ: "False"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,21 @@
|
|||||||
---
|
---
|
||||||
Level_of_Influence: 2
|
Level_of_Influence: 10
|
||||||
Faction:
|
Faction:
|
||||||
SMH_Acronym: Synchronized Mushroom Hiccup
|
SMH_Acronym: Synchronized Mushroom Hiccup
|
||||||
Tags:
|
Tags:
|
||||||
- npc
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2025-12-03
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Lord Ellin Vaust]] conceals a blade inside the cane he walks with."
|
||||||
|
session: "[[Session 12 - Summer Solistice Pt. 1]]"
|
||||||
|
source: "[[Lord Ellin Vaust]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "True"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
# Lord Ellin Vaust
|
# Lord Ellin Vaust
|
||||||
*Local Merchant*
|
*Local Merchant*
|
||||||
|
|
||||||
@@ -18,7 +27,7 @@ Tags:
|
|||||||
|
|
||||||
## 🧑 NPC Overview
|
## 🧑 NPC Overview
|
||||||
- **Full Name:** Ellin Vaust
|
- **Full Name:** Ellin Vaust
|
||||||
- **Race / Ancestry:** Elf
|
- **Race / Ancestry:** Half-Elf
|
||||||
- **Gender / Pronouns:** He/Him
|
- **Gender / Pronouns:** He/Him
|
||||||
- **Occupation / Role:** Merchant
|
- **Occupation / Role:** Merchant
|
||||||
- **Faction / Allegiance:**
|
- **Faction / Allegiance:**
|
||||||
@@ -33,7 +42,16 @@ Tags:
|
|||||||
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||||||
- **Notes on Influence:** (what actions improve/worsen standing)
|
- **Notes on Influence:** (what actions improve/worsen standing)
|
||||||
- ***Discovery Skills***
|
- ***Discovery Skills***
|
||||||
|
- DC 15 Mercantile Lore/Labor Lore
|
||||||
|
- DC 18 Society
|
||||||
|
- DC 18 Diplomacy
|
||||||
|
- DC 20 Perception
|
||||||
- ***Influence Skills***
|
- ***Influence Skills***
|
||||||
|
- DC 15 Mercantile Lore
|
||||||
|
- DC 18 Society
|
||||||
|
- DC 20 Performance
|
||||||
|
- DC 22 Diplomacy
|
||||||
|
- DC 22 Intimidation
|
||||||
- ***Weaknesses***
|
- ***Weaknesses***
|
||||||
- ***Resistances***
|
- ***Resistances***
|
||||||
- ***Biases***
|
- ***Biases***
|
||||||
|
|||||||
@@ -0,0 +1,175 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 2
|
||||||
|
Faction:
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Lorena Neurath
|
||||||
|
*Head of Lorena Neurath's Company of Guards*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Lorena Neurath.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Lorena Neurath
|
||||||
|
- **Race / Ancestry:** Human
|
||||||
|
- **Gender / Pronouns:** She/Her
|
||||||
|
- **Occupation / Role:** Guard Leader
|
||||||
|
- **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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:**
|
||||||
|
- **Allied Factions:** [[House Tenrae]]
|
||||||
|
- **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:**
|
||||||
|
- 2026-01-14: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -1,9 +1,18 @@
|
|||||||
---
|
---
|
||||||
Level_of_Influence: 2
|
Level_of_Influence: 8
|
||||||
Faction:
|
Faction:
|
||||||
SMH_Acronym:
|
SMH_Acronym:
|
||||||
Tags:
|
Tags:
|
||||||
- npc
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2025-11-24
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Val]] has a Doctor's Appointment with [[Maltrix]]. Requests to bring back [[Val]] before the end of the month, to ensure that the wards are holding."
|
||||||
|
session: "[[Session 11 - A Session]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "True"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Maltrix
|
# Maltrix
|
||||||
@@ -16,8 +25,8 @@ Tags:
|
|||||||
---
|
---
|
||||||
|
|
||||||
## 🧑 NPC Overview
|
## 🧑 NPC Overview
|
||||||
- **Full Name:**
|
- **Full Name:** Maltrix
|
||||||
- **Race / Ancestry:**
|
- **Race / Ancestry:** Tiefling
|
||||||
- **Gender / Pronouns:**
|
- **Gender / Pronouns:**
|
||||||
- **Occupation / Role:**
|
- **Occupation / Role:**
|
||||||
- **Faction / Allegiance:**
|
- **Faction / Allegiance:**
|
||||||
@@ -161,6 +170,8 @@ action Templater: Insert Add Intel Entry to NPC
|
|||||||
## 🗺️ Miscellaneous
|
## 🗺️ Miscellaneous
|
||||||
- **Current Location:**
|
- **Current Location:**
|
||||||
- **Important Items / Assets:**
|
- **Important Items / Assets:**
|
||||||
|
|
||||||
|
- Owns a Shop in the South Drenches (Name TBD, Tommy)
|
||||||
- **Plot Hooks / Ties to PCs:**
|
- **Plot Hooks / Ties to PCs:**
|
||||||
- **Session Notes / Updates:**
|
- **Session Notes / Updates:**
|
||||||
- 2025-10-08: …
|
- 2025-10-08: …
|
||||||
|
|||||||
@@ -0,0 +1,179 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 1
|
||||||
|
Faction: "[[House Elidari]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Marcellus Magunna
|
||||||
|
*Knight Attaché to [[House Elidari]]*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Marcellus Magunna.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Marcellus Magunna
|
||||||
|
- **Race / Ancestry:**
|
||||||
|
- **Gender / Pronouns:**
|
||||||
|
- **Occupation / Role:** Knight Attaché
|
||||||
|
- **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***
|
||||||
|
- DC 15 Warfare Lore
|
||||||
|
- DC 18 Society
|
||||||
|
- DC 18 Intimidation
|
||||||
|
- DC 20 Perception
|
||||||
|
- ***Influence Skills***
|
||||||
|
- ***Weaknesses***
|
||||||
|
- ***Resistances***
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[The Esoterium]]
|
||||||
|
- **Allied Factions:** [[House Elidari]]
|
||||||
|
- **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-12-02: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,175 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 0
|
||||||
|
Faction: "[[House Tenrae]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
---
|
||||||
|
|
||||||
|
# Morag Tenrae
|
||||||
|
*Governor of Whitewater District*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Morag Tenrae.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Morag Tenrae
|
||||||
|
- **Race / Ancestry:** Sun Elf
|
||||||
|
- **Gender / Pronouns:** Female
|
||||||
|
- **Occupation / Role:** Governor of Whitewater
|
||||||
|
- **Faction / Allegiance:** [[House Tenrae]]
|
||||||
|
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||||||
|
- **Notable Traits:** (quirks, mannerisms, appearance)
|
||||||
|
- **First Impression:** (how the party perceives them)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Relationship with Party
|
||||||
|
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||||||
|
- **Notes on Influence:** (what actions improve/worsen standing)
|
||||||
|
- ***Discovery Skills***
|
||||||
|
- ***Influence Skills***
|
||||||
|
- ***Weaknesses***
|
||||||
|
- ***Resistances***
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[House Tenrae]]
|
||||||
|
- **Allied Factions:** [[Faction A]], [[Faction B]]
|
||||||
|
- **Rival Factions:** [[Faction C]]
|
||||||
|
- **Personal Enemies / Allies:** [[NPC or PC]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📖 History & Background
|
||||||
|
- **Origin / Past:**
|
||||||
|
- **Known Motivations:**
|
||||||
|
- **Secrets / Rumors:**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎭 Roleplay Notes
|
||||||
|
- **Personality:** (e.g., stern, practical, loyal)
|
||||||
|
- **Speech Style / Quirks:** (catchphrases, accent, tics)
|
||||||
|
- **Appearance Details:** (clothing, scars, distinguishing features)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗺️ Miscellaneous
|
||||||
|
- **Current Location:**
|
||||||
|
- **Important Items / Assets:**
|
||||||
|
- **Plot Hooks / Ties to PCs:**
|
||||||
|
- Known to be single.
|
||||||
|
- **Session Notes / Updates:**
|
||||||
|
- 2026-07-01: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,185 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 0
|
||||||
|
Faction:
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2026-04-02
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Calen]] promised that he would come back to Harborgate and have a spirited theological discussion with [[Morthwyl Griffith]] regarding the differences between Seekers of Alseta and standard Practitioners of Alseta."
|
||||||
|
session: "[[Session 25 - A Whole Investigation]]"
|
||||||
|
source: "[[Calen]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Morthwyl Griffith
|
||||||
|
*High Priest of Harborgate*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Morthwyl Griffith.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Morthwyl Griffith
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:** He/Him
|
||||||
|
- **Occupation / Role:** High Priest of Harborgate
|
||||||
|
- **Faction / Allegiance:** Church of Alseta
|
||||||
|
- **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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[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:** Harborgate
|
||||||
|
- **Important Items / Assets:**
|
||||||
|
- **Plot Hooks / Ties to PCs:**
|
||||||
|
- **Session Notes / Updates:**
|
||||||
|
- 2026-04-02: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
p# 🗂 NPC Influence Dashboard
|
pp# 🗂 NPC Influence Dashboard
|
||||||
|
|
||||||
> Scale: −10 … 0 … +10 (0 = Neutral; positive = more influential, negative = less)
|
> Scale: −10 … 0 … +10 (0 = Neutral; positive = more influential, negative = less)
|
||||||
> Source: **#npc** • Excluding: **NPC Template.md** (change the name below if yours differs)
|
> Source: **#npc** • Excluding: **NPC Template.md** (change the name below if yours differs)
|
||||||
@@ -84,3 +84,5 @@ for (const [title, rows] of Object.entries(groups)) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Common People of the S. Drenches: +1
|
||||||
@@ -0,0 +1,182 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 1
|
||||||
|
Faction: "[[House Elidari]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Nuala Elidari
|
||||||
|
*Matriarch of [[House Elidari]]*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Nuala Elidari.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Nuala Elidari
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:** She/Her
|
||||||
|
- **Occupation / Role:**
|
||||||
|
- **Faction / Allegiance:** [[House Elidari]]
|
||||||
|
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||||||
|
- **Notable Traits:** (quirks, mannerisms, appearance)
|
||||||
|
- **First Impression:** (how the party perceives them)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Relationship with Party
|
||||||
|
- **Level of Influence:** `= this.Level_of_Influence` (−10 to +10)
|
||||||
|
- **Notes on Influence:** (what actions improve/worsen standing)
|
||||||
|
- ***Discovery Skills***
|
||||||
|
- DC 15 Accounting Lore
|
||||||
|
- DC 18 Diplomacy
|
||||||
|
- DC 18 Crafting
|
||||||
|
- DC 20 Perception
|
||||||
|
- ***Influence Skills***
|
||||||
|
- DC 20 Arcana
|
||||||
|
- DC Diplomacy
|
||||||
|
- DC 22 Deception
|
||||||
|
- ***Weaknesses***
|
||||||
|
- ***Resistances***
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[House Elidari]]
|
||||||
|
- **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-12-02: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[Onora Elidari]] (Daughter)
|
||||||
|
- [[Cormac Elidari]] (Husband)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,175 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 0
|
||||||
|
Faction:
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Octavia
|
||||||
|
*Role/Description — e.g., "Captain of the Guard", "Elven Scholar", "Local Merchant"*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Octavia.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Octavia
|
||||||
|
- **Race / Ancestry:** Half-Elf/Half-Orc
|
||||||
|
- **Gender / Pronouns:**
|
||||||
|
- **Occupation / Role:** Alsatian Shaman
|
||||||
|
- **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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[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:**
|
||||||
|
- 2026-03-25: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,213 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 5
|
||||||
|
Faction: "[[House Elidari]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2026-01-21
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Faylen Valrora]] attempts to get [[Onora Elidari]] to complete half the paperwork for the tentative hospital in the Whitewater. This goes poorly, and Onora outright rejects even being associated with the hospital aside from doing miniscule amounts of work."
|
||||||
|
session: "[[Session 18 - After the Warehouse]]"
|
||||||
|
source: "[[Onora Elidari]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
- date: 2025-12-10
|
||||||
|
type: report
|
||||||
|
summary: "[[Onora Elidari]] stormed out of The House Valrora reinstatement announcement because she A) Might have to be [[Faylen Valrora]]'s Sister and B) The Wedding Announcement was minimized. Additionally, if [[Faylen Valrora]] is adopted, her position as a social climber is knocked down a peg."
|
||||||
|
session: "[[Session 13 - Summer Solistice Pt. 2]]"
|
||||||
|
source: "[[Metternich]]"
|
||||||
|
reliability: C
|
||||||
|
credibility: 4
|
||||||
|
tags: []
|
||||||
|
- date: 2025-12-10
|
||||||
|
type: report
|
||||||
|
summary: The Wedding of [[Onora Elidari]] and [[Kerrian Calil]] is on October 22nd.
|
||||||
|
session: "[[Session 13 - Summer Solistice Pt. 2]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Onora Elidari
|
||||||
|
*Youngest Daughter of [[House Elidari]]*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Onora Elidari.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Onora Elidari
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:** She/Her
|
||||||
|
- **Occupation / Role:**
|
||||||
|
- **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***
|
||||||
|
- DC 15 Nobility Lore
|
||||||
|
- DC 18 Diplomacy
|
||||||
|
- DC 18 Deception
|
||||||
|
- DC 20 Perception
|
||||||
|
- ***Influence Skills***
|
||||||
|
- DC 15 Y'athyr Lore/Elf Lore
|
||||||
|
- DC 18 Diplomacy
|
||||||
|
- DC 18 Deception
|
||||||
|
- DC 20 Crafting
|
||||||
|
- DC 20 Performance
|
||||||
|
- DC 22 Intimidation
|
||||||
|
- ***Weaknesses***
|
||||||
|
- Discussing her own ambitions and how to bring them to fruition reduces the influence DC by 4.
|
||||||
|
- ***Resistances***
|
||||||
|
- ***Biases***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[House Elidari]]
|
||||||
|
- **Allied Factions:** [[House Calil]], [[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-12-02: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,183 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 0
|
||||||
|
Faction:
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2025-12-22
|
||||||
|
type: rumor
|
||||||
|
summary: "[[Professor Seren]] is a Demonologist and sometimes works with the Clergy on some issues dealing with Demons when they find themselves unable. A Roru would classify likely as things Clergy might consult him about. He also occasionally hosts open seminars and you could otherwise pay for an audience with him"
|
||||||
|
reliability: B
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Professor Ceren
|
||||||
|
*Role/Description — e.g., "Captain of the Guard", "Elven Scholar", "Local Merchant"*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Professor Seren.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Ceren
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:**
|
||||||
|
- **Occupation / Role:** Professor of Demonology at [[The Esoterium]]
|
||||||
|
- **Faction / Allegiance:** [[The Esoterium]]
|
||||||
|
- **SMH (what THEY call it):** `= this.SMH_Acronym`
|
||||||
|
- **Notable Traits:** (quirks, man
|
||||||
|
nerisms, 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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[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-12-22: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 0
|
||||||
|
Faction:
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2026-01-29
|
||||||
|
type: report
|
||||||
|
summary: Is known to be a scholar of glyphs and other signage. Helps to maintain the barrier that controls access to the Esoterium.
|
||||||
|
session: "[[Session 19 - A Plan Forms]]"
|
||||||
|
reliability: B
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Professor Gerendel
|
||||||
|
*Role/Description — e.g., "Captain of the Guard", "Elven Scholar", "Local Merchant"*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Professor Gerendel.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:**
|
||||||
|
|
||||||
|
- **Race / Ancestry:**
|
||||||
|
- **Gender / Pronouns:**
|
||||||
|
- **Occupation / Role:**
|
||||||
|
- **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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[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:**
|
||||||
|
- 2026-01-29: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -3,10 +3,22 @@ Level_of_Influence: -1
|
|||||||
Faction: "[[House Elidari]]"
|
Faction: "[[House Elidari]]"
|
||||||
Tags:
|
Tags:
|
||||||
- npc
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2025-11-24
|
||||||
|
type: report
|
||||||
|
summary: "[[Eosef Tenrae]] and [[Ronan Elidari]] will be going to the summer solistice ball, but will not be staying for the entire event."
|
||||||
|
session: "[[Session 11 - A Session]]"
|
||||||
|
source: "[[Kite]]"
|
||||||
|
reliability: C
|
||||||
|
credibility: 5
|
||||||
|
tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "False"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
# Ronan Elidari
|
# Ronan Elidari
|
||||||
*Captain of the Guard*
|
*Captain in the City Guard*
|
||||||
|
|
||||||
## 🎨 Artwork
|
## 🎨 Artwork
|
||||||
![[Ronan Elidari.png]]
|
![[Ronan Elidari.png]]
|
||||||
@@ -148,7 +160,7 @@ action Templater: Insert Add Intel Entry to NPC
|
|||||||
## 🏛️ Relations & Factions
|
## 🏛️ Relations & Factions
|
||||||
- **Primary Faction:** [[House Elidari]]
|
- **Primary Faction:** [[House Elidari]]
|
||||||
- **Allied Factions:** [[Faction A]], [[Faction B]]
|
- **Allied Factions:** [[Faction A]], [[Faction B]]
|
||||||
- **Rival Factions:** [[House Valora]]
|
- **Rival Factions:** [[House Valrora]]
|
||||||
- **Personal Enemies / Allies:** [[Faylen Valora]]
|
- **Personal Enemies / Allies:** [[Faylen Valora]]
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -0,0 +1,175 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 2
|
||||||
|
Faction:
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "True"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Saara Kallaste
|
||||||
|
*Journalist/Reporter*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Saara Kallaste.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Saara Kallaste
|
||||||
|
- **Race / Ancestry:** Wood Elf
|
||||||
|
- **Gender / Pronouns:** She/Her
|
||||||
|
- **Occupation / Role:** Journalist/Reporter
|
||||||
|
- **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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[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:**
|
||||||
|
- 2026-04-08: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,175 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 2
|
||||||
|
Faction:
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "True"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Saffronia
|
||||||
|
*Role/Description — e.g., "Captain of the Guard", "Elven Scholar", "Local Merchant"*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Saffronia.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Saffronia
|
||||||
|
- **Race / Ancestry:** Elf ((Grey Skinned, with Horns))
|
||||||
|
- **Gender / Pronouns:**
|
||||||
|
- **Occupation / Role:**
|
||||||
|
- **Faction / Allegiance:** [[Thin Wisps]]
|
||||||
|
- **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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[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:**
|
||||||
|
- 2026-02-03: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,207 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 11
|
||||||
|
Faction: "[[House Vyshaan]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2026-04-23
|
||||||
|
type: rumor
|
||||||
|
summary: "[[Siviane Marravet]] is known to spend time at the finest parlors and otherwise known to be at opening night(s) at the Figment Grand Hall. Otherwise she can sometimes be found near the docks."
|
||||||
|
session: "[[Session 28 - Downtime Activities]]"
|
||||||
|
source: "[[Metternich]]"
|
||||||
|
reliability: B
|
||||||
|
credibility: 4
|
||||||
|
tags: []
|
||||||
|
- date: 2025-12-3
|
||||||
|
type: interaction
|
||||||
|
summary: "[[Siviane Marravet]] seems to be entirely aware of who [[Metternich]] is, and his ties to Alsat."
|
||||||
|
source: "[[Siviane Marravet]]"
|
||||||
|
reliability: A
|
||||||
|
credibility: 5
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# Siviane Marravet
|
||||||
|
*Patron of the Arts, the Lady of Emberwine*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Siviane Marravet.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Siviane Marravet
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:** She/Her
|
||||||
|
- **Occupation / Role:**
|
||||||
|
- **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***
|
||||||
|
- DC 15 Espionage Lore
|
||||||
|
- DC 18 Society
|
||||||
|
- DC 18 Deception
|
||||||
|
- DC 20 Perception
|
||||||
|
- ***Influence Skills***
|
||||||
|
- DC 15 Espionage Lore
|
||||||
|
- DC 18 Thievery
|
||||||
|
- DC 18 Stealth
|
||||||
|
- DC 20 Performance
|
||||||
|
- DC 22 Diplomacy
|
||||||
|
- DC 25 Intimidation
|
||||||
|
- ***Weaknesses***
|
||||||
|
- Sharing juicy gossip or industry secrets reduces the influence DC by 4.
|
||||||
|
- ***Resistances***
|
||||||
|
- Fruitless conversations increase the check's DC by 4.
|
||||||
|
- ***Biases***
|
||||||
|
- People who present themselves as being useful for subterfuge, backstabbing or politicking gain a +2 bonus.
|
||||||
|
- Stalwart Lawful individuals gain a -2 penalty
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[House Vyshaan]]
|
||||||
|
- **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-12-02: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,175 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 0
|
||||||
|
Faction:
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Syrianix
|
||||||
|
*Role/Description — e.g., "Captain of the Guard", "Elven Scholar", "Local Merchant"*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Syrianix.png]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Syrianix "The Weaver"
|
||||||
|
- **Race / Ancestry:**
|
||||||
|
- **Gender / Pronouns:**
|
||||||
|
- **Occupation / Role:**
|
||||||
|
- **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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[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-12-22: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -0,0 +1,194 @@
|
|||||||
|
---
|
||||||
|
Level_of_Influence: 1
|
||||||
|
Faction: "[[House Asase]]"
|
||||||
|
SMH_Acronym:
|
||||||
|
Tags:
|
||||||
|
- npc
|
||||||
|
Intel:
|
||||||
|
- date: 2026-01-29
|
||||||
|
type: rumor
|
||||||
|
summary: "[[Calen]] knows the reputation of [[Therin Assase]]. If anyone were to turn on their family in the name of Law and Order, it would be [[Therin Assase]]."
|
||||||
|
session: "[[Session 18 - After the Warehouse]]"
|
||||||
|
source: "[[Calen]]"
|
||||||
|
reliability: C
|
||||||
|
credibility: 4
|
||||||
|
tags: []
|
||||||
|
- date: 2026-01-29
|
||||||
|
type: rumor
|
||||||
|
summary: "[[Calen]], [[Val]] and [[Kite]] know that [[Therin Assase]] is an Auditor of Internal Affairs, for things inside the city - [[House Gille]] operating outside of the City would technically be outside of his jurisdiction."
|
||||||
|
session: "[[Session 18 - After the Warehouse]]"
|
||||||
|
source: "[[Calen]]"
|
||||||
|
reliability: B
|
||||||
|
credibility: 4
|
||||||
|
tags: []
|
||||||
|
Knows About HQ: "False"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Therin Assase
|
||||||
|
*Inspector and Auditor of Internal Affairs for the City of Y'athyr*
|
||||||
|
|
||||||
|
## 🎨 Artwork
|
||||||
|
![[Therin Asase.jpg]]
|
||||||
|
*Optional caption / alt text*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧑 NPC Overview
|
||||||
|
- **Full Name:** Therin Assase
|
||||||
|
- **Race / Ancestry:** Elf
|
||||||
|
- **Gender / Pronouns:** He/Him
|
||||||
|
- **Occupation / Role:** Inspector and Auditor of Internal Affairs
|
||||||
|
- **Faction / Allegiance:** [[House Asase]]
|
||||||
|
- **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***
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel (auto)
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const thisName = String(THIS.file.name);
|
||||||
|
const thisLC = thisName.toLowerCase();
|
||||||
|
|
||||||
|
// Scan faction & NPC notes that have Intel arrays
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
// Does an Intel entry reference THIS NPC?
|
||||||
|
function mentionsThisNPC(entry) {
|
||||||
|
const sum = String(entry.summary ?? "");
|
||||||
|
|
||||||
|
// 1) Explicit wikilink in summary
|
||||||
|
if (sum.includes(`[[${thisName}]]`) || sum.includes(`[[${thisName}|`)) return true;
|
||||||
|
|
||||||
|
// 2) Source field (string/link/list)
|
||||||
|
const src = entry.source;
|
||||||
|
const arr = Array.isArray(src) ? src : (src ? [src] : []);
|
||||||
|
for (const s of arr) {
|
||||||
|
if (typeof s === "string") {
|
||||||
|
// quoted link or plain text
|
||||||
|
const unq = s.replace(/^"+|"+$/g, ""); // drop surrounding quotes if any
|
||||||
|
if (unq.includes(`[[${thisName}]]`) || unq.includes(`[[${thisName}|`)) return true;
|
||||||
|
// if they typed just the name
|
||||||
|
if (unq.replace(/\[\[|\]\]/g, "").trim().toLowerCase() === thisLC) return true;
|
||||||
|
} else if (s && typeof s === "object" && s.path) {
|
||||||
|
// wikilink object
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i, "").toLowerCase();
|
||||||
|
if (base === thisLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optional (looser): plain text mention in summary
|
||||||
|
// return sum.toLowerCase().includes(thisLC);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect rows: 1) own Intel, 2) mentions from other notes
|
||||||
|
const rows = [];
|
||||||
|
|
||||||
|
// Own Intel (from this NPC note)
|
||||||
|
for (const it of (THIS.Intel ?? [])) {
|
||||||
|
rows.push({
|
||||||
|
from: THIS.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mentions elsewhere
|
||||||
|
for (const p of pages.where(p => p.file.path !== THIS.file.path)) {
|
||||||
|
for (const it of (p.Intel ?? [])) {
|
||||||
|
if (mentionsThisNPC(it)) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
type: it.type ?? "",
|
||||||
|
summary: String(it.summary ?? ""),
|
||||||
|
session: it.session ?? "",
|
||||||
|
source: it.source ?? "",
|
||||||
|
rel: it.reliability ?? "",
|
||||||
|
cred: it.credibility ?? "",
|
||||||
|
tags: Array.isArray(it.tags) ? it.tags.join(", ") : (it.tags ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort newest first
|
||||||
|
rows.sort((a,b) => String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel yet._");
|
||||||
|
} else {
|
||||||
|
dv.paragraph(`_Entries: ${rows.length} (own ${(THIS.Intel ?? []).length} + mentions ${Math.max(0, rows.length - (THIS.Intel ?? []).length)})_`);
|
||||||
|
dv.table(
|
||||||
|
["From Note","Date","Type","Summary","Session","Source","Rel","Cred","Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.session, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ➕ Add Intel
|
||||||
|
type command
|
||||||
|
action Templater: Insert Add Intel Entry to NPC
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏛️ Relations & Factions
|
||||||
|
- **Primary Faction:** [[House Asase]]
|
||||||
|
- **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:**
|
||||||
|
- 2026-01-29: …
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔗 Connections
|
||||||
|
- **Related NPCs:**
|
||||||
|
- [[NPC A]] (Mentor)
|
||||||
|
- [[NPC B]] (Rival)
|
||||||
|
- **PC Ties:** (how the party knows them)
|
||||||
@@ -29,7 +29,7 @@ templater true
|
|||||||
- **Region / Location:**
|
- **Region / Location:**
|
||||||
- Starlight Ridge, a Winery Owned by [[Deidre Gille]]
|
- Starlight Ridge, a Winery Owned by [[Deidre Gille]]
|
||||||
- **In-game Date / Time:**
|
- **In-game Date / Time:**
|
||||||
|
- Day before the Summer Solstice, 726.
|
||||||
- **Weather / Conditions:**
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
@@ -80,6 +80,7 @@ templater true
|
|||||||
- **Social / Exploration:**
|
- **Social / Exploration:**
|
||||||
- [[Kite]] inquires with [[Deidre Gille]] with how we might best further poke our noses into [[House Gille]] - and Deidre is unsure. She doubts that the [[House Gille]] is in this on their own because at the end of the day, this was about Land Prices.
|
- [[Kite]] inquires with [[Deidre Gille]] with how we might best further poke our noses into [[House Gille]] - and Deidre is unsure. She doubts that the [[House Gille]] is in this on their own because at the end of the day, this was about Land Prices.
|
||||||
- [[Kite]] inquires about her relationship with Katerine Calil. She wouldn't be surprised if Katerine was involved in something like this.
|
- [[Kite]] inquires about her relationship with Katerine Calil. She wouldn't be surprised if Katerine was involved in something like this.
|
||||||
|
- [[Val]] has magical runes inscribed on her skin.
|
||||||
- **Combat:**
|
- **Combat:**
|
||||||
|
|
||||||
- **Outcome / Loot:**
|
- **Outcome / Loot:**
|
||||||
|
|||||||
@@ -0,0 +1,177 @@
|
|||||||
|
---
|
||||||
|
Date: 2025-12-03
|
||||||
|
Session_Name: Session 12 - Summer Solistice Pt. 1
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 12 - Summer Solistice Pt. 1
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
- Y'athyr
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- The Afternoon
|
||||||
|
- [[Kite]] and [[Calen]] go to speak with [[Calia Noctilun]]. But no new significant information is gained.
|
||||||
|
- Solasta Masquerade
|
||||||
|
- The party shares their various outfits.
|
||||||
|
- [[Val]] decides that her name for the evening will be Helen.
|
||||||
|
- The main room shows finery reflecting the Tribunal of the Sun with multicolored flowers and fey creatures on the tapestry.
|
||||||
|
- Where a large chandelier would normally be, they are replaced by a radiant orb of yellow light (representing the sun)
|
||||||
|
-
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
---
|
||||||
|
Date: 2025-12-10
|
||||||
|
Session_Name: Session 13 - Summer Solistice Pt. 2
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 13 - Summer Solistice Pt. 2
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
---
|
||||||
|
Date: 2025-12-17
|
||||||
|
Session_Name: Session 14 - Summer Solistice Pt. 3
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 14 - Summer Solistice Pt. 3
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- [[Faylen Valora]] gives another speech
|
||||||
|
- She offers a thankful welcome to [[House Elidari]] and their patron for hosting.
|
||||||
|
- The Trackless taught her perspective - how much every choice matters, and that leadership is an act of devotion.
|
||||||
|
- All share a devotion to Y'athyr and hosts cheers to Y'athyr.
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
---
|
||||||
|
Date: 2025-12-22
|
||||||
|
Session_Name: Session 15 - Summer Solstice Aftermath
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 15 - Summer Solstice Aftermath
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
- Across Y'athyr
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- The Group Meets with [[Ilvara Valrora]] for tea the morning after the Summer Solistice.
|
||||||
|
- Overall, we manage to net a +2 influence with [[Ilvara Valrora]] after a tense conversation.
|
||||||
|
- [[Calen]] also notices that [[Ilvara Valrora]] seems to be carrying some internalized guilt about the state of the city.
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-01-07
|
||||||
|
Session_Name: Session 16 - A Meeting of Consequence
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 16 - A Meeting of Consequence
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:** Multiple Locations in Y'athyr
|
||||||
|
|
||||||
|
- **In-game Date / Time:** June 23rd
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- The Party with the exception of [[Val]] heads to the meeting with the Elidari's regarding the adoption.
|
||||||
|
- [[Ilvara Valrora]] is there ahead of us, and offers some kind greetings. But seems anxious about how this is going to go.
|
||||||
|
- [[Nuala Elidari]] & [[Cormac Elidari]] enter, with a little fanfare and a crier announcing their entry.
|
||||||
|
- [[Calen]], [[Kite]], and [[Metternich]] attempt to sense their motives as they enter the courtyard:
|
||||||
|
- [[Metternich]] picks up on something - implying that this is going to be entertaining.
|
||||||
|
- [[Cormac Elidari]] and [[Nuala Elidari]] do not seem surprised at [[Faylen Valora]]'s rejection of the offer of adoption, but he does express displeasure at the idea.
|
||||||
|
- [[Nuala Elidari]] announces that [[House Valrora]] is being re-assigned and will govern Rhamtool -- a small village on a river inlet nearing the main farmlands of Ri'lsera -- this is evidently under the order of [[House Evandra]].
|
||||||
|
- [[Faylen Valora]], [[Metternich]], and [[Val]] go to meet with Fritch in an attempt to garner influence with [[The Archmasons]].
|
||||||
|
- [[Metternich]] proffers that [[House Elidari]] intends to betray [[The Archmasons]] in some manner -- and looking to eventually push [[The Archmasons]] out.
|
||||||
|
- [[Metternich]] offers this information in exchange for an opportunity to prove ourselves as people worth allying with.
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-01-14
|
||||||
|
Session_Name: Session 17 - Warehouse Entry
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 17 - Warehouse Entry
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,189 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-01-21
|
||||||
|
Session_Name: Session 18 - After the Warehouse
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 18 - After the Warehouse
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- [[Calen]] attempts to learn some information about the sickness that is spreading around the docks.
|
||||||
|
- The majority of the sick seem to be the dockhands, and the sickness doesn't seem to be contagious. Those that have been treated have seen reduction in symptoms but the illness doesn't go away.
|
||||||
|
- Exposure to something at work?
|
||||||
|
- Are there some who have gotten sick, stopped working but have gotten better?
|
||||||
|
- Symptoms seem to be largely fevers and bone aching - but nothing visual.
|
||||||
|
- RK leans towards it being a number of things, but nothing specific nor common.
|
||||||
|
- Need to spend some time with clinical tomes or perhaps doctors who have treated this.
|
||||||
|
- [[Kite]] heads to the the Wells to find information about the potential cult that summoned Euzaldoph in [[Session 7 - Meeting with Vaust]].
|
||||||
|
- [[Kite]] notices creatures crawling around and speaking an unfamiliar language.
|
||||||
|
- Attempts at moving quietly are unsuccessful, but is able to scout effectively. It doesn't appear that this part of town is outright abandoned.
|
||||||
|
- [[Faylen Valora]] attempts to complete some of the paperwork for the hospital that we're establishing. She attempts to convince [[Onora Elidari]] to assist with the paperwork (after her parents semi-agree to providing assistance). Onora outright rejects assisting - though it's unclear if this is due to [[Faylen Valora]]'s demeanor, this being something dictated by her parents - or otherwise generally disliking [[Faylen Valora]].
|
||||||
|
- [[Val]] spends the day poking around the Drenches. She feels that she was still being watched by the [[Thin Wisps]]
|
||||||
|
- [[Metternich]] spends some time watching [[The Archmasons]] and is unsure of what if anything they are presently up to.
|
||||||
|
- The group ([[Calen]], [[Kite]], [[Val]] and [[Metternich]]) heads to their meeting with [[Lorena Neurath]] near the Old Gallows Fountain in Whitewater.
|
||||||
|
- [[Lorena Neurath]] arrives at 8'sharp. Wearing her armor and carrying her weapon.
|
||||||
|
- Perception shows that she immediately seems pissed off.
|
||||||
|
- She is immediately pissed off over the loss of 1200 gold from the gem we gave her. [[Metternich]] expresses that this was the only lie that he told.
|
||||||
|
- Worried over companies reputation - 1200 gold would've been enough to get out of the city or things beyond.
|
||||||
|
- [[Metternich]] tells her that there is a better way, [[Lorena Neurath]] says that she doesn't work for liars.
|
||||||
|
- [[Metternich]] says he's hiring long-term - [[Lorena Neurath]] counters with 1/wk for 1200 gold.
|
||||||
|
- Meanwhile, [[Faylen Valora]] tries to sell [[Lord Ellin Vaust]] on employing [[Lorena Neurath]].
|
||||||
|
- [[Calen]] offers his bow, and [[Metternich]] offers his masquerade scarf as an offering of collateral, in exchange for us getting back to her about the job on Saturday.
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,188 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-01-29
|
||||||
|
Session_Name: Session 19 - A Plan Forms
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 19 - A Plan Forms
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- The previous evening:
|
||||||
|
- [[Val]] goes to speak with [[Iniana Asase]] and tries to set up a meeting between [[Deidre Gille]] and [[Therin Asase]] in order to keep her relatively protected, while also ensuring that [[House Miiran]] is held accountable.
|
||||||
|
- [[Metternich]] attend to a few personal items.
|
||||||
|
- The remainder of the party, spend the evening with [[Deidre Gille]] ensuring her safety.
|
||||||
|
- Saturday
|
||||||
|
- [[Calen]], [[Faylen Valora]] and [[Kite]] escort [[Deidre Gille]] back to Y'athyr - but exit the carriage a bit outside of the entrance, and walk the remaining distance.
|
||||||
|
- [[Val]] and [[Metternich]] spend some time investigating the Black Hooded, Red-Insignia'ed folks that have been around the docks guarding shipments. Rumor indicate that they might be a Rhodesian Cult of some sort. Though the docks themselves are owned by [[House Tenrae]]
|
||||||
|
- The Guards seem to be supplied by [[House Tenrae]], but are actually from [[House Tassarion]].
|
||||||
|
- [[Calen]], [[Val]] and [[Metternich]] head to meet with [[Lorena Neurath]] and pass her along into the service of [[Lord Ellin Vaust]].
|
||||||
|
- [[Faylen Valora]] and [[Kite]] spend some time trying to get into the Esoterium to investigate [[Professor Gerendel]] - who is known to be involved with the cult that summoned Euzoldolph and is holding [[Sinni Springvale]].
|
||||||
|
- [[Faylen Valora]] and [[Kite]] also spend some time trying to scout the Wells to find this cult.
|
||||||
|
- As they attempt to go their way through, they hear wailing and growling/moaning - and notice sets of eyes watching them.
|
||||||
|
- They encounter a pale-skinned human wearing dark clothing - they respond in Undercommon. Asking "Why are you here?" - [[Kite]] deduces that they are Caligni - like we encountered at [[Sinni Springvale]]'s house. The Caligni says that their name is Thublinkaraari (THUMB-lin-CAR-ee)
|
||||||
|
- Lot's of Halflings are in the Wells (combined with some other Ancestries are working in the Wells), mostly deeper in. Thublinkaraari implies that they know what they're working on, but they've been told not to tell.
|
||||||
|
- Sunday
|
||||||
|
- [[Calen]] attempts to find some more information about the disease at the docks. Most of the treatment that has been done for the disease that is running around the docks, has been done by the Church of Alseta - so I may need to ask around there to get more information.
|
||||||
|
- I try to divine any commonalities between where the people are working, but am unable to find anything.
|
||||||
|
- [[Kite]] and [[Val]] try to find some additional information about people who have gone missing - in relation to those who are being enslaved for the work in the Wells.
|
||||||
|
- [[Val]] doesn't learn anything new.
|
||||||
|
- [[Kite]] finds some disappearances that weren't ever resolved, but nothing that is a smoking gun.
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-02-03
|
||||||
|
Session_Name: Session 20 - Many Plot Threads
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 20 - Many Plot Threads
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- The group heads to their meeting with the [[Thin Wisps]] in the South Drenches. We meet them at a significantly nicer warehouse than we've seen previously. No visible guard presence, but we do notice that there are a number of other people lurking in the roof and corners watching us.
|
||||||
|
- Heading into the Warehouse:
|
||||||
|
- Most containers are waterside, but without a ship it's unclear if those are to be loaded or are waiting for other transport.
|
||||||
|
- There are four [[Thin Wisps]] on top of the crates, three are ashy, grey skinned, while the remainder is a mutton chopped human.
|
||||||
|
- [[Freddie]] also inquires as to our individual allegiances.
|
||||||
|
- [[Kite]] assures them that we do not hold them in any high esteem.
|
||||||
|
- On Monday, the groups heads to The Wells, choosing to attempt to move Stealthily, and retracing the steps that the group was previously shown out of the Wells.
|
||||||
|
- [[Kite]] and [[Calen]] work together to track the Caligni Footprints, still feeling a sense of dread as we're tracking.
|
||||||
|
- We follow to one of the Wells that the district is known for, and the tracks appear to be leading in that direction, over some rubble, with two overturned wagons. as we follow towards an intersection, we eventually make it to the street between the wagons, before a figure pops up behind us.
|
||||||
|
- ![[Pasted image 20260203222902.png]]
|
||||||
|
-
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-02-26
|
||||||
|
Session_Name: Session 21 - Wells Investigation
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 21 - Wells Investigation
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- The group recovers from the combat with the Caligni in the streets in the Wells.
|
||||||
|
- We follow some tracks southwest of a group of small and medium humanoids heading towards the Arch.
|
||||||
|
- Following the tracks along the rooftops eventually encounters us a group of Namorrodor.
|
||||||
|
- RK: ![[Pasted image 20260226192721.png]]
|
||||||
|
- As we approach another plaza, there is a fountain that has been split open along with a dirge of strings being played. Finally, there are dozens of bloodied halflings dancing. There is also a violinist playing at the center of the fountain, compelling the halflings to dance.
|
||||||
|
- We fight and are able to eliminate the Violinist, the Caligni's Dancers
|
||||||
|
- Some additional RK regarding the Wounds inflicted by the Velsrac:![[Pasted image 20260226214826.png]]
|
||||||
|
-
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-03-04
|
||||||
|
Session_Name: Session 22 - Wells Investigation Pt. 2
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 22 - Wells Investigation Pt. 2
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- The Temple of Desna contains a ritual that is going on.
|
||||||
|
- After sacrificing a halfling, the main priest pauses the ritual and talks at us:
|
||||||
|
- ![[Pasted image 20260304195329.png]]
|
||||||
|
- WE have heard, but shall we listen?
|
||||||
|
- We interrupted the revelry of those at the fountain - took them away from the place they belong.
|
||||||
|
- Offering knowledge and energy to this place
|
||||||
|
- The Priest offers us a chance to listen to the voices telling of change, and also offers a chance to retreat.
|
||||||
|
- [[Calen]] has a moment where he needs to resolve the change he speaks of vs. the change that Alseta has told him of.
|
||||||
|
- [[Calen]], [[Val]] and [[Kite]] head towards the priest to speak with him closer before [[Kite]] and [[Calen]] resolve to destroy this priest.
|
||||||
|
- The runes in [[Val]]'s skin seem to be reacting to the maelstrom, causing them to sear in pain. They are written in part in Aklo, the language of ancient forbidden knowledge and secrets.
|
||||||
|
- You are aware of a handful of various ways to break sacrifical rituals. The maelstrom and trying to dispel it is far beyond anything you have learned or attempted before. Bringing [[Val]] closer to the maelstrom will definitely have a reaction. The "Voices" seem to be capable of capitalizing on her markings to get at her. Whether or not that makes any sort of dispelling easier is to be discovered. Regardless, the maelstrom seems not to be the apex of this power, just a window to it.
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-03-25
|
||||||
|
Session_Name: Session 24 - Wells Investigation Pt. 4
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 24 - Wells Investigation Pt. 4
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- RK on St. Eloise
|
||||||
|
- Known for being on the front lines and skilled in battle. Standing up against Tyrants.
|
||||||
|
- Areas of Concern: Chivalry, Duty, Vengeance
|
||||||
|
- Domains: Duty, Zeal, Fire, Might
|
||||||
|
- The group continues to strategize on how to deal with the Maelstrom. A consensus is not reached, but we asscent to deal with this as soon as possible.
|
||||||
|
- The group heads to meet with [[Octavia]] and [[Halwin]].
|
||||||
|
- [[Metternich]] and [[Octavia]] chat briefly about the journey into and out of the city.
|
||||||
|
- The group heads to a more discreet location to chat further.
|
||||||
|
- The group heads back to the temple with the Maelstrom to try and dispel it.
|
||||||
|
- Kite, Metternich and Val work through dismantling the altar, and tossing at least parts of it into the Maelstrom.
|
||||||
|
- Faylen and Calen fortify the area, and summon what magic they are able to in order to weaken the Maelstrom.
|
||||||
|
- Some other things happen, but after awhile the group is satisfied with their efforts and attempts one last push to dispel the Maelstrom. It it eventually determined that Calen will be the primary caster for this ritual - and with the support of everyone (and some cookie points!) we are able to critically dispel the Maelstrom.
|
||||||
|
- After the fact, all that is left is a giant hole in the ground - but the maelstrom itself is gone.
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,182 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-04-02
|
||||||
|
Session_Name: Session 25 - A Whole Investigation
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 25 - A Whole Investigation
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:** The Wells District in Y'athyr, Ruined Temple to "Sarahanna"
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- We pick up after the Maelstrom was dispelled.
|
||||||
|
- We drop a rock down the well to see how far down the bottom is and it's about 4 seconds before we hear a clunk.
|
||||||
|
- We drop a further torch down the well, and it falls for another four seconds before bouncing off of something, vaguely shiny and metallic.
|
||||||
|
- The group heads back to the square where we fought the first Violinist - noticing some Caligni who are not engaging us but are aware of our presence.
|
||||||
|
- SM: They seem chiefly aware of our presence here, but more interested in keeping tabs on us all rather than engaging.
|
||||||
|
- We try to follow the other trail that we found in the Fountain - which circles around the temple and heads towards Manors that used to exist on a raised plateau, where the trail seems to lead inside.
|
||||||
|
- We follow the trail into the Garden. We can see motes of light illuminating the way, and can make out muddy boot prints that go in and out of the Manor's Wall.
|
||||||
|
- We hear more whispering voices, but they seem less personal - and they are once again commanding us to move deeper and answer for our actions. Others tell us to flee.
|
||||||
|
- Sneaking through the side wall, portraits have had their faces scratched out and eventually we arrive at a Large Entry Door to a Grand Hall.
|
||||||
|
- We trigger a hazard and find ourselves finding another hole.
|
||||||
|
- The Ceiling falls in on us as we enter the room, and we can hear terrified cries from men, women and children that are just as quickly snuffed out.
|
||||||
|
- We enter ENCOUNTER Mode.
|
||||||
|
- RK: On the similarities between the two portals
|
||||||
|
- Similar, but not the same. The maelstrom was a construct of the followers of the Veiled Voice. This chasm simply is, though why you're not sure. Perhaps due to its proximity to something else.
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,201 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-04-08
|
||||||
|
Session_Name: Session 26 - Two Holes, Many Problems
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 26 - Two Holes, Many Problems
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
- Y'athyr
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- We pick up with [[Faylen Valora]] attempting to meet with a Journalist that she had found last session.
|
||||||
|
- They agree to meet in about an hour's time at the Dire Seagull -- which is the bar that [[Val]] introduced us to; her normal haunt.
|
||||||
|
- [[Faylen Valora]] leases the Private Room at the back of the bar - ordering some Tea.
|
||||||
|
- She waits almost 45 minutes before the Journalist shows up.
|
||||||
|
- [[Faylen Valora]] scolds the journalist for being late and evidently not owning a watch.
|
||||||
|
- The Journalist introduces herself as [[Saara Kallaste]] (Pronounced Sar-uh)
|
||||||
|
- [[Saara Kallaste]] explains that she is not from Y'athyr, but has lived here for a few years. She grew up out in the Trackless - before moving here.
|
||||||
|
- They gloss past the failing of [[Faylen Valora]]'s brother.
|
||||||
|
- Talk very briefly about the mission to the Trackless.
|
||||||
|
- [[Faylen Valora]] asks [[Saara Kallaste]] about her opinions on [[House Elidari]] but she does not have one.
|
||||||
|
- [[Faylen Valora]] proposes a plan in which [[Saara Kallaste]] will get to make a name for herself, as a groundbreaking journalist - by publishing the Truth. She would write on particular categories that [[Faylen Valora]] selects -- most relevantly:
|
||||||
|
- [[Iniana Asase]]
|
||||||
|
- [[Lord Ellin Vaust]]
|
||||||
|
- [[Elthea Rinvale]]
|
||||||
|
- [[Saara Kallaste]] offers resistance to the idea, saying that she works for one of the Major Publications. All of her articles need to be approved by her Editor. She is currently reporting on Fitting Navy Ships with brand new sails. She can only write about the things that are selected for her - and she doubts that she'd be able to get articles by her editor.
|
||||||
|
- [[Faylen Valora]] shifts to making their own paper, but [[Saara Kallaste]] inquires whether or not she has the means, capital or distribution that starting a new paper would need.
|
||||||
|
- [[Faylen Valora]] just needs someone to write and investigate - and she also offers a modest salary of more than 15 gold a month in addition to Protection. A real sense of pride and accomplishment in her work.
|
||||||
|
- [[Saara Kallaste]] would not have full editorial control, but [[Faylen Valora]] proposes that things will be a vote for the rest party; if not outright being discussed later.
|
||||||
|
- The group reconvenes at the SMH, discussing any findings/progress that has been made.
|
||||||
|
- The group heads back towards the Wells and back to the temple with the hole in the ground.
|
||||||
|
- We note that the Wells are disquietingly empty - but notice Caligni Scouts that observe our movements through the city.
|
||||||
|
- We get back to the Temple of Sarahanna, it's close to Midnight.
|
||||||
|
- The Effigy that [[Val]] made to Sarahanna has been destroyed, but the path to the hole is now lined with Masked Figures.
|
||||||
|
- The group climbs down the hole:
|
||||||
|
- It takes roughly a min and half to descend to the bottom of the hole.
|
||||||
|
- We see an eery pale blue glow coming from a mass of chains, not unlike a strange cocoon. Thick, viscous black pus oozes from it. We once again start to hear the whispers encouraging us to continue to go down the hole.
|
||||||
|
- RK on the Thing:
|
||||||
|
- This is the epicenter of the cult's work here. This must have been constructed, or if it's something biological, something suspended here. Whatever it is, it isn't good. And it's your best bet at getting rid of these voices forever.
|
||||||
|
- Seeing the chamber in entirety, there is a swathe of distance between the remains of the acquifier.
|
||||||
|
- On the other side of the Cocoon there is an Inky Black Darkness, stonework has been delicately worked to allow for this fixture.
|
||||||
|
- Inside the Chamber we encounter a score of Caligni Dancers, some Masked Cultists, Heavily Armoured Knights and the Cult Leader we fought up above initially.
|
||||||
|
- The fight progresses well and we're able to deal with most threats, but the Cult Leader escapes -- and shortly thereafter, this creature emerges from the Inky Cocoon at the center:![[Pasted image 20260408232039.png]]
|
||||||
|
- **Combat:**
|
||||||
|
- We encounter the remaining Cultists underneath the Remains of the Maelstrom - along with the Leader of the Cult that we first encountered at the Maelstrom. A bunch of Caligni, Knights and Masked Slayers/Flayers
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-04-16
|
||||||
|
Session_Name: Session 27 - A Many Tentacled Problem
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 27 - A Many Tentacled Problem
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
- The Hole underneath the Former Maelstrom in The Wells District of Y'athyr
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- We're able to remove some of the bodies from the cocoon and find some Hellknight's from the Order of the Rack
|
||||||
|
- We head to a Guard Station near Whitewater - find a two people (a human, who were all wearing Hellknight Armor) who had missing person posters up. The Human has been missing for all of two weeks.
|
||||||
|
- The following morning:
|
||||||
|
- Part of the group goes to meet with [[Calia Noctilun]]
|
||||||
|
- Part of the group goes to meet with [[Fenric Draycott]]
|
||||||
|
- [[Faylen Valora]] asks for a ship to help smuggle some Alsatian's into Alseta's Redoubt.
|
||||||
|
- [[Faylen Valora]] lets the entire cat out of the bag, and the group continues to try and persuade him.
|
||||||
|
-
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
- We resume combat with the Giant Wyrm and the remaining Caligni
|
||||||
|
- RK on the Monster:
|
||||||
|
- Seugathi reality warpers create and destroy inhospitable environments on a small scale by manipulating the forces of raw chaos. A neothelid might spawn such a seugathi to create habitats for unique slaves or guests, or to destroy the ecosystem of a troublesome species. Darklands scholars refer to reality warpers as veterans in the seugathi ranks, but they're more accurately compared to aggressive landscape architects. The wicked, alien Neothelids impregnate themselves through ritualistic magic to produce wormlike servitor creatures called seugathis. These creatures spawn with a strong psychic drive to complete some task on behalf of the neothelids' far-reaching plans. These directives are diverse, strange, and usually cruel toward humanoid life
|
||||||
|
- It's a long, hard fight, but we're able to take down the creature with the group nearing the end of it's capabilities.
|
||||||
|
- [[Kite]] deals the finishing blow.
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-04-23
|
||||||
|
Session_Name: Session 28 - Downtime Activities
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 28 - Downtime Activities
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- [[Val]] goes to meet with [[Iniana Asase]] and gets an update on how the meeting with [[Deidre Gille]] and [[Therin Asase]] went. She also states that she knows we've been stepping on alot of people's toes - and she finally inquires as to what we're up to. [[Val]] gives her the short and easy of what we're up to, but let's her in on the truth. It did however, seem like [[Therin Asase]] was going to investigate [[Deidre Gille]]'s situation.
|
||||||
|
- [[Kite]] heads to meet with Lonni - letting them know that Sinni Springvale is dead. He follows on with heading to the Home of the Auclair Family, which posted one of the missing persons posters for one of the Hellknights that we found in the Wells.
|
||||||
|
- The Father states that [[The Archmasons]] had taken Kristoph hostage. Kristoph formerly worked for the City Watch and this had happened to some people who had previously gotten to close to The Wells.
|
||||||
|
- Last time he saw his son was two weeks ago, and he seemed fine at the time. They had had breakfast in the morning and when his son didn't return home from the City Watch after midnight, he went to the Watch's Keep and found a hostage note from [[The Archmasons]] - and the City Watch was either unwilling or unable to pay the ransom.
|
||||||
|
- There were others who came by and said they had information about his Son - the father figures they were Charlatan's; preying on those in grief.
|
||||||
|
- Safehouse Options:
|
||||||
|
- Most Preferable: Empty Warehouse previously used for "goods" storage - located between holding and would allow [[Thin Wisps]] to intercede when Law Enforcement Comes. Costs 15gp a month and does have Dock Access - would allow for a Loading Skiff but not much larger.
|
||||||
|
- A number of apartments in Northpointe and can be put under Aliases - more palatable to finer clientele. Would lack the neccessity of being connected to [[Thin Wisps]]. Purchase would be 900gp for mortgage or 2500 outright.
|
||||||
|
- Prison between Whitewater and the Drenches - has been unmanned and is allegedly haunted. Most scouting operations have found undead - but not being haunted. No timeline on when the City would start looking at it, but if we wanted to oppose the expansion would offer a good bastion. Also exceedingly large for housing people, supplies - also is dock access via canals that run underneath the city.
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,170 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-04-29
|
||||||
|
Session_Name: Session 29 - Prisons, Oh My!
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 29 - Prisons, Oh My!
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- The group has a conversation with [[Fenric Draycott]] and brings him into the loop, and nets 4 influence points.
|
||||||
|
- Following that, the group heads to the Prison to establish their new base.
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-05-06
|
||||||
|
Session_Name: Session 30 - Prisons, Oh My! Part 2
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 30 - Prisons, Oh My! Part 2
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-05-28
|
||||||
|
Session_Name: Session 31 - Prisons, Oh My! Part 3
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 31 - Prisons, Oh My! Part 3
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,177 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-07-01
|
||||||
|
Session_Name: Session 32 - Downtime Activities
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 32 - Downtime Activities
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- The group performs some downtime activities..
|
||||||
|
- Calen reaches out to the High Curate and requests some Acolyte's to be sent to the new SMH Headquarters.
|
||||||
|
- Discovery on Celosia and Influence the Thin Wisps.
|
||||||
|
- Influence [[Iniana Asase]] and learns some information about what the City Watch in Whitewater is up to:
|
||||||
|
- Most of the guards are just [[The Archmasons]] in new armor. They have been put through some efficacy training and under the new governance, the brutality of [[The Archmasons]] is being tamped down.
|
||||||
|
- That is not to say to that it's not happening, only that it's getting better.
|
||||||
|
- The most loyal of the guards are being recruited for some other branch of the City Watch.
|
||||||
|
- [[Metternich]]
|
||||||
|
- Mentions that the City Watch who are being recruited for the Special branch of the Watch are likely for [[House Elidari]] and will likely be fiercely loyal.
|
||||||
|
-
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,180 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-07-08
|
||||||
|
Session_Name: Session 33 - Infiltration of the Arch
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 33 - Infiltration of the Arch
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
- Infiltration of the Arch
|
||||||
|
- Edge Points: 2
|
||||||
|
- My Current Deception DC: 22 (1 + 7 + 4 +10) (+3 when lying with Metternich, per following the Expert)
|
||||||
|
- We talk our way past the first couple of guards and say that we're running early due to mis-planning and misunderstood timing.
|
||||||
|
- A couple guards in front of the stairs heading down to the dig site, questions us a bit more; getting all our names and mentioning that we won't be able to come back up to the base camp for 12 hours (8hr shift + 4hrs early)
|
||||||
|
- We also learn that [[Fritch]] is working as the Dig Leader for the day of our infiltration.
|
||||||
|
- The group opts to explore around the dig area first before reporting to [[Fritch]]
|
||||||
|
- Exploring some of the area, we find an Elevator that heads down - a sheer drop back into the City. [[Kite]] and [[Calen]] pick up trash with the minecart and overhear a conversation with [[Morag Tenrae]] and a robed individual. They speak on letting the Governor know if they find any other pieces or bringing things back up to the basecamp to help sustain the workers.
|
||||||
|
- We find a hidden room in one of the rooms, which leads to a chamber which contains what is effectively a computer that contains information about the peoples and lifeforms that have passed through the portal or who have accessed the life system - called the [[Lifeform Catalog]]
|
||||||
|
- The last access prior to us was 32 hours prior and was [[Kite's Husband]]
|
||||||
|
- [[Calen]] questions [[Kite]] as to the purpose and [[Kite]] says that it was a system used to identify health and detect diseases - but Calen realizes there is something off to what he is told.
|
||||||
|
- An Empirical Analysis: Theoretically, large amounts of biological data would allow for the tracking of generational tendencies towards certain diseases. With modern medicine, biological and genetic manipulation via magical means could even allow the erradication of certain ailments that living creatures are predisposed towards.
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
---
|
||||||
|
Date: 2026-07-15
|
||||||
|
Session_Name: Session 34 - Infiltration of the Arch Part 2
|
||||||
|
Tags:
|
||||||
|
- pf2e
|
||||||
|
- session
|
||||||
|
---
|
||||||
|
|
||||||
|
# Session 34 - Infiltration of the Arch Part 2
|
||||||
|
|
||||||
|
> **Date:** `= this.Date` • **Name:** `= this.Session_Name`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📄 Session Summary (auto)
|
||||||
|
<!-- SUMMARY-START -->
|
||||||
|
*No summary yet — click “Generate Summary” below.*
|
||||||
|
<!-- SUMMARY-END -->
|
||||||
|
|
||||||
|
```button
|
||||||
|
name ✍️ Generate AI Summary
|
||||||
|
type template
|
||||||
|
action Templates/Generate AI Session Summary.md
|
||||||
|
templater true
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧭 Where / When
|
||||||
|
|
||||||
|
- **Region / Location:**
|
||||||
|
|
||||||
|
- **In-game Date / Time:**
|
||||||
|
|
||||||
|
- **Weather / Conditions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 👥 PCs Present / Absent
|
||||||
|
|
||||||
|
- **Present:**
|
||||||
|
|
||||||
|
- **Absent:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⭐ Highlights (feed the auto-summary)
|
||||||
|
|
||||||
|
> Add one or more `Highlight::` lines. The button will build a summary from these.
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
- Highlight::
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Quests & Progress
|
||||||
|
|
||||||
|
- **Active Objectives:**
|
||||||
|
|
||||||
|
- **Progress / Resolutions:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗣️ NPCs Met / Factions
|
||||||
|
|
||||||
|
- **NPCs:** [[ ]] [[ ]] [[ ]]
|
||||||
|
|
||||||
|
- **Factions Touched:** [[ ]] [[ ]]
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚔️ Encounters
|
||||||
|
|
||||||
|
- **Social / Exploration:**
|
||||||
|
|
||||||
|
- **Combat:**
|
||||||
|
|
||||||
|
- **Outcome / Loot:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Intel Captured (auto)
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
const THIS = dv.current();
|
||||||
|
const sessName = THIS.file.name;
|
||||||
|
const sessDate = THIS.Date ?? dv.current().file.frontmatter?.Date ?? "";
|
||||||
|
const sessLC = sessName.toLowerCase();
|
||||||
|
|
||||||
|
const pages = dv.pages("#npc or #faction").where(p => p.Intel);
|
||||||
|
|
||||||
|
function matchesSessionField(sessionField) {
|
||||||
|
const list = Array.isArray(sessionField) ? sessionField : [sessionField];
|
||||||
|
for (const s of list) {
|
||||||
|
if (!s) continue;
|
||||||
|
if (typeof s === "object" && s.path) {
|
||||||
|
const base = s.path.split("/").pop().replace(/\.md$/i,"");
|
||||||
|
if (base.toLowerCase() === sessLC) return true;
|
||||||
|
} else {
|
||||||
|
const text = String(s);
|
||||||
|
if (text.includes(`[[${sessName}]]`)) return true;
|
||||||
|
if (text.toLowerCase() === sessLC) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = [];
|
||||||
|
for (const p of pages) {
|
||||||
|
for (const it of p.Intel) {
|
||||||
|
let ok = false;
|
||||||
|
if (it.session) ok = matchesSessionField(it.session);
|
||||||
|
if (!ok && sessDate && it.date) ok = String(it.date) === String(sessDate); // fallback
|
||||||
|
if (ok) {
|
||||||
|
rows.push({
|
||||||
|
from: p.file.link,
|
||||||
|
date: it.date ?? "",
|
||||||
|
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 ?? "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort((a,b)=> String(b.date).localeCompare(String(a.date)));
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
dv.paragraph("_No intel captured for this session yet._");
|
||||||
|
} else {
|
||||||
|
dv.table(
|
||||||
|
["From", "Date", "Type", "Summary", "Source", "Rel", "Cred", "Tags"],
|
||||||
|
rows.map(r => [r.from, r.date, r.type, r.summary, r.source, r.rel, r.cred, r.tags])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Treasure & Rewards
|
||||||
|
|
||||||
|
- **Items:**
|
||||||
|
|
||||||
|
- **Coin:**
|
||||||
|
|
||||||
|
- **XP / Milestones:**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔜 Next Hooks / To-Dos
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
- [ ]
|
||||||
@@ -14,7 +14,7 @@ DM: Tommy
|
|||||||
2. [[Metternich]] is going to speak with [[Lord Ellin Vaust]] to see if he can perhaps attend as his +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]].
|
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]].
|
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.
|
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 Valrora]] going forward.
|
||||||
3. [[Lord Ellin Vaust]] agrees to meet with the remainder of the party the following day.
|
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
|
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.
|
1. We find out that we're being tailed. We're bad at surprising the guy but are able to approach him eventually.
|
||||||
|
|||||||
@@ -21,5 +21,5 @@ DM: Tommy
|
|||||||
1. Brief introductions play out, and he introduces himself as a merchant and proprietor of many goods in the city.
|
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.
|
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.
|
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.
|
1. [[House Elidari]] finds themselves more willing to be a pawn of House Evandra, while [[House Valrora]] found themselves more concerned with the operations of the city.
|
||||||
4.
|
4.
|
||||||
|
After Width: | Height: | Size: 103 KiB |
|
After Width: | Height: | Size: 827 KiB |
|
After Width: | Height: | Size: 523 KiB |
|
After Width: | Height: | Size: 772 KiB |
|
After Width: | Height: | Size: 687 KiB |
|
After Width: | Height: | Size: 550 KiB |
|
After Width: | Height: | Size: 842 KiB |
|
After Width: | Height: | Size: 648 KiB |
|
After Width: | Height: | Size: 254 KiB |
|
After Width: | Height: | Size: 410 KiB |
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 652 KiB |
|
After Width: | Height: | Size: 918 KiB |
|
After Width: | Height: | Size: 299 KiB |
|
After Width: | Height: | Size: 335 KiB |
|
After Width: | Height: | Size: 558 KiB |
|
After Width: | Height: | Size: 279 KiB |
|
After Width: | Height: | Size: 445 KiB |
|
After Width: | Height: | Size: 837 KiB |
|
After Width: | Height: | Size: 702 KiB |
|
After Width: | Height: | Size: 682 KiB |
|
After Width: | Height: | Size: 266 KiB |
|
After Width: | Height: | Size: 669 KiB |
|
After Width: | Height: | Size: 684 KiB |
|
After Width: | Height: | Size: 806 KiB |
|
After Width: | Height: | Size: 378 KiB |
|
After Width: | Height: | Size: 568 KiB |
|
After Width: | Height: | Size: 28 KiB |