Exemplo n.º 1
0
    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()
Exemplo n.º 2
0
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])
Exemplo n.º 3
0
 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()
Exemplo n.º 4
0
Arquivo: ui.py Projeto: rdb/hexima
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()
Exemplo n.º 5
0
    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()
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
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)