package lupus // Ruleset si occupa di far avanzare la partita, per ora un'implementazione di questa interfaccia è meglio se non ha stato (TODO: Forse sarebbe meglio come struct di funzioni) type Ruleset interface { // Start viene chiamata all'inizio di una partita per inizializzare una partita partendo da alcune info di configurazione Start(PartitaConfig) PartitaState // Update prende lo stato della partita e ne ritorna uno nuovo eventualmente utilizzando delle "UserResponse" fatte precedentemente all'utente (alla prima chiamata questa lista è vuota), successivamente c'è una corrispondenza tra lo slice di "[]UserRequest" ritornato ed il successivo slice "[]UserResponse" ricevuto. Update(state PartitaState, responses []UserResponse) (PartitaState, []UserRequest) } // 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 } type Player struct { Username string `json:"username"` Ruolo Ruolo `json:"ruolo"` Vivo bool `json:"vivo"` } type Ruolo struct { Uid string `json:"uid"` Nome string `json:"nome"` Fazione string `json:"fazione"` Aura string `json:"aura"` } 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"` } var ( AuraBianca = "bianca" AuraNera = "nera" ) var ( FazioneBuoni = "buoni" FazioneCattivi = "cattivi" ) var ( Contadino = Ruolo{ Uid: "contadino", Nome: "Contadino", Fazione: FazioneBuoni, Aura: AuraBianca, } Lupo = Ruolo{ Uid: "lupo", Nome: "Lupo", Fazione: FazioneCattivi, Aura: AuraNera, } Fattucchiera = Ruolo{ Uid: "fattucchiera", Nome: "Fattucchiera", Fazione: FazioneCattivi, Aura: AuraNera, } Indemoniato = Ruolo{ Uid: "indemoniato", Nome: "Indemoniato", Fazione: FazioneCattivi, Aura: AuraBianca, } Guardia = Ruolo{ Uid: "guardia", Nome: "Guardia", Fazione: FazioneBuoni, Aura: AuraBianca, } Cacciatore = Ruolo{ Uid: "cacciatore", Nome: "Cacciatore", Fazione: FazioneBuoni, Aura: AuraBianca, } Medium = Ruolo{ Uid: "medium", Nome: "Medium", Fazione: FazioneBuoni, Aura: AuraBianca, } Veggente = Ruolo{ Uid: "veggente", Nome: "Veggente", Fazione: FazioneBuoni, Aura: AuraBianca, } ) // Ruoli è una lista di ruoli comuni, l'ordine è puramente casuale var RuoliMap = map[string]Ruolo{ Contadino.Uid: Contadino, Lupo.Uid: Lupo, Fattucchiera.Uid: Fattucchiera, Indemoniato.Uid: Indemoniato, Guardia.Uid: Guardia, Cacciatore.Uid: Cacciatore, Medium.Uid: Medium, Veggente.Uid: Veggente, } type UserRequest struct { TargetPlayer string Request any // TODO: Work in progress } type UserResponse struct { TargetPlayer string Response any // TODO: Work in progress }