class HomeHood:
    dnaStore = DNAStorage()

    def createHood(self, loadStorage=1):
        self.isLoaded = 0
        if loadStorage:
            loadDNAFile(self.dnaStore, "phase_5.5/dna/storage_estate.dna")
        node = loadDNAFile(self.dnaStore, "phase_5.5/dna/estate_1.dna")
        if node.getNumParents() == 1:
            self.geom = NodePath(node.getParent(0))
            self.geom.reparentTo(hidden)
        else:
            self.geom = hidden.attachNewNode(self.node)
        gsg = base.win.getGsg()
        if gsg:
            self.geom.prepareScene(gsg)
        self.geom.setName('home')

        self.geom.find('**/Path').setTransparency(TransparencyAttrib.MBinary,
                                                  1)

        self.sky = loader.loadModel("phase_3.5/models/props/TT_sky.bam")
        self.sky.reparentTo(self.geom)
        self.sky.setPos(-4.99989, -0.000152588, 2.28882e-005)

        self.geom.find('**/terrain').setCollideMask(BitMask32.allOff())
        self.geom.find('**/terrain_barrier').node().setIntoCollideMask(
            CIGlobals.WallBitmask)
        self.geom.find("**/collision_fence").node().setIntoCollideMask(
            CIGlobals.WallBitmask)
        self.geom.find('**/collision4').node().setIntoCollideMask(
            CIGlobals.FloorBitmask)
        self.geom.find("**/collision3").node().setIntoCollideMask(
            CIGlobals.FloorBitmask)
        self.geom.find("**/collision1").node().setIntoCollideMask(
            CIGlobals.FloorBitmask)

        self.geom.reparentTo(render)

        messenger.send("loadedHood")

        self.skyUtil = SkyUtil()
        self.skyUtil.startSky(self.sky)

        self.isLoaded = 1

    def unloadHood(self):
        self.skyUtil.stopSky()
        self.geom.remove()
        self.isLoaded = 0
예제 #2
0
class MinigameHood:
    def __init__(self, cr):
        self.cr = cr
        self.isLoaded = 0
        self.dnaStore = DNAStorage()

    def createHood(self, loadStorage=1):
        if loadStorage:
            loadDNAFile(self.dnaStore, "phase_13/dna/storage_party_sz.dna")
        self.node = loadDNAFile(self.dnaStore, "phase_13/dna/party_sz.dna")
        if self.node.getNumParents() == 1:
            self.geom = NodePath(self.node.getParent(0))
            self.geom.reparentTo(hidden)
        else:
            self.geom = hidden.attachNewNode(self.node)
        gsg = base.win.getGsg()
        if gsg:
            self.geom.prepareScene(gsg)
        self.geom.setName('minigames')

        base.hoodBGM = base.loadMusic(
            "phase_13/audio/bgm/party_original_theme.ogg")
        base.hoodBGM.setVolume(0.7)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()

        self.sky = loader.loadModel("phase_3.5/models/props/TT_sky.bam")
        self.sky.reparentTo(self.geom)
        self.sky.setPos(9.15527e-005, -1.90735e-006, 2.6226e-006)
        self.sky.setH(-90)

        self.skyUtil = SkyUtil()
        self.skyUtil.startSky(self.sky)

        self.geom.reparentTo(render)

        self.isLoaded = 1
        messenger.send("loadedHood")

    def unloadHood(self):
        self.isLoaded = 0
        self.skyUtil.stopSky()
        self.geom.removeNode()
        base.hoodBGM.stop()
예제 #3
0
class MinigameHood:

    def __init__(self, cr):
        self.cr = cr
        self.isLoaded = 0
        self.dnaStore = DNAStorage()

    def createHood(self, loadStorage = 1):
        if loadStorage:
            loadDNAFile(self.dnaStore, 'phase_13/dna/storage_party_sz.dna')
        self.node = loadDNAFile(self.dnaStore, 'phase_13/dna/party_sz.dna')
        if self.node.getNumParents() == 1:
            self.geom = NodePath(self.node.getParent(0))
            self.geom.reparentTo(hidden)
        else:
            self.geom = hidden.attachNewNode(self.node)
        gsg = base.win.getGsg()
        if gsg:
            self.geom.prepareScene(gsg)
        self.geom.setName('minigames')
        base.hoodBGM = base.loadMusic('phase_13/audio/bgm/party_original_theme.ogg')
        base.hoodBGM.setVolume(0.7)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        self.sky = loader.loadModel('phase_3.5/models/props/TT_sky.bam')
        self.sky.reparentTo(self.geom)
        self.sky.setPos(9.15527e-05, -1.90735e-06, 2.6226e-06)
        self.sky.setH(-90)
        self.skyUtil = SkyUtil()
        self.skyUtil.startSky(self.sky)
        self.geom.reparentTo(render)
        self.isLoaded = 1
        messenger.send('loadedHood')

    def unloadHood(self):
        self.isLoaded = 0
        self.skyUtil.stopSky()
        self.geom.removeNode()
        base.hoodBGM.stop()
예제 #4
0
파일: HomeHood.py 프로젝트: coginvasion/src
class HomeHood:
    dnaStore = DNAStorage()

    def createHood(self, loadStorage = 1):
        self.isLoaded = 0
        if loadStorage:
            loadDNAFile(self.dnaStore, 'phase_5.5/dna/storage_estate.dna')
        node = loadDNAFile(self.dnaStore, 'phase_5.5/dna/estate_1.dna')
        if node.getNumParents() == 1:
            self.geom = NodePath(node.getParent(0))
            self.geom.reparentTo(hidden)
        else:
            self.geom = hidden.attachNewNode(self.node)
        gsg = base.win.getGsg()
        if gsg:
            self.geom.prepareScene(gsg)
        self.geom.setName('home')
        self.geom.find('**/Path').setTransparency(TransparencyAttrib.MBinary, 1)
        self.sky = loader.loadModel('phase_3.5/models/props/TT_sky.bam')
        self.sky.reparentTo(self.geom)
        self.sky.setPos(-4.99989, -0.000152588, 2.28882e-05)
        self.geom.find('**/terrain').setCollideMask(BitMask32.allOff())
        self.geom.find('**/terrain_barrier').node().setIntoCollideMask(CIGlobals.WallBitmask)
        self.geom.find('**/collision_fence').node().setIntoCollideMask(CIGlobals.WallBitmask)
        self.geom.find('**/collision4').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/collision3').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/collision1').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.reparentTo(render)
        messenger.send('loadedHood')
        self.skyUtil = SkyUtil()
        self.skyUtil.startSky(self.sky)
        self.isLoaded = 1

    def unloadHood(self):
        self.skyUtil.stopSky()
        self.geom.remove()
        self.isLoaded = 0
