package lupus import ( "fmt" "log" "math/rand" "github.com/aziis98/lupus-lite/util" ) const MessageRogo = "Chi vuoi bruciare al rogo?" var Ruleset1 = Ruleset{ Start: func(config PartitaConfig) PartitaState { state := PartitaState{ Players: make([]Player, len(config.Players)), Time: 0, Actions: []Action{}, } // Creo uno slice con il numero di ruoli in base al numero corrispondente per ruolo in "config.RoleCounts" ruoli := make([]Ruolo, 0, len(config.Players)) for ruolo, count := range config.RoleCounts { ruoli = append(ruoli, util.RepeatedSlice(ruolo, count)...) } // ed i rimanenti sono contadini for len(ruoli) < len(config.Players) { // riempi il resto dei ruoli con contadini ruoli = append(ruoli, Contadino) } // mischio la lista di ruoli util.Shuffle(ruoli) for i, username := range config.Players { log.Printf(`Al giocatore %q è stato assegnato il ruolo di %q`, username, ruoli[i].Nome) state.Players[i] = Player{ Username: username, Ruolo: ruoli[i], Vivo: true, } } return state }, Update: func(state PartitaState, responses []Msg) (PartitaState, []Cmd) { playerCommands := []Cmd{} if state.Time == 0 { ruoliAgenti := map[Ruolo]struct{}{ Fattucchiera: {}, Veggente: {}, } for _, player := range state.Players { if _, present := ruoliAgenti[player.Ruolo]; present { playerCommands = append(playerCommands, RuoloMainCmd(player, state)) } } state.Time++ return state, playerCommands } // di giorno i giocatori vivi ricevono un form per votare qualcuno da bruciare al rogo e possono scegliere solo tra i vivi if state.IsGiorno() { alivePlayers := []string{} for _, player := range state.Players { if player.Vivo { alivePlayers = append(alivePlayers, player.Username) } } for _, option := range alivePlayers { playerCommands = append(playerCommands, NewChooseOptionCmd( option, MessageRogo, alivePlayers, )) } state.Time++ return state, playerCommands } if state.IsNotte() { i := rand.Intn(len(state.Players)) diedPlayer := state.Players[i] state.Players[i].Vivo = false alivePlayers := []string{} for _, player := range state.Players { if player.Vivo { alivePlayers = append(alivePlayers, player.Username) } } for _, playerId := range alivePlayers { playerCommands = append(playerCommands, NewDisplayCmd( playerId, fmt.Sprintf("@%s è morto questa notte", diedPlayer.Username), )) } state.Time++ return state, playerCommands } return state, []Cmd{} }, }