One mechanic, built twice
The chase
is the game
Your wanted level only cools off while nobody can see you — and being spotted resets the timer rather than pausing it. That single rule turns a map with no scripted content into a pursuit game.
Your runs
| When | Banked | Jobs | Fenced | Busts | Missions | Length |
|---|
How to play
Four rules. The rest is nerve.
Controls
| WASD / arrows | Move |
| E (hold) | Rob a target · sell at a fence |
| Mouse / Space | Aim and fire |
| Shift (hold) | Sprint — about 3 seconds, refills slowly |
| F | Fullscreen |
| Esc | Pause |
| R | Restart |
On a phone: drag the stick to move, ROB to rob and sell, RUN to sprint, FIRE to shoot at the nearest threat.
The four rules
- Tills pay cash, vaults pay goods. ATMs and registers hold money — it goes straight into your account. The jewelers and the bank pay in merchandise and marked bills, which are worth nothing until a fence launders them.
- Arrest costs you the whole bag, plus a fifth of what you already banked. Cash you already banked is safe; goods in your hands are not.
- Stars only fall while nobody can see you. Being spotted resets the timer to zero rather than pausing it, so a block between you and a cop is worth more than distance.
- Hideouts are safe, both ways. Cops hold a cordon beyond your weapon's reach and cannot shoot or arrest you inside — and you cannot shoot anything still inside that cordon either. Heat falls 4.5× faster in there, but you cannot sell, so cooling off and cashing out pull you to opposite ends of the map.
- One cop seeing you tells the others. Past four stars it goes out to every unit on the map — and a gunshot always does, seen or not.
Why this loop works with nothing else in it
Most crime games spend their budget on content: vehicles, a city, a shop. This one spends it on two timers — how long until you cool off, and how long you have to stay still to turn loot into money.
Stars are a visible reputation
A number every other player can act on. It turns a solo action — robbing a till in an empty corner — into a social one, without a single line of authored content.
Roles emerge from that number
Nobody picks a class. A robber at zero stars is indistinguishable from a bystander. You become prey by doing something, and stop being prey by getting away with it.
Shooting is an exit, not a plan
You have a pistol, and cops shoot back at three times your rate. Standing your ground in the open gets you arrested in about a second; backing away while firing works, but costs two stars per unit and most of your health. Gunfire is also loud — every unit on the map hears it and gets your position, whether or not anyone could see you.
Two and a half D, not dots
Buildings are extruded prisms: each roof is pushed away from the center of the screen in proportion to its height and the exposed sides are filled in, which fakes a camera sitting above and behind you. Roads are derived from the gaps between blocks rather than drawn separately, so editing the map cannot leave lane markings floating over a wall.
Cash or goods
An ATM holds cash, so robbing one pays you immediately — there is nothing to carry and nowhere to walk. The jewelers and the bank pay four to sixteen times more, but only in merchandise and marked bills, and those are worth nothing until a fence takes them. The bank sits a long, exposed walk from anywhere you can sell.
Sprint is a resource
Three seconds of burst, and slower to refill than to spend. At six stars a cop moves 198px/s against your 200 — without a sprint the top of the heat curve would be a formality, and with it escaping becomes something you have to spend well.
The handover is the trap
Cashing out is a stand-still timer, so the fence is exactly where a chasing cop catches you. The nearest fence is rarely the right one.
Jobs teach, then escalate
Eight contracts in order: crack a till, move the goods, lose the heat, take the bank. Each one introduces exactly one idea, and the last few just raise the stakes on a loop you already understand.
The numbers
Identical in the browser build above and the Roblox build below — both read the same table. These are the only values worth arguing about.
| Target | Time | Payout | Heat quiet / seen | Cooldown |
|---|---|---|---|---|
| ATM | 6s | $150 | 5 / 14 | 40s |
| Liquor store | 12s | $500 | 11 / 26 | 90s |
| Jewelers alarm | 18s | $1,200 | 30 / 44 | 140s |
| Bank alarm | 30s | $2,500 | 52 / 70 | 180s |
| Fence (cash out) | 2.5s | — | — | — |
Stars are earned, not handed out
There is no per-crime star value. Crimes add heat, and the star bands roughly double as they climb — 10, 28, 60, 115, 210, 380. Robbing every target on the map while someone watches you do it only reaches four stars. The top two have to be earned with minutes of unbroken contact with the police.
Being seen is the whole cost
A quiet ATM job costs 5 heat — not a single star. The same job with a cop watching costs 14. The jewelers and the bank carry silent alarms that count as a witness however cleanly you played, which is exactly why they pay the most.
Arrest — the whole bag, plus 20%
Getting caught costs everything you are carrying and a fifth of what you already banked. The carried loss is the punishment that matters; the banked one just stings.
Sight radius — 90 studs
How hard it is to break contact. Lower makes escapes trivial and stars meaningless. Higher makes stars feel permanent and stops anyone robbing the bank twice.
The Roblox build
The same loop as a multiplayer server game, where the cops are other people rather than
three lines of steering code. Source is in roblox/ in this repo.
What it ships with
- Six-star wanted system with sight-gated decay
- Three crime tiers, server-timed, per-target cooldowns
- Player cops: crime alerts, wall-hack highlight on wanted players, 9-stud arrests
- Arrest takes 40% and jails; dying costs 25% and keeps your stars
- Cash persists to a DataStore, with a no-save guard after a failed load
- The whole arena is generated from code at server start
What it deliberately skips
- NPC police — pathfinding a dozen NPCs eats the entire schedule, and being chased by a person is better anyway
- Vehicles — Roblox car handling that feels good is a multi-week problem on its own
- A modeled city — months of art; generated blocks give a real chase arena today
- Combat and a shop — cash accumulates, but there is nothing to spend it on yet
The security rule that matters
Roblox clients are hostile. The client never sends an amount — only “I triggered this prompt”. Payouts are read server-side from config, keyed by the target’s own attribute. Cash and stars live in Player Attributes, which replicate down and cannot be written back, so there are exactly two remotes in the game and neither accepts a number.
-- the whole trust boundary, in one line
local balance = DataService.AddCash(player, crime.Payout)
-- ^ from Config, never from the client
Tested outside Studio
A mock Roblox API plus a virtual clock lets the real server bundle boot under a plain Lua VM, so a 30-second bank robbery is testable in under a millisecond. 55 assertions cover payouts, cooldowns, leash cancels, decay timing, arrest maths, jail, and malformed remote payloads.
npm install fengari
node tools/run_tests.js
# 55 passed, 0 failed
What this actually cost
Both builds, honestly scoped. The expensive parts are the ones nobody sees.
| Piece | Solo effort | Where the time goes |
|---|---|---|
| Move, camera, one map | 1–2 weeks | Fastest part. Feels like progress, isn’t. |
| Multiplayer sync, 8 players | 4–8 weeks | Free on Roblox. Months in the browser. |
| Server-authoritative hits | 4–8 weeks | Lag compensation. Get it wrong and every player feels cheated. |
| NPC police at scale | 3–6 weeks | Skipped on purpose in both builds. |
| Art volume | months | The real killer. Code is tractable; a city is not. |
| Anti-cheat, persistence, mod tools | 2–3 months | Invisible when right, fatal when wrong. |