class DistributedRaceGame(DistributedMinigame.DistributedMinigame):
    def __init__(self, cr):
        try:
            self.DistributedRaceGame_initialized
            return
        except:
            self.DistributedRaceGame_initialized = 1
        DistributedMinigame.DistributedMinigame.__init__(self, cr)
        self.movement = RaceGameMovement.RaceGameMovement(base.localAvatar)
        self.skyUtil = SkyUtil()
        self.raceFSM = ClassicFSM('DistributedRaceGame', [
            State('race', self.enterRace, self.exitRace),
            State('raceTransition', self.enterRaceTransition,
                  self.exitRaceTransition),
            State('off', self.enterRaceOff, self.exitRaceOff)
        ], 'off', 'off')
        self.raceFSM.enterInitialState()
        self.cr = cr
        self.track = None
        self.sky = None
        self.countSfx = base.loadSfx("phase_5/audio/sfx/firehydrant_popup.ogg")
        self.goSfx = base.loadSfx("phase_4/audio/sfx/AA_sound_whistle.ogg")
        self.game = CIGlobals.RaceGame
        self.trackPath = "phase_4/models/minigames/sprint_track.egg"
        self.skyPath = "phase_3.5/models/props/TT_sky.bam"
        self.lanePos = [(-22.00, -205.00, 0.00), (-11.66, -205.00, 0.00),
                        (0.00, -205.00, 0.00), (-33.66, -205.00, 0.00)]
        self.initialCamPos = {
            "pos": (41.10, -145.00, 25.88),
            "hpr": (135.00, 345.96, 0.0)
        }
        self.raceCamPos = (-24.52, -37.22, 25.00)
        self.lane = 0
        return

    def load(self):
        self.deleteWorld()
        self.track = loader.loadModel(self.trackPath)
        self.track.reparentTo(render)
        self.sky = loader.loadModel(self.skyPath)
        self.sky.reparentTo(self.track)
        self.skyUtil.startSky(self.sky)
        self.setMinigameMusic("phase_4/audio/bgm/MG_toontag.ogg")
        self.setDescription("Tap the left and right arrow keys repeatedly, in turns, as fast as " + \
         "you can to win the race! Every time your power bar hits the top, the boost bar starts" + \
         " to fill. When the boost bar is full, press CTRL to boost for a few seconds.")
        self.setWinnerPrize(100)
        self.setLoserPrize(5)
        self.d_requestToonLane()
        camera.reparentTo(render)
        camera.setPos(self.initialCamPos["pos"])
        camera.setHpr(self.initialCamPos["hpr"])
        DistributedMinigame.DistributedMinigame.load(self)

    def enterPlay(self):
        DistributedMinigame.DistributedMinigame.enterPlay(self)
        self.raceFSM.request('raceTransition')

    def exitPlay(self):
        DistributedMinigame.DistributedMinigame.exitPlay(self)
        self.raceFSM.request('off')

    def enterRace(self):
        self.startMovement()

    def exitRace(self):
        self.stopMovement()

    def enterRaceOff(self):
        pass

    def exitRaceOff(self):
        pass

    def enterRaceTransition(self):
        self.raceTrans = Sequence(Wait(0.5), Func(self.moveCameraToToon),
                                  Wait(4.5), Func(self.moveCameraToTop),
                                  Wait(4.5), Func(self.startCountdown))
        self.raceTrans.start()

    def exitRaceTransition(self):
        self.raceTrans.pause()
        del self.raceTrans

    def startMovement(self):
        self.movement.createGui()
        self.movement.fsm.request('run')

    def enterGameOver(self, winner=0, winnerDoId=0, allPrize=0):
        self.raceFSM.request('off')
        DistributedMinigame.DistributedMinigame.enterGameOver(
            self, winner, winnerDoId, allPrize)

    def stopMovement(self):
        self.movement.cleanup()
        self.movement.deleteGui()

    def startCountdown(self):
        """ Start the countdown to the start of the race. """
        self.countdownLbl = DirectLabel(text="",
                                        text_scale=0.3,
                                        text_font=CIGlobals.getMickeyFont(),
                                        text_fg=(1, 1, 0, 1),
                                        pos=(0, 0, 0.5))
        Sequence(Func(self.setCountdownText, "3"), Wait(1.0),
                 Func(self.setCountdownText, "2"), Wait(1.0),
                 Func(self.setCountdownText, "1"), Wait(1.0),
                 Func(self.setCountdownText, "GO!"), Wait(1.5),
                 Func(self.deleteCountdownLabel)).start()

    def setCountdownText(self, number):
        self.countdownLbl['text'] = number
        if number == "GO!":
            self.countdownLbl['text_fg'] = (0, 1, 0, 1)
            self.goSfx.play()
            self.raceFSM.request('race')
        else:
            self.countSfx.play()

    def deleteCountdownLabel(self):
        self.countdownLbl.destroy()
        del self.countdownLbl

    def moveCameraToToon(self):
        camPInt = LerpPosInterval(camera,
                                  duration=3.0,
                                  pos=self.localAv.getPos(render) + (0, 15, 3),
                                  startPos=(camera.getPos(render)),
                                  blendType="easeInOut")
        camQInt = camera.quatInterval(3.0,
                                      hpr=Vec3(180, 0, 0),
                                      blendType="easeInOut")
        camPInt.start()
        camQInt.start()

    def moveCameraToTop(self):
        camera.setPos(camera.getPos(self.localAv))
        camera.reparentTo(self.localAv)
        oldPos = camera.getPos()
        camera.setPos(self.raceCamPos)
        oldHpr = camera.getHpr()
        camera.lookAt(self.localAv.getPart('head'))
        newHpr = camera.getHpr()
        camera.setHpr(oldHpr)
        camera.setPos(oldPos)
        camPInt = LerpPosInterval(camera,
                                  duration=3.0,
                                  pos=self.raceCamPos,
                                  startPos=oldPos,
                                  blendType="easeInOut")
        camQInt = camera.quatInterval(3.0, hpr=newHpr, blendType="easeInOut")
        camPInt.start()
        camQInt.start()

    def deleteWorld(self):
        if self.track:
            self.track.removeNode()
            self.track = None
        if self.sky:
            self.skyUtil.stopSky()
            self.sky.removeNode()
            self.sky = None

    def setToonLane(self, lane):
        self.lane = lane
        base.localAvatar.setPos(self.lanePos[lane])
        base.localAvatar.setHpr(0, 0, 0)

    def getToonLane(self):
        return self.lane

    def d_requestToonLane(self):
        self.sendUpdate('requestToonLane', [])

    def announceGenerate(self):
        DistributedMinigame.DistributedMinigame.announceGenerate(self)
        self.load()

    def disable(self):
        DistributedMinigame.DistributedMinigame.disable(self)
        self.deleteWorld()
        self.raceFSM.requestFinalState()
        del self.raceFSM
        self.countSfx = None
        self.goSfx = None
