5.6 KiB
FFGO CW reference inspection — 2026-10-26
Artifact identity and scope
The explicitly selected updated FFGO executable was inspected as a local, read-only reference. It was not started, connected to the game, or allowed to modify a player save.
- SHA-256:
235f5c3567f281cc99613ed84694ef23f492c15298dc868a8e78e6529f0cda86. - Embedded revision:
440df54730ba64935e9ad7ecae9147e55ad279a9. - Embedded build time:
2026-10-26T02:49:04Z; Go build metadata:go1.27.3. - Embedded metadata is reference evidence, not proof of official Client data or runtime feature completeness.
Reproducible dumps
All paths below are relative to the repository. Machine-specific installation paths are supplied to tools as arguments and are not built into source.
battle_diagnostics/ffgo-20261026/ contains:
| Artifact | Contents |
|---|---|
cmdids.json |
2,860 named command enum entries extracted from the complete embedded protocol descriptor |
starrail.descriptor.pb / .json |
4,939 top-level messages and 472 enums, including field numbers, types and oneofs |
gridfight_excel.descriptor.pb / .json |
75 generated Excel schema messages |
functions.json |
78,891 compiled Go function names, addresses and sizes recovered from pclntab |
gridfight-workflow.json |
Selected compiled functions, disassembly and direct-call references; includes generated protobuf/resource functions |
cw-handlers.json |
37 named CW entry handlers and their direct calls; the service contains 1,469 compiled functions |
cw-command-comparison.json |
109 CW commands compared with the repository command-name table and compiled message schemas |
cw-message-mapping.json |
Exact recursive wire-shape matches, with explicit limitations |
gridfight-excel-data.json |
Complete extracted CW tables; reward pools, basic bonuses, bonfire events/options, routes and Orbs |
gridfight-custom-data.json |
FFGO-authored declarative rules; these are implementation recipes, not original Client JSON |
resource-manifest.json |
Embedded blob offsets, compressed/uncompressed hashes and extraction provenance |
challenge_peak_extra_data.json |
Explicit adventure NPC/entrance/group mappings for 44 AA stages |
Tools:
python tools/dump_go_workflow.py --binary <reference-exe> --output <dump-directory>
python tools/dump_embedded_proto.py --binary <reference-exe> --descriptor proto/starrail.proto --output <dump-directory>
python tools/dump_embedded_proto.py --binary <reference-exe> --descriptor proto/gridfight_excel.proto --output <dump-directory>
python tools/export_ffgo_embedded_resources.py --binary <reference-exe> --output <dump-directory>
protoc --proto_path=. --descriptor_set_out=<current-descriptors.pb> protocol/proto/StarRail.proto protocol/proto/current_handlers.proto
python tools/compare_cw_reference_protocol.py --reference <starrail.descriptor.pb> --current <current-descriptors.pb> --commands protocol/proto/upstream_cmdids.go --output <dump-directory>
Protocol compatibility
Of the 109 CW command entries, 60 have the same current name. The remaining 49 include renamed and obfuscated messages; numerical agreement alone does not establish compatibility. Recursive comparison finds 83 exact message wire shapes and 26 differences. In particular, large GetData, PendingAction, SyncUpdate and battle messages must not be copied wholesale from FFGO.
Matching checks field numbers, scalar/message types, repeated cardinality and oneof partitions recursively. It does not establish enum meanings, business semantics or Client success. No numeric aliases or extra response IDs are registered by these dump tools.
Confirmed Orb comparison leads:
- FFGO
GridFightUseOrbCsReqcorresponds to currentIKMOCJBMGOJ, with repeated UID field 4 andis_get_allfield 9. - FFGO
GridFightUseOrbScRspcorresponds to currentPNHDGCBLPGD, uint32 retcode field 3. - The notification's nested drop structure differs. Do not forward the FFGO notification bytes to the current Client without translating that structure.
Workflow findings
The updated reference contains real EnterBonfire implementation, unlike the
previously inspected reference. OnGridFightEnterBonfireCsReq at RVA
0xc697e0 calls gfBonfireEnter (0xc69940), sends the state update before
acknowledgement, and saves the changed state. The pending queue can resend an
existing bonfire action or construct a type-11 action from the node's event
list. Event options, reward resolution and subsequent selection are separate
operations; retcode-only success cannot create the menu by itself.
Current route 2801's event 10200601 has an FFGO custom option involving the
PetPalStarDown rule. A working implementation must retain and apply the
effect; consuming the choice as a no-op would be incorrect.
The extracted reference player is on route 1800. Its node list, positions, inventory and progress are not imported into this server's route-2801 save.
AA recovery
The embedded mapping identifies Peak 204 as NPC 4015010, entrance 3013701,
maze group 10. Our old configuration used NPC 4015011, entrance 3013501,
group 8, and the actual Client rejected that NPC during scene creation.
The explicit mapping is now preserved in an editable resource with reference
provenance. See aa-scene-npc-recovery.md for validation and Client acceptance
status. Battle wave IDs and buffs are not replaced with adventure NPC IDs.
Completion boundary
Extraction and source compilation do not prove CW, AA or a newly ported rule works in the Client. FFGO itself declares partial/unimplemented/battle-only recipes. Newly extracted schemas and recipes are leads to implement and verify, not a claim that all modes are now complete.