Skip to content

doom-jev

ViZDoom agent where Jev picks macro goal, target, movement, rotation, jump and fire at about 10 Hz from a YAML situation report.

ProjectprototypeMIT

Overview

DOOM-JEV is an autonomous Doom agent built on ViZDoom and Jev. It decouples the game's native 35 ticks per second from network inference: the simulation loop renders smoothly while an asynchronous inference loop queries Jev at about 10 Hz. Between decisions, a carry-hold actuation layer replays and adjusts actions with geometric tracking so no frames are dropped.

Perception turns the depth buffer, rendered labels and game variables into a YAML situation report using depth sampling, sector raycasting and line-of-sight filtering. Jev answers structured questions for macro goal, target, movement, rotation, jump and fire, returning choices with confidences. A hybrid control layer adds trigonometric aim tracking and a trigger lock, then maps everything to the eight-channel action array. A Rich terminal HUD shows live decisions.

What the decision model decides

TypeQuestionAnswers
ChoiceWhat should the macro goal be?—
ChoiceWhich target should be engaged?—
ChoiceWhich movement / rotation should be applied?—
Yes / noShould the agent jump / fire now?(inferred)yes · no

How it works

  1. Serialise game state into a YAML situation report
  2. Query Jev asynchronously at about 10 Hz
  3. Combine answers with geometric aim tracking
  4. Map to ViZDoom actions every tick

Strengths

  • Smooth play despite network latency
  • Clear split between model decisions and geometric control
  • Live terminal HUD

Caveats

  • Hobby project
  • Requires a TypeSafe key

Getting started

python -m venv jevEnv, pip install -r requirements.txt, set the TypeSafe key, then python main.py.

At a glance

Type
Project
Status
prototype
Language
Python
Runtime
ViZDoom + terminal HUD
Has code
yes
License
MIT

Use cases and integrations

How curated lists describe it

Frequently asked questions

How often does Jev decide?

About 10 times per second, asynchronously from the 35 Hz game loop.

What does Jev control?

Macro goal, target, movement, rotation, jumping and firing.

How is aiming done?

With trigonometric tracking in code, not by the model.

Related projects

  • Source for browser chess and Chess960 where code computes each legal move's facts and Jev picks one per turn as a typed Choice.

    ProjectproductionTypeScript
  • Browser 1v1 sniper arena where Jev reads match state about 9 times a second and chooses movement, aim, ADS, firing and jumping.

    ServicebetaTypeScript
  • Instrumented 2048 web lab where every move is a Jev Choice over four directions, with probabilities, latency and cost shown live.

    ProjectbetaTypeScript
  • Fifteen live arcade games where Jev and LLMs play each other, led by WikiRace in which Jev picks only real links.

    ProjectbetaTypeScript
  • Real-time bot battles where you write a fighter's strategy in plain English and a System One model pilots it several times a second.

    ProjectbetaTypeScript
  • Browser extension that lets Jev, local Laya or an OpenAI-compatible model take over a running ra2web (WannaFire) RTS match.

    ProjectbetaTypeScript