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