89 lines
4.8 KiB
Markdown
89 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/reference-20261026/`.
|
||
|
||
`tools/export_reference_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 extraction 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.
|