Overview
(A brief 1-2 sentence description of the location’s vibe or history.)
let current = dv.current();
let title = current.file?.name || current.name || "";
// 0. Suppress artwork search on template notes
if (title.toLowerCase().includes("template")) {
dv.paragraph(`*(Location / Building Image Preview)*`);
} else {
// 1. Gather all potential names (Title, quoted nicknames, and Obsidian Aliases)
let rawNames = [title];
// Extract quoted nickname if present in title (e.g. Holy Dominion "Estwatch" -> Estwatch)
let matchNick = title.match(/"([^"]+)"/);
if (matchNick && matchNick[1]) {
rawNames.push(matchNick[1]);
}
// Pull aliases safely
let aliases = current.file?.aliases || current.aliases || [];
if (typeof aliases === "string") {
rawNames.push(aliases);
} else if (Array.isArray(aliases) || (aliases && typeof aliases[Symbol.iterator] === "function")) {
for (let a of aliases) {
if (a && typeof a === "string") rawNames.push(a);
}
}
// 2. Build sanitized search terms
let searchTerms = new Set();
for (let name of rawNames) {
if (!name || typeof name !== "string") continue;
let lower = name.toLowerCase().trim().replace(/["']/g, "");
let slug = lower.replace(/[\s-]+/g, "_").replace(/^_+|_+$ /g, "");
if (lower.length >= 2) searchTerms.add(lower);
if (slug.length >= 2) searchTerms.add(slug);
}
// 3. Search target folders for matching image files (.png, .webp, .jpg, etc.)
let imageFolders = ["Images/Locations", "Image/Locations", "Images/Buildings", "Image/Buildings"];
let fallbackImage = "";
let matches = app.vault.getFiles().filter(f => {
let pathLower = f.path.toLowerCase();
let inTargetFolder = imageFolders.some(folder => pathLower.includes(folder.toLowerCase()));
if (!inTargetFolder) return false;
if (fallbackImage && pathLower.includes(fallbackImage.toLowerCase())) return false;
let imgName = f.name.toLowerCase();
return Array.from(searchTerms).some(term => term && imgName.includes(term));
});
// 4. Select match (prioritize "settlement", "overview", "cover", or "map", otherwise take the first file)
let match = matches.find(f => {
let nameLower = f.name.toLowerCase();
return nameLower.includes("settlement") || nameLower.includes("overview") || nameLower.includes("cover") || nameLower.includes("map");
}) || (matches.length > 0 ? matches[0] : null);
// 5. Render artwork, fallback image, or clean message
if (match && match.path) {
dv.paragraph(`![[${match.path}|cover]]`);
} else {
let fallbackFile = null;
if (fallbackImage && fallbackImage.trim() !== "") {
let cleanFB = fallbackImage.toLowerCase().trim();
fallbackFile = app.vault.getFiles().find(f =>
f.path.toLowerCase() === cleanFB ||
f.path.toLowerCase().includes(cleanFB) ||
f.name.toLowerCase().includes(cleanFB)
);
}
if (fallbackFile && fallbackFile.path) {
dv.paragraph(`![[${fallbackFile.path}|cover]]`);
} else {
dv.paragraph(`*No map or illustration found for ${title}*`);
}
}
}Districts
Areas & Points of Interest
Chevid
Chevid
Overview
(A brief 1-2 sentence description of the location’s vibe or history.)
let current = dv.current(); let title = current.file?.name || current.name || ""; // 0. Suppress artwork search on template notes if (title.toLowerCase().includes("template")) { dv.paragraph(`*(Location / Building Image Preview)*`); } else { // 1. Gather all potential names (Title, quoted nicknames, and Obsidian Aliases) let rawNames = [title]; // Extract quoted nickname if present in title (e.g. Holy Dominion "Estwatch" -> Estwatch) let matchNick = title.match(/"([^"]+)"/); if (matchNick && matchNick[1]) { rawNames.push(matchNick[1]); } // Pull aliases safely let aliases = current.file?.aliases || current.aliases || []; if (typeof aliases === "string") { rawNames.push(aliases); } else if (Array.isArray(aliases) || (aliases && typeof aliases[Symbol.iterator] === "function")) { for (let a of aliases) { if (a && typeof a === "string") rawNames.push(a); } } // 2. Build sanitized search terms let searchTerms = new Set(); for (let name of rawNames) { if (!name || typeof name !== "string") continue; let lower = name.toLowerCase().trim().replace(/["']/g, ""); let slug = lower.replace(/[\s-]+/g, "_").replace(/^_+|_+$ /g, ""); if (lower.length >= 2) searchTerms.add(lower); if (slug.length >= 2) searchTerms.add(slug); } // 3. Search target folders for matching image files (.png, .webp, .jpg, etc.) let imageFolders = ["Images/Locations", "Image/Locations", "Images/Buildings", "Image/Buildings"]; let fallbackImage = ""; let matches = app.vault.getFiles().filter(f => { let pathLower = f.path.toLowerCase(); let inTargetFolder = imageFolders.some(folder => pathLower.includes(folder.toLowerCase())); if (!inTargetFolder) return false; if (fallbackImage && pathLower.includes(fallbackImage.toLowerCase())) return false; let imgName = f.name.toLowerCase(); return Array.from(searchTerms).some(term => term && imgName.includes(term)); }); // 4. Select match (prioritize "settlement", "overview", "cover", or "map", otherwise take the first file) let match = matches.find(f => { let nameLower = f.name.toLowerCase(); return nameLower.includes("settlement") || nameLower.includes("overview") || nameLower.includes("cover") || nameLower.includes("map"); }) || (matches.length > 0 ? matches[0] : null); // 5. Render artwork, fallback image, or clean message if (match && match.path) { dv.paragraph(`![[${match.path}|cover]]`); } else { let fallbackFile = null; if (fallbackImage && fallbackImage.trim() !== "") { let cleanFB = fallbackImage.toLowerCase().trim(); fallbackFile = app.vault.getFiles().find(f => f.path.toLowerCase() === cleanFB || f.path.toLowerCase().includes(cleanFB) || f.name.toLowerCase().includes(cleanFB) ); } if (fallbackFile && fallbackFile.path) { dv.paragraph(`![[${fallbackFile.path}|cover]]`); } else { dv.paragraph(`*No map or illustration found for ${title}*`); } } }Districts
Areas & Points of Interest
Old Town
Military District
There is a semi-public library maintained by House Korunda here. Jaslin Farlight works there.
Bodyguards - Bhaldir Branmund Galnir - LD Thargran Tharmond Vondor
Northway
South District
The Boatman Inn
Tailor's Road
West District
Link to originalMiddlerow
Khas'kive
Khas'kive
Overview
(A brief 1-2 sentence description of the location’s vibe or history.)
let current = dv.current(); let title = current.file?.name || current.name || ""; // 0. Suppress artwork search on template notes if (title.toLowerCase().includes("template")) { dv.paragraph(`*(Location / Building Image Preview)*`); } else { // 1. Gather all potential names (Title, quoted nicknames, and Obsidian Aliases) let rawNames = [title]; // Extract quoted nickname if present in title (e.g. Holy Dominion "Estwatch" -> Estwatch) let matchNick = title.match(/"([^"]+)"/); if (matchNick && matchNick[1]) { rawNames.push(matchNick[1]); } // Pull aliases safely let aliases = current.file?.aliases || current.aliases || []; if (typeof aliases === "string") { rawNames.push(aliases); } else if (Array.isArray(aliases) || (aliases && typeof aliases[Symbol.iterator] === "function")) { for (let a of aliases) { if (a && typeof a === "string") rawNames.push(a); } } // 2. Build sanitized search terms let searchTerms = new Set(); for (let name of rawNames) { if (!name || typeof name !== "string") continue; let lower = name.toLowerCase().trim().replace(/["']/g, ""); let slug = lower.replace(/[\s-]+/g, "_").replace(/^_+|_+$ /g, ""); if (lower.length >= 2) searchTerms.add(lower); if (slug.length >= 2) searchTerms.add(slug); } // 3. Search target folders for matching image files (.png, .webp, .jpg, etc.) let imageFolders = ["Images/Locations", "Image/Locations", "Images/Buildings", "Image/Buildings"]; let fallbackImage = ""; let matches = app.vault.getFiles().filter(f => { let pathLower = f.path.toLowerCase(); let inTargetFolder = imageFolders.some(folder => pathLower.includes(folder.toLowerCase())); if (!inTargetFolder) return false; if (fallbackImage && pathLower.includes(fallbackImage.toLowerCase())) return false; let imgName = f.name.toLowerCase(); return Array.from(searchTerms).some(term => term && imgName.includes(term)); }); // 4. Select match (prioritize "settlement", "overview", "cover", or "map", otherwise take the first file) let match = matches.find(f => { let nameLower = f.name.toLowerCase(); return nameLower.includes("settlement") || nameLower.includes("overview") || nameLower.includes("cover") || nameLower.includes("map"); }) || (matches.length > 0 ? matches[0] : null); // 5. Render artwork, fallback image, or clean message if (match && match.path) { dv.paragraph(`![[${match.path}|cover]]`); } else { let fallbackFile = null; if (fallbackImage && fallbackImage.trim() !== "") { let cleanFB = fallbackImage.toLowerCase().trim(); fallbackFile = app.vault.getFiles().find(f => f.path.toLowerCase() === cleanFB || f.path.toLowerCase().includes(cleanFB) || f.name.toLowerCase().includes(cleanFB) ); } if (fallbackFile && fallbackFile.path) { dv.paragraph(`![[${fallbackFile.path}|cover]]`); } else { dv.paragraph(`*No map or illustration found for ${title}*`); } } }Districts
Areas & Points of Interest
Stormsprawl
Home to Old Jack and his expansive family.
Nightmire
Link to originalThe Docks
Lockinge
Lockinge
Overview
(A brief 1-2 sentence description of the location’s vibe or history.)
let current = dv.current(); let title = current.file?.name || current.name || ""; // 0. Suppress artwork search on template notes if (title.toLowerCase().includes("template")) { dv.paragraph(`*(Location / Building Image Preview)*`); } else { // 1. Gather all potential names (Title, quoted nicknames, and Obsidian Aliases) let rawNames = [title]; // Extract quoted nickname if present in title (e.g. Holy Dominion "Estwatch" -> Estwatch) let matchNick = title.match(/"([^"]+)"/); if (matchNick && matchNick[1]) { rawNames.push(matchNick[1]); } // Pull aliases safely let aliases = current.file?.aliases || current.aliases || []; if (typeof aliases === "string") { rawNames.push(aliases); } else if (Array.isArray(aliases) || (aliases && typeof aliases[Symbol.iterator] === "function")) { for (let a of aliases) { if (a && typeof a === "string") rawNames.push(a); } } // 2. Build sanitized search terms let searchTerms = new Set(); for (let name of rawNames) { if (!name || typeof name !== "string") continue; let lower = name.toLowerCase().trim().replace(/["']/g, ""); let slug = lower.replace(/[\s-]+/g, "_").replace(/^_+|_+$ /g, ""); if (lower.length >= 2) searchTerms.add(lower); if (slug.length >= 2) searchTerms.add(slug); } // 3. Search target folders for matching image files (.png, .webp, .jpg, etc.) let imageFolders = ["Images/Locations", "Image/Locations", "Images/Buildings", "Image/Buildings"]; let fallbackImage = ""; let matches = app.vault.getFiles().filter(f => { let pathLower = f.path.toLowerCase(); let inTargetFolder = imageFolders.some(folder => pathLower.includes(folder.toLowerCase())); if (!inTargetFolder) return false; if (fallbackImage && pathLower.includes(fallbackImage.toLowerCase())) return false; let imgName = f.name.toLowerCase(); return Array.from(searchTerms).some(term => term && imgName.includes(term)); }); // 4. Select match (prioritize "settlement", "overview", "cover", or "map", otherwise take the first file) let match = matches.find(f => { let nameLower = f.name.toLowerCase(); return nameLower.includes("settlement") || nameLower.includes("overview") || nameLower.includes("cover") || nameLower.includes("map"); }) || (matches.length > 0 ? matches[0] : null); // 5. Render artwork, fallback image, or clean message if (match && match.path) { dv.paragraph(`![[${match.path}|cover]]`); } else { let fallbackFile = null; if (fallbackImage && fallbackImage.trim() !== "") { let cleanFB = fallbackImage.toLowerCase().trim(); fallbackFile = app.vault.getFiles().find(f => f.path.toLowerCase() === cleanFB || f.path.toLowerCase().includes(cleanFB) || f.name.toLowerCase().includes(cleanFB) ); } if (fallbackFile && fallbackFile.path) { dv.paragraph(`![[${fallbackFile.path}|cover]]`); } else { dv.paragraph(`*No map or illustration found for ${title}*`); } } }Districts
Areas & Points of Interest
Old Town
Cherry Park
South Gate
Link to originalMiddlesong
Rossashus
Rossashus
Overview
(A brief 1-2 sentence description of the location’s vibe or history.)
let current = dv.current(); let title = current.file?.name || current.name || ""; // 0. Suppress artwork search on template notes if (title.toLowerCase().includes("template")) { dv.paragraph(`*(Location / Building Image Preview)*`); } else { // 1. Gather all potential names (Title, quoted nicknames, and Obsidian Aliases) let rawNames = [title]; // Extract quoted nickname if present in title (e.g. Holy Dominion "Estwatch" -> Estwatch) let matchNick = title.match(/"([^"]+)"/); if (matchNick && matchNick[1]) { rawNames.push(matchNick[1]); } // Pull aliases safely let aliases = current.file?.aliases || current.aliases || []; if (typeof aliases === "string") { rawNames.push(aliases); } else if (Array.isArray(aliases) || (aliases && typeof aliases[Symbol.iterator] === "function")) { for (let a of aliases) { if (a && typeof a === "string") rawNames.push(a); } } // 2. Build sanitized search terms let searchTerms = new Set(); for (let name of rawNames) { if (!name || typeof name !== "string") continue; let lower = name.toLowerCase().trim().replace(/["']/g, ""); let slug = lower.replace(/[\s-]+/g, "_").replace(/^_+|_+$ /g, ""); if (lower.length >= 2) searchTerms.add(lower); if (slug.length >= 2) searchTerms.add(slug); } // 3. Search target folders for matching image files (.png, .webp, .jpg, etc.) let imageFolders = ["Images/Locations", "Image/Locations", "Images/Buildings", "Image/Buildings"]; let fallbackImage = ""; let matches = app.vault.getFiles().filter(f => { let pathLower = f.path.toLowerCase(); let inTargetFolder = imageFolders.some(folder => pathLower.includes(folder.toLowerCase())); if (!inTargetFolder) return false; if (fallbackImage && pathLower.includes(fallbackImage.toLowerCase())) return false; let imgName = f.name.toLowerCase(); return Array.from(searchTerms).some(term => term && imgName.includes(term)); }); // 4. Select match (prioritize "settlement", "overview", "cover", or "map", otherwise take the first file) let match = matches.find(f => { let nameLower = f.name.toLowerCase(); return nameLower.includes("settlement") || nameLower.includes("overview") || nameLower.includes("cover") || nameLower.includes("map"); }) || (matches.length > 0 ? matches[0] : null); // 5. Render artwork, fallback image, or clean message if (match && match.path) { dv.paragraph(`![[${match.path}|cover]]`); } else { let fallbackFile = null; if (fallbackImage && fallbackImage.trim() !== "") { let cleanFB = fallbackImage.toLowerCase().trim(); fallbackFile = app.vault.getFiles().find(f => f.path.toLowerCase() === cleanFB || f.path.toLowerCase().includes(cleanFB) || f.name.toLowerCase().includes(cleanFB) ); } if (fallbackFile && fallbackFile.path) { dv.paragraph(`![[${fallbackFile.path}|cover]]`); } else { dv.paragraph(`*No map or illustration found for ${title}*`); } } }Districts
Areas & Points of Interest
Forlorn Point
North District
It is run by Umbril Wyndael and his wife Annabelle Wyndael. They have a serving girl named Ishara Bransdottir. An Inn cat by the name of Bubbles is rarely found elsewhere.
It is the regular haunt of Grummond Hornraven.
Fortress
Shortmire
East Road
Ivysteps
The Mills
Wheattower
Link to originalOld Rossashus Cemetery
A Sanctuary of Meher is located here.
The Rossashus Barrow was located in the most ancient section of Old Rossashus Cemetery
It imprisoned The Cannibal King. An undead necromantic tyrant who ruled the land untold ages past.
During the Malediction Exhumed plot the Evergloom Cult cult weakened the wards on the prison.
Calyn Omarion destroyed the wards entirely and released The Cannibal King when he withdraw Banish the Greatsword from the centre of the standing stones atop the barrow.
Snowbush
Snowbush
Overview
(A brief 1-2 sentence description of the location’s vibe or history.)
let current = dv.current(); let title = current.file?.name || current.name || ""; // 0. Suppress artwork search on template notes if (title.toLowerCase().includes("template")) { dv.paragraph(`*(Location / Building Image Preview)*`); } else { // 1. Gather all potential names (Title, quoted nicknames, and Obsidian Aliases) let rawNames = [title]; // Extract quoted nickname if present in title (e.g. Holy Dominion "Estwatch" -> Estwatch) let matchNick = title.match(/"([^"]+)"/); if (matchNick && matchNick[1]) { rawNames.push(matchNick[1]); } // Pull aliases safely let aliases = current.file?.aliases || current.aliases || []; if (typeof aliases === "string") { rawNames.push(aliases); } else if (Array.isArray(aliases) || (aliases && typeof aliases[Symbol.iterator] === "function")) { for (let a of aliases) { if (a && typeof a === "string") rawNames.push(a); } } // 2. Build sanitized search terms let searchTerms = new Set(); for (let name of rawNames) { if (!name || typeof name !== "string") continue; let lower = name.toLowerCase().trim().replace(/["']/g, ""); let slug = lower.replace(/[\s-]+/g, "_").replace(/^_+|_+$ /g, ""); if (lower.length >= 2) searchTerms.add(lower); if (slug.length >= 2) searchTerms.add(slug); } // 3. Search target folders for matching image files (.png, .webp, .jpg, etc.) let imageFolders = ["Images/Locations", "Image/Locations", "Images/Buildings", "Image/Buildings"]; let fallbackImage = ""; let matches = app.vault.getFiles().filter(f => { let pathLower = f.path.toLowerCase(); let inTargetFolder = imageFolders.some(folder => pathLower.includes(folder.toLowerCase())); if (!inTargetFolder) return false; if (fallbackImage && pathLower.includes(fallbackImage.toLowerCase())) return false; let imgName = f.name.toLowerCase(); return Array.from(searchTerms).some(term => term && imgName.includes(term)); }); // 4. Select match (prioritize "settlement", "overview", "cover", or "map", otherwise take the first file) let match = matches.find(f => { let nameLower = f.name.toLowerCase(); return nameLower.includes("settlement") || nameLower.includes("overview") || nameLower.includes("cover") || nameLower.includes("map"); }) || (matches.length > 0 ? matches[0] : null); // 5. Render artwork, fallback image, or clean message if (match && match.path) { dv.paragraph(`![[${match.path}|cover]]`); } else { let fallbackFile = null; if (fallbackImage && fallbackImage.trim() !== "") { let cleanFB = fallbackImage.toLowerCase().trim(); fallbackFile = app.vault.getFiles().find(f => f.path.toLowerCase() === cleanFB || f.path.toLowerCase().includes(cleanFB) || f.name.toLowerCase().includes(cleanFB) ); } if (fallbackFile && fallbackFile.path) { dv.paragraph(`![[${fallbackFile.path}|cover]]`); } else { dv.paragraph(`*No map or illustration found for ${title}*`); } } }Districts
Areas & Points of Interest
Old Snowbush
Eastgate
North Quarter
Link to originalWest Ward
Ubbin Falls
Ubbin Falls
Overview
(A brief 1-2 sentence description of the location’s vibe or history.)
let current = dv.current(); let title = current.file?.name || current.name || ""; // 0. Suppress artwork search on template notes if (title.toLowerCase().includes("template")) { dv.paragraph(`*(Location / Building Image Preview)*`); } else { // 1. Gather all potential names (Title, quoted nicknames, and Obsidian Aliases) let rawNames = [title]; // Extract quoted nickname if present in title (e.g. Holy Dominion "Estwatch" -> Estwatch) let matchNick = title.match(/"([^"]+)"/); if (matchNick && matchNick[1]) { rawNames.push(matchNick[1]); } // Pull aliases safely let aliases = current.file?.aliases || current.aliases || []; if (typeof aliases === "string") { rawNames.push(aliases); } else if (Array.isArray(aliases) || (aliases && typeof aliases[Symbol.iterator] === "function")) { for (let a of aliases) { if (a && typeof a === "string") rawNames.push(a); } } // 2. Build sanitized search terms let searchTerms = new Set(); for (let name of rawNames) { if (!name || typeof name !== "string") continue; let lower = name.toLowerCase().trim().replace(/["']/g, ""); let slug = lower.replace(/[\s-]+/g, "_").replace(/^_+|_+$ /g, ""); if (lower.length >= 2) searchTerms.add(lower); if (slug.length >= 2) searchTerms.add(slug); } // 3. Search target folders for matching image files (.png, .webp, .jpg, etc.) let imageFolders = ["Images/Locations", "Image/Locations", "Images/Buildings", "Image/Buildings"]; let fallbackImage = ""; let matches = app.vault.getFiles().filter(f => { let pathLower = f.path.toLowerCase(); let inTargetFolder = imageFolders.some(folder => pathLower.includes(folder.toLowerCase())); if (!inTargetFolder) return false; if (fallbackImage && pathLower.includes(fallbackImage.toLowerCase())) return false; let imgName = f.name.toLowerCase(); return Array.from(searchTerms).some(term => term && imgName.includes(term)); }); // 4. Select match (prioritize "settlement", "overview", "cover", or "map", otherwise take the first file) let match = matches.find(f => { let nameLower = f.name.toLowerCase(); return nameLower.includes("settlement") || nameLower.includes("overview") || nameLower.includes("cover") || nameLower.includes("map"); }) || (matches.length > 0 ? matches[0] : null); // 5. Render artwork, fallback image, or clean message if (match && match.path) { dv.paragraph(`![[${match.path}|cover]]`); } else { let fallbackFile = null; if (fallbackImage && fallbackImage.trim() !== "") { let cleanFB = fallbackImage.toLowerCase().trim(); fallbackFile = app.vault.getFiles().find(f => f.path.toLowerCase() === cleanFB || f.path.toLowerCase().includes(cleanFB) || f.name.toLowerCase().includes(cleanFB) ); } if (fallbackFile && fallbackFile.path) { dv.paragraph(`![[${fallbackFile.path}|cover]]`); } else { dv.paragraph(`*No map or illustration found for ${title}*`); } } }Districts
Areas & Points of Interest
Old District
Pilgrims House
Ratbrook
East Quarter
Link to originalEgstar
Wavemeet
Wavemeet
Overview
(A brief 1-2 sentence description of the location’s vibe or history.)
let current = dv.current(); let title = current.file?.name || current.name || ""; // 0. Suppress artwork search on template notes if (title.toLowerCase().includes("template")) { dv.paragraph(`*(Location / Building Image Preview)*`); } else { // 1. Gather all potential names (Title, quoted nicknames, and Obsidian Aliases) let rawNames = [title]; // Extract quoted nickname if present in title (e.g. Holy Dominion "Estwatch" -> Estwatch) let matchNick = title.match(/"([^"]+)"/); if (matchNick && matchNick[1]) { rawNames.push(matchNick[1]); } // Pull aliases safely let aliases = current.file?.aliases || current.aliases || []; if (typeof aliases === "string") { rawNames.push(aliases); } else if (Array.isArray(aliases) || (aliases && typeof aliases[Symbol.iterator] === "function")) { for (let a of aliases) { if (a && typeof a === "string") rawNames.push(a); } } // 2. Build sanitized search terms let searchTerms = new Set(); for (let name of rawNames) { if (!name || typeof name !== "string") continue; let lower = name.toLowerCase().trim().replace(/["']/g, ""); let slug = lower.replace(/[\s-]+/g, "_").replace(/^_+|_+$ /g, ""); if (lower.length >= 2) searchTerms.add(lower); if (slug.length >= 2) searchTerms.add(slug); } // 3. Search target folders for matching image files (.png, .webp, .jpg, etc.) let imageFolders = ["Images/Locations", "Image/Locations", "Images/Buildings", "Image/Buildings"]; let fallbackImage = ""; let matches = app.vault.getFiles().filter(f => { let pathLower = f.path.toLowerCase(); let inTargetFolder = imageFolders.some(folder => pathLower.includes(folder.toLowerCase())); if (!inTargetFolder) return false; if (fallbackImage && pathLower.includes(fallbackImage.toLowerCase())) return false; let imgName = f.name.toLowerCase(); return Array.from(searchTerms).some(term => term && imgName.includes(term)); }); // 4. Select match (prioritize "settlement", "overview", "cover", or "map", otherwise take the first file) let match = matches.find(f => { let nameLower = f.name.toLowerCase(); return nameLower.includes("settlement") || nameLower.includes("overview") || nameLower.includes("cover") || nameLower.includes("map"); }) || (matches.length > 0 ? matches[0] : null); // 5. Render artwork, fallback image, or clean message if (match && match.path) { dv.paragraph(`![[${match.path}|cover]]`); } else { let fallbackFile = null; if (fallbackImage && fallbackImage.trim() !== "") { let cleanFB = fallbackImage.toLowerCase().trim(); fallbackFile = app.vault.getFiles().find(f => f.path.toLowerCase() === cleanFB || f.path.toLowerCase().includes(cleanFB) || f.name.toLowerCase().includes(cleanFB) ); } if (fallbackFile && fallbackFile.path) { dv.paragraph(`![[${fallbackFile.path}|cover]]`); } else { dv.paragraph(`*No map or illustration found for ${title}*`); } } }Districts
Areas & Points of Interest
Trade Town
The Docks
Haunted Meadow
Cleargate
Glassgrove
The Fair
Seven Wells
Link to originalWest Gate
Recent Activity
This section displays every time this entity is mentioned in session summaries.
Session 0-1
- The task was equally brief. The Vermin Directorates agents had gone missing within the Storm Coast region within Korunda Prefecture. The Directorate had sent one of their more competent agents, Kilvin, to investigate. They had lost contact with him also.
- The party made their preparations to leave the city of Ancelstierre and travel to the Storm Coast. Gideon von Scholtz II, revealed to be the second son of a powerful noble, visited the Broken Drum Inn. There he bid farewell to Segeant Dyer, a man-at-arms sworn to House von Schotlz, and his favourite orc prostitute Esmerelda.
Session 0-3
- The Party then travelled to Chevid, capital of Korunda Prefecture. Whilst there they spoke with Fain Farlight, seneschal for Great House Korunda. The party passed on their news whilst also receiving word from Fain. Fain confirmed the rumours that the city had been having regular nightmares that were debilitating and suspected to be supernatural in origin. Fain had been authorised to reward anyone who assisted in resolving this. Fain advised that Nira Crakehall was a researcher associated with Great House Lyran who was visiting to assist. Crakehall had the service of a sarcastic quickling familiar named Flit. On a more personal note Fain contracted the party to investigate the disappearance of his sister, Jaslin Farlight. Jaslin worked in the library provided to the people by Korunda. After visiting the library and speaking with Crakehall the party left to go to Jaslin’s home.
- The party found that within the Elder Brain lair it was shackled by spectral chains. There was an elven appearing Fey present who introduced herself as Caraway. Caraway implied that she was formerly of the Winter Court but now served Dread Ethel. Caraway commanded the Elder Brain on behalf of Dread Ethel for whatever plot she was carrying out in Chevid and the Storm Coast region. Caraway was slain and upon this happening the chains disappeared, allowing the Elder Brain to immediately escape.
Session 0-2
- As the party tried to rest for the evening within the inn taproom, the doors burst open. In shambled walking corpses directed by a robed man named Aradhir. They were clearly there to kill the party. Following the party putting the zombies to rest and capturing Aradhir they found a note on his person. This note detailed the parties description and suggested that some mystic divined they’d be a problem. A local of the inn present was Grummond Hornraven, a retired dwarf watchmen from the Korunda Prefecture capital, Chevid. Grummond was a friend and asset for Kilvin, and upon seeing this attack, agreed to help the party. He took custody of Aradhir and promised to get word about all that had gone on so far back to authorities.






