소스 검색

added LevelSpec.makeNewSpec, LevelConstants module

Darren Ranalli 22 년 전
부모
커밋
067204e92c
5개의 변경된 파일95개의 추가작업 그리고 21개의 파일을 삭제
  1. 3 2
      direct/src/level/DistributedLevel.py
  2. 12 4
      direct/src/level/Level.py
  3. 8 0
      direct/src/level/LevelConstants.py
  4. 70 13
      direct/src/level/LevelSpec.py
  5. 2 2
      direct/src/level/ZoneEntityBase.py

+ 3 - 2
direct/src/level/DistributedLevel.py

@@ -5,6 +5,7 @@ from PythonUtil import Functor, sameElements, list2dict, uniqueElements
 import ToontownGlobals
 import ToontownGlobals
 import DistributedObject
 import DistributedObject
 import Level
 import Level
+import LevelConstants
 import DirectNotifyGlobal
 import DirectNotifyGlobal
 import EntityCreator
 import EntityCreator
 import OnscreenText
 import OnscreenText
@@ -363,7 +364,7 @@ class DistributedLevel(DistributedObject.DistributedObject,
         # if no viz, listen to all the zones
         # if no viz, listen to all the zones
         if not DistributedLevel.WantVisibility:
         if not DistributedLevel.WantVisibility:
             zoneNums = list(self.zoneNums)
             zoneNums = list(self.zoneNums)
-            zoneNums.remove(Level.Level.uberZoneNum)
+            zoneNums.remove(LevelConstants.UberZoneNum)
             self.setVisibility(zoneNums)
             self.setVisibility(zoneNums)
 
 
     def toonEnterZone(self, zoneNum):
     def toonEnterZone(self, zoneNum):
@@ -428,7 +429,7 @@ class DistributedLevel(DistributedObject.DistributedObject,
         # accepts list of visible zone numbers
         # accepts list of visible zone numbers
         # convert the zone numbers into their actual zoneIds
         # convert the zone numbers into their actual zoneIds
         # always include Toontown and factory uberZones
         # always include Toontown and factory uberZones
-        uberZone = self.getZoneId(zoneNum=Level.Level.UberZoneNum)
+        uberZone = self.getZoneId(zoneNum=LevelConstants.UberZoneNum)
         # the level itself is in the 'level zone'
         # the level itself is in the 'level zone'
         visibleZoneIds = [ToontownGlobals.UberZone, self.levelZone, uberZone]
         visibleZoneIds = [ToontownGlobals.UberZone, self.levelZone, uberZone]
         for vz in vizList:
         for vz in vizList:

+ 12 - 4
direct/src/level/Level.py

@@ -2,6 +2,7 @@
 
 
 import DirectNotifyGlobal
 import DirectNotifyGlobal
 import string
 import string
+import LevelConstants
 from PythonUtil import lineInfo, uniqueElements
 from PythonUtil import lineInfo, uniqueElements
 
 
 """
 """
@@ -30,9 +31,6 @@ class Level:
     entities and their interrelations, and creates and destroys entities"""
     entities and their interrelations, and creates and destroys entities"""
     notify = DirectNotifyGlobal.directNotify.newCategory('Level')
     notify = DirectNotifyGlobal.directNotify.newCategory('Level')
 
 
-    UberZoneNum = 0
-    UberZoneEntId = 0
-
     def __init__(self):
     def __init__(self):
         self.levelSpec = None
         self.levelSpec = None
         self.initialized = 0
         self.initialized = 0
@@ -56,8 +54,18 @@ class Level:
 
 
         # there should be one and only one levelMgr
         # there should be one and only one levelMgr
         assert len(self.entType2ids['levelMgr']) == 1
         assert len(self.entType2ids['levelMgr']) == 1
+        self.levelMgrEntity = self.entType2ids['levelMgr'][0]
+        assert self.levelMgrEntity.entId == LevelConstants.LevelMgrEntId
+
+        if __debug__:
+            # there should be one and only one editMgr
+            assert len(self.entType2ids['editMgr']) == 1
+            self.editMgrEntity = self.entType2ids['editMgr'][0]
+            assert self.editMgrEntity.entId == LevelConstants.EditMgrEntId
+
         # make sure the uberzone is there
         # make sure the uberzone is there
-        assert Level.UberZoneEntId in self.entType2ids['zone']
+        assert LevelConstants.UberZoneEntId in self.entType2ids['zone']
+        self.UberZoneEntity = self.getEntity(LevelConstants.UberZoneEntId)
 
 
         # this list contains the entIds of entities that we have actually
         # this list contains the entIds of entities that we have actually
         # created, in order of creation
         # created, in order of creation

+ 8 - 0
direct/src/level/LevelConstants.py

@@ -0,0 +1,8 @@
+"""LevelConstants module: contains Level-related constants"""
+
+UberZoneEntId = 0
+UberZoneNum = 0
+
+LevelMgrEntId = 10
+
+EditMgrEntId = 20

+ 70 - 13
direct/src/level/LevelSpec.py

@@ -3,18 +3,35 @@
 import DirectNotifyGlobal
 import DirectNotifyGlobal
 from PythonUtil import list2dict, uniqueElements
 from PythonUtil import list2dict, uniqueElements
 import string
 import string
+import LevelConstants
 if __debug__:
 if __debug__:
     import os
     import os
 
 
+if __debug__:
+    def makeNewSpec(filename, modelPath, ):
+        spec = LevelSpec()
+        spec.doSetAttrib(LevelConstants.LevelMgrEntId,
+                         'modelFilename', modelPath)
+        spec.saveToDisk(filename, makeBackup=0)
+
 class LevelSpec:
 class LevelSpec:
     """contains spec data for a level, is responsible for handing the data
     """contains spec data for a level, is responsible for handing the data
     out upon request, as well as recording changes made during editing, and
     out upon request, as well as recording changes made during editing, and
     saving out modified spec data"""
     saving out modified spec data"""
     notify = DirectNotifyGlobal.directNotify.newCategory("LevelSpec")
     notify = DirectNotifyGlobal.directNotify.newCategory("LevelSpec")
     
     
-    def __init__(self, specDict, scenario=0):
+    def __init__(self, specDict=None, scenario=0):
         self.specDict = specDict
         self.specDict = specDict
 
 
+        if __debug__:
+            newSpec = 0
+            if self.specDict == None:
+                newSpec = 1
+                self.specDict = {
+                    'globalEntities': {},
+                    'scenarios': [[{}, 1]],
+                    }
+
         # this maps an entId to the dict that holds its spec;
         # this maps an entId to the dict that holds its spec;
         # entities are either in the global dict or a scenario dict
         # entities are either in the global dict or a scenario dict
         # update the map of entId to spec dict
         # update the map of entId to spec dict
@@ -29,6 +46,33 @@ class LevelSpec:
 
 
         self.setScenario(scenario)
         self.setScenario(scenario)
 
 
+        if __debug__:
+            if newSpec:
+                # add required entities
+
+                # create an entityTypeReg before attempting entity
+                # insertions; basic EntityTypes reg is enough for our purposes
+                # here
+                import EntityTypes
+                import EntityTypeRegistry
+                etr = EntityTypeRegistry.EntityTypeRegistry(EntityTypes)
+                self.setEntityTypeReg(etr)
+
+                # UberZone
+                entId = LevelConstants.UberZoneEntId
+                self.insertEntity(entId, 'zone', None)
+                self.doSetAttrib(entId, 'modelZoneNum',
+                                 LevelConstants.UberZoneNum)
+                self.doSetAttrib(entId, 'name', 'UberZone')
+                # LevelMgr
+                entId = LevelConstants.LevelMgrEntId
+                self.insertEntity(entId, 'levelMgr', None)
+                self.doSetAttrib(entId, 'name', 'LevelMgr')
+                # EditMgr
+                entId = LevelConstants.EditMgrEntId
+                self.insertEntity(entId, 'editMgr', None)
+                self.doSetAttrib(entId, 'name', 'EditMgr')
+                                       
     def getNumScenarios(self):
     def getNumScenarios(self):
         return len(self.specDict['scenarios'])
         return len(self.specDict['scenarios'])
 
 
@@ -84,6 +128,9 @@ class LevelSpec:
         def setLevel(self, level):
         def setLevel(self, level):
             self.level = level
             self.level = level
 
 
+        def hasLevel(self):
+            return hasattr(self, 'level')
+
         def setEntityTypeReg(self, entTypeReg):
         def setEntityTypeReg(self, entTypeReg):
             self.entTypeReg = entTypeReg
             self.entTypeReg = entTypeReg
             self.checkSpecIntegrity()
             self.checkSpecIntegrity()
@@ -94,20 +141,25 @@ class LevelSpec:
         def setFilename(self, filename):
         def setFilename(self, filename):
             self.filename = filename
             self.filename = filename
 
 
-        def setAttribChange(self, entId, attrib, value, username):
-            """ we're being asked to change an attribute """
-            LevelSpec.notify.info("setAttribChange(%s): %s, %s = '%s'" %
-                                  (username, entId, attrib, repr(value)))
+        def doSetAttrib(self, entId, attrib, value):
+            """ do the dirty work of changing an attrib value """
             assert entId in self.entId2specDict
             assert entId in self.entId2specDict
             specDict = self.entId2specDict[entId]
             specDict = self.entId2specDict[entId]
             assert specDict[entId].has_key(attrib)
             assert specDict[entId].has_key(attrib)
             specDict[entId][attrib] = value
             specDict[entId][attrib] = value
-            # let the level know that this attribute value has
-            # officially changed
-            self.level.handleAttribChange(entId, attrib, value, username)
+
+        def setAttribChange(self, entId, attrib, value, username):
+            """ we're being asked to change an attribute """
+            LevelSpec.notify.info("setAttribChange(%s): %s, %s = '%s'" %
+                                  (username, entId, attrib, repr(value)))
+            self.doSetAttrib(entId, attrib, value)
+            if self.hasLevel():
+                # let the level know that this attribute value has
+                # officially changed
+                self.level.handleAttribChange(entId, attrib, value, username)
 
 
         def insertEntity(self, entId, entType, parentEntId):
         def insertEntity(self, entId, entType, parentEntId):
-            LevelSpec.notify.info('inserting entity %s' % entId)
+            LevelSpec.notify.info('inserting entity %s (%s)' % (entId, entType))
             assert entId not in self.entId2specDict
             assert entId not in self.entId2specDict
             assert self.entTypeReg is not None
             assert self.entTypeReg is not None
             globalEnts = self.privGetGlobalEntityDict()
             globalEnts = self.privGetGlobalEntityDict()
@@ -124,14 +176,18 @@ class LevelSpec:
             if 'parentEntId' in spec:
             if 'parentEntId' in spec:
                 spec['parentEntId'] = parentEntId
                 spec['parentEntId'] = parentEntId
 
 
-            # notify the level
-            self.level.handleEntityInsert(entId)
+            if self.hasLevel():
+                # notify the level
+                self.level.handleEntityInsert(entId)
             
             
         def removeEntity(self, entId):
         def removeEntity(self, entId):
             LevelSpec.notify.info('removing entity %s' % entId)
             LevelSpec.notify.info('removing entity %s' % entId)
             assert entId in self.entId2specDict
             assert entId in self.entId2specDict
-            # notify the level
-            self.level.handleEntityRemove(entId)
+
+            if self.hasLevel():
+                # notify the level
+                self.level.handleEntityRemove(entId)
+
             # remove the entity's spec
             # remove the entity's spec
             dict = self.entId2specDict[entId]
             dict = self.entId2specDict[entId]
             del dict[entId]
             del dict[entId]
@@ -162,6 +218,7 @@ class LevelSpec:
                     LevelSpec.notify.warning(
                     LevelSpec.notify.warning(
                         'error during backup: %s' % str(e))
                         'error during backup: %s' % str(e))
 
 
+            LevelSpec.notify.info("writing to '%s'" % filename)
             self.privRemoveFile(filename)
             self.privRemoveFile(filename)
             self.privSaveToDisk(filename)
             self.privSaveToDisk(filename)
 
 

+ 2 - 2
direct/src/level/ZoneEntityBase.py

@@ -1,7 +1,7 @@
 """ZoneEntityBase module: contains the ZoneEntityBase class"""
 """ZoneEntityBase module: contains the ZoneEntityBase class"""
 
 
 import Entity
 import Entity
-import Level
+import LevelConstants
 
 
 class ZoneEntityBase(Entity.Entity):
 class ZoneEntityBase(Entity.Entity):
     def __init__(self, level, entId):
     def __init__(self, level, entId):
@@ -13,7 +13,7 @@ class ZoneEntityBase(Entity.Entity):
         Entity.Entity.destroy(self)
         Entity.Entity.destroy(self)
 
 
     def isUberZone(self):
     def isUberZone(self):
-        return self.entId == Level.Level.UberZoneEntId
+        return self.entId == LevelConstants.UberZoneEntId
 
 
     def setZoneId(self, zoneId):
     def setZoneId(self, zoneId):
         """set the network zoneId that this zone entity corresponds to"""
         """set the network zoneId that this zone entity corresponds to"""