Hadlock/laya-duum

Jev-like Doom Bot proof of concept in python

Python

1

1 commits

updated Sep 22, 2026

See the code

README

Laya Duum

laya duum

laya-duum is a focused, offline demo in which the Laya Core ML decision model plays the pure-Python Duum engine from compact semantic state. Rendered pixels are never sent to the model.

Proof of concept "jev" clone of doom playing system. But using laya. Uses python implementation "duum" and freedoom1.wad.

The repository contains only the Duum adapter, its tests and evaluation artifacts, plus the freely redistributable freedoom1.wad. The Core ML model is used from the sibling laya-coreml checkout so its 649 MB bundle is not copied.

Run

From this directory:

uv sync

uv run --offline laya-duum \
  --pilot laya-assisted \
  --model ../laya-coreml/models/snake

The included freedoom1.wad is the default. To use another legally obtained IWAD, pass --wad /path/to/file.wad.

Useful modes:

# Manual window
uv run --offline laya-duum --pilot manual

# Deterministic headless run
uv run --offline laya-duum --pilot scripted --headless --ticks 600

# Eight paired policy experiments
uv run --offline laya-duum-eval \
  --model ../laya-coreml/models/snake \
  --map E1M1 --ticks 3600

The interactive Laya view uses one window: game in the center, state and controls on the left, and model timing/probabilities on the right. Completed levels advance automatically.

Project boundaries

  • Duum remains an external, pinned engine dependency and imports no ML code.
  • Laya receives semantic snapshots, not the framebuffer.
  • Raw model proposals and deterministic assistance remain separately recorded.
  • Assisted play prioritizes critical health/ammo, restores a usable gun after collecting ammunition, and rejects melee targets blocked by walls or height.
  • Runs are local/offline after dependencies and the model are present.
  • Commercial Doom WADs must never be committed.

See docs/DUUM_INTEGRATION.md for architecture, benchmarking, recording and replay details.

Licensing

Adapter code is Apache-2.0. Duum is MPL-2.0 and remains an external dependency. The included Freedoom Phase 1 IWAD is distributed under Freedoom's BSD 3-Clause license; see FREEDOOM_LICENSE.txt.

Hadlock/laya-duum

Jev-like Doom Bot proof of concept in python

Python

1

1 commits

updated Sep 22, 2026

See the code

README

Laya Duum

laya duum

laya-duum is a focused, offline demo in which the Laya Core ML decision model plays the pure-Python Duum engine from compact semantic state. Rendered pixels are never sent to the model.

Proof of concept "jev" clone of doom playing system. But using laya. Uses python implementation "duum" and freedoom1.wad.

The repository contains only the Duum adapter, its tests and evaluation artifacts, plus the freely redistributable freedoom1.wad. The Core ML model is used from the sibling laya-coreml checkout so its 649 MB bundle is not copied.

Run

From this directory:

uv sync

uv run --offline laya-duum \
  --pilot laya-assisted \
  --model ../laya-coreml/models/snake

The included freedoom1.wad is the default. To use another legally obtained IWAD, pass --wad /path/to/file.wad.

Useful modes:

# Manual window
uv run --offline laya-duum --pilot manual

# Deterministic headless run
uv run --offline laya-duum --pilot scripted --headless --ticks 600

# Eight paired policy experiments
uv run --offline laya-duum-eval \
  --model ../laya-coreml/models/snake \
  --map E1M1 --ticks 3600

The interactive Laya view uses one window: game in the center, state and controls on the left, and model timing/probabilities on the right. Completed levels advance automatically.

Project boundaries

  • Duum remains an external, pinned engine dependency and imports no ML code.
  • Laya receives semantic snapshots, not the framebuffer.
  • Raw model proposals and deterministic assistance remain separately recorded.
  • Assisted play prioritizes critical health/ammo, restores a usable gun after collecting ammunition, and rejects melee targets blocked by walls or height.
  • Runs are local/offline after dependencies and the model are present.
  • Commercial Doom WADs must never be committed.

See docs/DUUM_INTEGRATION.md for architecture, benchmarking, recording and replay details.

Licensing

Adapter code is Apache-2.0. Duum is MPL-2.0 and remains an external dependency. The included Freedoom Phase 1 IWAD is distributed under Freedoom's BSD 3-Clause license; see FREEDOOM_LICENSE.txt.

Languages

Python

100.0%