Skip to content

e1m6 co-op companion stalls all match at n93, a waypoint seated 14 units past a lava pit lip #249

Description

@saworbit

What happens

A co-op companion on e1m6 never gets going. It parks and jumps on the spot for the whole session.

Three tapes, 175 s each, one bot, +coop 1 +deathmatch 0 +skill 1.

build cells busiest cell stalls goals routefails
binary d88ba69 13 63.4% 220 3 9
main a7d49cf 14 60.2% 213 3 17
main a7d49cf, repeat 14 59.7% 200 3 14

The behaviour is the same on both builds, so this is not the recent water work.

Telemetry from the main tape: mode 0 on 310 of 327 samples, 91 per cent of samples under 20 u/s, and spd 0.0 with z bouncing between 24 and 62. That is a stall recovery jump cycle in place. The tape holds 213 stall events and 215 jump events. The bot sits at 368 576 50 for the first minute, then at -176 496 47 for the rest. It never dies.

The graph is not the problem

Directed reach is 85 per cent of 198 nodes from all four spawns and from both pin cells. Both keys have a node close by. The gold key at 224 120 56 has n127 at 209 113 56, 17 units away. The silver key at -696 1280 -232 has n16 29 units away.

The companion does commit to the key. The tape holds ARGEVT Carmack goal key and routes of four to six hops to goal 209 113 56.

Root cause

Every stall names the same steering target.

ARGEVT Carmack stallnode '-207.0 305.0  24.0'

That is n93, src/argus_nav_e1m6.qc:297.

A fine floor probe at y 305 puts the ledge lip at about x -193. World floor is -2 at x -191 and east of it, and -306 at x -195 and west of it. n93 sits at x -207, so it is 14 units past the lip.

The column under n93 is solid to -304, lava from -304 to -128, then empty. n93 floats 152 units above the lava surface.

The node is not arbitrary. It sits inside the footprint of brush model *51, a func_door with angle -1 so it rises, and wait -1 so it stays open. Its closed bounds are mins -415 241 -495 and maxs -193 463 -233. Its size_z is 262, so with the default lip of 8 it travels 254 and its top lands near z 21. That matches a waypoint at z 24. The door is fired by targetname t52, which a trigger_once reaches on a 3 second delay.

So n93 is a seat on a rising platform. It is only real once that platform is up.

navgen does not model this. func_plat gets lift links at tools/argus_navgen.py:616. func_door is only read for door AABB typing at tools/argus_navgen.py:1038. A func_door used as a platform is not modelled at all, so the hop into n93 is minted as an ordinary walk link.

The bot routes onto that walk link, walks to the lip, and the hazard guard correctly refuses to step into lava. It stalls, jumps, re-plans, and repeats for the whole match. Nothing is wrong with the guard. The link is a lie.

A second defect on the same link

n94 -207 529 24 to n93 is minted twice. It appears in links as a walk link and in jlinks as a jump link, in both directions.

The pair is 224 units apart on the same z. JUMPREACH is 190 at tools/argus_navgen.py:88 and is applied at line 284, so a 224 unit jump link should not exist. There is also a 64 unit step between the two nodes at y 449 to 465, and then the pit.

Suggested work

  1. Refuse to seat a waypoint past a ledge lip when there is no world floor within a step, unless the sample stands on a mover navgen actually models. That alone removes n93.
  2. Model vertically travelling func_door movers the way func_plat is modelled, so the hop is typed and the runtime waits and rides. e1m6 needs this to be playable at all, and other id maps use the same trick.
  3. Enforce JUMPREACH on jump links, and stop a pair being minted as both a walk link and a jump link.

Short term, e1m6 is not co-op ready. Stripping n93 and its links would stop the stall loop, but the level still cannot be finished until the rising door is modelled, because that platform is the way across.

Also seen

The tape prints this once at spawn, before the first goal is pushed.

ARGUS coop key fail: NO_RIPPLE / KEY_UNCLAIMED

The bot commits to the key later in the match, so this looks transient. Noting it here in case it is separate.

Repro

cd C:\argus\engine
.\quakespasm.exe -dedicated 8 -basedir C:\argus\engine -game argus -condebug +developer 1 +coop 1 +deathmatch 0 +skill 1 +map e1m6

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

    bugSomething isn't workingnavigationWaypoint graphs, reachability, path following, and movement

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions