示例#1
0
    def announceGenerate(self):
        """
        announceGenerate is called after all of the required fields are
        filled in
        """
        DistributedObject.DistributedObject.announceGenerate(self)
        self.notify.debug("BASE: announceGenerate %s" % self.activityName)
        # update root's name and position within the party grounds
        self.root.setName(self.activityName + "Root")
        centeredX, centeredY = getCenterPosFromGridSize(
            self.x, self.y,
            PartyGlobals.ActivityInformationDict[self.activityId]["gridsize"])
        self.root.setPos(centeredX, centeredY, 0.0)
        self.root.setH(self.h)

        # if this flag is set to zero, we won't notify the server that
        # we've left at the end of the activity
        self.normalExit = True

        if self.wantLever:
            self.leverTriggerEvent = self.uniqueName('leverTriggerEvent')
        self.load()

        def cleanup(self=self):
            self.notify.debug("BASE: cleanup: normalExit=%s" % self.normalExit)

            # make sure we clear the screen
            base.cr.renderFrame()

            # If we didn't abort, tell the AI we are exiting
            if self.normalExit:
                self.sendUpdate("toonExitRequest")

        self.cleanupActions.append(cleanup)
    def announceGenerate(self):
        DistributedObject.DistributedObject.announceGenerate(self)
        self.notify.debug('BASE: announceGenerate %s' % self.activityName)
        self.root.setName(self.activityName + 'Root')
        centeredX, centeredY = getCenterPosFromGridSize(self.x, self.y, PartyGlobals.ActivityInformationDict[self.activityId]['gridsize'])
        self.root.setPos(centeredX, centeredY, 0.0)
        self.root.setH(self.h)
        self.normalExit = True
        if self.wantLever:
            self.leverTriggerEvent = self.uniqueName('leverTriggerEvent')
        self.load()

        def cleanup(self = self):
            self.notify.debug('BASE: cleanup: normalExit=%s' % self.normalExit)
            base.cr.renderFrame()
            if self.normalExit:
                self.sendUpdate('toonExitRequest')

        self.cleanupActions.append(cleanup)
    def announceGenerate(self):
        DistributedObject.DistributedObject.announceGenerate(self)
        self.notify.debug('BASE: announceGenerate %s' % self.activityName)
        self.root.setName(self.activityName + 'Root')
        centeredX, centeredY = getCenterPosFromGridSize(self.x, self.y, PartyGlobals.ActivityInformationDict[self.activityId]['gridsize'])
        self.root.setPos(centeredX, centeredY, 0.0)
        self.root.setH(self.h)
        self.normalExit = True
        if self.wantLever:
            self.leverTriggerEvent = self.uniqueName('leverTriggerEvent')
        self.load()

        def cleanup(self = self):
            self.notify.debug('BASE: cleanup: normalExit=%s' % self.normalExit)
            base.cr.renderFrame()
            if self.normalExit:
                self.sendUpdate('toonExitRequest')

        self.cleanupActions.append(cleanup)
