diff --git a/cardsim/player.go b/cardsim/player.go index a0eeaac..539a780 100644 --- a/cardsim/player.go +++ b/cardsim/player.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "math/rand" + "time" ) var ( @@ -73,7 +74,7 @@ type Player[C StatsCollection] struct { Name string // Rand is a source of randomness that other components can use. - Rand rand.Rand + Rand *rand.Rand Deck *Deck[C] Hand []Card[C] @@ -151,6 +152,27 @@ const ( GameStalled ) +// InitPlayer returns a mostly-uninitialized Player with the fields +// that require specific initialization already configured and the +// provided StatsCollection (if any) already assigned to its Stats. +// Most fields are not configured and need to be assigned after this. +// +// The Player is initialized with an empty deck, empty rule collection, +// a hand limit of 1, an actions-per-turn limit of 1, and a random +// number generator seeded with the nanosecond component of the current time. +// The Deck shares this random number generator. +func InitPlayer[C StatsCollection](stats C) *Player[C] { + r := rand.New(rand.NewSource(time.Now().UnixNano())) + return &Player[C]{ + Stats: stats, + Rand: r, + Deck: &Deck[C]{rand: r}, + HandLimit: 1, + ActionsPerTurn: 1, + Rules: NewRuleCollection[C](), + } +} + // Over returns whether this state represents a game that is over. func (g GameState) Over() bool { return g == GameLost || g == GameWon || g == GameCrashed || g == GameStalled