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