mirror of
https://github.com/RYGhub/royal-mifia.git
synced 2024-11-22 05:44:19 +00:00
commit
4d9969b427
2 changed files with 368 additions and 105 deletions
359
main.py
359
main.py
|
@ -176,7 +176,7 @@ class Angelo(Role):
|
||||||
# Imposta qualcuno come protetto
|
# Imposta qualcuno come protetto
|
||||||
selected = game.findplayerbyusername(arg)
|
selected = game.findplayerbyusername(arg)
|
||||||
if selected is not None:
|
if selected is not None:
|
||||||
if selected is not Player:
|
if selected is not Player: # TODO: cavolo ho scritto qui?
|
||||||
# Togli la protezione a quello che stavi proteggendo prima
|
# Togli la protezione a quello che stavi proteggendo prima
|
||||||
if self.protecting is not None:
|
if self.protecting is not None:
|
||||||
self.protecting.protectedby = None
|
self.protecting.protectedby = None
|
||||||
|
@ -230,6 +230,7 @@ class Derek(Role):
|
||||||
super().__init__(player)
|
super().__init__(player)
|
||||||
# Per qualche motivo assurdo ho deciso di tenere l'oggetto Player qui
|
# Per qualche motivo assurdo ho deciso di tenere l'oggetto Player qui
|
||||||
self.deathwish = False
|
self.deathwish = False
|
||||||
|
self.chaos = False
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
r = "<Role: Derek>"
|
r = "<Role: Derek>"
|
||||||
|
@ -248,6 +249,7 @@ class Derek(Role):
|
||||||
if self.deathwish:
|
if self.deathwish:
|
||||||
game.message(bot, s.derek_deathwish_successful.format(name=self.player.tusername))
|
game.message(bot, s.derek_deathwish_successful.format(name=self.player.tusername))
|
||||||
self.player.kill(bot, game)
|
self.player.kill(bot, game)
|
||||||
|
self.chaos = True
|
||||||
|
|
||||||
|
|
||||||
class Disastro(Role):
|
class Disastro(Role):
|
||||||
|
@ -312,8 +314,98 @@ class Mamma(Role):
|
||||||
role=target.role.name))
|
role=target.role.name))
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
|
class Stagista(Role):
|
||||||
|
"""Lo stagista sceglie una persona da cui andare in stage e prende il suo ruolo."""
|
||||||
|
icon = s.intern_icon
|
||||||
|
team = 'Good'
|
||||||
|
name = s.intern_name
|
||||||
|
powerdesc = s.intern_power_description
|
||||||
|
|
||||||
|
def __init__(self, player):
|
||||||
|
super().__init__(player)
|
||||||
|
self.master = None
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return "<Role: Stagista>"
|
||||||
|
|
||||||
|
def power(self, bot, game, arg):
|
||||||
|
target = game.findplayerbyusername(arg)
|
||||||
|
if target is not None and target is not self.player and target.alive:
|
||||||
|
self.master = target
|
||||||
|
self.player.message(bot, s.intern_started_internship.format(master=self.master.tusername))
|
||||||
|
else:
|
||||||
|
self.player.message(bot, s.error_no_username)
|
||||||
|
|
||||||
|
def onendday(self, bot, game):
|
||||||
|
if self.master is not None:
|
||||||
|
if isinstance(self.master.role, Derek) and self.master.role.chaos:
|
||||||
|
game.message(bot, s.intern_chaos_summoned)
|
||||||
|
self.master.alive = True
|
||||||
|
game.changerole(bot, self.master, SignoreDelCaos)
|
||||||
|
game.changerole(bot, self.player, Servitore)
|
||||||
|
else:
|
||||||
|
game.message(bot, s.intern_changed_role.format(icon=self.master.role.__class__.icon, role=self.master.role.__class__.name))
|
||||||
|
game.changerole(bot, self.player, self.master.role.__class__)
|
||||||
|
|
||||||
|
|
||||||
|
class SignoreDelCaos(Role):
|
||||||
|
"""Il Signore del Caos è un Derek negli ultimi secondi prima della morte.
|
||||||
|
Può cambiare la vita delle altre persone... Anche se non può decidere in cosa."""
|
||||||
|
icon = s.chaos_lord_icon
|
||||||
|
team = 'Chaos'
|
||||||
|
name = s.chaos_lord_name
|
||||||
|
powerdesc = s.chaos_lord_power_description
|
||||||
|
|
||||||
|
def __init__(self, player):
|
||||||
|
super().__init__(player)
|
||||||
|
self.target = None
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return "<Role: Signore del Caos>"
|
||||||
|
|
||||||
|
def power(self, bot, game, arg):
|
||||||
|
selected = game.findplayerbyusername(arg)
|
||||||
|
if selected is not None and selected is not self.player and selected.alive:
|
||||||
|
self.target = selected
|
||||||
|
self.player.message(bot, s.chaos_lord_target_selected.format(target=self.target.tusername))
|
||||||
|
else:
|
||||||
|
self.player.message(bot, s.error_no_username)
|
||||||
|
|
||||||
|
def onendday(self, bot, game):
|
||||||
|
if self.target is not None:
|
||||||
|
if self.target.alive and self.player.alive:
|
||||||
|
if not isinstance(self.target.role, SignoreDelCaos) or not isinstance(self.target.role, Servitore):
|
||||||
|
randomrole = random.sample(rolepriority, 1)[0]
|
||||||
|
game.changerole(bot, self.target, randomrole)
|
||||||
|
game.message(bot, s.chaos_lord_randomized)
|
||||||
|
else:
|
||||||
|
game.message(bot, s.chaos_lord_failed)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Servitore(Role):
|
||||||
|
"""Il servitore del Caos è il sottoposto al Signore del Caos.
|
||||||
|
Se non ci sono Signori del Caos in partita diventa Signore del Caos."""
|
||||||
|
icon = s.derek_icon
|
||||||
|
team = 'Chaos'
|
||||||
|
name = s.chaos_servant_name
|
||||||
|
powerdesc = s.chaos_servant_power_description
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return "<Role: Servitore del Caos>"
|
||||||
|
|
||||||
|
def onendday(self, bot, game):
|
||||||
|
for chaoslord in game.playersinrole["SignoreDelCaos"]:
|
||||||
|
if chaoslord.alive:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
game.changerole(bot, self.player, SignoreDelCaos)
|
||||||
|
game.message(bot, s.chaos_servant_inherited)
|
||||||
|
|
||||||
|
|
||||||
# Ordine in cui vengono eseguiti i onendday dei vari ruoli.
|
# Ordine in cui vengono eseguiti i onendday dei vari ruoli.
|
||||||
rolepriority = [Mifioso, Investigatore, Disastro, Angelo, Derek, Terrorista, Mamma]
|
rolepriority = [Mifioso, Investigatore, Disastro, Angelo, Derek, Stagista, Terrorista, Mamma, SignoreDelCaos, Servitore]
|
||||||
|
|
||||||
|
|
||||||
class Player:
|
class Player:
|
||||||
|
@ -419,7 +511,7 @@ class Game:
|
||||||
def findplayerbyusername(self, tusername) -> Player:
|
def findplayerbyusername(self, tusername) -> Player:
|
||||||
"""Trova il giocatore con un certo username."""
|
"""Trova il giocatore con un certo username."""
|
||||||
for player in self.players:
|
for player in self.players:
|
||||||
if player.tusername.lower() == tusername.lower():
|
if player.tusername.lower() == tusername.strip("@").lower():
|
||||||
return player
|
return player
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
@ -503,7 +595,7 @@ class Game:
|
||||||
def endday(self, bot):
|
def endday(self, bot):
|
||||||
"""Finisci la giornata, uccidi il più votato del giorno ed esegui gli endday di tutti i giocatori."""
|
"""Finisci la giornata, uccidi il più votato del giorno ed esegui gli endday di tutti i giocatori."""
|
||||||
# SALVA LA PARTITA, così se crasha si riprende da qui
|
# SALVA LA PARTITA, così se crasha si riprende da qui
|
||||||
self.save()
|
self.save(bot)
|
||||||
# Conta i voti ed elimina il più votato.
|
# Conta i voti ed elimina il più votato.
|
||||||
topvotes = self.mostvotedplayer()
|
topvotes = self.mostvotedplayer()
|
||||||
if len(topvotes) > 0:
|
if len(topvotes) > 0:
|
||||||
|
@ -561,32 +653,54 @@ class Game:
|
||||||
def startpreset(self, bot):
|
def startpreset(self, bot):
|
||||||
"""Inizio della fase di preset"""
|
"""Inizio della fase di preset"""
|
||||||
self.phase = 'Preset'
|
self.phase = 'Preset'
|
||||||
# Crea la tastiera
|
if __debug__:
|
||||||
kbmarkup = InlineKeyboardMarkup([
|
# Preset di debug
|
||||||
[
|
self.roleconfig = {
|
||||||
InlineKeyboardButton(s.preset_simple, callback_data="simple"),
|
"Mifioso": 0,
|
||||||
InlineKeyboardButton(s.preset_classic, callback_data="classic"),
|
"Investigatore": 0,
|
||||||
InlineKeyboardButton(s.preset_full, callback_data="full")
|
"Angelo": 0,
|
||||||
],
|
"Terrorista": 0,
|
||||||
[
|
"Derek": 0,
|
||||||
InlineKeyboardButton(s.preset_custom, callback_data="custom")
|
"Disastro": 0,
|
||||||
]
|
"Mamma": 0,
|
||||||
])
|
"Stagista": 0,
|
||||||
# Manda la tastiera
|
"SignoreDelCaos": 0,
|
||||||
bot.sendMessage(self.groupid, s.preset_choose, parse_mode=ParseMode.MARKDOWN, reply_markup=kbmarkup)
|
"Servitore": 0
|
||||||
|
}
|
||||||
|
self.votingmifia = True
|
||||||
|
self.missingmifia = False
|
||||||
|
self.endconfig(bot)
|
||||||
|
self.message(bot, "Utilizzando il preset di debug (tutti royal, cambia ruolo con `/debugchangerole nomeutente ruolo`.")
|
||||||
|
else:
|
||||||
|
# Crea la tastiera
|
||||||
|
kbmarkup = InlineKeyboardMarkup([
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(s.preset_simple, callback_data="simple"),
|
||||||
|
InlineKeyboardButton(s.preset_classic, callback_data="classic"),
|
||||||
|
InlineKeyboardButton(s.preset_full, callback_data="full")
|
||||||
|
],
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(s.preset_custom, callback_data="custom")
|
||||||
|
]
|
||||||
|
])
|
||||||
|
# Manda la tastiera
|
||||||
|
bot.sendMessage(self.groupid, s.preset_choose, parse_mode=ParseMode.MARKDOWN, reply_markup=kbmarkup)
|
||||||
|
|
||||||
def loadpreset(self, bot, preset):
|
def loadpreset(self, bot, preset):
|
||||||
"""Fine della fase di preset: carica il preset selezionato o passa a config"""
|
"""Fine della fase di preset: carica il preset selezionato o passa a config"""
|
||||||
if preset == "simple":
|
if preset == "simple":
|
||||||
# Preset semplice
|
# Preset semplice
|
||||||
self.roleconfig = {
|
self.roleconfig = {
|
||||||
"Mifioso": math.floor(len(self.players) / 8) + 1, # 1 Mifioso ogni 8 giocatori
|
"Mifioso": math.floor(len(self.players) / 8) + 1, # 1 Mifioso ogni 8 giocatori
|
||||||
"Investigatore": math.floor(len(self.players) / 12) + 1, # 1 Detective ogni 12 giocatori
|
"Investigatore": math.floor(len(self.players) / 12) + 1, # 1 Detective ogni 12 giocatori
|
||||||
"Angelo": 0,
|
"Angelo": 0,
|
||||||
"Terrorista": 0,
|
"Terrorista": 0,
|
||||||
"Derek": 0,
|
"Derek": 0,
|
||||||
"Disastro": 0,
|
"Disastro": 0,
|
||||||
"Mamma": 0
|
"Mamma": 0,
|
||||||
|
"Stagista": 0,
|
||||||
|
"SignoreDelCaos": 0,
|
||||||
|
"Servitore": 0
|
||||||
}
|
}
|
||||||
self.votingmifia = True
|
self.votingmifia = True
|
||||||
self.missingmifia = False
|
self.missingmifia = False
|
||||||
|
@ -594,13 +708,16 @@ class Game:
|
||||||
elif preset == "classic":
|
elif preset == "classic":
|
||||||
# Preset classico
|
# Preset classico
|
||||||
self.roleconfig = {
|
self.roleconfig = {
|
||||||
"Mifioso": math.floor(len(self.players) / 8) + 1, # 1 Mifioso ogni 8 giocatori
|
"Mifioso": math.floor(len(self.players) / 8) + 1, # 1 Mifioso ogni 8 giocatori
|
||||||
"Investigatore": math.floor(len(self.players) / 12) + 1, # 1 Detective ogni 12 giocatori
|
"Investigatore": math.floor(len(self.players) / 12) + 1, # 1 Detective ogni 12 giocatori
|
||||||
"Angelo": math.floor(len(self.players) / 10) + 1, # 1 Angelo ogni 10 giocatori
|
"Angelo": math.floor(len(self.players) / 10) + 1, # 1 Angelo ogni 10 giocatori
|
||||||
"Terrorista": 1 if random.randrange(0, 99) > 70 else 0, # 30% di avere un terrorista
|
"Terrorista": 1 if random.randrange(0, 99) > 70 else 0, # 30% di avere un terrorista
|
||||||
"Derek": 0,
|
"Derek": 0,
|
||||||
"Disastro": 0,
|
"Disastro": 0,
|
||||||
"Mamma": 0
|
"Mamma": 0,
|
||||||
|
"Stagista": 0,
|
||||||
|
"SignoreDelCaos": 0,
|
||||||
|
"Servitore": 0
|
||||||
}
|
}
|
||||||
self.votingmifia = True
|
self.votingmifia = True
|
||||||
self.missingmifia = False
|
self.missingmifia = False
|
||||||
|
@ -609,13 +726,16 @@ class Game:
|
||||||
# Preset completo
|
# Preset completo
|
||||||
self.roleconfig = {
|
self.roleconfig = {
|
||||||
# 1 di ogni ruolo
|
# 1 di ogni ruolo
|
||||||
"Mifioso": math.floor(len(self.players) / 8) + 1,
|
"Mifioso": math.floor(len(self.players) / 9) + 1,
|
||||||
"Investigatore": math.floor(len(self.players) / 9) + 1,
|
"Investigatore": math.floor(len(self.players) / 10) + 1,
|
||||||
"Angelo": math.floor(len(self.players) / 10) + 1,
|
"Angelo": math.floor(len(self.players) / 11) + 1,
|
||||||
"Terrorista": math.floor(len(self.players) / 11) + 1,
|
"Terrorista": math.floor(len(self.players) / 12) + 1,
|
||||||
"Derek": math.floor(len(self.players) / 12) + 1,
|
"Derek": math.floor(len(self.players) / 13) + 1,
|
||||||
"Disastro": math.floor(len(self.players) / 13) + 1,
|
"Disastro": math.floor(len(self.players) / 14) + 1,
|
||||||
"Mamma": math.floor(len(self.players) / 14) + 1
|
"Mamma": math.floor(len(self.players) / 15) + 1,
|
||||||
|
"Stagista": math.floor(len(self.players) / 16) + 1,
|
||||||
|
"SignoreDelCaos": 0,
|
||||||
|
"Servitore": 0
|
||||||
}
|
}
|
||||||
self.votingmifia = True
|
self.votingmifia = True
|
||||||
self.missingmifia = True
|
self.missingmifia = True
|
||||||
|
@ -651,7 +771,7 @@ class Game:
|
||||||
def endgame(self):
|
def endgame(self):
|
||||||
inprogress.remove(self)
|
inprogress.remove(self)
|
||||||
|
|
||||||
def save(self):
|
def save(self, bot):
|
||||||
# Crea il file.
|
# Crea il file.
|
||||||
try:
|
try:
|
||||||
file = open(str(self.groupid) + ".p", 'x')
|
file = open(str(self.groupid) + ".p", 'x')
|
||||||
|
@ -664,8 +784,8 @@ class Game:
|
||||||
pickle.dump(self, file)
|
pickle.dump(self, file)
|
||||||
file.close()
|
file.close()
|
||||||
# Crea un file uguale ma con un timestamp
|
# Crea un file uguale ma con un timestamp
|
||||||
# Non sono troppo sicuro che il timestamp si faccia così
|
# Non sono troppo sicuro che il timestamp si faccia così però funziona
|
||||||
t = datetime.datetime(0,0,0,0,0).now()
|
t = datetime.datetime(2000,1,1,1,1).now()
|
||||||
try:
|
try:
|
||||||
file = open("{group}-{yy}-{mm}-{dd}-{hh}-{mi}.p".format(group=str(self.groupid), yy=t.year, mm=t.month, dd=t.day, hh=t.hour, mi=t.minute), 'x')
|
file = open("{group}-{yy}-{mm}-{dd}-{hh}-{mi}.p".format(group=str(self.groupid), yy=t.year, mm=t.month, dd=t.day, hh=t.hour, mi=t.minute), 'x')
|
||||||
except FileExistsError:
|
except FileExistsError:
|
||||||
|
@ -675,30 +795,36 @@ class Game:
|
||||||
# Scrivi sul file.
|
# Scrivi sul file.
|
||||||
file = open("{group}-{yy}-{mm}-{dd}-{hh}-{mi}.p".format(group=str(self.groupid), yy=t.year, mm=t.month, dd=t.day, hh=t.hour, mi=t.minute), 'wb')
|
file = open("{group}-{yy}-{mm}-{dd}-{hh}-{mi}.p".format(group=str(self.groupid), yy=t.year, mm=t.month, dd=t.day, hh=t.hour, mi=t.minute), 'wb')
|
||||||
pickle.dump(self, file)
|
pickle.dump(self, file)
|
||||||
|
self.message(bot, s.game_saved)
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
def victoryconditions(self, bot):
|
def victoryconditions(self, bot):
|
||||||
# Condizioni di vittoria
|
"""Controlla se qualcuno ha completato le condizioni di vittoria."""
|
||||||
good = 0
|
good = 0
|
||||||
evil = 0
|
evil = 0
|
||||||
|
alive = 0
|
||||||
for player in self.players:
|
for player in self.players:
|
||||||
if player.alive and player.role.team == 'Evil':
|
if player.alive:
|
||||||
evil += 1
|
if player.role.team == 'Evil':
|
||||||
elif player.alive and player.role.team == 'Good':
|
evil += 1
|
||||||
good += 1
|
elif player.role.team == 'Good':
|
||||||
|
good += 1
|
||||||
|
alive += 1
|
||||||
# Distruzione atomica!
|
# Distruzione atomica!
|
||||||
if good == 0 and evil == 0:
|
if alive == 0:
|
||||||
self.message(bot, s.end_game_wiped)
|
self.message(bot, s.end_game_wiped)
|
||||||
for player in self.players:
|
for player in self.players:
|
||||||
player.message(bot, s.end_game_wiped + s.tie)
|
player.message(bot, s.end_game_wiped + s.tie)
|
||||||
# Mifiosi più dei Royal
|
# Mifiosi più dei Royal
|
||||||
elif (not self.missingmifia and evil >= good) or good == 0:
|
elif (not self.missingmifia and evil >= alive) or good == 0:
|
||||||
self.message(bot, s.end_mifia_outnumber + s.victory_mifia)
|
self.message(bot, s.end_mifia_outnumber + s.victory_mifia)
|
||||||
for player in self.players:
|
for player in self.players:
|
||||||
if player.role.team == 'Good':
|
if player.role.team == 'Good':
|
||||||
player.message(bot, s.end_mifia_outnumber + s.defeat)
|
player.message(bot, s.end_mifia_outnumber + s.defeat)
|
||||||
elif player.role.team == 'Evil':
|
elif player.role.team == 'Evil':
|
||||||
player.message(bot, s.end_mifia_outnumber + s.victory)
|
player.message(bot, s.end_mifia_outnumber + s.victory)
|
||||||
|
elif player.role.team == 'Chaos':
|
||||||
|
player.message(bot, s.end_game_chaos + s.victory)
|
||||||
self.endgame()
|
self.endgame()
|
||||||
# Male distrutto
|
# Male distrutto
|
||||||
elif evil == 0:
|
elif evil == 0:
|
||||||
|
@ -708,8 +834,32 @@ class Game:
|
||||||
player.message(bot, s.end_mifia_killed + s.victory)
|
player.message(bot, s.end_mifia_killed + s.victory)
|
||||||
elif player.role.team == 'Evil':
|
elif player.role.team == 'Evil':
|
||||||
player.message(bot, s.end_mifia_killed + s.defeat)
|
player.message(bot, s.end_mifia_killed + s.defeat)
|
||||||
|
elif player.role.team == 'Chaos':
|
||||||
|
player.message(bot, s.end_game_chaos + s.victory)
|
||||||
self.endgame()
|
self.endgame()
|
||||||
|
|
||||||
|
def changerole(self, bot, player, newrole):
|
||||||
|
"""Cambia il ruolo di un giocatore, aggiornando tutti i valori"""
|
||||||
|
# Aggiorna le liste dei ruoli
|
||||||
|
if player.role.__class__ != Royal:
|
||||||
|
self.playersinrole[player.role.__class__.__name__].remove(player)
|
||||||
|
if newrole != Royal:
|
||||||
|
self.playersinrole[newrole.__name__].append(player)
|
||||||
|
# Cambia il ruolo al giocatore
|
||||||
|
player.role = newrole(player)
|
||||||
|
# Manda i messaggi del nuovo ruolo
|
||||||
|
player.message(bot, s.role_assigned.format(icon=player.role.icon, name=player.role.name))
|
||||||
|
if player.role.powerdesc is not None:
|
||||||
|
player.message(bot, player.role.powerdesc.format(gamename=self.name))
|
||||||
|
# Aggiorna lo stato dei mifiosi
|
||||||
|
if newrole == Mifioso:
|
||||||
|
text = s.mifia_team_intro
|
||||||
|
for player in self.playersinrole['Mifioso']:
|
||||||
|
text += s.mifia_team_player.format(icon=player.role.icon, name=player.tusername)
|
||||||
|
for player in self.playersinrole['Mifioso']:
|
||||||
|
player.message(bot, text)
|
||||||
|
|
||||||
|
|
||||||
# Partite in corso
|
# Partite in corso
|
||||||
inprogress = list()
|
inprogress = list()
|
||||||
|
|
||||||
|
@ -896,6 +1046,30 @@ def config(bot, update):
|
||||||
game.configstep += 1
|
game.configstep += 1
|
||||||
game.message(bot, s.config_list[game.configstep])
|
game.message(bot, s.config_list[game.configstep])
|
||||||
elif game.configstep == 7:
|
elif game.configstep == 7:
|
||||||
|
try:
|
||||||
|
game.roleconfig["Stagista"] = int(cmd[1])
|
||||||
|
except ValueError:
|
||||||
|
game.message(bot, s.error_invalid_config)
|
||||||
|
else:
|
||||||
|
game.configstep += 1
|
||||||
|
game.message(bot, s.config_list[game.configstep])
|
||||||
|
elif game.configstep == 8:
|
||||||
|
try:
|
||||||
|
game.roleconfig["SignoreDelCaos"] = int(cmd[1])
|
||||||
|
except ValueError:
|
||||||
|
game.message(bot, s.error_invalid_config)
|
||||||
|
else:
|
||||||
|
game.configstep += 1
|
||||||
|
game.message(bot, s.config_list[game.configstep])
|
||||||
|
elif game.configstep == 9:
|
||||||
|
try:
|
||||||
|
game.roleconfig["SignoreDelCaos"] = int(cmd[1])
|
||||||
|
except ValueError:
|
||||||
|
game.message(bot, s.error_invalid_config)
|
||||||
|
else:
|
||||||
|
game.configstep += 1
|
||||||
|
game.message(bot, s.config_list[game.configstep])
|
||||||
|
elif game.configstep == 10:
|
||||||
if cmd[1].lower() == 'testa':
|
if cmd[1].lower() == 'testa':
|
||||||
game.votingmifia = False
|
game.votingmifia = False
|
||||||
game.configstep += 1
|
game.configstep += 1
|
||||||
|
@ -906,7 +1080,7 @@ def config(bot, update):
|
||||||
game.message(bot, s.config_list[game.configstep])
|
game.message(bot, s.config_list[game.configstep])
|
||||||
else:
|
else:
|
||||||
game.message(bot, s.error_invalid_config)
|
game.message(bot, s.error_invalid_config)
|
||||||
elif game.configstep == 8:
|
elif game.configstep == 11:
|
||||||
if cmd[1].lower() == 'perfetti':
|
if cmd[1].lower() == 'perfetti':
|
||||||
game.missingmifia = False
|
game.missingmifia = False
|
||||||
game.endconfig(bot)
|
game.endconfig(bot)
|
||||||
|
@ -916,7 +1090,7 @@ def config(bot, update):
|
||||||
game.message(bot, s.config_list[game.configstep])
|
game.message(bot, s.config_list[game.configstep])
|
||||||
else:
|
else:
|
||||||
game.message(bot, s.error_invalid_config)
|
game.message(bot, s.error_invalid_config)
|
||||||
elif game.configstep == 9:
|
elif game.configstep == 12:
|
||||||
try:
|
try:
|
||||||
miss = int(cmd[1])
|
miss = int(cmd[1])
|
||||||
except ValueError:
|
except ValueError:
|
||||||
|
@ -948,21 +1122,15 @@ def vote(bot, update):
|
||||||
elif game.day <= 1:
|
elif game.day <= 1:
|
||||||
game.message(bot, s.error_no_votes_on_first_day)
|
game.message(bot, s.error_no_votes_on_first_day)
|
||||||
return
|
return
|
||||||
# Trova il giocatore
|
# Genera la tastiera
|
||||||
player = game.findplayerbyid(update.message.from_user['id'])
|
table = list()
|
||||||
if player is None:
|
for player in game.players:
|
||||||
game.message(bot, s.error_not_in_game)
|
row = list()
|
||||||
return
|
row.append(InlineKeyboardButton(s.vote_keyboard_line.format(name=player.tusername), callback_data=player.tusername))
|
||||||
if not player.alive:
|
table.append(row)
|
||||||
game.message(bot, s.error_dead)
|
keyboard = InlineKeyboardMarkup(table)
|
||||||
return
|
# Manda la tastiera
|
||||||
# Trova il bersaglio
|
bot.sendMessage(game.groupid, s.vote_keyboard, parse_mode=ParseMode.MARKDOWN, reply_markup=keyboard)
|
||||||
target = game.findplayerbyusername(update.message.text.split(' ')[1])
|
|
||||||
if target is None:
|
|
||||||
game.message(bot, s.error_username)
|
|
||||||
return
|
|
||||||
player.votingfor = target
|
|
||||||
game.message(bot, s.vote.format(voted=target.tusername))
|
|
||||||
|
|
||||||
|
|
||||||
def endday(bot, update):
|
def endday(bot, update):
|
||||||
|
@ -1080,7 +1248,7 @@ def save(bot, update):
|
||||||
"""Salva una partita su file."""
|
"""Salva una partita su file."""
|
||||||
game = findgamebyid(update.message.chat['id'])
|
game = findgamebyid(update.message.chat['id'])
|
||||||
if game is not None:
|
if game is not None:
|
||||||
game.save()
|
game.save(bot)
|
||||||
else:
|
else:
|
||||||
bot.sendMessage(update.message.chat['id'], s.error_no_games_found, parse_mode=ParseMode.MARKDOWN)
|
bot.sendMessage(update.message.chat['id'], s.error_no_games_found, parse_mode=ParseMode.MARKDOWN)
|
||||||
|
|
||||||
|
@ -1090,21 +1258,28 @@ def debug(bot, update):
|
||||||
if __debug__:
|
if __debug__:
|
||||||
game = findgamebyid(update.message.chat['id'])
|
game = findgamebyid(update.message.chat['id'])
|
||||||
if game is not None:
|
if game is not None:
|
||||||
if game.admin.tid == update.message.from_user['id']:
|
text = s.status_header.format(name=game.groupid, admin=game.admin.tid, phase=game.phase)
|
||||||
text = s.status_header.format(name=game.groupid, admin=game.admin.tid, phase=game.phase)
|
game.updatevotes()
|
||||||
game.updatevotes()
|
# Aggiungi l'elenco dei giocatori
|
||||||
# Aggiungi l'elenco dei giocatori
|
for player in game.players:
|
||||||
for player in game.players:
|
if not player.alive:
|
||||||
if not player.alive:
|
text += s.status_dead_player.format(name=player.tusername)
|
||||||
text += s.status_dead_player.format(name=player.tusername)
|
else:
|
||||||
else:
|
text += s.status_alive_player.format(icon=player.role.icon,
|
||||||
text += s.status_alive_player.format(icon=player.role.icon,
|
name=player.tusername,
|
||||||
name=player.tusername,
|
votes=str(player.votes))
|
||||||
votes=str(player.votes))
|
game.message(bot, text)
|
||||||
game.adminmessage(bot, text)
|
else:
|
||||||
game.message(bot, s.check_private)
|
bot.sendMessage(update.message.chat['id'], s.error_no_games_found, parse_mode=ParseMode.MARKDOWN)
|
||||||
else:
|
|
||||||
game.message(bot, s.error_not_admin)
|
|
||||||
|
def debugchangerole(bot, update):
|
||||||
|
"""Cambia il ruolo a un giocatore."""
|
||||||
|
if __debug__:
|
||||||
|
game = findgamebyid(update.message.chat['id'])
|
||||||
|
if game is not None:
|
||||||
|
cmd = update.message.text.split(' ', 2)
|
||||||
|
game.changerole(bot, game.findplayerbyusername(cmd[1]), globals()[cmd[2]])
|
||||||
else:
|
else:
|
||||||
bot.sendMessage(update.message.chat['id'], s.error_no_games_found, parse_mode=ParseMode.MARKDOWN)
|
bot.sendMessage(update.message.chat['id'], s.error_no_games_found, parse_mode=ParseMode.MARKDOWN)
|
||||||
|
|
||||||
|
@ -1115,15 +1290,26 @@ def debuggameslist(bot, update):
|
||||||
bot.sendMessage(update.message.from_user['id'], repr(inprogress), parse_mode=ParseMode.MARKDOWN)
|
bot.sendMessage(update.message.from_user['id'], repr(inprogress), parse_mode=ParseMode.MARKDOWN)
|
||||||
|
|
||||||
|
|
||||||
def selectpreset(bot, update):
|
def inlinekeyboard(bot, update):
|
||||||
"""Seleziona un preset dalla tastiera."""
|
"""Seleziona un preset dalla tastiera."""
|
||||||
game = findgamebyid(update.callback_query.message.chat['id'])
|
game = findgamebyid(update.callback_query.message.chat['id'])
|
||||||
if game is not None and game.phase is 'Preset':
|
if game is not None:
|
||||||
if update.callback_query.from_user['id'] == game.admin.tid:
|
if game.phase is 'Preset':
|
||||||
game.loadpreset(bot, update.callback_query.data)
|
if update.callback_query.from_user['id'] == game.admin.tid:
|
||||||
|
game.loadpreset(bot, update.callback_query.data)
|
||||||
|
elif game.phase is 'Voting':
|
||||||
|
# Trova il giocatore
|
||||||
|
player = game.findplayerbyid(update.callback_query.from_user['id'])
|
||||||
|
if player is not None:
|
||||||
|
# Trova il bersaglio
|
||||||
|
target = game.findplayerbyusername(update.callback_query.data)
|
||||||
|
player.votingfor = target
|
||||||
|
game.message(bot, s.vote.format(voting=player.tusername, voted=target.tusername))
|
||||||
|
bot.answerCallbackQuery(callback_query_id=update.callback_query.id, text=s.vote_fp.format(voted=target.tusername))
|
||||||
|
|
||||||
|
|
||||||
def handleerror(bot, update, error):
|
def handleerror(bot, update, error):
|
||||||
|
print("Error: " + error)
|
||||||
try:
|
try:
|
||||||
bot.sendMessage(update.message.chat['id'], error)
|
bot.sendMessage(update.message.chat['id'], error)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
|
@ -1149,7 +1335,8 @@ updater.dispatcher.add_handler(CommandHandler('fakerole', fakerole))
|
||||||
updater.dispatcher.add_handler(CommandHandler('save', save))
|
updater.dispatcher.add_handler(CommandHandler('save', save))
|
||||||
updater.dispatcher.add_handler(CommandHandler('load', load))
|
updater.dispatcher.add_handler(CommandHandler('load', load))
|
||||||
updater.dispatcher.add_handler(CommandHandler('delete', delete))
|
updater.dispatcher.add_handler(CommandHandler('delete', delete))
|
||||||
updater.dispatcher.add_handler(CallbackQueryHandler(selectpreset))
|
updater.dispatcher.add_handler(CommandHandler('debugchangerole', debugchangerole))
|
||||||
|
updater.dispatcher.add_handler(CallbackQueryHandler(inlinekeyboard))
|
||||||
updater.dispatcher.add_error_handler(handleerror)
|
updater.dispatcher.add_error_handler(handleerror)
|
||||||
updater.start_polling()
|
updater.start_polling()
|
||||||
print("Bot avviato!")
|
print("Bot avviato!")
|
||||||
|
|
114
strings.py
114
strings.py
|
@ -95,7 +95,7 @@ derek_power_description = "Puoi decidere di suicidarti alla fine di un round.\n"
|
||||||
"Potresti farlo per confondere le idee ai Royal, o per ragequittare malissimo.\n" \
|
"Potresti farlo per confondere le idee ai Royal, o per ragequittare malissimo.\n" \
|
||||||
"Sta a te la scelta.\n" \
|
"Sta a te la scelta.\n" \
|
||||||
"Per lasciare questo mondo alla fine del giorno, scrivi in questa chat:\n" \
|
"Per lasciare questo mondo alla fine del giorno, scrivi in questa chat:\n" \
|
||||||
"`/power {gamename}`\n"
|
"`/power {gamename} banana`\n"
|
||||||
|
|
||||||
# Derek: morte attivata
|
# Derek: morte attivata
|
||||||
derek_deathwish_set = "*Morirai* alla fine di questo giorno."
|
derek_deathwish_set = "*Morirai* alla fine di questo giorno."
|
||||||
|
@ -125,6 +125,65 @@ mom_power_description = "All'inizio della partita scoprirai il ruolo di un gioca
|
||||||
# Mamma: scoperta di un ruolo
|
# Mamma: scoperta di un ruolo
|
||||||
mom_discovery = "@{target} è un *{icon} {role}*.\n" \
|
mom_discovery = "@{target} è un *{icon} {role}*.\n" \
|
||||||
|
|
||||||
|
# Stagista: icona
|
||||||
|
intern_icon = "\U0001F913"
|
||||||
|
|
||||||
|
# Stagista: nome ruolo
|
||||||
|
intern_name = "Stagista"
|
||||||
|
|
||||||
|
# Stagista: descrizione del potere
|
||||||
|
intern_power_description = "In qualsiasi momento della partita puoi scegliere un altro giocatore.\n" \
|
||||||
|
"Il tuo ruolo diventerà uguale al suo.\n" \
|
||||||
|
"Ricordati che, qualsiasi cosa succeda, è sempre colpa dello stagista, cioè tua!\n" \
|
||||||
|
"Per andare in stage, scrivi in questa chat:\n" \
|
||||||
|
"`/power {gamename} nomeutentedatoredilavoro`"
|
||||||
|
|
||||||
|
# Stagista: inizia lo stage
|
||||||
|
intern_started_internship = "Stai andando in stage da @{master}."
|
||||||
|
|
||||||
|
# Stagista: cambiato ruolo
|
||||||
|
intern_changed_role = "Lo stagista ha finito il tirocinio ed ha imparato i segreti del mestiere di *{icon} {role}*."
|
||||||
|
|
||||||
|
#Stagista: EVOCATO IL SIGNORE DEL CAOS
|
||||||
|
intern_chaos_summoned = "Il *\U0001F479 Signore del Caos* e il suo fedele servitore sono scesi sulla Terra.\n" \
|
||||||
|
"Preparatevi... a non capirci più niente."
|
||||||
|
|
||||||
|
# Signore del Caos: icona
|
||||||
|
chaos_lord_icon = "\U0001F479"
|
||||||
|
|
||||||
|
# Signore del Caos: nome ruolo
|
||||||
|
chaos_lord_name = "Signore del Caos"
|
||||||
|
|
||||||
|
# Signore del Caos: descrizione del potere
|
||||||
|
chaos_lord_power_description = "Sei il *SIGNORE DEL CAOS*!\n" \
|
||||||
|
"Le faccende dei mortali non ti interessano, quindi non fai parte nè del team Mifia nè del team Royal.\n" \
|
||||||
|
"Di conseguenza, hai automaticamente _vinto la partita_!\n" \
|
||||||
|
"Puoi usare i tuoi poteri del Caos per cambiare ruolo a un altro giocatore.\n" \
|
||||||
|
"Il ruolo che riceverà sarà casuale.\n" \
|
||||||
|
"Per usare i tuoi poteri, scrivi in questa chat:\n" \
|
||||||
|
"`/power {gamename} nomeutentebersaglio`"
|
||||||
|
|
||||||
|
# Signore del Caos: bersaglio selezionato
|
||||||
|
chaos_lord_target_selected = "BWHAHAHA. Hai deciso di usare i tuoi poteri del Caos su {target}."
|
||||||
|
|
||||||
|
# Signore del Caos: bersaglio randomizzato
|
||||||
|
chaos_lord_randomized = "Il Caos è nell'aria...\n" \
|
||||||
|
"*Qualcuno ha cambiato ruolo!*"
|
||||||
|
|
||||||
|
# Signore del Caos: randomizzazione fallita
|
||||||
|
chaos_lord_failed = "Il Caos è nell'aria...\n" \
|
||||||
|
"_Ma non succede nulla._"
|
||||||
|
|
||||||
|
# Servitore del Caos: nome ruolo
|
||||||
|
chaos_servant_name = "Servitore del Caos"
|
||||||
|
|
||||||
|
# Servitore del Caos: descrizione potere
|
||||||
|
chaos_servant_power_description = "Il Signore del Caos ti cederà i suoi poteri quando sarà morto.\n" \
|
||||||
|
"Facendo parte della fazione del Caos, hai automaticamente _vinto la partita_!"
|
||||||
|
|
||||||
|
# Servitore del Caos: ereditato i poteri
|
||||||
|
chaos_servant_inherited = "Il servitore ha ereditato i poteri del *\U0001F479 Signore del Caos*."
|
||||||
|
|
||||||
# Generale: ruolo assegnato
|
# Generale: ruolo assegnato
|
||||||
role_assigned = "Ti è stato assegnato il ruolo di *{icon} {name}*."
|
role_assigned = "Ti è stato assegnato il ruolo di *{icon} {name}*."
|
||||||
|
|
||||||
|
@ -160,7 +219,10 @@ mifia_team_intro = "I mifiosi in questa partita sono:\n"
|
||||||
mifia_team_player = "{icon} {name}\n"
|
mifia_team_player = "{icon} {name}\n"
|
||||||
|
|
||||||
# Generale: votazione completata
|
# Generale: votazione completata
|
||||||
vote = "Hai votato per uccidere @{voted}."
|
vote = "@{voting} ha votato per uccidere @{voted}."
|
||||||
|
|
||||||
|
# Generale: votazione completata in prima persona
|
||||||
|
vote_fp = "Hai votato per uccidere @{voted}."
|
||||||
|
|
||||||
# Generale: un admin ha ucciso un giocatore con /kill
|
# Generale: un admin ha ucciso un giocatore con /kill
|
||||||
admin_killed = "{name} è morto _di infarto_.\n" \
|
admin_killed = "{name} è morto _di infarto_.\n" \
|
||||||
|
@ -170,6 +232,9 @@ admin_killed = "{name} è morto _di infarto_.\n" \
|
||||||
check_private = "Messaggio inviato in chat privata.\n" \
|
check_private = "Messaggio inviato in chat privata.\n" \
|
||||||
"Controlla @mifiabot."
|
"Controlla @mifiabot."
|
||||||
|
|
||||||
|
# Generale: partita salvata
|
||||||
|
game_saved = "Partita salvata su file."
|
||||||
|
|
||||||
# Generale: partita caricata
|
# Generale: partita caricata
|
||||||
game_loaded = "Partita caricata da file."
|
game_loaded = "Partita caricata da file."
|
||||||
|
|
||||||
|
@ -186,6 +251,15 @@ end_mifia_killed = "Tutti i Mifiosi sono stati eliminati.\n"
|
||||||
# Vittoria: nessuno vivo lol
|
# Vittoria: nessuno vivo lol
|
||||||
end_game_wiped = "Nessuno è più vivo. La specie umana si è estinta.\n"
|
end_game_wiped = "Nessuno è più vivo. La specie umana si è estinta.\n"
|
||||||
|
|
||||||
|
# Vittoria: Sei un Signore del Caos.
|
||||||
|
end_game_chaos = "Sei un Signore del Caos."
|
||||||
|
|
||||||
|
# Generale: scegli per chi votare
|
||||||
|
vote_keyboard = "Chi vuoi votare...?"
|
||||||
|
|
||||||
|
# Generale: riga della tastiera del voto
|
||||||
|
vote_keyboard_line = "@{name}"
|
||||||
|
|
||||||
# Vittoria: team Royal
|
# Vittoria: team Royal
|
||||||
victory_royal = "**La Royal Games vince!**"
|
victory_royal = "**La Royal Games vince!**"
|
||||||
|
|
||||||
|
@ -284,24 +358,26 @@ error_missing_parameters = "\U000026A0 Mancano uno o più parametri.\n" \
|
||||||
"Controlla la sintassi del comando e riprova."
|
"Controlla la sintassi del comando e riprova."
|
||||||
|
|
||||||
# Lista dei possibili nomi di una partita
|
# Lista dei possibili nomi di una partita
|
||||||
names_list = ["Cassata",
|
names_list = ["Caos",
|
||||||
"Cannoli",
|
"Vuoto",
|
||||||
"Granita",
|
"Nulla",
|
||||||
"Mandorle",
|
"Buconero",
|
||||||
"Salame",
|
"Fine",
|
||||||
"Torrone",
|
"Supernova",
|
||||||
"Sorbetto",
|
"Centrogalattico",
|
||||||
"Limone",
|
"Madre"]
|
||||||
"Arancia"]
|
|
||||||
|
|
||||||
# Lista dei passi di configurazione da eseguire
|
# Lista dei passi di configurazione da eseguire
|
||||||
config_list = ["Quanti *Mifiosi* devono essere nella partita?",
|
config_list = ["Quanti *Mifiosi* devono essere nella partita all'inizio?",
|
||||||
"Quanti *Investigatori* devono essere nella partita?",
|
"Quanti *Investigatori* devono essere nella partita all'inizio?",
|
||||||
"Quanti *Angeli* devono essere nella partita?",
|
"Quanti *Angeli* devono essere nella partita all'inizio?",
|
||||||
"Quanti *Terroristi* devono essere nella partita?",
|
"Quanti *Terroristi* devono essere nella partita all'inizio?",
|
||||||
"Quanti *Derek* devono essere nella partita?",
|
"Quanti *Derek* devono essere nella partita all'inizio?",
|
||||||
"Quanti *Disastri* devono essere nella partita?",
|
"Quanti *Disastri* devono essere nella partita all'inizio?",
|
||||||
"Quante *Mamme* devono essere nella partita?",
|
"Quante *Mamme* devono essere nella partita all'inizio?",
|
||||||
|
"Quanti *Stagisti* devono essere nella partita all'inizio?",
|
||||||
|
"Quante *Signori del Caos* devono essere nella partita all'inizio?",
|
||||||
|
"Quante *Servitori del Caos* devono essere nella partita all'inizio?",
|
||||||
"I mifiosi possono uccidere una persona a `testa` al giorno "
|
"I mifiosi possono uccidere una persona a `testa` al giorno "
|
||||||
"o votano e decidono un'`unica` persona da uccidere per tutta la squadra?",
|
"o votano e decidono un'`unica` persona da uccidere per tutta la squadra?",
|
||||||
"La mifia può `mancare` le uccisioni o i loro attacchi sono `perfetti`?",
|
"La mifia può `mancare` le uccisioni o i loro attacchi sono `perfetti`?",
|
||||||
|
@ -311,7 +387,7 @@ config_list = ["Quanti *Mifiosi* devono essere nella partita?",
|
||||||
preset_choose = "*Seleziona un preset per la partita:*\n" \
|
preset_choose = "*Seleziona un preset per la partita:*\n" \
|
||||||
"`Semplice`: solo royal, mifia e investigatori e niente meccaniche avanzate. _(minimo 3 giocatori)_\n" \
|
"`Semplice`: solo royal, mifia e investigatori e niente meccaniche avanzate. _(minimo 3 giocatori)_\n" \
|
||||||
"`Classico`: royal, mifia, investigatori, angeli e la comparsa casuale di un terrorista! _(minimo 4 giocatori)_\n" \
|
"`Classico`: royal, mifia, investigatori, angeli e la comparsa casuale di un terrorista! _(minimo 4 giocatori)_\n" \
|
||||||
"`Completo`: tutti i ruoli e le meccaniche nuove! _(minimo 7 giocatori)_\n" \
|
"`Completo`: tutti i ruoli e le meccaniche nuove! _(minimo 8 giocatori)_\n" \
|
||||||
"`Personalizzato`: scegli tu i ruoli e le meccaniche che vuoi in partita!"
|
"`Personalizzato`: scegli tu i ruoli e le meccaniche che vuoi in partita!"
|
||||||
|
|
||||||
# Preset semplice
|
# Preset semplice
|
||||||
|
|
Loading…
Reference in a new issue