mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-26 21:14:19 +00:00
91 lines
2.1 KiB
Python
91 lines
2.1 KiB
Python
import typing as t
|
|
import datetime
|
|
import random
|
|
|
|
import royalnet.engineer as engi
|
|
|
|
import royalpack.bolts as rb
|
|
|
|
|
|
@rb.capture_errors
|
|
@engi.TeleportingConversation
|
|
async def roll(*, _msg: engi.Message, qty: t.Optional[int], die: int, mod: t.Optional[int], **__):
|
|
"""
|
|
Tira un dado nel formato di D&D: `1d20+1`, ad esempio.
|
|
|
|
Non perfettamente casuale, **non usare per competizioni o altre cose serie**!
|
|
"""
|
|
|
|
if qty is None:
|
|
qty = 1
|
|
|
|
# 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)
|
|
|
|
# tira il valore di fortuna per vedere l'effetto sul dado
|
|
result += (drand.random() * luck) * die
|
|
|
|
# arrotonda il risultato
|
|
result = round(result)
|
|
|
|
# limita il risultato tra massimo e minimo per non destare sospetti
|
|
result = min(result, die)
|
|
result = max(result, 1)
|
|
|
|
rolls.append(result)
|
|
|
|
# decidi un'emoji da mostrare
|
|
if luck > 0:
|
|
emoji = "🔆"
|
|
else:
|
|
emoji = "🔅"
|
|
|
|
# formuliamo una risposta da mostrare all'utente
|
|
|
|
# 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
|
|
|
|
if mod and mod != 0:
|
|
answer.append(f"{mod:+}")
|
|
total += mod
|
|
|
|
answer.append(f" = \uE01B{total}\uE00B")
|
|
|
|
await _msg.reply(text="".join(answer))
|
|
|
|
|
|
__all__ = (
|
|
"roll",
|
|
)
|