Files
GaCy-GO/internal/gameserver/currency_wars_supply_layer.go
2026-10-28 18:54:43 +07:00

56 lines
2.0 KiB
Go

package gameserver
import (
"fmt"
"gac-hkrpg-go/internal/common"
pb "gac-hkrpg-go/protocol/proto"
"google.golang.org/protobuf/proto"
)
// cwCapturedSupplyLayer obtains the empty Supply node container from the
// revision-bound native transition capture. It deliberately does not copy
// that capture's Supply options, queue, rewards or player-specific state.
// The current capture has an empty enemy-layer container with branch index 1;
// this is checked against the resource rather than assumed for future clients.
// A caller must also construct a valid Supply pending action before committing
// a transition; this helper alone does not make a Supply round playable.
func cwCapturedSupplyLayer(catalog *common.CurrencyWarsCatalog) (*pb.NCKOKDHNJDC, error) {
if catalog == nil {
return nil, fmt.Errorf("CW Supply catalog missing")
}
entries, err := cwNodeTransitions(catalog)
if err != nil {
return nil, err
}
var layer *pb.NCKOKDHNJDC
for _, entry := range entries {
level := new(pb.AINFNFIDGFF)
pending := new(pb.CHCHAJIANIM)
if err := proto.Unmarshal(entry.LevelWire, level); err != nil {
return nil, fmt.Errorf("CW captured Supply level: %w", err)
}
if err := proto.Unmarshal(entry.RoundWire, pending); err != nil {
return nil, fmt.Errorf("CW captured Supply pending: %w", err)
}
if pending.GetFIKAGBAEOAP() == nil {
continue
}
if level.IMPNAHBCADN == nil {
return nil, fmt.Errorf("CW captured Supply layer missing")
}
enemy := level.IMPNAHBCADN.GetMPOBBIPMNNJ()
if enemy == nil || enemy.MOADBALHMFD != 1 || enemy.LNDKCPBJDKH != 0 || len(enemy.BPDABHGFBFO) != 0 {
return nil, fmt.Errorf("CW captured Supply layer contains unexpected state")
}
if layer != nil && !proto.Equal(layer, level.IMPNAHBCADN) {
return nil, fmt.Errorf("CW captured Supply layers disagree")
}
layer = level.IMPNAHBCADN
}
if layer == nil {
return nil, fmt.Errorf("CW captured Supply layer unavailable")
}
return proto.Clone(layer).(*pb.NCKOKDHNJDC), nil
}