Poodletooth-iLand/toontown/dna/DNAStorage.py
2015-03-03 17:10:12 -05:00

308 lines
9.4 KiB
Python

from pandac.PandaModules import *
from DNAError import DNAError
from DNASuitPoint import DNASuitPoint
from DNASuitPath import DNASuitPath
from DNASuitEdge import DNASuitEdge
class DNAStorage:
def __init__(self):
self.suitPoints = []
self.suitPointMap = {}
self.DNAGroups = {}
self.DNAVisGroups = []
self.suitEdges = {}
self.battleCells = []
self.nodes = {}
self.hoodNodes = {}
self.placeNodes = {}
self.fonts = {}
self.blockTitles = {}
self.blockArticles = {}
self.blockBuildingTypes = {}
self.blockDoors = {}
self.blockNumbers = []
self.blockZones = {}
self.textures = {}
self.catalogCodes = {}
def getSuitPath(self, startPoint, endPoint, minPathLen=40, maxPathLen=300):
path = DNASuitPath()
path.addPoint(startPoint)
while path.getNumPoints() < maxPathLen:
startPointIndex = startPoint.getIndex()
if startPointIndex == endPoint.getIndex():
if path.getNumPoints() >= minPathLen:
break
if startPointIndex not in self.suitEdges:
raise DNAError('Could not find DNASuitPath.')
edges = self.suitEdges[startPointIndex]
for edge in edges:
startPoint = edge.getEndPoint()
startPointType = startPoint.getPointType()
if startPointType != DNASuitPoint.FRONT_DOOR_POINT:
if startPointType != DNASuitPoint.SIDE_DOOR_POINT:
break
else:
raise DNAError('Could not find DNASuitPath.')
path.addPoint(startPoint)
return path
def getSuitEdgeTravelTime(self, startIndex, endIndex, suitWalkSpeed):
startPoint = self.suitPointMap.get(startIndex)
endPoint = self.suitPointMap.get(endIndex)
if (not startPoint) or (not endPoint):
return 0.0
distance = (endPoint.getPos()-startPoint.getPos()).length()
return distance / suitWalkSpeed
def getSuitEdgeZone(self, startIndex, endIndex):
return self.getSuitEdge(startIndex, endIndex).getZoneId()
def getAdjacentPoints(self, point):
path = DNASuitPath()
startIndex = point.getIndex()
if startIndex not in self.suitEdges:
return path
for edge in self.suitEdges[startIndex]:
path.addPoint(edge.getEndPoint())
return path
def storeSuitPoint(self, suitPoint):
if not isinstance(suitPoint, DNASuitPoint):
raise TypeError('suitPoint must be an instance of DNASuitPoint')
self.suitPoints.append(suitPoint)
self.suitPointMap[suitPoint.getIndex()] = suitPoint
def getSuitPointAtIndex(self, index):
return self.suitPoints[index]
def getSuitPointWithIndex(self, index):
return self.suitPointMap.get(index)
def resetSuitPoints(self):
self.suitPoints = []
self.suitPointMap = {}
self.suitEdges = {}
def resetTextures(self):
self.textures = {}
def resetHood(self):
self.resetBlockNumbers()
def findDNAGroup(self, node):
return self.DNAGroups[node]
def removeDNAGroup(self, dnagroup):
for node, group in self.DNAGroups.items():
if group == dnagroup:
del self.DNAGroups[node]
def resetDNAGroups(self):
self.DNAGroups = {}
def getNumDNAVisGroups(self):
return len(self.DNAVisGroups)
def getDNAVisGroupName(self, i):
return self.DNAVisGroups[i].getName()
def storeDNAVisGroup(self, group):
self.DNAVisGroups.append(group)
def storeSuitEdge(self, startIndex, endIndex, zoneId):
startPoint = self.getSuitPointWithIndex(startIndex)
endPoint = self.getSuitPointWithIndex(endIndex)
edge = DNASuitEdge(startPoint, endPoint, zoneId)
self.suitEdges.setdefault(startIndex, []).append(edge)
return edge
def getSuitEdge(self, startIndex, endIndex):
edges = self.suitEdges[startIndex]
for edge in edges:
if edge.getEndPoint().getIndex() == endIndex:
return edge
def removeBattleCell(self, cell):
self.battleCells.remove(cell)
def storeBattleCell(self, cell):
self.battleCells.append(cell)
def resetBattleCells(self):
self.battleCells = []
def findNode(self, code):
if code in self.nodes:
return self.nodes[code]
if code in self.hoodNodes:
return self.hoodNodes[code]
if code in self.placeNodes:
return self.placeNodes[code]
def resetNodes(self):
for node in self.nodes:
self.nodes[node].removeNode()
self.nodes = {}
def resetHoodNodes(self):
for node in self.hoodNodes:
self.hoodNodes[node].removeNode()
self.hoodNodes = {}
def resetPlaceNodes(self):
for node in self.placeNodes:
self.placeNodes[node].removeNode()
self.placeNodes = {}
def storeNode(self, node, code):
self.nodes[code] = node
def storeHoodNode(self, node, code):
self.hoodNodes[code] = node
def storePlaceNode(self, node, code):
self.placeNodes[code] = node
def findFont(self, code):
if code in self.fonts:
return self.fonts[code]
def resetFonts(self):
self.fonts = {}
def storeFont(self, font, code):
self.fonts[code] = font
def getBlock(self, name):
block = name[name.find(':')-2:name.find(':')]
if not block[0].isdigit():
block = block[1:]
return block
def getBlockBuildingType(self, blockNumber):
if blockNumber in self.blockBuildingTypes:
return self.blockBuildingTypes[blockNumber]
def getTitleFromBlockNumber(self, blockNumber):
if blockNumber in self.blockTitles:
return self.blockTitles[blockNumber]
return ''
def getDoorPosHprFromBlockNumber(self, blockNumber):
key = str(blockNumber)
if key in self.blockDoors:
return self.blockDoors[key]
def storeBlockDoor(self, blockNumber, door):
self.blockDoors[str(blockNumber)] = door
def storeBlockTitle(self, blockNumber, title):
self.blockTitles[blockNumber] = title
def storeBlockArticle(self, blockNumber, article):
self.blockArticles[blockNumber] = article
def storeBlockBuildingType(self, blockNumber, buildingType):
self.blockBuildingTypes[blockNumber] = buildingType
def storeBlock(self, blockNumber, title, article, bldgType, zoneId):
self.storeBlockNumber(blockNumber)
self.storeBlockTitle(blockNumber, title)
self.storeBlockArticle(blockNumber, article)
self.storeBlockBuildingType(blockNumber, bldgType)
self.storeBlockZone(blockNumber, zoneId)
def storeTexture(self, name, texture):
self.textures[name] = texture
def resetDNAVisGroups(self):
self.DNAVisGroups = []
def resetDNAVisGroupsAI(self):
self.resetDNAVisGroups()
def getNumDNAVisGroupsAI(self):
return self.getNumDNAVisGroups()
def getNumSuitPoints(self):
return len(self.suitPoints)
def getNumVisiblesInDNAVisGroup(self, i):
return self.DNAVisGroups[i].getNumVisibles()
def getVisibleName(self, i, j):
return self.DNAVisGroups[i].getVisibleName(j)
def getDNAVisGroupAI(self, i):
return self.DNAVisGroups[i]
def storeCatalogCode(self, category, code):
if not category in self.catalogCodes:
self.catalogCodes[category] = []
self.catalogCodes[category].append(code)
def getNumCatalogCodes(self, category):
if category not in self.catalogCodes:
return -1
return len(self.catalogCodes[category])
def resetCatalogCodes(self):
self.catalogCodes = {}
def getCatalogCode(self, category, index):
return self.catalogCodes[category][index]
def findTexture(self, name):
if name in self.textures:
return self.textures[name]
def discoverContinuity(self):
return 1 # TODO
def resetBlockNumbers(self):
self.blockNumbers = []
self.blockZones = {}
self.blockArticles = {}
self.resetBlockDoors()
self.blockTitles = {}
self.blockBuildingTypes = {}
def getNumBlockNumbers(self):
return len(self.blockNumbers)
def storeBlockNumber(self, blockNumber):
self.blockNumbers.append(blockNumber)
def getBlockNumberAt(self, index):
return self.blockNumbers[index]
def getZoneFromBlockNumber(self, blockNumber):
if blockNumber in self.blockZones:
return self.blockZones[blockNumber]
def storeBlockZone(self, blockNumber, zoneId):
self.blockZones[blockNumber] = zoneId
def resetBlockZones(self):
self.blockZones = {}
def resetBlockDoors(self):
self.blockDoors = {}
def cleanup(self):
self.resetBattleCells()
self.resetBlockNumbers()
self.resetDNAGroups()
self.resetDNAVisGroups()
self.resetDNAVisGroupsAI()
self.resetFonts()
self.resetHood()
self.resetHoodNodes()
self.resetNodes()
self.resetPlaceNodes()
self.resetSuitPoints()
self.resetTextures()
self.resetCatalogCodes()
ModelPool.garbageCollect()
TexturePool.garbageCollect()