def announce_level(self, num, name): text = OnscreenText(text='LEVEL ' + str(num), font=self.font, parent=base.aspect2d, pos=(0, 0.3), scale=0.1, fg=(1, 1, 1, 1)) text.set_transparency(1) text.set_color_scale((1, 1, 1, 0)) Sequence( Wait(1.0), text.colorScaleInterval(1.0, (1, 1, 1, 1)), Wait(2.0), text.colorScaleInterval(1.0, (1, 1, 1, 0)), Func(text.destroy), ).start() subtext = OnscreenText(text=name.upper(), font=self.font, parent=base.aspect2d, pos=(0, 0.1), scale=0.08, fg=(1, 1, 1, 1)) subtext.set_transparency(1) subtext.set_color_scale((1, 1, 1, 0)) Sequence( Wait(2.0), subtext.colorScaleInterval(1.0, (1, 1, 1, 1)), Wait(2.0), subtext.colorScaleInterval(1.0, (1, 1, 1, 0)), Func(subtext.destroy), ).start()
class TTStreet(Street.Street): def __init__(self, loader, parentFSM, doneEvent): Street.Street.__init__(self, loader, parentFSM, doneEvent) cm = CardMaker('card') cm.setFrameFullscreenQuad() self.explosionCard = render2d.attachNewNode(cm.generate()) self.explosionCard.setTransparency(1) self.explosionCard.setColorScale(0, 0, 0, 0) self.title = OnscreenText(text='Chapter One - Operations Collide', pos=(0, -0.6), scale=0.169, font=ToontownGlobals.getSuitFont(), fg=(1, 1, 1, 1), shadow=(0.1, 0.1, 0.1, 1)) self.title.setColorScale(1, 1, 1, 0) self.laffMeter = base.localAvatar.laffMeter self.book = base.localAvatar.book.bookOpenButton self.book2 = base.localAvatar.book.bookCloseButton base.localAvatar.cameraFollow = 1 def resetCameraFollow(self): base.localAvatar.cameraFollow = 0 def load(self): Street.Street.load(self) if hasattr(base.cr, 'inEvToonHall') and base.cr.inEvToonHall: sillyMeterSign = self.loader.geom.find('**/sillyOMeterSign') if sillyMeterSign: sillyMeterSign.removeNode() self.cinematicTitle = Sequence( self.title.colorScaleInterval(1.969, (1, 1, 1, 1)), Wait(4.5), self.title.colorScaleInterval(2, (1, 1, 1, 0))) evToonHallSeq = Sequence( Func(self.explosionCard.setColorScale, 0, 0, 0, 1), Func(base.localAvatar.disableAvatarControls), Func(NodePath(self.laffMeter).hide), Func(NodePath(base.marginManager).hide), Func(base.localAvatar.disableSleeping), Func(NodePath(self.book).hide), Func(base.camera.wrtReparentTo, render), Func(base.localAvatar.stopUpdateSmartCamera), Func(base.localAvatar.shutdownSmartCamera), Func(base.camera.setPosHpr, 24, -26, 6, 45, 0, 0), Wait(2), self.explosionCard.colorScaleInterval(2, (0, 0, 0, 0)), Wait(1), Func(self.cinematicTitle.start), Func(self.resetCameraFollow)) evToonHallSeq.start() if hasattr(base.cr, 'inEvAftermathToonHall') and base.cr.inEvAftermathToonHall: sillyMeterSign = self.loader.geom.find('**/sillyOMeterSign') if sillyMeterSign: sillyMeterSign.removeNode() def unload(self): Street.Street.unload(self) def doRequestLeave(self, requestStatus): self.fsm.request('trialerFA', [requestStatus])
def announce_game_over(self): text = OnscreenText(text='GAME OVER', font=self.font, parent=base.aspect2d, pos=(0, 0.3), scale=0.1, fg=(1, 1, 1, 1)) text.set_transparency(1) text.set_color_scale((1, 1, 1, 0)) Sequence( text.colorScaleInterval(1.0, (1, 1, 1, 1)), Wait(2.0), text.colorScaleInterval(1.75, (1, 0, 0, 0)), Func(text.destroy), ).start()
class Icon: def __init__(self, parent, icon='', pos=(0, 0), style='solid', anchor=None): parent_path = parent.path if anchor is None else parent.anchors[anchor] self.pos = pos self.path = parent_path.attach_new_node('icon') self.path.set_color_scale((1, 1, 1, 1)) self.path.set_pos(pos[0], 0, pos[1]) self.icon = None if icon: self.set(icon, style=style) def set(self, icon, style='solid'): old_icon = self.icon if old_icon: self.clear() font = base.icon_fonts[style] self.icon = OnscreenText(parent=self.path, text=icon, fg=(1, 1, 1, 1), font=font, align=core.TextNode.A_center, scale=0.12) def clear(self): old_icon = self.icon if old_icon: Sequence( old_icon.colorScaleInterval(0.2, (1, 1, 1, 0)), Func(old_icon.destroy), ).start() def flash(self, color): if self.icon: self.icon.set_color_scale(color) self.icon.colorScaleInterval(1.5, (1, 1, 1, 1)).start()
async def get_hit(self, bullet_type=None): if not self.root: return self.hp -= 1 if self.hp < 0: # Score gain flies off. scale = math.sqrt(self.score_gain) / 25.0 base.add_score(self.score_gain) text = OnscreenText(str(self.score_gain), font=base.gui.font, parent=base.render, scale=scale, fg=(1, 1, 1, 1)) text.set_light_off(True) text.set_z(10) text.set_pos(self.root.get_pos()) text.set_depth_test(False) dir = base.player.root.get_x() - self.root.get_x() if dir == 0: dir = choice((-1, 1)) if dir < 5: dir *= 5 / abs(dir) text.posInterval( 1.0, self.root.get_pos() + (-dir, base.player.speed.y * 0.6, 0)).start() text.scaleInterval(1.0, scale * 2).start() text.set_transparency(1) Sequence(Wait(0.25), text.colorScaleInterval(0.75, (1, 0, 0, 0))).start() self.die() else: self.root.set_color_scale((1, 0, 0, 1)) await WaitInterval(0.1) if self.root: self.root.clear_color_scale()
class Hood(StateData): def __init__(self, parentFSM, doneEvent, dnaStore, hoodId): StateData.__init__(self, doneEvent) self.parentFSM = parentFSM self.doneEvent = doneEvent self.dnaStore = dnaStore self.hoodId = hoodId self.id = None self.titleText = None self.suitFog = None self.suitLight = None self.suitLightColor = (0.4, 0.4, 0.4, 1) self.suitFogData = [(0.3, 0.3, 0.3), 0.0025] self.titleColor = (1, 1, 1, 1) return def enter(self, requestStatus): StateData.enter(self) hoodId = requestStatus['hoodId'] zoneId = requestStatus['zoneId'] rootZone = ZoneUtil.getZoneId(hoodId) if base.localAvatar.getLastHood( ) != rootZone and hoodId != CIGlobals.MinigameArea: base.localAvatar.b_setLastHood(rootZone) if not base.localAvatar.hasDiscoveredHood(rootZone): hoodsDiscovered = list(base.localAvatar.getHoodsDiscovered()) hoodsDiscovered.append(rootZone) base.localAvatar.b_setHoodsDiscovered(hoodsDiscovered) text = self.getHoodText(zoneId) self.titleText = OnscreenText(text, fg=self.titleColor, font=CIGlobals.getMickeyFont(), scale=0.15, pos=(0, -0.65)) self.titleText.hide() def enterTheLoader(self, requestStatus): self.fsm.request(requestStatus['loader'], [requestStatus]) def getHoodText(self, zoneId): if ZoneUtil.getWhereName(zoneId) == 'street' and zoneId < 61000: hoodText = CIGlobals.BranchZone2StreetName[ZoneUtil.getBranchZone( zoneId)] hoodText += '\n' + self.id else: hoodText = self.id if self.id != CIGlobals.MinigameArea: hoodText += '\n' + ZoneUtil.getWhereName(zoneId).upper() return hoodText def spawnTitleText(self, zoneId): hoodText = self.getHoodText(zoneId) self.doSpawnTitleText(hoodText) def doSpawnTitleText(self, hoodText): self.titleText.setText(hoodText) self.titleText.show() self.titleText.setColor(Vec4(*self.titleColor)) self.titleText.clearColorScale() self.titleText.setFg(self.titleColor) seq = Sequence( Wait(0.1), Wait(6.0), self.titleText.colorScaleInterval(0.5, Vec4(1.0, 1.0, 1.0, 0.0)), Func(self.titleText.hide)) seq.start() def hideTitleText(self): if self.titleText: self.titleText.hide() def exit(self): if self.titleText: self.titleText.cleanup() self.titleText = None StateData.exit(self) return def load(self): StateData.load(self) if self.storageDNAFile: loadDNAFile(self.dnaStore, self.storageDNAFile) if self.holidayDNAFile: loadDNAFile(self.dnaStore, self.holidayDNAFile) if not base.cr.holidayManager.getHoliday() == HolidayType.CHRISTMAS: self.createNormalSky() else: self.createSpookySky() def unload(self): self.notify.info("unload()") if hasattr(self, 'loader'): self.loader.exit() self.loader.unload() del self.loader del self.parentFSM del self.fsm self.dnaStore.reset_nodes() self.dnaStore.reset_hood_nodes() self.dnaStore.reset_place_nodes() self.dnaStore.reset_hood() self.dnaStore.reset_fonts() self.dnaStore.reset_DNA_vis_groups() self.dnaStore.reset_textures() self.dnaStore.reset_block_numbers() self.dnaStore.reset_block_zones() self.dnaStore.reset_suit_points() del self.dnaStore self.deleteCurrentSky() self.stopSuitEffect(0) self.ignoreAll() ModelPool.garbageCollect() TexturePool.garbageCollect() StateData.unload(self) def enterOff(self): pass def exitOff(self): pass def isSameHood(self, status): return status['hoodId'] == self.hoodId and status['shardId'] == None def enterQuietZone(self, requestStatus): base.transitions.noTransitions() loaderName = requestStatus['loader'] zoneID = requestStatus['zoneId'] where = requestStatus['where'] if where == 'playground' or where == 'toonInterior': name = self.id elif where == 'minigame': name = 'Minigame' elif where == 'street': name = CIGlobals.BranchZone2StreetName[ZoneUtil.getBranchZone( zoneID)] if loaderName == 'safeZoneLoader' or loaderName == 'townLoader': if not loader.inBulkBlock: loader.beginBulkLoad( 'hood', name, CIGlobals.safeZoneLSRanges.get(self.id, 6)) self.loadLoader(requestStatus) else: base.transitions.fadeScreen(1.0) self._quietZoneDoneEvent = uniqueName('quietZoneDone') self.acceptOnce(self._quietZoneDoneEvent, self.handleQuietZoneDone) self.quietZoneStateData = QuietZoneState(self._quietZoneDoneEvent) self.quietZoneStateData.load() self.quietZoneStateData.enter(requestStatus) def exitQuietZone(self): self.ignore(self._quietZoneDoneEvent) del self._quietZoneDoneEvent self.quietZoneStateData.exit() self.quietZoneStateData.unload() self.quietZoneStateData = None return def loadLoader(self, requestStatus): pass def handleQuietZoneDone(self): status = self.quietZoneStateData.getDoneStatus() loader.endBulkLoad('hood') self.fsm.request(status['loader'], [status]) if hasattr(self, 'loader'): self.loader.enterThePlace(status) def enterSafeZoneLoader(self, requestStatus): self.accept(self.loaderDoneEvent, self.handleSafeZoneLoaderDone) self.loader.enter(requestStatus) self.spawnTitleText(requestStatus['zoneId']) def exitSafeZoneLoader(self): self.ignore(self.loaderDoneEvent) self.hideTitleText() self.loader.exit() self.loader.unload() del self.loader def handleSafeZoneLoaderDone(self): doneStatus = self.loader.getDoneStatus() if self.isSameHood(doneStatus) or doneStatus['where'] == 'minigame': self.fsm.request('quietZone', [doneStatus]) else: self.doneStatus = doneStatus messenger.send(self.doneEvent) def createNormalSky(self): self.deleteCurrentSky() self.sky = loader.loadModel(self.skyFilename) if self.__class__.__name__ != 'CTHood': self.sky.setScale(1.0) self.sky.setFogOff() else: self.sky.setScale(5.0) def createSpookySky(self): self.deleteCurrentSky() self.sky = loader.loadModel(self.spookySkyFile) self.sky.setScale(5.0) self.sky.setFogOff() def deleteCurrentSky(self): if hasattr(self, 'sky'): if self.sky: self.sky.removeNode() del self.sky def startSuitEffect(self): self.stopSuitEffect() light = AmbientLight("suitLight") light.setColor(Vec4(*self.suitLightColor)) self.suitLight = render.attachNewNode(light) render.setLight(self.suitLight) self.suitFog = Fog("suitFog") self.suitFog.setColor(*self.suitFogData[0]) self.suitFog.setExpDensity(self.suitFogData[1]) render.setFog(self.suitFog) self.createSpookySky() Hood.startSky(self) def stopSuitEffect(self, newSky=1): render.clearFog() if self.suitLight: render.clearLight(self.suitLight) self.suitLight.removeNode() self.suitLight = None if self.suitFog: self.suitFog = None if newSky: if not base.cr.holidayManager.getHoliday( ) == HolidayType.CHRISTMAS: self.createNormalSky() else: self.createSpookySky() self.startSky() def startSky(self): self.sky.reparentTo(camera) self.sky.setZ(0.0) self.sky.setHpr(0.0, 0.0, 0.0) ce = CompassEffect.make(NodePath(), CompassEffect.PRot | CompassEffect.PZ) self.sky.node().setEffect(ce) def stopSky(self): self.sky.reparentTo(hidden)
class SBHood(ToonHood.ToonHood): def __init__(self, parentFSM, doneEvent, dnaStore, hoodId): ToonHood.ToonHood.__init__(self, parentFSM, doneEvent, dnaStore, hoodId) self.id = ScroogeBank self.townLoaderClass = SBTownLoader.SBTownLoader self.safeZoneLoaderClass = SBSafeZoneLoader.SBSafeZoneLoader self.storageDNAFile = 'phase_8/dna/storage_ODG.jazz' self.holidayStorageDNADict = { WINTER_DECORATIONS: ['phase_8/dna/winter_storage_SB.jazz'], WACKY_WINTER_DECORATIONS: ['phase_8/dna/winter_storage_SB.jazz'], HALLOWEEN_PROPS: None, SPOOKY_PROPS: None } self.skyFile = 'phase_3.5/models/props/TT_sky' self.spookySkyFile = self.skyFile self.titleColor = (0.8, 0.6, 1.0, 1.0) cm = CardMaker('card') cm.setFrameFullscreenQuad() self.explosionCard = render2d.attachNewNode(cm.generate()) self.explosionCard.setTransparency(1) self.explosionCard.setColorScale(0, 0, 0, 0) self.laffMeter = base.localAvatar.laffMeter self.book = base.localAvatar.book.bookOpenButton self.book2 = base.localAvatar.book.bookCloseButton self.warning = OnscreenText(text='You need a key to enter.', pos=(0, -0.6), scale=0.1, font=ToontownGlobals.getSignFont(), fg=(1, 1, 1, 1), shadow=(0.1, 0.1, 0.1, 1)) self.warning.setColorScale(1, 1, 1, 0) self.warningInterval = Sequence( self.warning.colorScaleInterval(1.969, (1, 1, 1, 1)), Wait(1.5), self.warning.colorScaleInterval(2, (1, 1, 1, 0))) self.enterSfx = loader.loadSfx( 'phase_3/audio/sfx/tt_s_ara_mat_crash_woodGlass.ogg') self.col = loader.loadModel('phase_9/models/cogHQ/CogDoor_Button') self.col.setPosHpr(-19.69, 0, 25.385, 90, -90, 0) self.col.setScale(3) self.col.reparentTo(render) self.colNode = None return def teleportToBankInterior(self): hoodId = ZoneUtil.getTrueZoneId(21000, 21000) zoneId = ZoneUtil.getTrueZoneId(21401, 21000) how = 'teleportIn' tunnelOriginPlaceHolder = render.attachNewNode('toph_21000_21401') tutorialFlag = 0 requestStatus = { 'loader': ZoneUtil.getLoaderName(zoneId), 'where': ZoneUtil.getToonWhereName(zoneId), 'how': how, 'hoodId': hoodId, 'zoneId': zoneId, 'shardId': None, 'tunnelOrigin': tunnelOriginPlaceHolder, 'tutorial': tutorialFlag, 'avId': -1 } place = base.cr.playGame.getPlace() if place: place.requestLeave(requestStatus) return def startCollDetect(self): if not self.colNode: cs = CollisionSphere(0, 0, 0, 2) self.colNode = self.col.attachNewNode(CollisionNode('cnode4')) self.colNode.node().addSolid(cs) self.accept('enter' + self.colNode.node().getName(), self.handleCollision) def stopCollDetect(self): if self.colNode: self.ignore('enter' + self.colNode.node().getName()) def handleCollision(self, collEntry): self.walkin = Sequence( Func(base.playSfx, self.enterSfx, volume=1), self.col.colorScaleInterval(1, (0, 1, 0, 1)), Wait(1), Func(self.teleportToBankInterior), Func(NodePath(self.laffMeter).hide), Func(base.camera.wrtReparentTo, render), Func(base.localAvatar.stopUpdateSmartCamera), Func(base.localAvatar.shutdownSmartCamera), Func(base.camera.setPosHpr, -190.877, 0, 30, 270, 12, 0), base.camera.posHprInterval(2.69, (-50.877, 0, 119), (270, 0, 0), blendType='easeInOut')) self.stopforasec = Sequence(Func(self.stopCollDetect), Wait(6), Func(self.startCollDetect)) if base.cr.scroogeKey == 0: self.warningInterval.start() self.stopforasec.start() else: self.stopCollDetect() base.cr.scroogeKey = 2 self.walkin.start() def load(self): ToonHood.ToonHood.load(self) self.parentFSM.getStateNamed('SBHood').addChild(self.fsm) def unload(self): self.parentFSM.getStateNamed('SBHood').removeChild(self.fsm) ToonHood.ToonHood.unload(self) def enter(self, *args): ToonHood.ToonHood.enter(self, *args) localAvatar.setCameraFov(CogHQCameraFov) base.camLens.setNearFar(CogHQCameraNear, CogHQCameraFar) proEvSeq = Sequence( Func(NodePath(self.book).hide), Func(NodePath(self.laffMeter).hide), Func(base.localAvatar.disableSleeping), Func(base.localAvatar.obscureFriendsListButton, 1), Func(base.localAvatar.hideClarabelleGui), Func(base.localAvatar.chatMgr.obscure, 1, 1), Func(self.explosionCard.setColorScale, 0, 0, 0, 1), Wait(3), Func(localAvatar.sendUpdate, 'startProEv', []), Func(self.startCollDetect), self.explosionCard.colorScaleInterval(2, (0, 0, 0, 0))) proEvSeq.start() def exit(self): localAvatar.setCameraFov(DefaultCameraFov) base.camLens.setNearFar(DefaultCameraNear, DefaultCameraFar) ToonHood.ToonHood.exit(self) base.localAvatar.attachCamera() base.localAvatar.initializeSmartCamera() base.localAvatar.startUpdateSmartCamera() self.stopCollDetect() self.col.removeNode() del self.col def skyTrack(self, task): return SkyUtil.cloudSkyTrack(task) def startSky(self): if not self.sky.getTag('sky') == 'Regular': self.startSpookySky() return SkyUtil.startCloudSky(self) def startSpookySky(self): SkyUtil.startCloudSky(self)
class Hood(StateData): def __init__(self, parentFSM, doneEvent, dnaStore, hoodId): StateData.__init__(self, doneEvent) self.parentFSM = parentFSM self.doneEvent = doneEvent self.dnaStore = dnaStore self.hoodId = hoodId self.abbr = "" self.id = None self.titleText = None self.suitFog = None self.suitLight = None self.suitLightColor = (0.4, 0.4, 0.4, 1) self.suitFogData = [(0.3, 0.3, 0.3), 0.0025] self.titleColor = (1, 1, 1, 1) self.wantLighting = True self.olc = ZoneUtil.getOutdoorLightingConfig(self.hoodId) return def makeLampLight(self, lamp): col = (255, 255, 255, 350) lightNP = CIGlobals.makePointLight( 'DLlamp', CIGlobals.colorFromRGBScalar255(col), lamp.getPos(render) + (0, 0, 9.5), 0.1) lamp.setLightOff(1) return lightNP def enter(self, requestStatus): StateData.enter(self) hoodId = requestStatus['hoodId'] zoneId = requestStatus['zoneId'] rootZone = ZoneUtil.getZoneId(hoodId) if base.localAvatar.getLastHood( ) != rootZone and hoodId != ZoneUtil.MinigameArea: base.localAvatar.b_setLastHood(rootZone) if not base.localAvatar.hasDiscoveredHood(rootZone): hoodsDiscovered = list(base.localAvatar.getHoodsDiscovered()) hoodsDiscovered.append(rootZone) base.localAvatar.b_setHoodsDiscovered(hoodsDiscovered) text = self.getHoodText(zoneId) self.titleText = OnscreenText(text, fg=self.titleColor, font=CIGlobals.getMickeyFont(), scale=0.15, pos=(0, -0.65)) self.titleText.hide() def enterTheLoader(self, requestStatus): self.fsm.request(requestStatus['loader'], [requestStatus]) def getHoodText(self, zoneId): if ZoneUtil.getWhereName(zoneId) == 'street' and zoneId < 61000: hoodText = ZoneUtil.BranchZone2StreetName[ZoneUtil.getBranchZone( zoneId)] hoodText += '\n' + self.id else: hoodText = self.id if self.id != ZoneUtil.MinigameArea: whereName = ZoneUtil.getWhereName(zoneId) if whereName == 'toonInterior': whereName = 'Unknown' try: whereName = ZoneUtil.zone2TitleDict.get(zoneId)[0] return whereName.upper() + '\n' + self.id except: pass hoodText += '\n' + whereName.upper() return hoodText def spawnTitleText(self, zoneId): hoodText = self.getHoodText(zoneId) self.doSpawnTitleText(hoodText) def doSpawnTitleText(self, hoodText): self.titleText.setText(hoodText) self.titleText.show() self.titleText.setColor(Vec4(*self.titleColor)) self.titleText.clearColorScale() self.titleText.setFg(self.titleColor) seq = Sequence( Wait(0.1), Wait(6.0), self.titleText.colorScaleInterval(0.5, Vec4(1.0, 1.0, 1.0, 0.0)), Func(self.hideTitleText)) seq.start() def hideTitleText(self): if self.titleText: self.titleText.hide() def exit(self): if self.titleText: self.titleText.cleanup() self.titleText = None StateData.exit(self) return def setupOutdoorLighting(self): self.olc.setup() def enableOutdoorLighting(self): self.olc.apply() def disableOutdoorLighting(self): self.olc.unapply() def cleanupOutdoorLighting(self): self.olc.cleanup() def load(self): StateData.load(self) if self.storageDNAFile: loadDNAFile(self.dnaStore, self.storageDNAFile) if self.holidayDNAFile: loadDNAFile(self.dnaStore, self.holidayDNAFile) self.setupOutdoorLighting() def unload(self): self.cleanupOutdoorLighting() if hasattr(self, 'loader'): self.loader.exit() self.loader.unload() del self.loader del self.parentFSM del self.fsm self.dnaStore.reset_nodes() self.dnaStore.reset_hood_nodes() self.dnaStore.reset_place_nodes() self.dnaStore.reset_hood() self.dnaStore.reset_fonts() self.dnaStore.reset_DNA_vis_groups() self.dnaStore.reset_materials() self.dnaStore.reset_block_numbers() self.dnaStore.reset_block_zones() self.dnaStore.reset_suit_points() del self.dnaStore self.ignoreAll() #CIGlobals.doSceneCleanup() StateData.unload(self) def enterOff(self): pass def exitOff(self): pass def isSameHood(self, status): return status['hoodId'] == self.hoodId and status['shardId'] is None def enterQuietZone(self, requestStatus): base.transitions.noTransitions() loaderName = requestStatus['loader'] zoneID = requestStatus['zoneId'] where = requestStatus['where'] if where == 'playground' or where == 'toonInterior': name = self.id elif where == 'minigame': name = 'Minigame' elif where == 'street': name = ZoneUtil.BranchZone2StreetName[ZoneUtil.getBranchZone( zoneID)] if loaderName == 'safeZoneLoader' or loaderName == 'townLoader': if not loader.inBulkBlock: loader.beginBulkLoad('hood', name, ZoneUtil.safeZoneLSRanges.get(self.id, 6)) self.loadLoader(requestStatus) else: base.transitions.fadeScreen(1.0) self._quietZoneDoneEvent = uniqueName('quietZoneDone') self.acceptOnce(self._quietZoneDoneEvent, self.handleQuietZoneDone) self.quietZoneStateData = QuietZoneState(self._quietZoneDoneEvent) self.quietZoneStateData.load() self.quietZoneStateData.enter(requestStatus) def exitQuietZone(self): self.ignore(self._quietZoneDoneEvent) del self._quietZoneDoneEvent self.quietZoneStateData.exit() self.quietZoneStateData.unload() self.quietZoneStateData = None return def loadLoader(self, requestStatus): pass def handleQuietZoneDone(self): status = self.quietZoneStateData.getDoneStatus() loader.endBulkLoad('hood') self.fsm.request(status['loader'], [status]) if hasattr(self, 'loader'): self.loader.enterThePlace(status) def enterSafeZoneLoader(self, requestStatus): self.accept(self.loaderDoneEvent, self.handleSafeZoneLoaderDone) self.loader.enter(requestStatus) self.spawnTitleText(requestStatus['zoneId']) def exitSafeZoneLoader(self): self.ignore(self.loaderDoneEvent) self.hideTitleText() self.loader.exit() self.loader.unload() del self.loader def handleSafeZoneLoaderDone(self): doneStatus = self.loader.getDoneStatus() if self.isSameHood(doneStatus) or doneStatus['where'] == 'minigame': self.fsm.request('quietZone', [doneStatus]) else: self.doneStatus = doneStatus messenger.send(self.doneEvent)