1
Fork 0
mirror of https://github.com/RYGhub/royal-mifia.git synced 2025-02-16 13:24:06 +00:00

Merge pull request #68 from Steffo99/imba

Imba
This commit is contained in:
Steffo 2017-12-29 17:49:18 +01:00 committed by GitHub
commit b7d5d471a9
Signed by: github
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 172 additions and 66 deletions

78
main.py
View file

@ -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()

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
View 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

View file

@ -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]

View file

@ -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

View file

@ -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:*"