dnd-npcs/npc/languages/common.py
2022-08-03 00:19:13 -07:00

95 lines
2.8 KiB
Python

import re
import random
from npc.languages.base import BaseLanguage, WordFactory
class Common(BaseLanguage):
vowels = ['a', 'e', 'i', 'o', 'u']
consonants = [
'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't',
'v', 'w', 'x', 'y', 'z'
]
_middle_clusters = re.compile(
r'bs|ct|ch|ck|dd|ff|gh|gs|ms|ns|ps|qu|rb|rd|rf|rk|rl|rm|rn|rp|rs|rt|ry' +
r'|sh|sk|ss|st|sy|th|tk|ts|tt|ty|ws|yd|yk|yl|ym|yn|yp|yr|ys|yt|yz|mcd' +
r'|[' + ''.join(vowels) + '][' + ''.join(consonants) + ']' +
r'|[' + ''.join(consonants) + '][' + ''.join(vowels) + ']' +
r'|[' + ''.join(vowels) + ']{1,2}'
)
_invalid_sequences = re.compile(
r'[' + ''.join(vowels) + ']{3}|' +
r'[' + ''.join(consonants) + ']{4}'
)
suffixes = [
'ad', 'ed', 'id', 'od', 'ud',
'af', 'ef', 'if', 'of', 'uf',
'ah', 'eh', 'ih', 'oh', 'uh',
'al', 'el', 'il', 'ol', 'ul',
'am', 'em', 'im', 'om', 'um',
'an', 'en', 'in', 'on', 'un',
'ar', 'er', 'ir', 'or', 'ur',
'as', 'es', 'is', 'os', 'us',
'at', 'et', 'it', 'ot', 'ut',
'ax', 'ex', 'ix', 'ox', 'ux',
'ay', 'ey', 'iy', 'oy', 'uy',
'az', 'ez', 'iz', 'oz', 'uz',
]
prefixes = [s[::-1] for s in suffixes]
affixes = []
syllable_template = ('p', 'c|v', 's')
minimum_length = 1
def validate_sequence(self, sequence, total_syllables):
too_short = len(''.join(sequence)) < self.minimum_length
if too_short:
return False
t = ''.join(sequence)
if self._invalid_sequences.match(t):
self._logger.debug(f"Invalid sequence: {t}")
return False
for pos in range(len(t)):
seq = t[pos:pos+2]
if len(seq) != 2:
return True
if not self._middle_clusters.match(seq):
self._logger.debug(f"Invalid sequence: {seq}")
return False
class CommonSurname(Common):
syllable_template = ('P|C', 'v', 'S')
syllable_weights = [1]
word_suffixes = [
'berg', 'borg', 'borough', 'bury', 'berry', 'by', 'ford', 'gard', 'grave', 'grove', 'gren', 'hardt', 'hart',
'heim', 'holm', 'land', 'leigh', 'ley', 'ly', 'lof', 'love', 'lund', 'man', 'mark', 'ness', 'olf', 'olph',
'quist', 'rop', 'rup', 'stad', 'stead', 'stein', 'strom', 'thal', 'thorpe', 'ton', 'vall', 'wich', 'win',
'some', 'smith', 'bridge', 'cope', 'town', 'er', 'don', 'den', 'dell', 'son',
]
def word(self):
return str(WordFactory(self)) + random.choice(self.word_suffixes)
class CommonPerson(Common):
syllable_template = ('p', 'C', 'V', 's')
syllable_weights = [3, 1]
minimum_length = 2
def person(self):
return (WordFactory(language=self), CommonSurname().word())