예제 #6
0
class GunGameLevelLoader:
    notify = directNotify.newCategory('GunGameLevelLoader')
    LevelData = {'momada': {'name': CIGlobals.ToonBattleOriginalLevel, 
                  'camera': (
                           Point3(0.0, -25.8, 7.59), Vec3(0.0, 0.0, 0.0)), 
                  'models': [
                           'phase_11/models/lawbotHQ/LB_Zone03a.bam',
                           'phase_11/models/lawbotHQ/LB_Zone04a.bam',
                           'phase_11/models/lawbotHQ/LB_Zone7av2.bam',
                           'phase_11/models/lawbotHQ/LB_Zone08a.bam',
                           'phase_11/models/lawbotHQ/LB_Zone13a.bam',
                           'phase_10/models/cashbotHQ/ZONE17a.bam',
                           'phase_10/models/cashbotHQ/ZONE18a.bam',
                           'phase_11/models/lawbotHQ/LB_Zone22a.bam'], 
                  'parents': [
                            render,
                            'EXIT',
                            'EXIT',
                            'EXIT',
                            'ENTRANCE',
                            'ENTRANCE',
                            'ENTRANCE',
                            'EXIT'], 
                  'model_positions': [
                                    Point3(0.0, 0.0, 0.0),
                                    Point3(-1.02, 59.73, 0.0),
                                    Point3(0.0, 74.77, 0.0),
                                    Point3(0.0, 89.37, -13.5),
                                    Point3(16.33, -136.53, 0.0),
                                    Point3(-1.01, -104.4, 0.0),
                                    Point3(0.65, -23.86, 0.0),
                                    Point3(-55.66, -29.01, 0.0)], 
                  'model_orientations': [
                                       Vec3(0.0, 0.0, 0.0),
                                       Vec3(0.0, 0.0, 0.0),
                                       Vec3(90.0, 0.0, 0.0),
                                       Vec3(180.0, 0.0, 0.0),
                                       Vec3(97.0, 0.0, 0.0),
                                       Vec3(359.95, 0.0, 0.0),
                                       Vec3(90.0, 0.0, 0.0),
                                       Vec3(270.0, 0.0, 0.0)], 
                  'spawn_points': [
                                 (
                                  Point3(0, 0, 0), Vec3(0, 0, 0)),
                                 (
                                  Point3(-20, 50, 0), Vec3(0, 0, 0)),
                                 (
                                  Point3(20, 50, 0), Vec3(0, 0, 0)),
                                 (
                                  Point3(0, 120, 0), Vec3(0, 0, 0)),
                                 (
                                  Point3(0, 100, 0), Vec3(180, 0, 0)),
                                 (
                                  Point3(-90, 0, 0), Vec3(0, 0, 0)),
                                 (
                                  Point3(-170, 0, 0), Vec3(0, 0, 0)),
                                 (
                                  Point3(-90, 50, 0), Vec3(0, 0, 0)),
                                 (
                                  Point3(-170, 50, 0), Vec3(0, 0, 0)),
                                 (
                                  Point3(35, 250, 0), Vec3(-90, 0, 0)),
                                 (
                                  Point3(0, 285, 0), Vec3(180, 0, 0)),
                                 (
                                  Point3(-185, 250, 0), Vec3(90, 0, 0))]}, 
       'dg': {'name': CIGlobals.DaisyGardens, 
              'camera': (
                       Point3(-33.13, -3.2, 48.62), Vec3(326.31, 332.68, 0.0)), 
              'dna': [
                    'phase_8/dna/storage_DG.pdna',
                    'phase_8/dna/storage_DG_sz.pdna',
                    'phase_8/dna/daisys_garden_sz.pdna'], 
              'sky': 'TT', 
              'spawn_points': hoodMgr.dropPoints[CIGlobals.DaisyGardens]}, 
       'mml': {'name': CIGlobals.MinniesMelodyland, 
               'camera': (
                        Point3(-54.42, -91.05, 34.89), Vec3(315.29, 336.8, 0.0)), 
               'dna': [
                     'phase_6/dna/storage_MM.pdna',
                     'phase_6/dna/storage_MM_sz.pdna',
                     'phase_6/dna/minnies_melody_land_sz.pdna'], 
               'sky': 'MM', 
               'spawn_points': hoodMgr.dropPoints[CIGlobals.MinniesMelodyland]}, 
       'oz': {'name': CIGlobals.OutdoorZone, 
              'camera': (
                       Point3(-54.42, -91.05, 34.89), Vec3(315.29, 336.8, 0.0)), 
              'dna': [
                    'phase_6/dna/storage_OZ.pdna',
                    'phase_6/dna/storage_OZ_sz.pdna',
                    'phase_6/dna/outdoor_zone_sz.pdna'], 
              'sky': 'TT', 
              'spawn_points': hoodMgr.dropPoints[CIGlobals.OutdoorZone]}, 
       'cbhq': {'name': CIGlobals.CashbotHQ, 
                'camera': (
                         Point3(302.64, 5.0, 15.2), Vec3(135.0, 341.57, 0.0)), 
                'model': 'phase_10/models/cogHQ/CashBotShippingStation.bam', 
                'sky': None, 
                'spawn_points': hoodMgr.dropPoints[CIGlobals.CashbotHQ]}, 
       'sbf': {'name': CIGlobals.SellbotFactory, 
               'camera': (
                        Point3(0, 0, 0), Vec3(0, 0, 0)), 
               'model': 'phase_9/models/cogHQ/SelbotLegFactory.bam', 
               'sky': 'cog', 
               'sky_scale': 10.0, 
               'occluders': 'phase_9/models/cogHQ/factory_sneak_occluders.egg', 
               'spawn_points': {GGG.Teams.BLUE: [
                                               (
                                                Point3(13, 30, 3.73), Point3(0, 0, 0)), (Point3(21, 30, 3.73), Point3(0, 0, 0)), (Point3(29, 30, 3.73), Point3(0, 0, 0)),
                                               (
                                                Point3(13, 20, 3.73), Point3(0, 0, 0)), (Point3(21, 20, 3.73), Point3(0, 0, 0)), (Point3(29, 30, 3.73), Point3(0, 0, 0))], 
                                GGG.Teams.RED: [
                                              (
                                               Point3(-644.43, 378.12, 8.73), Point3(270, 0, 0)), (Point3(-644.43, 370.75, 8.73), Point3(270, 0, 0)), (Point3(-644.43, 363.22, 8.73), Point3(270, 0, 0)),
                                              (
                                               Point3(-659.05, 378.12, 8.73), Point3(270, 0, 0)), (Point3(-659.05, 370.75, 8.73), Point3(270, 0, 0)), (Point3(-659.05, 363.22, 8.73), Point3(270, 0, 0))]}, 
               'flag_points': {GGG.Teams.BLUE: [Point3(213.23, 340.59, 19.73), Point3(90, 0, 0)], GGG.Teams.RED: [
                                             Point3(-543.6, 595.79, 9.73), Point3(270, 0, 0)]}, 
               'flagpoint_points': {GGG.Teams.BLUE: [Point3(-543.6, 595.79, 9.73), Point3(270, 0, 0)], GGG.Teams.RED: [
                                                  Point3(213.23, 340.59, 19.73), Point3(0, 0, 0)]}}, 
       'ttc': {'name': CIGlobals.ToontownCentral, 
               'dna': [
                     'phase_4/dna/storage_TT.pdna',
                     'phase_4/dna/storage_TT_sz.pdna',
                     'phase_4/dna/new_ttc_sz.pdna'], 
               'sky': 'TT', 
               'spawn_points': [
                              (9.90324401855, 91.9139556885, 8.0364112854, -545.909545898, 0.0, 0.0),
                              (77.9181442261, 50.953086853, 7.52815723419, -598.509460449, 0.0, 0.0),
                              (93.7379760742, 6.37303066254, 7.99749088287, -626.209533691, 0.0, 0.0),
                              (39.0383415222, -81.5989837646, 8.01874637604, -694.309265137, 0.0, 0.0),
                              (-19.2093048096, -95.1359481812, 8.07303524017, -731.409240723, 0.0, 0.0),
                              (-84.4093933105, -45.4780502319, 8.06541728973, -781.809143066, 0.0, 0.0),
                              (-92.2512283325, 2.41426730156, 8.03108692169, -811.70916748, 0.0, 0.0),
                              (46.8868179321, 81.3593673706, 8.04793071747, -955.309509277, 0.0, 0.0),
                              (32.3203735352, 90.0017929077, 8.06353855133, -884.409301758, 0.0, 0.0)], 
               'cap_point': Point3(-1.5, 0, 0)}}
    SkyData = {'TT': 'phase_3.5/models/props', 
       'MM': 'phase_6/models/props', 
       'cog': 'phase_9/models/cogHQ', 
       'MovingSkies': [
                     'TT']}

    def __init__(self, mg):
        self.mg = mg
        self.levelName = None
        self.dnaStore = DNAStorage()
        self.loadingText = None
        self.levelGeom = None
        self.skyUtil = None
        self.skyModel = None
        self.occluders = None
        self.momadaAreas = []
        self.momadaAreaName2areaModel = {}
        return

    def getFlagPoint_Point(self, team):
        return self.LevelData[self.levelName]['flagpoint_points'][team]

    def getFlagPoint(self, team):
        return self.LevelData[self.levelName]['flag_points'][team]

    def getCapturePoint(self):
        return self.LevelData[self.levelName]['cap_point']

    def setLevel(self, level):
        self.levelName = level

    def getLevel(self):
        return self.levelName

    def getCameraOfCurrentLevel(self):
        return self.LevelData[self.getLevel()]['camera']

    def getSpawnPoints(self):
        pointData = self.LevelData[self.levelName]['spawn_points']
        if self.levelName == 'momada':
            return pointData
        if self.mg.gameMode in [GGG.GameModes.CASUAL, GGG.GameModes.KOTH]:
            array = []
            for posAndHpr in pointData:
                array.append((
                 Point3(posAndHpr[0], posAndHpr[1], posAndHpr[2]),
                 Vec3(posAndHpr[3], posAndHpr[4], posAndHpr[5])))

        else:
            if self.mg.gameMode == GGG.GameModes.CTF:
                array = pointData[self.mg.team]
        return array

    def getNameOfCurrentLevel(self):
        return self.LevelData[self.getLevel()]['name']

    def load(self):
        self.unload()
        if self.loadingText:
            self.loadingText.destroy()
            self.loadingText = None
        self.loadingText = OnscreenText(text='', font=CIGlobals.getMinnieFont(), fg=(1,
                                                                                     1,
                                                                                     1,
                                                                                     1))
        self.loadingText.setBin('gui-popup', 0)
        base.graphicsEngine.renderFrame()
        base.graphicsEngine.renderFrame()
        if self.levelName == 'momada':
            self.__momadaLoad()
        else:
            if self.levelName in ('cbhq', 'sbf'):
                modelPath = self.LevelData[self.levelName]['model']
                self.levelGeom = loader.loadModel(modelPath)
                self.levelGeom.flattenMedium()
                self.levelGeom.reparentTo(render)
                if self.LevelData[self.levelName]['sky'] != None:
                    self.skyModel = loader.loadModel(self.SkyData['cog'] + '/cog_sky.bam')
                    self.skyUtil = SkyUtil()
                    self.skyUtil.startSky(self.skyModel)
                    self.skyModel.reparentTo(render)
                    self.skyModel.setScale(self.LevelData[self.levelName].get('sky_scale', 1.0))
                if self.LevelData[self.levelName].get('occluders'):
                    self.occluders = loader.loadModel(self.LevelData[self.levelName]['occluders'])
                    for occluderNode in self.occluders.findAllMatches('**/+OccluderNode'):
                        base.render.setOccluder(occluderNode)
                        occluderNode.node().setDoubleSided(True)

                if self.levelName == 'sbf':
                    base.camLens.setFar(250)
            else:
                dnaFiles = self.LevelData[self.levelName]['dna']
                skyType = self.LevelData[self.levelName]['sky']
                skyPhase = self.SkyData[skyType]
                loadDNAFile(self.dnaStore, 'phase_4/dna/storage.pdna')
                for index in range(len(dnaFiles)):
                    if index == len(dnaFiles) - 1:
                        node = loadDNAFile(self.dnaStore, dnaFiles[index])
                        if node.getNumParents() == 1:
                            self.levelGeom = NodePath(node.getParent(0))
                            self.levelGeom.reparentTo(hidden)
                        else:
                            self.levelGeom = hidden.attachNewNode(node)
                        if self.levelName == 'ttc' and dnaFiles[index] == 'phase_4/dna/new_ttc_sz.pdna':
                            self.levelGeom.find('**/prop_gazebo_DNARoot').removeNode()
                        else:
                            self.levelGeom.flattenMedium()
                        gsg = base.win.getGsg()
                        if gsg:
                            self.levelGeom.prepareScene(gsg)
                        self.levelGeom.reparentTo(render)
                    else:
                        loadDNAFile(self.dnaStore, dnaFiles[index])

                children = self.levelGeom.findAllMatches('**/*doorFrameHole*')
                for child in children:
                    child.hide()

                self.skyModel = loader.loadModel(skyPhase + '/' + skyType + '_sky.bam')
                self.skyUtil = SkyUtil()
                self.skyUtil.startSky(self.skyModel)
                self.skyModel.reparentTo(camera)
                ce = CompassEffect.make(NodePath(), CompassEffect.PRot | CompassEffect.PZ)
                self.skyModel.node().setEffect(ce)
        if self.loadingText:
            self.loadingText.destroy()
            self.loadingText = None
        return

    def __momadaLoad(self):

        def attachArea(itemNum):
            name = 'MomadaArea-%s' % itemNum
            area = self.momadaAreaName2areaModel.get(name)
            parents = self.LevelData['momada']['parents']
            parent = parents[itemNum]
            if type(parent) == type(''):
                parent = self.momadaAreas[itemNum - 1].find('**/' + parent)
            pos = self.LevelData['momada']['model_positions'][itemNum]
            hpr = self.LevelData['momada']['model_orientations'][itemNum]
            area.reparentTo(parent)
            area.setPos(pos)
            area.setHpr(hpr)

        _numItems = 0
        name = None
        for item in self.LevelData['momada']['models']:
            name = 'MomadaArea-%s' % _numItems
            area = loader.loadModel(item)
            self.momadaAreas.append(area)
            self.momadaAreaName2areaModel[name] = area
            attachArea(_numItems)
            _numItems += 1
            self.notify.info('Loaded and attached %s momada areas.' % _numItems)

        return

    def unload(self):
        render.clearOccluder()
        if self.levelName == 'sbf':
            base.camLens.setFar(CIGlobals.DefaultCameraFar)
        if self.levelName == 'momada':
            for area in self.momadaAreas:
                self.momadaAreas.remove(area)
                area.removeNode()
                del area

            self.momadaAreas = []
            self.momadaAreaName2areaModel = {}
        else:
            if self.occluders:
                self.occluders.removeNode()
                self.occluders = None
            if self.skyUtil:
                self.skyUtil.stopSky()
                self.skyUtil = None
            if self.skyModel:
                self.skyModel.removeNode()
                self.skyModel = None
            if self.levelGeom:
                self.levelGeom.removeNode()
                self.levelGeom = None
        return

    def cleanup(self):
        self.momadaAreas = None
        self.momadaAreaName2areaModel = None
        if self.dnaStore:
            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()
        self.dnaStore = None
        return
