package game import ( "image/color" ) const ( MAX_DRAW int = 3 ) type Player struct { Id int Name string Turn int Resource int DrawPerTurn int Hand *Hand DiscardPile *DiscardPile Deck *Deck Store *Store gameState *State Color color.Color Ctrl PlayerControl } func NewPlayer(id int, name string, deck *Deck, gameState *State, color color.Color, ) *Player { store := NewStore() deck.MoveInto(store) p := Player{ Id: id, Name: name, Turn: 0, Resource: 0, DrawPerTurn: MAX_DRAW, Hand: NewHand(), DiscardPile: NewDiscardPile(), Deck: NewDeckFromDeckList(gameState.Map.StartDeckList), Store: store, gameState: gameState, Color: color, Ctrl: nil, } return &p } func (p *Player) resourceGain() int { if p.Name == "The kraken" { return p.gameState.Map.ResourceGain * (len(p.gameState.Players) - 1) } else { return p.gameState.Map.ResourceGain } } func (p *Player) Upkeep() { p.Resource += p.resourceGain() // TODO: handle upkeep triggers for _, unit := range p.gameState.Units { if unit.Controller != p { continue } // TODO: let players decide if they want to pay the upkeep p.Resource -= unit.Upkeep // TODO: better refresh unit actions unit.AvailAttackActions = 1 unit.AvailMoveActions = 1 } } func (p *Player) ActionPhase() { for { a := promptAction(p.Ctrl) if _, ok := a.(*PassPriorityAction); ok { return } p.gameState.DeclareAction(a) p.gameState.Stack.Resolve() } } func (p *Player) buy(c *Card) { p.Resource -= c.BuyCost p.DiscardPile.AddCard(c) } func (p *Player) BuyPhase() { a := promptBuy(p.Ctrl) if _, ok := a.(*PassPriorityAction); ok { return } p.gameState.DeclareAction(a) p.gameState.Stack.Resolve() // TODO: select card to buy } func (p *Player) DiscardCard(c *Card) { p.Hand.MoveCard(c, p.DiscardPile) } func (p *Player) DiscardPhase() { // TODO: select cards to discard } func (p *Player) Draw() { toDraw := p.DrawPerTurn - p.Hand.Size() if toDraw < 1 { return } p.DrawN(toDraw) } func (p *Player) DrawN(n int) { drawnCards := p.Deck.Draw(n) p.Hand.AddCards(drawnCards) }