aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2023-02-08 12:03:16 +0100
committerFlorian Fischer <florian.fischer@muhq.space>2025-08-20 15:50:08 +0200
commit145353d56263fdd99b395c72814fb5cd03cc9fcd (patch)
tree5240d15b3468a867853ad23fd011c6fa8a712a2a
parentc35ccce84a1fa086b91dfe9f05169e39dd507c76 (diff)
downloadmuhqs-game-145353d56263fdd99b395c72814fb5cd03cc9fcd.tar.gz
muhqs-game-145353d56263fdd99b395c72814fb5cd03cc9fcd.zip
kraken: implement suprise!
-rw-r--r--go/game/cardImplementations.go14
-rw-r--r--go/game/kraken.go28
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
}