class CameraShyLevelLoader:
    notify = directNotify.newCategory('CameraShyLevelLoader')

    levelData = {
        'TT_maze': {
            'name':
            CIGlobals.ToontownCentral,
            'models': {
                'phase_4/models/minigames/maze_1player.bam': {
                    'name': 'maze'
                },
                'phase_4/models/minigames/maze_1player_collisions.egg': {
                    'name': 'maze_collisions'
                },
            },
            'sky':
            'TT',
            'spawnPoints':
            [[Point3(0, 0, 0), Vec3(0, 0, 0)],
             [Point3(-23.89, 18.58, 0.00),
              Vec3(90.00, 0.00, 0.00)],
             [Point3(-23.89, 6.30, 0.00),
              Vec3(0.00, 0.00, 0.00)],
             [Point3(23.78, 6.30, 0.00),
              Vec3(0.00, 0.00, 0.00)],
             [Point3(8.12, -17.79, 0.00),
              Vec3(270.00, 0.00, 0.00)]]
        },
        'DG_playground': {
            'name':
            CIGlobals.DaisyGardens,
            'dna': [
                'phase_8/dna/storage_DG.pdna',
                'phase_8/dna/storage_DG_sz.pdna',
                'phase_8/dna/daisys_garden_sz.pdna'
            ],
            'sky':
            'TT',
            'spawnPoints':
            hoodMgr.dropPoints[CIGlobals.DaisyGardens]
        }
    }

    skyData = {
        'TT': {
            'model': 'phase_3.5/models/props/TT_sky.bam',
            'moving': 1
        }
    }

    def __init__(self):
        self.level = None
        self.dnaStore = DNAStorage()

        self.levelGeom = None
        self.skyUtil = None
        self.skyModel = None

        # To keep track of all the models.
        self.models = []

    def setLevel(self, level):
        self.level = level

    def getLevel(self):
        return self.level

    def load(self):
        if not self.level:
            self.notify.warning('Attempted to load a null level!')
            return

        def loadSky(sky):
            data = self.skyData[sky]

            if data:
                model = data['model']
                moving = 0

                if data.get('moving'):
                    moving = data['moving']

                self.skyModel = loader.loadModel(model)
                self.skyModel.reparentTo(camera)
                self.skyUtil = SkyUtil()
                self.skyUtil.startSky(self.skyModel)

                if moving:
                    compass = CompassEffect.make(
                        NodePath(), CompassEffect.PRot | CompassEffect.PZ)
                    self.skyModel.node().setEffect(compass)

        self.unload()
        data = self.levelData[self.level]
        skyType = data['sky']

        # Are we loading a DNA level?
        if data.get('dna'):
            dnaFiles = data['dna']
            loadDNAFile(self.dnaStore, 'phase_4/dna/storage.pdna')

            for index in range(len(dnaFiles)):
                if 'storage' not in dnaFiles[index]:
                    # It's an environment file, let's load that up and reparent it to render.
                    node = loader.loadDNAFile(self.dnaStore, dnaFiles[index])
                    if node.getNumParents() == 1:
                        self.levelGeom = NodePath(node.getParent(0))
                        self.levelGeom.reparentTo(hidden)
                    else:
                        self.levelGeom = hidden.attachNewNode(node)
                    self.levelGeom.flattenMedium()
                    gsg = base.win.getGsg()
                    if gsg:
                        self.levelGeom.prepareScene(gsg)
                    self.levelGeom.reparentTo(render)
                else:
                    # It's just a storage file, let's just load that up.
                    loadDNAFile(self.dnaStore, dnaFiles[index])
        elif data.get('models'):
            models = data['models']
            for model, modifiers in models.items():
                mdl = loader.loadModel(model)

                if modifiers.get('name'):
                    mdl.setName(modifiers['name'])

                if modifiers.get('hpr'):
                    mdl.setHpr(modifiers['hpr'])

                if modifiers.get('pos'):
                    mdl.setPos(modifiers['pos'])

                if modifiers.get('scale'):
                    mdl.setScale(modifiers['scale'])

                if modifiers.get('parent'):
                    mdl.reparentTo(modifiers['parent'])
                else:
                    mdl.reparentTo(render)
                self.models.append(mdl)
        else:
            self.notify.warning(
                'Attempted to load a level with no data on how to generate it. Level is empty!'
            )
            return
        loadSky(skyType)
        self.levelLoaded()

    def unload(self):
        if self.models:
            if len(self.models) > 0:
                for model in self.models:
                    model.removeNode()
        self.models = []
        if self.levelGeom:
            self.levelGeom.removeNode()
            self.levelGeom = None
        if self.skyUtil:
            self.skyUtil.stopSky()
            self.skyUtil = None
        if self.skyModel:
            self.skyModel.removeNode()
            self.skyModel = None
        if self.dnaStore:
            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()

        # This is set outside of the class, so no need to check if it exists.
        hoodMgr = None

    def cleanup(self):
        try:
            self.CameraShyLevelLoader_deleted
        except:
            self.CameraShyLevelLoader_deleted = 1
            if self.dnaStore:
                self.unload()
            self.models = None
            self.levelGeom = None
            self.skyUtil = None
            self.skyModel = None
            self.dnaStore = None
            self.levelData = None

    def levelLoaded(self):
        if self.level == 'TT_maze':
            for model in self.models:
                if model.getName() == 'maze':
                    model.find('**/maze_walls').setSz(1.5)
                elif model.getName() == 'maze_collisions':
                    model.hide()
                    model.setTransparency(1)
                    model.setColorScale(1, 1, 1, 0)
                    for node in model.findAllMatches('**'):
                        node.setSz(1.5)

    def getSpawnPoints(self):
        if self.level:
            points = self.levelData[self.level].get('spawnPoints')

            # Do we need to disect the pos and hpr coordinates?
            if points in hoodMgr.dropPoints.values():
                twoPointArray = []
                for posHpr in points:
                    twoPointArray.append(
                        Point3(posHpr[0], posHpr[1], posHpr[2]),
                        Vec3(posHpr[3], posHpr[4], posHpr[5]))
                points = twoPointArray
            return points
        else:
            self.notify.warning(
                'Attempted to get spawn points of a null level!')
            return None