示例#4
0
    def __init__(self, name, x, y, h):
        NodePath.__init__(self, name)
        self.name = name
        decorId = PartyGlobals.DecorationIds.fromString(name)
        centerX, centerY = getCenterPosFromGridSize(
            x, y, PartyGlobals.DecorationInformationDict[decorId]['gridsize'])
        self.setPos(centerX, centerY, 0.0)
        self.setH(h)
        if self.name == 'CakeTower':
            self.partyCake = loader.loadModel(
                'phase_13/models/parties/tt_m_ara_pty_cakeTower')
            tntSeqNode = self.partyCake.find('**/seqNode_tnt').node()
            tntSeqNode.setFrameRate(20)
            self.partyCake.reparentTo(self)
        elif self.name == 'BannerJellyBean':
            partyBannerModel = loader.loadModel(
                'phase_13/models/parties/tt_m_ara_pty_bannerJellybean_model')
            banner = []
            banner1 = partyBannerModel.find('**/banner1')
            banner2 = partyBannerModel.find('**/banner2')
            temp = NodePath('Empty')
            banner1.reparentTo(temp)
            banner2.reparentTo(temp)
            banner.append(banner1)
            banner.append(banner2)
            self.partyBanner = Actor.Actor(partyBannerModel, {
                'float':
                'phase_13/models/parties/tt_m_ara_pty_bannerJellybean'
            })
            bannerSeqNodeParent = self.partyBanner.find('**/bannerJoint')
            bannerSeqNode = SequenceNode('banner')
            for bannerNode in banner:
                bannerSeqNode.addChild(bannerNode.node())

            temp.detachNode()
            del temp
            bannerSeqNodeParent.attachNewNode(bannerSeqNode)
            bannerSeqNode.setFrameRate(4)
            bannerSeqNode.loop(True)
            bannerSeqNode.setPlayRate(1)
            balloonLeft = self.partyBanner.find('**/balloonsLMesh')
            balloonRight = self.partyBanner.find('**/balloonsRMesh')
            balloonLeft.setBillboardAxis()
            balloonRight.setBillboardAxis()
            balloonLeftLocator = self.partyBanner.find('**/balloonJointL')
            balloonRightLocator = self.partyBanner.find('**/balloonJointR')
            balloonLeft.reparentTo(balloonLeftLocator)
            balloonRight.reparentTo(balloonRightLocator)
            self.partyBanner.loop('float')
            self.partyBanner.reparentTo(self)
        elif self.name == 'GagGlobe':
            self.partyGlobe = Actor.Actor(
                'phase_13/models/parties/tt_m_ara_pty_gagGlobe_model',
                {'idle': 'phase_13/models/parties/tt_m_ara_pty_gagGlobe'})
            self.partyGlobe.setBillboardAxis()
            confettiLocator = self.partyGlobe.find('**/uvj_confetti')
            confettiMesh = self.partyGlobe.find('**/innerGlobeMesh')
            confettiMesh.setTexProjector(
                confettiMesh.findTextureStage('default'), confettiLocator,
                self.partyGlobe)
            collisionMesh = self.partyGlobe.find('**/collisionMesh')
            collisionMesh.hide()
            self.globeSphere = CollisionSphere(
                confettiMesh.getBounds().getCenter(),
                confettiMesh.getBounds().getRadius())
            self.globeSphere.setTangible(1)
            self.globeSphereNode = CollisionNode('gagGlobe' +
                                                 str(self.getPos()))
            self.globeSphereNode.setIntoCollideMask(
                ToontownGlobals.WallBitmask)
            self.globeSphereNode.addSolid(self.globeSphere)
            self.globeSphereNodePath = self.partyGlobe.attachNewNode(
                self.globeSphereNode)
            self.partyGlobe.loop('idle')
            self.partyGlobe.reparentTo(self)
        elif self.name == 'FlyingHeart':
            flyingHeartModel = loader.loadModel(
                'phase_13/models/parties/tt_m_ara_pty_heartWing_model')
            self.flyingHeart = Actor.Actor(
                flyingHeartModel,
                {'idle': 'phase_13/models/parties/tt_m_ara_pty_heartWing'})
            wingsSeqNodeParent = self.flyingHeart.find('**/heartWingJoint')
            collisionMesh = self.flyingHeart.find('**/collision_heartWing')
            collisionMesh.hide()
            self.globeSphere = CollisionSphere(
                collisionMesh.getBounds().getCenter(),
                collisionMesh.getBounds().getRadius())
            self.globeSphere.setTangible(1)
            self.globeSphereNode = CollisionNode('flyingHeart' +
                                                 str(self.getPos()))
            self.globeSphereNode.setIntoCollideMask(
                ToontownGlobals.WallBitmask)
            self.globeSphereNode.addSolid(self.globeSphere)
            self.globeSphereNodePath = self.flyingHeart.attachNewNode(
                self.globeSphereNode)
            self.globeSphereNodePath.reparentTo(wingsSeqNodeParent)
            wings = []
            wingsSeqNode = SequenceNode('wingsSeqNode')
            temp = NodePath('Empty')
            wing1 = self.flyingHeart.find('**/wing1')
            wing2 = self.flyingHeart.find('**/wing2')
            wing3 = self.flyingHeart.find('**/wing3')
            wing4 = self.flyingHeart.find('**/wing4')
            wing1.reparentTo(temp)
            wing2.reparentTo(temp)
            wing3.reparentTo(temp)
            wing4.reparentTo(temp)
            wings.append(wing1)
            wings.append(wing2)
            wings.append(wing3)
            wings.append(wing4)
            wingsSeqNode.addChild(wing1.node())
            wingsSeqNode.addChild(wing2.node())
            wingsSeqNode.addChild(wing3.node())
            wingsSeqNode.addChild(wing4.node())
            wingsSeqNode.addChild(wing3.node())
            wingsSeqNode.addChild(wing2.node())
            temp.detachNode()
            del temp
            wingsSeqNodeParent.attachNewNode(wingsSeqNode)
            wingsSeqNode.setFrameRate(12)
            wingsSeqNode.loop(True)
            wingsSeqNode.setPlayRate(1)
            self.flyingHeart.loop('idle')
            self.flyingHeart.reparentTo(self)
        elif self.name == 'HeartBanner':
            self.heartBanner = Actor.Actor(
                'phase_13/models/parties/tt_m_ara_pty_bannerValentine_model', {
                    'idle':
                    'phase_13/models/parties/tt_m_ara_pty_bannerValentine'
                })
            balloonLeft = self.heartBanner.find('**/balloonsL')
            balloonRight = self.heartBanner.find('**/balloonsR')
            balloonLeft.setBillboardAxis()
            balloonRight.setBillboardAxis()
            balloonLeftLocator = self.heartBanner.find('**/balloonJointL')
            balloonRightLocator = self.heartBanner.find('**/balloonJointR')
            balloonLeft.reparentTo(balloonLeftLocator)
            balloonRight.reparentTo(balloonRightLocator)
            self.heartBanner.loop('idle')
            self.heartBanner.reparentTo(self)
        elif self.name == 'Hydra' or self.name == 'StageWinter':
            if self.name == 'StageWinter':
                self.hydra = Actor.Actor(
                    'phase_13/models/parties/tt_r_ara_pty_winterProps', {
                        'dance':
                        'phase_13/models/parties/tt_a_ara_pty_hydra_dance'
                    })
            else:
                self.hydra = Actor.Actor(
                    'phase_13/models/parties/tt_a_ara_pty_hydra_default', {
                        'dance':
                        'phase_13/models/parties/tt_a_ara_pty_hydra_dance'
                    })
            st = random.randint(0, 10)
            animIval = ActorInterval(self.hydra, 'dance')
            animIvalDur = animIval.getDuration()
            self.decSfx = loader.loadSfx(
                'phase_13/audio/sfx/tt_s_ara_pty_propsShow_dance.ogg')
            soundIval = SoundInterval(self.decSfx,
                                      node=self.hydra,
                                      listenerNode=base.localAvatar,
                                      volume=PartyGlobals.DECORATION_VOLUME,
                                      cutOff=PartyGlobals.DECORATION_CUTOFF,
                                      duration=animIvalDur)
            self.animSeq = Parallel(animIval, soundIval)
            self.animSeq.loop(st)
            collisions = self.hydra.find('**/*collision*')
            collisions.setPos(0, 0, -5)
            self.hydra.flattenStrong()
            self.hydra.reparentTo(self)
            if self.name == 'StageWinter':
                stageBounds = self.hydra.find('**/stage').node().getBounds()
                self.hydra.node().setBounds(stageBounds)
                self.hydra.node().setFinal(1)
        elif self.name == 'TubeCogVictory':
            self.tubeCog = Actor.Actor(
                'phase_5.5/models/estate/tt_a_ara_pty_tubeCogVictory_default',
                {
                    'wave':
                    'phase_5.5/models/estate/tt_a_ara_pty_tubeCogVictory_wave'
                })
            st = random.randint(0, 10)
            animIval = ActorInterval(self.tubeCog, 'wave')
            animIvalDur = animIval.getDuration()
            self.decSfx = loader.loadSfx(
                'phase_13/audio/sfx/tt_s_ara_pty_tubeCogVictory_wave.ogg')
            soundIval = SoundInterval(self.decSfx,
                                      node=self.tubeCog,
                                      listenerNode=base.localAvatar,
                                      volume=PartyGlobals.DECORATION_VOLUME,
                                      cutOff=PartyGlobals.DECORATION_CUTOFF,
                                      duration=animIvalDur)
            self.animSeq = Parallel(animIval, soundIval)
            self.animSeq.loop()
            self.animSeq.setT(st)
            self.tubeCog.flattenStrong()
            self.tubeCog.reparentTo(self)
        elif self.name == 'BannerVictory':
            self.bannerVictory = Actor.Actor(
                'phase_13/models/parties/tt_m_ara_pty_bannerVictory_model',
                {'idle': 'phase_13/models/parties/tt_m_ara_pty_bannerVictory'})
            balloonLeft = self.bannerVictory.find('**/balloonsLMesh')
            balloonRight = self.bannerVictory.find('**/balloonsRMesh')
            balloonLeft.setBillboardAxis()
            balloonRight.setBillboardAxis()
            balloonLeftLocator = self.bannerVictory.find('**/balloonJointL')
            balloonRightLocator = self.bannerVictory.find('**/balloonJointR')
            balloonLeft.reparentTo(balloonLeftLocator)
            balloonRight.reparentTo(balloonRightLocator)
            self.bannerVictory.loop('idle')
            self.bannerVictory.reparentTo(self)
        elif self.name == 'CannonVictory':
            self.cannonVictory = Actor.Actor(
                'phase_13/models/parties/tt_m_ara_pty_cannonVictory_model',
                {'idle': 'phase_13/models/parties/tt_m_ara_pty_cannonVictory'})
            confettiLocator = self.cannonVictory.findAllMatches(
                '**/uvj_confetties')[1]
            confettiMesh = self.cannonVictory.find('**/confettis')
            confettiMesh.setTexProjector(
                confettiMesh.findTextureStage('default'), self.cannonVictory,
                confettiLocator)
            self.cannonVictory.flattenStrong()
            self.cannonVictory.loop('idle')
            self.cannonVictory.reparentTo(self)
        elif self.name == 'CogStatueVictory':
            self.decorationModel = loader.loadModel(
                'phase_13/models/parties/tt_m_ara_pty_cogDoodleVictory')
            self.decorationModel.reparentTo(self)
            self.decorationShadow = self.setupAnimSeq()
        elif self.name == 'CogIceCreamVictory':
            self.decorationModel = loader.loadModel(
                'phase_13/models/parties/tt_m_ara_pty_cogIceCreamVictory')
            self.decorationModel.reparentTo(self)
            self.decorationShadow = self.setupAnimSeq()
        elif self.name == 'cogIceCreamWinter':
            self.decorationModel = loader.loadModel(
                'phase_13/models/parties/tt_m_ara_pty_cogIceCreamWinter')
            self.decorationModel.reparentTo(self)
            self.decorationShadow = self.setupAnimSeq()
        elif self.name == 'CogStatueWinter':
            self.decorationModel = loader.loadModel(
                'phase_13/models/parties/tt_m_ara_pty_cogDoodleWinter')
            self.decorationModel.reparentTo(self)
            self.decorationShadow = self.setupAnimSeq()
        elif self.name == 'snowman':
            self.decorationModel = loader.loadModel(
                'phase_13/models/estate/tt_m_prp_ext_snowman')
            self.decorationModel.reparentTo(self)
            self.decorationModel.find('**/growthStage_1').hide()
            self.decorationModel.find('**/growthStage_2').hide()
        elif self.name == 'snowDoodle':
            self.decorationModel = loader.loadModel(
                'phase_5.5/models/estate/tt_m_prp_ext_snowDoodle')
            self.decorationModel.reparentTo(self)
            self.decorationModel.find('**/growthStage_1').hide()
            self.decorationModel.find('**/growthStage_2').hide()
        else:
            self.decorationModels = loader.loadModel(
                'phase_4/models/parties/partyDecorations')
            self.decorationModels.copyTo(self)
            decors = self.findAllMatches('**/partyDecoration_*')
            for i in xrange(decors.getNumPaths()):
                decPiece = decors.getPath(i)
                n = decPiece.getName()
                if n.endswith('shadow') or n.endswith('base') or n.endswith(
                        'collision') or n.endswith(name):
                    pass
                else:
                    decPiece.reparentTo(hidden)

        self.reparentTo(base.cr.playGame.hood.loader.geom)
