class TownLoader(StateData): notify = directNotify.newCategory('TownLoader') def __init__(self, hood, parentFSMState, doneEvent): self.hood = hood self.parentFSMState = parentFSMState StateData.__init__(self, doneEvent) self.fsm = ClassicFSM('TownLoader', [State('start', self.enterStart, self.exitStart, ['quietZone', 'street']), State('street', self.enterStreet, self.exitStreet, ['quietZone']), State('toonInterior', self.enterToonInterior, self.exitToonInterior, ['quietZone']), State('quietZone', self.enterQuietZone, self.exitQuietZone, ['street', 'toonInterior']), State('final', self.enterFinal, self.exitFinal, ['start'])], 'start', 'final') self.branchZone = None self.canonicalBranchZone = None self.placeDoneEvent = 'placeDone' self.linkTunnels = [] return def findAndMakeLinkTunnels(self, requestStatus): for tunnel in self.geom.findAllMatches('**/*linktunnel*'): dnaRootStr = tunnel.getName() zone = LinkTunnel.getZoneFromDNARootStr(dnaRootStr) zone = LinkTunnel.maybeFixZone(zone) tunnelClass = LinkTunnel.getRecommendedTunnelClassFromZone(zone) link = tunnelClass(tunnel, dnaRootStr) self.linkTunnels.append(link) def load(self, zoneId): StateData.load(self) self.zoneId = zoneId self.branchZone = ZoneUtil.getBranchZone(zoneId) self.canonicalBranchZone = ZoneUtil.getCanonicalBranchZone(zoneId) self.music = base.loadMusic(self.musicFile) self.interiorMusic = base.loadMusic(self.interiorMusicFile) def unload(self): self.parentFSMState.removeChild(self.fsm) del self.parentFSMState del self.fsm del self.streetClass self.landmarkBlocks.removeNode() del self.landmarkBlocks self.hood.dnaStore.resetSuitPoints() self.hood.dnaStore.resetBattleCells() del self.hood del self.nodeDict del self.zoneDict del self.fadeInDict del self.fadeOutDict del self.nodeList self.geom.removeNode() del self.geom del self.music del self.interiorMusic ModelPool.garbageCollect() TexturePool.garbageCollect() StateData.unload(self) def enter(self, requestStatus): StateData.enter(self) self.findAndMakeLinkTunnels(requestStatus) self.fsm.enterInitialState() self.setState(requestStatus['where'], requestStatus) def exit(self): self.fsm.requestFinalState() self.ignoreAll() ModelPool.garbageCollect() TexturePool.garbageCollect() StateData.exit(self) def setState(self, state, requestStatus): self.fsm.request(state, [requestStatus]) def enterStart(self): pass def exitStart(self): pass def enterStreet(self, requestStatus): self.acceptOnce(self.placeDoneEvent, self.streetDone) self.place = self.streetClass(self, self.fsm, self.placeDoneEvent) self.place.load() def exitStreet(self): self.ignore(self.placeDoneEvent) self.place.exit() self.place.unload() self.place = None base.cr.playGame.setPlace(self.place) return def streetDone(self): self.requestStatus = self.place.doneStatus status = self.place.doneStatus if status['loader'] == 'townLoader' and ZoneUtil.getBranchZone(status['zoneId']) == self.branchZone and status['shardId'] == None or status['how'] == 'doorOut': self.fsm.request('quietZone', [status]) else: self.doneStatus = status messenger.send(self.doneEvent) return def enterToonInterior(self, requestStatus): self.acceptOnce(self.placeDoneEvent, self.handleToonInteriorDone) self.place = ToonInterior.ToonInterior(self, self.fsm, self.placeDoneEvent) self.place.load() def exitToonInterior(self): self.ignore(self.placeDoneEvent) self.place.exit() self.place.unload() self.place = None base.cr.playGame.setPlace(self.place) return def enterThePlace(self, requestStatus): base.cr.playGame.setPlace(self.place) self.place.enter(requestStatus) def handleToonInteriorDone(self): status = self.place.doneStatus if status['loader'] == 'townLoader' and ZoneUtil.getBranchZone(status['zoneId']) == self.branchZone and status['shardId'] == None or status['how'] == 'doorOut': self.fsm.request('quietZone', [status]) else: self.doneStatus = status messenger.send(self.doneEvent) return def enterQuietZone(self, requestStatus): self.fsm.request(requestStatus['where'], [requestStatus], exitCurrent=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 handleQuietZoneDone(self): status = self.quietZoneStateData.getRequestStatus() self.exitQuietZone() self.enterThePlace(status) def enterFinal(self): pass def exitFinal(self): pass def createHood(self, dnaFile, loadStorage = 1): if loadStorage: loader.loadDNAFile(self.hood.dnaStore, 'phase_5/dna/storage_town.dna') loader.loadDNAFile(self.hood.dnaStore, self.townStorageDNAFile) node = loader.loadDNAFile(self.hood.dnaStore, dnaFile) if node.getNumParents() == 1: self.geom = NodePath(node.getParent(0)) self.geom.reparentTo(hidden) else: self.geom = hidden.attachNewNode(node) self.makeDictionaries(self.hood.dnaStore) self.reparentLandmarkBlockNodes() self.renameFloorPolys(self.nodeList) gsg = base.win.getGsg() if gsg: self.geom.prepareScene(gsg) self.geom.flattenLight() self.geom.setName('town_top_level') def reparentLandmarkBlockNodes(self): bucket = self.landmarkBlocks = hidden.attachNewNode('landmarkBlocks') npc = self.geom.findAllMatches('**/sb*:*_landmark_*_DNARoot') for i in xrange(npc.getNumPaths()): nodePath = npc.getPath(i) nodePath.wrtReparentTo(bucket) npc = self.geom.findAllMatches('**/sb*:*animated_building*_DNARoot') for i in xrange(npc.getNumPaths()): nodePath = npc.getPath(i) nodePath.wrtReparentTo(bucket) def makeDictionaries(self, dnaStore): self.nodeDict = {} self.zoneDict = {} self.zoneVisDict = {} self.nodeList = [] self.fadeInDict = {} self.fadeOutDict = {} a1 = Vec4(1, 1, 1, 1) a0 = Vec4(1, 1, 1, 0) numVisGroups = dnaStore.getNumDNAVisGroupsAI() for i in xrange(numVisGroups): groupFullName = dnaStore.getDNAVisGroupName(i) visGroup = dnaStore.getDNAVisGroupAI(i) groupName = base.cr.hoodMgr.extractGroupName(groupFullName) zoneId = int(groupName) zoneId = ZoneUtil.getTrueZoneId(zoneId, self.zoneId) groupNode = self.geom.find('**/' + groupFullName) if groupNode.isEmpty(): continue else: if ':' in groupName: groupName = '%s%s' % (zoneId, groupName[groupName.index(':'):]) else: groupName = '%s' % zoneId groupNode.setName(groupName) groupNode.flattenMedium() self.nodeDict[zoneId] = [] self.nodeList.append(groupNode) self.zoneDict[zoneId] = groupNode visibles = [] for i in xrange(visGroup.getNumVisibles()): visibles.append(int(visGroup.visibles[i])) visibles.append(ZoneUtil.getBranchZone(zoneId)) self.zoneVisDict[zoneId] = visibles fadeDuration = 0.5 self.fadeOutDict[groupNode] = Sequence(Func(groupNode.setTransparency, 1), LerpColorScaleInterval(groupNode, fadeDuration, a0, startColorScale=a1), Func(groupNode.clearColorScale), Func(groupNode.clearTransparency), Func(groupNode.stash), name='fadeZone-' + str(zoneId), autoPause=1) self.fadeInDict[groupNode] = Sequence(Func(groupNode.unstash), Func(groupNode.setTransparency, 1), LerpColorScaleInterval(groupNode, fadeDuration, a1, startColorScale=a0), Func(groupNode.clearColorScale), Func(groupNode.clearTransparency), name='fadeZone-' + str(zoneId), autoPause=1) for i in xrange(numVisGroups): groupFullName = dnaStore.getDNAVisGroupName(i) zoneId = int(base.cr.hoodMgr.extractGroupName(groupFullName)) zoneId = ZoneUtil.getTrueZoneId(zoneId, self.zoneId) for j in xrange(dnaStore.getNumVisiblesInDNAVisGroup(i)): visName = dnaStore.getVisibleName(i, j) groupName = base.cr.hoodMgr.extractGroupName(visName) nextZoneId = int(groupName) nextZoneId = ZoneUtil.getTrueZoneId(nextZoneId, self.zoneId) visNode = self.zoneDict[nextZoneId] self.nodeDict[zoneId].append(visNode) self.hood.dnaStore.resetPlaceNodes() self.hood.dnaStore.resetDNAGroups() self.hood.dnaStore.resetDNAVisGroups() self.hood.dnaStore.resetDNAVisGroupsAI() def renameFloorPolys(self, nodeList): for i in nodeList: collNodePaths = i.findAllMatches('**/+CollisionNode') numCollNodePaths = collNodePaths.getNumPaths() visGroupName = i.node().getName() for j in xrange(numCollNodePaths): collNodePath = collNodePaths.getPath(j) bitMask = collNodePath.node().getIntoCollideMask() if bitMask.getBit(1): collNodePath.node().setName(visGroupName)
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)
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: loader.loadDNAFile(self.dnaStore, self.storageDNAFile) self.createNormalSky() 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.resetAll() 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'] if loaderName == 'safeZoneLoader' or loaderName == 'townLoader': if not loader.inBulkBlock: loader.beginBulkLoad('hood', self.id, 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: self.createNormalSky() self.startSky() return 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 SafeZoneLoader(StateData): notify = directNotify.newCategory('SafeZoneLoader') def __init__(self, hood, parentFSMState, doneEvent): StateData.__init__(self, doneEvent) self.hood = hood self.parentFSMState = parentFSMState self.fsm = ClassicFSM('safeZoneLoader', [ State('off', self.enterOff, self.exitOff), State('playground', self.enterPlayground, self.exitPlayground, ['quietZone']), State('toonInterior', self.enterToonInterior, self.exitToonInterior, ['quietZone']), State('quietZone', self.enterQuietZone, self.exitQuietZone, ['playground', 'toonInterior']) ], 'off', 'off') self.placeDoneEvent = 'placeDone' self.place = None self.playground = None self.battleMusic = None self.invasionMusic = None self.invasionMusicFiles = None self.interiorMusic = None self.bossBattleMusic = None self.music = None self.tournamentMusic = None self.linkTunnels = [] self.szHolidayDNAFile = None self.animatedFish = None return def findAndMakeLinkTunnels(self): for tunnel in self.geom.findAllMatches('**/*linktunnel*'): dnaRootStr = tunnel.getName() link = LinkTunnel.SafeZoneLinkTunnel(tunnel, dnaRootStr) self.linkTunnels.append(link) def load(self): StateData.load(self) if self.pgMusicFilename: if type(self.pgMusicFilename) == types.ListType: filename = random.choice(self.pgMusicFilename) else: filename = self.pgMusicFilename self.music = base.loadMusic(filename) if self.battleMusicFile: self.battleMusic = base.loadMusic(self.battleMusicFile) if self.invasionMusicFiles: self.invasionMusic = None if self.bossBattleMusicFile: self.bossBattleMusic = base.loadMusic(self.bossBattleMusicFile) if self.interiorMusicFilename: self.interiorMusic = base.loadMusic(self.interiorMusicFilename) if self.tournamentMusicFiles: self.tournamentMusic = None self.createSafeZone(self.dnaFile) children = self.geom.findAllMatches('**/*doorFrameHole*') for child in children: child.hide() self.parentFSMState.addChild(self.fsm) _, _, _, _, _, _, _, _, af = SettingsManager().getSettings( 'settings.json') if af == 'on': self.notify.info( 'Anisotropic Filtering is on, applying to textures.') for nodepath in self.geom.findAllMatches('*'): try: for node in nodepath.findAllMatches('**'): try: node.findTexture('*').setAnisotropicDegree(8) except: pass except: continue return def unload(self): StateData.unload(self) if self.animatedFish: self.animatedFish.cleanup() self.animatedFish.removeNode() self.animatedFish = None self.parentFSMState.removeChild(self.fsm) del self.parentFSMState del self.animatedFish self.geom.removeNode() del self.geom del self.fsm del self.hood del self.playground del self.music del self.interiorMusic del self.battleMusic del self.bossBattleMusic del self.tournamentMusic self.ignoreAll() ModelPool.garbageCollect() TexturePool.garbageCollect() return def enter(self, requestStatus): StateData.enter(self) if base.localAvatar.zoneId < CIGlobals.DynamicZonesBegin: self.findAndMakeLinkTunnels() self.fsm.enterInitialState() messenger.send('enterSafeZone') self.setState(requestStatus['where'], requestStatus) partyGate = self.geom.find('**/prop_party_gate_DNARoot') if not partyGate.isEmpty(): partyGate.removeNode() del partyGate petShop = self.geom.find('**/*pet_shop_DNARoot*') if not petShop.isEmpty(): fish = petShop.find( '**/animated_prop_PetShopFishAnimatedProp_DNARoot') if fish: self.animatedFish = Actor( 'phase_4/models/props/exteriorfish-zero.bam', {'chan': 'phase_4/models/props/exteriorfish-swim.bam'}) self.animatedFish.reparentTo(petShop) self.animatedFish.setPos(fish.getPos()) self.animatedFish.loop('chan') fish.removeNode() def exit(self): StateData.exit(self) messenger.send('exitSafeZone') for link in self.linkTunnels: link.cleanup() if self.animatedFish: self.animatedFish.stop('chan') self.linkTunnels = [] def setState(self, stateName, requestStatus): self.fsm.request(stateName, [requestStatus]) def createSafeZone(self, dnaFile): if self.szStorageDNAFile: loader.loadDNAFile(self.hood.dnaStore, self.szStorageDNAFile) if self.szHolidayDNAFile: loader.loadDNAFile(self.hood.dnaStore, self.szHolidayDNAFile) node = loader.loadDNAFile(self.hood.dnaStore, dnaFile) if node.getNumParents() == 1: self.geom = NodePath(node.getParent(0)) self.geom.reparentTo(hidden) else: self.geom = hidden.attachNewNode(node) self.makeDictionaries(self.hood.dnaStore) if self.__class__.__name__ not in ('TTSafeZoneLoader', ): self.geom.flattenMedium() gsg = base.win.getGsg() if gsg: self.geom.prepareScene(gsg) def makeDictionaries(self, dnaStore): self.nodeList = [] for i in xrange(dnaStore.getNumDNAVisGroups()): groupFullName = dnaStore.getDNAVisGroupName(i) groupNode = self.geom.find('**/' + groupFullName) if groupNode.isEmpty(): self.notify.error('Could not find visgroup') if self.__class__.__name__ not in ('TTSafeZoneLoader', ): groupNode.flattenMedium() self.nodeList.append(groupNode) self.hood.dnaStore.resetPlaceNodes() self.hood.dnaStore.resetDNAGroups() self.hood.dnaStore.resetDNAVisGroups() self.hood.dnaStore.resetDNAVisGroupsAI() def enterPlayground(self, requestStatus): try: self.hood.stopSuitEffect() except: pass self.acceptOnce(self.placeDoneEvent, self.handlePlaygroundDone) self.place = self.playground(self, self.fsm, self.placeDoneEvent) self.place.load() def exitPlayground(self): self.ignore(self.placeDoneEvent) self.place.exit() self.place.unload() self.place = None base.cr.playGame.setPlace(self.place) return def handlePlaygroundDone(self): status = self.place.doneStatus if self.hood.isSameHood(status) and status[ 'loader'] == 'safeZoneLoader' and status['where'] not in ( 'minigame', ): self.fsm.request('quietZone', [status]) else: self.doneStatus = status messenger.send(self.doneEvent) def enterToonInterior(self, requestStatus): self.acceptOnce(self.placeDoneEvent, self.handleToonInteriorDone) self.place = ToonInterior.ToonInterior(self, self.fsm, self.placeDoneEvent) self.place.load() def enterThePlace(self, requestStatus): base.cr.playGame.setPlace(self.place) if self.place is not None: self.place.enter(requestStatus) return def exitToonInterior(self): self.ignore(self.placeDoneEvent) self.place.exit() self.place.unload() self.place = None base.cr.playGame.setPlace(self.place) return def handleToonInteriorDone(self): status = self.place.doneStatus if status['loader'] == 'safeZoneLoader' and self.hood.isSameHood( status ) and status['shardId'] == None or status['how'] == 'doorOut': self.fsm.request('quietZone', [status]) else: self.doneStatus = status messenger.send(self.doneEvent) return def enterQuietZone(self, requestStatus): self.fsm.request(requestStatus['where'], [requestStatus], exitCurrent=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 handleQuietZoneDone(self): status = self.quietZoneStateData.getDoneStatus() self.exitQuietZone() if status['where'] == 'estate' or status['loader'] == 'townLoader': self.doneStatus = status messenger.send(self.doneEvent) else: self.enterThePlace(status) def enterOff(self): pass def exitOff(self): pass
class SafeZoneLoader(StateData): notify = directNotify.newCategory('SafeZoneLoader') def __init__(self, hood, parentFSMState, doneEvent): StateData.__init__(self, doneEvent) self.hood = hood self.parentFSMState = parentFSMState self.fsm = ClassicFSM('safeZoneLoader', [State('off', self.enterOff, self.exitOff), State('playground', self.enterPlayground, self.exitPlayground, ['quietZone']), State('toonInterior', self.enterToonInterior, self.exitToonInterior, ['quietZone']), State('quietZone', self.enterQuietZone, self.exitQuietZone, ['playground', 'toonInterior'])], 'off', 'off') self.placeDoneEvent = 'placeDone' self.place = None self.playground = None self.battleMusic = None self.invasionMusic = None self.invasionMusicFiles = None self.interiorMusic = None self.bossBattleMusic = None self.music = None self.tournamentMusic = None self.linkTunnels = [] return def findAndMakeLinkTunnels(self): for tunnel in self.geom.findAllMatches('**/*linktunnel*'): dnaRootStr = tunnel.getName() link = LinkTunnel.SafeZoneLinkTunnel(tunnel, dnaRootStr) self.linkTunnels.append(link) def load(self): StateData.load(self) if self.pgMusicFilename: self.music = base.loadMusic(self.pgMusicFilename) if self.battleMusicFile: self.battleMusic = base.loadMusic(self.battleMusicFile) if self.invasionMusicFiles: self.invasionMusic = None if self.bossBattleMusicFile: self.bossBattleMusic = base.loadMusic(self.bossBattleMusicFile) if self.interiorMusicFilename: self.interiorMusic = base.loadMusic(self.interiorMusicFilename) if self.tournamentMusicFiles: self.tournamentMusic = None self.createSafeZone(self.dnaFile) self.parentFSMState.addChild(self.fsm) width, height, fs, music, sfx, tex_detail, model_detail, aa, af = SettingsManager().getSettings('settings.json') if af == 'on': self.notify.info('Anisotropic Filtering is on, applying to textures.') for nodepath in self.geom.findAllMatches('*'): try: for node in nodepath.findAllMatches('**'): try: node.findTexture('*').setAnisotropicDegree(8) except: pass except: continue return def unload(self): StateData.unload(self) self.parentFSMState.removeChild(self.fsm) del self.parentFSMState self.geom.removeNode() del self.geom del self.fsm del self.hood del self.playground del self.music del self.interiorMusic del self.battleMusic del self.bossBattleMusic del self.tournamentMusic self.ignoreAll() ModelPool.garbageCollect() TexturePool.garbageCollect() def enter(self, requestStatus): StateData.enter(self) if base.localAvatar.zoneId < 61000: self.findAndMakeLinkTunnels() self.fsm.enterInitialState() messenger.send('enterSafeZone') self.setState(requestStatus['where'], requestStatus) partyGate = self.geom.find('**/prop_party_gate_DNARoot') if not partyGate.isEmpty(): partyGate.removeNode() del partyGate petShop = self.geom.find('**/prop_pet_shop_DNARoot') if not petShop.isEmpty(): petShop.removeNode() del petShop def exit(self): StateData.exit(self) messenger.send('exitSafeZone') for link in self.linkTunnels: link.cleanup() self.linkTunnels = [] def setState(self, stateName, requestStatus): self.fsm.request(stateName, [requestStatus]) def createSafeZone(self, dnaFile): if self.szStorageDNAFile: loader.loadDNAFile(self.hood.dnaStore, self.szStorageDNAFile) node = loader.loadDNAFile(self.hood.dnaStore, dnaFile) if node.getNumParents() == 1: self.geom = NodePath(node.getParent(0)) self.geom.reparentTo(hidden) else: self.geom = hidden.attachNewNode(node) self.makeDictionaries(self.hood.dnaStore) if self.__class__.__name__ not in ('TTSafeZoneLoader',): self.geom.flattenMedium() gsg = base.win.getGsg() if gsg: self.geom.prepareScene(gsg) def makeDictionaries(self, dnaStore): self.nodeList = [] for i in xrange(dnaStore.getNumDNAVisGroups()): groupFullName = dnaStore.getDNAVisGroupName(i) groupName = base.cr.hoodMgr.extractGroupName(groupFullName) groupNode = self.geom.find('**/' + groupFullName) if groupNode.isEmpty(): self.notify.error('Could not find visgroup') if self.__class__.__name__ not in ('TTSafeZoneLoader',): groupNode.flattenMedium() self.nodeList.append(groupNode) self.hood.dnaStore.resetPlaceNodes() self.hood.dnaStore.resetDNAGroups() self.hood.dnaStore.resetDNAVisGroups() self.hood.dnaStore.resetDNAVisGroupsAI() def enterPlayground(self, requestStatus): try: self.hood.stopSuitEffect() except: pass self.acceptOnce(self.placeDoneEvent, self.handlePlaygroundDone) self.place = self.playground(self, self.fsm, self.placeDoneEvent) self.place.load() def exitPlayground(self): self.ignore(self.placeDoneEvent) self.place.exit() self.place.unload() self.place = None base.cr.playGame.setPlace(self.place) return def handlePlaygroundDone(self): status = self.place.doneStatus if self.hood.isSameHood(status) and status['loader'] == 'safeZoneLoader' and status['where'] not in ('minigame',): self.fsm.request('quietZone', [status]) else: self.doneStatus = status messenger.send(self.doneEvent) def enterToonInterior(self, requestStatus): self.acceptOnce(self.placeDoneEvent, self.handleToonInteriorDone) self.place = ToonInterior.ToonInterior(self, self.fsm, self.placeDoneEvent) self.place.load() def enterThePlace(self, requestStatus): base.cr.playGame.setPlace(self.place) self.place.enter(requestStatus) def exitToonInterior(self): self.ignore(self.placeDoneEvent) self.place.exit() self.place.unload() self.place = None base.cr.playGame.setPlace(self.place) return def handleToonInteriorDone(self): status = self.place.doneStatus if status['loader'] == 'safeZoneLoader' and self.hood.isSameHood(status) and status['shardId'] == None or status['how'] == 'doorOut': self.fsm.request('quietZone', [status]) else: self.doneStatus = status messenger.send(self.doneEvent) return def enterQuietZone(self, requestStatus): self.fsm.request(requestStatus['where'], [requestStatus], exitCurrent=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 handleQuietZoneDone(self): status = self.quietZoneStateData.getDoneStatus() self.exitQuietZone() if status['where'] == 'estate' or status['loader'] == 'townLoader': self.doneStatus = status messenger.send(self.doneEvent) else: self.enterThePlace(status) def enterOff(self): pass def exitOff(self): pass