diff options
Diffstat (limited to 'go/game')
| -rw-r--r-- | go/game/artifact.go | 1 | ||||
| -rw-r--r-- | go/game/challenge.go | 78 | ||||
| -rw-r--r-- | go/game/winCondition.go | 11 |
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 +} |
