mirror of
https://github.com/rr-/pq-cli.git
synced 2026-09-29 06:44:00 -06:00
130 lines
2.9 KiB
Python
130 lines
2.9 KiB
Python
import typing as T
|
|
|
|
from pqcli import random
|
|
|
|
|
|
def generate_name() -> str:
|
|
parts = [
|
|
"br|cr|dr|fr|gr|j|kr|l|m|n|pr||||r|sh|tr|v|wh|x|y|z".split("|"),
|
|
"a|a|e|e|i|i|o|o|u|u|ae|ie|oo|ou".split("|"),
|
|
"b|ck|d|g|k|m|n|p|t|v|x|z".split("|"),
|
|
]
|
|
result = ""
|
|
for i in range(6):
|
|
result += random.choice(parts[i % 3])
|
|
return result.title()
|
|
|
|
|
|
def to_roman(num: int) -> str:
|
|
if not num:
|
|
return "N"
|
|
|
|
ret = ""
|
|
|
|
def _rome(dn: int, ds: str) -> bool:
|
|
nonlocal num, ret
|
|
if num >= dn:
|
|
num -= dn
|
|
ret += ds
|
|
return True
|
|
return False
|
|
|
|
if num < 0:
|
|
ret = "-"
|
|
num = -num
|
|
|
|
while _rome(1000, "M"):
|
|
pass
|
|
_rome(900, "CM")
|
|
_rome(500, "D")
|
|
_rome(400, "CD")
|
|
while _rome(100, "C"):
|
|
pass
|
|
_rome(90, "XC")
|
|
_rome(50, "L")
|
|
_rome(40, "XL")
|
|
while _rome(10, "X"):
|
|
pass
|
|
_rome(9, "IX")
|
|
_rome(5, "V")
|
|
_rome(4, "IV")
|
|
while _rome(1, "I"):
|
|
pass
|
|
return ret
|
|
|
|
|
|
def act_name(act: int) -> str:
|
|
if act == 0:
|
|
return "Prologue"
|
|
return f"Act {to_roman(act)}"
|
|
|
|
|
|
def plural(subject: str) -> str:
|
|
if subject.endswith("y"):
|
|
return subject[:-1] + "ies"
|
|
if subject.endswith("us"):
|
|
return subject[:-2] + "i"
|
|
if subject.endswith(("ch", "x", "s", "sh")):
|
|
return subject + "es"
|
|
if subject.endswith("f"):
|
|
return subject[:-1] + "ves"
|
|
if subject.endswith(("man", "Man")):
|
|
return subject[:-2] + "en"
|
|
return subject + "s"
|
|
|
|
|
|
def indefinite(subject: str, qty: int) -> str:
|
|
if qty == 1:
|
|
if subject.startswith(tuple("AEIOU?aeiou?")):
|
|
return "an " + subject
|
|
return "a " + subject
|
|
return str(qty) + " " + plural(subject)
|
|
|
|
|
|
def definite(subject: str, qty: int) -> str:
|
|
if qty > 1:
|
|
subject = plural(subject)
|
|
return "the " + subject
|
|
|
|
|
|
def prefix(a: T.List[str], m: int, subject: str, sep: str = " ") -> str:
|
|
m = abs(m)
|
|
if m < 1 or m > len(a):
|
|
return subject
|
|
return a[m - 1] + sep + subject
|
|
|
|
|
|
def sick(m: int, subject: str) -> str:
|
|
m = 6 - abs(m)
|
|
return prefix(
|
|
["dead", "comatose", "crippled", "sick", "undernourished"], m, subject
|
|
)
|
|
|
|
|
|
def young(m: int, subject: str) -> str:
|
|
m = 6 - abs(m)
|
|
return prefix(
|
|
["foetal", "baby", "preadolescent", "teenage", "underage"], m, subject
|
|
)
|
|
|
|
|
|
def big(m: int, subject: str) -> str:
|
|
return prefix(
|
|
["greater", "massive", "enormous", "giant", "titanic"], m, subject
|
|
)
|
|
|
|
|
|
def special(m: int, subject: str) -> str:
|
|
if " " in subject:
|
|
return prefix(
|
|
["veteran", "cursed", "warrior", "undead", "demon"], m, subject
|
|
)
|
|
return prefix(
|
|
["Battle-", "cursed ", "Were-", "undead ", "demon "], m, subject, ""
|
|
)
|
|
|
|
|
|
def terminate_message(player_name: str) -> str:
|
|
adjective = random.choice(["faithful", "noble", "loyal", "brave"])
|
|
return f"Terminate {adjective} {player_name}?"
|