package lupus // PartitaConfig è un config minimale per creare il primo stato della partita type PartitaConfig struct { Players []string RoleCounts map[Ruolo]int } // PartitaState rappresenta lo stato della partita type PartitaState struct { // Players è una mappa da username a giocatore Players []Player `json:"players"` // Time indica la fase corrente del gioco (la parità indica notte/giorno e si inizia da "Notte 0") Time uint `json:"time"` // PhaseActions indica quali azioni sono state fatte in una certa fase Actions []Action `json:"actions"` // Won inizialmente è nil e diventa &"FazioneBuoni" o &"FazioneCattivi" quando una delle due fazioni viene dichiarata vincitrice Won *string } func (p PartitaState) IsNotte() bool { return p.Time%2 == 0 } func (p PartitaState) IsGiorno() bool { return p.Time%2 == 1 } func (p PartitaState) NumeroGiorno() uint { return (p.Time + 1) / 2 } type Player struct { Username string `json:"username"` Ruolo Ruolo `json:"ruolo"` Vivo bool `json:"vivo"` } type Action struct { Uid string `json:"uid"` Time uint `json:"time"` // Time indica in quale fase è stata compiuta l'azione Player string `json:"player"` TargetPlayer string `json:"targetPlayer"` } type Ruolo struct { Uid string `json:"uid"` Nome string `json:"nome"` Fazione string `json:"fazione"` Aura string `json:"aura"` } func RuoloMainCmd(player Player, state PartitaState) (cmd PlayerCommand, noop bool) { switch player.Ruolo { case Veggente, Lupo, Cacciatore, Guardia, Kamikaze: alivePlayers := []string{} for _, p := range state.Players { if p.Vivo { alivePlayers = append(alivePlayers, p.Username) } } return PlayerCommand{ TargetPlayer: player.Username, Request: ChoosePlayerCmd{alivePlayers}, }, false case Medium: deadPlayers := []string{} for _, p := range state.Players { if !p.Vivo { deadPlayers = append(deadPlayers, p.Username) } } return PlayerCommand{ TargetPlayer: player.Username, Request: ChoosePlayerCmd{deadPlayers}, }, false case Fattucchiera: allPlayers := []string{} for _, p := range state.Players { allPlayers = append(allPlayers, p.Username) } return PlayerCommand{ TargetPlayer: player.Username, Request: ChoosePlayerCmd{allPlayers}, }, false default: return PlayerCommand{}, true } }