Conversation
…, 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.
4 tasks
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:man1l0script (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)._10and_11both say textId 170: "[He/She] seems to be knocked unconscious." — a body-examine line, used twice. There is no twelfth slot for Dodoroba.PrivateAreaMasterPast7) spawns exactly two alive lying NPCs:thewy pirate(1000117, anim 1007 = Lie/Sleep) andfreckled 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), andman1l0.csvcontains no dead-examine text — they're scenery.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).DODOROBAstays declared-but-scenery with a comment explaining why (mirrorsSISIPU, who is cutscene-only).2. Journal markers — the full retail chain recovered from
quest_marker.csvThe client's
quest_marker.csvblock 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; theANC_LOWERtypo is gone too).getJournalMapMarkerListnow 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_locationsrow 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'sSetENpc(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 IGNOREidempotent; a newcommonunit 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):
processEvent2002_2(199–200)processEvent610_2(187–188)processEvent1000_2(194)processEvent1000_3(196)processEvent1000_4(197)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 doesAddExp(300, mainSkill, 0)+AddGil(15000)beforeCompleteQuest, 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 againstman1l0.csv— no change needed.Tests
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 actualAddExp(300)/AddGil(15000)grants.content-test/src/walkthrough.rs: addedexpectMarkers(...)(runsgetJournalMapMarkerListthrough the samecall_quest_getterpath the live journal pane uses, and fails on any non-integer return rather than filtering),expectGil/expectExp,expectNpcLsAlert, and theMan1l0quest-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 viaexpectExp/expectGil.Known limitations / follow-ups
MRKR_BASE = 11000100with its own "flip to 11000200" doubt-comment) looks mis-based againstquest_marker.csv(the 110002xx rows exist with plausible coords) — worth its own follow-up issue.Test plan
cargo fmt --all --checkcargo clippy --workspace --all-targets -- -D warningscargo build --workspace --all-targets --lockedcargo 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