Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions packages/preview/pixel-family/0.2.1/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2025 GiggleLiu

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
50 changes: 50 additions & 0 deletions packages/preview/pixel-family/0.2.1/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Pixel Family

[![CI build status](https://github.com/GiggleLiu/pixel-family/actions/workflows/ci.yml/badge.svg)](https://github.com/GiggleLiu/pixel-family/actions/workflows/ci.yml)

Inline pixel art characters for Typst, rendered as native vector graphics. Drop them into running text like emoji.

**[Download the manual (PDF)](https://github.com/GiggleLiu/pixel-family/releases/download/v0.2.1/manual.pdf)**

## Meet the Family

![Pixel Family Gallery](images/gallery.svg)

Their names come from the cast of cryptography: Alice and Bob exchange secret messages, Eve eavesdrops, Frank forges signatures, Grace certifies keys, Trent arbitrates, Mallory attacks, and Victor verifies.

**[Vote for your favorite character!](https://github.com/GiggleLiu/pixel-family/discussions/1)**

## Quick Start

```typst
#import "@preview/pixel-family:0.2.1": *

Hello #bob() and #alice() are talking while #eve() listens.
```

Characters default to `1em` and center-align with surrounding text. Pass `size` for explicit sizing:

```typst
#bob(size: 3cm)
```

Use `baseline: 0pt` for bottom alignment:

```typst
#bob(size: 3cm, baseline: 0pt)
```

## Color Customization

Every character accepts `skin`, `hair`, `shirt`, and `pants`:

```typst
#bob(size: 3cm, hair: blue, shirt: red)
#alice(size: 3cm, hair: black, shirt: green)
```

Built-in skin tone presets: `skin-default`, `skin-light`, `skin-medium`, `skin-dark`.

## License

MIT
139 changes: 139 additions & 0 deletions packages/preview/pixel-family/0.2.1/characters/batch-1-initial.typ
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
// Pixel Family — Batch 1: Initial Cast
// Character pixel data and palette builders.
// Each character is a 16x16 grid with indexed colors.
// 0 = transparent, 1 = skin, 2 = hair, 3 = shirt, 4 = pants, 5 = eyes/detail, 6+ = accents
//
// Inspired by Brave Workz pixel-people style (LINE Store).
// Each character has a distinctive hair silhouette for instant recognition.

// ---------------------------------------------------------------------------
// Bob — The Messenger
// Green hair, slightly longer on right side. White shirt with black vest.
// Blue pocket accent on shirt.
// ---------------------------------------------------------------------------
#let bob-data = (
(0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0),
(0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0),
(0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0),
(0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0),
(0, 0, 0, 0, 1, 5, 1, 1, 1, 5, 1, 0, 2, 0, 0, 0),
(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 4, 3, 3, 3, 3, 3, 3, 3, 4, 0, 0, 0, 0),
(0, 0, 1, 4, 3, 3, 6, 3, 3, 3, 3, 4, 1, 0, 0, 0),
(0, 0, 0, 4, 3, 3, 3, 3, 3, 3, 3, 4, 0, 0, 0, 0),
(0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 4, 0, 4, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0),
)
// palette: (none, skin, hair, shirt, vest/pants, eyes, blue-pocket)
#let bob-colors(skin, hair, shirt, pants) = (none, skin, hair, shirt, pants, pants, rgb("#4a90e2"))

// ---------------------------------------------------------------------------
// Alice — The Decoder
// Long brown hair flowing down both sides past the face.
// Prominent mustache, red breast pocket.
// ---------------------------------------------------------------------------
#let alice-data = (
(0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0),
(0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0),
(0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0),
(0, 0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0),
(0, 0, 2, 1, 1, 5, 1, 1, 1, 5, 1, 1, 2, 0, 0, 0),
(0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0),
(0, 0, 2, 0, 1, 1, 5, 5, 5, 1, 1, 0, 2, 0, 0, 0),
(0, 0, 2, 0, 0, 1, 1, 1, 1, 1, 0, 0, 2, 0, 0, 0),
(0, 0, 2, 0, 3, 3, 3, 3, 3, 3, 3, 0, 2, 0, 0, 0),
(0, 0, 0, 1, 3, 3, 3, 3, 3, 3, 6, 1, 0, 0, 0, 0),
(0, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 0, 0),
(0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 4, 0, 4, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0),
)
// palette: (none, skin, hair, shirt, pants, eyes/mustache, pocket-red)
#let alice-colors(skin, hair, shirt, pants) = (none, skin, hair, shirt, pants, pants, rgb("#e74c3c"))

// ---------------------------------------------------------------------------
// Christina — The Architect
// Voluminous purple hair with yellow clip, green tie.
// Hair drapes down past face on both sides.
// ---------------------------------------------------------------------------
#let christina-data = (
(0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0),
(0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0),
(0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0),
(0, 0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0),
(0, 2, 0, 1, 1, 5, 1, 1, 1, 5, 1, 1, 0, 2, 0, 0),
(0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0),
(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 1, 7, 7, 1, 1, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 7, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 4, 0, 4, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0),
)
// palette: (none, skin, hair, shirt, pants, eyes, clip-yellow, tie-green)
#let christina-colors(skin, hair, shirt, pants) = (
none, skin, hair, shirt, pants, pants, rgb("#f1c40f"), rgb("#27ae60"),
)

