VANITY v0.9.0 — Foundry VTT system

The complete VANITY system: d6 Stumble engine, the two Bane tables (d66
Twist the Knife + 2d6 Reckoning) with red dice, character/NPC sheets,
17 conditions as token markers, illustrated spell cast cards, the Forge
tools (hero/monster/NPC/hoard/encounter/stage/carouse/commission/Vain
Crown), and 11 compendia. Manifest install ready.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 15:16:07 +01:00
co-authored by Claude Fable 5
commit 9410c04381
127 changed files with 5036 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
node_modules/
.DS_Store
+14
View File
@@ -0,0 +1,14 @@
# VANITY — the Vanity Role-Playing Game (Foundry VTT system)
A generic d6 RPG where ego is a resource and the universe keeps score. Pool = Attribute + Knack +
situation; 5–6 = a Success; fail a roll showing two or more 1s and you **Stumble**, banking a Bane
of Karma. No hit points — Grit. Vanity, Karma and Glory drive play.
**Install (Foundry v13+):** Setup → Game Systems → Install System → Manifest URL:
`https://raw.githubusercontent.com/slaguru666/vanity/main/system.json`
Recommended module: **Dice So Nice!** (the peacock dice + red Bane dice; the system runs fine without it).
Optional companion: **Mapwright** for full procedural maps.
This repo is the published system only. Development, the rulebook drafts, play aids and the
*Vain Crown* world live in the private VRPG repo.
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#14544e" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><path d="M62 22 a30 30 0 1 0 18 46 a26 26 0 0 1 -18 -46 Z"/><g stroke="#f7f0de" stroke-width="5" fill="none"><path d="M58 30 h12 l-12 11 h12"/></g></g></svg>

After

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#14544e" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><circle cx="50" cy="58" r="15" fill="none" stroke-width="6"/><g stroke-width="5"><path d="M50 14 V30 M26 24 l9 12 M74 24 l-9 12"/></g></g></svg>

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#14544e" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><g fill="none" stroke-width="5"><circle cx="42" cy="50" r="20"/><circle cx="52" cy="50" r="20" opacity="0.55"/><circle cx="62" cy="50" r="20" opacity="0.28"/></g></g></svg>

After

Width:  |  Height:  |  Size: 391 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#14544e" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><path d="M50 80 C22 58 18 38 32 28 C42 21 48 27 50 34 C52 27 58 21 68 28 C82 38 78 58 50 80 Z" fill="currentColor"/></g></svg>

After

Width:  |  Height:  |  Size: 345 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#14544e" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><circle cx="50" cy="50" r="28" fill="none" stroke-width="6" stroke-dasharray="7 7"/><path d="M50 32 V56 M50 66 v6" stroke-width="7"/></g></svg>

After

Width:  |  Height:  |  Size: 362 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#6a3b5e" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><g fill="none" stroke-width="6"><circle cx="34" cy="54" r="12"/><path d="M46 58 h34 M48 70 h24"/><path d="M62 34 l8 -8 M70 34 l-8 -8"/></g></g></svg>

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#8a2f2f" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><g fill="none" stroke-width="7"><rect x="30" y="40" width="40" height="34" rx="4"/><path d="M40 40 v-8 a10 10 0 0 1 20 0 v8"/><path d="M20 84 h60"/></g></g></svg>

After

Width:  |  Height:  |  Size: 381 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#8a2f2f" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><g fill="none" stroke-width="7"><circle cx="34" cy="50" r="14"/><circle cx="66" cy="50" r="14"/></g></g></svg>

After

Width:  |  Height:  |  Size: 329 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#8a2f2f" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><g fill="none" stroke-width="7"><circle cx="50" cy="50" r="30"/><circle cx="50" cy="50" r="14"/><circle cx="50" cy="50" r="3" fill="currentColor"/></g></g></svg>

After

Width:  |  Height:  |  Size: 380 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#8a2f2f" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><g fill="none" stroke-width="7"><circle cx="50" cy="30" r="12"/><path d="M50 42 L38 70 M50 42 L64 66 M38 70 l-8 12 M64 66 l10 10"/></g></g></svg>

