ChronoShift: Collapse
Logline
A fast-paced first-person runner where players swap between Red and Blue realities to reveal platforms, outrun a collapsing world, and make split-second navigation decisions under increasing visual pressure.
TL;DR
- Core hook: Swap between Red and Blue realities to reveal the path forward
- Pressure system: Fog and limited visibility intensify as the run continues
- Replayability: Procedural layout + lane choices encourage varied routes
- Iteration: Telemetry and survey feedback informed tutorial, balance, and pacing decisions
Project Intent
Build a high-clarity runner where difficulty comes from rapid interpretation (what exists in this dimension?) rather than memorization. The game evolved through playtests and instrumentation, using data to pinpoint friction (onboarding, fog pacing, procedural linearity) and guide targeted fixes.
What We Set Out To Solve
Early playtests surfaced issues in onboarding clarity, difficulty pacing, and procedural variety. Through telemetry, iterative systems design, and targeted mechanic adjustments, we reshaped the experience to be clearer, fairer, and more replayable.
Challenge 1: The “Tutorial Cliff”
During Alpha playtests, most players quit in under 60 seconds. To understand why, we logged death events via UnityWebRequest to Google Forms and visualized them with a small Python script. The heatmaps showed a huge spike at a single “Dash Gap” in the tutorial, where players were failing 18+ times on average before giving up.
Analytics Dashboard: User Retention
The Alpha build (Red) shows a massive death spike at the "Dash Gap". Players were rage-quitting here. The Gold build (Blue) smoothed this out.
Challenge 2: Balancing the “Fog” Mechanic
One of our core systems is a Health-Visibility link: as the “Chrono” timer runs out, fog density increases and view distance shrinks. If the fog ramped too fast, players felt cheated; too slow, and there was no tension. We used another round of analytics to tune the curve until it felt fair but still stressful in the final seconds.
Analytics Dashboard: Game Balance
We moved from a Linear Decay (Red) to an Exponential Curve (Blue). This keeps visibility high for longer, creating panic only in the final seconds.
Challenge 3: Fixing Procedural Linearity
The final hurdle was our procedural generation. Analytics showed that ~90% of players were taking the same route, meaning our “maze” behaved like a hallway. We rewrote the PlatformManager to use a simple graph-based validator that simulates player movement and only accepts chunks that offer at least three distinct, viable paths and require dimension swapping.
// Pseudo-code of the fix implemented in Week 13
public bool ValidateChunk(Chunk chunkData) {
// 1. Get all potential paths using A*
List<Path> viablePaths = Pathfinding.GetAllRoutes(chunkData);
// 2. CONSTRAINT: Must have exploration variety
if (viablePaths.Count < 3) {
return false; // Reject chunk, regenerate
}
// 3. CONSTRAINT: Must utilize Dimension Swap mechanic
bool usesRed = viablePaths.Any(p => p.dimension == Dimension.Red);
bool usesBlue = viablePaths.Any(p => p.dimension == Dimension.Blue);
return usesRed && usesBlue;
}
Gameplay Video
Play the Game
Launch the playable WebGL build in a new tab.
Launch WebGL Build
Team & Contributions
My Role
I contributed as the Developer / Implementor, UI Designer, Mechanic Designer, and Stenographer. My work focused on:
- Implementing core gameplay systems including Dimension Swap, Dash, and Fog mechanics
- Designing UI and player feedback systems for clarity and responsiveness
- Building and analyzing telemetry pipelines to guide iteration
- Refining tutorial flow and difficulty progression using analytics
- Improving procedural generation to increase path diversity