示例#5
0
    def __init__(self, name, x, y, h):
        NodePath.__init__(self, name)

        self._name = name
        decorId = PartyGlobals.DecorationIds.fromString(name)
        centerX, centerY = getCenterPosFromGridSize(
            x, y, PartyGlobals.DecorationInformationDict[decorId]["gridsize"])
        self.setPos(centerX, centerY, 0.0)
        self.setH(h)

        if self._name == "CakeTower":
            self.partyCake = loader.loadModel(
                "phase_13/models/parties/tt_m_ara_pty_cakeTower")

            tntSeqNode = self.partyCake.find("**/seqNode_tnt").node()
            tntSeqNode.setFrameRate(20)
            self.partyCake.reparentTo(self)

        elif self._name == "BannerJellyBean":
            partyBannerModel = loader.loadModel(
                "phase_13/models/parties/tt_m_ara_pty_bannerJellybean_model")

            banner = []
            banner1 = partyBannerModel.find("**/banner1")
            banner2 = partyBannerModel.find("**/banner2")
            temp = NodePath("Empty")
            banner1.reparentTo(temp)
            banner2.reparentTo(temp)
            banner.append(banner1)
            banner.append(banner2)

            self.partyBanner = Actor.Actor(partyBannerModel, \
                                          {'float' : "phase_13/models/parties/tt_m_ara_pty_bannerJellybean",})
            bannerSeqNodeParent = self.partyBanner.find("**/bannerJoint")
            bannerSeqNode = SequenceNode('banner')
            for bannerNode in banner:
                bannerSeqNode.addChild(bannerNode.node())

            temp.detachNode()
            del temp

            bannerSeqNodeParent.attachNewNode(bannerSeqNode)
            bannerSeqNode.setFrameRate(4)
            bannerSeqNode.loop(True)
            bannerSeqNode.setPlayRate(1)

            balloonLeft = self.partyBanner.find("**/balloonsLMesh")
            balloonRight = self.partyBanner.find("**/balloonsRMesh")
            balloonLeft.setBillboardAxis()
            balloonRight.setBillboardAxis()

            # axis = loader.loadModel("models/misc/xyzAxis")
            # axis.reparentTo(balloonLeft)

            balloonLeftLocator = self.partyBanner.find("**/balloonJointL")
            balloonRightLocator = self.partyBanner.find("**/balloonJointR")
            balloonLeft.reparentTo(balloonLeftLocator)
            balloonRight.reparentTo(balloonRightLocator)

            self.partyBanner.loop("float")
            self.partyBanner.reparentTo(self)

        elif self._name == "GagGlobe":
            self.partyGlobe = Actor.Actor("phase_13/models/parties/tt_m_ara_pty_gagGlobe_model", \
                                    {'idle' : 'phase_13/models/parties/tt_m_ara_pty_gagGlobe',})

            self.partyGlobe.setBillboardAxis()
            confettiLocator = self.partyGlobe.find("**/uvj_confetti")
            confettiMesh = self.partyGlobe.find("**/innerGlobeMesh")
            confettiMesh.setTexProjector(
                confettiMesh.findTextureStage("default"), confettiLocator,
                self.partyGlobe)

            collisionMesh = self.partyGlobe.find("**/collisionMesh")
            collisionMesh.hide()

            self.globeSphere = CollisionSphere(confettiMesh.getBounds().getCenter(), \
                                                                confettiMesh.getBounds().getRadius())
            self.globeSphere.setTangible(1)
            self.globeSphereNode = CollisionNode("gagGlobe" +
                                                 str(self.getPos()))
            self.globeSphereNode.setIntoCollideMask(
                ToontownGlobals.WallBitmask)
            self.globeSphereNode.addSolid(self.globeSphere)
            self.globeSphereNodePath = self.partyGlobe.attachNewNode(
                self.globeSphereNode)

            # cakeLocator = partyGlobe.find("**/uvj_cake")
            # cakeMesh = partyGlobe.find("**/cakeMesh")
            # cakeMesh.reparentTo(cakeLocator)

            # pieLocator = partyGlobe.find("**/uvj_pie")
            # pieMesh = partyGlobe.find("**/pieMesh")
            # pieMesh.reparentTo(pieLocator)

            # seltzerBottleLocator = partyGlobe.find("**/uvj_seltzerBottle")
            # seltzerBottleMesh = partyGlobe.find("**/seltzerBottleMesh")
            # seltzerBottleMesh.reparentTo(seltzerBottleLocator)

            # megaphoneLocator = partyGlobe.find("**/uvj_megaphone")
            # megaphoneMesh = partyGlobe.find("**/megaphoneMesh")
            # megaphoneMesh.reparentTo(megaphoneLocator)

            # balloonsLocator = partyGlobe.find("**/uvj_balloons1")
            # balloonsMesh = partyGlobe.find("**/balloonsMesh")
            # balloonsMesh.reparentTo(balloonsLocator)

            self.partyGlobe.loop('idle')
            self.partyGlobe.reparentTo(self)

        elif self._name == "FlyingHeart":
            flyingHeartModel = loader.loadModel(
                "phase_13/models/parties/tt_m_ara_pty_heartWing_model")
            self.flyingHeart = Actor.Actor(flyingHeartModel, \
                                    {'idle' : 'phase_13/models/parties/tt_m_ara_pty_heartWing',})
            wingsSeqNodeParent = self.flyingHeart.find("**/heartWingJoint")

            # Setup the collision in code, because the collision flag set on
            # collision_heartWing in Maya doesn't carry through if imported as an actor.
            collisionMesh = self.flyingHeart.find("**/collision_heartWing")
            collisionMesh.hide()
            self.globeSphere = CollisionSphere(
                collisionMesh.getBounds().getCenter(),
                collisionMesh.getBounds().getRadius())
            self.globeSphere.setTangible(1)
            self.globeSphereNode = CollisionNode("flyingHeart" +
                                                 str(self.getPos()))
            self.globeSphereNode.setIntoCollideMask(
                ToontownGlobals.WallBitmask)
            self.globeSphereNode.addSolid(self.globeSphere)
            self.globeSphereNodePath = self.flyingHeart.attachNewNode(
                self.globeSphereNode)
            self.globeSphereNodePath.reparentTo(wingsSeqNodeParent)

            # Setup the Sequence Node in code. Same reason - The Sequence Node flag
            # gets lost if imported as an actor.
            wings = []

            wingsSeqNode = SequenceNode('wingsSeqNode')
            temp = NodePath("Empty")

            wing1 = self.flyingHeart.find("**/wing1")
            wing2 = self.flyingHeart.find("**/wing2")
            wing3 = self.flyingHeart.find("**/wing3")
            wing4 = self.flyingHeart.find("**/wing4")

            wing1.reparentTo(temp)
            wing2.reparentTo(temp)
            wing3.reparentTo(temp)
            wing4.reparentTo(temp)

            wings.append(wing1)
            wings.append(wing2)
            wings.append(wing3)
            wings.append(wing4)

            wingsSeqNode.addChild(wing1.node())
            wingsSeqNode.addChild(wing2.node())
            wingsSeqNode.addChild(wing3.node())
            wingsSeqNode.addChild(wing4.node())
            wingsSeqNode.addChild(wing3.node())
            wingsSeqNode.addChild(wing2.node())

            temp.detachNode()
            del temp

            wingsSeqNodeParent.attachNewNode(wingsSeqNode)
            wingsSeqNode.setFrameRate(12)
            wingsSeqNode.loop(True)
            wingsSeqNode.setPlayRate(1)

            self.flyingHeart.loop('idle')
            self.flyingHeart.reparentTo(self)

        elif self._name == "HeartBanner":
            self.heartBanner = Actor.Actor("phase_13/models/parties/tt_m_ara_pty_bannerValentine_model", \
                                    {'idle' : 'phase_13/models/parties/tt_m_ara_pty_bannerValentine',})

            balloonLeft = self.heartBanner.find("**/balloonsL")
            balloonRight = self.heartBanner.find("**/balloonsR")
            balloonLeft.setBillboardAxis()
            balloonRight.setBillboardAxis()

            balloonLeftLocator = self.heartBanner.find("**/balloonJointL")
            balloonRightLocator = self.heartBanner.find("**/balloonJointR")
            balloonLeft.reparentTo(balloonLeftLocator)
            balloonRight.reparentTo(balloonRightLocator)

            self.heartBanner.loop('idle')
            self.heartBanner.reparentTo(self)

        elif self._name == "Hydra" or self.name == "StageWinter":

            if self.name == "StageWinter":
                self.hydra = Actor.Actor("phase_13/models/parties/tt_r_ara_pty_winterProps", \
                                                {"dance" : "phase_13/models/parties/tt_a_ara_pty_hydra_dance" })
            else:
                self.hydra = Actor.Actor("phase_13/models/parties/tt_a_ara_pty_hydra_default", \
                                                {'dance' : 'phase_13/models/parties/tt_a_ara_pty_hydra_dance' })
            st = random.randint(0, 10)
            animIval = ActorInterval(self.hydra, "dance")
            animIvalDur = animIval.getDuration()
            self.decSfx = loader.loadSfx(
                "phase_13/audio/sfx/tt_s_ara_pty_propsShow_dance.mp3")
            soundIval = SoundInterval(self.decSfx,
                                      node=self.hydra,
                                      listenerNode=base.localAvatar,
                                      volume=PartyGlobals.DECORATION_VOLUME,
                                      cutOff=PartyGlobals.DECORATION_CUTOFF,
                                      duration=animIvalDur)
            self.animSeq = Parallel(animIval, soundIval)

            self.animSeq.loop(st)

            collisions = self.hydra.find("**/*collision*")
            collisions.setPos(0, 0, -5)
            self.hydra.flattenStrong()
            self.hydra.reparentTo(self)

            if self.name == "StageWinter":
                stageBounds = self.hydra.find("**/stage").node().getBounds()
                self.hydra.node().setBounds(stageBounds)
                self.hydra.node().setFinal(1)

        elif self._name == "TubeCogVictory":
            self.tubeCog = Actor.Actor("phase_5.5/models/estate/tt_a_ara_pty_tubeCogVictory_default", \
                                            {'wave' : 'phase_5.5/models/estate/tt_a_ara_pty_tubeCogVictory_wave' })
            st = random.randint(0, 10)
            animIval = ActorInterval(self.tubeCog, "wave")
            animIvalDur = animIval.getDuration()
            self.decSfx = loader.loadSfx(
                "phase_13/audio/sfx/tt_s_ara_pty_tubeCogVictory_wave.mp3")
            soundIval = SoundInterval(self.decSfx,
                                      node=self.tubeCog,
                                      listenerNode=base.localAvatar,
                                      volume=PartyGlobals.DECORATION_VOLUME,
                                      cutOff=PartyGlobals.DECORATION_CUTOFF,
                                      duration=animIvalDur)
            self.animSeq = Parallel(animIval, soundIval)

            self.animSeq.loop()
            self.animSeq.setT(st)
            self.tubeCog.flattenStrong()
            self.tubeCog.reparentTo(self)

        elif self._name == "BannerVictory":
            self.bannerVictory = Actor.Actor("phase_13/models/parties/tt_m_ara_pty_bannerVictory_model", \
                                    {'idle' : 'phase_13/models/parties/tt_m_ara_pty_bannerVictory',})

            balloonLeft = self.bannerVictory.find("**/balloonsLMesh")
            balloonRight = self.bannerVictory.find("**/balloonsRMesh")
            balloonLeft.setBillboardAxis()
            balloonRight.setBillboardAxis()

            balloonLeftLocator = self.bannerVictory.find("**/balloonJointL")
            balloonRightLocator = self.bannerVictory.find("**/balloonJointR")
            balloonLeft.reparentTo(balloonLeftLocator)
            balloonRight.reparentTo(balloonRightLocator)

            self.bannerVictory.loop('idle')
            self.bannerVictory.reparentTo(self)

        elif self._name == "CannonVictory":
            self.cannonVictory = Actor.Actor("phase_13/models/parties/tt_m_ara_pty_cannonVictory_model", \
                                    {'idle' : 'phase_13/models/parties/tt_m_ara_pty_cannonVictory',})

            # NOTE: -expose uvj_confetties creates two nodes with this name: one dummy and one joint. Ignore the dummy.
            confettiLocator = self.cannonVictory.findAllMatches(
                "**/uvj_confetties")[1]
            assert confettiLocator and not confettiLocator.isEmpty()
            confettiMesh = self.cannonVictory.find("**/confettis")
            assert confettiMesh and not confettiMesh.isEmpty()

            confettiMesh.setTexProjector(
                confettiMesh.findTextureStage("default"), self.cannonVictory,
                confettiLocator)

            self.cannonVictory.flattenStrong()
            self.cannonVictory.loop('idle')
            self.cannonVictory.reparentTo(self)

        elif self._name == "CogStatueVictory":
            self.decorationModel = loader.loadModel(
                "phase_13/models/parties/tt_m_ara_pty_cogDoodleVictory")
            self.decorationModel.reparentTo(self)
            self.decorationShadow = self.setupAnimSeq()

        elif self._name == "CogIceCreamVictory":
            self.decorationModel = loader.loadModel(
                "phase_13/models/parties/tt_m_ara_pty_cogIceCreamVictory")
            self.decorationModel.reparentTo(self)
            self.decorationShadow = self.setupAnimSeq()

        elif self.name == "cogIceCreamWinter":
            self.decorationModel = loader.loadModel(
                "phase_13/models/parties/tt_m_ara_pty_cogIceCreamWinter")
            self.decorationModel.reparentTo(self)
            self.decorationShadow = self.setupAnimSeq()

        elif self.name == "CogStatueWinter":
            self.decorationModel = loader.loadModel(
                "phase_13/models/parties/tt_m_ara_pty_cogDoodleWinter")
            self.decorationModel.reparentTo(self)
            self.decorationShadow = self.setupAnimSeq()

        elif self.name == "snowman":
            self.decorationModel = loader.loadModel(
                "phase_13/models/estate/tt_m_prp_ext_snowman")
            self.decorationModel.reparentTo(self)
            self.decorationModel.find("**/growthStage_1").hide()
            self.decorationModel.find("**/growthStage_2").hide()

        elif self.name == "snowDoodle":
            self.decorationModel = loader.loadModel(
                'phase_5.5/models/estate/tt_m_prp_ext_snowDoodle')
            self.decorationModel.reparentTo(self)
            self.decorationModel.find("**/growthStage_1").hide()
            self.decorationModel.find("**/growthStage_2").hide()

        else:
            self.decorationModels = loader.loadModel(
                "phase_4/models/parties/partyDecorations")
            self.decorationModels.copyTo(self)
            decors = self.findAllMatches("**/partyDecoration_*")
            for i in range(decors.getNumPaths()):
                decPiece = decors.getPath(i)
                n = decPiece.getName()
                if n.endswith("shadow") or n.endswith("base") or n.endswith(
                        "collision") or n.endswith(name):
                    pass
                else:
                    decPiece.reparentTo(hidden)

        self.reparentTo(base.cr.playGame.hood.loader.geom)
    def __init__(self, name, x, y, h):
        NodePath.__init__(self, name)
        self.name = name
        decorId = PartyGlobals.DecorationIds.fromString(name)
        centerX, centerY = getCenterPosFromGridSize(x, y, PartyGlobals.DecorationInformationDict[decorId]['gridsize'])
        self.setPos(centerX, centerY, 0.0)
        self.setH(h)
        if self.name == 'CakeTower':
            self.partyCake = loader.loadModel('phase_13/models/parties/tt_m_ara_pty_cakeTower')
            tntSeqNode = self.partyCake.find('**/seqNode_tnt').node()
            tntSeqNode.setFrameRate(20)
            self.partyCake.reparentTo(self)
        elif self.name == 'BannerJellyBean':
            partyBannerModel = loader.loadModel('phase_13/models/parties/tt_m_ara_pty_bannerJellybean_model')
            banner = []
            banner1 = partyBannerModel.find('**/banner1')
            banner2 = partyBannerModel.find('**/banner2')
            temp = NodePath('Empty')
            banner1.reparentTo(temp)
            banner2.reparentTo(temp)
            banner.append(banner1)
            banner.append(banner2)
            self.partyBanner = Actor.Actor(partyBannerModel, {'float': 'phase_13/models/parties/tt_m_ara_pty_bannerJellybean'})
            bannerSeqNodeParent = self.partyBanner.find('**/bannerJoint')
            bannerSeqNode = SequenceNode('banner')
            for bannerNode in banner:
                bannerSeqNode.addChild(bannerNode.node())

            temp.detachNode()
            del temp
            bannerSeqNodeParent.attachNewNode(bannerSeqNode)
            bannerSeqNode.setFrameRate(4)
            bannerSeqNode.loop(True)
            bannerSeqNode.setPlayRate(1)
            balloonLeft = self.partyBanner.find('**/balloonsLMesh')
            balloonRight = self.partyBanner.find('**/balloonsRMesh')
            balloonLeft.setBillboardAxis()
            balloonRight.setBillboardAxis()
            balloonLeftLocator = self.partyBanner.find('**/balloonJointL')
            balloonRightLocator = self.partyBanner.find('**/balloonJointR')
            balloonLeft.reparentTo(balloonLeftLocator)
            balloonRight.reparentTo(balloonRightLocator)
            self.partyBanner.loop('float')
            self.partyBanner.reparentTo(self)
        elif self.name == 'GagGlobe':
            self.partyGlobe = Actor.Actor('phase_13/models/parties/tt_m_ara_pty_gagGlobe_model', {'idle': 'phase_13/models/parties/tt_m_ara_pty_gagGlobe'})
            self.partyGlobe.setBillboardAxis()
            confettiLocator = self.partyGlobe.find('**/uvj_confetti')
            confettiMesh = self.partyGlobe.find('**/innerGlobeMesh')
            confettiMesh.setTexProjector(confettiMesh.findTextureStage('default'), confettiLocator, self.partyGlobe)
            collisionMesh = self.partyGlobe.find('**/collisionMesh')
            collisionMesh.hide()
            self.globeSphere = CollisionSphere(confettiMesh.getBounds().getCenter(), confettiMesh.getBounds().getRadius())
            self.globeSphere.setTangible(1)
            self.globeSphereNode = CollisionNode('gagGlobe' + str(self.getPos()))
            self.globeSphereNode.setIntoCollideMask(ToontownGlobals.WallBitmask)
            self.globeSphereNode.addSolid(self.globeSphere)
            self.globeSphereNodePath = self.partyGlobe.attachNewNode(self.globeSphereNode)
            self.partyGlobe.loop('idle')
            self.partyGlobe.reparentTo(self)
        elif self.name == 'FlyingHeart':
            flyingHeartModel = loader.loadModel('phase_13/models/parties/tt_m_ara_pty_heartWing_model')
            self.flyingHeart = Actor.Actor(flyingHeartModel, {'idle': 'phase_13/models/parties/tt_m_ara_pty_heartWing'})
            wingsSeqNodeParent = self.flyingHeart.find('**/heartWingJoint')
            collisionMesh = self.flyingHeart.find('**/collision_heartWing')
            collisionMesh.hide()
            self.globeSphere = CollisionSphere(collisionMesh.getBounds().getCenter(), collisionMesh.getBounds().getRadius())
            self.globeSphere.setTangible(1)
            self.globeSphereNode = CollisionNode('flyingHeart' + str(self.getPos()))
            self.globeSphereNode.setIntoCollideMask(ToontownGlobals.WallBitmask)
            self.globeSphereNode.addSolid(self.globeSphere)
            self.globeSphereNodePath = self.flyingHeart.attachNewNode(self.globeSphereNode)
            self.globeSphereNodePath.reparentTo(wingsSeqNodeParent)
            wings = []
            wingsSeqNode = SequenceNode('wingsSeqNode')
            temp = NodePath('Empty')
            wing1 = self.flyingHeart.find('**/wing1')
            wing2 = self.flyingHeart.find('**/wing2')
            wing3 = self.flyingHeart.find('**/wing3')
            wing4 = self.flyingHeart.find('**/wing4')
            wing1.reparentTo(temp)
            wing2.reparentTo(temp)
            wing3.reparentTo(temp)
            wing4.reparentTo(temp)
            wings.append(wing1)
            wings.append(wing2)
            wings.append(wing3)
            wings.append(wing4)
            wingsSeqNode.addChild(wing1.node())
            wingsSeqNode.addChild(wing2.node())
            wingsSeqNode.addChild(wing3.node())
            wingsSeqNode.addChild(wing4.node())
            wingsSeqNode.addChild(wing3.node())
            wingsSeqNode.addChild(wing2.node())
            temp.detachNode()
            del temp
            wingsSeqNodeParent.attachNewNode(wingsSeqNode)
            wingsSeqNode.setFrameRate(12)
            wingsSeqNode.loop(True)
            wingsSeqNode.setPlayRate(1)
            self.flyingHeart.loop('idle')
            self.flyingHeart.reparentTo(self)
        elif self.name == 'HeartBanner':
            self.heartBanner = Actor.Actor('phase_13/models/parties/tt_m_ara_pty_bannerValentine_model', {'idle': 'phase_13/models/parties/tt_m_ara_pty_bannerValentine'})
            balloonLeft = self.heartBanner.find('**/balloonsL')
            balloonRight = self.heartBanner.find('**/balloonsR')
            balloonLeft.setBillboardAxis()
            balloonRight.setBillboardAxis()
            balloonLeftLocator = self.heartBanner.find('**/balloonJointL')
            balloonRightLocator = self.heartBanner.find('**/balloonJointR')
            balloonLeft.reparentTo(balloonLeftLocator)
            balloonRight.reparentTo(balloonRightLocator)
            self.heartBanner.loop('idle')
            self.heartBanner.reparentTo(self)
        elif self.name == 'Hydra' or self.name == 'StageWinter':
            if self.name == 'StageWinter':
                self.hydra = Actor.Actor('phase_13/models/parties/tt_r_ara_pty_winterProps', {'dance': 'phase_13/models/parties/tt_a_ara_pty_hydra_dance'})
            else:
                self.hydra = Actor.Actor('phase_13/models/parties/tt_a_ara_pty_hydra_default', {'dance': 'phase_13/models/parties/tt_a_ara_pty_hydra_dance'})
            st = random.randint(0, 10)
            animIval = ActorInterval(self.hydra, 'dance')
            animIvalDur = animIval.getDuration()
            self.decSfx = loader.loadSfx('phase_13/audio/sfx/tt_s_ara_pty_propsShow_dance.ogg')
            soundIval = SoundInterval(self.decSfx, node=self.hydra, listenerNode=base.localAvatar, volume=PartyGlobals.DECORATION_VOLUME, cutOff=PartyGlobals.DECORATION_CUTOFF, duration=animIvalDur)
            self.animSeq = Parallel(animIval, soundIval)
            self.animSeq.loop(st)
            collisions = self.hydra.find('**/*collision*')
            collisions.setPos(0, 0, -5)
            self.hydra.flattenStrong()
            self.hydra.reparentTo(self)
            if self.name == 'StageWinter':
                stageBounds = self.hydra.find('**/stage').node().getBounds()
                self.hydra.node().setBounds(stageBounds)
                self.hydra.node().setFinal(1)
        elif self.name == 'TubeCogVictory':
            self.tubeCog = Actor.Actor('phase_5.5/models/estate/tt_a_ara_pty_tubeCogVictory_default', {'wave': 'phase_5.5/models/estate/tt_a_ara_pty_tubeCogVictory_wave'})
            st = random.randint(0, 10)
            animIval = ActorInterval(self.tubeCog, 'wave')
            animIvalDur = animIval.getDuration()
            self.decSfx = loader.loadSfx('phase_13/audio/sfx/tt_s_ara_pty_tubeCogVictory_wave.ogg')
            soundIval = SoundInterval(self.decSfx, node=self.tubeCog, listenerNode=base.localAvatar, volume=PartyGlobals.DECORATION_VOLUME, cutOff=PartyGlobals.DECORATION_CUTOFF, duration=animIvalDur)
            self.animSeq = Parallel(animIval, soundIval)
            self.animSeq.loop()
            self.animSeq.setT(st)
            self.tubeCog.flattenStrong()
            self.tubeCog.reparentTo(self)
        elif self.name == 'BannerVictory':
            self.bannerVictory = Actor.Actor('phase_13/models/parties/tt_m_ara_pty_bannerVictory_model', {'idle': 'phase_13/models/parties/tt_m_ara_pty_bannerVictory'})
            balloonLeft = self.bannerVictory.find('**/balloonsLMesh')
            balloonRight = self.bannerVictory.find('**/balloonsRMesh')
            balloonLeft.setBillboardAxis()
            balloonRight.setBillboardAxis()
            balloonLeftLocator = self.bannerVictory.find('**/balloonJointL')
            balloonRightLocator = self.bannerVictory.find('**/balloonJointR')
            balloonLeft.reparentTo(balloonLeftLocator)
            balloonRight.reparentTo(balloonRightLocator)
            self.bannerVictory.loop('idle')
            self.bannerVictory.reparentTo(self)
        elif self.name == 'CannonVictory':
            self.cannonVictory = Actor.Actor('phase_13/models/parties/tt_m_ara_pty_cannonVictory_model', {'idle': 'phase_13/models/parties/tt_m_ara_pty_cannonVictory'})
            confettiLocator = self.cannonVictory.findAllMatches('**/uvj_confetties')[1]
            confettiMesh = self.cannonVictory.find('**/confettis')
            confettiMesh.setTexProjector(confettiMesh.findTextureStage('default'), self.cannonVictory, confettiLocator)
            self.cannonVictory.flattenStrong()
            self.cannonVictory.loop('idle')
            self.cannonVictory.reparentTo(self)
        elif self.name == 'CogStatueVictory':
            self.decorationModel = loader.loadModel('phase_13/models/parties/tt_m_ara_pty_cogDoodleVictory')
            self.decorationModel.reparentTo(self)
            self.decorationShadow = self.setupAnimSeq()
        elif self.name == 'CogIceCreamVictory':
            self.decorationModel = loader.loadModel('phase_13/models/parties/tt_m_ara_pty_cogIceCreamVictory')
            self.decorationModel.reparentTo(self)
            self.decorationShadow = self.setupAnimSeq()
        elif self.name == 'cogIceCreamWinter':
            self.decorationModel = loader.loadModel('phase_13/models/parties/tt_m_ara_pty_cogIceCreamWinter')
            self.decorationModel.reparentTo(self)
            self.decorationShadow = self.setupAnimSeq()
        elif self.name == 'CogStatueWinter':
            self.decorationModel = loader.loadModel('phase_13/models/parties/tt_m_ara_pty_cogDoodleWinter')
            self.decorationModel.reparentTo(self)
            self.decorationShadow = self.setupAnimSeq()
        elif self.name == 'snowman':
            self.decorationModel = loader.loadModel('phase_13/models/estate/tt_m_prp_ext_snowman')
            self.decorationModel.reparentTo(self)
            self.decorationModel.find('**/growthStage_1').hide()
            self.decorationModel.find('**/growthStage_2').hide()
        elif self.name == 'snowDoodle':
            self.decorationModel = loader.loadModel('phase_5.5/models/estate/tt_m_prp_ext_snowDoodle')
            self.decorationModel.reparentTo(self)
            self.decorationModel.find('**/growthStage_1').hide()
            self.decorationModel.find('**/growthStage_2').hide()
        else:
            self.decorationModels = loader.loadModel('phase_4/models/parties/partyDecorations')
            self.decorationModels.copyTo(self)
            decors = self.findAllMatches('**/partyDecoration_*')
            for i in xrange(decors.getNumPaths()):
                decPiece = decors.getPath(i)
                n = decPiece.getName()
                if n.endswith('shadow') or n.endswith('base') or n.endswith('collision') or n.endswith(name):
                    pass
                else:
                    decPiece.reparentTo(hidden)

        self.reparentTo(base.cr.playGame.hood.loader.geom)