3.9 KiB
AA scene NPC recovery
Observed loading failure
The current Client reports CreateNPCMonster Invalid ID 4015011 while entering
Peak 204 from selected group 2. The source resource row supplies entrance
3013501, maze group 8, event 30502021 and NPC 4015011. This is a scene actor
creation failure, separate from refreshing the selected AA group.
loadPeakResources in handlers_challenge.go copies NpcMonsterIDList into
PeakStageData.MonsterID. loadChallengeScene in
handlers_challenge_scene.go forwards that value directly into
SceneNpcMonsterInfo.MonsterId; no current Client config lookup validates it.
The battle wave monster is a different identifier namespace and cannot be
converted into an adventure NPC by truncating digits.
Evidence boundary
The existing WorldBattleConfig.json NPC catalog is a partial capture of 153
NPCs, from assembly SHA-256
c5e02e6e984f7e5577c78b995a8efeee2d06ee22e67d484ad5e859c8bf21e144.
An offline comparison finds that 42 of the 44 Peak rows refer to at least one
NPC outside that partial catalog. Absence from it is therefore insufficient
to declare an AA room invalid. Using it as a mandatory allow-list would disable
most AA rooms, including ones not demonstrated to fail.
The reported Client error establishes that this particular NPC failed in the actual session. It does not establish a replacement NPC or prove that all other Peak rows are invalid. No replacement ID, arbitrary fallback monster, save migration was justified by the old partial catalog alone.
Reference-backed correction prepared
The FFGO update inspected on 2026-10-26 contains an explicit
challenge_peak_extra_data JSON object at binary file offset 0x114c212,
decoded length 9101 bytes, binary SHA-256
235f5c3567f281cc99613ed84694ef23f492c15298dc868a8e78e6529f0cda86.
Its Peak 204 mapping is NPC 4015010, entrance 3013701, maze group
10. These values come from the reference object, not ID arithmetic.
The full reference extraction is retained in
battle_diagnostics/ffgo-20261026/challenge_peak_extra_data.json.
resources/ChallengePeakSceneOverrides.json retains all 44 explicit mappings
and their provenance. peak_scene_overrides.go applies only the scene NPC,
entrance and maze group after loading canonical Peak group memberships.
Battle event IDs, waves, buffs, targets and saved/active runs are unchanged.
The loader validates provenance, duplicate/unknown IDs, group membership and
merged resource scene placements. A missing mapping or unusable placement
is stored as a configuration error. StartChallengePeak rejects it before
creating battle/run state or sending EnterScene; unknown Peak IDs also now
return the existing typed challenge-not-exist error instead of empty success.
The first 36 reference mappings have monster placements in raw res.json.
The last eight (Peak 1001–1104) require supplementary placements or further
capture; no placement is invented when the merged loader cannot supply one.
The resource is labeled reference evidence, not a captured Client table.
go build ./internal/gameserver succeeded; no tests were run, no deployment
was performed by this subtask, and actual Client NPC/scene acceptance remains
unverified.
Next bounded capture
tools/aa_npc_config_metadata.lua is prepared outside scripts/ and passes
Lua syntax parsing. It inspects only six named candidate types, at eight
members per heartbeat, to locate NPCManager.CreateNPCMonster and the
NPC/Peak flat config entry points. Missing candidate types are logged rather
than treated as proof that config is absent. It does not enumerate assembly
types, call getters, create actors, load scene graphs or send gameplay packets.
The Client process was not open during this offline inspection, so this probe has not been staged or run. Once current native/config lookup evidence is available, capture the relevant Peak row and each referenced NPC config to verify or supersede the reference mapping. Client battle/scene success remains unverified.