Skip to content

16 Emotions — Building the Octopus Personality System

One octopus personality isn't a pet. It's a novelty. Today the octopus learned to feel — angry eyebrows, sad droopy eyes, chaotic spiral pupils, heart-shaped horny eyes, and 12 more distinct emotional states. Each one changes how the octopus looks, moves, and talks.

The Emotion Architecture

Every emotional state is a combination of independently drawn components:

  • Pupils — position, size, and shape (centered, shifted, spiral rings, hearts, stars, pinpricks)
  • Eyebrows — parametric sine arcs above the eye sockets (angry V-shape, sad droopy)
  • Eyelids — partial circle fills covering the top of the eye socket (tired, lazy)
  • Mouth — distinct mathematical curve per emotion (parabola, sine wave, zigzag, ellipse with drool)
  • Body transform — per-frame animation (breathing bob, jitter, sway, puff, droop)
  • Special effects — tear drops (homesick), tongue (horny), cheek puffs (fat)

The system is composable. Adding a new emotion means writing 2-3 small draw functions and a 4-element animation cycle. No bitmaps to create, no sprites to manage.

The Lineup

The octopus went from 1 personality to 16 in a few sessions:

Emotion Eyes Mouth Body Vibe
Normal Centered pupils, highlights Smirk/smile Gentle breathing Default sassy
Weird Misaligned pupils Sine wiggle Lean + wave Conspiratorial
Unhinged Tiny pinpricks Giant scream Rapid jitter Chaos mode
Angry Glaring inward, V-brows Tight frown Puffed up, tremble 8 arms, 0 patience
Sad Downward, droopy brows Gentle curve Drooped, deflated Ocean melancholy
Chaotic Spiral rings Zigzag bolt Wild distortion Entropy incarnate
Hungry Looking up Drool oval Lean upward Will sell hearts for tacos
Tired Half-closed lids Big yawn Sagging down One brain cell left
Slap Happy One squint, one manic Wobbly grin Swaying Deliriously giddy
Lazy Nearly shut slits Flat line Tentacles draped right Proudly doing nothing
Fat Wide happy Smile + cheek puffs Wide dome, thick tentacles Food-positive king
Chill Side-glancing Half-smile Subtle lean Stoner philosopher
Horny Heart-shaped Tongue out Rhythmic pulse Tentacle romance
Excited Star sparkles Wide grin Bouncing CAPS LOCK ENERGY
Nostalgic Looking up-right Wistful smile Gentle sway Back in my day
Homesick Teary + drops Wobbly line Curled inward Missing the deep

How the Mouth Cycle Works

Each mood has a fixed 4-frame animation cycle that determines which mouth expression plays on each frame:

static const uint8_t cycle_angry[] = {EXPR_ANGRY, EXPR_OPEN, EXPR_ANGRY, EXPR_ANGRY};
static const uint8_t cycle_sad[]   = {EXPR_SAD,   EXPR_OPEN, EXPR_SAD,   EXPR_SMILE};
static const uint8_t cycle_lazy[]  = {EXPR_LAZY,  EXPR_LAZY, EXPR_LAZY,  EXPR_OPEN};

New quotes are selected on EXPR_OPEN frames. So the angry octopus mostly frowns with brief mouth-opens between rants. The lazy octopus holds its flat line for three frames before reluctantly opening its mouth. The chaotic octopus mixes chaotic, unhinged, and weird mouths — it can't even commit to one expression.

Each Emotion is a Standalone Firmware

Every emotional state has its own firmware directory under dev-setup/angry-octopus/, sad-octopus/, horny-octopus/, etc. Each has its own main.c (identical rendering code) and quotes.h (30-196 themed quotes generated to match the personality).

Pick a mood, flash it, and your desk octopus becomes that emotion permanently until you flash a different one. Or use the Mood Selector firmware that contains all 823 quotes across all 16 moods and lets you browse with serial commands.

The Quote Generation Pipeline

Each personality has a curated quote list. The quotes are short (fits in a 170x70 pixel bubble at 5x7 font), thematically consistent, and written in ALL CAPS (the font only has uppercase). Some examples:

Angry: "I DIDN'T ASK TO BE BORN WITH 8 ARMS AND ANGER ISSUES."

Tired: "MY BRAIN HAS 47 TABS OPEN AND THEY'RE ALL LOADING."

Horny: "ARE YOU A CORAL REEF? BECAUSE I WANT TO EXPLORE YOU."

Homesick: "THE DEEP OCEAN NEVER JUDGED ME FOR BEING SQUISHY."

What This Enables

With 16 emotions, the octopus isn't a static display anymore. It's a character. It has range. Future features can trigger emotional transitions — feed the octopus and it goes from hungry to fat, ignore it and it goes from normal to sad, play with it and it gets excited. The emotion system is the foundation for the actual Tamagotchi gameplay loop.

But that's Phase 3. Right now, 16 different desk companions is already pretty great.