// ---------------------------------------------------------------------------
// Mary — The Auditor
// Black twin tails with red ribbons, red bow at collar.
// Widest silhouette due to pigtails extending sideways.
// ---------------------------------------------------------------------------
#let mary-data = (
(0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0),
(0, 6, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 6, 0, 0),
(0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0),
(0, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 0, 0),
(0, 2, 2, 1, 1, 5, 1, 1, 1, 5, 1, 1, 2, 2, 0, 0),
(0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0),
(0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 2, 0, 0),
(0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 6, 6, 6, 6, 6, 3, 3, 0, 0, 0, 0),
(0, 0, 1, 3, 3, 3, 3, 6, 3, 3, 3, 3, 1, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 4, 0, 4, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0),
)
// palette: (none, skin, hair, shirt, pants, eyes, ribbon/bow-red)
#let mary-colors(skin, hair, shirt, pants) = (none, skin, hair, shirt, pants, pants, rgb("#e74c3c"))

// ---------------------------------------------------------------------------
// Eve — The Eavesdropper
// Wild red curly hair — biggest silhouette of all characters.
// Curly bumps on top, hair extends wide on both sides.
// ---------------------------------------------------------------------------
#let eve-data = (
(0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0),
(0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0),
(0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0),
(0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0),
(0, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0),
(0, 2, 2, 1, 1, 5, 1, 1, 1, 5, 1, 1, 2, 2, 0, 0),
(0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0),
(0, 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0, 0),
(0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 4, 0, 4, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0),
)
// palette: (none, skin, hair, shirt, pants, eyes)
#let eve-colors(skin, hair, shirt, pants) = (none, skin, hair, shirt, pants, pants)
129 changes: 129 additions & 0 deletions packages/preview/pixel-family/0.2.1/characters/batch-2-top.typ
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
// Pixel Family — Batch 2: Extended Cast (bust/portrait, no legs)
// Each character is a 16x16 grid with indexed colors.
// 0 = transparent, 1 = skin, 2 = hair, 3 = shirt, 4 = pants(secondary), 5 = eyes, 6+ = accents

// ---------------------------------------------------------------------------
// Frank — The Forger
// Top hat, sideburns, mustache, bowtie. Hat uses pants color.
// ---------------------------------------------------------------------------
#let frank-data = (
(0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0),
(0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0),
(0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0),
(0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0),
(0, 0, 0, 2, 1, 5, 1, 1, 1, 5, 1, 2, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 1, 5, 5, 5, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 6, 6, 6, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 1, 3, 3, 3, 6, 3, 3, 3, 3, 3, 1, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0),
)
// palette: (none, skin, hair, shirt, hat=pants, eyes=pants, red-accent)
#let frank-colors(skin, hair, shirt, pants) = (none, skin, hair, shirt, pants, pants, rgb("#c0392b"))

// ---------------------------------------------------------------------------
// Grace — The Authority
// Elegant updo/bun hairstyle, gold necklace.
// ---------------------------------------------------------------------------
#let grace-data = (
(0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0),
(0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0),
(0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0),
(0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 5, 1, 1, 1, 5, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0),
)
// palette: (none, skin, hair, shirt, pants, eyes=pants, gold-necklace)
#let grace-colors(skin, hair, shirt, pants) = (none, skin, hair, shirt, pants, pants, rgb("#f1c40f"))

// ---------------------------------------------------------------------------
// Trent — The Trusted Third Party
// Balding head (skin visible on top), prominent beard, jacket over shirt.
// ---------------------------------------------------------------------------
#let trent-data = (
(0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0),
(0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0),
(0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0),
(0, 0, 0, 2, 1, 5, 1, 1, 1, 5, 1, 2, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 4, 3, 3, 3, 3, 3, 3, 3, 4, 0, 0, 0, 0),
(0, 0, 1, 4, 3, 3, 3, 3, 3, 3, 3, 4, 1, 0, 0, 0),
(0, 0, 0, 4, 3, 3, 3, 3, 3, 3, 3, 4, 0, 0, 0, 0),
(0, 0, 0, 4, 3, 3, 3, 3, 3, 3, 3, 4, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 3, 3, 3, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0),
)
// palette: (none, skin, hair/beard, shirt, jacket=pants, eyes=pants)
#let trent-colors(skin, hair, shirt, pants) = (none, skin, hair, shirt, pants, pants)

// ---------------------------------------------------------------------------
// Mallory — The Attacker
// Hood up (pointed top), face visible inside. Kangaroo pocket on hoodie.
// ---------------------------------------------------------------------------
#let mallory-data = (
(0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 2, 2, 2, 2, 2, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 3, 2, 1, 1, 1, 1, 1, 2, 3, 0, 0, 0, 0),
(0, 0, 0, 3, 1, 5, 1, 1, 1, 5, 1, 3, 0, 0, 0, 0),
(0, 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 1, 3, 3, 3, 6, 6, 3, 3, 3, 3, 1, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 6, 6, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0),
)
// palette: (none, skin, hair, hoodie=shirt, pants, eyes=pants, pocket-gray)
#let mallory-colors(skin, hair, shirt, pants) = (none, skin, hair, shirt, pants, pants, rgb("#555555"))

// ---------------------------------------------------------------------------
// Victor — The Verifier
// Peaked cap with badge, neat short hair, uniform.
// Cap uses pants color, uniform uses shirt color.
// ---------------------------------------------------------------------------
#let victor-data = (
(0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 6, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0),
(0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0),
(0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 5, 1, 1, 1, 5, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 1, 3, 3, 6, 3, 3, 3, 3, 3, 3, 1, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0),
(0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0),
)
// palette: (none, skin, hair, uniform=shirt, cap=pants, eyes=pants, gold-badge)
#let victor-colors(skin, hair, shirt, pants) = (none, skin, hair, shirt, pants, pants, rgb("#f1c40f"))
Loading
Loading