let current = dv.current();let title = current.file?.name || current.name || "";// 0. Suppress artwork search on template notesif (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
Alver
Alver
Overview
Alver is a small town located in the Belmont Prefecture, surrounded by dense forests and foothills of the mountain range. The town is divided into four districts, each with its unique features.
let current = dv.current();let title = current.file?.name || current.name || "";// 0. Suppress artwork search on template notesif (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
West District
West District is the smallest of the four districts, located in the heart of the old village. It is a peaceful residential area with small houses and gardens. The residents of this district are mostly hunters and trappers, who make a living by selling furs and animal skins.
North Road
North Road district is the commercial heart of the town, where visitors can find a range of shops, stores, and markets selling mining and logging equipment. This district also has several inns, taverns, and restaurants that offer a taste of the local cuisine.
Lia's Gate
The Lia’s Gate, Alver district is the main entrance to the town, where visitors can find a cosy inn, a small market square, and some shops selling souvenirs and local crafts.
Noon Cliff
Noon Cliff district is located on the wesern side of the town, with a stunning view of the surrounding valleys. It is home to many wealthy merchants who prefer to live in a peaceful environment. Noon Cliff also has some beautiful gardens and orchards.
Great House Belmont is the ruling nobility of Bredon and has been for centuries. The current Lord Paramount of Great House Belmont is Lord Walter Belmont, a shrewd and pragmatic ruler who is known for his fierce loyalty to his family and his determination to protect Bredon from external threats. Lord Walter is also an accomplished military strategist and has led Great House Belmont]]‘s armies to numerous victories in battles against neighbouring nations. Despite his reputation as a stern and unyielding leader, Lord Walter is also known for his kindness and generosity to the citizens of Bredon, and he has undertaken many initiatives to improve the lives of his people, including the construction of new schools, hospitals, and public works projects.
let current = dv.current();let title = current.file?.name || current.name || "";// 0. Suppress artwork search on template notesif (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}*`); } }}
Buck is a large walled port town located in the Belmont Prefecture of The Commonwealth in the world of Roshar. It is one of the most important towns in the region, with a population of over 10,000 people. The town is currently ruled by Gideon von Scholtz, the Lord of House Von Scholtz, who also serves as the Lord Marshal for Great House Belmont, the most senior military official sworn to a Great House.
Buck is a significant military hub, with a strong naval presence and a strategic location on the coast. The town’s walls are made of stone, and the harbour is protected by a large fortification known as the Castle. The military presence in Buck is felt throughout the town, with soldiers and sailors constantly coming and going.
let current = dv.current();let title = current.file?.name || current.name || "";// 0. Suppress artwork search on template notesif (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}*`); } }}
The ruling Burgomeister of Rippon is Lord Benedict Blackwood, a member of a local noble family appointed by Great House Belmont to govern the village. Lord Blackwood is known for his just and fair rule, with a reputation for being a pragmatic and compassionate leader. He is deeply respected and admired by the villagers, who feel that he listens to their concerns and takes appropriate action when necessary. Under his leadership, the village has prospered, with an increase in trade and the construction of new buildings and infrastructure.
let current = dv.current();let title = current.file?.name || current.name || "";// 0. Suppress artwork search on template notesif (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}*`); } }}
Torkef is a small walled town located in the Belmont Prefecture of the Commonwealth. It is situated on the road that connects the port towns of Buck and Undad. Torkef is ruled by the noble House of Eathe, who are sworn to House Belmont.
The town is known for its strategic location and its importance as a stopping point for travellers and traders. The town’s walls, built from local stone, offer protection against raiders and other threats that might come from the surrounding wilderness. Inside the walls, the town is relatively small, with a population of around 1,000 people.
let current = dv.current();let title = current.file?.name || current.name || "";// 0. Suppress artwork search on template notesif (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}*`); } }}
Withywoods is a charming town located in the eastern part of Belmont Prefecture, overlooking the Bastion Sea. The town is enclosed within sturdy walls, which are still standing strong after many years of wear and tear.
Withywoods is a beautiful town full of character and charm. The burgomeister, Irion von Scholtz, is an excellent leader who is beloved by the town’s residents. Withywoods is a peaceful and idyllic town, which makes it an ideal spot for a relaxing getaway or a permanent residence.
let current = dv.current();let title = current.file?.name || current.name || "";// 0. Suppress artwork search on template notesif (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}*`); } }}
Janus explained that he would offer 100,000gp to the party should they fetch him the heart of a Zaratan. Janus stated that he required several other ingredients after this and that the reward would be the same each time. Should the party be busy and not able or willing to complete this for him, other groups might. The party could always help Janus for the next ingredient. Janus stated that he knew there was a Zaratan in the region of Alver in Belmont Prefecture. The party agreed and Janus connected them to Alver where the party exited.