Game Design · July 6, 2026
Daily Challenge and Seeded Run Modes in Shmups
A finished shmup is a static thing — the same stages, the same patterns, every playthrough. A seeded daily challenge injects controlled variation and a shared reference point that competitive players will keep coming back for.
Published July 6, 2026
The core idea is simple: instead of pure randomness, generate that day's challenge — power-up drops, enemy wave order, item placement, whatever your game varies — from a seed derived from the date, so every player who plays "today's" run gets the exact same sequence of events. This turns a single-player mode into something with a comparison hook: everyone is playing the identical run, so a leaderboard for that run is measuring skill, not luck.
Deterministic random number generation is the foundation
This only works if your random number generator is deterministic given a seed — the same seed must always produce the same sequence of "random" values, on every platform, every time. Most language standard library RNGs guarantee this within a single run but not necessarily across platforms or versions, so it's worth using (or writing) a small, explicit PRNG algorithm you control directly rather than relying on whatever the platform provides. A simple xorshift or PCG implementation is a few dozen lines of code and removes an entire category of "the daily challenge was different on Mac vs Windows" bug reports.
Seed the RNG once, at the start of the run, from the date (formatted consistently — beware timezone differences causing the seed to roll over at a different real-world moment for players in different regions) and use that single RNG instance for every random decision in the run: enemy spawn timing, drop tables, anything that would otherwise vary between plays. Two separate RNG calls seeded independently will drift out of sync the moment call order changes even slightly between builds, so route everything through one seeded stream.
Guard against exploits that break the "everyone plays the same run" premise
Once there's a leaderboard attached to a specific seed, players have an incentive to find any way to see the run's layout in advance — restarting repeatedly to memorize spawn timing before submitting a "real" attempt, for instance. Some games accept this as part of the mode (the daily is meant to be practiced, not blind); others lock a player's identity to their first attempt of the day and disqualify subsequent tries from the leaderboard. Decide which model fits your game before shipping, because switching after players have built habits around the mode causes real backlash.
The seed itself also needs light protection if it's stored or transmitted client-side — a seed embedded in a readable config file can be reverse-engineered ahead of the challenge's public release, letting a subset of players effectively see tomorrow's run early. This doesn't need cryptographic-grade security for a single-player indie game, but a seed derived from something guessable (like the literal date string with no salt) is trivially predictable, so mix in a fixed application-specific constant before hashing it down to your RNG seed. The NIST publication on random number generation, SP 800-90A, is written for cryptographic contexts but its discussion of seed predictability is a useful mental model even at this much smaller stakes.
Give players a practice option that doesn't touch the leaderboard
Not every session against a daily seed needs to be a scored attempt. A separate "practice" entry point that lets a player replay a past day's seed (or even the current day's, explicitly marked as non-competitive) without submitting a score serves a real purpose: it lets players learn a run's specific pattern layout without the pressure of a single graded attempt, and it gives players who missed a day's window something to do with that seed afterward instead of losing access to it entirely. Storing a rolling history of recent seeds, rather than discarding each one once its day passes, costs very little storage and meaningfully extends the mode's replay value.
Pair the mode with a lightweight leaderboard
A daily challenge without a way to compare results loses most of its pull. It doesn't need to be elaborate — a simple score submission tied to that day's seed, refreshed at rollover, is enough to give competitive players a reason to check back. The implementation details of building that comparison layer are covered separately in leaderboards and high score tables in indie shmups, and the timing infrastructure overlaps with what's discussed in speedrun support for indie games, since both features ultimately need the same reliable, tamper-resistant run-timing foundation.