1
Fork 0
mirror of https://github.com/RYGhub/royalnet.git synced 2024-11-26 21:14:19 +00:00
royalnet/royalpack/commands/roll.py

92 lines
2.1 KiB
Python
Raw Normal View History

2022-08-20 23:44:38 +00:00
import typing as t
2022-08-13 14:29:18 +00:00
import datetime
import random
import royalnet.engineer as engi
import royalpack.bolts as rb
@rb.capture_errors
@engi.TeleportingConversation
2022-08-21 00:27:27 +00:00
async def roll(*, _msg: engi.Message, qty: t.Optional[int], die: int, mod: t.Optional[int], **__):
2022-08-13 14:29:18 +00:00
"""
2022-08-15 01:14:51 +00:00
Tira un dado nel formato di D&D: `1d20+1`, ad esempio.
2022-08-20 23:44:38 +00:00
Non perfettamente casuale, **non usare per competizioni o altre cose serie**!
2022-08-13 14:29:18 +00:00
"""
2022-08-21 00:27:27 +00:00
if qty is None:
qty = 1
2022-08-20 23:44:38 +00:00
# modificatore supersegreto della fortuna. ooooh! questo è top secret!
# "blame cate for this" --steffo
# usa il giorno attuale come seed
seed = hash(datetime.date.today())
lrand = random.Random(x=seed)
# la variazione massima del risultato deve essere di un sesto del tiro
luck = lrand.triangular(low=-0.17, high=0.17, mode=0.0)
# veniamo al dunque
# resetta il seed
drand = random.Random()
# tiriamo i dadi richiesti!
rolls = []
for i in range(qty):
# trova il risultato base del tiro
result = drand.randint(1, die)
2022-08-15 01:14:51 +00:00
2022-08-20 23:44:38 +00:00
# tira il valore di fortuna per vedere l'effetto sul dado
result += (drand.random() * luck) * die
2022-08-13 14:29:18 +00:00
2022-08-20 23:44:38 +00:00
# arrotonda il risultato
result = round(result)
2022-08-13 14:29:18 +00:00
2022-08-20 23:44:38 +00:00
# limita il risultato tra massimo e minimo per non destare sospetti
2022-08-13 14:29:18 +00:00
result = min(result, die)
result = max(result, 1)
2022-08-20 23:44:38 +00:00
rolls.append(result)
# decidi un'emoji da mostrare
if luck > 0:
emoji = "🔆"
else:
emoji = "🔅"
2022-08-13 14:29:18 +00:00
# formuliamo una risposta da mostrare all'utente
2022-08-20 23:44:38 +00:00
# usando una lista di stringhe che uniremo per inviare il messaggio
# perchè? performance!
answer = [
f"{emoji} {qty}d{die}",
]
if mod and mod != 0:
answer.append(f"{mod:+}")
answer.append(" = ")
total = 0
for index, result in enumerate(rolls):
if index != 0:
answer.append("+")
answer.append(f"{result}")
total += result
2022-08-21 00:06:37 +00:00
if mod and mod != 0:
answer.append(f"{mod:+}")
total += mod
2022-08-20 23:44:38 +00:00
answer.append(f" = \uE01B{total}\uE00B")
2022-08-13 14:29:18 +00:00
2022-08-20 23:44:38 +00:00
await _msg.reply(text="".join(answer))
2022-08-13 14:29:18 +00:00
2022-08-20 23:44:38 +00:00
__all__ = (
"roll",
2022-08-21 00:28:45 +00:00
)