Ten sprints ago, Glyntfall was a crystal shader and a prayer. One tap, one shatter, one question: does this feel satisfying?
Now it's a multi-world mobile game with 5 orb types, 5 evolution abilities, 12-wave runs, a meta-upgrade tree, surge difficulty scaling, and 488 Edit Mode tests. The crystal shader is still there. It just has a lot more company.
Here's what happened between Sprint 2 (the gate sprint that greenlit the project) and Sprint 10 (where the game stopped feeling like a prototype and started feeling like a game).
The Shape of Ten Sprints
| Sprint | Theme | Tests | What Changed |
|---|---|---|---|
| 0 | Foundation & Spikes | 45 | Dev environment, 4 technical spikes validated |
| 1 | Core Combat | 95 | Orb firing, crystal spawning, descent system |
| 2 | Destruction (GATE) | 121 | Voronoi shatter, crystal shader, bloom. Gate passed. |
| 3 | The Game Loop | 156 | WaveManager, scoring, combos, upgrades, main menu |
| 4 | Spectacle & Stacking | 186 | 5 orb types, modifier stacking, juice manager |
| 5 | Progression & Polish | 283 | Meta-upgrades, crystal types, ricochet, haptics |
| 6 | Visual Identity | 283 | In-game art, menu style guide, first Xcode export |
| 7 | Orb Identity & Pickups | 364 | Orb sprites, shoot-to-collect (GATE), 12-wave flow |
| 8 | Evolution & Waves | 416 | Evolution abilities, multi-group waves, beacon |
| 9 | Beacon & Orb Visuals | 467 | Beacon sprite progression, orb visual scaling |
| 10 | Surge & World 2 | 488 | World select, surge difficulty, Armored crystals, evolution VFX |
The test count tells a story. Each sprint adds 30-100 tests because the architecture enforces testable pure C# logic separated from MonoBehaviours. FragmentLifecycle, DamageResolver, ModifierState, UpgradeDrawer, FormationBuilder. All Edit Mode, all fast, all reliable.
Three Moments That Changed the Game
Multi-Group Waves (Sprint 8)
Before Sprint 8, waves lasted 2-4 seconds. A formation would spawn, you'd blast through it, next wave. It was technically correct and emotionally flat.
Multi-group waves changed everything. Instead of one formation per wave, waves now spawn 1-4 staggered groups. A wave might start with a cluster of standard crystals, then drop a chevron of dense crystals from the left while a wall of volatile crystals descends from center. Waves last 20-60 seconds. There's pressure. There's prioritization. There's the moment when three groups converge and you're choosing which formation to shatter first.
Single biggest improvement to gameplay feel in the entire project. Not a new feature. Just a structural change to something that already existed.
Shoot-to-Collect (Sprint 7)
The original design had upgrades appear in a pick screen between waves. Standard mobile game pattern. Sprint 7 ran a design spike on an alternative: what if upgrade orbs spawn in the play field and you have to shoot them to collect?
The gate criteria were specific: aiming feels natural, collect feedback is clear, orbs are distinguishable from crystals, there's opportunity cost tension (shoot the upgrade or keep clearing crystals?), and it holds 60fps. Gate passed. The upgrade orbs hover in a cluster, glowing distinctly from crystals. Shooting one triggers a celebrate VFX (golden burst), floating text, and a haptic pulse.
Milestone picks still exist at waves 4, 8, and 12 for the major upgrades. But the in-world pickups between milestones add a layer of tactical decision-making that the pick screen never had.
The Beacon Pivot (Sprint 9)
The beacon is the player's base. It sits at the bottom of the screen and represents your accumulated power during a run. The original design called for procedural VFX progression: particle rings, orbiting shards, accretion effects, 5 visual states.
I spent a full session building it. Particle ring with increasing count and radius. Orbiting shards using orbital velocity math. Emission intensity scaling with upgrade count.
Then I hit Play with bloom active. At the beacon's scale (small, bottom of screen), the particles were invisible. Bloom washed them out entirely. The carefully tuned 5-state system was indistinguishable from "no effect at all."
The fix was embarrassingly simple: sprite swap. Three beacon sprites (base, powered, overloaded) that swap at level-up milestones. No particles. No procedural math. Just different images. Unmissable.
The lesson isn't "sprites beat particles." It's that visual feedback systems need to be tested with all post-processing active, at actual game scale, in actual game context. My tuning session had the camera zoomed in. At real zoom level with bloom, the particles disappeared.
Evolution Abilities (Sprint 8 + 10)
When an orb type's stats are maxed (damage, speed, fire rate all capped), it evolves. Five evolutions, each with a distinct gameplay effect and visual identity:
| Evolution | Effect | VFX |
|---|---|---|
| Overcharge | 3x crit damage | Gold crackling sparks (continuous particle) |
| Barrage | 3-shot burst every 5s | Triple trail (2 flanking TrailRenderers) |
| Momentum | +20% speed after 2s flight | Blue-white particle aura from launch |
| GravityWell | Fragment magnet (inverse-square force) | Purple inward-pulling ring |
| TwinShot | Second orb every 4th shot | Symmetric side-by-side spawn with flash |
Sprint 8 built the gameplay effects. Sprint 10 added the per-evolution VFX and then immediately deleted the HUD stat bars. 1400 lines of stat UI code, gone. The reasoning: if the VFX is doing its job, you don't need numbers to tell you an orb is powerful. You can see the triple trail. You can see the gold sparks. Power is communicated visually, not through a stat bar.
World 2: The Vein
Sprint 10 added the world system. World 1 ("The Shallows") is the game you've been playing: cyan, amber, and magenta crystals against a dark void. World 2 ("The Vein") introduces Armored crystals with a shell mechanic. Hit them once to crack the shell, then damage normally. Deep rock background with amber and gold palette.
The shader needed work. The crystal shader uses additive blending, which makes bright sprites glow beautifully against dark backgrounds. Armored crystals are visually opaque though. Rock-like, not glass-like. Additive blending made them transparent.
The fix: a dual-blend shader with configurable _SrcBlend and _DstBlend properties. Standard and volatile crystals use additive blending (bright, glowing). Armored and dense crystals use alpha blending (opaque, solid). One shader, two blend modes, controlled per-material.
Surge Difficulty
Surge levels replace the prestige system from the original design. The concept phase spec called for a prestige loop where you reset progress for permanent bonuses. During production, that felt punishing. Instead, surge levels scale difficulty (1-10) without resetting anything. Surge 1 is baseline. Surge 10 is 4x crystal HP.
The formula: 1 + (surge - 1) * 0.15 for a smooth ramp. A slider on the world select screen lets you choose your challenge level. Higher surge means better shard rewards for meta-upgrades. Risk-reward, no punishment.
What Ten Sprints Taught Me
Editor setup scripts are essential. Every sprint gets a SprintNSetup.cs that programmatically creates ScriptableObjects, prefabs, and scene wiring. Manual Inspector work doesn't scale and doesn't reproduce.
Play-test at actual scale. The beacon particle failure, the crystal type readability issue (Sprint 5, color alone too subtle with bloom), the fire rate change (5 to 3 was the single biggest feel improvement). All caught by playing, not by reading specs.
Integration buffers are gates, not suggestions. Sprint 5 skipped the integration buffer. The next sprint discovered save/load bugs that should have been caught. Now the buffer is a formal gate: you don't close the sprint until the full loop works end-to-end.
Celebration hierarchy matters. Five tiers: shatter, collect, wave clear, level-up, evolution. Each tier is more intense than the last. The hierarchy creates emotional pacing. If everything is equally spectacular, nothing feels special.
Where It Stands
488 tests. 10 sprints. 2 worlds. 5 orb types. 5 evolutions. 12-wave runs with multi-group formations. Meta-upgrades. Surge difficulty. Haptics. All running at 60fps on device.
The next priority is the device build validation that keeps getting deferred. Editor performance is great, but the game needs to be played on a phone with touch input and haptic feedback to know if it actually feels right. That's been true since Sprint 6 when the first Xcode export proved it works. It just needs more hours of real play-testing.
Ten sprints ago, the whole bet was "does one shatter feel satisfying?" Now the question is bigger: does a 12-wave run with escalating chaos, tactical upgrade collection, and evolution abilities feel like a game worth playing for 15 minutes a day?
Only play-testing answers that.