diff --git a/cast/CAST.md b/cast/CAST.md new file mode 100644 index 0000000..9274649 --- /dev/null +++ b/cast/CAST.md @@ -0,0 +1,32 @@ +# Cast + +Generated by `cast/rig/build.mjs` from `cast/rig/characters.mjs`; edit the trait sheet, not this file. +★ marks the characters rendered in every pose and expression. "Look source" is the reference the design +was drawn from (used as inspiration only; every sticker is original), or **invented** where no appearance exists. + +| Name | What they are | Look source | Palette | Trait sheet | +|---|---|---|---|---| +| Eureka ★ | Leader of the swarm; the Self that routes the faculty pipeline. Her mind lives in Huginn. | **invented** | `#ffe0c8` `#ffb347` `#59b7ff` `#ff8a2a` `#ffd84a` | base humanoid; hair bun; outfit coat; acc pencil, starClip; prop wand; emblem star | +| Huginn ★ | Memory organ: owns each instance's mind as typed state. Odin's raven of thought. | `F:/Projects/VoidBot/assets/repo-faces/huginn.png` | `#2b3247` `#59d8ff` | base raven; hair crest; outfit egg + cape; acc collarRing; prop tablet; emblem none | +| Libby ★ | Face of CultLib, the shared runtime library (CultCache, CultNet, CultMesh, CultMath). | `F:/Projects/CultLib/.voidbot/voice/libby.png` | `#ffe0c8` `#a98ad8` `#2e2440` `#c9a24a` `#8a6cd1` `#c9a6ff` | base humanoid; hair long; outfit robe; acc glasses, bow; prop book; emblem cube | +| Epiphany ★ | The archived organizational layer above frontier AI workers; Eureka absorbed what lived. JSON heresy hunter. | `F:/Projects/VoidBot/assets/repo-faces/epiphany.png`; `F:/Projects/Epiphany/docs/assets` | `#ffe0c8` `#8fd8b4` `#f4efe6` `#e8384f` `#3fbf8f` `#7cf0b8` | base humanoid; hair twintails; outfit coat; acc bow; prop magnifier; emblem bolt | +| Weksa ★ | Face of weksa, the procedural language engine for alien grammars; nerdy anthropologist. | `F:/Projects/VoidBot/assets/repo-faces/weksa.png` | `#a8693f` `#4a2e1c` `#f1e3c4` `#2f9c8f` `#8a5a2b` `#ffd84a` | base humanoid; hair curly; outfit tunic; acc glasses; prop cards; emblem glyph | +| Nibu | Face of AetheriaLore, the Aetheria setting and lore vault. | `F:/Projects/AetheriaLore/.voidbot/voice/nibu.png` | `#ffe0c8` `#b9a9f0` `#7fd6e8` `#3a2f58` `#7a7fd8` `#ff9ad5` | base humanoid; hair long; outfit dress; acc bow, headphones; prop quill; emblem star | +| Mimir | Realtime field machine: cameras, microphones and feeds into one field; keeper of the well. | `F:/Projects/VoidBot/assets/repo-faces/mimir.png` | `#c08a52` `#8a5a32` `#3a2a20` `#3fe0d0` | base humanoid; hair none; outfit robe; acc cubes; prop cube; emblem wave | +| Eve | CultMesh surface web and portable control layer; the Eve/CultUI interface DSL. | `F:/Projects/Eve/.voidbot/voice/eve.png` | `#0e1a2e` `#e9eef5` `#59b7ff` | base humanoid; hair helmet; outfit tunic; acc none; prop panel; emblem eye | +| Kiko | Face of StreamPixels, the stream overlay of persistent pixel characters. Fox-coded. | `F:/Projects/VoidBot/assets/repo-faces/kiko.png` | `#d9a074` `#f4f0f6` `#e8386f` `#2a2440` `#3fc8e8` `#ff6fae` | base humanoid; hair messy; outfit dress; acc foxEars, foxMask, tail; prop heart; emblem heart | +| Heimdall | Shared auth authority for GameCult-hosted experiments; keeper of the keys. | `F:/Projects/Heimdall/assets/heimdall-profile.png` | `#7a4a2c` `#22202a` `#1c1e2a` `#d9a43a` `#ffc34a` | base humanoid; hair messy; outfit coat; acc earring; prop keys; emblem key | +| Fensalir | Native C# runtime and field engine under the interactive work. Frigg's hall. The avatar is a crystal spire, not a person; the spire became her hat and the person around it is invented. | `F:/Projects/Fensalir/.voidbot/voice/fensalir.png` | `#ffe0c8` `#2a2a4a` `#ff5ab0` `#4fe8f0` | base humanoid; hair bob; outfit dress; acc spire; prop orb; emblem wave | +| Druzkai | Face of Zyphos, a biopolitical ecology setting with a biological memetic engine. | `F:/Projects/Zyphos/.voidbot/voice/druzkai.png` | `#c4553e` `#9a3a2a` `#4a2a5a` `#d9a43a` `#3fd0c8` | base humanoid; hair none; outfit robe; acc ridges, forehead; prop seed; emblem spiral | +| Norn | Graph viewer for typed graph state: the thread-readers who see how things are woven. | `F:/Projects/Norn/.voidbot/voice/norn.png` | `#a8693f` `#d8dce4` `#24283a` `#c9a24a` `#4fe0e8` | base humanoid; hair braids; outfit robe; acc circlet; prop spool; emblem rune | +| Sai | Ink stories that wake up inside static sites. Nonbinary, androgynous, monochrome manga ink. | `F:/Projects/Sai/.voidbot/voice/sai.png`; `F:/Projects/VoidBot/docs/persona-intake/sai.persona-intake.yaml` | `#f4f1ec` `#1e1e22` `#3a3a40` `#e8e6e0` `#3a3a3a` `#ffffff` | base humanoid; hair messy; outfit coat; acc spiralBand; prop brush; emblem spiral | +| Brokkr | Creative-tool broker daemon: Unity and Blender authoring surfaces over CultMesh. The Eddic smith. | **invented (README role; Brokkr of Skaldskaparmal)** | `#f6c9a4` `#c4562a` `#5a4636` `#2a2420` `#5a8ad8` `#ff8a2a` | base humanoid; hair short; outfit tunic; acc beard, goggles; prop hammer; emblem gear | +| Aetheria | Face of Aetheria, the open-source tactical action RPG with a sprawling sci-fi setting. | **invented (README role)** | `#f6c9a4` `#3a2a4a` `#e8ecf2` `#ff8a2a` `#59b7ff` | base humanoid; hair bob; outfit tunic; acc headphones, goggles; prop ship; emblem star | +| Ymir | World-body physics substrate around Box3D: body, field, contact, impulse. The frost giant. | `F:/Projects/VoidBot/assets/repo-faces/ymir.png` | `#b8d4ec` `#e8f4ff` `#3a5a8a` `#bff0ff` `#3a8ad8` | base humanoid; hair short; outfit robe; acc beard, crystals; prop crystal; emblem flake | +| Tengu | Native Persona, the first migrated to canonical persona state. Mountain yokai. | `F:/Projects/VoidBot/assets/native-personas/tengu.png` | `#c8443a` `#f2efe8` `#efe8da` `#4a3a7a` `#ffd84a` | base humanoid; hair wild; outfit robe; acc goatee, longNose, tokin; prop fan; emblem feather | +| Muninn | Local capture broker for the swarm: which streams a host can offer. Odin's raven of memory. | `F:/Projects/VoidBot/assets/repo-faces/muninn-concept.png` | `#2a2230` `#ffb030` | base raven; hair crest; outfit egg; acc collarRing; prop camera; emblem none | +| Sleipnir | Input mirroring and virtual HID: speaks through the hands of the machine. Odin's eight-legged horse. | `F:/Projects/Odin/assets/personas/sleipnir-avatar.png` | `#5a6478` `#2fc8e0` `#2a3040` `#3fe0f0` | base horse; hair mane; outfit tunic; acc horseTail; prop pad; emblem bolt | +| Hermodr | Eve browser lowering: resolves providers through Odin's catalog and renders them. The messenger. | `F:/Projects/Hermodr/assets/hermodr-avatar.png` | `#f6c9a4` `#2a3a4a` `#2a3a44` `#c9902a` `#e8a83a` `#3fd0c0` | base humanoid; hair messy; outfit tunic; acc wingCap, scarf; prop envelope; emblem none | +| Metame | Native Persona (メタめ) projected from the operator's public history; discussion and rumination. | **invented (persona-intake has no appearance; the design avoids depicting the operator)** | `#ffe0c8` `#59b7ff` `#1d2a3a` `#ff8a2a` | base humanoid; hair bob; outfit tunic; acc twoTone; prop mirror; emblem glyph | +| Void | VoidBot's built-in Discord moderator mind. Its state was lost; the look is new. | **invented (VoidBot README role)** | `#161226` `#4a3a7a` `#c9a6ff` | base humanoid; hair none; outfit robe; acc hood, hoodRim; prop shield; emblem moon | +| Gjallar | Renderer-neutral compositor for Odin-visible Eve surfaces; Odin's branding Persona. The horn. | `F:/Projects/Odin/assets/personas/gjallar-avatar-pixel-256.png` | `#ffe0c8` `#2a2440` `#1e2238` `#d9a43a` `#59b7ff` `#ffd84a` | base humanoid; hair short; outfit tunic; acc helm; prop horn; emblem rainbow | diff --git a/cast/PROCESS.md b/cast/PROCESS.md new file mode 100644 index 0000000..8269640 --- /dev/null +++ b/cast/PROCESS.md @@ -0,0 +1,188 @@ +# How the sticker pack works + +A guide for whoever fixes or extends this pack next. `README.md` has the short version and the +step lists for adding a character, pose or expression; this file explains the machine underneath, +the conventions that keep the style intact, how to check a render, and where the pack is weak. + +## What it is + +24 characters, 6 poses, 8 expressions, 297 SVG stickers (about 1.6 MB). Eureka and four others +have every pose and expression (48 stickers each); the rest have the neutral pose with smile, +grin and surprised. Nothing is drawn per sticker: `rig/build.mjs` asks `rig/rig.mjs` to compose +each one from a trait sheet in `rig/characters.mjs`. + +The four besides Eureka with full coverage, and why: + +- **Huginn**: Eureka's mind lives in Huginn, and as a raven it exercises the creature base in + every pose, which a humanoid-only set would never test. +- **Libby**: CultLib is the foundation the swarm runs on, and her long hair is the hardest case + for arm placement. +- **Epiphany**: Eureka's predecessor, whose living parts Eureka absorbed; twintails are the + other hard hair case. +- **Weksa**: the next Face slated for its own mind (`eureka-body:follow_up:weksa-mind`), and the + only full-coverage character with curly hair and dark skin, which checks blush and line contrast. + +## The style rules + +These come from the STICKERS block of the swarm-council page the operator liked. Breaking any +of them makes a sticker look like it came from a different pack. + +- **One outline.** Every edge is `#3b2618` (warm dark brown, never black), stroke width 3, + round joins and caps. `inked()` in `rig.mjs` wraps fragments in that stroke. Small details + (emblem glyphs, hair shine, brows) go thinner, 1.5-2.6, never thicker than 3.4. +- **Flat fills.** No gradients, no SVG filters, no opacity except blush and a few highlights. + Shading is a second flat colour (`shade(hex, f)`), used sparingly: raven bellies, inner ears. +- **Limbs are double strokes**, not filled shapes: `limb()` draws the path in ink at width + `w + 6`, then in colour at width `w`, both round-capped. That is what keeps arms legible when + they cross the body. Arms are 7 wide, legs 8, raven wings 11. +- **Eyes**: an iris ellipse (6.3 x 7.6) in the character's eye colour with a 2.5 ink edge, a + dark pupil `#2a1a12`, a 3.2 ink upper lid arc, a white shine dot r 2.3 up and right plus a + tiny r 1 dot down and left. The shine dot is what makes them read as cute at 128 px; keep it on + every open eye. +- **Blush**: two `#ff9a8a` ellipses under the eyes. Opacity carries the mood: 0.45 worried, + 0.7 default, 0.9 happy. +- **Proportions**: head about half the figure. The head ellipse is 80 x 72; the whole figure + stands about 136 tall. +- **Die-cut border** is CSS on the `` (four white offset drop-shadows and a soft shadow), + never baked into the SVG, so the files stay usable on any background. + +## Coordinate conventions + +All in `rig.mjs`. The viewBox is `-80 -10 160 172`, so x is centred on 0. + +| Point | Value | Used by | +|---|---|---| +| Head centre | `(0, 52)`, ellipse rx 40 ry 36 | head base, hair, accessories, face | +| Neck (head rotation pivot) | `(0, 88)` | pose head tilt | +| Shoulders | `(±15, 95)` | arm start | +| Hips | `(±8, 126)` | leg start | +| Feet | `y = 149` plus the pose's foot offset | shoes | +| Ground | about `y = 152` | | +| Chest emblem | disc r 6.8 at `(0, 106)`, ravens `(0, 104)` | `emblem()` | + +Face anchors come from `BASES` so each expression works on every base: + +| Base | eyeX | eyeY | mouthY | browY | cheekX | cheekY | +|---|---|---|---|---|---|---| +| humanoid | 15 | 61 | 76 | 47 | 26 | 71 | +| raven | 15 | 55 | 70 | 41 | 27 | 66 | +| horse | 17 | 50 | 82 | 37 | 29 | 62 | + +**Props** are drawn around a grip point at `(0, 0)` and extend upward to about `y = -32`. The +pose places that grip at a hand plus an offset and rotation (`POSES.*.prop`); the hand circle is +drawn after the prop so it reads as holding it. Presenting puts the grip 17 above the open palm. + +**Poses**, as hand points (L is the viewer's left): + +| Pose | Hands | Other | +|---|---|---| +| neutral | `(-24,120)`, `(24,120)` | prop in right hand | +| cheer | `(-46,36)`, `(46,36)` | hops 6, feet apart, sparkles | +| thinking | left across the belly `(4,113)`, right at the chin `(13,92)` drawn over the head | head tilt 7, thought dots, no prop | +| surprised | `(-51,88)`, `(51,88)` | hops 7, one foot kicked, shock lines, no prop | +| presenting | right palm out at `(45,103)` | prop sits on the palm, sparkles | +| waving | right raised to `(50,50)` | prop moves to the left hand, motion arcs | + +**Layer order** in `render()`, back to front: hair back and back accessories (rotating with the +head), cape, tails, legs, torso and body accessories, emblem, arms, prop, hands, then the head +group (skin, `mid` accessories such as beards, the face, hair front and front accessories, brows +and expression extras), then any arm marked `front`, then the pose effect. Accessories return +`back`, `mid`, `front` or `body` fragments and are slotted in by that key. + +## Checking renders + +Look at every change at sticker size. Two tools, both from the repo root in Git Bash: + +```sh +# Whole gallery, or one character / pose, as Edge renders it (with the die-cut border): +cast/rig/shot.sh /tmp/all.png # everything, 1400 x 1800 +cast/rig/shot.sh /tmp/kiko.png kiko # one character +cast/rig/shot.sh /tmp/cheer.png "" cheer 1400 1200 # one pose for everyone + +# A 128 px contact sheet of one sticker per character, on a light ground: +cd cast/stickers && mkdir -p /tmp/r && for d in */; do d=${d%/}; \ + magick -background none -density 72 $d/neutral-smile.svg -resize x128 /tmp/r/$d.png; done && \ + magick montage /tmp/r/*.png -tile 8x -geometry +8+8 -background '#f2efe8' /tmp/sheet128.png +``` + +`shot.sh` launches Edge headless with a throwaway profile and waits for the PNG, because Edge can +return before the file is written. The gallery accepts `?c=&p=`, which is how the +script filters. ImageMagick's own SVG renderer is close to Edge's but not identical (fonts in the +sleepy "z" differ); trust Edge for final checks. + +What to look for: hands that vanish into hair, props that lose their outline against the outfit, +dark characters that sink into the `#07111a` gallery ground, and anything that reads as an ear +or horn when it is not one. + +## How the cast was designed + +Looks come from the avatars in `F:/Projects/VoidBot/assets/repo-faces/`, each repo's +`.voidbot/voice/*.png`, `F:/Projects/Odin/assets/personas/`, `F:/Projects/Heimdall/assets/`, +`F:/Projects/Hermodr/assets/`, and Sai's self-description in the persona intake. Each avatar was +reduced to three or four traits that survive at 128 px: a hair shape and colour, one headpiece, +one prop, a palette. `CAST.md` lists the source and traits per character. + +- **Huginn and Muninn** share the raven base and are told apart by eye colour (cyan vs amber, + both from their avatars), Huginn's blue cloak and tablet, and Muninn's brass collar and camera. +- **Mimir**'s avatar is a stone face crowned with floating cubes; the chibi keeps the bronze skin, + teal eyes and the cube crown, and holds a cube. +- **Eve**'s avatar is two glowing eyes in a black visor; the chibi is a white helmet with a dark + face window, and her eyes and mouth are drawn in glowing blue (`faceInk`). +- **Ymir** keeps the ice-blue skin, crystal crown and white beard of the frost-giant avatar. +- **Fensalir**'s avatar is a crystal spire, not a person, so the spire became a hat and the + person is invented in its pink and cyan. +- **Sleipnir** has eight limbs as in the myth: two hoof-arms, two legs and four extra legs behind. +- **Tengu** keeps the red face, long nose, white mane and tokin cap; the feather fan is from the + yokai myth. +- **Invented**: Eureka (bun with a pencil, a star clip and a star wand, in the brand orange and + blue), Brokkr (the Eddic smith: ginger beard, goggles, hammer), Aetheria (a pilot in white with + a small starship), Void (a hooded purple figure with a moon shield, since its state was lost), + and Metame (blue and orange split hair and a mirror; the design deliberately does not depict the + operator, whose public history Metame is projected from). + +## Iterations + +Each pair is before on the left, after on the right, cropped from gallery screenshots. + +![Cheer arms](process/01-cheer-arms.png) +Raised hands sat inside the head outline and disappeared behind the hair. Cheer hands moved out +and up to `(±46, 36)`, clear of the head and side locks; surprised and waving moved the same way. + +![Eureka's feather](process/02-eureka-feather.png) +A raven feather in Eureka's hair (a nod to Huginn) read as a rabbit ear at sticker size. It was +removed; the pencil and star clip carry the idea of her. + +![Void contrast](process/03-void-contrast.png) +Void in near-black purple vanished into the dark gallery ground and had black hands. The robe and +hood went to mid purple with a lighter hood rim, and the hands to lavender (`hands` trait). + +![Sleipnir's legs](process/04-sleipnir-legs.png) +The extra legs were hidden under the tunic hem. They now start wider and splay outward, two +pairs behind the main legs, so the eight limbs read. + +![Gjallar's horn](process/05-gjallar-horn.png) +The first horn was a bent cone that read as a rolled scroll. It gained a dark bell opening. + +![Huginn's wings](process/06-huginn-wings.png) +Huginn's wings, body and cloak were three near-identical dark blues and merged. The wing and belly +were lightened and the cloak turned a clearer blue. + +Smaller fixes without images: long hair narrowed so it frames the body instead of swallowing it, +Tengu's full beard cut to a goatee and his nose shortened so the mouth shows, Tengu's white fan +turned dark so it reads against his white robe. + +## Known weak spots, and what to do next + +- **Small props at the side**: in the neutral pose a thin prop such as Sai's brush or Muninn's + camera is only a few pixels wide at 128 px. A per-pose prop scale (1.2 for neutral) would help. +- **Raven thinking** puts the wing across the belly rather than at the chin; it reads as a folded + wing more than as thinking. A raven-specific variant with a stronger head tilt would sell it. +- **Mimir's cube crown** is busy at 128 px; fewer, larger cubes would be cleaner. +- **Kiko's fox mask** hides one fox ear. Moving the mask to the back of the head would keep both. +- **One body silhouette** for all humanoids: Brokkr is no stouter than Libby. A `build` trait + (torso width and leg length) would give the dwarf, the giant and the children different shapes. +- **No back or side views**, which visual-novel scenes will want; the rig is front-facing only. +- **Expressions are face-only**: there is no sweat-drop-and-slump body language. Pairing an + expression with a small pose adjustment (shoulders up for surprised, head down for sleepy) + would add a lot of life cheaply. +- Rendering more characters in full coverage is one flag (`full: true`) and about 48 files each. diff --git a/cast/README.md b/cast/README.md new file mode 100644 index 0000000..8c0ca64 --- /dev/null +++ b/cast/README.md @@ -0,0 +1,76 @@ +# Swarm stickers + +Chibi stickers of the GameCult swarm cast, built by a small rig instead of drawn one by one. +Every sticker is a standalone SVG under `stickers//-.svg`; +`gallery.html` shows them all with character and pose filters; `CAST.md` lists who is who. + +Open `gallery.html` in a browser to browse. To use a sticker, copy its SVG. The white die-cut +edge is not in the file; it is CSS, so it can be dropped where it does not suit: + +```css +img.sticker { filter: drop-shadow(3px 0 0 #fff) drop-shadow(-3px 0 0 #fff) + drop-shadow(0 3px 0 #fff) drop-shadow(0 -3px 0 #fff) drop-shadow(0 8px 10px rgba(0,0,0,.45)); } +``` + +## Layout + +| Path | What it is | +|---|---| +| `rig/rig.mjs` | The rig: bases, poses, expressions, hair, accessories, props, emblems, `render()` | +| `rig/characters.mjs` | One trait sheet per character, and which characters get every pose | +| `rig/build.mjs` | Writes the SVGs, `gallery.html` and `CAST.md` | +| `rig/shot.sh` | Screenshots the gallery with Edge headless, for checking renders | +| `stickers/`, `gallery.html`, `CAST.md` | Generated; never edit by hand | +| `PROCESS.md` | How the rig works, its coordinate conventions, how to check renders, known weak spots | +| `process/` | Before/after renders referenced from `PROCESS.md` | + +## Regenerate + +Node 18 or newer, no packages: + +```sh +node cast/rig/build.mjs # everyone +node cast/rig/build.mjs kiko eve # only these characters (the gallery is rebuilt from disk) +``` + +## Add a character + +1. Append a trait sheet to `CAST` in `rig/characters.mjs`. Copy the nearest existing one. + - `id` (folder name, lowercase), `name`, `role` (one line from the repo README), `source` + (path of the avatar or self-description the look comes from, or a string starting with + `invented`), optional `note` for a design decision worth keeping. + - `base`: `humanoid`, `raven` or `horse`. Raven needs `beak`; horse needs `muzzle`. + - `skin`, `eyes` (iris colour), `accent` (pose sparkles), optional `hands`, `faceInk` + (eye and mouth lines on a dark face), `noBlush`. + - `hair: { style, color, accent? }` — a key of `HAIR` in `rig.mjs`. + - `outfit: { shape, main, trim, collar, belt? }` — shapes `tunic`, `dress`, `robe`, `coat` + (ravens always use `egg`, with `belly` and `wing`); collars `v`, `round`, `high`, `none`. + - `legs`, `shoes`, optional `cape`, `sleeve`, `extraLegs` (0-4). + - `acc`: list of `[name, ...colours]`, keys of `ACC`. `prop`: `[name, ...colours]`, a key of + `PROPS`, or `null`. `emblem`: `{ shape, color, disc? }`, a key of `EMBLEMS`, or `null`. + - `full: true` renders every pose and expression; otherwise neutral pose with the three + expressions in `COMMON_EXPRESSIONS`. +2. Run the build, then check the render at sticker size (see "Checking renders" in `PROCESS.md`). +3. Commit the trait sheet together with the generated files. + +## Add a pose + +Add an entry to `POSES` in `rig/rig.mjs`: hop height, head offset and tilt, elbow and hand points +for each arm (`front: true` draws that arm over the head), feet offsets, where the prop sits +(or `null`), and an optional effect from `fx()`. Coordinates are in `PROCESS.md`. Every `full` +character picks it up on the next build. Check hands against long hair and twintails: a hand +inside the head outline disappears behind the hair. + +## Add an expression + +Add a `case` to `face()` in `rig/rig.mjs` and the name to `EXPRESSIONS`. Draw relative to the +base's anchors (`BASES[...].eyeX/eyeY/mouthY/browY/cheekX/cheekY`), never fixed numbers, so the +raven and horse faces follow. If ravens should open their beak for it, add it to `beak()`. + +## Licence + +All art here is the project's own: drawn as hand-written SVG shapes by this rig, not traced or +derived from any third-party asset. The avatars named in `CAST.md` are GameCult's own images and +served only as reference for colours and traits. The repository has no licence file at the time of +writing, so the stickers carry no licence grant beyond GameCult's own; add one here if they are +meant to be reused outside GameCult. diff --git a/cast/process/01-cheer-arms.png b/cast/process/01-cheer-arms.png new file mode 100644 index 0000000..a2ea21c Binary files /dev/null and b/cast/process/01-cheer-arms.png differ diff --git a/cast/process/02-eureka-feather.png b/cast/process/02-eureka-feather.png new file mode 100644 index 0000000..f185c01 Binary files /dev/null and b/cast/process/02-eureka-feather.png differ diff --git a/cast/process/03-void-contrast.png b/cast/process/03-void-contrast.png new file mode 100644 index 0000000..96edade Binary files /dev/null and b/cast/process/03-void-contrast.png differ diff --git a/cast/process/04-sleipnir-legs.png b/cast/process/04-sleipnir-legs.png new file mode 100644 index 0000000..404c54b Binary files /dev/null and b/cast/process/04-sleipnir-legs.png differ diff --git a/cast/process/05-gjallar-horn.png b/cast/process/05-gjallar-horn.png new file mode 100644 index 0000000..bfb29c5 Binary files /dev/null and b/cast/process/05-gjallar-horn.png differ diff --git a/cast/process/06-huginn-wings.png b/cast/process/06-huginn-wings.png new file mode 100644 index 0000000..b1b6dd9 Binary files /dev/null and b/cast/process/06-huginn-wings.png differ diff --git a/cast/rig/build.mjs b/cast/rig/build.mjs index 6238dee..a23e3cf 100644 --- a/cast/rig/build.mjs +++ b/cast/rig/build.mjs @@ -1,4 +1,4 @@ -// Regenerates cast/stickers//-.svg and cast/gallery.html. +// Regenerates cast/stickers//-.svg, cast/gallery.html and cast/CAST.md. // Usage: node cast/rig/build.mjs (all characters) // node cast/rig/build.mjs kiko eve (only these; gallery is always rebuilt from disk) import { mkdirSync, writeFileSync, readdirSync, rmSync, existsSync } from 'node:fs'; @@ -93,4 +93,19 @@ apply(); `; writeFileSync(join(CAST_DIR, 'gallery.html'), html); +// CAST.md is generated from the trait sheets so the two cannot drift apart. +const md = ['# Cast', '', + 'Generated by `cast/rig/build.mjs` from `cast/rig/characters.mjs`; edit the trait sheet, not this file.', + '★ marks the characters rendered in every pose and expression. "Look source" is the reference the design', + 'was drawn from (used as inspiration only; every sticker is original), or **invented** where no appearance exists.', '', + '| Name | What they are | Look source | Palette | Trait sheet |', '|---|---|---|---|---|']; +for (const c of CAST) { + const pal = [...new Set([c.skin, c.hair.color, c.outfit.main, c.outfit.trim, c.eyes, c.accent].filter(Boolean))].map((h) => '`' + h + '`').join(' '); + const acc = (c.acc || []).map((a) => a[0]).join(', ') || 'none'; + const traits = `base ${c.base}; hair ${c.hair.style}; outfit ${c.outfit.shape}${c.cape ? ' + cape' : ''}; acc ${acc}; prop ${c.prop ? c.prop[0] : 'none'}; emblem ${c.emblem ? c.emblem.shape : 'none'}`; + const src = c.source.startsWith('invented') ? '**' + c.source + '**' : c.source.split('; ').map((x) => '`' + x + '`').join('; '); + const what = c.role + (c.note ? ' ' + c.note : ''); + md.push(`| ${c.name}${c.full ? ' ★' : ''} | ${what.replace(/\|/g, '/')} | ${src} | ${pal} | ${traits} |`); +} +writeFileSync(join(CAST_DIR, 'CAST.md'), md.join('\n') + '\n'); console.log(`wrote ${count} stickers (${(bytes / 1024).toFixed(1)} KiB), gallery lists ${cards.length}`); diff --git a/cast/rig/characters.mjs b/cast/rig/characters.mjs index 20b2ac0..9b12e17 100644 --- a/cast/rig/characters.mjs +++ b/cast/rig/characters.mjs @@ -23,8 +23,8 @@ export const CAST = [ source: 'F:/Projects/VoidBot/assets/repo-faces/huginn.png', skin: '#2b3247', eyes: '#59d8ff', beak: '#4a5068', accent: '#59d8ff', hair: { style: 'crest', color: '#2b3247' }, - outfit: { shape: 'egg', main: '#2b3247', belly: '#3d4763', wing: '#1f2536' }, - shoes: '#5a5f73', cape: '#162033', + outfit: { shape: 'egg', main: '#2b3247', belly: '#46527a', wing: '#3a4766' }, + shoes: '#5a5f73', cape: '#24406e', acc: [['collarRing', '#c9a24a', '#59d8ff']], prop: ['tablet', '#1f2a3d', '#59d8ff'], emblem: null, }, @@ -119,7 +119,7 @@ export const CAST = [ { id: 'fensalir', name: 'Fensalir', base: 'humanoid', role: 'Native C# runtime and field engine under the interactive work. Frigg\'s hall.', - source: 'F:/Projects/Fensalir/.voidbot/voice/fensalir.png (crystal spire; the person is invented around it)', + source: 'F:/Projects/Fensalir/.voidbot/voice/fensalir.png', note: 'The avatar is a crystal spire, not a person; the spire became her hat and the person around it is invented.', skin: SKIN.fair, eyes: '#ff5ab0', accent: '#4fe8f0', hair: { style: 'bob', color: '#2a2a4a' }, outfit: { shape: 'dress', main: '#2a2a4a', trim: '#ff5ab0', collar: 'v' }, @@ -152,7 +152,7 @@ export const CAST = [ { id: 'sai', name: 'Sai', base: 'humanoid', role: 'Ink stories that wake up inside static sites. Nonbinary, androgynous, monochrome manga ink.', - source: 'F:/Projects/Sai/.voidbot/voice (avatar sai.png per identity.json); F:/Projects/VoidBot/docs/persona-intake/sai.persona-intake.yaml', + source: 'F:/Projects/Sai/.voidbot/voice/sai.png; F:/Projects/VoidBot/docs/persona-intake/sai.persona-intake.yaml', skin: '#f4f1ec', eyes: '#3a3a3a', accent: '#ffffff', hair: { style: 'messy', color: '#1e1e22' }, outfit: { shape: 'coat', main: '#3a3a40', trim: '#e8e6e0', collar: 'high' }, @@ -196,13 +196,13 @@ export const CAST = [ { id: 'tengu', name: 'Tengu', base: 'humanoid', role: 'Native Persona, the first migrated to canonical persona state. Mountain yokai.', - source: 'F:/Projects/VoidBot/assets/native-personas/tengu.png', + source: 'F:/Projects/VoidBot/assets/native-personas/tengu.png', note: 'Red face, long nose, white mane and tokin cap from the avatar; the feather fan is from the yokai myth.', skin: '#c8443a', eyes: '#ffd84a', accent: '#ffd84a', hair: { style: 'wild', color: '#f2efe8' }, outfit: { shape: 'robe', main: '#efe8da', trim: '#4a3a7a', collar: 'v' }, legs: '#4a3a7a', shoes: '#3a2a20', acc: [['goatee', '#f2efe8'], ['longNose', '#b53a30'], ['tokin', '#1e1e22']], - prop: ['fan', '#f4f0e8'], emblem: { shape: 'feather', color: '#4a3a7a' }, + prop: ['fan', '#4a4a58'], emblem: { shape: 'feather', color: '#4a3a7a' }, }, { id: 'muninn', name: 'Muninn', base: 'raven', @@ -218,11 +218,11 @@ export const CAST = [ { id: 'sleipnir', name: 'Sleipnir', base: 'horse', role: 'Input mirroring and virtual HID: speaks through the hands of the machine. Odin\'s eight-legged horse.', - source: 'F:/Projects/Odin/assets/personas/sleipnir-avatar.png', + source: 'F:/Projects/Odin/assets/personas/sleipnir-avatar.png', note: 'Eight limbs as in the myth: two hoof-arms, two legs and four extra legs behind.', skin: '#5a6478', muzzle: '#8a94a8', eyes: '#3fe0f0', accent: '#3fe0f0', hair: { style: 'mane', color: '#2fc8e0' }, outfit: { shape: 'tunic', main: '#2a3040', trim: '#3fe0f0', collar: 'round' }, - legs: '#5a6478', shoes: '#22262e', sleeve: '#5a6478', extraLegs: 2, + legs: '#5a6478', shoes: '#22262e', sleeve: '#5a6478', extraLegs: 4, acc: [['horseTail', '#2fc8e0']], prop: ['pad', '#2a3040', '#3fe0f0'], emblem: { shape: 'bolt', color: '#3fe0f0', disc: '#22262e' }, }, diff --git a/cast/rig/rig.mjs b/cast/rig/rig.mjs index 381f715..c410eab 100644 --- a/cast/rig/rig.mjs +++ b/cast/rig/rig.mjs @@ -129,10 +129,11 @@ function legs(ch, pose) { let s = ''; const extra = ch.extraLegs ? ch.extraLegs : 0; // Sleipnir-style extra legs: drawn behind, darker, peeking out between and beside. + const EXTRA = [[-19, -27], [19, 27], [-25, -38], [25, 38]]; // [hipX, footX], drawn behind for (let i = 0; i < extra; i++) { - const x = [-17, 17, -3, 3][i] ?? 0; - const foot = [x * 1.25, 150]; - s += limb(`M${x} 124 L${P(foot)}`, shade(ch.legs, -0.25), 7); + const [hx, fx] = EXTRA[i]; + const foot = [fx, 149 - (i > 1 ? 3 : 0)]; + s += limb(`M${hx} 120 L${P(foot)}`, shade(ch.legs, -0.25), 7); s += inked(``); } for (const side of ['L', 'R']) { @@ -423,7 +424,7 @@ export const ACC = { crystals: (c) => ({ front: `` }), beard: (c) => ({ mid: `` }), goatee: (c) => ({ mid: `` }), - longNose: (c) => ({ front: `` }), + longNose: (c) => ({ front: `` }), tokin: (c) => ({ front: `` }), ridges: (c) => ({ mid: `` }), forehead: (c) => ({ front: `` }), @@ -463,7 +464,7 @@ export const PROPS = { cards: (c) => ``, keys: (c) => ``, hammer: (c, h) => ``, - horn: (c, band) => ``, + horn: (c, band) => ``, fan: (c) => ``, brush: (c) => ``, quill: (c) => ``, diff --git a/cast/stickers/gjallar/neutral-grin.svg b/cast/stickers/gjallar/neutral-grin.svg index 447e9b0..6a9a046 100644 --- a/cast/stickers/gjallar/neutral-grin.svg +++ b/cast/stickers/gjallar/neutral-grin.svg @@ -1 +1 @@ -Gjallar — neutral, grin +Gjallar — neutral, grin diff --git a/cast/stickers/gjallar/neutral-smile.svg b/cast/stickers/gjallar/neutral-smile.svg index eae97c6..45f2300 100644 --- a/cast/stickers/gjallar/neutral-smile.svg +++ b/cast/stickers/gjallar/neutral-smile.svg @@ -1 +1 @@ -Gjallar — neutral, smile +Gjallar — neutral, smile diff --git a/cast/stickers/gjallar/neutral-surprised.svg b/cast/stickers/gjallar/neutral-surprised.svg index 639cca3..78269bf 100644 --- a/cast/stickers/gjallar/neutral-surprised.svg +++ b/cast/stickers/gjallar/neutral-surprised.svg @@ -1 +1 @@ -Gjallar — neutral, surprised +Gjallar — neutral, surprised diff --git a/cast/stickers/huginn/cheer-determined.svg b/cast/stickers/huginn/cheer-determined.svg index 918fa15..d5e5549 100644 --- a/cast/stickers/huginn/cheer-determined.svg +++ b/cast/stickers/huginn/cheer-determined.svg @@ -1 +1 @@ -Huginn — cheer, determined +Huginn — cheer, determined diff --git a/cast/stickers/huginn/cheer-grin.svg b/cast/stickers/huginn/cheer-grin.svg index 8f94b79..f2f28cb 100644 --- a/cast/stickers/huginn/cheer-grin.svg +++ b/cast/stickers/huginn/cheer-grin.svg @@ -1 +1 @@ -Huginn — cheer, grin +Huginn — cheer, grin diff --git a/cast/stickers/huginn/cheer-happy.svg b/cast/stickers/huginn/cheer-happy.svg index 25c9801..b332858 100644 --- a/cast/stickers/huginn/cheer-happy.svg +++ b/cast/stickers/huginn/cheer-happy.svg @@ -1 +1 @@ -Huginn — cheer, happy +Huginn — cheer, happy diff --git a/cast/stickers/huginn/cheer-neutral.svg b/cast/stickers/huginn/cheer-neutral.svg index 554a17f..0851562 100644 --- a/cast/stickers/huginn/cheer-neutral.svg +++ b/cast/stickers/huginn/cheer-neutral.svg @@ -1 +1 @@ -Huginn — cheer, neutral +Huginn — cheer, neutral diff --git a/cast/stickers/huginn/cheer-sleepy.svg b/cast/stickers/huginn/cheer-sleepy.svg index 9469c48..a95916d 100644 --- a/cast/stickers/huginn/cheer-sleepy.svg +++ b/cast/stickers/huginn/cheer-sleepy.svg @@ -1 +1 @@ -Huginn — cheer, sleepyzz +Huginn — cheer, sleepyzz diff --git a/cast/stickers/huginn/cheer-smile.svg b/cast/stickers/huginn/cheer-smile.svg index 656024f..42d6608 100644 --- a/cast/stickers/huginn/cheer-smile.svg +++ b/cast/stickers/huginn/cheer-smile.svg @@ -1 +1 @@ -Huginn — cheer, smile +Huginn — cheer, smile diff --git a/cast/stickers/huginn/cheer-surprised.svg b/cast/stickers/huginn/cheer-surprised.svg index 07edde8..0ee99c4 100644 --- a/cast/stickers/huginn/cheer-surprised.svg +++ b/cast/stickers/huginn/cheer-surprised.svg @@ -1 +1 @@ -Huginn — cheer, surprised +Huginn — cheer, surprised diff --git a/cast/stickers/huginn/cheer-worried.svg b/cast/stickers/huginn/cheer-worried.svg index 7e16f7c..7135032 100644 --- a/cast/stickers/huginn/cheer-worried.svg +++ b/cast/stickers/huginn/cheer-worried.svg @@ -1 +1 @@ -Huginn — cheer, worried +Huginn — cheer, worried diff --git a/cast/stickers/huginn/neutral-determined.svg b/cast/stickers/huginn/neutral-determined.svg index 9feeaed..67b0566 100644 --- a/cast/stickers/huginn/neutral-determined.svg +++ b/cast/stickers/huginn/neutral-determined.svg @@ -1 +1 @@ -Huginn — neutral, determined +Huginn — neutral, determined diff --git a/cast/stickers/huginn/neutral-grin.svg b/cast/stickers/huginn/neutral-grin.svg index d09f1cb..09fcff8 100644 --- a/cast/stickers/huginn/neutral-grin.svg +++ b/cast/stickers/huginn/neutral-grin.svg @@ -1 +1 @@ -Huginn — neutral, grin +Huginn — neutral, grin diff --git a/cast/stickers/huginn/neutral-happy.svg b/cast/stickers/huginn/neutral-happy.svg index 716c20f..d1125a6 100644 --- a/cast/stickers/huginn/neutral-happy.svg +++ b/cast/stickers/huginn/neutral-happy.svg @@ -1 +1 @@ -Huginn — neutral, happy +Huginn — neutral, happy diff --git a/cast/stickers/huginn/neutral-neutral.svg b/cast/stickers/huginn/neutral-neutral.svg index 9db2c61..3d36efe 100644 --- a/cast/stickers/huginn/neutral-neutral.svg +++ b/cast/stickers/huginn/neutral-neutral.svg @@ -1 +1 @@ -Huginn — neutral, neutral +Huginn — neutral, neutral diff --git a/cast/stickers/huginn/neutral-sleepy.svg b/cast/stickers/huginn/neutral-sleepy.svg index 22946f4..bad350b 100644 --- a/cast/stickers/huginn/neutral-sleepy.svg +++ b/cast/stickers/huginn/neutral-sleepy.svg @@ -1 +1 @@ -Huginn — neutral, sleepyzz +Huginn — neutral, sleepyzz diff --git a/cast/stickers/huginn/neutral-smile.svg b/cast/stickers/huginn/neutral-smile.svg index ac88bde..f8fb13c 100644 --- a/cast/stickers/huginn/neutral-smile.svg +++ b/cast/stickers/huginn/neutral-smile.svg @@ -1 +1 @@ -Huginn — neutral, smile +Huginn — neutral, smile diff --git a/cast/stickers/huginn/neutral-surprised.svg b/cast/stickers/huginn/neutral-surprised.svg index 6f9b766..0801b25 100644 --- a/cast/stickers/huginn/neutral-surprised.svg +++ b/cast/stickers/huginn/neutral-surprised.svg @@ -1 +1 @@ -Huginn — neutral, surprised +Huginn — neutral, surprised diff --git a/cast/stickers/huginn/neutral-worried.svg b/cast/stickers/huginn/neutral-worried.svg index 08cf5fa..648cf35 100644 --- a/cast/stickers/huginn/neutral-worried.svg +++ b/cast/stickers/huginn/neutral-worried.svg @@ -1 +1 @@ -Huginn — neutral, worried +Huginn — neutral, worried diff --git a/cast/stickers/huginn/presenting-determined.svg b/cast/stickers/huginn/presenting-determined.svg index 8342fcb..eefb8f6 100644 --- a/cast/stickers/huginn/presenting-determined.svg +++ b/cast/stickers/huginn/presenting-determined.svg @@ -1 +1 @@ -Huginn — presenting, determined +Huginn — presenting, determined diff --git a/cast/stickers/huginn/presenting-grin.svg b/cast/stickers/huginn/presenting-grin.svg index db9d616..d3a6512 100644 --- a/cast/stickers/huginn/presenting-grin.svg +++ b/cast/stickers/huginn/presenting-grin.svg @@ -1 +1 @@ -Huginn — presenting, grin +Huginn — presenting, grin diff --git a/cast/stickers/huginn/presenting-happy.svg b/cast/stickers/huginn/presenting-happy.svg index 952f47b..ddf4e93 100644 --- a/cast/stickers/huginn/presenting-happy.svg +++ b/cast/stickers/huginn/presenting-happy.svg @@ -1 +1 @@ -Huginn — presenting, happy +Huginn — presenting, happy diff --git a/cast/stickers/huginn/presenting-neutral.svg b/cast/stickers/huginn/presenting-neutral.svg index c3c4918..f82f3d0 100644 --- a/cast/stickers/huginn/presenting-neutral.svg +++ b/cast/stickers/huginn/presenting-neutral.svg @@ -1 +1 @@ -Huginn — presenting, neutral +Huginn — presenting, neutral diff --git a/cast/stickers/huginn/presenting-sleepy.svg b/cast/stickers/huginn/presenting-sleepy.svg index 2aec6a6..79bd482 100644 --- a/cast/stickers/huginn/presenting-sleepy.svg +++ b/cast/stickers/huginn/presenting-sleepy.svg @@ -1 +1 @@ -Huginn — presenting, sleepyzz +Huginn — presenting, sleepyzz diff --git a/cast/stickers/huginn/presenting-smile.svg b/cast/stickers/huginn/presenting-smile.svg index 7d10207..b104e4f 100644 --- a/cast/stickers/huginn/presenting-smile.svg +++ b/cast/stickers/huginn/presenting-smile.svg @@ -1 +1 @@ -Huginn — presenting, smile +Huginn — presenting, smile diff --git a/cast/stickers/huginn/presenting-surprised.svg b/cast/stickers/huginn/presenting-surprised.svg index 5d7ac5f..fb383eb 100644 --- a/cast/stickers/huginn/presenting-surprised.svg +++ b/cast/stickers/huginn/presenting-surprised.svg @@ -1 +1 @@ -Huginn — presenting, surprised +Huginn — presenting, surprised diff --git a/cast/stickers/huginn/presenting-worried.svg b/cast/stickers/huginn/presenting-worried.svg index 2d5f712..cfa21a0 100644 --- a/cast/stickers/huginn/presenting-worried.svg +++ b/cast/stickers/huginn/presenting-worried.svg @@ -1 +1 @@ -Huginn — presenting, worried +Huginn — presenting, worried diff --git a/cast/stickers/huginn/surprised-determined.svg b/cast/stickers/huginn/surprised-determined.svg index c01377f..83202a9 100644 --- a/cast/stickers/huginn/surprised-determined.svg +++ b/cast/stickers/huginn/surprised-determined.svg @@ -1 +1 @@ -Huginn — surprised, determined +Huginn — surprised, determined diff --git a/cast/stickers/huginn/surprised-grin.svg b/cast/stickers/huginn/surprised-grin.svg index 28799e8..b099415 100644 --- a/cast/stickers/huginn/surprised-grin.svg +++ b/cast/stickers/huginn/surprised-grin.svg @@ -1 +1 @@ -Huginn — surprised, grin +Huginn — surprised, grin diff --git a/cast/stickers/huginn/surprised-happy.svg b/cast/stickers/huginn/surprised-happy.svg index d3849b9..a2d23fc 100644 --- a/cast/stickers/huginn/surprised-happy.svg +++ b/cast/stickers/huginn/surprised-happy.svg @@ -1 +1 @@ -Huginn — surprised, happy +Huginn — surprised, happy diff --git a/cast/stickers/huginn/surprised-neutral.svg b/cast/stickers/huginn/surprised-neutral.svg index 90c3e90..5044b8b 100644 --- a/cast/stickers/huginn/surprised-neutral.svg +++ b/cast/stickers/huginn/surprised-neutral.svg @@ -1 +1 @@ -Huginn — surprised, neutral +Huginn — surprised, neutral diff --git a/cast/stickers/huginn/surprised-sleepy.svg b/cast/stickers/huginn/surprised-sleepy.svg index 3b163ef..65ee554 100644 --- a/cast/stickers/huginn/surprised-sleepy.svg +++ b/cast/stickers/huginn/surprised-sleepy.svg @@ -1 +1 @@ -Huginn — surprised, sleepyzz +Huginn — surprised, sleepyzz diff --git a/cast/stickers/huginn/surprised-smile.svg b/cast/stickers/huginn/surprised-smile.svg index 57b9cdf..c909296 100644 --- a/cast/stickers/huginn/surprised-smile.svg +++ b/cast/stickers/huginn/surprised-smile.svg @@ -1 +1 @@ -Huginn — surprised, smile +Huginn — surprised, smile diff --git a/cast/stickers/huginn/surprised-surprised.svg b/cast/stickers/huginn/surprised-surprised.svg index 9513c3a..acc4796 100644 --- a/cast/stickers/huginn/surprised-surprised.svg +++ b/cast/stickers/huginn/surprised-surprised.svg @@ -1 +1 @@ -Huginn — surprised, surprised +Huginn — surprised, surprised diff --git a/cast/stickers/huginn/surprised-worried.svg b/cast/stickers/huginn/surprised-worried.svg index 4f06378..2e0f1eb 100644 --- a/cast/stickers/huginn/surprised-worried.svg +++ b/cast/stickers/huginn/surprised-worried.svg @@ -1 +1 @@ -Huginn — surprised, worried +Huginn — surprised, worried diff --git a/cast/stickers/huginn/thinking-determined.svg b/cast/stickers/huginn/thinking-determined.svg index 62e0ff3..3ae64ec 100644 --- a/cast/stickers/huginn/thinking-determined.svg +++ b/cast/stickers/huginn/thinking-determined.svg @@ -1 +1 @@ -Huginn — thinking, determined +Huginn — thinking, determined diff --git a/cast/stickers/huginn/thinking-grin.svg b/cast/stickers/huginn/thinking-grin.svg index 8fec18a..6e57b52 100644 --- a/cast/stickers/huginn/thinking-grin.svg +++ b/cast/stickers/huginn/thinking-grin.svg @@ -1 +1 @@ -Huginn — thinking, grin +Huginn — thinking, grin diff --git a/cast/stickers/huginn/thinking-happy.svg b/cast/stickers/huginn/thinking-happy.svg index 5b14cb7..9968554 100644 --- a/cast/stickers/huginn/thinking-happy.svg +++ b/cast/stickers/huginn/thinking-happy.svg @@ -1 +1 @@ -Huginn — thinking, happy +Huginn — thinking, happy diff --git a/cast/stickers/huginn/thinking-neutral.svg b/cast/stickers/huginn/thinking-neutral.svg index 34615ba..95621c9 100644 --- a/cast/stickers/huginn/thinking-neutral.svg +++ b/cast/stickers/huginn/thinking-neutral.svg @@ -1 +1 @@ -Huginn — thinking, neutral +Huginn — thinking, neutral diff --git a/cast/stickers/huginn/thinking-sleepy.svg b/cast/stickers/huginn/thinking-sleepy.svg index 504f7fb..6db0472 100644 --- a/cast/stickers/huginn/thinking-sleepy.svg +++ b/cast/stickers/huginn/thinking-sleepy.svg @@ -1 +1 @@ -Huginn — thinking, sleepyzz +Huginn — thinking, sleepyzz diff --git a/cast/stickers/huginn/thinking-smile.svg b/cast/stickers/huginn/thinking-smile.svg index 82abab2..4a99fcf 100644 --- a/cast/stickers/huginn/thinking-smile.svg +++ b/cast/stickers/huginn/thinking-smile.svg @@ -1 +1 @@ -Huginn — thinking, smile +Huginn — thinking, smile diff --git a/cast/stickers/huginn/thinking-surprised.svg b/cast/stickers/huginn/thinking-surprised.svg index 58afcf8..7d924c6 100644 --- a/cast/stickers/huginn/thinking-surprised.svg +++ b/cast/stickers/huginn/thinking-surprised.svg @@ -1 +1 @@ -Huginn — thinking, surprised +Huginn — thinking, surprised diff --git a/cast/stickers/huginn/thinking-worried.svg b/cast/stickers/huginn/thinking-worried.svg index c6ed445..7cc3f60 100644 --- a/cast/stickers/huginn/thinking-worried.svg +++ b/cast/stickers/huginn/thinking-worried.svg @@ -1 +1 @@ -Huginn — thinking, worried +Huginn — thinking, worried diff --git a/cast/stickers/huginn/waving-determined.svg b/cast/stickers/huginn/waving-determined.svg index 52f28a1..b98167d 100644 --- a/cast/stickers/huginn/waving-determined.svg +++ b/cast/stickers/huginn/waving-determined.svg @@ -1 +1 @@ -Huginn — waving, determined +Huginn — waving, determined diff --git a/cast/stickers/huginn/waving-grin.svg b/cast/stickers/huginn/waving-grin.svg index dd097c9..dd6aa9e 100644 --- a/cast/stickers/huginn/waving-grin.svg +++ b/cast/stickers/huginn/waving-grin.svg @@ -1 +1 @@ -Huginn — waving, grin +Huginn — waving, grin diff --git a/cast/stickers/huginn/waving-happy.svg b/cast/stickers/huginn/waving-happy.svg index 471d9a7..1789714 100644 --- a/cast/stickers/huginn/waving-happy.svg +++ b/cast/stickers/huginn/waving-happy.svg @@ -1 +1 @@ -Huginn — waving, happy +Huginn — waving, happy diff --git a/cast/stickers/huginn/waving-neutral.svg b/cast/stickers/huginn/waving-neutral.svg index edd5618..55c22a0 100644 --- a/cast/stickers/huginn/waving-neutral.svg +++ b/cast/stickers/huginn/waving-neutral.svg @@ -1 +1 @@ -Huginn — waving, neutral +Huginn — waving, neutral diff --git a/cast/stickers/huginn/waving-sleepy.svg b/cast/stickers/huginn/waving-sleepy.svg index 7126669..ddbfbfe 100644 --- a/cast/stickers/huginn/waving-sleepy.svg +++ b/cast/stickers/huginn/waving-sleepy.svg @@ -1 +1 @@ -Huginn — waving, sleepyzz +Huginn — waving, sleepyzz diff --git a/cast/stickers/huginn/waving-smile.svg b/cast/stickers/huginn/waving-smile.svg index d199720..840ba83 100644 --- a/cast/stickers/huginn/waving-smile.svg +++ b/cast/stickers/huginn/waving-smile.svg @@ -1 +1 @@ -Huginn — waving, smile +Huginn — waving, smile diff --git a/cast/stickers/huginn/waving-surprised.svg b/cast/stickers/huginn/waving-surprised.svg index 0d92b69..9c618a4 100644 --- a/cast/stickers/huginn/waving-surprised.svg +++ b/cast/stickers/huginn/waving-surprised.svg @@ -1 +1 @@ -Huginn — waving, surprised +Huginn — waving, surprised diff --git a/cast/stickers/huginn/waving-worried.svg b/cast/stickers/huginn/waving-worried.svg index 58c746e..7c434e5 100644 --- a/cast/stickers/huginn/waving-worried.svg +++ b/cast/stickers/huginn/waving-worried.svg @@ -1 +1 @@ -Huginn — waving, worried +Huginn — waving, worried diff --git a/cast/stickers/sleipnir/neutral-grin.svg b/cast/stickers/sleipnir/neutral-grin.svg index 0a83b0d..f3c0f33 100644 --- a/cast/stickers/sleipnir/neutral-grin.svg +++ b/cast/stickers/sleipnir/neutral-grin.svg @@ -1 +1 @@ -Sleipnir — neutral, grin +Sleipnir — neutral, grin diff --git a/cast/stickers/sleipnir/neutral-smile.svg b/cast/stickers/sleipnir/neutral-smile.svg index 6f5e5b2..eaec9c3 100644 --- a/cast/stickers/sleipnir/neutral-smile.svg +++ b/cast/stickers/sleipnir/neutral-smile.svg @@ -1 +1 @@ -Sleipnir — neutral, smile +Sleipnir — neutral, smile diff --git a/cast/stickers/sleipnir/neutral-surprised.svg b/cast/stickers/sleipnir/neutral-surprised.svg index f4651b9..cb965a1 100644 --- a/cast/stickers/sleipnir/neutral-surprised.svg +++ b/cast/stickers/sleipnir/neutral-surprised.svg @@ -1 +1 @@ -Sleipnir — neutral, surprised +Sleipnir — neutral, surprised diff --git a/cast/stickers/tengu/neutral-grin.svg b/cast/stickers/tengu/neutral-grin.svg index 048ed38..fa37875 100644 --- a/cast/stickers/tengu/neutral-grin.svg +++ b/cast/stickers/tengu/neutral-grin.svg @@ -1 +1 @@ -Tengu — neutral, grin +Tengu — neutral, grin diff --git a/cast/stickers/tengu/neutral-smile.svg b/cast/stickers/tengu/neutral-smile.svg index 3f48263..3c77153 100644 --- a/cast/stickers/tengu/neutral-smile.svg +++ b/cast/stickers/tengu/neutral-smile.svg @@ -1 +1 @@ -Tengu — neutral, smile +Tengu — neutral, smile diff --git a/cast/stickers/tengu/neutral-surprised.svg b/cast/stickers/tengu/neutral-surprised.svg index 2253655..2ef2a35 100644 --- a/cast/stickers/tengu/neutral-surprised.svg +++ b/cast/stickers/tengu/neutral-surprised.svg @@ -1 +1 @@ -Tengu — neutral, surprised +Tengu — neutral, surprised