from direct.directnotify import DirectNotifyGlobal from direct.distributed import DistributedObjectAI from otp.level import DistributedLevelAI from pandac.PandaModules import * from toontown.building import DistributedElevatorFloorAI from toontown.coghq import BattleExperienceAggregatorAI from toontown.coghq import StageLayout, DistributedStageRoomAI from toontown.toonbase import ToontownGlobals class DistributedStageAI(DistributedObjectAI.DistributedObjectAI): notify = DirectNotifyGlobal.directNotify.newCategory('DistributedStageAI') def __init__(self, air, stageId, zoneId, floorNum, avIds, layoutIndex, battleExpAggreg = None): DistributedObjectAI.DistributedObjectAI.__init__(self, air) self.stageId = stageId self.zoneId = zoneId self.floorNum = floorNum self.avIds = avIds self.elevatorList = [] self.setLayoutIndex(layoutIndex) self.battleExpAggreg = battleExpAggreg self.puzzelReward = 5 def generate(self): DistributedObjectAI.DistributedObjectAI.generate(self) self.notify.info('generate %s, id=%s, floor=%s' % (self.doId, self.stageId, self.floorNum)) self.layout = StageLayout.StageLayout(self.stageId, self.floorNum, self.layoutIndex) self.rooms = [] if self.battleExpAggreg is None: self.battleExpAggreg = BattleExperienceAggregatorAI.BattleExperienceAggregatorAI() for i in xrange(self.layout.getNumRooms()): room = DistributedStageRoomAI.DistributedStageRoomAI(self.air, self.stageId, self.doId, self.zoneId, self.layout.getRoomId(i), i * 2, self.avIds, self.battleExpAggreg) room.generateWithRequired(self.zoneId) self.rooms.append(room) roomDoIds = [] for room in self.rooms: roomDoIds.append(room.doId) self.sendUpdate('setRoomDoIds', [ roomDoIds]) self.placeElevatorsOnMarkers() description = '%s|%s|%s' % (self.stageId, self.floorNum, self.avIds) for avId in self.avIds: self.air.writeServerEvent('stageEntered', avId, description) def requestDelete(self): self.notify.info('requestDelete: %s' % self.doId) if hasattr(self, 'rooms'): for room in self.rooms: room.requestDelete() if hasattr(self, 'elevatorList'): for elevator in self.elevatorList: elevator.requestDelete() DistributedObjectAI.DistributedObjectAI.requestDelete(self) def delete(self): self.notify.info('delete: %s' % self.doId) self.air.deallocateZone(self.zoneId) if hasattr(self, 'elevatorList'): del self.elevatorList if hasattr(self, 'rooms'): del self.rooms if hasattr(self, 'layout'): del self.layout if hasattr(self, 'battleExpAggreg'): del self.battleExpAggreg DistributedObjectAI.DistributedObjectAI.delete(self) def getTaskZoneId(self): return self.stageId def placeElevatorsOnMarkers(self): for room in self.rooms: if room.entType2ids['elevatorMarker']: for markerId in room.entType2ids['elevatorMarker']: marker = room.getEntity(markerId) newElevator = DistributedElevatorFloorAI.DistributedElevatorFloorAI(self.air, self.doId, self, self.avIds, marker.doId) newElevator.generateWithRequired(self.zoneId) self.elevatorList.append(newElevator) def allToonsGone(self): self.notify.info('allToonsGone') self.requestDelete() def getZoneId(self): return self.zoneId def getStageId(self): return self.stageId def getFloorNum(self): return self.floorNum def setLayoutIndex(self, layoutIndex): self.layoutIndex = layoutIndex def getLayoutIndex(self): return self.layoutIndex def startNextFloor(self): floor = self.floorNum + 1 StageZone = self.air.allocateZone() Stage = DistributedStageAI(self.air, self.stageId, StageZone, floor, self.avIds, self.layoutIndex, self.battleExpAggreg) Stage.generateWithRequired(StageZone) for avId in self.avIds: self.sendUpdateToAvatarId(avId, 'setStageZone', [StageZone]) self.requestDelete() def elevatorAlert(self, avId): self.sendUpdate('elevatorAlert', [avId]) def increasePuzzelReward(self): self.puzzelReward += 5 if self.puzzelReward > 10: self.puzzelReward = 10 def resetPuzzelReward(self): self.puzzelReward = 5 def getPuzzelReward(self): return self.puzzelReward