From 6b9f4bb265b5529e49cd8e095aeea5015a17bbfc Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Wed, 8 Feb 2023 12:03:16 +0100 Subject: kraken: implement suprise! --- go/game/cardImplementations.go | 14 +++++++------- go/game/kraken.go | 28 ++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/go/game/cardImplementations.go b/go/game/cardImplementations.go index cb32ab2c..5d28c06c 100644 --- a/go/game/cardImplementations.go +++ b/go/game/cardImplementations.go @@ -109,32 +109,32 @@ func (*frostPylonAoE) onLeaving(Permanent) { // TODO: remove effect } -type frostPylon struct { +type frostPylonImpl struct { cardImplementation aoe frostPylonAoE } -func (*frostPylon) spawnTiles(s *State, kraken *Player) (spawns []*Tile) { +func (*frostPylonImpl) spawnTiles(s *State, kraken *Player) (spawns []*Tile) { for _, u := range s.EnemyUnits(kraken) { spawns = append(spawns, TilesInRange(s.Map, u, 1)...) } return } -func (*frostPylon) stateBasedActions(s *State, p Permanent) { +func (*frostPylonImpl) stateBasedActions(s *State, p Permanent) { if p.Marks(PermanentMarks.Crack) >= 3 { s.DestroyPermanent(p) } } -func (i *frostPylon) onEntering(t *Tile) { +func (i *frostPylonImpl) onEntering(t *Tile) { s := t.Permanent.Controller().gameState for _, tile := range TilesInRange(s.Map, t.Permanent, 1) { tile.addEffect(&i.aoe) } } -func (i *frostPylon) onLeaving(t *Tile) { +func (i *frostPylonImpl) onLeaving(t *Tile) { s := t.Permanent.Controller().gameState for _, tile := range TilesInRange(s.Map, t.Permanent, 1) { tile.removeEffect(&i.aoe) @@ -177,7 +177,7 @@ func (*soldOutImpl) onPlay(s *State, kraken *Player, _ *Targets) { type supriseImpl struct{ cardImplementation } func (*supriseImpl) onPlay(s *State, kraken *Player, _ *Targets) { - // TODO: implement modification of next spawn tile + kraken.Ctrl.(*KrakenControl).activeSuprise = true } type tentacleSlapImpl struct{ cardImplementation } @@ -238,7 +238,7 @@ func init() { "kraken/devour_the_poor!": &devourThePoorImpl{}, "kraken/drowned_sailor": &drownedSailorImpl{}, "kraken/flying_dutchmen": &flyingDutchmenImpl{}, - "kraken/frost_pylon": &frostPylon{}, + "kraken/frost_pylon": &frostPylonImpl{}, "kraken/gigantic_hail": &giganticHailImpl{}, "kraken/sold_out!": &soldOutImpl{}, "kraken/suprise!": &supriseImpl{}, diff --git a/go/game/kraken.go b/go/game/kraken.go index baf9a07b..d92d204b 100644 --- a/go/game/kraken.go +++ b/go/game/kraken.go @@ -56,10 +56,15 @@ type KrakenControl struct { actions chan Action syncGameState *sync.WaitGroup turn int + activeSuprise bool } func addKrakenControl(kraken *Player) { - ctrl := &KrakenControl{kraken, make(chan Action), new(sync.WaitGroup), 0} + ctrl := &KrakenControl{ + kraken: kraken, + actions: make(chan Action), + syncGameState: new(sync.WaitGroup), + } kraken.Ctrl = ctrl ctrl.syncGameState.Add(1) @@ -80,6 +85,8 @@ func (ctrl *KrakenControl) krakenTurn() { s := ctrl.kraken.gameState kraken := ctrl.kraken + ctrl.activeSuprise = false + ctrl.awaitGameStateSync() ctrl.turn++ if ctrl.turn != kraken.Turn { @@ -124,6 +131,10 @@ turn: ctrl.actions <- a ctrl.awaitGameStateSync() + + if c.IsPermanent() && ctrl.activeSuprise { + ctrl.activeSuprise = false + } } for _, u := range s.OwnUnits(kraken) { @@ -173,7 +184,16 @@ func (s *State) FindKraken() *Player { } func (s *State) KrakenSpawnTiles() []*Tile { - return s.Map.FilterTiles(func(t *Tile) bool { - return strings.Contains(t.Raw, "deep water spawn") - }) + kraken := s.FindKraken() + if !kraken.Ctrl.(*KrakenControl).activeSuprise { + return s.Map.FilterTiles(func(t *Tile) bool { + return strings.Contains(t.Raw, "deep water spawn") + }) + } + + spawns := []*Tile{} + for _, u := range s.EnemyUnits(kraken) { + spawns = append(spawns, TilesInRange(s.Map, u, 1)...) + } + return spawns } -- cgit v1.2.3