After

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#8a2f2f" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><g fill="none" stroke-width="7"><circle cx="26" cy="56" r="11"/><path d="M38 60 h44 M40 72 h30"/></g></g></svg>

After

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#8a2f2f" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><g fill="none" stroke-width="8"><path d="M28 30 L50 52 L28 74 M72 30 L50 52 L72 74"/></g></g></svg>

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#14544e" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><g fill="none" stroke-width="6"><path d="M50 16 V84 M22 32 L78 68 M78 32 L22 68"/><path d="M50 16 l-7 9 M50 16 l7 9"/></g></g></svg>

After

Width:  |  Height:  |  Size: 351 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#6a3b5e" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><g fill="none" stroke-width="6"><rect x="30" y="38" width="40" height="24" rx="5"/><rect x="70" y="44" width="6" height="12"/><path d="M38 50 h10" stroke-width="5"/></g><path d="M22 78 L78 22" stroke-width="6"/></g></svg>

After

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#6a3b5e" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><g fill="none" stroke-width="7"><circle cx="50" cy="38" r="18"/><path d="M38 34 l8 8 M54 34 l8 8 M40 44 l6 -6 M56 44 l6 -6"/><path d="M28 84 q22 -16 44 0"/></g></g></svg>

After

Width:  |  Height:  |  Size: 389 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#14544e" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><path d="M50 14 L82 26 V52 C82 72 68 84 50 90 C32 84 18 72 18 52 V26 Z" fill="none" stroke-width="7"/><circle cx="50" cy="50" r="9" fill="currentColor"/></g></svg>

After

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128"><circle cx="50" cy="50" r="47" fill="#f7f0de" stroke="#8a2f2f" stroke-width="4"/><g color="#2a2317" fill="#2a2317" stroke="#2a2317"><path d="M50 14 C40 40 40 60 50 86 C60 60 60 40 50 14 Z" fill="currentColor"/><g stroke="#f7f0de" stroke-width="4"><path d="M44 40 h12 M42 56 h16"/></g></g></svg>

After

Width:  |  Height:  |  Size: 381 B

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 MiB

