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.

86 lines
2.3 KiB
Go

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"`
}
2 years ago
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 {
2 years ago
options = append(options, p.Username)
}
}
case Medium:
for _, p := range state.Players {
if !p.Vivo {
2 years ago
options = append(options, p.Username)
}
}
case Fattucchiera:
for _, p := range state.Players {
2 years ago
options = append(options, p.Username)
}
default:
2 years ago
return nil
}
2 years ago
return NewChooseOptionCmd(
player.Username,
defaultMessageMap[player.Ruolo],
options,
)
}