36 lines
1.3 KiB
Go
36 lines
1.3 KiB
Go
package game
|
|
|
|
// SimulateBattle resolves a hypothetical two-player battle between the given
|
|
// arranged decks (top of deck first) and returns the result. It runs on a
|
|
// scratch game, so it never touches real state — callers (notably the AI
|
|
// player) can roll out as many what-if battles as they like. Dice rolls are
|
|
// random unless rollDie is non-nil.
|
|
func SimulateBattle(round, prioritySeat int, deckA, deckB []Card, rollDie func() int) *BattleResult {
|
|
g := &Game{
|
|
Round: round,
|
|
PrioritySeat: prioritySeat,
|
|
RollDie: rollDie,
|
|
// Cards minted during the simulation (apples, bees) get IDs far away
|
|
// from real ones, purely to avoid confusion when reading results.
|
|
NextCardID: 1_000_000,
|
|
Players: []*Player{
|
|
{Name: "A", Seat: 0, Deck: append([]Card(nil), deckA...)},
|
|
{Name: "B", Seat: 1, Deck: append([]Card(nil), deckB...)},
|
|
},
|
|
}
|
|
g.resolveBattle()
|
|
return g.Battle
|
|
}
|
|
|
|
// TierContents returns the full printed contents of a tier's shop deck —
|
|
// public information from the box. Cards carry placeholder IDs; they are
|
|
// reference data, not live instances.
|
|
func TierContents(tier int) []Card {
|
|
scratch := &Game{}
|
|
scratch.buildShopDecks()
|
|
if tier < 1 || tier > len(scratch.ShopDecks) {
|
|
return nil
|
|
}
|
|
return scratch.ShopDecks[tier-1]
|
|
}
|