make-portraits: every creature gets art it cannot disagree with

Sixty of the seventy-six actors had no portrait. The sixteen that did are the
hand-made duty roster; the whole bestiary and every scenario NPC fell back to a
generic silhouette.

The point is not that this is free. A portrait composed from anatomy.mjs cannot
contradict the statblock, because it is drawn from the numbers the hit-location roll
uses: silhouette from BODY_ART, height from SIZ, build from STR against SIZ, plating
from naturalArmour, a mark for the primary weapon's class. A Cadence would get five
bodies because its table has five. Nothing has to be kept in step.

Colour carries what a GM wants off a thumbnail — whether the thing is a person,
folklore, recovered machinery, or the far side. That reads the shouted category the
role lines already carry (FOLKLORE, HORROR, FORWARD), which nothing was using, and
falls back to structure for the ones with no tag.

build-packs resolves portraits by stem and extension rather than an exact .webp
filename, so a creature gains art without an edit to content.mjs and a hand-made
raster always beats the generated diagram. A spec that NAMES a portrait and has none
is still a hard build failure.

These read as diagrammatic field-guide plates and will not match the Midjourney agent
portraits. That split is deliberate: the agents are the cast, the bestiary is case
material.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-08-31 20:32:53 +01:00
co-authored by Claude Opus 5
parent 24b183642f
commit 9ddea43720
63 changed files with 1758 additions and 6 deletions
+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The auditor</title>
<desc>The auditor — baseline, SIZ 11, 7 hit locations, natural armour 4, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(201 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="46.5" ry="6.5" fill="hsl(201 66% 17%)" opacity="0.8"/>
<g transform="translate(83.31 80.45) scale(0.7448 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(201 78% 84%)" stroke="hsl(201 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(201 78% 84%)" stroke="hsl(201 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(201 78% 84%)" stroke="hsl(201 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(201 78% 84%)" stroke="hsl(201 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(201 78% 84%)" stroke="hsl(201 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(201 78% 84%)" stroke="hsl(201 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(201 78% 84%)" stroke="hsl(201 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(201 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(201 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(201 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(201 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(201 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(201 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(201 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(201 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(201 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Barghest</title>
<desc>Barghest — baseline, SIZ 15, 7 hit locations, natural armour 3, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(41 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(41 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="58.6" ry="8.2" fill="hsl(41 44% 17%)" opacity="0.8"/>
<g transform="translate(71.66 59.38) scale(0.9390 0.8726)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(41 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(41 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Boggart</title>
<desc>Boggart — baseline, SIZ 5, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(44 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(44 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="46.2" ry="6.5" fill="hsl(44 44% 17%)" opacity="0.8"/>
<g transform="translate(83.60 120.53) scale(0.7400 0.5606)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(44 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(44 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Callum Pike</title>
<desc>Callum Pike — baseline, SIZ 15, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(34 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(34 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="54.9" ry="7.7" fill="hsl(34 44% 17%)" opacity="0.8"/>
<g transform="translate(75.19 59.38) scale(0.8801 0.8726)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(34 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The Conductor</title>
<desc>The Conductor — baseline, SIZ 14, 7 hit locations, natural armour 4, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(32 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(32 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="55.4" ry="7.8" fill="hsl(32 44% 17%)" opacity="0.8"/>
<g transform="translate(74.77 64.43) scale(0.8872 0.8468)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(32 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(32 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(32 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(32 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(32 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(32 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(32 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(32 38% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(32 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Dr Elin Shaw</title>
<desc>Dr Elin Shaw — baseline, SIZ 11, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(204 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="44.1" ry="6.2" fill="hsl(204 66% 17%)" opacity="0.8"/>
<g transform="translate(85.59 80.45) scale(0.7068 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(204 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(204 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Ticket inspector</title>
<desc>Ticket inspector — baseline, SIZ 12, 7 hit locations, natural armour 2, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(26 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(26 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="50.3" ry="7.0" fill="hsl(26 44% 17%)" opacity="0.8"/>
<g transform="translate(79.59 74.95) scale(0.8069 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(26 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(26 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(26 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(26 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(26 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(26 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(26 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(26 38% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(26 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Leah Hall</title>
<desc>Leah Hall — baseline, SIZ 11, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(29 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(29 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.8" ry="6.8" fill="hsl(29 44% 17%)" opacity="0.8"/>
<g transform="translate(81.12 80.45) scale(0.7813 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(29 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(29 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Mara Venn</title>
<desc>Mara Venn — baseline, SIZ 12, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(30 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(30 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.2" ry="6.7" fill="hsl(30 44% 17%)" opacity="0.8"/>
<g transform="translate(81.67 74.95) scale(0.7721 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(30 38% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(30 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Martin Cole</title>
<desc>Martin Cole — baseline, SIZ 12, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(37 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(37 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.2" ry="6.7" fill="hsl(37 44% 17%)" opacity="0.8"/>
<g transform="translate(81.67 74.95) scale(0.7721 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(37 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(37 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Nia Mercer</title>
<desc>Nia Mercer — baseline, SIZ 12, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(205 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="45.9" ry="6.4" fill="hsl(205 66% 17%)" opacity="0.8"/>
<g transform="translate(83.84 74.95) scale(0.7360 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(205 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(205 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Owen Dey</title>
<desc>Owen Dey — baseline, SIZ 12, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(43 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(43 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.2" ry="6.7" fill="hsl(43 44% 17%)" opacity="0.8"/>
<g transform="translate(81.67 74.95) scale(0.7721 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(43 38% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(43 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Sennen Roake</title>
<desc>Sennen Roake — baseline, SIZ 10, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(193 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="47.1" ry="6.6" fill="hsl(193 66% 17%)" opacity="0.8"/>
<g transform="translate(82.70 86.15) scale(0.7551 0.7360)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(193 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(193 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The carrion file</title>
<desc>The carrion file — baseline, SIZ 9, 7 hit locations, natural armour 6, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(6 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="54.7" ry="7.7" fill="hsl(6 66% 17%)" opacity="0.8"/>
<g transform="translate(75.44 92.09) scale(0.8759 0.7056)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(6 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(6 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Ceyla Marspont</title>
<desc>Ceyla Marspont — baseline, SIZ 13, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(210 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="47.7" ry="6.7" fill="hsl(210 66% 17%)" opacity="0.8"/>
<g transform="translate(82.15 69.62) scale(0.7642 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(210 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(210 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Church grim</title>
<desc>Church grim — baseline, SIZ 14, 7 hit locations, natural armour 5, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(342 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="55.4" ry="7.8" fill="hsl(342 66% 17%)" opacity="0.8"/>
<g transform="translate(74.77 64.43) scale(0.8872 0.8468)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(342 78% 84%)" stroke="hsl(342 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(342 78% 84%)" stroke="hsl(342 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(342 78% 84%)" stroke="hsl(342 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(342 78% 84%)" stroke="hsl(342 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(342 78% 84%)" stroke="hsl(342 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(342 78% 84%)" stroke="hsl(342 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(342 78% 84%)" stroke="hsl(342 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(342 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(342 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(342 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(342 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(342 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(342 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(342 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(342 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(342 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Cleaner (contractor)</title>
<desc>Cleaner (contractor) — baseline, SIZ 12, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(206 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="50.3" ry="7.0" fill="hsl(206 66% 17%)" opacity="0.8"/>
<g transform="translate(79.59 74.95) scale(0.8069 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(206 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(206 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Cleaner (marksman)</title>
<desc>Cleaner (marksman) — baseline, SIZ 12, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(197 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="52.4" ry="7.3" fill="hsl(197 66% 17%)" opacity="0.8"/>
<g transform="translate(77.57 74.95) scale(0.8404 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(197 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(197 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Cuckoo array</title>
<desc>Cuckoo array — baseline, SIZ 20, 7 hit locations, natural armour 7, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(353 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="60.4" ry="8.5" fill="hsl(353 66% 17%)" opacity="0.8"/>
<g transform="translate(69.95 35.60) scale(0.9676 0.9939)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(353 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(353 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(353 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(353 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(353 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(353 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(353 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(353 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(353 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Dunn Halvorsen</title>
<desc>Dunn Halvorsen — baseline, SIZ 10, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(209 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="42.2" ry="5.9" fill="hsl(209 66% 17%)" opacity="0.8"/>
<g transform="translate(87.43 86.15) scale(0.6762 0.7360)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(209 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(209 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Duplicate (of an agent)</title>
<desc>Duplicate (of an agent) — baseline, SIZ 12, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(204 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.2" ry="6.7" fill="hsl(204 66% 17%)" opacity="0.8"/>
<g transform="translate(81.67 74.95) scale(0.7721 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(204 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(204 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Hollow man</title>
<desc>Hollow man — baseline, SIZ 12, 7 hit locations, natural armour 1, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(204 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.2" ry="6.7" fill="hsl(204 66% 17%)" opacity="0.8"/>
<g transform="translate(81.67 74.95) scale(0.7721 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(204 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(204 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(204 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(204 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(204 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(204 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(204 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(204 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(204 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The Keepers (waystation)</title>
<desc>The Keepers (waystation) — baseline, SIZ 12, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(216 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="50.3" ry="7.0" fill="hsl(216 66% 17%)" opacity="0.8"/>
<g transform="translate(79.59 74.95) scale(0.8069 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(216 78% 84%)" stroke="hsl(216 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(216 78% 84%)" stroke="hsl(216 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(216 78% 84%)" stroke="hsl(216 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(216 78% 84%)" stroke="hsl(216 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(216 78% 84%)" stroke="hsl(216 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(216 78% 84%)" stroke="hsl(216 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(216 78% 84%)" stroke="hsl(216 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(216 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(216 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Kelpie</title>
<desc>Kelpie — baseline, SIZ 18, 7 hit locations, natural armour 2, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(34 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(34 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="62.6" ry="8.8" fill="hsl(34 44% 17%)" opacity="0.8"/>
<g transform="translate(67.81 44.85) scale(1.0032 0.9467)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(34 50% 78%)" stroke="hsl(34 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(34 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(34 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(34 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(34 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(34 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(34 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(34 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(34 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(34 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Edith Crane</title>
<desc>Edith Crane — baseline, SIZ 10, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(47 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(47 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="42.2" ry="5.9" fill="hsl(47 44% 17%)" opacity="0.8"/>
<g transform="translate(87.43 86.15) scale(0.6762 0.7360)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(47 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(47 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Sister Enderby</title>
<desc>Sister Enderby — baseline, SIZ 11, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(42 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(42 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="50.9" ry="7.1" fill="hsl(42 44% 17%)" opacity="0.8"/>
<g transform="translate(79.01 80.45) scale(0.8165 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(42 50% 78%)" stroke="hsl(42 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(42 50% 78%)" stroke="hsl(42 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(42 50% 78%)" stroke="hsl(42 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(42 50% 78%)" stroke="hsl(42 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(42 50% 78%)" stroke="hsl(42 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(42 50% 78%)" stroke="hsl(42 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(42 50% 78%)" stroke="hsl(42 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(42 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(42 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Old Marrow</title>
<desc>Old Marrow — baseline, SIZ 22, 7 hit locations, natural armour 2, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(44 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(44 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="53.0" ry="7.4" fill="hsl(44 44% 17%)" opacity="0.8"/>
<g transform="translate(77.03 26.64) scale(0.8495 1.0396)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(44 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(44 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(44 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(44 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(44 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(44 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(44 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(44 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(44 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Beata Nowak</title>
<desc>Beata Nowak — baseline, SIZ 11, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(22 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(22 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="46.5" ry="6.5" fill="hsl(22 44% 17%)" opacity="0.8"/>
<g transform="translate(83.31 80.45) scale(0.7448 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(22 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(22 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Sammy, the boy in the wall</title>
<desc>Sammy, the boy in the wall — baseline, SIZ 6, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(44 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(44 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="49.6" ry="7.0" fill="hsl(44 44% 17%)" opacity="0.8"/>
<g transform="translate(80.26 112.26) scale(0.7957 0.6028)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(44 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(44 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Vic Tunnicliffe</title>
<desc>Vic Tunnicliffe — baseline, SIZ 13, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(24 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(24 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="47.7" ry="6.7" fill="hsl(24 44% 17%)" opacity="0.8"/>
<g transform="translate(82.15 69.62) scale(0.7642 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(24 50% 78%)" stroke="hsl(24 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(24 50% 78%)" stroke="hsl(24 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(24 50% 78%)" stroke="hsl(24 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(24 50% 78%)" stroke="hsl(24 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(24 50% 78%)" stroke="hsl(24 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(24 50% 78%)" stroke="hsl(24 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(24 50% 78%)" stroke="hsl(24 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(24 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(24 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Long walker</title>
<desc>Long walker — baseline, SIZ 22, 7 hit locations, natural armour 10, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(5 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="66.2" ry="9.3" fill="hsl(5 66% 17%)" opacity="0.8"/>
<g transform="translate(64.30 26.64) scale(1.0617 1.0396)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(5 78% 84%)" stroke="hsl(5 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(5 78% 84%)" stroke="hsl(5 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(5 78% 84%)" stroke="hsl(5 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(5 78% 84%)" stroke="hsl(5 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(5 78% 84%)" stroke="hsl(5 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(5 78% 84%)" stroke="hsl(5 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(5 78% 84%)" stroke="hsl(5 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(5 78% 62%)" stroke-width="10.50" opacity="0.92" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(5 78% 62%)" stroke-width="10.50" opacity="0.92" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(5 78% 62%)" stroke-width="10.50" opacity="0.92" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(5 78% 62%)" stroke-width="10.50" opacity="0.92" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(5 78% 62%)" stroke-width="10.50" opacity="0.92" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(5 78% 62%)" stroke-width="10.50" opacity="0.92" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(5 78% 62%)" stroke-width="10.50" opacity="0.92" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(5 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(5 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Mr Bewley</title>
<desc>Mr Bewley — baseline, SIZ 12, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(32 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(32 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="43.6" ry="6.1" fill="hsl(32 44% 17%)" opacity="0.8"/>
<g transform="translate(86.09 74.95) scale(0.6984 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(32 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(32 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Mrs Ivy Ferrand</title>
<desc>Mrs Ivy Ferrand — baseline, SIZ 11, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(36 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(36 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="44.1" ry="6.2" fill="hsl(36 44% 17%)" opacity="0.8"/>
<g transform="translate(85.59 80.45) scale(0.7068 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(36 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(36 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Douglas Kearsley</title>
<desc>Douglas Kearsley — baseline, SIZ 11, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(49 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(49 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="41.6" ry="5.8" fill="hsl(49 44% 17%)" opacity="0.8"/>
<g transform="translate(87.98 80.45) scale(0.6670 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(49 50% 78%)" stroke="hsl(49 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(49 50% 78%)" stroke="hsl(49 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(49 50% 78%)" stroke="hsl(49 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(49 50% 78%)" stroke="hsl(49 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(49 50% 78%)" stroke="hsl(49 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(49 50% 78%)" stroke="hsl(49 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(49 50% 78%)" stroke="hsl(49 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(49 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(49 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Councillor Hazel Odame</title>
<desc>Councillor Hazel Odame — baseline, SIZ 11, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(38 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(38 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="44.1" ry="6.2" fill="hsl(38 44% 17%)" opacity="0.8"/>
<g transform="translate(85.59 80.45) scale(0.7068 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(38 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(38 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Tony Vasey</title>
<desc>Tony Vasey — baseline, SIZ 13, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(29 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(29 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="49.8" ry="7.0" fill="hsl(29 44% 17%)" opacity="0.8"/>
<g transform="translate(80.08 69.62) scale(0.7986 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(29 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(29 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Quarantine unit</title>
<desc>Quarantine unit — baseline, SIZ 14, 7 hit locations, natural armour 9, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(192 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="59.1" ry="8.3" fill="hsl(192 66% 17%)" opacity="0.8"/>
<g transform="translate(71.21 64.43) scale(0.9465 0.8468)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(192 78% 84%)" stroke="hsl(192 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(192 78% 84%)" stroke="hsl(192 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(192 78% 84%)" stroke="hsl(192 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(192 78% 84%)" stroke="hsl(192 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(192 78% 84%)" stroke="hsl(192 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(192 78% 84%)" stroke="hsl(192 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(192 78% 84%)" stroke="hsl(192 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(192 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(192 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(192 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(192 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(192 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(192 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(192 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(192 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(192 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The Quiet Neighbours</title>
<desc>The Quiet Neighbours — baseline, SIZ 8, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(200 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="43.7" ry="6.1" fill="hsl(200 66% 17%)" opacity="0.8"/>
<g transform="translate(86.01 98.34) scale(0.6998 0.6738)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(200 78% 84%)" stroke="hsl(200 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(200 78% 84%)" stroke="hsl(200 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(200 78% 84%)" stroke="hsl(200 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(200 78% 84%)" stroke="hsl(200 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(200 78% 84%)" stroke="hsl(200 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(200 78% 84%)" stroke="hsl(200 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(200 78% 84%)" stroke="hsl(200 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34a30 30 0 0 1 32-26" fill="none" stroke="hsl(200 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(200 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Rakhi Oyelaran-Vost</title>
<desc>Rakhi Oyelaran-Vost — baseline, SIZ 19, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(206 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="57.2" ry="8.0" fill="hsl(206 66% 17%)" opacity="0.8"/>
<g transform="translate(72.97 40.19) scale(0.9171 0.9705)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(206 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(206 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Redcap</title>
<desc>Redcap — baseline, SIZ 7, 7 hit locations, natural armour 2, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(28 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(28 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="52.7" ry="7.4" fill="hsl(28 44% 17%)" opacity="0.8"/>
<g transform="translate(77.33 105.00) scale(0.8445 0.6398)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(28 50% 78%)" stroke="hsl(28 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(28 50% 78%)" stroke="hsl(28 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(28 50% 78%)" stroke="hsl(28 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(28 50% 78%)" stroke="hsl(28 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(28 50% 78%)" stroke="hsl(28 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(28 50% 78%)" stroke="hsl(28 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(28 50% 78%)" stroke="hsl(28 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(28 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(28 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(28 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(28 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(28 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(28 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(28 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(28 38% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(28 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Revenant</title>
<desc>Revenant — baseline, SIZ 13, 7 hit locations, natural armour 4, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(353 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="55.9" ry="7.8" fill="hsl(353 66% 17%)" opacity="0.8"/>
<g transform="translate(74.29 69.62) scale(0.8952 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(353 78% 84%)" stroke="hsl(353 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(353 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(353 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(353 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(353 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(353 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(353 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(353 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(353 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(353 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Surveyor</title>
<desc>Surveyor — baseline, SIZ 13, 7 hit locations, natural armour 8, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(219 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="53.9" ry="7.5" fill="hsl(219 66% 17%)" opacity="0.8"/>
<g transform="translate(76.16 69.62) scale(0.8640 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(219 78% 84%)" stroke="hsl(219 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(219 78% 84%)" stroke="hsl(219 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(219 78% 84%)" stroke="hsl(219 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(219 78% 84%)" stroke="hsl(219 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(219 78% 84%)" stroke="hsl(219 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(219 78% 84%)" stroke="hsl(219 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(219 78% 84%)" stroke="hsl(219 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(219 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(219 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(219 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(219 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(219 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(219 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(219 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(219 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(219 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The choir</title>
<desc>The choir — baseline, SIZ 11, 7 hit locations, natural armour 1, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(30 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(30 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="46.5" ry="6.5" fill="hsl(30 44% 17%)" opacity="0.8"/>
<g transform="translate(83.31 80.45) scale(0.7448 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(30 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(30 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(30 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(30 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(30 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(30 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(30 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(30 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(30 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The tenant</title>
<desc>The tenant — baseline, SIZ 10, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(43 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(43 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="39.5" ry="5.5" fill="hsl(43 44% 17%)" opacity="0.8"/>
<g transform="translate(89.98 86.15) scale(0.6337 0.7360)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(43 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(43 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The understudy</title>
<desc>The understudy — baseline, SIZ 12, 7 hit locations, natural armour 2, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(215 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="50.3" ry="7.0" fill="hsl(215 66% 17%)" opacity="0.8"/>
<g transform="translate(79.59 74.95) scale(0.8069 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(215 78% 84%)" stroke="hsl(215 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(215 78% 84%)" stroke="hsl(215 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(215 78% 84%)" stroke="hsl(215 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(215 78% 84%)" stroke="hsl(215 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(215 78% 84%)" stroke="hsl(215 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(215 78% 84%)" stroke="hsl(215 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(215 78% 84%)" stroke="hsl(215 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(215 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(215 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(215 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(215 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(215 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(215 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(215 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(215 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(215 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Tomas Ekwueme</title>
<desc>Tomas Ekwueme — baseline, SIZ 12, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(217 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="50.3" ry="7.0" fill="hsl(217 66% 17%)" opacity="0.8"/>
<g transform="translate(79.59 74.95) scale(0.8069 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(217 78% 84%)" stroke="hsl(217 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(217 78% 84%)" stroke="hsl(217 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(217 78% 84%)" stroke="hsl(217 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(217 78% 84%)" stroke="hsl(217 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(217 78% 84%)" stroke="hsl(217 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(217 78% 84%)" stroke="hsl(217 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(217 78% 84%)" stroke="hsl(217 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(217 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(217 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Josiah Ambrose</title>
<desc>Josiah Ambrose — baseline, SIZ 14, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(25 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(25 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="53.4" ry="7.5" fill="hsl(25 44% 17%)" opacity="0.8"/>
<g transform="translate(76.63 64.43) scale(0.8562 0.8468)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(25 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(25 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Mr Bewley</title>
<desc>Mr Bewley — baseline, SIZ 11, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(36 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(36 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="41.6" ry="5.8" fill="hsl(36 44% 17%)" opacity="0.8"/>
<g transform="translate(87.98 80.45) scale(0.6670 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(36 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(36 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Hester Bligh</title>
<desc>Hester Bligh — baseline, SIZ 11, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(38 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(38 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="46.5" ry="6.5" fill="hsl(38 44% 17%)" opacity="0.8"/>
<g transform="translate(83.31 80.45) scale(0.7448 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(38 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(38 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Company guard</title>
<desc>Company guard — baseline, SIZ 12, 7 hit locations, natural armour 1, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(36 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(36 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.2" ry="6.7" fill="hsl(36 44% 17%)" opacity="0.8"/>
<g transform="translate(81.67 74.95) scale(0.7721 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(36 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(36 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(36 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(36 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(36 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(36 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(36 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(36 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(36 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Cordera man (town)</title>
<desc>Cordera man (town) — baseline, SIZ 13, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(30 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(30 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="51.9" ry="7.3" fill="hsl(30 44% 17%)" opacity="0.8"/>
<g transform="translate(78.09 69.62) scale(0.8318 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(30 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(30 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Marius Kell</title>
<desc>Marius Kell — baseline, SIZ 13, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(22 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(22 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="51.9" ry="7.3" fill="hsl(22 44% 17%)" opacity="0.8"/>
<g transform="translate(78.09 69.62) scale(0.8318 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(22 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(22 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Cass Merritt</title>
<desc>Cass Merritt — baseline, SIZ 13, 7 hit locations, natural armour 1, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(29 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(29 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="49.8" ry="7.0" fill="hsl(29 44% 17%)" opacity="0.8"/>
<g transform="translate(80.08 69.62) scale(0.7986 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(29 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(29 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(29 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(29 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(29 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(29 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(29 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(29 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(29 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Mr Prosser</title>
<desc>Mr Prosser — baseline, SIZ 12, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(29 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(29 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.2" ry="6.7" fill="hsl(29 44% 17%)" opacity="0.8"/>
<g transform="translate(81.67 74.95) scale(0.7721 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(29 50% 78%)" stroke="hsl(29 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(29 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(29 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Rance Doyle</title>
<desc>Rance Doyle — baseline, SIZ 14, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(43 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(43 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="53.4" ry="7.5" fill="hsl(43 44% 17%)" opacity="0.8"/>
<g transform="translate(76.63 64.43) scale(0.8562 0.8468)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(43 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(43 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Ada Reyes</title>
<desc>Ada Reyes — baseline, SIZ 10, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(25 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(25 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="44.7" ry="6.3" fill="hsl(25 44% 17%)" opacity="0.8"/>
<g transform="translate(85.01 86.15) scale(0.7165 0.7360)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(25 50% 78%)" stroke="hsl(25 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(25 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(25 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Mr Shard</title>
<desc>Mr Shard — baseline, SIZ 12, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(31 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(31 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.2" ry="6.7" fill="hsl(31 44% 17%)" opacity="0.8"/>
<g transform="translate(81.67 74.95) scale(0.7721 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(31 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(31 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Tom Doyle</title>
<desc>Tom Doyle — baseline, SIZ 12, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(45 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(45 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="50.3" ry="7.0" fill="hsl(45 44% 17%)" opacity="0.8"/>
<g transform="translate(79.59 74.95) scale(0.8069 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(45 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(45 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Elias Vane</title>
<desc>Elias Vane — baseline, SIZ 11, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(38 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(38 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="44.1" ry="6.2" fill="hsl(38 44% 17%)" opacity="0.8"/>
<g transform="translate(85.59 80.45) scale(0.7068 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(38 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(38 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Cordera miner</title>
<desc>Cordera miner — baseline, SIZ 13, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(47 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(47 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="51.9" ry="7.3" fill="hsl(47 44% 17%)" opacity="0.8"/>
<g transform="translate(78.09 69.62) scale(0.8318 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(47 50% 78%)" stroke="hsl(47 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(47 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(47 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+2
View File
@@ -6,6 +6,8 @@
"scripts": {
"build": "node tools/build-packs.mjs && node tools/update-readme.mjs",
"icons": "node tools/make-icons.mjs",
"portraits": "node tools/make-portraits.mjs",
"mj": "node tools/mj-queue.mjs",
"simulate": "node tools/simulate.mjs",
"check": "node tools/check-rules.mjs && node tools/check-kits.mjs && node tools/check-lang.mjs && node tools/check-templates.mjs && node tools/check-behaviour.mjs && node tools/check-scenarios.mjs && node tools/check-creatures.mjs",
"test": "npm run check",
+27 -6
View File
@@ -308,14 +308,35 @@ function buildActor(spec, type) {
// A generated portrait if the spec names one, the generic silhouette otherwise.
// The token gets the same face: a pregen you can recognise on the map is worth
// more at a convention table than a correct one you cannot tell apart.
/* Resolved by stem and extension rather than by an exact filename.
*
* Two things changed. Portraits are no longer only .webp — tools/make-portraits.mjs
* writes .svg for every creature, and tools/mj-queue.mjs files .png when one is
* illustrated by hand — and a creature no longer has to NAME its portrait to get one:
* art found under its own key is used. That is what lets sixty creatures gain art
* without sixty edits to content.mjs.
*
* Order matters. A hand-made raster always beats the generated diagram, so upgrading a
* creature is a matter of dropping the file in; nothing has to be un-said in source. */
const PORTRAIT_EXT = ["webp", "png", "jpg", "svg"];
const findPortrait = stem => {
for (const ext of PORTRAIT_EXT) {
const rel = `art/portraits/${stem}.${ext}`;
if (existsSync(path.join(ROOT, rel))) return rel;
}
return null;
};
let face = ICON.actor;
if (spec.portrait) {
const rel = `art/portraits/${spec.portrait}.webp`;
// A missing portrait is a broken image on a pregen sheet that nobody notices
// until it is on a projector at a table. Fail the build instead.
if (!existsSync(path.join(ROOT, rel))) throw new Error(`${spec.name}: no portrait at ${rel}`);
face = `systems/ringbrp/${rel}`;
const found = findPortrait(spec.portrait ?? spec.key);
// A spec that NAMES a portrait and has none is still a hard failure: that is a broken
// image on a pregen sheet, and nobody notices until it is on a projector at a table.
// A spec that names none and has none simply keeps the generic silhouette.
if (spec.portrait && !found) {
throw new Error(`${spec.name}: no portrait for "${spec.portrait}" `
+ `(looked for ${PORTRAIT_EXT.map(e => `.${e}`).join(", ")} in art/portraits/)`);
}
if (found) face = `systems/ringbrp/${found}`;
const actorDoc = {
_id: actorId,
+410
View File
@@ -0,0 +1,410 @@
/**
* Procedural creature portraits, drawn from the creature's own anatomy.
*
* Sixty of the seventy-six actors in this repository have no art at all. The sixteen
* that do are hand-made Midjourney plates for the duty roster; every monster in the
* bestiary and every scenario NPC falls back to a generic silhouette that tells a GM
* nothing and tells a player less.
*
* THE POINT IS NOT THAT IT IS FREE. It is that a portrait composed from
* anatomy.mjs CANNOT CONTRADICT THE STATBLOCK, because it is drawn from the same
* numbers the hit-location roll uses. A Cadence gets five bodies because its location
* table has five entries. A Vesh gets a sensory ridge and no head because it has no
* head to draw. Nobody has to remember to keep the art in step; there is nothing to
* keep in step.
*
* Everything visible is derived:
*
* silhouette BODY_ART[species].parts — 7 for a baseline, 6 for a vesh, 5 for a cadence
* height SIZ 5 (a boggart) to SIZ 22 (a long walker), planted on a groundline
* build STR against SIZ, the only build information a BRP statblock carries
* plating naturalArmour, drawn over every part, legible at 32px
* weapon mark the class of the creature's primary weapon, not its name
* treatment whether it is a person, folklore, recovered technology, or the far side
* hue anchored on that, so a wall of the bestiary sorts itself by eye
*
* Deterministic from the creature key: same creature, same file, so art does not churn
* in git. Output is SVG for the same reasons icons/ is — scalable, tiny, diffable, and
* no image toolchain on any of the three machines this repo is checked out on.
*
* THE HONEST TRADE. These read as diagrammatic: a species-accurate figure on a treated
* tile, not an illustration. Put one beside pc_holloway.webp and you will see it. That
* is the deal — every creature has correct art today, and tools/mj-queue.mjs upgrades
* any individual one to a drawn portrait when it earns the attention.
*
* node tools/make-portraits.mjs write art for every creature that has none
* node tools/make-portraits.mjs --force redraw everything, including existing SVGs
* node tools/make-portraits.mjs --only keepers,barghest
* node tools/make-portraits.mjs --only tt_ prefix match
* node tools/make-portraits.mjs --list what has art, what does not, and why
*
* --force never touches a .webp or .png. Hand-made art is never overwritten by this
* tool, whatever you ask it to do.
*/
import { writeFile, mkdir } from "node:fs/promises";
import { existsSync } from "node:fs";
import path from "node:path";
import { pathToFileURL } from "node:url";
import { BODY_ART, LOCATION_TABLES } from "../anatomy.mjs";
import { WEAPONS, ARMOURS, GEAR } from "./content.mjs";
import { collectSpecs } from "./all-specs.mjs";
const ROOT = path.resolve(path.dirname(new URL(import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, "$1")), "..");
const OUT = path.join(ROOT, "art", "portraits");
const WEAPON = new Map(WEAPONS.map(w => [w.key, w]));
const ARMOUR = new Map(ARMOURS.map(a => [a.key, a]));
const GEARM = new Map(GEAR.map(g => [g.key, g]));
/* ------------------------------------------------------------------ palette */
/* Hue anchors, taken from the icon set's own families.
*
* The first cut of this tool coloured by actor-vs-npc — hue 330 against 355 — and drew
* sixty tiles in one indistinguishable shade of maroon. Colour has to carry information
* or it is decoration, so it carries the one thing a GM most wants off a thumbnail:
* WHAT KIND OF THING IS THIS. Agency steel for people, brass for folklore, violet for
* recovered technology, red for the far side. A wall of the bestiary then sorts itself
* by eye before a single name is read. */
const ERA_HUE = { modern: 205, antique: 35, future: 275, anomalous: 355 };
const S = 256;
const hsl = (h, s, l) => `hsl(${h} ${s}% ${l}%)`;
/** FNV-1a. Small, stable across node versions, and that is the whole requirement. */
function hash(str) {
let h = 0x811c9dc5;
for (let i = 0; i < str.length; i++) {
h ^= str.charCodeAt(i);
h = Math.imul(h, 0x01000193) >>> 0;
}
return h >>> 0;
}
/* ------------------------------------------------------------------ derivation */
/** Rank of era by how far from ordinary it is; the creature is drawn as its most exotic. */
const ERA_RANK = { modern: 0, antique: 1, future: 2, anomalous: 3 };
/**
* Which tile treatment a creature gets.
*
* The icon set uses era to mean "which century did this object come from", because for
* an object that is the interesting question. For a creature it is not: the bestiary's
* natural weapons — grasp, punch — carry no era at all, so reading kit alone paints the
* entire far side "modern agency issue" and the whole wall of portraits goes flat.
*
* The question a GM actually has is whether the thing in front of them is a person. That
* one IS answerable from the spec, structurally rather than by keyword:
*
* a non-baseline species is anomalous by definition
* only natural weapons, well armoured is not a person — the far side, horror
* only natural weapons, lightly armoured is folklore — old, and older than the agency
* carrying manufactured kit is a person, and the kit dates them
*
* So a cleaner reads modern, a redcap reads antique, and a long walker's tile does not
* close.
*/
/**
* The author's own classification, if the spec carries one. Thirty of the seventy-six
* role lines open with a shouted category — "FOLKLORE. The black dog on the road out of
* the village" — and those are the three groupings the README already advertises. An
* authored label beats anything inferred from kit, so it is read first and the
* structural rules below only decide the ones that have none.
*/
export const ROLE_CLASS = {
FOLKLORE: "antique", // older than the agency
FORWARD: "future", // the far side, and the machinery it sends
HORROR: "anomalous", // should not exist, and does
// The rest are people, in various relationships to the department.
CIVILIAN: "modern", DEPARTMENT: "modern", BUREAU: "modern",
ENTRY: "modern", REAL: "modern"
};
/** Categories that are not people. Everything else in ROLE_CLASS is somebody. */
export const MONSTER_TAGS = ["FOLKLORE", "FORWARD", "HORROR"];
/* The tag is not always followed by a full stop — "BUREAU, present day. Registry." — so
this matches the shouted word itself and stops at the first word boundary. Anchoring on
the period missed both Bureau staff and read them as monsters. */
export const roleTagOf = spec =>
(String(spec.role ?? "").match(/^([A-Z]{3,})\b/) ?? [, null])[1];
export const roleClassOf = spec => ROLE_CLASS[roleTagOf(spec)] ?? null;
/**
* True when nothing this creature carries was made by anybody: a natural weapon weighs
* nothing and belongs to the family "brawl", and there is no gear and no armour. A
* barghest passes; a miner in 1881 does not, because a pick is a manufactured thing.
*/
export function carriesNothingManufactured(spec) {
const gearKeys = [
...(spec.gear ?? []).map(g => Array.isArray(g) ? g[0] : g),
...(spec.extraGear ?? []).map(g => Array.isArray(g) ? g[0] : g)
];
if (gearKeys.length || (spec.armour ?? []).length) return false;
const weapons = [...(spec.weapons ?? []), ...(spec.extraWeapons ?? [])];
// At least one, deliberately: [].every() is vacuously true, so an empty list once made
// this answer "yes" for anybody carrying nothing at all — which read Callum the bouncer,
// who has no kit listed, as a monster. The test is HAVING natural weapons, not lacking
// manufactured ones.
return weapons.length > 0
&& weapons.every(k => { const w = WEAPON.get(k); return w && w.fam === "brawl" && !w.mass; });
}
export function eraOf(spec) {
if ((spec.species ?? "baseline") !== "baseline") return "anomalous";
const authored = roleClassOf(spec);
if (authored) return authored;
const gearKeys = [
...(spec.gear ?? []).map(g => Array.isArray(g) ? g[0] : g),
...(spec.extraGear ?? []).map(g => Array.isArray(g) ? g[0] : g)
];
const weaponKeys = [...(spec.weapons ?? []), ...(spec.extraWeapons ?? [])];
const armourKeys = spec.armour ?? [];
const carriesNothingMade = carriesNothingManufactured(spec);
if (carriesNothingMade) {
return (Number(spec.naturalArmour) || 0) >= 4 ? "anomalous" : "antique";
}
let best = "modern";
for (const k of [...weaponKeys, ...armourKeys, ...gearKeys]) {
const era = (WEAPON.get(k) ?? ARMOUR.get(k) ?? GEARM.get(k))?.era;
if (era && (ERA_RANK[era] ?? 0) > ERA_RANK[best]) best = era;
}
return best;
}
/**
* How tall to draw it. SIZ runs 5 (a boggart) to 22 (a long walker) across the repo, and
* the first cut compressed that into 0.68–1.14, where nothing read as bigger than
* anything else. A boggart should be visibly a thing you could kick.
*/
function heightScale(siz) {
const n = Number(siz) || 13;
const t = (Math.min(24, Math.max(4, n)) - 4) / 20; // 0..1
return 0.46 + Math.pow(t, 0.75) * 0.54; // 0.46..1.00 of the well
}
/**
* How broad to draw it, from STR against SIZ — the only build information a BRP
* statblock actually carries. The repo spans 0.73 (Old Marrow, who is eighty) to 2.83
* (Sammy, who is a child and much stronger than he has any business being), so this is
* real signal rather than noise dressed up as signal. Normalised around 1.05, which is
* roughly where the duty roster sits, so an ordinary adult draws at ordinary width.
*/
function buildScale(ch) {
const str = Number(ch?.str) || 12, siz = Number(ch?.siz) || 12;
const r = Math.pow((str / siz) / 1.05, 0.55);
return Math.min(1.32, Math.max(0.78, r));
}
/** The creature's primary weapon, reduced to how it is held rather than what it is. */
function weaponMark(spec) {
const key = (spec.weapons ?? [])[0] ?? (spec.extraWeapons ?? [])[0];
const w = key ? WEAPON.get(key) : null;
if (!w) return null;
if (w.cls === "firearm" || w.cls === "energy") return "firearm";
if (w.cls === "bow" || w.cls === "thrown") return "thrown";
// A natural weapon weighs nothing and is part of the creature: claws, not a knife.
if (w.fam === "brawl" && !w.mass) return "natural";
return "melee";
}
const MARKS = {
firearm: `M6 20h26v7H16l-4 9H6z`,
melee: `M4 34L30 8l5 5L9 39z`,
thrown: `M4 34a30 30 0 0 1 32-26`,
natural: `M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26`
};
const MARK_STROKE = new Set(["thrown", "natural"]);
/* ------------------------------------------------------------------ drawing */
/** One anatomical part, in whichever primitive body-figure.hbs would have drawn it. */
function part(shape, attrs) {
if (shape.t === "ellipse") {
return `<ellipse cx="${shape.cx}" cy="${shape.cy}" rx="${shape.rx}" ry="${shape.ry}" ${attrs}/>`;
}
if (shape.t === "rect") {
return `<rect x="${shape.x}" y="${shape.y}" width="${shape.w}" height="${shape.h}" rx="${shape.rx ?? 0}" ${attrs}/>`;
}
return `<path d="${shape.d}" ${attrs}/>`;
}
export function portraitSvg(spec, kind = "npc") {
const species = spec.species ?? "baseline";
const art = BODY_ART[species] ?? BODY_ART.baseline;
const table = LOCATION_TABLES[species] ?? LOCATION_TABLES.baseline;
const era = eraOf(spec);
const muted = era === "antique";
// Hue: the era anchor, nudged by the key so a row of cleaners is not one flat colour,
// but never far enough to leave its family.
const hue = (ERA_HUE[era] + ((hash(spec.key) % 29) - 14) + 360) % 360;
const bg1 = hsl(hue, muted ? 38 : 58, muted ? 27 : 30);
const bg2 = hsl(hue, muted ? 44 : 66, 17);
const ink = hsl(hue, muted ? 50 : 78, muted ? 78 : 84);
const mid = hsl(hue, muted ? 38 : 62, 48);
const rim = hsl(hue, 78, 62);
/* --- era treatment, matching tools/make-icons.mjs --- */
let corner = "", scan = "";
let rimPath = `<rect x="6" y="6" width="${S - 12}" height="${S - 12}" rx="26" fill="none" stroke="${rim}" stroke-width="5"/>`;
if (era === "antique") corner = `<path d="M0 0h52L0 52z" fill="${bg2}"/>`;
if (era === "future") {
corner = `<path d="M${S - 56} 0H${S}v56z" fill="${rim}" opacity="0.55"/>`;
scan = `<path d="M18 ${S - 44}h${S - 36}" stroke="${rim}" stroke-width="2" opacity="0.65"/>`;
}
if (era === "anomalous") {
rimPath = `<rect x="6" y="6" width="${S - 12}" height="${S - 12}" rx="26" fill="none"
stroke="${rim}" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>`;
}
/* --- the figure --- */
/* Feet planted on a common groundline rather than centred, so a boggart is short
instead of merely small and floating, and height reads directly against the tile.
The well is the space between that groundline and the top margin: the largest
creature in the game fills it exactly and NOTHING is ever drawn outside it. The
long walker is SIZ 22 and was cropped at the scalp before this was a ratio of the
well rather than of the tile. */
const GROUND = S * 0.90;
const WELL = GROUND - S * 0.07;
const [, , vbW, vbH] = String(art.viewBox).split(/\s+/).map(Number);
const sy = (WELL / vbH) * heightScale(spec.ch?.siz);
const sx = sy * buildScale(spec.ch);
const tx = (S - vbW * sx) / 2;
const ty = GROUND - vbH * sy;
const nat = Number(spec.naturalArmour) || 0;
const shapes = Object.entries(art.parts);
const body = shapes
.map(([, shape]) => part(shape, `fill="${ink}" stroke="${bg2}" stroke-width="3" stroke-linejoin="round"`))
.join("\n ");
/* Natural armour, as plating over every part. Drawn in the figure's own coordinate
space so it tracks the anatomy — a Cadence gets five plated bodies, not one plated
blob. Scaled to be legible at 32px in an actor list, which is the size this is
actually looked at: nothing at 0, unmistakable at 10. */
const plating = nat <= 0 ? "" : shapes
.map(([, shape]) => part(shape,
`fill="none" stroke="${rim}" stroke-width="${(2 + Math.min(nat, 12) * 0.85).toFixed(2)}" `
+ `opacity="${Math.min(0.92, 0.34 + nat * 0.06).toFixed(2)}" stroke-linejoin="round"`))
.join("\n ");
// Something to stand on, scaled with the figure, so size reads as size rather than as
// the picture being zoomed.
const groundR = vbW * sx * 0.52;
const ground = `<ellipse cx="${(S / 2).toFixed(1)}" cy="${GROUND.toFixed(1)}" `
+ `rx="${groundR.toFixed(1)}" ry="${(groundR * 0.14).toFixed(1)}" fill="${bg2}" opacity="0.8"/>`;
/* --- weapon mark, bottom right --- */
const mk = weaponMark(spec);
const mark = !mk ? "" :
`<g transform="translate(${S - 62} ${S - 58}) scale(1.15)" opacity="0.92">`
+ (MARK_STROKE.has(mk)
? `<path d="${MARKS[mk]}" fill="none" stroke="${mid}" stroke-width="4" stroke-linecap="round"/>`
: `<path d="${MARKS[mk]}" fill="${mid}"/>`)
+ `</g>`;
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${S} ${S}" width="${S}" height="${S}">
<title>${esc(spec.name)}</title>
<desc>${esc(spec.name)} — ${species}, SIZ ${spec.ch?.siz ?? "?"}, `
+ `${table.locations.length} hit locations, natural armour ${nat}, ${era}. `
+ `Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="${S}" height="${S}" rx="30" fill="${bg1}"/>
${corner}
${ground}
<g transform="translate(${tx.toFixed(2)} ${ty.toFixed(2)}) scale(${sx.toFixed(4)} ${sy.toFixed(4)})">
${body}
${plating}
</g>
${mark}
${rimPath}
${scan}
</svg>
`;
}
const esc = s => String(s).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
/* ------------------------------------------------------------------ run */
/** Art already on disk for this stem, in any format, or null. */
function existingArt(stem) {
for (const ext of ["webp", "png", "jpg", "svg"]) {
if (existsSync(path.join(OUT, `${stem}.${ext}`))) return `${stem}.${ext}`;
}
return null;
}
/* Only when run directly. portraitSvg() is importable so that a species with no creature
in it yet can still be drawn and looked at — vesh and cadence have full geometry and
nothing has ever used either, so the first creature written in one should not also be
the first time anybody sees what it looks like. A module that writes files and exits
on import is no use for that. */
const invokedDirectly = process.argv[1]
&& import.meta.url === pathToFileURL(process.argv[1]).href;
if (invokedDirectly) {
const argv = process.argv.slice(2);
const flag = n => argv.includes(n);
const opt = (n, d) => { const i = argv.indexOf(n); return i >= 0 ? argv[i + 1] : d; };
const FORCE = flag("--force");
const LIST = flag("--list");
const ONLY = (opt("--only", "") || "").split(",").map(s => s.trim()).filter(Boolean);
const all = await collectSpecs();
const selected = all.filter(({ spec }) =>
!ONLY.length || ONLY.some(o => spec.key === o || spec.key.startsWith(o)));
if (!selected.length) {
console.error(`nothing matched --only ${ONLY.join(",")}`);
process.exit(1);
}
if (LIST) {
let has = 0, none = 0;
for (const { spec, kind } of selected) {
const stem = spec.portrait ?? spec.key;
const found = existingArt(stem);
if (found) has++; else none++;
console.log(`${found ? "art " : " "} ${spec.key.padEnd(24)} ${(found ?? "—").padEnd(24)}`
+ `${(spec.species ?? "baseline").padEnd(9)} siz ${String(spec.ch?.siz ?? "?").padStart(2)} ${eraOf(spec)} ${kind}`);
}
console.log(`\n${has} with art, ${none} without, of ${selected.length}.`);
process.exit(0);
}
await mkdir(OUT, { recursive: true });
let wrote = 0, skipped = 0, kept = 0;
for (const { spec, kind } of selected) {
const stem = spec.portrait ?? spec.key;
const found = existingArt(stem);
// Hand-made art is never overwritten, --force or not. Regenerating a Midjourney plate
// into a diagram because a flag was passed is not a mistake anybody recovers from
// without a git checkout, and the tool should not be able to make it.
if (found && !found.endsWith(".svg")) {
if (ONLY.length) console.log(`keep ${spec.key.padEnd(24)} ${found} is hand-made — not replaced`);
kept++;
continue;
}
if (found && !FORCE) { skipped++; continue; }
await writeFile(path.join(OUT, `${stem}.svg`), portraitSvg(spec, kind), "utf8");
wrote++;
}
console.log(`make-portraits: wrote ${wrote}, kept ${kept} hand-made, skipped ${skipped} existing`
+ `${FORCE ? "" : " (use --force to redraw generated ones)"} — of ${selected.length}.`);
}