ToonTownRewritten/otp/level/EntityTypeRegistry.py
2014-04-21 19:17:35 -07:00

99 lines
3.5 KiB
Python

from pandac.PandaModules import *
from direct.directnotify import DirectNotifyGlobal
import types
import AttribDesc
import EntityTypeDesc
from direct.showbase.PythonUtil import mostDerivedLast
import os
import string
class EntityTypeRegistry:
notify = DirectNotifyGlobal.directNotify.newCategory('EntityTypeRegistry')
def __init__(self, entityTypeModule):
self.entTypeModule = entityTypeModule
hv = HashVal()
import EntityTypes
reload(EntityTypes)
reload(self.entTypeModule)
def getPyExtVersion(filename):
base, ext = os.path.splitext(filename)
if ext == '.pyc' or ext == '.pyo':
filename = base + '.py'
return filename
fileLines = file(getPyExtVersion(EntityTypes.__file__)).readlines()
hv.hashString(string.join(fileLines))
s = str(hv.asHex())
s += '.'
fileLines = file(getPyExtVersion(self.entTypeModule.__file__)).readlines()
hv.hashString(string.join(fileLines))
s += str(hv.asHex())
self.hashStr = s
getPyExtVersion = None
classes = []
for key, value in entityTypeModule.__dict__.items():
if type(value) is types.ClassType:
if issubclass(value, EntityTypeDesc.EntityTypeDesc):
classes.append(value)
self.entTypeName2typeDesc = {}
mostDerivedLast(classes)
for c in classes:
if c.__dict__.has_key('type'):
if self.entTypeName2typeDesc.has_key(c.type):
EntityTypeRegistry.notify.debug("replacing %s with %s for entity type '%s'" % (self.entTypeName2typeDesc[c.type].__class__, c, c.type))
self.entTypeName2typeDesc[c.type] = c()
self.output2typeNames = {}
for typename, typeDesc in self.entTypeName2typeDesc.items():
if typeDesc.isConcrete():
if hasattr(typeDesc, 'output'):
outputType = typeDesc.output
self.output2typeNames.setdefault(outputType, [])
self.output2typeNames[outputType].append(typename)
self.permanentTypeNames = []
for typename, typeDesc in self.entTypeName2typeDesc.items():
if typeDesc.isPermanent():
self.permanentTypeNames.append(typename)
self.typeName2derivedTypeNames = {}
for typename, typeDesc in self.entTypeName2typeDesc.items():
typenames = []
for tn, td in self.entTypeName2typeDesc.items():
if td.isConcrete():
if issubclass(td.__class__, typeDesc.__class__):
typenames.append(tn)
self.typeName2derivedTypeNames[typename] = typenames
return
def getAllTypeNames(self):
return self.entTypeName2typeDesc.keys()
def getTypeDesc(self, entTypeName):
return self.entTypeName2typeDesc[entTypeName]
def getTypeNamesFromOutputType(self, outputType):
return self.output2typeNames.get(outputType, [])
def getDerivedTypeNames(self, entTypeName):
return self.typeName2derivedTypeNames[entTypeName]
def isDerivedAndBase(self, entType, baseEntType):
return entType in self.getDerivedTypeNames(baseEntType)
def getPermanentTypeNames(self):
return self.permanentTypeNames
def getHashStr(self):
return self.hashStr
def __hash__(self):
return hash(repr(self))
def __repr__(self):
return str(self.entTypeName2typeDesc)