+86
View File
@@ -0,0 +1,86 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 900" width="1200" height="900">
<defs>
<radialGradient id="bg" cx="50%" cy="38%" r="85%">
<stop offset="0%" stop-color="#1d4a45"/>
<stop offset="55%" stop-color="#122f2c"/>
<stop offset="100%" stop-color="#0a1a18"/>
</radialGradient>
<radialGradient id="eye" cx="50%" cy="42%" r="55%">
<stop offset="0%" stop-color="#e0c98a"/>
<stop offset="45%" stop-color="#14544e"/>
<stop offset="78%" stop-color="#1c3f66"/>
<stop offset="100%" stop-color="#6a3b5e"/>
</radialGradient>
<linearGradient id="gold" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#e0c98a"/>
<stop offset="45%" stop-color="#b0872f"/>
<stop offset="100%" stop-color="#8a6a20"/>
</linearGradient>
<filter id="glow" x="-40%" y="-40%" width="180%" height="180%">
<feGaussianBlur stdDeviation="8" result="b"/>
<feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
<filter id="grain">
<feTurbulence type="fractalNoise" baseFrequency="0.8" numOctaves="2" result="n"/>
<feColorMatrix in="n" type="matrix" values="0 0 0 0 0.9 0 0 0 0 0.85 0 0 0 0 0.7 0 0 0 0.05 0"/>
<feComposite operator="over" in2="SourceGraphic"/>
</filter>
</defs>
<rect width="1200" height="900" fill="url(#bg)"/>
<!-- faint ring -->
<circle cx="600" cy="380" r="290" fill="none" stroke="#b0872f" stroke-opacity="0.18" stroke-width="2"/>
<circle cx="600" cy="380" r="272" fill="none" stroke="#b0872f" stroke-opacity="0.10" stroke-width="1"/>
<!-- peacock plumes -->
<g filter="url(#glow)">
<g stroke="#14544e" stroke-width="3" fill="none" opacity="0.9">
<path d="M600 430 C520 360 480 300 470 210"/>
<path d="M600 430 C680 360 720 300 730 210"/>
<path d="M600 420 C560 330 545 270 545 170"/>
<path d="M600 420 C640 330 655 270 655 170"/>
<path d="M600 415 C600 320 600 240 600 140"/>
</g>
<ellipse cx="470" cy="205" rx="34" ry="46" fill="url(#eye)"/>
<ellipse cx="545" cy="165" rx="34" ry="46" fill="url(#eye)"/>
<ellipse cx="600" cy="135" rx="36" ry="50" fill="url(#eye)"/>
<ellipse cx="655" cy="165" rx="34" ry="46" fill="url(#eye)"/>
<ellipse cx="730" cy="205" rx="34" ry="46" fill="url(#eye)"/>
<ellipse cx="470" cy="200" rx="12" ry="17" fill="#1c3f66"/>
<ellipse cx="545" cy="160" rx="12" ry="17" fill="#1c3f66"/>
<ellipse cx="600" cy="129" rx="13" ry="19" fill="#1c3f66"/>
<ellipse cx="655" cy="160" rx="12" ry="17" fill="#1c3f66"/>
<ellipse cx="730" cy="200" rx="12" ry="17" fill="#1c3f66"/>
<ellipse cx="470" cy="197" rx="5" ry="7" fill="#e0c98a"/>
<ellipse cx="545" cy="157" rx="5" ry="7" fill="#e0c98a"/>
<ellipse cx="600" cy="125" rx="5.5" ry="8" fill="#e0c98a"/>
<ellipse cx="655" cy="157" rx="5" ry="7" fill="#e0c98a"/>
<ellipse cx="730" cy="197" rx="5" ry="7" fill="#e0c98a"/>
</g>
<!-- the crown -->
<g filter="url(#glow)">
<path d="M440 470 L470 380 L530 445 L600 355 L670 445 L730 380 L760 470 Z"
fill="url(#gold)" stroke="#8a6a20" stroke-width="4" stroke-linejoin="round"/>
<rect x="436" y="470" width="328" height="46" rx="8" fill="url(#gold)" stroke="#8a6a20" stroke-width="4"/>
<circle cx="470" cy="376" r="12" fill="#e0c98a" stroke="#8a6a20" stroke-width="3"/>
<circle cx="600" cy="350" r="14" fill="#e0c98a" stroke="#8a6a20" stroke-width="3"/>
<circle cx="730" cy="376" r="12" fill="#e0c98a" stroke="#8a6a20" stroke-width="3"/>
<circle cx="510" cy="493" r="9" fill="#14544e" stroke="#0e3f3a" stroke-width="2"/>
<circle cx="600" cy="493" r="11" fill="#6a3b5e" stroke="#4d2a44" stroke-width="2"/>
<circle cx="690" cy="493" r="9" fill="#14544e" stroke="#0e3f3a" stroke-width="2"/>
</g>
<!-- title -->
<text x="600" y="640" text-anchor="middle" fill="#f7f0de"
font-family="Cinzel, Trajan Pro, Georgia, serif" font-size="110" font-weight="700"
letter-spacing="26">VANITY</text>
<rect x="420" y="672" width="360" height="3" fill="#b0872f"/>
<text x="600" y="716" text-anchor="middle" fill="#b0872f"
font-family="Cinzel, Georgia, serif" font-size="26" letter-spacing="12">THE VAIN CROWN</text>
<text x="600" y="790" text-anchor="middle" fill="#c9bfa4"
font-family="EB Garamond, Georgia, serif" font-size="24" font-style="italic">“Be vain and you shine — but the brighter you burn, the bigger the bill.”</text>
<rect width="1200" height="900" filter="url(#grain)" opacity="0.5" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

