Skip to content

Engine debug facilities the lab has never used: adopt edicts, reject host_timescale #255

Description

@saworbit

#254 covered the pointfile channel. This is the rest of the sweep: what else the engine already carries that the lab has never used. Every item below was confirmed present in engine/quakespasm.exe, and the three verdicts at the bottom were measured, not assumed.

Adopt: edicts

edicts walks the progs field definitions and prints every edict with all non-default fields. That includes our own. Confirmed live on a dm4 spawn: ar_isbot, ar_slot, ar_clientno, ar_moveyaw, ar_aimerr, ar_aimrate, ar_reactbase, ar_warmor, ar_wheal, ar_wpow, ar_wweap, ar_nextstall, ar_lastpos, ar_chain.

Mid-match that becomes ar_node, ar_goal, ar_mode, ar_door, ar_doorbtn, ar_liftwait, ar_failstreak. Which is to say: the exact state every forensics session this week needed.

Every one of those sessions ended the same way. Add a dprint, recompile, re-run, read one number. The door freeze, the lava seat, the routefail storm. All of them would have been one console command against a live server.

The plumbing already exists. tune injects console commands into the dedicated child on Windows through AttachConsole and CONIN$, and -condebug puts the output in the tape. The work is a lab verb that injects edicts on demand, or on a trigger such as a freeze being detected, and a parser for the dump.

Adopt, smaller

  • viewpos prints exact position and angles. When something looks wrong in a session, one command gives the coordinate instead of reconstructing it from telemetry afterwards.
  • setpos teleports to coordinates. This makes the impulse 216 dev teleport redundant for a human, and lets a session jump straight to a suspect cell.
  • notarget makes monsters ignore the player, which isolates bot behaviour from monster interference during a co-op look.
  • sv_freezenonclients freezes everything but clients, so a stuck bot can be walked around and inspected.
  • profile and serverprofile give QC execution profiling. We have never measured where progs time actually goes.

Rejected, with measurements

host_timescale. It works: 42 s of wall clock produced 120.7 s of game time at timescale 3, a genuine 2.9x. It is still not usable for laddering, because the same real frames now cover triple the game time, so bots think a third as often per game second. Normalised per game minute against a timescale 1 control on the same build and map:

engage route goal death hazard
timescale 1 23.4 71.7 46.8 10.2 83.4
timescale 3 7.0 29.8 29.8 4.5 50.2

Tapes would not be comparable to any baseline, and the lab already sits at a different frame rate from a listen server. This moves it further away. It stays viable for soak work where the goal is game time to shake out crashes rather than a movement verdict.

sys_ticrate. No effect on the dedicated tick. 0.014 and 0.05 both held real time and produced the same event rates, so the documented lab against listen frame rate gap is not closable this way.

Savegames. Out entirely. The engine refuses with "Can't save multiplayer games." and every lab match runs -dedicated 8. Worth stating plainly because a savegame would otherwise be the best instrument on this list: a full text dump of world state plus deterministic reload of a stuck moment.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requesttoolingPython tools, telemetry scripts, and CLI utilities

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions