4.8 KiB
CW Orb implementation from the updated reference
The reference binary SHA-256 is
235f5c3567f281cc99613ed84694ef23f492c15298dc868a8e78e6529f0cda86.
The original binary was read without execution. Its embedded protobuf
descriptor, Excel tables and authored declarative configs were extracted under
battle_diagnostics/ffgo-20261026/.
tools/export_ffgo_orb_recipes.py reproducibly creates
resources/CurrencyWarsOrbRecipes.json from the explicitly selected extracted
Excel/custom JSON files and reference binary digest. The resource retains both
input JSON hashes and separates native table identities from the reference's
authored reward recipes. It does not claim captured official reward odds.
Proven protocol contract
The current Client sender and reference descriptor agree on the request:
| Current name | Reference name | CmdID | Fields |
|---|---|---|---|
| IKMOCJBMGOJ | GridFightUseOrbCsReq | 8623 | repeated UID tag4, get-all bool tag9 |
| PNHDGCBLPGD | GridFightUseOrbScRsp | 8659 | retcode tag3 |
| GDHFMHKFEAL | GridFightUseOrbNotify | 8745 | UID tag14, DropList tag5 |
The implementation registers only the current named request. It introduces no
numeric alias or fallback response. The reference handler at RVA 0xca4740
replies through 8659; the called gfItemUseOrbs (0xca2a40) sends 8745 before
the reward sync. The reference's gfRewardDropProto (0xcd3640) does not set a
drop ID for coin/EXP/refresh drops. It writes a role/item ID for those types.
Role-star presentation maps exactly to AOHKKFHDALO.role_star tag101; the other
ChooseParam arm is unused.
The current native OrbSummarizer proof in
currency-wars-current-consumer-notes.md establishes source enum1 and the first
context uint equal to the opened Orb UID. Each opened Orb has its own grouped
sync containing the actual reward changes and the remove-Orb arm tag1503
(GOHHJLAPMBB).
Implemented scope
Opening one or all selected owned Orbs uses a detached snapshot and saves the removal and actual rewards in one revision-checked transaction. Duplicate or unowned UIDs, stale revisions, malformed recipes, exhausted pools and unsupported bonuses do not consume an Orb. Network errors after a committed payout are reported as send failures; reconnect restores the saved result.
Sixteen reference recipes are identified among 532 native Orb rows: 102, 103, 197, 199, 203–208, 120031, 200001, 200005, 200013, 200015 and 200027. The effect dispatcher supports gold, EXP, free refresh, lineup HP, captured equipment/consumable/forge items, random captured equipment categories and random available captured role rarities/stars. Random role rewards reserve owned copies and unsold shop cards using captured merge rules, reject disabled full-star roles, and use existing acquisition/merge/property projection paths. Equipment categories require all reference category entries to exist in the captured equipment catalog; no silently reduced category pool is substituted. Inventory/effect prerequisites can still reject a particular identified recipe.
Orb opening is currently restricted to Preparation without another pending
action or active Battle, using the same revision guard as purchases. Native
bonus-pool budget/weighted recursion, role modifiers and general OnOrbOpened
trait/effect hooks remain separate work. For example ordinary Orb100's bonus
20001 has no supported fixed recipe yet, and returns a configuration error
without removal. The handler must not be described as complete coverage of all
532 Orbs or original game odds.
No unit tests, live probes or deployment were performed for this change.
go build ./internal/gameserver passed; Client Orb presentation and gameplay
acceptance remain unverified.
Post-battle drops audit
The reference workflow includes gfRouteRewardNodeOrbs (RVA 0xce0c00),
which calls gfRouteRandomCreepOrbs (0xcdf4a0) and gfPoolRandomOrb
(0xccaec0). Its gfBattleTraitDrops also calls gfBattleDropReward
(0xc63e80), which checks the configured Orb row before processing an Orb
drop. These are separate paths; the reference dump does not itself establish
the current Client's complete wire or success behavior.
The current settlement reads progress and damage but does not generate
post-battle Orb drops. MGMJOPHJCNL.ODMCMPIDJNH is a repeated drop-shaped
field in the current protocol; its relationship to a server-issued battle's
drop list and the matching reference fields has not been demonstrated.
Accepting it as a grant without that validation would trust unverified Client
input. Likewise, restricting random rewards to the small set of implemented
recipes would change the reference distribution. A complete implementation
still needs the current Client's battle drop contract, the reference pool
membership and selection parameters, and usable implementations for the
resulting Orb recipes. The audited save and server were not modified.