text: from pandac.PandaModules import *
  from toontown.toonbase.ToontownGlobals import *
  from direct.distributed.ClockDelta import *
  from direct.interval.IntervalGlobal import *
  import random
  from otp.level import DistributedLevel
  from direct.directnotify import DirectNotifyGlobal
  from . import LawOfficeBase
  from . import FactoryEntityCreator
  from . import FactorySpecs
  from otp.level import LevelSpec
  from otp.level import LevelConstants
  from toontown.toonbase import TTLocalizer
  from toontown.coghq import FactoryCameraViews
  if __dev__:
      from otp.level import EditorGlobals
  
  class DistributedLawOfficeFloor(DistributedLevel.DistributedLevel, LawOfficeBase.LawOfficeBase):
      notify = DirectNotifyGlobal.directNotify.newCategory('DistributedLawOffice')
  
      def __init__(self, cr):
          DistributedLevel.DistributedLevel.__init__(self, cr)
          LawOfficeBase.LawOfficeBase.__init__(self)
          self.suitIds = []
          self.suits = []
          self.reserveSuits = []
          self.joiningReserves = []
          self.suitsInitialized = 0
          self.goonClipPlanes = {}
  
      def createEntityCreator(self):
          return FactoryEntityCreator.FactoryEntityCreator(level=self)
  
      def generate(self):
          self.notify.debug('generate')
          DistributedLevel.DistributedLevel.generate(self)
          self.factoryViews = FactoryCameraViews.FactoryCameraViews(self)
          base.localAvatar.chatMgr.chatInputSpeedChat.addFactoryMenu()
          if __dev__:
              bboard.post(EditorGlobals.EditTargetPostName, self)
          self.accept('SOSPanelEnter', self.handleSOSPanel)
  
      def delete(self):
          DistributedLevel.DistributedLevel.delete(self)
          base.localAvatar.chatMgr.chatInputSpeedChat.removeFactoryMenu()
          self.factoryViews.delete()
          del self.factoryViews
          self.ignore('SOSPanelEnter')
          if __dev__:
              bboard.removeIfEqual(EditorGlobals.EditTargetPostName, self)
  
      def setLawOfficeId(self, id):
          LawOfficeBase.LawOfficeBase.setLawOfficeId(self, id)
  
      def setForemanConfronted(self, avId):
          if avId == base.localAvatar.doId:
              return
          av = base.cr.identifyFriend(avId)
          if av is None:
              return
          base.localAvatar.setSystemMessage(avId, TTLocalizer.ForemanConfrontedMsg % av.getName())
          return
  
      def setDefeated(self):
          self.notify.info('setDefeated')
          messenger.send('FactoryWinEvent')
  
      def levelAnnounceGenerate(self):
          self.notify.debug('levelAnnounceGenerate')
          DistributedLevel.DistributedLevel.levelAnnounceGenerate(self)
          specModule = FactorySpecs.getFactorySpecModule(self.lawOfficeId)
          factorySpec = LevelSpec.LevelSpec(specModule)
          if __dev__:
              typeReg = self.getEntityTypeReg()
              factorySpec.setEntityTypeReg(typeReg)
          DistributedLevel.DistributedLevel.initializeLevel(self, factorySpec)
  
      def privGotSpec(self, levelSpec):
          if __dev__:
              if not levelSpec.hasEntityTypeReg():
                  typeReg = self.getEntityTypeReg()
                  levelSpec.setEntityTypeReg(typeReg)
          firstSetZoneDoneEvent = self.cr.getNextSetZoneDoneEvent()
  
          def handleFirstSetZoneDone():
              base.factoryReady = 1
              messenger.send('FactoryReady')
  
          self.acceptOnce(firstSetZoneDoneEvent, handleFirstSetZoneDone)
          modelCount = len(levelSpec.getAllEntIds())
          loader.beginBulkLoad('factory', TTLocalizer.HeadingToFactoryTitle % TTLocalizer.FactoryNames[self.lawOfficeId], modelCount, 1, TTLocalizer.TIP_COGHQ, LawbotOfficeInt)
          DistributedLevel.DistributedLevel.privGotSpec(self, levelSpec)
          loader.endBulkLoad('factory')
          messenger.send('LawOffice_Spec_Loaded')
  
          def printPos(self = self):
              pos = base.localAvatar.getPos(self.getZoneNode(self.lastToonZone))
              h = base.localAvatar.getH(self.getZoneNode(self.lastToonZone))
              print('factory pos: %s, h: %s, zone %s' % (repr(pos), h, self.lastToonZone))
              posStr = 'X: %.3f' % pos[0] + '\nY: %.3f' % pos[1] + '\nZ: %.3f' % pos[2] + '\nH: %.3f' % h + '\nZone: %s' % str(self.lastToonZone)
              base.localAvatar.setChat(posStr, CFThought, 0)
  
          self.accept('f2', printPos)
          base.localAvatar.setCameraCollisionsCanMove(1)
          self.acceptOnce('leavingFactory', self.announceLeaving)
  
      def handleSOSPanel(self, panel):
          avIds = []
          for avId in self.avIdList:
              if base.cr.doId2do.get(avId):
                  avIds.append(avId)
  
          panel.setFactoryToonIdList(avIds)
  
      def handleFloorDone(self):
          self.sendUpdate('readyForNextFloor')
  
      def disable(self):
          self.notify.debug('disable')
          base.localAvatar.setCameraCollisionsCanMove(0)
          if hasattr(self, 'suits'):
              del self.suits
          if hasattr(self, 'relatedObjectMgrRequest') and self.relatedObjectMgrRequest:
              self.cr.relatedObjectMgr.abortRequest(self.relatedObjectMgrRequest)
              del self.relatedObjectMgrRequest
          DistributedLevel.DistributedLevel.disable(self)
  
      def setSuits(self, suitIds, reserveSuitIds):
          oldSuitIds = list(self.suitIds)
          self.suitIds = suitIds
          self.reserveSuitIds = reserveSuitIds
          newSuitIds = []
          for suitId in self.suitIds:
              if suitId not in oldSuitIds:
                  newSuitIds.append(suitId)
  
          if len(newSuitIds):
  
              def bringOutOfReserve(suits):
                  for suit in suits:
                      suit.comeOutOfReserve()
  
              self.relatedObjectMgrRequest = self.cr.relatedObjectMgr.requestObjects(newSuitIds, bringOutOfReserve)
  
      def reservesJoining(self):
          pass
  
      def getCogSpec(self, cogId):
          cogSpecModule = FactorySpecs.getCogSpecModule(self.lawOfficeId)
          return cogSpecModule.CogData[cogId]
  
      def getReserveCogSpec(self, cogId):
          cogSpecModule = FactorySpecs.getCogSpecModule(self.lawOfficeId)
          return cogSpecModule.ReserveCogData[cogId]
  
      def getBattleCellSpec(self, battleCellId):
          cogSpecModule = FactorySpecs.getCogSpecModule(self.lawOfficeId)
          return cogSpecModule.BattleCells[battleCellId]
  
      def getFloorOuchLevel(self):
          return 2
  
      def getGoonPathId(self):
          return 'sellbotFactory'
  
      def getTaskZoneId(self):
          return self.lawOfficeId
  
      def getBossTaunt(self):
          return TTLocalizer.FactoryBossTaunt
  
      def getBossBattleTaunt(self):
          return TTLocalizer.FactoryBossBattleTaunt
  
      def placeLocalToon(self):
          initialZoneEnt = None
          if self.entranceId in self.entranceId2entity:
              epEnt = self.entranceId2entity[self.entranceId]
              initialZoneEnt = self.getEntity(epEnt.getZoneEntId())
          elif self.EmulateEntrancePoint:
              self.notify.debug('unknown entranceId %s' % self.entranceId)
              self.notify.debug('showing all zones')
              self.setColorZones(1)
              zoneEntIds = list(self.entType2ids['zone'])
              zoneEntIds.remove(LevelConstants.UberZoneEntId)
              if len(zoneEntIds):
                  zoneEntId = random.choice(zoneEntIds)
                  initialZoneEnt = self.getEntity(zoneEntId)
              else:
                  initialZoneEnt = self.getEntity(LevelConstants.UberZoneEntId)
          if initialZoneEnt is not None:
              self.enterZone(initialZoneEnt.entId)
          return
  