예제 #8
0
class GunGameLevelLoader:
    notify = directNotify.newCategory('GunGameLevelLoader')
    LevelData = {'momada': {'name': CIGlobals.ToonBattleOriginalLevel,
                'camera': (Point3(0.0, -25.8, 7.59), Vec3(0.0, 0.0, 0.0)),
                'models': ['phase_11/models/lawbotHQ/LB_Zone03a.bam',
                           'phase_11/models/lawbotHQ/LB_Zone04a.bam',
                           'phase_11/models/lawbotHQ/LB_Zone7av2.bam',
                           'phase_11/models/lawbotHQ/LB_Zone08a.bam',
                           'phase_11/models/lawbotHQ/LB_Zone13a.bam',
                           'phase_10/models/cashbotHQ/ZONE17a.bam',
                           'phase_10/models/cashbotHQ/ZONE18a.bam',
                           'phase_11/models/lawbotHQ/LB_Zone22a.bam'],
                'parents': [render,
                            'EXIT',
                            'EXIT',
                            'EXIT',
                            'ENTRANCE',
                            'ENTRANCE',
                            'ENTRANCE',
                            'EXIT'],
                'model_positions': [Point3(0.0, 0.0, 0.0),
                                    Point3(-1.02, 59.73, 0.0),
                                    Point3(0.0, 74.77, 0.0),
                                    Point3(0.0, 89.37, -13.5),
                                    Point3(16.33, -136.53, 0.0),
                                    Point3(-1.01, -104.4, 0.0),
                                    Point3(0.65, -23.86, 0.0),
                                    Point3(-55.66, -29.01, 0.0)],
                'model_orientations': [Vec3(0.0, 0.0, 0.0),
                                       Vec3(0.0, 0.0, 0.0),
                                       Vec3(90.0, 0.0, 0.0),
                                       Vec3(180.0, 0.0, 0.0),
                                       Vec3(97.0, 0.0, 0.0),
                                       Vec3(359.95, 0.0, 0.0),
                                       Vec3(90.0, 0.0, 0.0),
                                       Vec3(270.0, 0.0, 0.0)],
                'spawn_points': [(Point3(0, 0, 0), Vec3(0, 0, 0)),
                                 (Point3(-20, 50, 0), Vec3(0, 0, 0)),
                                 (Point3(20, 50, 0), Vec3(0, 0, 0)),
                                 (Point3(0, 120, 0), Vec3(0, 0, 0)),
                                 (Point3(0, 100, 0), Vec3(180, 0, 0)),
                                 (Point3(-90, 0, 0), Vec3(0, 0, 0)),
                                 (Point3(-170, 0, 0), Vec3(0, 0, 0)),
                                 (Point3(-90, 50, 0), Vec3(0, 0, 0)),
                                 (Point3(-170, 50, 0), Vec3(0, 0, 0)),
                                 (Point3(35, 250, 0), Vec3(-90, 0, 0)),
                                 (Point3(0, 285, 0), Vec3(180, 0, 0)),
                                 (Point3(-185, 250, 0), Vec3(90, 0, 0))]},
     'dg': {'name': CIGlobals.DaisyGardens,
            'camera': (Point3(-33.13, -3.2, 48.62), Vec3(326.31, 332.68, 0.0)),
            'dna': ['phase_8/dna/storage_DG.dna', 'phase_8/dna/storage_DG_sz.dna', 'phase_8/dna/daisys_garden_sz.dna'],
            'sky': 'TT',
            'spawn_points': hoodMgr.dropPoints[CIGlobals.DaisyGardens]},
     'mml': {'name': CIGlobals.MinniesMelodyland,
             'camera': (Point3(-54.42, -91.05, 34.89), Vec3(315.29, 336.8, 0.0)),
             'dna': ['phase_6/dna/storage_MM.dna', 'phase_6/dna/storage_MM_sz.dna', 'phase_6/dna/minnies_melody_land_sz.dna'],
             'sky': 'MM',
             'spawn_points': hoodMgr.dropPoints[CIGlobals.MinniesMelodyland]},
     'oz': {'name': CIGlobals.OutdoorZone,
            'camera': (Point3(-54.42, -91.05, 34.89), Vec3(315.29, 336.8, 0.0)),
            'dna': ['phase_6/dna/storage_OZ.dna', 'phase_6/dna/storage_OZ_sz.dna', 'phase_6/dna/outdoor_zone_sz.dna'],
            'sky': 'TT',
            'spawn_points': hoodMgr.dropPoints[CIGlobals.OutdoorZone]},
     'cbhq': {'name': CIGlobals.CashbotHQ,
              'camera': (Point3(302.64, 5.0, 15.2), Vec3(135.0, 341.57, 0.0)),
              'model': 'phase_10/models/cogHQ/CashBotShippingStation.bam',
              'sky': None,
              'spawn_points': hoodMgr.dropPoints[CIGlobals.CashbotHQ]}}
    SkyData = {'TT': 'phase_3.5/models/props',
     'MM': 'phase_6/models/props',
     'cog': 'phase_9/models/cogHQ',
     'MovingSkies': ['TT']}

    def __init__(self):
        self.levelName = None
        self.dnaStore = DNAStorage()
        self.loadingText = None
        self.levelGeom = None
        self.skyUtil = None
        self.skyModel = None
        self.momadaAreas = []
        self.momadaAreaName2areaModel = {}
        return

    def setLevel(self, level):
        self.levelName = level

    def getLevel(self):
        return self.levelName

    def getCameraOfCurrentLevel(self):
        return self.LevelData[self.getLevel()]['camera']

    def getSpawnPoints(self):
        pointData = self.LevelData[self.levelName]['spawn_points']
        if self.levelName == 'momada':
            return pointData
        else:
            array = []
            for posAndHpr in pointData:
                array.append((Point3(posAndHpr[0], posAndHpr[1], posAndHpr[2]), Vec3(posAndHpr[3], posAndHpr[4], posAndHpr[5])))

            return array

    def getNameOfCurrentLevel(self):
        return self.LevelData[self.getLevel()]['name']

    def load(self):
        self.unload()
        if self.loadingText:
            self.loadingText.destroy()
            self.loadingText = None
        self.loadingText = OnscreenText(text='Loading ' + self.getNameOfCurrentLevel() + '...', font=CIGlobals.getMinnieFont(), fg=(1, 1, 1, 1))
        self.loadingText.setBin('gui-popup', 0)
        base.graphicsEngine.renderFrame()
        base.graphicsEngine.renderFrame()
        if self.levelName == 'momada':
            self.__momadaLoad()
        elif self.levelName in ('cbhq',):
            modelPath = self.LevelData[self.levelName]['model']
            self.levelGeom = loader.loadModel(modelPath)
            self.levelGeom.flattenMedium()
            self.levelGeom.reparentTo(render)
            if self.LevelData[self.levelName]['sky'] != None:
                self.skyModel = loader.loadModel(self.SkyData['cog'] + '/cog_sky.bam')
                self.skyUtil = SkyUtil()
                self.skyUtil.startSky(self.skyModel)
                self.skyModel.reparentTo(render)
        else:
            dnaFiles = self.LevelData[self.levelName]['dna']
            skyType = self.LevelData[self.levelName]['sky']
            skyPhase = self.SkyData[skyType]
            loader.loadDNAFile(self.dnaStore, 'phase_4/dna/storage.dna')
            for index in range(len(dnaFiles)):
                if index == len(dnaFiles) - 1:
                    node = loader.loadDNAFile(self.dnaStore, dnaFiles[index])
                    if node.getNumParents() == 1:
                        self.levelGeom = NodePath(node.getParent(0))
                        self.levelGeom.reparentTo(hidden)
                    else:
                        self.levelGeom = hidden.attachNewNode(node)
                    self.levelGeom.flattenMedium()
                    gsg = base.win.getGsg()
                    if gsg:
                        self.levelGeom.prepareScene(gsg)
                    self.levelGeom.reparentTo(render)
                else:
                    loader.loadDNAFile(self.dnaStore, dnaFiles[index])

            self.skyModel = loader.loadModel(skyPhase + '/' + skyType + '_sky.bam')
            self.skyUtil = SkyUtil()
            self.skyUtil.startSky(self.skyModel)
            self.skyModel.reparentTo(camera)
            ce = CompassEffect.make(NodePath(), CompassEffect.PRot | CompassEffect.PZ)
            self.skyModel.node().setEffect(ce)
        if self.loadingText:
            self.loadingText.destroy()
            self.loadingText = None
        return

    def __momadaLoad(self):

        def attachArea(itemNum):
            name = 'MomadaArea-%s' % itemNum
            area = self.momadaAreaName2areaModel.get(name)
            parents = self.LevelData['momada']['parents']
            parent = parents[itemNum]
            if type(parent) == type(''):
                parent = self.momadaAreas[itemNum - 1].find('**/' + parent)
            pos = self.LevelData['momada']['model_positions'][itemNum]
            hpr = self.LevelData['momada']['model_orientations'][itemNum]
            area.reparentTo(parent)
            area.setPos(pos)
            area.setHpr(hpr)

        _numItems = 0
        name = None
        for item in self.LevelData['momada']['models']:
            name = 'MomadaArea-%s' % _numItems
            area = loader.loadModel(item)
            self.momadaAreas.append(area)
            self.momadaAreaName2areaModel[name] = area
            attachArea(_numItems)
            _numItems += 1
            self.notify.info('Loaded and attached %s momada areas.' % _numItems)

        return

    def unload(self):
        if self.levelName == 'momada':
            for area in self.momadaAreas:
                self.momadaAreas.remove(area)
                area.removeNode()
                del area

            self.momadaAreas = []
            self.momadaAreaName2areaModel = {}
        else:
            if self.skyUtil:
                self.skyUtil.stopSky()
                self.skyUtil = None
            if self.skyModel:
                self.skyModel.removeNode()
                self.skyModel = None
            if self.levelGeom:
                self.levelGeom.removeNode()
                self.levelGeom = None
        return

    def cleanup(self):
        self.momadaAreas = None
        self.momadaAreaName2areaModel = None
        self.dnaStore.resetAll()
        self.dnaStore = None
        return
