text: from direct.directnotify import DirectNotifyGlobal
  from . import DistributedStageAI
  from toontown.toonbase import ToontownGlobals
  from toontown.coghq import StageLayout
  from direct.showbase import DirectObject
  import random
  
  class StageManagerAI(DirectObject.DirectObject):
      notify = DirectNotifyGlobal.directNotify.newCategory('StageManagerAI')
      stageId = None
  
      def __init__(self, air):
          DirectObject.DirectObject.__init__(self)
          self.air = air
  
      def getDoId(self):
          return 0
  
      def createStage(self, stageId, players):
          for avId in players:
              if bboard.has('stageId-%s' % avId):
                  stageId = bboard.get('stageId-%s' % avId)
                  break
  
          numFloors = StageLayout.getNumFloors(stageId)
          floor = random.randrange(numFloors)
          for avId in players:
              if bboard.has('stageFloor-%s' % avId):
                  floor = bboard.get('stageFloor-%s' % avId)
                  floor = max(0, floor)
                  floor = min(floor, numFloors - 1)
                  break
  
          for avId in players:
              if bboard.has('stageRoom-%s' % avId):
                  roomId = bboard.get('stageRoom-%s' % avId)
                  for i in range(numFloors):
                      layout = StageLayout.StageLayout(stageId, i)
                      if roomId in layout.getRoomIds():
                          floor = i
                  else:
                      from toontown.coghq import StageRoomSpecs
                      roomName = StageRoomSpecs.CashbotStageRoomId2RoomName[roomId]
                      StageManagerAI.notify.warning('room %s (%s) not found in any floor of stage %s' % (roomId, roomName, stageId))
  
          stageZone = self.air.allocateZone()
          stage = DistributedStageAI.DistributedStageAI(self.air, stageId, stageZone, floor, players)
          stage.generateWithRequired(stageZone)
          return stageZone
  