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) | Enter a target · crack a case · leave by a door · sell at a fence |
| Mouse / Space | Aim and fire |
| 1–7 | Switch weapon · buy it at an armory |
| Tab | Open your bag — weights, values, drop items |
| R | Buy rounds at an armory · restart anywhere else |
| M | Full map (or click the minimap) |
| 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
- The bag holds 20kg. Bearer bonds are worth eighteen thousand a kilo; a coin bag is worth a hundred and twenty-five. What you leave behind is the real decision. Tab opens it.
- Money is for guns. The snub .32 takes six hits to drop anyone and barely reaches. Armories license seven better ones — the licence is the expensive part, replacements are cheap. The three best weapons are not sold at any price: crates only, they are not on any map, and losing one is permanent.
- Robbing happens inside. Walking into a target takes you in. Crack the cases, then leave by a door — the alarm arms when you take the first one, and the police cover the doors one at a time after that.
- 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.
Robbing is a room, not a timer
Standing next to a building for thirty seconds is the least interesting thing a player can do. Walking into one puts you inside it: caches to crack, two or three doors out, and an alarm that arms the moment you take the first one. From then on the police cover the doors one at a time — never the last one, because being sealed in is a cutscene, not a decision. The question stops being "can I wait long enough" and becomes "which way out is still open".
Greed is the real timer
Every cache is optional. Take one till from the liquor store and walk out clean; stay for the second and the alarm beats you to the door, turning a silent job into two stars. The bank has four, and it is already ringing when you walk in.
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. |