Skip to content

Zul'Farrak: the plan carries the pyramid stairs event to the run leader (holds with a value, Velratha stands, exporter) - #278

Merged
pjerra merged 4 commits into
devfrom
feat/zf-full-module-plan
Oct 21, 2026
Merged

pjerra merged 4 commits into
devfrom
feat/zf-full-module-plan

Conversation

@pjerra

@pjerra pjerra commented Oct 21, 2026

Copy link
Copy Markdown
Owner

Plan format: a hold can carry a value (written as param with flags 8 and no encounter flag) and a wait_for can carry a hold, which plan-export writes in place of the wait; the agent's own driver still runs the wait as written. zulfarrak.json: the Weegli wait holds the stairs top until instance data 1 reads 3 (90 s), the Nekrum wait until it reads 7 (600 s); Velratha pull groups 4 and 5 get approach stands on the lower floor (>= 24 yd from every pack member, spawn and patrol data; the lone Shadowhunter 81610 is 12.9 yd from the group 4 stand but is pulled at the earlier hop). Plan reader refuses a hold value of 0 and a value on a pull or boss hold. Exporter accepts hold params above 4 when the encounter flag is off. The exported plan goes from 86 to 122 steps (14 legs). Compatibility: an agent binary built before this change refuses this zulfarrak.json (unknown fields hold and value). Reviews: Opus cold review two rounds (FIX FIRST on the approach points, then SHIP); Codex not run. Tests: 11 mutations fail a test, go test ./... with the map 209 navmeshes green. Not verified: no run under the run leader yet (module side: TortoiseBots feat/zf-plan-extended); the first run tests legs 0-8 of a changed route (71 steps, not the proven 86).

pjerra and others added 4 commits October 20, 2026 20:49
The zf-full-19z16 run stopped at the four-mob pack on the west road: the
lead stood at 1629 1099, the foot of the pool stairs, which is a navmesh
island, and three followers plus the healer went up to z 31-46.8 and took
six minutes to gather back. Give the last two packs approach points on
the lower floor west of the stair mouth so the run leader's party stays
there.

Pin the real Gong of Zul'Farrak (141832) in a test, not the Turtle
decoration copy 20901. Record where the Mallet comes from: item 9240 is
made by using 9241, and 9241 drops only from Qiaga the Keeper (7996) on
map 0, so no bot run can acquire it and the leg stays optional. Note the
missing pyramid phase gate (instance data 1, value 7): the plan format
has no instance-data wait, so the stairs leg keeps its Nekrum-seen proxy.
…irs event to the run leader

The exported Zul'Farrak rows ended before the stairs leg: its Weegli wait and the
stairs_top Nekrum wait are unit waits, which the TortoiseBots run leader has no
step for. The run leader can do the event itself: its loader takes a hold done by
instance data with flag 8 alone and any param, and ends it when the data reads
that value (DungeonPlanPolicy.h NormalizePlanStep, DungeonRunPolicy.h
HoldDoneNote). The pyramid phase is instance data 1 (tortoise-wow zulfarrak.h).

Plan format:
- hold.value: the instance data value that ends the event, read as a script
  value (flags 8, param value); without it the encounter DONE as before (40, 3).
- wait_for.hold: the wait's run leader form. plan-export writes the hold row in
  place of the wait; the agent's driver still runs the wait as written.

zulfarrak.json: the cage leg's Weegli wait holds the stairs top to phase 3
(WAVE_1; phase 2 lasts one instance update), stairs_top's Nekrum wait holds it to
phase 7 (WAVE_3: wave 2 dead, wave 3 up). Wave entries 7787 7788 7789 8876 8877.
Notes say what a module run needs (key 8444 to the lead bot as a fallback, no
Mallet: the gahzrilla leg stays optional and out of the rows).

Export: 14 legs, 122 steps through stairs_base (Nekrum, Sezz'ziz, the foot
clear); cut before weegli_door (a unit wait with no hold, then a gossip).
Validate takes a hold param above 4 only without the encounter flag. The run
leader reach check counts a wait hold's spot as a stand. A wait with a hold is
listed among the attributes the rows do not carry (its own condition).

Tests: TestWaitHoldIsTheRowAndValueIsAScriptValue, TestValidateHoldParamByFlags,
TestZulfarrakStairsEventRows, TestZulfarrakIsCutAfterStairsBase (was ...AfterZumrah),
TestWaitForHoldAndHoldValueParse, TestRunLeaderReachCountsAWaitHoldSpot; seven
mutations (each change reverted on its own) each fail at least one of them.
…lue only on a wait, never 0

Cold review of f11df6d (2026-10-21):
- The last approach points of velratha pull groups 4 and 5 stood inside their
  packs' reach: 1582 1070 was 10.8 yd from the Witch Doctor 81609, 1593.6 1089.9
  16.6 yd from the Shadowhunter 81606, so the walk there pulled the pack before the
  Polymorph (the STUCK #1 situation). New: group 4 1603 1043 9.8 (44.0 yd or more
  from every member's spawn, 29.3 yd or more from each waypoint of the 81587
  patrol less the 5.3 yd follower offset, 45 yd from the Witch Doctor, a complete
  21 yd navmesh path from 1584 1050); group 5 1584 1088 9.1 (24.1 yd or more from
  the four). TestZulfarrakPoolStairsApproach checks the last point against every
  member of the group in the world export (spawn less wander) and the patrol's
  creature_movement waypoints (less the follower offset), at least 20 yd.
- hold.value is refused on a pull group's or a boss's hold and when it is 0 (the
  value instance data starts at: the hold would end at once):
  TestHoldValueIsRefusedWhereItCannotWork.
- README: the pyramid phase paragraph says what the plan carries now, and a
  compatibility note: an agent built before f11df6d refuses this zulfarrak.json
  (unknown fields); the format version stays 1.
@pjerra
pjerra merged commit 3bfbad0 into dev Oct 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant