I train Among Us bots in a simulator of the game. A crew walks the ship doing tasks and votes out suspects in meetings. Hidden impostors kill, travel through vents (tunnels only impostors can use) and sabotage the ship, including shutting a room's doors for 10 seconds. The bots learn by self-play in leagues, each league a roughly ten-hour training run that starts from the bots the previous league ended with.
The simulator decides where players can stand with a grid of 126 by 70 tiles. The grid comes from the map file of an open-source web clone of the game, MIT-licensed and written by a third party. I used it because it was there and it matched the ship's layout room for room. It is also wrong, in a way I only saw once the replays were drawn on the real game's art: a crewmate jogging along the top of a corridor with its feet on the corridor's back wall. Measured against the game's own collision data, the clone's floor is 1.75 times too big.
Where the real floor comes from
Among Us is a Unity game, and the 2018 Android build ships its levels as Unity asset files inside the APK (the Android app package). The ship is a single prefab (a saved Unity object tree) called ShipStatus. Alongside the artwork, it carries the colliders the physics engine uses to stop players walking through things. I read them out of the APK with UnityPy, a third-party Python library for Unity asset files, without running the game. There are 79 wall outlines, which are edge colliders along the edge of every room and corridor. There are also 33 solid obstacles: the Cafeteria tables, the MedBay beds, the engines, Navigation's chairs and a few task consoles.
The player prefab supplies the other number that matters. A player is a 0.7-scaled object with a circular collider of radius 0.2234 at its feet. So the centre of a player's feet can never get closer than 0.156 units (Unity's unit of distance) to a wall or an obstacle. One unit is 2.646 of my simulator's tiles (from aligning a render of the ship with the clone's map), which makes the clearance 0.41 tiles.
The rebuild draws every outline and obstacle into a grid eight times finer than the simulator's tiles. It flood-fills the inside of the ship from a known floor point, then removes everything within the foot clearance of a wall or obstacle. A tile is walkable if its centre survives. Two details mattered. The outlines had to be drawn three sub-cells thick, because two outlines meeting at a corner can leave a gap finer than one sub-cell; the first version's flood fill escaped through one and filled the outside of the ship. And 56 tiles of floor that were not connected to the rest were dropped. The build would also force each of the 14 vent grilles onto the floor, since the game snaps a player's feet onto a grille to enter it, but in the final build none needed it.
How wrong the old floor was
| walkable tiles | |
|---|---|
| the clone's map | 3,314 |
| the game's colliders | 1,894 |
| on both | 1,867 |
| on the clone's map only | 1,447 |
| on the game's colliders only | 27 |
Every room shrank, unevenly. Eight of the 21 rooms and corridors, the worst and best by the ratio of old to new walkable tiles:
| room | old | real | old / real |
|---|---|---|---|
| O2 | 98 | 32 | 3.06 |
| Weapons | 180 | 78 | 2.31 |
| Shields | 133 | 58 | 2.29 |
| Upper Engine | 110 | 48 | 2.29 |
| Cafeteria | 658 | 351 | 1.87 |
| MedBay | 142 | 105 | 1.35 |
| central hall | 253 | 196 | 1.29 |
| Storage | 162 | 147 | 1.10 |
The pattern is what the replays suggested. In a corridor, the clone's map counts the whole drawn height as floor. That includes the band of wall panels along the top, which the game draws as the back wall, so a corridor loses that band plus the foot clearance on each side. Rooms full of furniture lose the furniture; on the clone's map you could walk straight across the Cafeteria tables. Storage, an open room with crates mostly along its edges, barely changed.
Before switching, I checked that nothing the simulator depends on fell off the new floor. All 14 vents are on walkable tiles. Every task station moved by at most 3 tiles, to the nearest real floor in its own room. Each of the 7 rooms with doors still cannot be walked into from outside while its doors (13 in all) are shut. Impostors can still vent into some of them, as in the game.
How much it changed the game
I do not know precisely, which is the honest answer. The bots were trained on the old floor and played on the new one without retraining. I played 40 games on each floor with the bots from my fourth league, 15 players and 3 impostors, using a fixed random seed so the run repeats exactly:
| floor | crew wins | tasks done | kills per game | vents per game |
|---|---|---|---|---|
| clone's map | 36 of 40 | 69% | 5.8 | 3.3 |
| game's colliders | 34 of 40 | 65% | 6.0 | 3.6 |
Two games in 40 is within what a different seed could produce. But an earlier unseeded test, also 40 games each, with the same league's bots taken at an earlier checkpoint and an earlier version of the simulator, measured the crew at 78% on the old floor and 68% on the new one. Forty games cannot separate a 2-point effect from a 10-point one, so the effect is somewhere in that range. Either way it is far smaller than a factor of 1.75 in walkable floor suggests. My guess at why is that the bots decide between rooms rather than between tiles. A room's neighbours, its vents and the walking distance between rooms are close to unchanged, so the floor mostly changes where a player stands inside a room rather than where it goes.
I switched anyway. The simulator is meant to model the real game, and the old floor was visibly wrong in every replay, whatever it did to the win rate. Training since then has used the real floor, and the old one remains available for comparison with older runs. My fifth league, the first to train on the new floor, later collapsed for reasons I could not separate from the floor change, which is a separate post.
The simulator, the extraction and the rebuild were written by Claude Code at my direction, and the corridor wall-walking was something I spotted in the replays. The code is not public, and the extracted game data and art stay on my machine. The figures above come from the rebuild script's output and a seeded comparison script; anyone with the 2018 APK and UnityPy can read the same colliders.
What I take from it is that a simulator can be wrong by a factor of 1.75 in a quantity that sounds fundamental and still produce similar outcomes. Outcome metrics are a poor check on whether a simulator is faithful. The check that found this was looking at the picture.
Top comments (0)