예제 #9
0
class DistributedCameraShyGame(DistributedMinigame):
    notify = directNotify.newCategory('DistributedCameraShyGame')

    def __init__(self, cr):
        try:
            self.DistributedCameraShyGame_initialized
            return
        except:
            self.DistributedCameraShyGame_initialized = 1

        DistributedMinigame.__init__(self, cr)
        self.headPanels.delete()
        self.headPanels = CameraShyHeadPanels()
        self.fsm.addState(State('countdown', self.enterCountdown, self.exitCountdown, ['play']))
        self.fsm.addState(State('announceGameOver', self.enterAnnounceGameOver, self.exitAnnounceGameOver, ['showWinner']))
        self.fsm.addState(State('showWinner', self.enterShowWinner, self.exitShowWinner, ['gameOver']))
        self.fsm.getStateNamed('waitForOthers').addTransition('countdown')
        self.fsm.getStateNamed('play').addTransition('announceGameOver')
        self.maze = None
        self.mazeCollModel = None
        self.spawnPoints = []
        self.remoteAvatars = []
        self.myRemoteAvatar = None
        self.thisPlayerWinsLbl = None
        self.sky = None
        self.firstPerson = CameraShyFirstPerson(self)
        self.skyUtil = None
        self.pbpText = None
        return

    def generateOtherPlayerGui(self):
        self.headPanels.generateOtherPlayerGui()

    def updateOtherPlayerHead(self, avId, otherAvId, state):
        self.headPanels.updateOtherPlayerHead(avId, otherAvId, state)

    def getPlayByPlayText(self):
        return OnscreenText(text='', fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1), pos=(0, 0.75))

    def removePlayByPlay(self):
        if self.pbpText:
            taskMgr.remove('DCameraShyGame-removePlayByPlay')
            self.pbpText.destroy()
            self.pbpText = None
        return

    def removePlayByPlayTask(self, task):
        self.removePlayByPlay()
        return Task.done

    def showPlayByPlay(self, situation, avId):
        self.removePlayByPlay()
        av = self.cr.doId2do.get(avId)
        name = av.getName()
        if situation == 0:
            self.pbpText = self.getPlayByPlayText()
            self.pbpText.setText('{0} took a picture of you!'.format(name))
        taskMgr.doMethodLater(3.0, self.removePlayByPlayTask, 'DCameraShyGame-removePlayByPlay')

    def tookPictureOfMe(self, avId):
        self.headPanels.hideFrames()
        self.firstPerson.stopCameraFlash()
        base.transitions.setFadeColor(1, 1, 1)
        base.transitions.fadeOut(0.1)
        self.showPlayByPlay(0, avId)
        Sequence(Wait(1), Func(self.respawn)).start()

    def respawn(self):
        base.transitions.fadeIn()
        pos, hpr = self.pickSpawnPoint()
        base.localAvatar.setPos(pos)
        base.localAvatar.setHpr(hpr - (180, 0, 0))
        base.localAvatar.d_broadcastPositionNow()
        Sequence(Wait(0.6), Func(self.headPanels.showFrames), Func(base.transitions.setFadeColor, 0, 0, 0)).start()

    def announceGameOver(self):
        self.fsm.request('announceGameOver')

    def showWinner(self, avId):
        base.transitions.fadeOut()
        Sequence(Wait(0.51), Func(self.fsm.request, 'showWinner', [avId])).start()

    def enterGameOver(self, winner, winnerDoId, allPrize):
        try:
            currentCamPos = base.camera.getPos(render)
            currentCamHpr = base.camera.getHpr(render)
            self.firstPerson.reallyEnd()
            base.camera.setPos(currentCamPos)
            base.camera.setHpr(currentCamHpr)
        except:
            pass

        DistributedMinigame.enterGameOver(self, winner, winnerDoId, allPrize)

    def enterShowWinner(self, winnerId):
        self.firstPerson.reallyEnd()
        avatar = self.getRemoteAvatar(winnerId)
        avatar.avatar.loop('neutral')
        avatar.detachCamera()
        self.thisPlayerWinsLbl = OnscreenText(text='{0} Wins!'.format(avatar.avatar.getName()), fg=(1, 1, 1, 1), font=CIGlobals.getMinnieFont(), pos=(0, 0.8), scale=0.1)
        if winnerId == base.localAvatar.doId:
            self.thisPlayerWinsLbl.setText('You Win!')
        base.camera.reparentTo(avatar.avatar)
        base.camera.setPos(0, 7, 3)
        base.camera.setH(180)
        base.transitions.fadeIn()
        Sequence(Wait(0.5), Func(avatar.doWinDance)).start()

    def exitShowWinner(self):
        pass

    def enterAnnounceGameOver(self):
        whistle = base.loadSfx('phase_4/audio/sfx/AA_sound_whistle.mp3')
        base.playSfx(whistle)
        self.gameOverLbl = OnscreenText(text='Game Over!', fg=(1, 1, 1, 1), font=CIGlobals.getMinnieFont(), scale=0.1)
        self.gameOverScaleIval = LerpScaleInterval(self.gameOverLbl, duration=1.0, scale=0.1, startScale=0.0, blendType='easeOut')

    def exitAnnounceGameOver(self):
        self.gameOverScaleIval.finish()
        del self.gameOverScaleIval
        self.gameOverLbl.destroy()
        del self.gameOverLbl

    def remoteAvatarTakePicture(self, avId):
        avatar = self.getRemoteAvatar(avId)
        if avatar:
            avatar.takePicture()

    def standingAvatar(self, avId):
        avatar = self.getRemoteAvatar(avId)
        if avatar:
            avatar.stand()

    def runningAvatar(self, avId):
        avatar = self.getRemoteAvatar(avId)
        if avatar:
            avatar.run()

    def createRemoteAvatar(self, avId):
        if avId == base.localAvatar.doId:
            self.myRemoteAvatar = RemoteCameraShyAvatar(self, self.cr, avId)
            self.remoteAvatars.append(self.myRemoteAvatar)
        else:
            av = RemoteCameraShyAvatar(self, self.cr, avId)
            av.stand()
            self.remoteAvatars.append(av)

    def getRemoteAvatar(self, avId):
        for avatar in self.remoteAvatars:
            if avatar.avId == avId:
                return avatar

    def allPlayersReady(self):
        self.fsm.request('countdown')

    def enterCountdown(self):
        base.localAvatar.chatInput.disableKeyboardShortcuts()
        base.localAvatar.disableChatInput()
        base.setBackgroundColor(CIGlobals.DefaultBackgroundColor)
        base.render.show()
        self.playMinigameMusic()
        self.countdownLbl = OnscreenText(text='', fg=(1, 1, 1, 1), font=CIGlobals.getMinnieFont(), scale=0.1)
        self.countdownTrack = Sequence(Func(self.countdownLbl.setText, '5'), Wait(1.0), Func(self.countdownLbl.setText, '4'), Wait(1.0), Func(self.countdownLbl.setText, '3'), Wait(1.0), Func(self.countdownLbl.setText, '2'), Wait(1.0), Func(self.countdownLbl.setText, '1'), Wait(1.0), Func(self.fsm.request, 'play'))
        self.countdownTrack.start()
        self.firstPerson.start()
        self.firstPerson.disableMouse()

    def exitCountdown(self):
        if hasattr(self, 'countdownTrack'):
            self.countdownTrack.pause()
            del self.countdownTrack
        if hasattr(self, 'countdownLbl'):
            self.countdownLbl.destroy()
            del self.countdownLbl

    def enterPlay(self):
        self.createTimer()
        self.firstPerson.reallyStart()

    def exitPlay(self):
        self.firstPerson.end()
        self.firstPerson.enableMouse()
        self.deleteTimer()
        base.localAvatar.createChatInput()
        base.localAvatar.chatInput.enableKeyboardShortcuts()
        DistributedMinigame.exitPlay(self)

    def createWorld(self):
        self.deleteWorld()
        self.maze = loader.loadModel('phase_4/models/minigames/maze_1player.bam')
        self.maze.find('**/maze_walls').setSz(1.5)
        self.maze.reparentTo(base.render)
        self.mazeCollModel = loader.loadModel('phase_4/models/minigames/maze_1player_collisions.egg')
        self.mazeCollModel.reparentTo(base.render)
        self.mazeCollModel.hide()
        self.mazeCollModel.setTransparency(1)
        self.mazeCollModel.setColorScale(1, 1, 1, 0)
        for node in self.mazeCollModel.findAllMatches('**'):
            node.setSz(1.5)

        self.sky = loader.loadModel('phase_3.5/models/props/TT_sky.bam')
        self.skyUtil = SkyUtil()
        self.skyUtil.startSky(self.sky)
        self.sky.reparentTo(base.camera)
        ce = CompassEffect.make(NodePath(), CompassEffect.PRot | CompassEffect.PZ)
        self.sky.node().setEffect(ce)
        self.spawnPoints.append((Point3(0, 0, 0), Vec3(0, 0, 0)))
        self.spawnPoints.append((Point3(-23.89, 18.58, 0.0), Vec3(90.0, 0.0, 0.0)))
        self.spawnPoints.append((Point3(-23.89, 6.3, 0.0), Vec3(0.0, 0.0, 0.0)))
        self.spawnPoints.append((Point3(23.78, 6.3, 0.0), Vec3(0.0, 0.0, 0.0)))
        self.spawnPoints.append((Point3(8.12, -17.79, 0.0), Vec3(270.0, 0.0, 0.0)))

    def deleteWorld(self):
        if self.maze:
            self.maze.removeNode()
            self.maze = None
        if self.mazeCollModel:
            self.mazeCollModel.removeNode()
            self.mazeCollModel = None
        if self.skyUtil:
            self.skyUtil.stopSky()
            self.skyUtil = None
        if self.sky:
            self.sky.removeNode()
            self.sky = None
        return

    def pickSpawnPoint(self):
        return random.choice(self.spawnPoints)

    def setSpawnPoint(self, index):
        pos, hpr = self.spawnPoints[index]
        base.localAvatar.setPos(pos)
        base.localAvatar.setHpr(hpr)

    def load(self):
        self.createWorld()
        self.setMinigameMusic('phase_6/audio/bgm/GS_Race_SS.mid')
        self.setDescription('Be the first to take 3 pictures of all the other Toons with your camera. ' + 'Use WASD to move and the mouse to look around. Press the left mouse button to take a picture. ' + 'Your camera takes some time to recharge after taking a picture. ' + 'You know you have a good shot when the view finder is green!')
        self.setWinnerPrize(30)
        self.setLoserPrize(15)
        base.render.hide()
        base.setBackgroundColor(0, 0, 0)
        DistributedMinigame.load(self)

    def announceGenerate(self):
        base.camLens.setMinFov(CIGlobals.GunGameFOV / (4.0 / 3.0))
        self.load()
        DistributedMinigame.announceGenerate(self)

    def disable(self):
        if self.thisPlayerWinsLbl:
            self.thisPlayerWinsLbl.destroy()
            self.thisPlayerWinsLbl = None
        base.camera.reparentTo(render)
        base.camera.setPos(0, 0, 0)
        base.camera.setHpr(0, 0, 0)
        if self.myRemoteAvatar:
            self.myRemoteAvatar.cleanup()
            del self.myRemoteAvatar
        self.firstPerson.cleanup()
        del self.firstPerson
        self.deleteWorld()
        base.camLens.setMinFov(CIGlobals.DefaultCameraFov / (4.0 / 3.0))
        DistributedMinigame.disable(self)
        return
