The lab netclient can connect, walk, and fire impulses. It cannot pull the trigger. That gap blocks verification of an entire class of behaviour.
What it blocks
The co-op friendly fire fix cannot be tested headless at all. Its main path, Argus_Pain retaliation, requires a player to damage a bot. A co-op botmatch runs one bot; adding more with impulse 101 does not help, because Argus_Perceive returns before its player scan whenever coop > 0, so bots never shoot each other in co-op regardless. Two attempts at an ally test came back null for exactly that reason, on e1m2 and on a monster free dm4 co-op.
More generally, nothing that begins with "the bot takes damage from a player" can be exercised: retaliation, the vendetta ledger, retreat entry thresholds, the pain flinch on aim, knockback response, and the shove economy.
What is needed
clc_move already carries the button bits, and the client already sends move packets at 20 Hz. Adding attack means setting the button0 bit for a number of frames.
argus-mcp client attack [secs] [host] [port]
argus-mcp client aim
Aim matters as much as fire. Firing without control over the view angle only produces stray shots, and the interesting cases need the puppet pointed at a specific bot.
Caveat worth designing around
Argus_CanSee refuses netname "labprobe" so the puppet stays an instrument rather than a target. That courtesy is correct for probe sweeps and wrong for this: a puppet that shoots a bot needs the bot to react. Either an opt in name, or a flag the harness sets, so the same client can be invisible for link probing and visible for combat tests.
The lab netclient can connect, walk, and fire impulses. It cannot pull the trigger. That gap blocks verification of an entire class of behaviour.
What it blocks
The co-op friendly fire fix cannot be tested headless at all. Its main path,
Argus_Painretaliation, requires a player to damage a bot. A co-op botmatch runs one bot; adding more with impulse 101 does not help, becauseArgus_Perceivereturns before its player scan whenevercoop > 0, so bots never shoot each other in co-op regardless. Two attempts at an ally test came back null for exactly that reason, on e1m2 and on a monster free dm4 co-op.More generally, nothing that begins with "the bot takes damage from a player" can be exercised: retaliation, the vendetta ledger, retreat entry thresholds, the pain flinch on aim, knockback response, and the shove economy.
What is needed
clc_movealready carries the button bits, and the client already sends move packets at 20 Hz. Adding attack means setting the button0 bit for a number of frames.argus-mcp client attack [secs] [host] [port]
argus-mcp client aim
Aim matters as much as fire. Firing without control over the view angle only produces stray shots, and the interesting cases need the puppet pointed at a specific bot.
Caveat worth designing around
Argus_CanSeerefuses netname "labprobe" so the puppet stays an instrument rather than a target. That courtesy is correct for probe sweeps and wrong for this: a puppet that shoots a bot needs the bot to react. Either an opt in name, or a flag the harness sets, so the same client can be invisible for link probing and visible for combat tests.