let current = dv.current();let title = current.name || current.file.name;// --- CONFIGURATION ---// Set to your silhouette image path or filename (e.g., "npc-images/silhouette.webp" or "silhouette.webp").// If the file doesn't exist or is set to "", it will gracefully display the text message below.let fallbackImage = "npc-images/silhouette.webp"; // ---------------------// 1. Gather all potential names (Title, quoted nicknames, and Obsidian Aliases)let rawNames = [title];// Extract quoted nickname if present in title (e.g., Wulfric "The Bear" -> The Bear)let matchNick = title.match(/"([^"]+)"/);if (matchNick && matchNick) { rawNames.push(matchNick);}// Safely pull aliases from Obsidian Frontmatter/Propertieslet rawAliases = current.file?.aliases || current.aliases || [];if (typeof rawAliases === "string") { rawNames.push(rawAliases);} else if (rawAliases && typeof rawAliases[Symbol.iterator] === "function") { for (let a of rawAliases) { if (a && typeof a === "string") rawNames.push(a); }}// 2. Build sanitized search terms (ensures terms are >= 2 chars to avoid matching "_" or empty strings)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 npc-images for matching character fileslet matches = app.vault.getFiles().filter(f => { let pathLower = f.path.toLowerCase(); if (!pathLower.includes("npc-images")) return false; // Exclude the fallback image from character search if (fallbackImage && pathLower.includes(fallbackImage.toLowerCase())) return false; let imgName = f.name.toLowerCase(); return Array.from(searchTerms).some(term => term && imgName.includes(term));});// 4. Prioritize files with "avatar" in the name, otherwise take first matchlet match = matches.find(f => f.name.toLowerCase().includes("avatar")) || (matches.length > 0 ? matches : null);// 5. Render artwork, fallback image, or clean text messageif (match) { dv.paragraph(`![[${match.path}|cover]]`);} else { // Flexible fallback image lookup (works with filename, full path, or partial match) 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) { dv.paragraph(`![[${fallbackFile.path}|cover]]`); } else { dv.paragraph(`*No artwork generated yet for ${title}*`); }}
// 5. Render artwork or fallback
if (match) {
dv.paragraph(![[${match.path}|cover]]);
} else {
let fallbackFile = fallbackImage ? app.vault.getAbstractFileByPath(fallbackImage) : null;
if (fallbackFile) {
dv.paragraph(![[${fallbackFile.path}|cover]]);
} else {
dv.paragraph(*No artwork generated yet for ${title}*);
}
}
### Character Bio
An archwarden of [[Meher]]. She led a host of wardens to combat the [[Evergloom Cult]] and the [[Veiled Twilight Setting/Peoples/Creatures/Undead/The Cannibal King|Cannibal King]] in [[Rossashus]]. She was saved from the [[Veiled Twilight Setting/Peoples/Creatures/Undead/The Cannibal King|Cannibal King]] by the [[The Party|party]].
Appearance & Personality
Visuals & Mannerisms
let current = dv.current();let title = current.name || current.file.name;// --- CONFIGURATION ---// Set to your silhouette image path or filename (e.g., "npc-images/silhouette.webp" or "silhouette.webp").// If the file doesn't exist or is set to "", it will gracefully display the text message below.let fallbackImage = "npc-images/silhouette.webp"; // ---------------------// 1. Gather all potential names (Title, quoted nicknames, and Obsidian Aliases)let rawNames = [title];// Extract quoted nickname if present in title (e.g., Wulfric "The Bear" -> The Bear)let matchNick = title.match(/"([^"]+)"/);if (matchNick && matchNick) { rawNames.push(matchNick);}// Safely pull aliases from Obsidian Frontmatter/Propertieslet rawAliases = current.file?.aliases || current.aliases || [];if (typeof rawAliases === "string") { rawNames.push(rawAliases);} else if (rawAliases && typeof rawAliases[Symbol.iterator] === "function") { for (let a of rawAliases) { if (a && typeof a === "string") rawNames.push(a); }}// 2. Build sanitized search terms (ensures terms are >= 2 chars to avoid matching "_" or empty strings)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 npc-images for matching character fileslet matches = app.vault.getFiles().filter(f => { let pathLower = f.path.toLowerCase(); if (!pathLower.includes("npc-images")) return false; // Exclude the fallback image from character search if (fallbackImage && pathLower.includes(fallbackImage.toLowerCase())) return false; let imgName = f.name.toLowerCase(); return Array.from(searchTerms).some(term => term && imgName.includes(term));});// 4. Prioritize files with "avatar" in the name, otherwise take first matchlet match = matches.find(f => f.name.toLowerCase().includes("avatar")) || (matches.length > 0 ? matches : null);// 5. Render artwork, fallback image, or clean text messageif (match) { dv.paragraph(`![[${match.path}|cover]]`);} else { // Flexible fallback image lookup (works with filename, full path, or partial match) 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) { dv.paragraph(`![[${fallbackFile.path}|cover]]`); } else { dv.paragraph(`*No artwork generated yet for ${title}*`); }}
// 5. Render artwork or fallback
if (match) {
dv.paragraph(![[${match.path}|cover]]);
} else {
let fallbackFile = fallbackImage ? app.vault.getAbstractFileByPath(fallbackImage) : null;
if (fallbackFile) {
dv.paragraph(![[${fallbackFile.path}|cover]]);
} else {
dv.paragraph(*No artwork generated yet for ${title}*);
}
}
- **Mannerisms:**
Recent Activity
This section displays every time this entity is mentioned in session summaries.
The party arrived as the necromancers were driven off. The Sanctuary had a large complement of Wardens of Meher, bishops devoted to maintain the natural order of life and death. These Wardens had arrived to help with the necromantic crisis occuring. The Archwarden leading them was a woman named Ardbid Velanon.
Velanon informed the party that the elven mage had been a female hero named Casperia Evergloom. Casperia Evergloom had disappeared years earlier under mysterious circumstances when her workshop blew up, presumably killing her and her fellow heroes. Casperia and the Evergloom were driven off and the Wardens needed to recover.
Velanon advised that she knew the Evergloom Cult were seeking to weaken and break into the barrow that Grummond Hornraven had described to the party. Velanon didn’t know more, but shared that she knew that it housed some form of ancient evil or knowledge.
Velanon advised that the Evergloom Cult had weaked the barrier between life and Death so much that without intervention there would be an explosion of undead rising. Souls would fight the waters of death back into life and become undead monsters without the need for any form of necromancers will. The wardens had to strengthen this barrier immediately or risk disaster also. Velanon beseeched the party go immediately to the barrier and prevent the Evergloom Cult gaining access.
The party entered the final chamber to find the Cannibal King standing above the Wardens of Meher. All Wardens were slain with the exception of Ardbid Velanon who appeared about to die at his feet. The Cannibal King appeared to be some lich of fungal themed nature.
The party spoke with the Cannibal King and stalled for time. The Cannibal King had asked if they were there to serve him. This didn’t work for long before they begun to battle the Cannibal King, who appeared unbothered by the damage dealt to him, as they tried to rescue Velanon. Calyn, remembering the mosaic mentioning the greatsword in some way, ran to get it while the others fought. Calyn, using his abilities to step partly into the Astral Sea, turned ethereal whilst gripping the sword. Calyn tore it free from the earth and dropped through the ground into the Cannibal King’s chamber. At the same time the others had almost defeated the Cannibal King who had been laughing whilst stating “You cannot kill me in a way that matters”. The Cannibal King dissipated into spores and the party took the unconscious Velanon outside to recover.
Upon waking Velanon despaired at the news of Calyn having successfully removed the greatsword. Velanon believed it had been anchoring the Cannibal King into his prison barrow and now he had been truly freed. Velanon stated she had to return to Estwatch to consult her superiors about this. Velanon also advised that she and her Wardens had gotten to the barrow too late to stop the Evergloom Cult. They got whatever they were there for.
Ardbid Velanon
Medium Humanoid (Cleric), Neutral
Armor Class 15
Hit Points 187 (25d8 + 75)
Speed 30 ft.
Initiative +3 (13)
STR
DEX
CON
INT
WIS
CHA
16 (+3)
10 (+0)
17 (+3)
14 (+2)
21 (+5)
14 (+2)
Saving Throws Str +6, Con +6, Int +5, Wis +8
Skills Insight +8, Medicine +8, Perception +8, Religion +8
GearChain Mail, Holy SymbolSenses Passive Perception 18
Languages Common, Elvish, Celestial
Challenge 8 (XP 3,900; PB +3)
Proficiency Bonus +3
Actions
Multiattack. Ardbid Velanon makes three Radiant Burst attacks.
Radiant Burst.Melee or Ranged Attack Roll: +8, reach 5 ft. or range 60 ft. Hit: 20 (3d10 + 4) Radiant damage.
Holy Word (Recharge 4–6).Wisdom Saving Throw: DC 16, each enemy in a 20-foot Emanation originating from Ardbid Velanon. Failure: 14 (4d6) Radiant damage, and the target has the Stunned condition until the end of Ardbid Velanon’s next turn. Success: Half damage only.
Spellcasting. Ardbid Velanon casts one of the following spells, requiring no Material components and using Wisdom as the spellcasting ability (spell save DC 16):
At will: Light, Thaumaturgy
1/day each: Flame Strike, Greater Restoration, Raise Dead, Zone of Truth
Bonus Actions
Divine Aid (3/Day). Ardbid Velanon casts Bless, Dispel Magic, Healing Word, or Lesser Restoration, using the same spellcasting ability as Spellcasting.