aboutsummaryrefslogtreecommitdiff
path: root/go/game
diff options
context:
space:
mode:
Diffstat (limited to 'go/game')
-rw-r--r--go/game/artifact.go1
-rw-r--r--go/game/challenge.go78
-rw-r--r--go/game/winCondition.go11
3 files changed, 77 insertions, 13 deletions
diff --git a/go/game/artifact.go b/go/game/artifact.go
index 35c05893..d3b9f0b2 100644
--- a/go/game/artifact.go
+++ b/go/game/artifact.go
@@ -1,6 +1,5 @@
package game
-
type Artifact struct {
permanentBase
Solid int
diff --git a/go/game/challenge.go b/go/game/challenge.go
index b27ef162..6e314b26 100644
--- a/go/game/challenge.go
+++ b/go/game/challenge.go
@@ -5,25 +5,34 @@ import (
"math/rand"
)
-func NewRandomChallenge(name string) *LocalState {
+func prepState(playerName, mapName string) *LocalState {
s := NewLocalState()
- maps := []string{"2P-ring-street", "2P-river-king"}
- if m, err := GetMap(maps[rand.Intn(len(maps))]); err != nil {
+ if m, err := GetMap(mapName); err != nil {
log.Panic(err)
} else {
s.SetMap(m)
}
// Prepare the players
- s.AddNewPlayer(name, NewDeck())
+ s.AddNewPlayer(playerName, NewDeck())
// Add Opponent
ai := s.AddNewPlayer("opponent", NewDeck())
ai.Ctrl = NewSimpleAiControl(ai)
- switch rand.Intn(2) {
+ return s
+}
+
+func NewRandomChallenge(name string) *LocalState {
+ maps := []string{"2P-ring-street", "2P-river-king"}
+ m := maps[rand.Intn(len(maps))]
+ s := prepState(name, m)
+
+ switch rand.Intn(3) {
// Cavalry Archer Challenge
case 0:
return prepCavArcherChallenge(s)
+ case 1:
+ return prepMissionaryChallenge(s)
// Random Base Challenge
default:
return prepBaseChallenge(s)
@@ -85,20 +94,65 @@ func prepCavArcherChallenge(s *LocalState) *LocalState {
s.addNewUnit(u, tile.Position, ai)
}
- s._map.WinCondition = func(*LocalState) []*Player {
- winners := []*Player{}
- for _, p := range s.players {
- if len(s.EnemyUnits(p)) == 0 {
- winners = append(winners, p)
- }
+ s._map.WinCondition = DeathMatch
+ }
+
+ return s
+}
+
+func NewCavArcherChallenge(playerName string) *LocalState {
+ maps := []string{"2P-ring-street", "2P-river-king"}
+ m := maps[rand.Intn(len(maps))]
+ return prepCavArcherChallenge(prepState(playerName, m))
+}
+
+func prepMissionaryChallenge(s *LocalState) *LocalState {
+ // Override old Prepare to prevent Kings from beeing spawned
+ s._map.Prepare = func(*LocalState) {
+ u := NewCard("base/missionary")
+ tiles := s._map.AvailableTilesFor(u)
+ tile := tiles[rand.Intn(len(tiles))]
+ p := s.PlayerById(1)
+ p.Deck = NewDeck()
+ s.addNewUnit(u, tile.Position, p)
+
+ // Prepare the opponent's units
+ nUnits := rand.Intn(2) + 2
+
+ units := make([]*Card, 0, nUnits)
+ ai := s.PlayerById(2)
+ // Only spawn aggressive Units
+ candidates := NewDeckFromCardPaths(Sets.Base.CardPaths()).FilterCards(func(c *Card) bool {
+ if c.Type != CardTypes.Unit {
+ return false
}
- return winners
+
+ _, found := c.Values["attack"]
+ return found
+ })
+
+ for range nUnits {
+ units = append(units, NewCard(candidates[rand.Intn(len(candidates))].Path()))
}
+
+ for _, u := range units {
+ tiles := s._map.AvailableTilesFor(u)
+ tile := tiles[rand.Intn(len(tiles))]
+ s.addNewUnit(u, tile.Position, ai)
+ }
+
+ s._map.WinCondition = DeathMatch
}
return s
}
+func NewMissionaryChallenge(playerName string) *LocalState {
+ maps := []string{"2P-ring-street", "2P-river-king"}
+ m := maps[rand.Intn(len(maps))]
+ return prepMissionaryChallenge(prepState(playerName, m))
+}
+
func prepBaseChallenge(s *LocalState) *LocalState {
p := s.PlayerById(1)
nCards := rand.Intn(6)
diff --git a/go/game/winCondition.go b/go/game/winCondition.go
index d08f4135..ded9b0ca 100644
--- a/go/game/winCondition.go
+++ b/go/game/winCondition.go
@@ -43,3 +43,14 @@ func KingGame(s *LocalState) []*Player {
}
return winners
}
+
+// DeathMatch returns the players without enemy &nits.
+func DeathMatch(s *LocalState) []*Player {
+ winners := []*Player{}
+ for _, p := range s.players {
+ if len(s.EnemyUnits(p)) == 0 {
+ winners = append(winners, p)
+ }
+ }
+ return winners
+}