Craft: Jev FPS levels
Jev FPS is a first-person arena shooter that Jev plays by itself, one typed decision at a time. You
shape the arena in level.json. The craft is a map that reads well in 3D and a pace that shows the
real limit: about nine decisions a second.
What Jev is asked, every tick
One call, four questions, all answered in parallel from the same state text:
turn choice LEFT_HARD LEFT LEFT_FINE AHEAD RIGHT_FINE RIGHT RIGHT_HARD
move choice FORWARD BACK STRAFE_LEFT STRAFE_RIGHT HOLD
fire noul "Fire now? Yes only when a demon is in your crosshair and you have ammo."
threat score calm < watchful < pressed < critical
The state text is what a player could know: health, ammo, wall distances, each demon in sight with its bearing and distance, the nearest demon it can hear but not see, the automap route, and whether the crosshair is on a demon. The pane shows this text live under "What Jev reads".
Drawing a good map
- Tiles:
#stone,%tech panel,=hell brick,.floor,Pstart,Ddemon spawn,Mmedkit,Aammo. The border must be wall. Every row is the same width. - Give sight lines of 5 to 9 tiles. Very long halls make it a shooting gallery. Tight mazes hide demons until they are biting.
- Put spawns on at least two sides of the start so Jev must turn to deal with them.
- Pillars (single wall tiles in a room) make demons split and flank, which is fun to watch.
- A level of about 24 by 16 fills the minimap nicely. Bigger maps mean long quiet walks.
Setting the pace
demonSpeed is the dial. Demons weave as they charge, so speed is also how fast they cross the
crosshair. Each wave adds one demon and 12% speed, so every run ends when the pace passes what nine
decisions a second can handle.
| feel | demonSpeed | demons |
|---|---|---|
| a stroll, long runs | 0.8 | 3 |
| the default | 1.2 | 4 |
| tense from wave 1 | 2.4 | 5 |
| brutal | 4.0 | 8 |
tickMs changes the decision rate itself. Raising it to 250 shows what a slower decision loop
costs: the same demons now win much earlier.
Verifying
node "$JEV_DSH/toolchain/check.mjs"
Then watch the pane and read .harness/verdict.json: wave, kills, deaths, best wave, shots on
target. Report the pace you chose, how far Jev gets, and the speed where it stops clearing waves.
The pane's MOCK badge means the offline stand-in is playing, not the real model. Say so when you
report.