56 lines
2.0 KiB
Go
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
|
|
}
|