Field-tested spatial game prototype
An iOS spatial game prototype that turns noisy location data, roads, nested zones, and physical movement into a stable interaction system.
RelicWorld documents the earlier spatial-game work: road-aware target placement, nested zones, noisy GPS boundaries, carrying state, and field testing outdoors. The current Roblox multiplayer project grew from the same systems mindset, but it now stands on its own as BunkerBattle.
A live outdoor environment is the most hostile design surface there is: no level designer authored it, GPS drifts by the second, and the map doesn’t know which side of a fence you’re on. The engineering challenge isn’t the game — it’s turning raw, noisy sensor input into an interaction layer that is fair (objectives never land somewhere unreachable), safe (play stays away from traffic and private property), and deterministic (the same physical action always produces the same state), all without backend authority or an asset pipeline.
RelicWorld is where I worked that problem — progressively evolving an iOS prototype from a simple coordinate-proximity check into a three-phase spatial state machine.
RelicWorld began as WorldTag, an earlier iOS spatial prototype, and was later revisited as a more structured location-based gameplay system. The rebrand — naming only, no gameplay change — marks the shift from spatial-tagging groundwork toward a playable capture-the-flag application layer. Residual “WorldTag” references in the repository are historical.
WorldTag · the baseline
v0.2-road-aware-mvp · v0.2-worldtag-prototype
RelicWorld · the revisit
feature/zone-foundation · zone-foundation-v1
The world model is a set of nested spatial containers with hysteresis buffers on every boundary — the structure that makes noisy GPS behave like a stable game state.
What keeps the machine legible is a deliberate separation between three kinds of state, each with a single owner.
Game phase layer
The run state machine — setup → pursuing → carrying → completed — plus a separate retry-lockout flag for a compromised escape.
World object layer
The placed entities — base, zone, chamber, relic, hazards — as fixed coordinates and radii, independent of the player’s phase.
Derived spatial layer
Live computed relationships — distances, bearings, containment, and the active target — recomputed each location update, owning no persistent state of its own.
The phases map cleanly to the loop: Explore (.pursuing) approaches with coarse guidance; Trigger fires on chamber entry — auto-pickup, hazards placed; Escape (.carrying) routes toward the nearest zone-boundary exit, and crossing it while carrying lands .completed.
The decisive lessons came from walking the prototype around an actual block, not from the simulator.
RelicWorld demonstrates a way of working with messy physical systems: define rules people can understand, test those rules against real behavior, and keep iterating when reality disagrees with the design. The field work here became part of the product lineage that later informed BunkerBattle, while remaining a distinct spatial prototype.
Captured on-device while walking the prototype around a real block — showing zone reveal, carrying state, and retry lockout without exposing live coordinates or identifiable map detail.

Zone reveal
Entering the zone reveals the relic and shifts the interface from broad guidance to target-specific tracking.

Carrying state
Once the relic is acquired, the target changes from retrieval to escape, proving the gameplay loop is driven by state.

Retry lockout
A failed run requires physically exiting the zone before retrying, preventing rapid state-flapping and reinforcing real-world movement.
On-device captures from outdoor field testing.