Technical + Level Design · Puzzle
Alice-Alice
A scaling puzzle platformer built for GMTK Game Jam 2024.

The challenge
How can scaling create readable puzzles while staying consistent across many interactions?
My contribution
- Technical and level design on a seven-person team
- Scaling system design and physical behavior
- Puzzle composition and player onboarding
Overview
Project background
Alice-Alice is a 2D puzzle platformer built for GMTK Game Jam 2024 ("Built to Scale"), where the core mechanic lets the player scale Alice herself and other scalable objects larger and smaller to solve environmental puzzles, a direct reinterpretation of Alice in Wonderland's shrink/grow potions. The central design tension: once both the player character and individual objects can each scale independently, the puzzle space becomes combinatorially large fast, and keeping that space readable and fair for the player, rather than overwhelming or arbitrary, was the core challenge. Built with a team of roughly 6-9 over an extended 96-hour jam. My role was design and programming.
Gameplay video
Consistent ruleset
Scaling both Alice and objects creates a huge combinatorial puzzle space. Every interaction has to behave the same way everywhere, no hidden exceptions for one specific puzzle.
Experiment and discover
Every solution should be findable by trying things in the world. No outside knowledge or tutorial dumps required, curiosity is enough.
A world that feels like Alice's
Scaling has to feel smooth and physical, not just a number changing. Every character, UI element, and environment piece has to visibly belong to Alice in Wonderland's world.
MoreLess
Design deep dive
Scaling
I connected size to physical behavior and made scalable objects easier to identify.
Design intent, rules & gameplay
Design Intent
Scaling is the entire mechanical identity of the game, both Alice and individual objects can grow or shrink, and every puzzle is built from how those scales interact. Given that combinatorial complexity, the physics behind scaling had to feel consistent and predictable (Consistent Ruleset), while still being flexible enough to support a wide range of puzzle designs, and it needed to feel physically real rather than arbitrary (A World That Feels Like Alice's).
Rules
- Alice's jump velocity and horizontal move speed are both derived directly from her current local scale, larger scale means higher jumps and faster movement; smaller scale means lower jumps and slower movement
- Alice's ground-check collider scales with her, so grounding detection stays accurate at any size rather than assuming a fixed player footprint
- Every scalable object has a defined ScaleOption: Proportional (scales uniformly on both axes, with independent min/max bounds) or Vertical (scales only on the Y axis, for objects like buttons or platforms where width should stay fixed)
- Each scalable object has its own minScale/maxScale bounds, calculated relative to its original scale, so scaling limits are object-specific, not global
- An object can only be scaled if it's currently collision-free on the relevant sides (left/right for proportional scaling, top for both options), checked via overlap boxes against a configurable ignore layer mask, preventing objects from scaling into walls, floors, or each other
- Every scalable inanimate object carries a heart-symbol tag, and Alice's targeting raycast (via EyeTracer) changes color when pointed at a valid, currently-scalable object, giving immediate visual feedback before committing to the action
- Scalable animals (Cheshire Cat, Flamingo) are not tagged the same way, their interactivity is taught through level design and context rather than a UI marker
- Resetting a level restores every scalable object to its original scale and position via ResetScalable(), and resets Alice's own scale via ResetPlayerScale()
Design decision 1Scaling should change Alice's physical behavior, not just size
Problem
The original approach kept mass and jump height constant regardless of Alice's size, reasoning that consistent physics would be easier to design puzzles around. In practice, this made scaling feel bland and cosmetic, growing or shrinking changed how Alice looked without meaningfully changing how she played, and it directly limited the kinds of scaling-based platforming puzzles the team could design, since size had no mechanical consequence to build a puzzle around.
Decision
Reverse the original approach entirely, size directly affects both jump height and mass. A larger Alice jumps higher but is heavier (affecting how she interacts with scaled objects, platforms, or physics-based obstacles), while a smaller Alice jumps lower but is lighter. This gives every scaling decision real mechanical weight (literally), turning "should I grow or shrink here" into an actual strategic choice tied to platforming and physics, rather than a cosmetic toggle.
Implementation code
float HeightToVelocity() {
return Mathf.Sqrt(2 * (1f * Mathf.Abs(transform.localScale.x))
/ Mathf.Abs(Physics2D.gravity.y)) * Mathf.Abs(Physics2D.gravity.yImplementation code
float scaleMultiplier = Mathf.Abs(transform.localScale.x / playerScale.originalPlayerScale.x);
rb.velocity = new Vector2(horizontal * moveSpeed * scaleMultiplier, rb.velocity.yIteration
The team started with the opposite design, deliberately normalized physics regardless of scale, before recognizing it made the core mechanic feel unsatisfying and mechanically inert. Reversing course to let size affect jump height and mass came directly from playtesting revealing how flat the original version felt, and from recognizing it was actively limiting level design options.
Outcome
Scaling became a real platforming decision instead of a visual one, size now determines traversal options (how high you can jump, how you interact with weight-sensitive puzzle elements), which is what let the level design deep dive actually build puzzles around scaling rather than around a fixed, unchanging Alice.
Design decision 2Scalable objects needs to be visible and identifiable
Problem
With a huge combinatorial puzzle space already at stake, players also need a reliable way to know, at a glance, whether a given object can even be scaled. Without a clear visual signal, players would be reduced to guessing or trial-and-error just to find out what's interactive, undermining Discoverable Through Experimentation, since experimentation only works if players know where to actually experiment.
Decision
Every scalable inanimate object carries a heart-symbol tag marking it as scalable, and Alice's targeting raycast changes color, turning blue, when pointed at a valid scalable object, giving the player immediate, unambiguous feedback before committing to an action. Scalable animals (the Cheshire Cat, the flamingo) don't carry this tag; their scalability is instead taught implicitly through level design, early puzzle placement gives players enough context to learn these characters are interactable without an explicit marker.
Implementation code
public void UpdateColor(bool isSelectable) {
if (isSelectable) SetColor(selectedStartColor, selectedEndColor);
else SetColor(unselectedStartColor, unselectedEndColorIteration
The earliest version had no visual marker on scalable boxes at all, making it genuinely hard to tell what was interactable. The first fix was giving scalable objects contrasting-colored sprites to make them visually pop against the environment, but this proved insufficient once levels grew more complex and visually varied, a color that stood out in one environment blended into another. The team settled on the heart tag plus the color-changing raycast specifically because it's environment-independent, the signal doesn't rely on contrast against a background that keeps changing. The animal side of the problem never needed a dedicated fix, level design alone was enough to teach their interactivity clearly.
Outcome
Object scalability is now communicated reliably regardless of a level's visual theme, closing the exact gap where the original color-contrast approach broke down, while the animals demonstrate that not every interactive element needs an explicit UI marker if the level itself teaches the rule clearly enough.
Level design/composition
I introduced one scaling mechanic at a time and taught the rules through puzzle composition.
Design intent, rules & gameplay
Design Intent
With scaling creating a combinatorial puzzle space, level design's job is to introduce that complexity in a controlled sequence, teaching one new rule at a time rather than overwhelming the player, directly serving Discoverable Through Experimentation.
Design decision 1Teaching one scaling mechanic at a time
Problem
Scaling has multiple independent variables, Alice's own size, static object size, moving objects, magnetic pairs, plus separate systems like buttons and hidden interactables. Introducing all of them at once, or in an arbitrary order, risks overwhelming the player and undermining Discoverable Through Experimentation.
Decision
The tutorial level introduces exactly one new concept per beat: first scaling Alice herself, then scaling other objects, then scalable animals, then interacting with buttons. From there, each subsequent area introduces exactly one further building block on top of what's already been taught: Area 1 reinforces the tutorial's basics while introducing that some objects are hidden behind glass and must be discovered as scalable. Area 2 introduces moving scalable objects. Area 3 introduces magnetic object pairs. The final level ties every mechanic together as a cumulative test, requiring the player to combine everything they've learned rather than teaching anything new.
Outcome
Each area has a clear, singular teaching purpose before the final level asks players to synthesize everything, giving the whole game a legible difficulty curve despite the underlying mechanic's combinatorial complexity.
Design decision 2Keep explicit tutorials to bare minimum
With scaling introducing genuine complexity, the team debated how much guidance players actually needed. There was real concern early on that players might not grasp certain mechanics or puzzle logic without more explicit instruction, text prompts, tooltips, or hand-holding beyond the basics.
The team ultimately chose to trust the player rather than over-explain. Explicit tutorial content was kept confined to a single dedicated area teaching only the most basic controls. Beyond that, every new mechanic is introduced through a deliberately safe environment, low-stakes space where the player can experiment freely and build understanding before any puzzle actually requires them to apply it under pressure. The teaching happens through level layout and sequencing (per the previous Decision), not through UI or text.
Iteration
This came out of genuine internal debate rather than a settled plan from day one, the team weighed adding more explicit guidance against trusting the player, and chose the latter, backing that choice up by carefully engineering safe, low-risk spaces for every new mechanic to make the trust well-founded rather than reckless.
The game teaches almost entirely through space and sequencing rather than instruction, directly proving Discoverable Through Experimentation as a real practiced value rather than just a stated pillar, while the safe-experimentation-zones design pattern kept that trust from becoming a source of player confusion or frustration.