Back to Journal
ProductionGlyntfall

Ten Sprints: From Crystal Shader to World Select

Glyntfall hit Sprint 10. What started as one crystal and one shatter is now a multi-world game with 5 orb types, 5 evolution abilities, surge difficulty, a meta-upgrade tree, and 488 tests. Here's what ten sprints of solo game development actually looks like.

March 31, 20269 min read

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

SprintThemeTestsWhat Changed
0Foundation & Spikes45Dev environment, 4 technical spikes validated
1Core Combat95Orb firing, crystal spawning, descent system
2Destruction (GATE)121Voronoi shatter, crystal shader, bloom. Gate passed.
3The Game Loop156WaveManager, scoring, combos, upgrades, main menu
4Spectacle & Stacking1865 orb types, modifier stacking, juice manager
5Progression & Polish283Meta-upgrades, crystal types, ricochet, haptics
6Visual Identity283In-game art, menu style guide, first Xcode export
7Orb Identity & Pickups364Orb sprites, shoot-to-collect (GATE), 12-wave flow
8Evolution & Waves416Evolution abilities, multi-group waves, beacon
9Beacon & Orb Visuals467Beacon sprite progression, orb visual scaling
10Surge & World 2488World 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:

EvolutionEffectVFX
Overcharge3x crit damageGold crackling sparks (continuous particle)
Barrage3-shot burst every 5sTriple trail (2 flanking TrailRenderers)
Momentum+20% speed after 2s flightBlue-white particle aura from launch
GravityWellFragment magnet (inverse-square force)Purple inward-pulling ring
TwinShotSecond orb every 4th shotSymmetric 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.