diff --git a/Story/Cameo-Creatures.md b/Story/Cameo-Creatures.md index 0c05424..9ea1e78 100644 --- a/Story/Cameo-Creatures.md +++ b/Story/Cameo-Creatures.md @@ -2,6 +2,72 @@ These are the creatures currently best suited for the collosseum stands, throne-room cutaways, or brief featured bits rather than full battle-royale contender treatment. + + +## Profile pictures + +*Brandon / Experimental: only the selected variant below; other export variants omitted here.* + +**`experimenta1ic3` — 2** (selection) + +![](pfp/cameo-branndon/experimenta1ic3_1.jpg) + +**`noncriticalmother`** + +![](pfp/cameo-noncritical/noncriticalmother_0.jpg) + +**`noncriticalgamingttv`** + +![](pfp/cameo-noncritical/noncriticalgamingttv_0.jpg) + +**`foxy_fnaf5_ucn`** + +![](pfp/cameo-foxy/foxy_fnaf5_ucn_0.jpg) + +**`miclbero`** + +![](pfp/cameo-miclbero/miclbero_0.jpg) + +**`cameoqueen86`** + +![](pfp/cameo-queen/cameoqueen86_0.jpg) + +**`rayne8856`** + +![](pfp/cameo-rayne/rayne8856_0.jpg) + +**`bd_cum_lube`** (design ref; not from chat exports) + +![](pfp/cameo-bd/bd_cum_lube_ref.jpg) + + + + + +## Character design + +Selections and notes below override omitted PFP variants where applicable. + +- **`experimenta1ic3` — 2** (Branndon / `ExperimentA1ic3` — use this variant only) — Murder Drones–style fembot: slender white metal plating with visible joints, black face **visor** with two tilted glowing red “eyes” and a thin smug mouth line, long wavy **dark red** hair, gray **goggles** parked on the forehead, **red** sleeveless crop top, black fitted pants, heavy segmented **black tail** with blade-like spines, thin cable over the shoulder ending in a claw/orange canister tool. Confident full-body silhouette on black—**femboy murder drone** energy for the collosseum hot-dog bit. + +- **`noncriticalmother`** — Her export PFP is a generic placeholder; **design** is an **aged-up, wholesome** take on the same “noncritical” family as `noncriticalgamingttv`: warm **pink-and-white** palette carried into a soft cardigan or light jacket, laugh lines, kind eyes, hair either **silver-streaked pink** or a neat scarf over a softer pink tone—reads as supportive **mother/aunt** energy. Seat her **beside** the younger noncritical in the stands so they read as a pair at the same fights. + +- **`noncriticalgamingttv`** — Pastel **kawaii** bust: choppy pink hair, huge pink eyes with **heart** pupils and thick lashes, rabbit and bow **hair clips**, stick candy at the mouth, tiny cute mascot blobs in-frame—youthful, soft, slightly menhera-cute; the visual anchor for what Mother ages up from in spirit, not necessarily in literal face match. + +- **`pirate_protogen`** — No single export thumbnail selected. **Design:** a **protogen** (visor muzzle, LED trim, optional speaker cheeks) in full **pirate** drag: tricorn or bandana, navy coat with brass buttons, cutlass on the hip, maybe a **parrot** as a hologram or LED pet on the shoulder—built for loud one-line crowd shots. + +- **`foxy_fnaf5_ucn`** — Chibi fox-like build with **galaxy-print** panels on ears, cheeks, top, shorts, and tail tip (indigo starfield with stars), warm **orange-gold** base fur, **eyepatch**, **hook** hand, big fanged grin; sticker energy with pirate props in the frame—FNAF-horny gremlin as a pocket mascot. + +- **`basedgymrat`** — Extrapolate from the **name**, not the chat photo: exaggerated **gym bro**—tank or stringer, sweatband, maybe **dumbbell** charm or kettlebell earring, neon accent that can nod to the GAS slogan, always mid–**hype** pose in the stands. + +- **`miclbero`** — Soft-painted anthro **fox** face: sandy fur, **lavender** mask across the eyes, **electric blue** eyes, narrow knowing smirk—earnest ESL gremlin with a gentle, clever read. + +- **`cameoqueen86`** — Real-person ref: short **rainbow/teal/magenta** pixie, dramatic eye makeup, fabric mask printed with soft clouds and **“Go Away”** in pink gothic type, dark floral tank with **strappy** neckline—salon-day realness, watchful spectator. + +- **`rayne8856`** — Selfie read: long straight **black** hair, fair skin, subtle **smirk**, simple dark tee, thin chain, single **earbud**—sharp, fandom-specific audience member. + +- **`bd_cum_lube`** — Starting from [this sticker base](https://ih1.redbubble.net/image.5921126631.8669/st,small,507x507-pad,600x600,f8f8f8.u3.jpg) (archived at `pfp/cameo-bd/bd_cum_lube_ref.jpg`): **invert** the palette so the body is **white viscous “liquid flesh”** with sketchy drip (not black ink), keeping a pale mask-like face panel and high-contrast eyes. **Dragon it up:** small **horns** or fin-ears, longer reptilian muzzle suggestion, **spined** or paddle tail, dorsal bumps optional, claws heavier and more **draconic**—throne-room pet that reads cute-cursed until the movement hits. + ## Featured Cameos - `Branndongames` / `ExperimentA1ic3`: 74 archived messages across 7 streams. Per project notes, he should be front and center as a femboy murder drone handing out hot dogs in the collosseum. The archive supports a jokey, unserious, friendly gremlin energy. - `noncriticalmother` / `noncriticalgamingttv`: light archive presence, good fit for recognizable audience creatures in the stands. @@ -19,4 +85,4 @@ These are the creatures currently best suited for the collosseum stands, throne- - `cameoqueen86`: "Have you noticed some thing about the map?" - `Rayne8856`: "High huge inscryption fan and highly experienced player" - `pirate_protogen`: "Dawg why you playin broken fnaf game" -- `foxy_fnaf5_ucn`: "Wheres roxanne wolf i need to clap" +- `foxy_fnaf5_ucn`: "Wheres roxanne wolf i need to clap" \ No newline at end of file diff --git a/Story/pfp/cameo-bd/bd_cum_lube_ref.jpg b/Story/pfp/cameo-bd/bd_cum_lube_ref.jpg new file mode 100644 index 0000000..762b99d --- /dev/null +++ b/Story/pfp/cameo-bd/bd_cum_lube_ref.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91cde09da77fe8a1fe462f145a0412262eb75da6b708bc29d88e61a55df51b88 +size 41208 diff --git a/Story/pfp/cameo-branndon/branndongames_0.jpg b/Story/pfp/cameo-branndon/branndongames_0.jpg new file mode 100644 index 0000000..fd00338 --- /dev/null +++ b/Story/pfp/cameo-branndon/branndongames_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fa1c6fe00e14e4f1c68c42c2db3d56a4fb442d367340b47fd38c00c29c5abdd +size 18496 diff --git a/Story/pfp/cameo-branndon/branndongames_1.jpg b/Story/pfp/cameo-branndon/branndongames_1.jpg new file mode 100644 index 0000000..ed4c62d --- /dev/null +++ b/Story/pfp/cameo-branndon/branndongames_1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86e774851bf5235f0e34b046f25d7eb68b0f5834c7e03e72de9b3dee6d321e09 +size 17826 diff --git a/Story/pfp/cameo-branndon/experimenta1ic3_0.jpg b/Story/pfp/cameo-branndon/experimenta1ic3_0.jpg new file mode 100644 index 0000000..bba503d --- /dev/null +++ b/Story/pfp/cameo-branndon/experimenta1ic3_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7492ed6d283c53b0a5f0970306af2997043f145cb791e6a21f70500f4ab3a9c +size 23036 diff --git a/Story/pfp/cameo-branndon/experimenta1ic3_1.jpg b/Story/pfp/cameo-branndon/experimenta1ic3_1.jpg new file mode 100644 index 0000000..8044898 --- /dev/null +++ b/Story/pfp/cameo-branndon/experimenta1ic3_1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fad9d981f3c8672224cbccd633625e1401f4d63d84676541462fe3c3fdb5f6e +size 25932 diff --git a/Story/pfp/cameo-foxy/foxy_fnaf5_ucn_0.jpg b/Story/pfp/cameo-foxy/foxy_fnaf5_ucn_0.jpg new file mode 100644 index 0000000..42a84c2 --- /dev/null +++ b/Story/pfp/cameo-foxy/foxy_fnaf5_ucn_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5c61ae9fad5c42bf1e19d9a743022f5ddeeab3b932e7e3bd0d56bb405b24efc +size 44579 diff --git a/Story/pfp/cameo-gymrat/basedgymrat_0.jpg b/Story/pfp/cameo-gymrat/basedgymrat_0.jpg new file mode 100644 index 0000000..1a01dec --- /dev/null +++ b/Story/pfp/cameo-gymrat/basedgymrat_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7a0fb095b50640b3d083d6f10af78a5272109ecba5268d02b64c9a0a21986a1 +size 27728 diff --git a/Story/pfp/cameo-miclbero/miclbero_0.jpg b/Story/pfp/cameo-miclbero/miclbero_0.jpg new file mode 100644 index 0000000..1e35972 --- /dev/null +++ b/Story/pfp/cameo-miclbero/miclbero_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e51d99ad72e4a9b9783e0c31b96530060d5e1ffb4f256e7461c127e83c9d977a +size 16873 diff --git a/Story/pfp/cameo-noncritical/noncriticalgamingttv_0.jpg b/Story/pfp/cameo-noncritical/noncriticalgamingttv_0.jpg new file mode 100644 index 0000000..fcbcade --- /dev/null +++ b/Story/pfp/cameo-noncritical/noncriticalgamingttv_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f98b345ffa2766f5d3a9cdf56dcd3e1e3cab71cfe2c6ff48dc88974347709490 +size 30606 diff --git a/Story/pfp/cameo-noncritical/noncriticalmother_0.jpg b/Story/pfp/cameo-noncritical/noncriticalmother_0.jpg new file mode 100644 index 0000000..48d82c4 --- /dev/null +++ b/Story/pfp/cameo-noncritical/noncriticalmother_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6abe64fb5ad2707514e0cc581b370fc1cda170b56ad1fba415312a5055d6bb3b +size 7529 diff --git a/Story/pfp/cameo-pirate/pirate_protogen_0.jpg b/Story/pfp/cameo-pirate/pirate_protogen_0.jpg new file mode 100644 index 0000000..8e76296 --- /dev/null +++ b/Story/pfp/cameo-pirate/pirate_protogen_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ceb0f35581fd395db8a4d348daf6de6f072446054c194a1f59f1bd2daaf5b99e +size 9062 diff --git a/Story/pfp/cameo-pirate/pirate_protogen_1.jpg b/Story/pfp/cameo-pirate/pirate_protogen_1.jpg new file mode 100644 index 0000000..e6f3c3c --- /dev/null +++ b/Story/pfp/cameo-pirate/pirate_protogen_1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7cda19065d524daa7b62ff642acc0bd070a27c7273ec7233c948fe6d7c88855 +size 44366 diff --git a/Story/pfp/cameo-queen/cameoqueen86_0.jpg b/Story/pfp/cameo-queen/cameoqueen86_0.jpg new file mode 100644 index 0000000..bcd07fd --- /dev/null +++ b/Story/pfp/cameo-queen/cameoqueen86_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad9189ef618706bc58acda5bff94142d5869c472c783dd1db99e08c64c33e72a +size 32118 diff --git a/Story/pfp/cameo-rayne/rayne8856_0.jpg b/Story/pfp/cameo-rayne/rayne8856_0.jpg new file mode 100644 index 0000000..583cb55 --- /dev/null +++ b/Story/pfp/cameo-rayne/rayne8856_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69234388dc9208d36532e2958b489c7d1ed1768ed821876abdc1da1b1e76d720 +size 17066 diff --git a/tools/pfp_from_chat.py b/tools/pfp_from_chat.py index 6a5f417..3e2b0c9 100644 --- a/tools/pfp_from_chat.py +++ b/tools/pfp_from_chat.py @@ -8,6 +8,7 @@ Usage: Defaults: chat-root: MIXER_TWITCH_CHAT env, else Windows Synology path used in this project. Writes JPEGs under Story/pfp// and inserts a marked section into each roster .md. + Also fills Story/Cameo-Creatures.md from CAMEO_ROSTER (see tools/pfp_from_chat.py). """ from __future__ import annotations @@ -53,6 +54,21 @@ MD_FILES: dict[str, str] = { "raincloud": "RaincloudTheDragon.md", } +# Grouped cameo handles (see Story/Cameo-Creatures.md). Slug = folder under Story/pfp//. +CAMEO_ROSTER: dict[str, list[str]] = { + "cameo-branndon": ["branndongames", "experimenta1ic3"], + "cameo-noncritical": ["noncriticalmother", "noncriticalgamingttv"], + "cameo-pirate": ["pirate_protogen"], + "cameo-foxy": ["foxy_fnaf5_ucn"], + "cameo-gymrat": ["basedgymrat"], + "cameo-miclbero": ["miclbero"], + "cameo-queen": ["cameoqueen86"], + "cameo-rayne": ["rayne8856"], + "cameo-bd": ["bd_cum_lube"], +} + +CAMEO_MD = "Cameo-Creatures.md" + DEFAULT_CHAT_ROOT = os.environ.get( "MIXER_TWITCH_CHAT", r"C:\Users\Nathan\SynologyDrive\YouTube\Streams\MixerTwitch", @@ -113,12 +129,14 @@ class SeenAvatar: url: str -def collect_avatars(chat_root: Path) -> dict[tuple[str, str], dict[str, SeenAvatar]]: +def collect_avatars( + chat_root: Path, roster: dict[str, list[str]] +) -> dict[tuple[str, str], dict[str, SeenAvatar]]: """ Returns map (slug, login) -> fingerprint -> SeenAvatar (earliest message wins per fp). """ login_to_slug: dict[str, str] = {} - for slug, logins in ROSTER.items(): + for slug, logins in roster.items(): for lg in logins: login_to_slug[lg.lower()] = slug @@ -236,7 +254,8 @@ def main() -> int: print("Set MIXER_TWITCH_CHAT or pass --chat-root.", file=sys.stderr) return 1 - acc = collect_avatars(args.chat_root) + full_roster: dict[str, list[str]] = {**ROSTER, **CAMEO_ROSTER} + acc = collect_avatars(args.chat_root, full_roster) pfp_root = args.story_root / "pfp" # Flatten per slug for multi-login: still per-login files @@ -294,6 +313,41 @@ def main() -> int: md_path.write_text(inject_section(text, section_md), encoding="utf-8") print(f"updated {md_path}") + # Cameo creatures: one combined section in Cameo-Creatures.md + cameo_images: list[tuple[str, str]] = [] + for slug in CAMEO_ROSTER: + logins = CAMEO_ROSTER[slug] + story_rel = f"pfp/{slug}" + for login in logins: + key = (slug, login) + avs = acc.get(key, {}) + ordered = sorted(avs.values(), key=lambda x: x.first_at) + if not ordered: + print(f"No avatars in exports for cameo `{login}` ({slug})", file=sys.stderr) + continue + for i, av in enumerate(ordered): + fn = f"{login}_{i}.jpg" + rel = f"{story_rel}/{fn}" + dest = pfp_root / slug / fn + if not download_as_jpeg(av.url, dest): + continue + cap = f"`{login}`" + if len(ordered) > 1: + cap = f"{cap} — {i + 1}" + cameo_images.append((cap, rel)) + + if cameo_images: + cameo_md = build_section_md(cameo_images) + cameo_path = args.story_root / CAMEO_MD + if not args.no_write_md and cameo_path.is_file(): + cameo_path.write_text( + inject_section(cameo_path.read_text(encoding="utf-8"), cameo_md), + encoding="utf-8", + ) + print(f"updated {cameo_path}") + elif not args.no_write_md: + print("No cameo avatars downloaded (check exports and logins).", file=sys.stderr) + return 0