Play it: itch.io | Source Code
- Custom pendulum grapple and shotgun-as-propulsion. The gap between floor and ceiling is a design choice, not a side effect.
- Fully playable: movement loop complete and live, architecture built to absorb combat without restructuring.
- The movement system is architected as a reusable foundation with exported mechanics, shared state hub, and modular components.
Design Intent
Three abilities (grapple tendril, shotgun recoil, wall adhesion), each distinct in use, all interconnected in play. The design question is about how many interesting ways a player can chain these through a given space. The skill ceiling is spatial reading and creative routing. The prototype exists to test whether that's actually fun. It is.
Key Design Decisions
Custom physics over Unity's built-ins
Unity's built-in drag and friction assume the player stops when they stop inputting. I prototyped with the defaults first and momentum died at exactly the moments it should have felt best.
Built a physics-assist layer instead, running in FixedUpdate after the physics step. It reads the simulation result, applies corrections only when clearly wrong, and leaves everything else untouched. Base move speed 12 units/s, global cap 32 (3x headroom, intentionally). Ground acceleration 80, air control 20. The asymmetry makes airborne trajectories feel committed, not trivially correctable.
The grapple system
Custom pendulum simulation, not a Unity joint. On attach, it records rope length as Euclidean distance to the anchor. Each FixedUpdate decomposes velocity into radial and tangential components, damps radial toward zero, and preserves tangential as swing arc. Swing damp is 1.002, fractionally above 1.0 to counteract floating-point losses and make the pendulum feel nearly lossless. Range is 20 units, which forces players to position into swing angles rather than latching from anywhere.
Dynamic rope retraction. At speed mid-chain, the player often arrives at the anchor with inward radial velocity. In a fixed-length pendulum that goes slack, killing momentum right when it should compound. The fix: rope length retracts dynamically to match the player's actual position, keeping the tether taut and converting inward velocity into angular momentum at the tighter radius. The ice-skater effect, applied reactively. The grapple isn't a rope, it's the symbiote extending itself. A rope goes slack; a symbiote contracts. The physics necessity became the thing that makes it feel alive.
The shotgun as primary propulsion
Impulse at 18 force, stronger than jump force (14). The shotgun is the primary propulsive tool, not a weapon with a movement side effect. While grappling, impulse adds directly to velocity as a swing accelerator mid-arc. While grounded or airborne, it triggers a timed dash (0.3s, 4 units, max 15 units/s). The 1.6s cooldown enforces the rhythm: grapple, fire on the swing, reload, repeat.
Tradeoffs
- Readability vs. depth: Coyote time + jump buffer (0.1s each). Tight enough to feel earned, forgiving enough that players can tell their timing from the physics.
- Wall system: Slide is passive (1.5 units/s); crawl is active (12 units/s upward, symbiote meter as the cost). Meter prevents wall camping without penalizing vertical traversal.