mirror of
https://github.com/RYGhub/royal-mifia.git
synced 2025-02-16 13:24:06 +00:00
commit
b7d5d471a9
9 changed files with 172 additions and 66 deletions
78
main.py
78
main.py
|
@ -44,17 +44,24 @@ class Player:
|
|||
def __str__(self) -> str:
|
||||
return "@{}".format(self.tusername)
|
||||
|
||||
def message(self, text: str):
|
||||
def message(self, text: str, *args, **kwargs):
|
||||
"""Manda un messaggio privato al giocatore."""
|
||||
if not self.dummy:
|
||||
self.game.bot.sendMessage(self.tid, text, parse_mode=ParseMode.MARKDOWN)
|
||||
while True:
|
||||
try:
|
||||
self.game.bot.sendMessage(self.tid, text, *args, parse_mode=ParseMode.MARKDOWN, **kwargs)
|
||||
except TimedOut:
|
||||
print("Timed out, pausing for 5 seconds...")
|
||||
time.sleep(5)
|
||||
else:
|
||||
break
|
||||
|
||||
def kill(self):
|
||||
"""Uccidi il giocatore."""
|
||||
self.role.ondeath()
|
||||
self.alive = False
|
||||
# Silenzia il giocatore
|
||||
if self is not self.game.admin:
|
||||
if self is not self.game.admin and not self.dummy:
|
||||
try:
|
||||
self.game.bot.restrictChatMember(self.game.groupid, self.tid, None, False, False, False, False)
|
||||
except Unauthorized:
|
||||
|
@ -110,9 +117,16 @@ class Game:
|
|||
.format(name=self.name, groupid=self.groupid, nplayers=len(self.players), phase=self.phase)
|
||||
return r
|
||||
|
||||
def message(self, text: str):
|
||||
def message(self, text: str, *args, **kwargs):
|
||||
"""Manda un messaggio nel gruppo."""
|
||||
self.bot.sendMessage(self.groupid, text, parse_mode=ParseMode.MARKDOWN)
|
||||
while True:
|
||||
try:
|
||||
self.bot.sendMessage(self.groupid, text, *args, parse_mode=ParseMode.MARKDOWN, **kwargs)
|
||||
except TimedOut:
|
||||
print("Timed out, pausing for 5 seconds...")
|
||||
time.sleep(5)
|
||||
else:
|
||||
break
|
||||
|
||||
def adminmessage(self, text: str):
|
||||
"""Manda un messaggio privato al creatore della partita."""
|
||||
|
@ -326,7 +340,8 @@ class Game:
|
|||
"Mamma": 0,
|
||||
"Stagista": 0,
|
||||
"SignoreDelCaos": 0,
|
||||
"Servitore": 0
|
||||
"Servitore": 0,
|
||||
"Vigilante": 0
|
||||
}
|
||||
self.votingmifia = True
|
||||
self.message(s.preset_simple_selected.format(mifioso=self.roleconfig["Mifioso"],
|
||||
|
@ -346,35 +361,38 @@ class Game:
|
|||
"Mamma": 0,
|
||||
"Stagista": 0,
|
||||
"SignoreDelCaos": 0,
|
||||
"Servitore": 0
|
||||
"Servitore": 0,
|
||||
"Vigilante": 0
|
||||
}
|
||||
self.votingmifia = True
|
||||
self.message(s.preset_classic_selected.format(mifioso=self.roleconfig["Mifioso"], investigatore=self.roleconfig["Investigatore"], angelo=self.roleconfig["Angelo"], royal=len(self.players) - self.roleconfig["Mifioso"] - self.roleconfig["Investigatore"] - self.roleconfig["Angelo"], royalmenouno=len(self.players) - self.roleconfig["Mifioso"] - self.roleconfig["Investigatore"] - self.roleconfig["Angelo"] - 1))
|
||||
self.endconfig()
|
||||
elif preset == "oneofall":
|
||||
unassignedplayers = len(self.players)
|
||||
self.roleconfig = {
|
||||
"Mifioso": 1,
|
||||
"Investigatore": 1,
|
||||
"Corrotto": 1,
|
||||
"Angelo": 1,
|
||||
"Terrorista": 1,
|
||||
"Derek": 1,
|
||||
"Disastro": 1,
|
||||
"Mamma": 1,
|
||||
"Stagista": 1,
|
||||
"Mifioso": 0,
|
||||
"Investigatore": 0,
|
||||
"Corrotto": 0,
|
||||
"Angelo": 0,
|
||||
"Terrorista": 0,
|
||||
"Derek": 0,
|
||||
"Disastro": 0,
|
||||
"Mamma": 0,
|
||||
"Stagista": 0,
|
||||
"SignoreDelCaos": 0,
|
||||
"Servitore": 0
|
||||
"Servitore": 0,
|
||||
"Vigilante": 0
|
||||
}
|
||||
unassignedplayers = len(self.players) - 9
|
||||
availableroles = list()
|
||||
while unassignedplayers > 0:
|
||||
if len(availableroles) == 0:
|
||||
availableroles = rolepriority.copy()
|
||||
availableroles.remove(SignoreDelCaos)
|
||||
availableroles.remove(Servitore)
|
||||
random.shuffle(availableroles)
|
||||
self.roleconfig[availableroles.pop().__name__] += 1
|
||||
unassignedplayers -= 1
|
||||
while True:
|
||||
for role in [Mifioso, Investigatore, Corrotto, Angelo, Terrorista, Derek, Disastro, Mamma, Stagista, Vigilante]:
|
||||
if unassignedplayers > 0:
|
||||
self.roleconfig[role.__name__] += 1
|
||||
unassignedplayers -= 1
|
||||
else:
|
||||
break
|
||||
else:
|
||||
continue
|
||||
break
|
||||
self.votingmifia = False
|
||||
self.message(s.preset_oneofall_selected)
|
||||
self.endconfig()
|
||||
|
@ -875,6 +893,11 @@ def inlinekeyboard(bot: Bot, update):
|
|||
bot.editMessageReplyMarkup(game.groupid, game.votemsg.message_id, reply_markup=keyboard)
|
||||
|
||||
|
||||
def breakpoint_here(*args, **kwargs):
|
||||
if args[2] == "Timed out":
|
||||
print("Si è buggato tutto. As usual.")
|
||||
|
||||
|
||||
updater.dispatcher.add_handler(CommandHandler('ping', ping))
|
||||
updater.dispatcher.add_handler(CommandHandler('newgame', newgame))
|
||||
updater.dispatcher.add_handler(CommandHandler('join', join))
|
||||
|
@ -892,6 +915,7 @@ updater.dispatcher.add_handler(CommandHandler('load', load))
|
|||
updater.dispatcher.add_handler(CommandHandler('delete', delete))
|
||||
updater.dispatcher.add_handler(CommandHandler('debugchangerole', debugchangerole))
|
||||
updater.dispatcher.add_handler(CallbackQueryHandler(inlinekeyboard))
|
||||
updater.dispatcher.add_error_handler(breakpoint_here)
|
||||
|
||||
if __name__ == "__main__":
|
||||
updater.start_polling()
|
||||
|
|
|
@ -29,7 +29,7 @@ class Corrotto(Role):
|
|||
return
|
||||
# Utilizza il potere su quella persona
|
||||
self.poweruses -= 1
|
||||
self.player.message(s.detective_discovery.format(target=target.tusername, icon=target.role.icon, role=target.role.name, left=self.poweruses))
|
||||
self.player.message(s.detective_discovery.format(target_score=100, target=target.tusername, icon=target.role.icon, role=target.role.name))
|
||||
|
||||
def onendday(self):
|
||||
# Ripristina il potere
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from .Role import Role
|
||||
import strings as s
|
||||
import random
|
||||
|
||||
class Disastro(Role):
|
||||
"""L'investigatore sbadato investiga, ma giunge a conclusioni sbagliate..."""
|
||||
|
@ -7,37 +8,39 @@ class Disastro(Role):
|
|||
team = 'Good'
|
||||
name = s.detective_name
|
||||
powerdesc = s.detective_power_description
|
||||
refillpoweruses = 1
|
||||
|
||||
def __init__(self, player):
|
||||
super().__init__(player)
|
||||
self.poweruses = self.refillpoweruses
|
||||
self.power_was_used = False
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return "<Role: Investigatore, {uses} uses left>".format(uses=self.poweruses)
|
||||
return "<Role: Investigatore>"
|
||||
|
||||
def power(self, arg):
|
||||
# Indaga sul vero ruolo di una persona, se sono ancora disponibili usi del potere.
|
||||
if self.poweruses > 0:
|
||||
target = self.player.game.findplayerbyusername(arg)
|
||||
if target is not None:
|
||||
self.poweruses -= 1
|
||||
randomrole = self.player.game.getrandomrole()
|
||||
while isinstance(target.role, randomrole):
|
||||
# TODO: se ci fossero solo disastri in una partita cosa succederebbe?
|
||||
randomrole = self.player.game.getrandomrole()
|
||||
self.player.message(s.detective_discovery.format(target=target.tusername,
|
||||
icon=randomrole.icon,
|
||||
role=randomrole.name,
|
||||
left=self.poweruses))
|
||||
else:
|
||||
self.player.message(s.error_username)
|
||||
else:
|
||||
if self.power_was_used:
|
||||
# Non hai abbastanza cariche!
|
||||
self.player.message(s.error_no_uses)
|
||||
return
|
||||
target = self.player.game.findplayerbyusername(arg)
|
||||
if target is None:
|
||||
# Username non valido
|
||||
self.player.message(s.error_username)
|
||||
return
|
||||
# Utilizza il potere su quella persona
|
||||
self.power_was_used = True
|
||||
# Tira per investigare
|
||||
target_score = random.randrange(0, 25) + 1
|
||||
score = random.randrange(0, 100) + 1
|
||||
if score < target_score:
|
||||
role = target.role
|
||||
else:
|
||||
role = self.player.game.getrandomrole()
|
||||
self.player.message(s.detective_discovery.format(target_score=100-target_score, target=target.tusername, icon=role.icon, role=role.name))
|
||||
|
||||
def onendday(self):
|
||||
# Ripristina il potere
|
||||
self.poweruses = self.refillpoweruses
|
||||
self.power_was_used = False
|
||||
|
||||
def ondeath(self):
|
||||
self.icon = s.disaster_icon
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from .Role import Role
|
||||
import strings as s
|
||||
import random
|
||||
|
||||
class Investigatore(Role):
|
||||
"""L'investigatore può indagare sul vero ruolo di una persona una volta al giorno."""
|
||||
|
@ -7,18 +8,17 @@ class Investigatore(Role):
|
|||
team = 'Good'
|
||||
name = s.detective_name
|
||||
powerdesc = s.detective_power_description
|
||||
refillpoweruses = 1
|
||||
|
||||
def __init__(self, player):
|
||||
super().__init__(player)
|
||||
self.poweruses = self.refillpoweruses
|
||||
self.power_was_used = False
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return "<Role: Investigatore, {uses} uses left>".format(uses=self.poweruses)
|
||||
return "<Role: Investigatore>"
|
||||
|
||||
def power(self, arg):
|
||||
# Indaga sul vero ruolo di una persona, se sono ancora disponibili usi del potere.
|
||||
if self.poweruses <= 0:
|
||||
if self.power_was_used:
|
||||
# Non hai abbastanza cariche!
|
||||
self.player.message(s.error_no_uses)
|
||||
return
|
||||
|
@ -28,9 +28,16 @@ class Investigatore(Role):
|
|||
self.player.message(s.error_username)
|
||||
return
|
||||
# Utilizza il potere su quella persona
|
||||
self.poweruses -= 1
|
||||
self.player.message(s.detective_discovery.format(target=target.tusername, icon=target.role.icon, role=target.role.name, left=self.poweruses))
|
||||
self.power_was_used = True
|
||||
# Tira per investigare
|
||||
target_score = random.randrange(0, 25) + 1
|
||||
score = random.randrange(0, 100) + 1
|
||||
if score > target_score:
|
||||
role = target.role
|
||||
else:
|
||||
role = self.player.game.getrandomrole()
|
||||
self.player.message(s.detective_discovery.format(target_score=100-target_score, target=target.tusername, icon=role.icon, role=role.name))
|
||||
|
||||
def onendday(self):
|
||||
# Ripristina il potere
|
||||
self.poweruses = self.refillpoweruses
|
||||
self.power_was_used = False
|
||||
|
|
|
@ -3,7 +3,7 @@ import strings as s
|
|||
import random
|
||||
|
||||
class Mamma(Role):
|
||||
"""La mamma sente i pettegolezzi in giro per la città e inizia conoscendo un ruolo a caso..."""
|
||||
"""La mamma sente le voci in giro per la città e scopre un nuovo ruolo ogni tanto..."""
|
||||
icon = s.mom_icon
|
||||
team = 'Good'
|
||||
name = s.mom_name
|
||||
|
@ -18,3 +18,12 @@ class Mamma(Role):
|
|||
possibletargets.remove(self.player)
|
||||
target = random.sample(possibletargets, 1)[0]
|
||||
self.player.message(s.mom_discovery.format(target=target.tusername, icon=target.role.icon, role=target.role.name))
|
||||
|
||||
def onendday(self):
|
||||
if random.randrange(0, 10) > 5:
|
||||
# Scegli un bersaglio casuale che non sia il giocatore stesso
|
||||
possibletargets = self.player.game.players.copy()
|
||||
possibletargets.remove(self.player)
|
||||
target = random.sample(possibletargets, 1)[0]
|
||||
self.player.message(
|
||||
s.mom_discovery.format(target=target.tusername, icon=target.role.icon, role=target.role.name))
|
43
roles/Vigilante.py
Normal file
43
roles/Vigilante.py
Normal file
|
@ -0,0 +1,43 @@
|
|||
from .Role import Role
|
||||
import strings as s
|
||||
|
||||
class Vigilante(Role):
|
||||
"""Il vigilante può uccidere una persona a sua scelta.
|
||||
Possibilmente un mifioso."""
|
||||
icon = s.vigilante_icon
|
||||
team = 'Good'
|
||||
name = s.vigilante_name
|
||||
powerdesc = s.vigilante_power_description
|
||||
|
||||
def __init__(self, player):
|
||||
super().__init__(player)
|
||||
self.target = None
|
||||
self.power_was_used = False
|
||||
|
||||
def __repr__(self) -> str:
|
||||
if self.target is None:
|
||||
return "<Role: Angelo>"
|
||||
else:
|
||||
return "<Role: Angelo, protecting {target}>".format(target=self.target.tusername)
|
||||
|
||||
def power(self, arg):
|
||||
# Imposta qualcuno come bersaglio
|
||||
selected = self.player.game.findplayerbyusername(arg)
|
||||
if self.power_was_used:
|
||||
self.player.message(s.error_no_uses)
|
||||
return
|
||||
if selected is None:
|
||||
self.player.message(s.error_username)
|
||||
return
|
||||
# Bersaglia il nuovo giocatore selezionato
|
||||
selected.protectedby = self.player
|
||||
self.target = selected
|
||||
self.player.message(s.vigilante_target_selected.format(target=self.target.tusername))
|
||||
|
||||
def onendday(self):
|
||||
# Resetta la protezione
|
||||
if self.target is not None:
|
||||
self.target.kill()
|
||||
self.player.game.message(s.vigilante_execution.format(target=self.target.tusername, icon=self.target.role.icon, role=self.target.role.name))
|
||||
self.power_was_used = True
|
||||
self.target = None
|
|
@ -1,4 +1,4 @@
|
|||
from .roles import *
|
||||
|
||||
# Ordine in cui vengono eseguiti i onendday dei vari ruoli.
|
||||
rolepriority = [Mifioso, Investigatore, Corrotto, Disastro, Angelo, Derek, Stagista, Terrorista, Mamma, SignoreDelCaos, Servitore]
|
||||
rolepriority = [Mifioso, Vigilante, Investigatore, Corrotto, Disastro, Angelo, Derek, Stagista, Terrorista, Mamma, SignoreDelCaos, Servitore]
|
||||
|
|
|
@ -11,4 +11,5 @@ from .Servitore import Servitore
|
|||
from .SignoreDelCaos import SignoreDelCaos
|
||||
from .Stagista import Stagista
|
||||
from .Terrorista import Terrorista
|
||||
from .priority import rolepriority
|
||||
from .Vigilante import Vigilante
|
||||
from .priority import rolepriority
|
37
strings.py
37
strings.py
|
@ -41,11 +41,11 @@ detective_icon = "\U0001F575"
|
|||
detective_name = "Investigatore"
|
||||
|
||||
# Investigatore: scoperta nuove informazioni
|
||||
detective_discovery = "@{target} è un *{icon} {role}*.\n" \
|
||||
"Puoi usare il tuo potere ancora *{left}* volte oggi."
|
||||
detective_discovery = "Sei sicuro al *{target_score}%* che @{target} sia un *{icon} {role}*."
|
||||
|
||||
# Investigatore: descrizione del potere
|
||||
detective_power_description = "Puoi indagare sul vero ruolo di una persona una volta al giorno.\n" \
|
||||
detective_power_description = "Puoi provare a scoprire il ruolo di una persona ogni giorno.\n" \
|
||||
"Non è garantito che l'investigazione abbia successo, ma la probabilità è piuttosto alta e ti verrà annunciata.\n" \
|
||||
"Per indagare su qualcuno, scrivi in questa chat:\n" \
|
||||
"`/power {gamename} nomeutentebersaglio`\n"
|
||||
|
||||
|
@ -104,7 +104,7 @@ derek_deathwish_set = "*Morirai* alla fine di questo giorno."
|
|||
derek_deathwish_unset = "*Vivrai* per morire un altro giorno."
|
||||
|
||||
# Derek: morte
|
||||
derek_deathwish_successful = "*SPOILER:* alla fine di questo giorno *\U0001F635 Derek Shepard* (@{name}) è morto schiacciato da un container.\n"
|
||||
derek_deathwish_successful = "*SPOILER:* alla fine di questo giorno *\U0001F635 Derek Shepard* (@{name}) è morto schiacciato da un container durante una missione su Ilium.\n"
|
||||
|
||||
# Disastro: icona
|
||||
disaster_icon = "\U0001F46E"
|
||||
|
@ -119,11 +119,11 @@ mom_icon = "\U0001F917"
|
|||
mom_name = "Mamma"
|
||||
|
||||
# Mamma: descrizione del potere
|
||||
mom_power_description = "All'inizio della partita scoprirai il ruolo di un giocatore casuale.\n" \
|
||||
"Usalo per sapere di chi (non) fidarti!\n"
|
||||
mom_power_description = "Durante la partita scoprirai i ruoli di alcuni giocatori.\n" \
|
||||
"A differenza dell'Investigatore, sei infallibile.\n"
|
||||
|
||||
# Mamma: scoperta di un ruolo
|
||||
mom_discovery = "@{target} è un *{icon} {role}*.\n" \
|
||||
mom_discovery = "Hai scoperto che @{target} è un *{icon} {role}*.\n" \
|
||||
|
||||
# Stagista: icona
|
||||
intern_icon = "\U0001F913"
|
||||
|
@ -196,6 +196,25 @@ chaos_servant_icon = "\U0001F468\u200d\U0001F3A4"
|
|||
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_!"
|
||||
|
||||
# Vigilante: nome ruolo
|
||||
vigilante_name = "Vigilante"
|
||||
|
||||
# Vigilante: icona
|
||||
vigilante_icon = "🤠"
|
||||
|
||||
# Vigilante: descrizione potere
|
||||
vigilante_power_description = "Puoi scegliere una persona da uccidere anonimamente alla fine della giornata.\n" \
|
||||
"Fai attenzione a non uccidere un tuo alleato Royal: sei in squadra con loro!\n" \
|
||||
"Per uccidere qualcuno, scrivi in questa chat:\n" \
|
||||
"`/power {gamename} nomeutentebersaglio`"
|
||||
|
||||
# Vigilante: bersaglio scelto
|
||||
vigilante_target_selected = "Stai puntando la tua pistola contro @{target}."
|
||||
|
||||
# Vigilante: esecuzione
|
||||
vigilante_execution = "@{target} è stato eseguito da un Vigilante della Royal Games.\n" \
|
||||
"Era un *{icon} {role}*."
|
||||
|
||||
# Servitore del Caos: ereditato i poteri
|
||||
chaos_servant_inherited = "Il servitore ha ereditato i poteri del *\U0001F479 Signore del Caos*."
|
||||
|
||||
|
@ -345,7 +364,7 @@ warning_bot_not_admin = "\U000026A0 Attenzione! Il bot non è amministratore in
|
|||
error_username = "\U000026A0 Il nome utente specificato non esiste."
|
||||
|
||||
# Errore: usi del potere esauriti
|
||||
error_no_uses = "\U000026A0 Non puoi più usare il tuo potere per oggi."
|
||||
error_no_uses = "\U000026A0 Hai finito gli utilizzi del tuo potere."
|
||||
|
||||
# Errore: numero troppo basso di giocatori
|
||||
error_not_enough_players = "\U000026A0 Non ci sono abbastanza giocatori per avviare la partita."
|
||||
|
@ -419,7 +438,7 @@ fatal_bot_rate_limited = "\U0001F6D1 **Errore critico:** Il bot ha inviato tropp
|
|||
if __debug__:
|
||||
names_list = ["Dev"]
|
||||
else:
|
||||
names_list = ["Eleven"]
|
||||
names_list = ["Tredici"]
|
||||
|
||||
# Scegli il preset
|
||||
preset_choose = "*Seleziona un preset per la partita:*"
|
||||
|
|
Loading…
Add table
Reference in a new issue