88 lines
4.8 KiB
Markdown
88 lines
4.8 KiB
Markdown
# 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.
|