2022-12-16 18:40:57 -06:00
|
|
|
from panda3d.core import *
|
2019-11-02 17:27:54 -05:00
|
|
|
import random
|
|
|
|
import string
|
|
|
|
import copy
|
|
|
|
from toontown.toonbase import ToontownGlobals
|
|
|
|
from toontown.toonbase import TTLocalizer
|
|
|
|
import os
|
|
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
|
|
|
|
|
|
class NameGenerator:
|
|
|
|
text = TextNode('text')
|
|
|
|
text.setFont(ToontownGlobals.getInterfaceFont())
|
|
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('NameGenerator')
|
|
|
|
boyTitles = []
|
|
|
|
girlTitles = []
|
|
|
|
neutralTitles = []
|
|
|
|
boyFirsts = []
|
|
|
|
girlFirsts = []
|
|
|
|
neutralFirsts = []
|
|
|
|
capPrefixes = []
|
|
|
|
lastPrefixes = []
|
|
|
|
lastSuffixes = []
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
self.generateLists()
|
|
|
|
|
|
|
|
def generateLists(self):
|
|
|
|
self.boyTitles = []
|
|
|
|
self.girlTitles = []
|
|
|
|
self.neutralTitles = []
|
|
|
|
self.boyFirsts = []
|
|
|
|
self.girlFirsts = []
|
|
|
|
self.neutralFirsts = []
|
|
|
|
self.capPrefixes = []
|
|
|
|
self.lastPrefixes = []
|
|
|
|
self.lastSuffixes = []
|
|
|
|
self.nameDictionary = {}
|
|
|
|
searchPath = DSearchPath()
|
2019-11-10 20:32:17 -06:00
|
|
|
if __debug__:
|
|
|
|
searchPath.appendDirectory(Filename('resources/phase_3/etc'))
|
2019-11-02 17:27:54 -05:00
|
|
|
filename = Filename(TTLocalizer.NameShopNameMaster)
|
|
|
|
found = vfs.resolveFilename(filename, searchPath)
|
|
|
|
if not found:
|
|
|
|
self.notify.error("NameGenerator: Error opening name list text file '%s.'" % TTLocalizer.NameShopNameMaster)
|
|
|
|
input = StreamReader(vfs.openReadFile(filename, 1), 1)
|
|
|
|
currentLine = input.readline()
|
|
|
|
while currentLine:
|
2019-12-30 14:37:11 -06:00
|
|
|
if currentLine.lstrip()[0:1] != b'#':
|
|
|
|
a1 = currentLine.find(b'*')
|
|
|
|
a2 = currentLine.find(b'*', a1 + 1)
|
2019-12-30 17:34:25 -06:00
|
|
|
self.nameDictionary[int(currentLine[0:a1])] = (int(currentLine[a1 + 1:a2]), currentLine[a2 + 1:].rstrip().decode('utf-8'))
|
2019-11-02 17:27:54 -05:00
|
|
|
currentLine = input.readline()
|
|
|
|
|
|
|
|
masterList = [self.boyTitles,
|
|
|
|
self.girlTitles,
|
|
|
|
self.neutralTitles,
|
|
|
|
self.boyFirsts,
|
|
|
|
self.girlFirsts,
|
|
|
|
self.neutralFirsts,
|
|
|
|
self.capPrefixes,
|
|
|
|
self.lastPrefixes,
|
|
|
|
self.lastSuffixes]
|
2019-12-30 00:07:56 -06:00
|
|
|
for tu in list(self.nameDictionary.values()):
|
2019-11-02 17:27:54 -05:00
|
|
|
masterList[tu[0]].append(tu[1])
|
|
|
|
|
|
|
|
return 1
|
|
|
|
|
|
|
|
def _getNameParts(self, cat2part):
|
|
|
|
nameParts = [{},
|
|
|
|
{},
|
|
|
|
{},
|
|
|
|
{}]
|
2019-12-30 00:07:56 -06:00
|
|
|
for id, tpl in self.nameDictionary.items():
|
2019-11-02 17:27:54 -05:00
|
|
|
cat, str = tpl
|
|
|
|
if cat in cat2part:
|
|
|
|
nameParts[cat2part[cat]][str] = id
|
|
|
|
|
|
|
|
return nameParts
|
|
|
|
|
|
|
|
def getMaleNameParts(self):
|
|
|
|
return self._getNameParts({0: 0,
|
|
|
|
2: 0,
|
|
|
|
3: 1,
|
|
|
|
5: 1,
|
|
|
|
6: 2,
|
|
|
|
7: 2,
|
|
|
|
8: 3})
|
|
|
|
|
|
|
|
def getFemaleNameParts(self):
|
|
|
|
return self._getNameParts({1: 0,
|
|
|
|
2: 0,
|
|
|
|
4: 1,
|
|
|
|
5: 1,
|
|
|
|
6: 2,
|
|
|
|
7: 2,
|
|
|
|
8: 3})
|
|
|
|
|
|
|
|
def getLastNamePrefixesCapped(self):
|
|
|
|
return self.capPrefixes
|
|
|
|
|
|
|
|
def returnUniqueID(self, name, listnumber):
|
|
|
|
newtu = [(), (), ()]
|
|
|
|
if listnumber == 0:
|
|
|
|
newtu[0] = (0, name)
|
|
|
|
newtu[1] = (1, name)
|
|
|
|
newtu[2] = (2, name)
|
|
|
|
elif listnumber == 1:
|
|
|
|
newtu[0] = (3, name)
|
|
|
|
newtu[1] = (4, name)
|
|
|
|
newtu[2] = (5, name)
|
|
|
|
elif listnumber == 2:
|
|
|
|
newtu[0] = (6, name)
|
|
|
|
newtu[1] = (7, name)
|
|
|
|
else:
|
|
|
|
newtu[0] = (8, name)
|
2019-12-30 00:07:56 -06:00
|
|
|
for tu in list(self.nameDictionary.items()):
|
2019-11-02 17:27:54 -05:00
|
|
|
for g in newtu:
|
|
|
|
if tu[1] == g:
|
|
|
|
return tu[0]
|
|
|
|
|
|
|
|
return -1
|
|
|
|
|
|
|
|
def findWidestInList(self, text, nameList):
|
|
|
|
maxWidth = 0
|
|
|
|
maxName = ''
|
|
|
|
for name in nameList:
|
|
|
|
width = text.calcWidth(name)
|
|
|
|
if width > maxWidth:
|
|
|
|
maxWidth = text.calcWidth(name)
|
|
|
|
maxName = name
|
|
|
|
|
2019-12-30 00:07:56 -06:00
|
|
|
print(maxName + ' ' + str(maxWidth))
|
2019-11-02 17:27:54 -05:00
|
|
|
return maxName
|
|
|
|
|
|
|
|
def findWidestName(self):
|
|
|
|
longestBoyTitle = self.findWidestInList(self.text, self.boyTitles + self.neutralTitles)
|
|
|
|
longestGirlTitle = self.findWidestInList(self.text, self.girlTitles + self.neutralTitles)
|
|
|
|
longestBoyFirst = self.findWidestInList(self.text, self.boyFirsts + self.neutralFirsts)
|
|
|
|
longestGirlFirst = self.findWidestInList(self.text, self.girlFirsts + self.neutralFirsts)
|
|
|
|
longestLastPrefix = self.findWidestInList(self.text, self.lastPrefixes)
|
|
|
|
longestLastSuffix = self.findWidestInList(self.text, self.lastSuffixes)
|
|
|
|
longestBoyFront = self.findWidestInList(self.text, [longestBoyTitle, longestBoyFirst])
|
|
|
|
longestGirlFront = self.findWidestInList(self.text, [longestGirlTitle, longestGirlFirst])
|
|
|
|
longestBoyName = longestBoyTitle + ' ' + longestBoyFirst + ' ' + longestLastPrefix + longestLastSuffix
|
|
|
|
longestGirlName = longestGirlTitle + ' ' + longestGirlFirst + ' ' + longestLastPrefix + longestLastSuffix
|
|
|
|
longestName = self.findWidestInList(self.text, [longestBoyName, longestGirlName])
|
|
|
|
return longestName
|
|
|
|
|
|
|
|
def findWidestTitleFirst(self):
|
|
|
|
longestBoyTitle = self.findWidestInList(self.text, self.boyTitles + self.neutralTitles)
|
|
|
|
longestGirlTitle = self.findWidestInList(self.text, self.girlTitles + self.neutralTitles)
|
|
|
|
longestBoyFirst = self.findWidestInList(self.text, self.boyFirsts + self.neutralFirsts)
|
|
|
|
longestGirlFirst = self.findWidestInList(self.text, self.girlFirsts + self.neutralFirsts)
|
|
|
|
longestBoyName = longestBoyTitle + ' ' + longestBoyFirst
|
|
|
|
longestGirlName = longestGirlTitle + ' ' + longestGirlFirst
|
|
|
|
longestName = self.findWidestInList(self.text, [longestBoyName, longestGirlName])
|
|
|
|
|
|
|
|
def findWidestTitle(self):
|
|
|
|
widestTitle = self.findWidestInList(self.text, self.neutralTitles + self.boyTitles + self.girlTitles)
|
|
|
|
return widestTitle
|
|
|
|
|
|
|
|
def findWidestFirstName(self):
|
|
|
|
widestFirst = self.findWidestInList(self.text, self.neutralFirsts + self.boyFirsts + self.girlFirsts)
|
|
|
|
return widestFirst
|
|
|
|
|
|
|
|
def findWidestLastName(self):
|
|
|
|
longestLastPrefix = self.findWidestInList(self.text, self.lastPrefixes)
|
|
|
|
longestLastSuffix = self.findWidestInList(self.text, self.lastSuffixes)
|
|
|
|
longestLastName = longestLastPrefix + longestLastSuffix
|
|
|
|
return longestLastName
|
|
|
|
|
|
|
|
def findWidestNameWord(self):
|
|
|
|
widestWord = self.findWidestInList(self.text, [self.findWidestTitle(), self.findWidestFirstName(), self.findWidestLastName()])
|
|
|
|
return widestWord
|
|
|
|
|
|
|
|
def findWidestNameWidth(self):
|
|
|
|
name = self.findWidestName()
|
|
|
|
return self.text.calcWidth(name)
|
|
|
|
|
|
|
|
def printWidestName(self):
|
|
|
|
name = self.findWidestName()
|
|
|
|
width = self.text.calcWidth(name)
|
|
|
|
widthStr = str(width)
|
2019-12-30 00:07:56 -06:00
|
|
|
print('The widest name is: ' + name + ' (' + widthStr + ' units)')
|
2019-11-02 17:27:54 -05:00
|
|
|
|
|
|
|
def printWidestLastName(self):
|
|
|
|
name = self.findWidestLastName()
|
|
|
|
width = self.text.calcWidth(name)
|
|
|
|
widthStr = str(width)
|
2019-12-30 00:07:56 -06:00
|
|
|
print('The widest last name is: ' + name + ' (' + widthStr + ' units)')
|
2019-11-02 17:27:54 -05:00
|
|
|
|
|
|
|
def randomName(self, boy = 0, girl = 0):
|
|
|
|
if boy and girl:
|
|
|
|
self.error("A name can't be both boy and girl!")
|
|
|
|
if not boy and not girl:
|
|
|
|
boy = random.choice([0, 1])
|
|
|
|
girl = not boy
|
|
|
|
uberFlag = random.choice(['title-first',
|
|
|
|
'title-last',
|
|
|
|
'first',
|
|
|
|
'last',
|
|
|
|
'first-last',
|
|
|
|
'title-first-last'])
|
|
|
|
titleFlag = 0
|
|
|
|
if uberFlag == 'title-first' or uberFlag == 'title-last' or uberFlag == 'title-first-last':
|
|
|
|
titleFlag = 1
|
|
|
|
firstFlag = 0
|
|
|
|
if uberFlag == 'title-first' or uberFlag == 'first' or uberFlag == 'first-last' or uberFlag == 'title-first-last':
|
|
|
|
firstFlag = 1
|
|
|
|
lastFlag = 0
|
|
|
|
if uberFlag == 'title-last' or uberFlag == 'last' or uberFlag == 'first-last' or uberFlag == 'title-first-last':
|
|
|
|
lastFlag = 1
|
|
|
|
retString = ''
|
|
|
|
if titleFlag:
|
|
|
|
titleList = self.neutralTitles[:]
|
|
|
|
if boy:
|
|
|
|
titleList += self.boyTitles
|
|
|
|
elif girl:
|
|
|
|
titleList += self.girlTitles
|
|
|
|
else:
|
|
|
|
self.error('Must be boy or girl.')
|
|
|
|
retString += random.choice(titleList) + ' '
|
|
|
|
if firstFlag:
|
|
|
|
firstList = self.neutralFirsts[:]
|
|
|
|
if boy:
|
|
|
|
firstList += self.boyFirsts
|
|
|
|
elif girl:
|
|
|
|
firstList += self.girlFirsts
|
|
|
|
else:
|
|
|
|
self.error('Must be boy or girl.')
|
|
|
|
retString += random.choice(firstList)
|
|
|
|
if lastFlag:
|
|
|
|
retString += ' '
|
|
|
|
if lastFlag:
|
|
|
|
lastPrefix = random.choice(self.lastPrefixes)
|
|
|
|
lastSuffix = random.choice(self.lastSuffixes)
|
|
|
|
if lastPrefix in self.capPrefixes:
|
|
|
|
lastSuffix = lastSuffix.capitalize()
|
|
|
|
retString += lastPrefix + lastSuffix
|
|
|
|
return retString
|
|
|
|
|
|
|
|
def randomNameMoreinfo(self, boy = 0, girl = 0):
|
|
|
|
if boy and girl:
|
|
|
|
self.error("A name can't be both boy and girl!")
|
|
|
|
if not boy and not girl:
|
|
|
|
boy = random.choice([0, 1])
|
|
|
|
girl = not boy
|
|
|
|
uberFlag = random.choice(['title-first',
|
|
|
|
'title-last',
|
|
|
|
'first',
|
|
|
|
'last',
|
|
|
|
'first-last',
|
|
|
|
'title-first-last'])
|
|
|
|
titleFlag = 0
|
|
|
|
if uberFlag == 'title-first' or uberFlag == 'title-last' or uberFlag == 'title-first-last':
|
|
|
|
titleFlag = 1
|
|
|
|
firstFlag = 0
|
|
|
|
if uberFlag == 'title-first' or uberFlag == 'first' or uberFlag == 'first-last' or uberFlag == 'title-first-last':
|
|
|
|
firstFlag = 1
|
|
|
|
lastFlag = 0
|
|
|
|
if uberFlag == 'title-last' or uberFlag == 'last' or uberFlag == 'first-last' or uberFlag == 'title-first-last':
|
|
|
|
lastFlag = 1
|
|
|
|
retString = ''
|
|
|
|
uberReturn = [0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
'',
|
|
|
|
'',
|
|
|
|
'',
|
|
|
|
'']
|
|
|
|
uberReturn[0] = titleFlag
|
|
|
|
uberReturn[1] = firstFlag
|
|
|
|
uberReturn[2] = lastFlag
|
|
|
|
titleList = self.neutralTitles[:]
|
|
|
|
if boy:
|
|
|
|
titleList += self.boyTitles
|
|
|
|
elif girl:
|
|
|
|
titleList += self.girlTitles
|
|
|
|
else:
|
|
|
|
self.error('Must be boy or girl.')
|
|
|
|
uberReturn[3] = random.choice(titleList)
|
|
|
|
firstList = self.neutralFirsts[:]
|
|
|
|
if boy:
|
|
|
|
firstList += self.boyFirsts
|
|
|
|
elif girl:
|
|
|
|
firstList += self.girlFirsts
|
|
|
|
else:
|
|
|
|
self.error('Must be boy or girl.')
|
|
|
|
uberReturn[4] = random.choice(firstList)
|
|
|
|
lastPrefix = random.choice(self.lastPrefixes)
|
|
|
|
lastSuffix = random.choice(self.lastSuffixes)
|
|
|
|
if lastPrefix in self.capPrefixes:
|
|
|
|
lastSuffix = lastSuffix.capitalize()
|
|
|
|
uberReturn[5] = lastPrefix
|
|
|
|
uberReturn[6] = lastSuffix
|
|
|
|
if titleFlag:
|
|
|
|
retString += uberReturn[3] + ' '
|
|
|
|
if firstFlag:
|
|
|
|
retString += uberReturn[4]
|
|
|
|
if lastFlag:
|
|
|
|
retString += ' '
|
|
|
|
if lastFlag:
|
|
|
|
retString += uberReturn[5] + uberReturn[6]
|
|
|
|
uberReturn.append(retString)
|
|
|
|
return uberReturn
|
|
|
|
|
|
|
|
def printRandomNames(self, boy = 0, girl = 0, total = 1):
|
|
|
|
i = 0
|
|
|
|
origBoy = boy
|
|
|
|
origGirl = girl
|
|
|
|
while i < total:
|
|
|
|
if not origBoy and not origGirl:
|
|
|
|
boy = random.choice([0, 1])
|
|
|
|
girl = not boy
|
|
|
|
name = self.randomName(boy, girl)
|
|
|
|
width = self.text.calcWidth(name)
|
|
|
|
widthStr = str(width)
|
|
|
|
if boy:
|
2019-12-30 00:07:56 -06:00
|
|
|
print('Boy: ' + name + ' (' + widthStr + ' units)')
|
2019-11-02 17:27:54 -05:00
|
|
|
if girl:
|
2019-12-30 00:07:56 -06:00
|
|
|
print('Girl: ' + name + ' (' + widthStr + ' units)')
|
2019-11-02 17:27:54 -05:00
|
|
|
i += 1
|
|
|
|
|
|
|
|
def percentOver(self, limit = 9.0, samples = 1000):
|
|
|
|
i = 0
|
|
|
|
over = 0
|
|
|
|
while i < samples:
|
|
|
|
name = self.randomName()
|
|
|
|
width = self.text.calcWidth(name)
|
|
|
|
if width > limit:
|
|
|
|
over += 1
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
percent = float(over) / float(samples) * 100
|
2019-12-30 00:07:56 -06:00
|
|
|
print('Samples: ' + str(samples) + ' Over: ' + str(over) + ' Percent: ' + str(percent))
|
2019-11-02 17:27:54 -05:00
|
|
|
|
|
|
|
def totalNames(self):
|
|
|
|
firsts = len(self.boyFirsts) + len(self.girlFirsts) + len(self.neutralFirsts)
|
2019-12-30 00:07:56 -06:00
|
|
|
print('Total firsts: ' + str(firsts))
|
2019-11-02 17:27:54 -05:00
|
|
|
lasts = len(self.lastPrefixes) * len(self.lastSuffixes)
|
2019-12-30 00:07:56 -06:00
|
|
|
print('Total lasts: ' + str(lasts))
|
2019-11-02 17:27:54 -05:00
|
|
|
neutralTitleFirsts = len(self.neutralTitles) * len(self.neutralFirsts)
|
|
|
|
boyTitleFirsts = len(self.boyTitles) * (len(self.neutralFirsts) + len(self.boyFirsts)) + len(self.neutralTitles) * len(self.boyFirsts)
|
|
|
|
girlTitleFirsts = len(self.girlTitles) * (len(self.neutralFirsts) + len(self.girlFirsts)) + len(self.neutralTitles) * len(self.girlFirsts)
|
|
|
|
totalTitleFirsts = neutralTitleFirsts + boyTitleFirsts + girlTitleFirsts
|
2019-12-30 00:07:56 -06:00
|
|
|
print('Total title firsts: ' + str(totalTitleFirsts))
|
2019-11-02 17:27:54 -05:00
|
|
|
neutralTitleLasts = len(self.neutralTitles) * lasts
|
|
|
|
boyTitleLasts = len(self.boyTitles) * lasts
|
|
|
|
girlTitleLasts = len(self.girlTitles) * lasts
|
|
|
|
totalTitleLasts = neutralTitleLasts + boyTitleFirsts + girlTitleLasts
|
2019-12-30 00:07:56 -06:00
|
|
|
print('Total title lasts: ' + str(totalTitleLasts))
|
2019-11-02 17:27:54 -05:00
|
|
|
neutralFirstLasts = len(self.neutralFirsts) * lasts
|
|
|
|
boyFirstLasts = len(self.boyFirsts) * lasts
|
|
|
|
girlFirstLasts = len(self.girlFirsts) * lasts
|
|
|
|
totalFirstLasts = neutralFirstLasts + boyFirstLasts + girlFirstLasts
|
2019-12-30 00:07:56 -06:00
|
|
|
print('Total first lasts: ' + str(totalFirstLasts))
|
2019-11-02 17:27:54 -05:00
|
|
|
neutralTitleFirstLasts = neutralTitleFirsts * lasts
|
|
|
|
boyTitleFirstLasts = boyTitleFirsts * lasts
|
|
|
|
girlTitleFirstLasts = girlTitleFirsts * lasts
|
|
|
|
totalTitleFirstLasts = neutralTitleFirstLasts + boyTitleFirstLasts + girlTitleFirstLasts
|
2019-12-30 00:07:56 -06:00
|
|
|
print('Total title first lasts: ' + str(totalTitleFirstLasts))
|
2019-11-02 17:27:54 -05:00
|
|
|
totalNames = firsts + lasts + totalTitleFirsts + totalTitleLasts + totalFirstLasts + totalTitleFirstLasts
|
2019-12-30 00:07:56 -06:00
|
|
|
print('Total Names: ' + str(totalNames))
|