pre cw with probe and a bunch script to read game behavior

This commit is contained in:
CAtlas0784 committed 2026-10-21 20:40:13 +07:00
1 parent 5120219ae2
commit da8a32f60d
310 files changed
+219693 -872

No files matched your search

@@ -0,0 +1,47 @@
package gameserver
import (
"fmt"
goproto "gac-hkrpg-go/protocol/proto"
)
// currencyWarsPlayerStats is run-local state, separate from adventure avatars.
// Initial values must come from captured CW rules/run configuration. Zero is a
// valid price or win count and is never replaced with an implicit default.
type currencyWarsPlayerStats struct {
HP, MaxHP uint32
Level, LevelLimit, Exp uint32
Gold, KeepWinCount uint32
FrontCapacity, BackCapacity uint32
BenchCapacity, MaxInterest uint32
BuyExpGoldCost, BuyExpHPCost uint32
}
// applyProtoScalars preserves the separately managed restriction/tracker
// containers on dst. It does not create a complete session or start a run.
// Mapping: native GridFightPlayer.SetData at RVA 0xdb9d670, setter MethodDef
// checks, and isolated NIHNGPKHEPC scalar wire encoding. See the CW investigation
// document for the field-layout inference and outstanding Client verification.
func (p currencyWarsPlayerStats) applyProtoScalars(dst *goproto.NIHNGPKHEPC) error {
if dst == nil {
return fmt.Errorf("CW player destination is missing")
}
if p.MaxHP == 0 || p.HP > p.MaxHP || p.Level == 0 || p.LevelLimit < p.Level {
return fmt.Errorf("CW player health/level state is invalid")
}
dst.PPKKHHNEOHB = p.MaxHP
dst.GridFightLineupHp = p.HP
dst.NDAINFLOLPJ = p.LevelLimit
dst.AFFCFLFIFPH = p.FrontCapacity
dst.KNFOCCPOJEA = p.MaxInterest
dst.GridFightCurLevelExp = p.Exp
dst.JLOCMDIDPCI = p.BackCapacity
dst.CPKLHPJMMDO = p.BuyExpHPCost
dst.EHNJDIDABHD = p.Level
dst.BEPMODICONA = p.BuyExpGoldCost
dst.GDAKCOICIDA = p.KeepWinCount
dst.Gold = p.Gold
dst.MICEOJBAKGN = p.BenchCapacity
return nil
}