+15
View File
@@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<defs><linearGradient id="g" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#e0c98a"/><stop offset="55%" stop-color="#b0872f"/><stop offset="100%" stop-color="#8a6a20"/>
</linearGradient></defs>
<!-- one great big crown, nearly edge to edge -->
<path d="M20 176 L42 66 L92 126 L128 42 L164 126 L214 66 L236 176 Z"
fill="url(#g)" stroke="#5f4715" stroke-width="12" stroke-linejoin="round"/>
<rect x="18" y="176" width="220" height="42" rx="10" fill="url(#g)" stroke="#5f4715" stroke-width="12"/>
<circle cx="42" cy="60" r="14" fill="#f2e2b3" stroke="#5f4715" stroke-width="8"/>
<circle cx="128" cy="34" r="16" fill="#f2e2b3" stroke="#5f4715" stroke-width="8"/>
<circle cx="214" cy="60" r="14" fill="#f2e2b3" stroke="#5f4715" stroke-width="8"/>
<circle cx="83" cy="197" r="11" fill="#0e3f3a"/>
<circle cx="128" cy="197" r="13" fill="#6a3b5e"/>
<circle cx="173" cy="197" r="11" fill="#0e3f3a"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

+8
View File
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<g transform="rotate(45 128 128)">
<rect x="53" y="53" width="150" height="150" rx="14" fill="#6a3b5e" stroke="#432a3c" stroke-width="14"/>
<rect x="86" y="86" width="84" height="84" rx="8" fill="none" stroke="#f0e3ea" stroke-width="10" opacity="0.9"/>
</g>
<g><circle cx="222" cy="232" r="30" fill="#0e3f3a" stroke="#e0c98a" stroke-width="5" opacity="0.92"/>
<text x="222" y="248" text-anchor="middle" font-family="Georgia, serif" font-weight="bold" font-size="46" fill="#f2e2b3">1</text></g>
</svg>

After

Width:  |  Height:  |  Size: 606 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

+17
View File
@@ -0,0 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<defs><linearGradient id="g" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#e0c98a"/><stop offset="55%" stop-color="#b0872f"/><stop offset="100%" stop-color="#8a6a20"/>
</linearGradient></defs>
<!-- one great big crown, nearly edge to edge -->
<path d="M20 176 L42 66 L92 126 L128 42 L164 126 L214 66 L236 176 Z"
fill="url(#g)" stroke="#5f4715" stroke-width="12" stroke-linejoin="round"/>
<rect x="18" y="176" width="220" height="42" rx="10" fill="url(#g)" stroke="#5f4715" stroke-width="12"/>
<circle cx="42" cy="60" r="14" fill="#f2e2b3" stroke="#5f4715" stroke-width="8"/>
<circle cx="128" cy="34" r="16" fill="#f2e2b3" stroke="#5f4715" stroke-width="8"/>
<circle cx="214" cy="60" r="14" fill="#f2e2b3" stroke="#5f4715" stroke-width="8"/>
<circle cx="83" cy="197" r="11" fill="#0e3f3a"/>
<circle cx="128" cy="197" r="13" fill="#6a3b5e"/>
<circle cx="173" cy="197" r="11" fill="#0e3f3a"/>
<g><circle cx="222" cy="232" r="30" fill="#0e3f3a" stroke="#e0c98a" stroke-width="5" opacity="0.92"/>
<text x="222" y="248" text-anchor="middle" font-family="Georgia, serif" font-weight="bold" font-size="46" fill="#f2e2b3">5</text></g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