예제 #10
0
class TTCHood:
    
    def __init__(self, cr):
        self.cr = cr
        self.dnaStore = DNAStorage()
        self.isLoaded = 0
        self.suitEffectEnabled = False
        self.amblight = None
        self.ambNode = None
        self.sky = None
        self.skyTrack = None
        self.skySeq = None
        self.lightTrack = None
        self.skyUtil = SkyUtil()
        
    def createHood(self, loadStorage = 1, AI = 0):
        if loadStorage:
            loadDNAFile(self.dnaStore, "phase_4/dna/storage.dna")
            loadDNAFile(self.dnaStore, "phase_4/dna/storage_TT.dna")
            loadDNAFile(self.dnaStore, "phase_4/dna/storage_TT_sz.dna")
            loadDNAFile(self.dnaStore, "phase_5/dna/storage_town.dna")
            loadDNAFile(self.dnaStore, "phase_5/dna/storage_TT_town.dna")
        self.node = loadDNAFile(self.dnaStore, "phase_4/dna/toontown_central_sz.dna")
        if self.node.getNumParents() == 1:
            self.geom = NodePath(self.node.getParent(0))
            self.geom.reparentTo(hidden)
        else:
            self.geom = hidden.attachNewNode(self.node)
        gsg = base.win.getGsg()
        if gsg:
            self.geom.prepareScene(gsg)
        self.geom.setName('toontown_central')
        
        self.geom.find('**/hill').setTransparency(TransparencyAttrib.MBinary, 1)
        self.createSky("tt")
        base.hoodBGM = base.loadMusic("phase_4/audio/bgm/TC_nbrhood.ogg")
        base.hoodBGM.setVolume(0.25)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        
        self.clerk_node = render.attach_new_node('clerk_node')
        self.clerk_node.set_pos(-80, -85.57, 0.5)
        self.clerk_node.set_h(165.07)
        
        self.geom.find('**/toontown_central').setCollideMask(BitMask32.allOff())
        self.geom.find('**/coll_sidewalk').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/collision_1').node().setIntoCollideMask(CIGlobals.WallBitmask)
        self.geom.find('**/coll_mainFoolr').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/left_ear').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/right_ear').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_bridge_floor').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_bridge').node().setIntoCollideMask(CIGlobals.WallBitmask)
        self.geom.find('**/coll_r_stair').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_l_stair_2').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_l_stairend_1').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_r_satirend_1').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_plaza').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_hedges').node().setIntoCollideMask(CIGlobals.WallBitmask)
        
        self.coll_list = ['coll_sidewalk', 'collision_1', 'coll_mainFoolr', 'left_ear', 'right_ear', 'coll_bridge_floor', 'coll_bridge', 'coll_r_stair',
                        'coll_l_stair_2', 'coll_l_stairend_1', 'coll_r_stairend_1', 'coll_plaza', 'coll_hedges']
        self.geom.reparentTo(render)
        
        self.telescope = Actor(self.geom.find('**/*animated_prop_HQTelescopeAnimatedProp*'),
                            {"chan": "phase_3.5/models/props/HQ_telescope-chan.bam"}, copy=0)
        self.telescope.reparentTo(self.geom.find('**/*toon_landmark_hqTT*'))
        self.createLights(1, 1, 1)
        
        #if AI:
        #    self.createTrolley()
        
        taskMgr.add(self.telescopeTask, "telescopeTask")
        self.isLoaded = 1
        messenger.send("loadedHood")
        
    def createLights(self, r, g, b, startColor=1, fade=0):
        self.deleteLights()
        self.amblight = AmbientLight("amblight")
        self.amblight.setColor(VBase4(r, g, b, 1))
        self.ambNode = render.attachNewNode(self.amblight)
        render.setLight(self.ambNode)
        if fade:
            self.lightTrack = LerpFunc(self.setLightColor,
                                fromData=startColor,
                                toData=r,
                                duration=2.5,
                                blendType="easeInOut")
            self.lightTrack.start()
            self.skyTrack = LerpColorInterval(self.sky,
                                        color=VBase4(r + 0.4, g + 0.4, b + 0.4, 1.0),
                                        startColor=VBase4(startColor, startColor, startColor, 1.0),
                                        duration=1.5)
            self.skyTrack.start()
            sky = "tt"
            if r < 0.6:
                sky = "br"
            self.skySeq = Sequence(Wait(1.5), Func(self.createSky, sky))
            self.skySeq.start()
            
    def createSky(self, sky):
        self.deleteSky()
        skyPath = "phase_3.5/models/props/" + sky.upper() + "_sky.bam"
        self.sky = loader.loadModel(skyPath)
        self.sky.reparentTo(self.geom)
        self.sky.setPos(9.15527e-005, -1.90735e-006, 2.6226e-006)
        self.sky.setH(-90)
        if sky == "tt":
            self.skyUtil.startSky(self.sky)
            
    def deleteSky(self):
        self.skyUtil.stopSky()
        if self.sky:
            self.sky.removeNode()
            self.sky = None
        if self.lightTrack:
            self.lightTrack.pause()
            self.lightTrack = None
        if self.skyTrack:
            self.skyTrack.pause()
            self.skyTrack = None
        if self.skySeq:
            self.skySeq.pause()
            self.skySeq = None
            
    def setLightColor(self, color):
        self.amblight.setColor(VBase4(color, color, color, 1))
        
    def deleteLights(self):
        if self.ambNode:
            render.clearLight(self.ambNode)
            self.ambNode.removeNode()
            self.ambNode = None
        
    def telescopeTask(self, task):
        if not self.isLoaded:
            return task.done
        self.telescope.play("chan")
        task.delayTime = 12
        return task.again
        
    def enableSuitEffect(self, size):
        self.createLights(0.4, 0.4, 0.4, startColor=1, fade=1)
        
        self.fogNode = Fog("fog")
        self.fogNode.setColor(0.3, 0.3, 0.3)
        self.fogNode.setExpDensity(0.0025)
        render.setFog(self.fogNode)
        
        base.hoodBGM.stop()
        song = random.randint(1, 4)
        base.hoodBGM = base.loadMusic("phase_3.5/audio/bgm/encntr_general_bg.ogg")
        base.hoodBGM.setVolume(0.7)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        
        self.suitEffectEnabled = True
        
    def bossSpawned(self):
        base.hoodBGM.stop()
        base.hoodBGM = base.loadMusic("phase_7/audio/bgm/encntr_suit_winning_indoor.ogg")
        base.hoodBGM.setVolume(0.7)
        base.hoodBGM.setLoop(True)
        Sequence(Wait(0.5), Func(base.hoodBGM.play)).start()
        
    def disableSuitEffect(self):
        self.createLights(1, 1, 1)
        self.createSky("tt")
        #render.clearFog()
        
        base.hoodBGM.stop()
        base.hoodBGM = base.loadMusic("phase_4/audio/bgm/TC_nbrhood.ogg")
        base.hoodBGM.setVolume(0.25)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        
        self.suitEffectEnabled = False
        
    def unloadHood(self):
        self.isLoaded = 0
        if self.suitEffectEnabled:
            self.disableSuitEffect()
        self.deleteSky()
        self.deleteLights()
        self.geom.remove()
        self.clerk_node.remove_node()
        base.hoodBGM.stop()
예제 #11
0
class DistributedRaceGame(DistributedMinigame.DistributedMinigame):

    def __init__(self, cr):
        try:
            self.DistributedRaceGame_initialized
            return
        except:
            self.DistributedRaceGame_initialized = 1

        DistributedMinigame.DistributedMinigame.__init__(self, cr)
        self.movement = RaceGameMovement.RaceGameMovement(base.localAvatar)
        self.skyUtil = SkyUtil()
        self.raceFSM = ClassicFSM('DistributedRaceGame', [State('race', self.enterRace, self.exitRace), State('raceTransition', self.enterRaceTransition, self.exitRaceTransition), State('off', self.enterRaceOff, self.exitRaceOff)], 'off', 'off')
        self.raceFSM.enterInitialState()
        self.cr = cr
        self.track = None
        self.sky = None
        self.countSfx = base.loadSfx('phase_5/audio/sfx/firehydrant_popup.mp3')
        self.goSfx = base.loadSfx('phase_4/audio/sfx/AA_sound_whistle.mp3')
        self.game = CIGlobals.RaceGame
        self.trackPath = 'phase_4/models/minigames/sprint_track.egg'
        self.skyPath = 'phase_3.5/models/props/TT_sky.bam'
        self.lanePos = [(-22.0, -205.0, 0.0),
         (-11.66, -205.0, 0.0),
         (0.0, -205.0, 0.0),
         (-33.66, -205.0, 0.0)]
        self.initialCamPos = {'pos': (41.1, -145.0, 25.88),
         'hpr': (135.0, 345.96, 0.0)}
        self.raceCamPos = (-24.52, -37.22, 25.0)
        self.lane = 0
        return

    def load(self):
        self.deleteWorld()
        self.track = loader.loadModel(self.trackPath)
        self.track.reparentTo(render)
        self.sky = loader.loadModel(self.skyPath)
        self.sky.reparentTo(self.track)
        self.skyUtil.startSky(self.sky)
        self.setMinigameMusic('phase_4/audio/bgm/MG_toontag.mid')
        self.setDescription('Tap the left and right arrow keys repeatedly, in turns, as fast as ' + 'you can to win the race! Every time your power bar hits the top, the boost bar starts' + ' to fill. When the boost bar is full, press CTRL to boost for a few seconds.')
        self.setWinnerPrize(20)
        self.setLoserPrize(5)
        self.d_requestToonLane()
        camera.reparentTo(render)
        camera.setPos(self.initialCamPos['pos'])
        camera.setHpr(self.initialCamPos['hpr'])
        DistributedMinigame.DistributedMinigame.load(self)

    def enterPlay(self):
        DistributedMinigame.DistributedMinigame.enterPlay(self)
        self.raceFSM.request('raceTransition')

    def exitPlay(self):
        DistributedMinigame.DistributedMinigame.exitPlay(self)
        self.raceFSM.request('off')

    def enterRace(self):
        self.startMovement()

    def exitRace(self):
        self.stopMovement()

    def enterRaceOff(self):
        pass

    def exitRaceOff(self):
        pass

    def enterRaceTransition(self):
        self.raceTrans = Sequence(Wait(0.5), Func(self.moveCameraToToon), Wait(4.5), Func(self.moveCameraToTop), Wait(4.5), Func(self.startCountdown))
        self.raceTrans.start()

    def exitRaceTransition(self):
        self.raceTrans.pause()
        del self.raceTrans

    def startMovement(self):
        self.movement.createGui()
        self.movement.fsm.request('run')

    def enterGameOver(self, winner = 0, winnerDoId = 0, allPrize = 0):
        self.raceFSM.request('off')
        DistributedMinigame.DistributedMinigame.enterGameOver(self, winner, winnerDoId, allPrize)

    def stopMovement(self):
        self.movement.cleanup()
        self.movement.deleteGui()

    def startCountdown(self):
        """ Start the countdown to the start of the race. """
        self.countdownLbl = DirectLabel(text='', text_scale=0.3, text_font=CIGlobals.getMickeyFont(), text_fg=(1, 1, 0, 1), pos=(0, 0, 0.5))
        Sequence(Func(self.setCountdownText, '3'), Wait(1.0), Func(self.setCountdownText, '2'), Wait(1.0), Func(self.setCountdownText, '1'), Wait(1.0), Func(self.setCountdownText, 'GO!'), Wait(1.5), Func(self.deleteCountdownLabel)).start()

    def setCountdownText(self, number):
        self.countdownLbl['text'] = number
        if number == 'GO!':
            self.countdownLbl['text_fg'] = (0, 1, 0, 1)
            self.goSfx.play()
            self.raceFSM.request('race')
        else:
            self.countSfx.play()

    def deleteCountdownLabel(self):
        self.countdownLbl.destroy()
        del self.countdownLbl

    def moveCameraToToon(self):
        camPInt = LerpPosInterval(camera, duration=3.0, pos=self.localAv.getPos(render) + (0, 15, 3), startPos=camera.getPos(render), blendType='easeInOut')
        camQInt = camera.quatInterval(3.0, hpr=Vec3(180, 0, 0), blendType='easeInOut')
        camPInt.start()
        camQInt.start()

    def moveCameraToTop(self):
        camera.setPos(camera.getPos(self.localAv))
        camera.reparentTo(self.localAv)
        oldPos = camera.getPos()
        camera.setPos(self.raceCamPos)
        oldHpr = camera.getHpr()
        camera.lookAt(self.localAv.getPart('head'))
        newHpr = camera.getHpr()
        camera.setHpr(oldHpr)
        camera.setPos(oldPos)
        camPInt = LerpPosInterval(camera, duration=3.0, pos=self.raceCamPos, startPos=oldPos, blendType='easeInOut')
        camQInt = camera.quatInterval(3.0, hpr=newHpr, blendType='easeInOut')
        camPInt.start()
        camQInt.start()

    def deleteWorld(self):
        if self.track:
            self.track.removeNode()
            self.track = None
        if self.sky:
            self.skyUtil.stopSky()
            self.sky.removeNode()
            self.sky = None
        return

    def setToonLane(self, lane):
        self.lane = lane
        base.localAvatar.setPos(self.lanePos[lane])
        base.localAvatar.setHpr(0, 0, 0)

    def getToonLane(self):
        return self.lane

    def d_requestToonLane(self):
        self.sendUpdate('requestToonLane', [])

    def announceGenerate(self):
        DistributedMinigame.DistributedMinigame.announceGenerate(self)
        self.load()

    def disable(self):
        DistributedMinigame.DistributedMinigame.disable(self)
        self.deleteWorld()
        self.raceFSM.requestFinalState()
        del self.raceFSM
        self.countSfx = None
        self.goSfx = None
        return
