You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
2.6 KiB
Go

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{}
},
}