+17
View File
@@ -0,0 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<defs><linearGradient id="g" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#e0c98a"/><stop offset="55%" stop-color="#b0872f"/><stop offset="100%" stop-color="#8a6a20"/>
</linearGradient></defs>
<!-- one great big crown, nearly edge to edge -->
<path d="M20 176 L42 66 L92 126 L128 42 L164 126 L214 66 L236 176 Z"
fill="url(#g)" stroke="#5f4715" stroke-width="12" stroke-linejoin="round"/>
<rect x="18" y="176" width="220" height="42" rx="10" fill="url(#g)" stroke="#5f4715" stroke-width="12"/>
<circle cx="42" cy="60" r="14" fill="#f2e2b3" stroke="#5f4715" stroke-width="8"/>
<circle cx="128" cy="34" r="16" fill="#f2e2b3" stroke="#5f4715" stroke-width="8"/>
<circle cx="214" cy="60" r="14" fill="#f2e2b3" stroke="#5f4715" stroke-width="8"/>
<circle cx="83" cy="197" r="11" fill="#0e3f3a"/>
<circle cx="128" cy="197" r="13" fill="#6a3b5e"/>
<circle cx="173" cy="197" r="11" fill="#0e3f3a"/>
<g><circle cx="222" cy="232" r="30" fill="#0e3f3a" stroke="#e0c98a" stroke-width="5" opacity="0.92"/>
<text x="222" y="248" text-anchor="middle" font-family="Georgia, serif" font-weight="bold" font-size="46" fill="#f2e2b3">6</text></g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+16
View File
@@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<defs><linearGradient id="g" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#e0c98a"/><stop offset="55%" stop-color="#b0872f"/><stop offset="100%" stop-color="#8a6a20"/>
</linearGradient></defs>
<g>
<path d="M78 148 L88 104 L110 130 L128 96 L146 130 L168 104 L178 148 Z"
fill="url(#g)" stroke="#5f4715" stroke-width="6" stroke-linejoin="round"/>
<rect x="76" y="148" width="104" height="20" rx="5" fill="url(#g)" stroke="#5f4715" stroke-width="6"/>
<circle cx="88" cy="100" r="7" fill="#f2e2b3" stroke="#5f4715" stroke-width="4"/>
<circle cx="128" cy="92" r="8" fill="#f2e2b3" stroke="#5f4715" stroke-width="4"/>
<circle cx="168" cy="100" r="7" fill="#f2e2b3" stroke="#5f4715" stroke-width="4"/>
<circle cx="108" cy="158" r="4.5" fill="#0e3f3a"/>
<circle cx="128" cy="158" r="5.5" fill="#6a3b5e"/>
<circle cx="148" cy="158" r="4.5" fill="#0e3f3a"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1015 B

