(What a character would know with a successful Nature/History check, or what they see at first glance.)
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}*`); }}
Behavior:
Observed Tactics
(This is great for the wiki! It describes how they fight without giving away numbers. e.g., “These creatures tend to strike from the shadows and retreat, rarely staying for a fair fight.“)
Bereginyas
Tiny Fey, Neutral Evil
Armor Class 14
Hit Points 81 (18d4 + 36)
Speed 20 ft., Fly 60 ft.
Initiative +4 (14)
Foul Form. The bereginyas’ semi-solid form emits poisonous gases. Any creature that starts its turn within 5 feet of the bereginyas must succeed on a DC 14 Constitution saving throw or be poisoned. A creature that succeeds on this saving throw by 5 or more is immune to the bereginyas’ Foul Form for the next 24 hours.
Actions
Multiattack. The bereginyas makes two Claw attacks. If both attacks hit the same target, the bereginyas attaches to the target. While attached, the bereginyas can use only the Smother action, and it moves with the target whenever the target moves, requiring none of the bereginyas’ movement. The bereginyas can detach itself by spending 5 feet of its movement. A creature, including the target, can take its action to detach the bereginyas by succeeding on a DC 14 Strength check.
Claw.Melee Weapon Attack: +6 to hit, reach 5 ft., one target. Hit: 8 (1d8 + 4) slashing damage plus 4 (1d8) poison damage.
Smother. While attached to a creature that isn’t a Construct or Undead, the bereginyas extends a tendril of poisonous gas down the creature’s throat. The creature must make a DC 14 Constitution saving throw. On a failure, it takes 22 (5d8) poison damage, immediately runs out of breath, and begins suffocating. On a success, it takes half the damage, doesn’t run out of breath, and isn’t suffocating. Suffocation ends if the creature dies, if the bereginyas is removed from the creature, or if the bereginyas is killed. A suffocating creature that fails this saving throw reduces its remaining rounds of breath by 1.