80 lines
2.0 KiB
Python
80 lines
2.0 KiB
Python
import random
|
|
from collections import defaultdict
|
|
|
|
from untitled import PACKAGE_ROOT, content, rules
|
|
|
|
|
|
def generate_trait_sentence(traits):
|
|
article = "An" if traits["size"][0] in "aeiou" else "A"
|
|
description = f'{article} {traits["size"]} {traits["color"]} kitten with {traits["eyes"]} eyes who {traits["personality"]}'
|
|
return description
|
|
|
|
|
|
def generate_cat_choice(personality=None):
|
|
size = random.choice(content.CAT_SIZES)
|
|
color = random.choice(content.CAT_COLORS)
|
|
eyes = random.choice(content.CAT_EYE_COLORS)
|
|
personality = personality or random.choice(content.CAT_PERSONALITIES)
|
|
traits = {
|
|
"size": size,
|
|
"color": color,
|
|
"eyes": eyes,
|
|
"personality": personality,
|
|
}
|
|
return generate_trait_sentence(traits), traits
|
|
|
|
|
|
def generate_cat_choices(n=5):
|
|
personalities = random.sample(content.CAT_PERSONALITIES, n)
|
|
return [generate_cat_choice(p) for p in personalities]
|
|
|
|
|
|
# NAME GEN MODEL
|
|
|
|
|
|
def _pad_names_for_model(names):
|
|
new_names = []
|
|
for name in names:
|
|
new_names.append(f"<<{name}>")
|
|
return new_names
|
|
|
|
|
|
def _build_model(words):
|
|
model = defaultdict(list)
|
|
for word in words:
|
|
for pos in range(len(word) - 2):
|
|
model[word[pos] + word[pos + 1]].append(word[pos + 2])
|
|
return model
|
|
|
|
|
|
def _make_name(model):
|
|
result = "<<"
|
|
while True:
|
|
window = result[-2:]
|
|
nxt = random.choice(model[window])
|
|
if nxt == ">":
|
|
break
|
|
result += nxt
|
|
return result.removeprefix("<<")
|
|
|
|
|
|
def generate_name():
|
|
while True:
|
|
name = _make_name(_model)
|
|
if (
|
|
any(c in "aeiou" for c in name.lower())
|
|
and rules.validate_cat_name(name, auto_gen=True) is None
|
|
):
|
|
return name.capitalize()
|
|
|
|
|
|
def _load_raw_names():
|
|
names = []
|
|
with open(PACKAGE_ROOT / "assets" / "cat_names.txt") as f:
|
|
for name in f.readlines():
|
|
names.append(name.strip())
|
|
return names
|
|
|
|
|
|
_model = _build_model(_pad_names_for_model(_load_raw_names()))
|