+22
View File
@@ -0,0 +1,22 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<defs>
<radialGradient id="eye" cx="50%" cy="42%" r="55%">
<stop offset="0%" stop-color="#e0c98a"/><stop offset="45%" stop-color="#14544e"/>
<stop offset="78%" stop-color="#1c3f66"/><stop offset="100%" stop-color="#6a3b5e"/>
</radialGradient>
</defs>
<circle cx="128" cy="128" r="104" fill="none" stroke="#b0872f" stroke-width="3" opacity="0.9"/>
<circle cx="128" cy="128" r="92" fill="none" stroke="#b0872f" stroke-width="1.5" opacity="0.5" stroke-dasharray="3 7"/>
<g>
<g transform="rotate(0 128 128)"><ellipse cx="128" cy="24" rx="11" ry="15" fill="url(#eye)" stroke="#8a6a20" stroke-width="2.5"/><ellipse cx="128" cy="22" rx="4" ry="6" fill="#1c3f66"/><ellipse cx="128" cy="21" rx="1.8" ry="2.6" fill="#e0c98a"/></g>
<g transform="rotate(60 128 128)"><ellipse cx="128" cy="24" rx="11" ry="15" fill="url(#eye)" stroke="#8a6a20" stroke-width="2.5"/><ellipse cx="128" cy="22" rx="4" ry="6" fill="#1c3f66"/><ellipse cx="128" cy="21" rx="1.8" ry="2.6" fill="#e0c98a"/></g>
<g transform="rotate(120 128 128)"><ellipse cx="128" cy="24" rx="11" ry="15" fill="url(#eye)" stroke="#8a6a20" stroke-width="2.5"/><ellipse cx="128" cy="22" rx="4" ry="6" fill="#1c3f66"/><ellipse cx="128" cy="21" rx="1.8" ry="2.6" fill="#e0c98a"/></g>
<g transform="rotate(180 128 128)"><ellipse cx="128" cy="24" rx="11" ry="15" fill="url(#eye)" stroke="#8a6a20" stroke-width="2.5"/><ellipse cx="128" cy="22" rx="4" ry="6" fill="#1c3f66"/><ellipse cx="128" cy="21" rx="1.8" ry="2.6" fill="#e0c98a"/></g>
<g transform="rotate(240 128 128)"><ellipse cx="128" cy="24" rx="11" ry="15" fill="url(#eye)" stroke="#8a6a20" stroke-width="2.5"/><ellipse cx="128" cy="22" rx="4" ry="6" fill="#1c3f66"/><ellipse cx="128" cy="21" rx="1.8" ry="2.6" fill="#e0c98a"/></g>
<g transform="rotate(300 128 128)"><ellipse cx="128" cy="24" rx="11" ry="15" fill="url(#eye)" stroke="#8a6a20" stroke-width="2.5"/><ellipse cx="128" cy="22" rx="4" ry="6" fill="#1c3f66"/><ellipse cx="128" cy="21" rx="1.8" ry="2.6" fill="#e0c98a"/></g>
</g>
<g stroke="#8a6a20" stroke-width="2" opacity="0.55" fill="none">
<path d="M128 44 C110 62 106 74 108 90"/><path d="M128 44 C146 62 150 74 148 90"/>
<path d="M128 212 C110 194 106 182 108 166"/><path d="M128 212 C146 194 150 182 148 166"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+139
View File
@@ -0,0 +1,139 @@
// AUTO-GENERATED by tools/build-conditions.py — do not edit by hand.
export const VANITY_CONDITIONS = [
{
"id": "rattled",
"name": "Rattled",
"group": "combat",
"short": "−1 die on everything",
"rules": "You've lost half your Grit and it shows: <b>−1 die on every roll</b> until you climb back above half.",
"ends": "Grit recovers above half"
},
{
"id": "wounded",
"name": "Wounded",
"group": "combat",
"short": "−1 die to a fitting action",
"rules": "A lingering injury — a gashed arm, a split brow. <b>−1 die</b> to a kind of action the GM rules it hampers.",
"ends": "Treated: kit, Mend, or downtime"
},
{
"id": "off-balance",
"name": "Off-Balance",
"group": "combat",
"short": "−2 dice on your next roll",
"rules": "You're reeling. <b>−2 dice on your next roll</b>, attack or defence — you still act, you just act badly.",
"ends": "After your next roll"
},
{
"id": "prone",
"name": "Prone",
"group": "combat",
"short": "−1 die; rising costs your Move",
"rules": "Flat on your back: <b>−1 die</b> on everything, and standing up costs your Move.",
"ends": "You spend a Move to rise"
},
{
"id": "held",
"name": "Held",
"group": "combat",
"short": "No move, no clean swings",
"rules": "Grappled or snared: <b>no movement, no clean attacks</b>, and defenders hit you as if you were flanked.",
"ends": "You win a Brawn contest to break free"
},
{
"id": "marked",
"name": "Marked",
"group": "combat",
"short": "Your next Stumble banks 2 Banes",
"rules": "Something patient has written your name. <b>Your next Stumble banks 2 Banes</b> instead of 1 — the GM will tell you when it lands.",
"ends": "Your next Stumble spends it"
},
{
"id": "encumbered",
"name": "Encumbered",
"group": "combat",
"short": "−1 die Brawn/Flair · half move",
"rules": "Carrying past your Load (6 + Brawn): <b>−1 die on Brawn and Flair, half movement</b> until you drop the excess.",
"ends": "You drop below your Load"
},
{
"id": "slowed",
"name": "Slowed",
"group": "spell",
"short": "−2 dice, no move next round",
"rules": "Frost Grip or its like: <b>−2 dice</b> and you cannot move until the caster's next turn.",
"ends": "The caster's next turn"
},
{
"id": "asleep",
"name": "Asleep",
"group": "spell",
"short": "Unconscious until roused",
"rules": "Dropped by Sleep: unconscious, and may be Subdued without a roll. <b>Damage or loud danger wakes you.</b>",
"ends": "Harm or clamour wakes you"
},
{
"id": "charmed",
"name": "Charmed",
"group": "spell",
"short": "Treats the caster as a trusted friend",
"rules": "You believe the caster is a dear friend for the scene. <b>Requests against your nature, or violence, break it</b> — and you remember.",
"ends": "Scene's end, or a betrayal"
},
{
"id": "blessed",
"name": "Blessed",
"group": "spell",
"short": "+1 die on everything",
"rules": "Conviction, made contagious: <b>+1 die on every roll</b> this scene. Does not stack with itself.",
"ends": "Scene's end"
},
{
"id": "cursed",
"name": "Cursed",
"group": "spell",
"short": "−1 die on everything",
"rules": "Doubt with a pointed finger: <b>−1 die on every roll</b> until cleared by an act the GM rules penitent.",
"ends": "A penitent act, or Cleanse"
},
{
"id": "warded",
"name": "Warded",
"group": "spell",
"short": "+2 defence dice",
"rules": "Arcane Ward, Sanctuary or Aegis: <b>+2 defence dice</b>, stacking with armour and shields.",
"ends": "The ward's stated duration"
},
{
"id": "blurred",
"name": "Blurred",
"group": "spell",
"short": "Attackers take −2 dice",
"rules": "Your edges smear: <b>everyone attacking you takes −2 dice</b> until the caster's next turn (or the scene, if paid up).",
"ends": "The caster's next turn, or scene"
},
{
"id": "downed",
"name": "Downed",
"group": "state",
"short": "A companion is out — not dead",
"rules": "A companion at 0 Grit: <b>out of the scene, not dead.</b> It recovers to full after a night's rest or Mend Beast.",
"ends": "A night's rest, or Mend Beast"
},
{
"id": "spent",
"name": "Spent",
"group": "state",
"short": "A spell can't be cast",
"rules": "A failed spell is <b>spent</b>: it cannot be cast again until you recover it with a rest or a recovery ritual.",
"ends": "Rest, or a recovery ritual"
},
{
"id": "taken-out",
"name": "Taken Out",
"group": "state",
"short": "Down — the fiction decides how badly",
"rules": "Your Grit is empty: <b>you're out</b> — unconscious, routed, captured, dying or dead, as the fiction and the weapons decide. A winner may Subdue instead of kill.",
"ends": "The story says so"
}
];
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+30
View File
@@ -0,0 +1,30 @@
{
"TYPES.Actor.character": "Character",
"TYPES.Actor.npc": "NPC",
"TYPES.Item.weapon": "Weapon",
"TYPES.Item.armour": "Armour",
"TYPES.Item.gear": "Gear",
"TYPES.Item.spell": "Spell",
"TYPES.Item.edge": "Class Edge",
"TYPES.Item.vice": "Vice",
"VANITY.Brawn": "Brawn",
"VANITY.Flair": "Flair",
"VANITY.Wits": "Wits",
"VANITY.Poise": "Poise",
"VANITY.Grit": "Grit",
"VANITY.Vanity": "Vanity",
"VANITY.Karma": "Banes",
"VANITY.Glory": "Glory",
"VANITY.RollTitle": "{name} — build the pool",
"VANITY.Success": "Success",
"VANITY.Successes": "Successes",
"VANITY.Bane": "Bane",
"VANITY.Banes": "Banes",
"VANITY.Push": "Push (+1 Bane)",
"VANITY.Pushed": "Pushed — hubris has its price",
"VANITY.Failure": "Failure",
"VANITY.Rattled": "Rattled — −1 die on everything",
"VANITY.Reckoning": "6 Banes — the Reckoning is due",
"VANITY.TakenOut": "Taken Out",
"GAME.Paused": "The World Pauses To Admire Itself"
}
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
MANIFEST-000002
View File
+5
View File
@@ -0,0 +1,5 @@
2026/07/14-09:38:57.408746 16e987000 Delete type=3 #1
2026/07/14-09:38:57.409498 170237000 Level-0 table #5: started
2026/07/14-09:38:57.409719 170237000 Level-0 table #5: 1282 bytes OK
2026/07/14-09:38:57.409845 170237000 Delete type=0 #3
2026/07/14-09:38:57.409925 170237000 Manual compaction at level-0 from '!items!GOAakTqMDZSCDOdE' @ 72057594037927935 : 1 .. '!items!jf5ovEG8ufV1oiUf' @ 0 : 0; will stop at (end)
Binary file not shown.
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
MANIFEST-000002
View File
+5
View File
@@ -0,0 +1,5 @@
2026/07/14-09:38:57.438743 16e987000 Delete type=3 #1
2026/07/14-09:38:57.439229 170237000 Level-0 table #5: started
2026/07/14-09:38:57.439444 170237000 Level-0 table #5: 5226 bytes OK
2026/07/14-09:38:57.439529 170237000 Delete type=0 #3
2026/07/14-09:38:57.439587 170237000 Manual compaction at level-0 from '!actors!351sA95uALULY3Kv' @ 72057594037927935 : 1 .. '!actors!rPfEYHmSoprnQdrY' @ 0 : 0; will stop at (end)
Binary file not shown.
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
MANIFEST-000002
View File
+5
View File
@@ -0,0 +1,5 @@
2026/07/14-09:38:57.429069 16e987000 Delete type=3 #1
2026/07/14-09:38:57.429648 170237000 Level-0 table #5: started
2026/07/14-09:38:57.429879 170237000 Level-0 table #5: 5417 bytes OK
2026/07/14-09:38:57.429999 170237000 Delete type=0 #3
2026/07/14-09:38:57.430077 170237000 Manual compaction at level-0 from '!items!21hRQJtWGk5fDQlo' @ 72057594037927935 : 1 .. '!items!zMphj752klzDFU3Q' @ 0 : 0; will stop at (end)
Binary file not shown.
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
MANIFEST-000002
View File
+5
View File
@@ -0,0 +1,5 @@
2026/07/14-09:38:57.413966 16e987000 Delete type=3 #1
2026/07/14-09:38:57.414551 170237000 Level-0 table #5: started
2026/07/14-09:38:57.414799 170237000 Level-0 table #5: 3221 bytes OK
2026/07/14-09:38:57.414887 170237000 Delete type=0 #3
2026/07/14-09:38:57.414944 170237000 Manual compaction at level-0 from '!items!27LcrYsIEEF3KYHA' @ 72057594037927935 : 1 .. '!items!yo48EzCVEwNdpkXF' @ 0 : 0; will stop at (end)
Binary file not shown.
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
MANIFEST-000002
View File
+5
View File
@@ -0,0 +1,5 @@
2026/07/14-09:38:57.460195 16e987000 Delete type=3 #1
2026/07/14-09:38:57.460906 170237000 Level-0 table #5: started
2026/07/14-09:38:57.461170 170237000 Level-0 table #5: 10149 bytes OK
2026/07/14-09:38:57.461298 170237000 Delete type=0 #3
2026/07/14-09:38:57.461375 170237000 Manual compaction at level-0 from '!journal!JJEgDJvtWBnFbyZA' @ 72057594037927935 : 1 .. '!journal.pages!kBclT2QiwEQmOsX1.HSVD8c7BenQjb45v' @ 0 : 0; will stop at (end)
Binary file not shown.
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
MANIFEST-000002
View File
+5
View File
@@ -0,0 +1,5 @@
2026/07/14-09:38:57.444631 16e987000 Delete type=3 #1
2026/07/14-09:38:57.448892 170237000 Level-0 table #5: started
2026/07/14-09:38:57.449570 170237000 Level-0 table #5: 23539 bytes OK
2026/07/14-09:38:57.449745 170237000 Delete type=0 #3
2026/07/14-09:38:57.449971 170237000 Manual compaction at level-0 from '!actors!WDcRWtpmw3YGHDSi' @ 72057594037927935 : 1 .. '!actors.items!z6lMSAkEENJFTvIP.wwJcCyyHbp1gt9iq' @ 0 : 0; will stop at (end)
Binary file not shown.
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
MANIFEST-000002
View File
+5
View File
@@ -0,0 +1,5 @@
2026/07/14-09:38:57.454787 16e987000 Delete type=3 #1
2026/07/14-09:38:57.455790 170237000 Level-0 table #5: started
2026/07/14-09:38:57.456601 170237000 Level-0 table #5: 63789 bytes OK
2026/07/14-09:38:57.456761 170237000 Delete type=0 #3
2026/07/14-09:38:57.456863 170237000 Manual compaction at level-0 from '!journal!9PRuE5Q81BnO22fH' @ 72057594037927935 : 1 .. '!journal.pages!9PRuE5Q81BnO22fH.qCt9jGDZePPN5S6G' @ 0 : 0; will stop at (end)
Binary file not shown.
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
MANIFEST-000002
View File

Some files were not shown because too many files have changed in this diff Show More