Skip to content

The Field Layout as Data

 5 min One speedball field layout, followed from memorized real fields through two VR products to a PNG codec on PyPI.
Published

Mar 19, 2025

I first learned speedball layouts by walking real paintball fields. Years later I worked with them in VR: as a player, a server operator, and a game developer. The same arrangement of bunkers became a saved file, an operational concern, and eventually a format I could convert and test.

Before the layout was a file

Speedball is the tournament format of paintball: a small symmetric field of inflatable bunkers, rearranged per event. The layout is not scenery. Which bunker is reachable on the break, which lanes cross, where a snap shot is safe—the layout decides most of what a team can do, which is why competitive teams learn one by walking it: you pace the real field before an event, finding the lanes and bounce shots no diagram shows.

In the early 2000s I lived in Kasson, Minnesota, and played on a team there in high school. That was the layout’s form for us: an arrangement of inflatables on a field, and whatever we remembered afterward. My first website was for that team; the layouts we practiced were still something we learned on the field.

The return: operations first

A room set up for VR speedball practice: two VR controllers built into white PVC-pipe marker shapes rest against a wall beside a small tower, and a rectangular play boundary is marked out on the carpet with blue painter's tape.

The home practice space, with its boundary taped onto the carpet.

Two white VR controllers held in black sleeves with metal hose clamps, each attached to a curved white PVC-pipe assembly with elbow fittings.

The PVC controller mounts up close.

In 2022 the sport reappeared as VR speedball—league play conducted on real event layouts, including NXL World Cup 2021, and a dedicated-server network I founded, Snap Game Services, running public lobbies for the game the league played.

At snap.gs, the matches became data—the supervisor parsed every match out of the game’s own log stream and kept it as timestamped JSON—but the layout itself still lived inside a closed game binary. The closest it came to the surface was the sales pitch. The private-lobby page sold layout knowledge as the product:

Grind new layouts long before you or most others play them first hand

Know the layout with confidence and breakout roles instinctually.

Twenty years on, the field-walking had moved into a headset. The layout still had no file the server network controlled or exposed, but the instrumented matches are what unlocked everything in my mind.

The physical side was still improvised. The controller mounts used curved PVC pipe and elbows, with black sleeves and hose clamps holding the controllers in place. I designed them to sit in my hands roughly the way I hold a paintball marker. It mattered to me that anything I learned in VR would transfer to a real field. I even disabled snap turning, so that to turn I had to physically rotate.

A file a player could carry

I did not know about Grit until after that season of league play. Grit Paintball had brought a field builder and saved layouts to VR in 2020, when Deadbolt Custom Works released the trainer.

A top-down field-layout editor on a green speedball field grid. Blue and white inflatable bunkers are placed in a symmetric pattern between 'home' and 'away' end zones. A bunker palette runs across the top; a Load dropdown reads 'NXL Amsterdam 2019'; Clear, Load, Save, and Toggle Grid controls line the bottom with editing instructions.

Grit’s field builder with NXL Amsterdam 2019 loaded.

The current store describes those saved layouts as small text files players can exchange outside the game. Players were already exchanging event layouts when I became a co-owner through my small business, Infima Labs.

The layout becomes a public format

layoutc is where the layout becomes public, inspectable, source-controlled data rather than a file exchanged through a closed product. One source commit added a collection of NXL event layouts from 2018 through 2022. The World Cup 2021 file stores each bunker as a flat JSON record like this one:

{
  "bunkerID": 8,
  "xPosition": -15.107666,
  "yPosition": -8.583069E-06,
  "zPosition": 11.1680164,
  "xRotation": 0.0,
  "yRotation": 90.0,
  "zRotation": 0.0
}

The file preserves the source coordinate system directly: decimal positions, a y-position sitting a rounding error below zero, and rotation in degrees. The format is small enough to inspect and diff. layoutc treats it as an interchange problem rather than an editor format: the Python library and CLI convert between JSON, PNG splatmap atlases, and TSV with explicit units, entity groups, orientation, and round-trip semantics.

# Convert a single layout to PNG atlas for efficient storage
layoutc src/layouts/NXL-World-Cup-2021.json world_cup_2021.png

# Convert PNG atlas back to JSON for editing
layoutc world_cup_2021.png world_cup_2021_copy.json

# Output all layouts as TSV to stdout (pipe-friendly)
layoutc src/layouts/*.json -

The World Cup 2021 layout as layoutc’s 120 by 96 pixel PNG: a few dozen single colored pixels in a symmetric pattern on transparency, each one a bunker. The PNG form is the part worth pausing on. Each occupied pixel is one bunker: the pixel’s position gives its coarse location, the red and green channels carry the sub-pixel remainder, blue is rotation, alpha is identity—transparency is literally empty field. A regulation 150-by-120-foot field at 381 millimeters per pixel becomes a 120-by-96 image that restores every bunker to within about a millimeter and a half. The image looks like the field it encodes, and it is the file format. The channel scheme has its own note, layoutc’s PNG codec.

I chose that pitch because it filled the possibility space so well. 381 millimeters is exactly 15 inches, so a layout round-trips and converts cleanly between US customary and metric units, and it lines up with every regulation number I know in paintball, field sizes and layout grids included; the codec’s 320-foot maximum extent is 256 pixels. Each layout layer holds one entity per pixel. The color channels preserve a bunker’s position within its pixel, but they cannot preserve a second entity in the same cell. Skinny targets placed closer together may therefore need a finer pitch or a different layer; the bunker encoding itself round-trips within its intended tolerance.