예제 #12
0
파일: TTCHood.py 프로젝트: coginvasion/src
class TTCHood:

    def __init__(self, cr):
        self.cr = cr
        self.dnaStore = DNAStorage()
        self.isLoaded = 0
        self.suitEffectEnabled = False
        self.amblight = None
        self.ambNode = None
        self.sky = None
        self.skyTrack = None
        self.skySeq = None
        self.lightTrack = None
        self.skyUtil = SkyUtil()
        return

    def createHood(self, loadStorage = 1, AI = 0):
        if loadStorage:
            loadDNAFile(self.dnaStore, 'phase_4/dna/storage.dna')
            loadDNAFile(self.dnaStore, 'phase_4/dna/storage_TT.dna')
            loadDNAFile(self.dnaStore, 'phase_4/dna/storage_TT_sz.dna')
            loadDNAFile(self.dnaStore, 'phase_5/dna/storage_town.dna')
            loadDNAFile(self.dnaStore, 'phase_5/dna/storage_TT_town.dna')
        self.node = loadDNAFile(self.dnaStore, 'phase_4/dna/toontown_central_sz.dna')
        if self.node.getNumParents() == 1:
            self.geom = NodePath(self.node.getParent(0))
            self.geom.reparentTo(hidden)
        else:
            self.geom = hidden.attachNewNode(self.node)
        gsg = base.win.getGsg()
        if gsg:
            self.geom.prepareScene(gsg)
        self.geom.setName('toontown_central')
        self.geom.find('**/hill').setTransparency(TransparencyAttrib.MBinary, 1)
        self.createSky('tt')
        base.hoodBGM = base.loadMusic('phase_4/audio/bgm/TC_nbrhood.ogg')
        base.hoodBGM.setVolume(0.25)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        self.clerk_node = render.attach_new_node('clerk_node')
        self.clerk_node.set_pos(-80, -85.57, 0.5)
        self.clerk_node.set_h(165.07)
        self.geom.find('**/toontown_central').setCollideMask(BitMask32.allOff())
        self.geom.find('**/coll_sidewalk').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/collision_1').node().setIntoCollideMask(CIGlobals.WallBitmask)
        self.geom.find('**/coll_mainFoolr').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/left_ear').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/right_ear').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_bridge_floor').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_bridge').node().setIntoCollideMask(CIGlobals.WallBitmask)
        self.geom.find('**/coll_r_stair').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_l_stair_2').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_l_stairend_1').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_r_satirend_1').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_plaza').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_hedges').node().setIntoCollideMask(CIGlobals.WallBitmask)
        self.coll_list = ['coll_sidewalk',
         'collision_1',
         'coll_mainFoolr',
         'left_ear',
         'right_ear',
         'coll_bridge_floor',
         'coll_bridge',
         'coll_r_stair',
         'coll_l_stair_2',
         'coll_l_stairend_1',
         'coll_r_stairend_1',
         'coll_plaza',
         'coll_hedges']
        self.geom.reparentTo(render)
        self.telescope = Actor(self.geom.find('**/*animated_prop_HQTelescopeAnimatedProp*'), {'chan': 'phase_3.5/models/props/HQ_telescope-chan.bam'}, copy=0)
        self.telescope.reparentTo(self.geom.find('**/*toon_landmark_hqTT*'))
        self.createLights(1, 1, 1)
        taskMgr.add(self.telescopeTask, 'telescopeTask')
        self.isLoaded = 1
        messenger.send('loadedHood')

    def createLights(self, r, g, b, startColor = 1, fade = 0):
        self.deleteLights()
        self.amblight = AmbientLight('amblight')
        self.amblight.setColor(VBase4(r, g, b, 1))
        self.ambNode = render.attachNewNode(self.amblight)
        render.setLight(self.ambNode)
        if fade:
            self.lightTrack = LerpFunc(self.setLightColor, fromData=startColor, toData=r, duration=2.5, blendType='easeInOut')
            self.lightTrack.start()
            self.skyTrack = LerpColorInterval(self.sky, color=VBase4(r + 0.4, g + 0.4, b + 0.4, 1.0), startColor=VBase4(startColor, startColor, startColor, 1.0), duration=1.5)
            self.skyTrack.start()
            sky = 'tt'
            if r < 0.6:
                sky = 'br'
            self.skySeq = Sequence(Wait(1.5), Func(self.createSky, sky))
            self.skySeq.start()

    def createSky(self, sky):
        self.deleteSky()
        skyPath = 'phase_3.5/models/props/' + sky.upper() + '_sky.bam'
        self.sky = loader.loadModel(skyPath)
        self.sky.reparentTo(self.geom)
        self.sky.setPos(9.15527e-05, -1.90735e-06, 2.6226e-06)
        self.sky.setH(-90)
        if sky == 'tt':
            self.skyUtil.startSky(self.sky)

    def deleteSky(self):
        self.skyUtil.stopSky()
        if self.sky:
            self.sky.removeNode()
            self.sky = None
        if self.lightTrack:
            self.lightTrack.pause()
            self.lightTrack = None
        if self.skyTrack:
            self.skyTrack.pause()
            self.skyTrack = None
        if self.skySeq:
            self.skySeq.pause()
            self.skySeq = None
        return

    def setLightColor(self, color):
        self.amblight.setColor(VBase4(color, color, color, 1))

    def deleteLights(self):
        if self.ambNode:
            render.clearLight(self.ambNode)
            self.ambNode.removeNode()
            self.ambNode = None
        return

    def telescopeTask(self, task):
        if not self.isLoaded:
            return task.done
        self.telescope.play('chan')
        task.delayTime = 12
        return task.again

    def createTrolley(self):
        self.trolley = TrolleyBase(self.cr)

    def enableSuitEffect(self, size):
        self.createLights(0.4, 0.4, 0.4, startColor=1, fade=1)
        self.fogNode = Fog('fog')
        self.fogNode.setColor(0.3, 0.3, 0.3)
        self.fogNode.setExpDensity(0.0025)
        render.setFog(self.fogNode)
        base.hoodBGM.stop()
        song = random.randint(1, 4)
        base.hoodBGM = base.loadMusic('phase_3.5/audio/bgm/encntr_general_bg.ogg')
        base.hoodBGM.setVolume(0.7)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        self.suitEffectEnabled = True

    def bossSpawned(self):
        base.hoodBGM.stop()
        base.hoodBGM = base.loadMusic('phase_7/audio/bgm/encntr_suit_winning_indoor.ogg')
        base.hoodBGM.setVolume(0.7)
        base.hoodBGM.setLoop(True)
        Sequence(Wait(0.5), Func(base.hoodBGM.play)).start()

    def disableSuitEffect(self):
        self.createLights(1, 1, 1)
        self.createSky('tt')
        base.hoodBGM.stop()
        base.hoodBGM = base.loadMusic('phase_4/audio/bgm/TC_nbrhood.ogg')
        base.hoodBGM.setVolume(0.25)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        self.suitEffectEnabled = False

    def unloadHood(self):
        self.isLoaded = 0
        if self.suitEffectEnabled:
            self.disableSuitEffect()
        self.deleteSky()
        self.deleteLights()
        self.geom.remove()
        self.clerk_node.remove_node()
        base.hoodBGM.stop()