diff options
Diffstat (limited to 'go/game/challenge.go')
| -rw-r--r-- | go/game/challenge.go | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/go/game/challenge.go b/go/game/challenge.go new file mode 100644 index 00000000..9ce4515e --- /dev/null +++ b/go/game/challenge.go @@ -0,0 +1,100 @@ +package game + +import ( + "log" + "math/rand" +) + +func NewRandomChallenge(name string) *LocalState { + s := NewLocalState() + maps := []string{"2P-ring-street", "2P-river-king"} + if m, err := GetMap(maps[rand.Intn(len(maps))]); err != nil { + log.Panic(err) + } else { + s.SetMap(m) + } + + // Prepare the players + s.AddNewPlayer(name, NewDeck()) + // Add Opponent + ai := s.AddNewPlayer("opponent", NewDeck()) + ai.Ctrl = NewSimpleAiControl(ai) + + switch rand.Intn(2) { + // Cavalry Archer Challenge + case 0: + return prepCavArcherChallenge(s) + // Random Base Challenge + default: + return prepBaseChallenge(s) + } +} + +func prepCavArcherChallenge(s *LocalState) *LocalState { + // Override old Prepare to prevent Kings from beeing spawned + s._map.Prepare = func(*LocalState) { + u := NewCard("base/cavalry_archer") + 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) + 4 + units := make([]*Card, 0, nUnits) + // Only use Melee Units + candidates := NewDeckFromCardPaths(Sets.Base.CardPaths()).FilterCards(func(c *Card) bool { + if c.Type != CardTypes.Unit { + return false + } + + // Disallow armor since the cavalry archer can not penetrate it. + if _, err := c.getXEffect("armor"); err == nil { + return false + } + + var attack Attack + if attackDesc, found := c.Values["attack"]; found { + attack = parseAttack(attackDesc) + return attack.MaxRange() == 1 + } + return false + }) + + 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))] + ai := s.PlayerById(2) + 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) + } + } + return winners + } + } + + return s +} + +func prepBaseChallenge(s *LocalState) *LocalState { + p := s.PlayerById(1) + nCards := rand.Intn(6) + nCards = nCards + 3 + NewRandomDeck(nCards, []SetIdentifier{Sets.Base, Sets.Magic, Sets.Equipments}).MoveInto(p.Store) + + ai := s.PlayerById(2) + ai.Deck = NewRandomDeck(nCards, []SetIdentifier{Sets.Base}) + + return s +} |
