diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2023-02-08 12:03:16 +0100 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-08-20 15:50:08 +0200 |
| commit | 145353d56263fdd99b395c72814fb5cd03cc9fcd (patch) | |
| tree | 5240d15b3468a867853ad23fd011c6fa8a712a2a | |
| parent | c35ccce84a1fa086b91dfe9f05169e39dd507c76 (diff) | |
| download | muhqs-game-145353d56263fdd99b395c72814fb5cd03cc9fcd.tar.gz muhqs-game-145353d56263fdd99b395c72814fb5cd03cc9fcd.zip | |
kraken: implement suprise!
| -rw-r--r-- | go/game/cardImplementations.go | 14 | ||||
| -rw-r--r-- | 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 } |
