Zero Delphi knowledge required — and no Delphi compiler either. The DelphiQuake mirror ships both the source and a pre-built bin/dquake.exe with its .map file, so you can clone, run, and debug without installing Delphi 12 CE (or any Delphi). Install the plugin, clone the demo target, ask your AI agent to debug a frame-render — the agent downloads the data, sets the breakpoint, drives the menu, and walks you through the BSP load that fires when E1M1 starts.
Two prerequisites: a Windows host with an interactive RDP desktop (the rdbg daemon needs GDI for capture and input), and an AI agent with the rdbg plugin installed (Claude Code is the only shipped install path today; see Getting started for the details).
You do not need Delphi installed. The dquake.git mirror ships the source and the pre-built bin/dquake.exe (with its bin/dquake.map for symbol resolution). Delphi 12 CE only enters the picture if you want to recompile the source after editing it — the demo as written never touches the compiler.
Two slash commands inside Claude Code (the only shipped install path) — the marketplace + the install:
/plugin marketplace add https://sundaymorning.app/rdbg/.claude-plugin/marketplace.json
/plugin install rdbg-debugger@rdbg
The plugin bundles all five rdbg binaries (daemons, CLI, GUI, MCP bridge) — nothing else to download. Already installed? Skip to step 2. Need the long version? See Getting started → Install in 2 steps.
One git clone. ~5 MB of source plus a working bin/dquake.exe (the DelphiQuake port of id Software's Quake 1 engine). Static-file git mirror — no GitHub auth, plain HTTPS:
git clone https://sundaymorning.app/rdbg/dquake.git
cd dquake
Inside you'll find Pascal source (rendering, BSP loader, networking, the lot), bundled binaries under bin/, and scripts/fetch-quake-data.cmd — a small helper your agent will run for you in step 3 to grab the freely-redistributable Quake shareware data file.
Paste this into your agent's chat (Claude Code, etc.):
Set up the dquake demo: run scripts\fetch-quake-data.cmd to download the Quake shareware data, then launch bin\dquake.exe under rdbg, set a breakpoint at Mod_LoadBrushModel in model.pas, drive the menu to start episode 1 mission 1, and walk me through the BSP load when it hits.
First run downloads ~18 MB of Quake shareware data (one time, cached); the BP fires within seconds of E1M1 starting. The transcript below shows what your agent actually does.
Real chat transcript shape — the same MCP tool calls your agent makes when you paste the prompt above. Compressed for readability; actual session is a couple of minutes end-to-end.
Agent: Setting up the demo. First, the data file.
tool: Bash(cmd /c scripts\\fetch-quake-data.cmd)
→ [fetch-quake-data] Downloading...
→ [fetch-quake-data] SHA1 OK.
→ [fetch-quake-data] id1\\pak0.pak ready (18689235 bytes).
Agent: Data fetched. Setting the BP and launching.
tool: mcp__rdbg__set_breakpoint(source="model.pas", symbol="Mod_LoadBrushModel")
→ {"ok":true, "bp_id":1, "resolved":"Mod_LoadBrushModel+0x0 at model.pas:984"}
tool: mcp__rdbg__launch(exe="bin\\dquake.exe")
tool: mcp__rdbg__continue() (past the loader BP)
Agent: Menu's up. Driving it: New Game → Easy → Episode 1 → The Slipgate Complex (E1M1).
tool: mcp__rdbg__send_keys(target="dquake", text="\\n") ×3 (menu nav: New Game / Easy / Episode 1)
tool: mcp__rdbg__events(timeout=30)
→ {"event":"breakpoint_hit", "bp_id":1, "tid":7892, ...}
Frames: model.pas:984 Mod_LoadBrushModel+0x0 → model.pas:712 Mod_LoadModel+0x14a → cl_main.pas:382 CL_ParseServerInfo+0x4c
Agent: Hit. Inspecting the model_t struct mid-load.
tool: mcp__rdbg__get_self() → RCX = model_t* at 0x023f9a0c1080
tool: mcp__rdbg__inspect_object(addr="0x023f9a0c1080", max_depth=2)
→ model_t {
name = "maps/e1m1.bsp"
numvertexes = 1789, numedges = 2742, numfaces = 1289
numleafs = 678, numplanes = 821, numclipnodes = 1543
flags = 0x00, type = mod_brush
mins = (-2096, -1376, -296) maxs = (2128, 1408, 384)
}
Agent: Paused at the BSP load for E1M1 (The Slipgate Complex). The map has 1,789 vertices, 2,742 edges, 1,289 faces, 678 leaves, and a bounding box of about 4200×2800×680 units — typical Quake 1 map complexity. The lump-parsing loop is right above us in the call stack; if you want to step into a specific lump (faces, planes, clipnodes) I can break in Mod_LoadFaces / Mod_LoadPlanes / etc. Or I can continue through the load and break in R_RenderView to walk a frame render once the map's fully ready. Which do you want?
dquake exercises every interesting corner of a real engine. Once you've run the BSP-load demo, here are five other things to ask your agent:
"Set a BP at R_RenderView in r_main.pas, let dquake reach gameplay, then step me through one frame — show me the BSP traversal and which faces fall in the view frustum."
"Break in CL_SendCmd in cl_input.pas and show me what one user-input tick looks like on the wire — movement, view angles, button bits."
"Run dquake.exe with set_exception_filter(first_chance: true) and tell me about every exception that fires during a 60-second gameplay session, even the ones the engine catches."
"Launch dquake, wait for the main menu to paint, screenshot the main form and describe what you see."
For multi-step investigations, ask your agent to invoke the bundled bug-hunter subagent — it runs the read → hypothesise → reproduce → inspect loop autonomously and returns a tight diagnosis. Full recipe library in the Agent guide.
The fetch script prints a clear error if the Internet Archive request fails (firewall, DNS, IA outage). Manual fallback: download QUAKE_SW.zip in a browser, extract QUAKE_SW/ID1/PAK0.PAK, copy it to id1\pak0.pak in the dquake clone. Re-run the demo prompt — the script detects the pre-existing pak0.pak and skips the download.
Run /rdbg:status in Claude Code to confirm. If it says daemon unreachable, run /rdbg:start-daemon for the manual start instructions, and make sure your agent's host is running from inside an interactive RDP desktop (Session 2+, not Session 0 — the daemon refuses to spawn from headless / service contexts).
The dquake.git mirror ships bin/dquake.map (built with dcc32 -GD) alongside bin/dquake.exe. Confirm both files are present after the clone. If the symbol your agent tries to break on doesn't resolve, ask it to list_breakpoints — the response shows what the daemon was actually able to find.
dquake uses DirectDraw for the game viewport, which bypasses the GDI compositor that capture_window reads from — so screenshots of the gameplay viewport come back as a black PNG. Workaround: drive the engine's text console (BP at Con_Printf) for state inspection, or screenshot the menu (which is GDI-rendered and captures correctly).
The same workflow runs against any Delphi target you can launch — your own apps, third-party tools, anything with a .map file. Get rdbg, point your agent at your codebase, describe the bug.