Inspiration
Maplewood started as a question: what if a town's identity lived entirely in its stories and someone stole them all? The Memory Fog mechanic came from that idea. We wanted a cozy RPG where the act of exploring is the act of healing, and where every collectible feels like a real piece of a place coming back to life.
What it does
Pixel Pals: The Town That Forgot Its Story is a 2D pixel RPG where you play as Ash, a wandering archivist. Maplewood's residents have lost their memories to a mysterious fog. You explore the town, talk to four NPCs (Lia the librarian, Mayor Bram, Chef Rosa, and Old Pete), collect 8 Memory Fragments scattered across the map, complete quests tied to each character, and gradually lift the fog as the town's history is restored. Collect all 8 fragments to trigger the ending.
How we built it
Built on @tialops/maki v1.1.0 (which wraps Phaser 3) with Vite as the dev server. The architecture is a set of Maki Scene subclasses MenuScene, TownScene, LibraryScene, CafeScene, and EndScene all sharing a single GameState singleton. Systems like DialogueSystem, FragmentSystem, and QuestSystem are self-contained classes instantiated per scene. The town map, library, and café are all loaded via manager.map(). We used Vitest + fast-check for property-based testing, covering 10 correctness properties at 100 iterations each.
Challenges we ran into
Keeping NPC dialogue state, quest state, and fragment collection in sync across scene transitions required careful design — we solved it with a single GameState module rather than letting each scene own its own state. The fog overlay needed to respond dynamically to fragment collection without re-creating graphics objects every frame.
Accomplishments that we're proud of
The dialogue system handles multi-phase NPC conversations that evolve based on quest state no hardcoded conditionals, just data-driven phase indices. 10 property-based tests that formally verify core correctness guarantees (idempotent collection, monotonic quest state, fog alpha math, etc.). The town feels alive despite being built entirely with Phaser Graphics primitives no external tileset art needed.
What we learned
Maki's manager abstraction makes map/sprite loading clean, but the lack of type declarations means you're flying blind on the API surface documentation or types would have saved real time. Property-based testing with fast-check is genuinely useful for game logic: it caught edge cases in quest state transitions and dialogue exhaustion that example-based tests would have missed. Keeping all cross-scene state in one place (GameState) was the right call scene transitions are much simpler when you're not trying to pass everything through scene.start() data.
What's next for Maki game
More NPCs and a branching dialogue tree with choices that affect the ending. Sound background music and SFX for fragment collection and dialogue are stubbed in the requirements but not yet implemented. A day/night cycle tied to fragment progress, replacing the simple fog fade. TypeScript migration once Maki ships type declarations. Mobile touch controls so the game is playable outside the desktop browser.
Log in or sign up for Devpost to join the conversation.