6.9 KiB
6.9 KiB
Reputation, Faction_Type, Motto, Ideology, Symbol, Colors, Headquarters, Territories, Allies, Rivals, SMH_Acronym, Intel, Tags
| Reputation | Faction_Type | Motto | Ideology | Symbol | Colors | Headquarters | Territories | Allies | Rivals | SMH_Acronym | Intel | Tags | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 5 | Gang | Semi-Communism |
|
|
|
Thin Wisps
Territorial Gang of the Drenches
🎨 Artwork
!
Optional caption / artist credit
🧭 Identity & Heraldry
- Motto:
= default(this.Motto, "—") - Symbol:
= default(this.Symbol, "—") - Colors:
= default(this.Colors, "—") - Headquarters:
= default(this.Headquarters, "—") - Territories:
= this.Territories
📜 Ideology & Goals
- Ideology / Alignment:
= default(this.Ideology, "—") - Primary Goals: - Believe they should be the one's running the drenches - Believe that people who work in the various parts of the city should be running it.
-
Taboos / Anathema:
🤝 Relationship with Party
- Reputation:
= this.Reputation
🧑💼 Leadership & Structure
- Leader(s): NPC A, NPC B
- Structure: (council, hierarchy, cells, chapters)
- Key Offices: (Intelligence, Logistics, Priory, Treasury, etc.)
🧰 Assets & Operations
- Resources: (coin, troops, mages, ships, safehouses, contacts)
- Notable Holdings:
- Typical Ops / Tactics:
- Intimidation (see intel)
- Thievery
🕊️ Diplomacy & Relations
- Allies:
= this.Allies - Rivals:
= this.Rivals - Stance toward “SMH” (their wording):
= default(this.SMH_Acronym, "—")
🧠 Intelligence & Mentions
name ➕ Add Intel
type command
action Templater: Insert Add Intel Entry to Faction
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})_`);
// 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)
TABLE link(file.name) AS NPC, number(Level_of_Influence) AS Influence, default(SMH_Acronym, "—") AS SMH
FROM #npc
WHERE file.name != "NPC Template"
AND (
Faction = this.file.link
OR lower(string(Faction)) = lower(this.file.name)
OR contains(lower(string(Faction)), lower(this.file.name))
)
SORT number(Level_of_Influence) DESC
📌 Plot Hooks & Notes
🗒 Session Updates
- 2025-10-02: …