Skip to content

Man1l0 "Legends Adrift": SEQ_100 dialog owners, journal markers, seafield trigger + retail payout (#48)#206

Merged
swstegall merged 1 commit into
developfrom
48-man1l0-legends-adrift-limsa-msq-3-resolve-the-two-seq_100-missing-dialog-owner-npcs-incl-unregistered-dodoroba-add-journal-markers
Jul 10, 2026
Merged

Man1l0 "Legends Adrift": SEQ_100 dialog owners, journal markers, seafield trigger + retail payout (#48)#206
swstegall merged 1 commit into
developfrom
48-man1l0-legends-adrift-limsa-msq-3-resolve-the-two-seq_100-missing-dialog-owner-npcs-incl-unregistered-dodoroba-add-journal-markers

Conversation

@swstegall

Copy link
Copy Markdown
Owner

Closes #48.

What this does

Man1l0 "Legends Adrift" (Limsa MSQ #3) — resolves the two SEQ_100 !!!MISSING DIALOG OWNER!!! placeholders, populates the journal map markers, restores the missing SEQ_070 seafield push-trigger spawn (a real soft-lock the issue's static reading missed), repairs ASSESSOR1's origin-placeholder spawn, wires up four orphaned retail talk events, and adds the retail completion payout. A new content-test walkthrough (scripts/tests/quests/limsa_msq3.lua, 5 specs) plus a seed-contract test lock all of it in.

1. The two SEQ_100 dialog owners → Thewy Pirate + Freckled Pirate (not Dodoroba)

The issue guessed DODOROBA (1000196) was one of the two owners. The client data refutes that:

  • The client's decompiled man1l0 script (bahamut-client-data/lua/scripts/quest/scenario/man/man1l0.lua) defines exactly eleven SEQ_100 talk events (processEvent2000_2.._12). Nine are pinned to the already-registered crowd by say-textIds cross-checked against the speaker-labeled Loremonger transcript (Mirke archive). _10 and _11 both say textId 170: "[He/She] seems to be knocked unconscious." — a body-examine line, used twice. There is no twelfth slot for Dodoroba.
  • The gate-echo PA (zone 230 PrivateAreaMasterPast 7) spawns exactly two alive lying NPCs: thewy pirate (1000117, anim 1007 = Lie/Sleep) and freckled pirate (1000119, anim 1008 = Lie/Sleep). The two collapsed assessors beside the vault (1000452/1000453) use anims 1000/1001 = Lie/Dead (Populace Animation table, FFXIV Classic wiki), and man1l0.csv contains no dead-examine text — they're scenery.
  • Both pirates' nameplates are visible on the retail Part 3 recording (H1VulIXuTFo @ 10:21) exactly on the lower-deck walk between the two echo cutscenes.

So: THEWY_PIRATE → processEvent2000_10, FRECKLED_PIRATE → processEvent2000_11, both registered plain at SEQ_100 (no icon — same as the rest of the echo crowd). DODOROBA stays declared-but-scenery with a comment explaining why (mirrors SISIPU, who is cutscene-only).

2. Journal markers — the full retail chain recovered from quest_marker.csv

The client's quest_marker.csv block 11000301–11000310 is Man1l0's marker set — every row's map coordinates pin it to one quest leg (e.g. 11000306 at (-624.55, 359.0) = the FSH trigger spawn exactly; 11000307 at (218.58, 1176.56) = the seafield trigger; 11000309/310 = the two PA7 echo triggers; refs resolve to Baderon/Waekbyrt/P'tahjha by displayName). The issue's three constants were mis-assigned (11000308 is the SEQ_090 P'tahjha marker, not the ACN lower trigger — that's 11000309; the ANC_LOWER typo is gone too).

getJournalMapMarkerList now returns the right marker per sequence in the man0l1 style; the three linkpearl waits (SEQ_050/080/120) return none, and SEQ_122 reuses the Baderon marker.

3. seed/099_man1l0_spawn_repairs.sql — two spawn repairs

(a) SEQ_070 soft-lock: the seafield trigger was never spawned. pmeteor's server_eventnpc_spawn_locations row 2090 (man1l0_seafld1_push, class 1090082, zone 128 at 218.58/21.025/1176.56) was dropped during porting — seed/059 restored the quest's other rows (2068–2089, 2091–2108, skipping exactly 2090). On top of that, class 1090082 ships stripped in seed/003 (classPath '', which the spawn pass skips per the seed/098 engine guard). Net effect: nothing exists for SEQ_070's SetENpc(TRIGGER_SEAFLD, QFLAG_PUSH, …) to arm — the quest soft-locks at "head to a spot in Lower La Noscea". The seed restores the spawn row verbatim (position matches journal marker 11000307 exactly) and pmeteor's class shape (PopulaceStandard, propertyFlags 1, matching sibling triggers; eventConditions were already fixed by seed/057).

(b) ASSESSOR1 (1000120) stood at the origin. Row 2107 (man1l0_echo3_assessor2) shipped at 0/0/0 — a pmeteor placeholder — so the SEQ_100 owner of client text 159 was unreachable in live play. No retail position survives in any source (pmeteor, MeteorReborn, captures, recordings), so the spot is synthesized beside his reception partner ASSESSOR2 (same floor, same idle pose), documented as such in the seed.

Both stanzas are guarded/OR IGNORE idempotent; a new common unit test (man1l0_spawn_repairs_restore_trigger_and_assessor) applies the seed twice against the pre-099 shapes and asserts the contract.

4. Orphaned retail talk events wired up

The client script defines talk events the server never called (or could never reach):

Event Text Owner / placement
processEvent2002_2 (199–200) "Back from th' scholarlies' already? … give me a few bells t' chew on the name and then ring me up on the aether." Baderon @ SEQ_120 — placement confirmed by the Loremonger "Checking In" transcript
processEvent610_2 (187–188) already routed to Baderon @ SEQ_090 — but Baderon was never registered at SEQ_090, so the branch was unreachable registered
processEvent1000_2 (194) serpent-beast-rumors aside N'nmulika @ SEQ_080 (inferred — see note)
processEvent1000_3 (196) the Rostnsthal / Swallowtail Roam mock N'nmulika @ SEQ_090 (inferred)
processEvent1000_4 (197) "First Assessor J'arhll looked paler than usual…" P'tahjha @ SEQ_120/122 (content-pinned post-echo)

Note on the 1000_* placements: no capture or recording shows these optional flavor talks being triggered, so the NPC-to-sequence placement is inferred from content (194/196 are fisher-voiced and 196 requires the player to have met Rostnsthal in the seafield echo; 197 only makes sense after the gate echo). They're optional lines with no sequence transitions — worst case a line plays one step early/late vs retail.

5. Completion payout

The Part 3 recordings show the retail payout: "You obtain 15,000 gil." (both recordings) and "You gain 300 experience points." (H1VulIXuTFo's log lines plus its "300 experience points" reward widget, which also matches the sqrwa 300,… arg; kSm2oJAfflo's OCR only caught the gil toast). The script granted nothing; it now does AddExp(300, mainSkill, 0) + AddGil(15000) before CompleteQuest, matching the man0l1/man0u1 completion pattern. No item reward appears in either recording. The NPC-LS message packs (57–59 / 92–94 / 140–141) were verified correct against man1l0.csv — no change needed.

Tests

  • New scripts/tests/quests/limsa_msq3.lua: 5 walkthrough specs covering SEQ_000→122 (linkpearl seams seeded, per the man0u1 convention) — every leg's ENpc set, delegate routing, sequence transitions, journal markers, the linkpearl arming at all three seam pushes, and the completion chain including the actual AddExp(300)/AddGil(15000) grants.
  • content-test/src/walkthrough.rs: added expectMarkers(...) (runs getJournalMapMarkerList through the same call_quest_getter path the live journal pane uses, and fails on any non-integer return rather than filtering), expectGil/expectExp, expectNpcLsAlert, and the Man1l0 quest-code mapping. Written test-first: all 5 specs failed on the old script, pass on the new one; the 18 existing specs stay green.
  • common/src/migrations.rs: seed/099 contract test (idempotent double-apply, trigger + class shape + ASSESSOR1 off-origin).

Adversarial review

An 18-agent review workflow (5 dimensions → per-finding adversarial verification, including mutation probes) ran against the diff: 9 findings confirmed, 4 refuted. All confirmed findings are addressed in this PR — the mutation-proven payout-assertion gap, the silently-filtered non-integer marker returns (reproduced live), the ASSESSOR1 origin spawn, the untested seed, the unasserted linkpearl arming, and three comment-accuracy nits. One LOW was accepted as-is: expectDelegate("sqrwa") matches the event name but not the numeric widget args (300,1,1,2) — the real payout is now asserted directly via expectExp/expectGil.

Known limitations / follow-ups

  • man0l1's marker block (MRKR_BASE = 11000100 with its own "flip to 11000200" doubt-comment) looks mis-based against quest_marker.csv (the 110002xx rows exist with plausible coords) — worth its own follow-up issue.
  • SEQ_110 deregisters the hall crowd while walking to the upper trigger (pmeteor-inherited; reviewers checked retail recordings — neither player attempts a talk there, so behavior is unattested either way).

Test plan

  • cargo fmt --all --check
  • cargo clippy --workspace --all-targets -- -D warnings
  • cargo build --workspace --all-targets --locked
  • cargo test --workspace --locked (incl. new seed/099 contract test)
  • cargo run --locked -p content-test (23/23, incl. 5 new Man1l0 specs)
  • PROFILE=debug scripts/smoke-local.sh
  • Live client checkpoint (needs a play session): force-grant 110003, walk SEQ_060→090 to confirm the seafield trigger spawns and fires, click both sleeping pirates + ASSESSOR1 at SEQ_100, confirm markers render on the map per step, and confirm the 15,000 gil / 300 exp payout on completion.

…, seafield trigger, retail payout (#48)

- Resolve the two SEQ_100 MISSING DIALOG OWNER placeholders: client data
  pins processEvent2000_10/_11 (shared examine text 170, "seems to be
  knocked unconscious") to THEWY_PIRATE (1000117) and FRECKLED_PIRATE
  (1000119) — the two sleeping bodies on the gate-echo lower deck.
  DODOROBA has no client-side talk slot and stays scenery.
- Populate getJournalMapMarkerList with the retail marker chain
  11000301-11000310 recovered from the client's quest_marker.csv
  (the old three constants were misassigned).
- seed/099: restore the dropped pmeteor spawn row 2090 (SEQ_070
  seafield push trigger 1090082, zone 128 — the leg soft-locked
  without it) + un-strip its class row, and move ASSESSOR1 off its
  0/0/0 placeholder to a synthesized spot beside ASSESSOR2.
- Wire the orphaned retail talks (Baderon SEQ_120 2002_2, the
  unreachable SEQ_090 610_2, N'nmulika 1000_2/_3, P'tahjha 1000_4).
- Grant the video-verified completion payout: 15,000 gil + 300 exp.
- New content-test walkthrough limsa_msq3.lua (5 specs) + bridge
  assertions expectMarkers/expectGil/expectExp/expectNpcLsAlert and a
  seed/099 contract test in common.
@swstegall
swstegall merged commit dac4b9a into develop Jul 10, 2026
7 checks passed
@swstegall
swstegall deleted the 48-man1l0-legends-adrift-limsa-msq-3-resolve-the-two-seq_100-missing-dialog-owner-npcs-incl-unregistered-dodoroba-add-journal-markers branch July 10, 2026 04:31
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.

Man1l0 "Legends Adrift" (Limsa MSQ #3): resolve the two SEQ_100 "MISSING DIALOG OWNER" NPCs (incl. unregistered DODOROBA) + add journal markers

1 participant