Inspiration

I wanted to create a cozy-but-chaotic adventure game where the “enemies” aren’t terrifying monsters, but incredibly annoying roommates. The idea of food spirits haunting a house while being completely unhelpful about it felt funny, chaotic, and strangely relatable, which made me want to build the world around that concept. I was also heavily inspired by the charm of classic pixel-art JRPGs, especially their dialogue systems and quirky character interactions.

What it does

Spirit Chaos is a browser-based 2D adventure game built with Phaser 3. You play as Lia, who comes home to find three spirits, Poppy, Citrus, and Melody, have taken over her house. To restore order, you must explore three rooms, interact with increasingly unhinged objects and characters, and collect three lost music notes. Each spirit guards a note in their own way: Poppy hides clues around the bedroom Citrus just... lives in the kitchen now Melody challenges you to a musical memory puzzle. Collect all three and trigger the true ending.

How I built it

  • Maki-Framework was used for the rooms and lia- the main character
  • Phaser 3 for the game engine (scene management, sprites, animations, audio)
  • Vite as the build tool and dev server
  • Vanilla JavaScript (ES modules) for all game logic
  • Custom dialogue system with typewriter effect, portrait switching, and speaker highlighting built from scratch
  • A lightweight GameState singleton to persist notes, visited flags, and play time across scene transitions
  • All art assets are original pixel sprites and room backgrounds

Challenges I ran into

  • Seamless Scene Transitions: Getting scene transitions to feel smooth without replaying intro sequences on every return visit. We solved this with a centralized GameState.introDone and GameState.visited flags.

  • Animation Management: Phaser's animation system requires animations to be registered once globally; managing this across multiple scenes that each call create() independently required careful anims.exists() guards.

  • Audio State Handling: Managing multiple audio tracks and ensuring proper loading, especially when files are missing or corrupted, requiring us to wrap audio playback in safe this.cache.audio.exists() checks to prevent hard crashes.

  • Minigame Logic Flow: Balancing the Taste Test Challenge and the music puzzle (sequence memory game) needed careful state management to handle wrong answers, timers, and retries without breaking the dialogue flow.

Accomplishments that I am proud of

The dialogue system. No question. Everything in the game talks. The toilet talks. The bread talks. The strawberries started a labor union. I built all of that from nothing and it actually works.

Every object has personality. Multiple lines. Different reactions depending on what you've done. It's the kind of detail that takes forever but players notice.

The game has a complete loop. Title screen. Intro. Three full rooms with puzzles. A grand finale where the spirits float in a circle and the notes combine into light. Stats screen showing your play time. Then Poppy immediately ruins the peaceful moment by popping out of the couch.

That ending. I'm really proud of that ending.

What I learned

  • Phaser 3 scene lifecycle management and how to share state cleanly between scenes without coupling them
  • How much personality you can pack into a game through dialogue alone — the "talking objects" mechanic turned out to be the most memorable part
  • Vite's publicDir option for serving game assets cleanly in both dev and prod
  • That "the vibes are well-fed" is a complete sentence and a valid life philosophy

What's next for Spirit Chaos

  • More endings (currently 4 exist, only the true ending is fully implemented)
  • A proper inventory system so collected notes are visible on-screen at all times
  • Mobile touch controls
  • More rooms and more spirits
  • Saving progress to localStorage so the game remembers your notes between sessions

Built With

Share this project:

Updates