Build Valorant as a top-down browser game: five attackers carrying the spike against five defenders, abilities on cooldown, credits between rounds, first to 13. Not a tribute page — a match somebody can open, buy a Vandal and a flash, take a site, plant, and win.
What makes this Valorant rather than a bomb-defusal shooter with a new coat: the abilities and the economy are the game. A round is decided by a flash into a smoke as much as by aim, and this runtime happens to be good at exactly that — cooldowns, charges, timed zones and ult points are all server-side state, which is the part that survives being top-down.
The game
5v5, attack and defend. Bots fill empty seats and must use their abilities, not just walk and shoot. Sides swap at 12; first to 13 wins.
The spike. 100s round timer, 4s to plant, 45s fuse, 7s to defuse with a checkpoint at half — a defender who gets 3.5s in and is killed leaves the defuse half-done for the next one. That checkpoint is a real mechanic; do not skip it.
Agents with kits. Four or five is plenty, each with two basic abilities (bought with credits, charges per round), one signature (free, on cooldown) and one ultimate charged by ult points from kills, spike plants and orbs. Make them actually different: a flash that blinds by facing angle, a smoke that blocks line of sight for its duration, a recon dart that reveals enemies caught in its sweep, a heal or a wall. Line of sight and blindness must be computed on the server — a client that decides it can see through a smoke is not evidence.
Credits. 800 to start, 9,000 cap, +200 a kill, +300 to the team on a plant, loss bonus rising 1,900 / 2,400 / 2,900. Buy phase before the round, and a buy you cannot afford is refused server-side.
Guns. Classic, Ghost, Sheriff, Spectre, Phantom, Vandal, Operator — damage by hit location with armour, and a Vandal that one-taps a head at any range while a Phantom does not.
One map, built for sites. Two sites, a mid, and a flank each — angles that make a smoke or a flash worth buying.
Order of work — and the rule that comes before all of it
A person opening the preview at any moment must get something playable within seconds. The last build of this shape (cs) ended a match, set a winner, and then parked in its post-round phase forever, so every later visitor found a frozen board. Whatever else you do: an ended match shows its result and then starts a fresh one, and someone joining mid-match gets a live seat or the next round.
Round loop, movement, shooting, hit detection against bots — server-authoritative.
The spike: carry, plant, defuse with the half-checkpoint, and every win condition.
Abilities and credits: buy phase, charges, cooldowns, ult points, and server-side line of sight for smokes and flashes.
Real multiplayer: two browsers in one match, a scoreboard, swap at 12, first to 13.
Land them in that order and keep it playable at every commit. If the budget runs short, stop on a working milestone and say so — a real 1v5 with a plant and one working flash beats four half-finished systems.
The bar
AGENTS.md is the standard: zero dependencies, bun:sqlite, all state under FORGE_APP_DATA, the security floor in src/server.ts untouched, no inline scripts (the client is a file under static/, named by content). Split by concept — src/match.ts, src/abilities.ts, src/weapons.ts, src/map.ts, src/bots.ts — and keep src/server.ts to the door.
The damage table, the economy, the cooldowns, the ult points and the win conditions are pure functions. Test them as such, and make sure each test would fail if the rule were removed. Your pull description is the handoff: which milestones landed, what is stubbed, and what to do in the preview's first thirty seconds.
Build Valorant as a top-down browser game: five attackers carrying the spike against five defenders, abilities on cooldown, credits between rounds, first to 13. Not a tribute page — a match somebody can open, buy a Vandal and a flash, take a site, plant, and win.
What makes this Valorant rather than a bomb-defusal shooter with a new coat: the abilities and the economy are the game. A round is decided by a flash into a smoke as much as by aim, and this runtime happens to be good at exactly that — cooldowns, charges, timed zones and ult points are all server-side state, which is the part that survives being top-down.
The game
Order of work — and the rule that comes before all of it
A person opening the preview at any moment must get something playable within seconds. The last build of this shape (
cs) ended a match, set a winner, and then parked in its post-round phase forever, so every later visitor found a frozen board. Whatever else you do: an ended match shows its result and then starts a fresh one, and someone joining mid-match gets a live seat or the next round.Land them in that order and keep it playable at every commit. If the budget runs short, stop on a working milestone and say so — a real 1v5 with a plant and one working flash beats four half-finished systems.
The bar
AGENTS.mdis the standard: zero dependencies,bun:sqlite, all state underFORGE_APP_DATA, the security floor insrc/server.tsuntouched, no inline scripts (the client is a file understatic/, named by content). Split by concept —src/match.ts,src/abilities.ts,src/weapons.ts,src/map.ts,src/bots.ts— and keepsrc/server.tsto the door.The damage table, the economy, the cooldowns, the ult points and the win conditions are pure functions. Test them as such, and make sure each test would fail if the rule were removed. Your pull description is the handoff: which milestones landed, what is stubbed, and what to do in the preview's first thirty seconds.