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"` } var defaultMessageMap = map[Ruolo]string{ Veggente: "Chi vuoi veggiare?", Lupo: "Chi vuoi uccidere?", Cacciatore: "Chi vuoi cacciare?", Guardia: "Chi vuoi guardiare?", Medium: "Chi vuoi mediare?", Fattucchiera: "Chi vuoi fattuccare?", Kamikaze: "Su chi vuoi farti esplodere?", } func RuoloMainCmd(player Player, state PartitaState) Cmd { options := []string{} switch player.Ruolo { case Veggente, Lupo, Cacciatore, Guardia, Kamikaze: for _, p := range state.Players { if p.Vivo { options = append(options, p.Username) } } case Medium: for _, p := range state.Players { if !p.Vivo { options = append(options, p.Username) } } case Fattucchiera: for _, p := range state.Players { options = append(options, p.Username) } default: return nil } return NewChooseOptionCmd( player.Username, defaultMessageMap[player.Ruolo], options, ) }