Beispiel #1
0
 def recreate_bubble(self, unit, text):
     self.remove_existing_bubble(unit)
     chat_bubble = ChatBubble(text, unit)
     self.chat_bubbles_by_names[unit.name] = chat_bubble
     task = Task(self.delete_bubble_after_no_updates,
                 "delete bubble after no updates")
     core.instance.task_mgr.add(task, extraArgs=[task, unit.name])
Beispiel #2
0
 def __spawnTask(self):
     # Spawn task
     self.__removeTask()
     taskName = self.getName() + '-play'
     task = Task(self.__playTask)
     task.interval = self
     taskMgr.add(task, taskName)
Beispiel #3
0
 def setCannonWillFire(self, cannonId, zRot, angle):
     self.notify.debug('setCannonWillFire: %d %d %d' %
                       (cannonId, zRot, angle))
     cannon = base.cr.doId2do.get(cannonId)
     if cannon is None:
         self.notify.warning(
             "Cannon has not been created, but we got this message. Don't show firing."
         )
         return
     if not cannon.getToonInside():
         self.notify.warning(
             "setCannonWillFire, but no toon insde. Don't show firing")
         return
     if self.isLocalToon(cannon.getToonInside()):
         self.localFlyingToon = base.localAvatar
         self.localFlyingToonId = base.localAvatar.doId
         self.localFiringCannon = cannon
         self.flyingToonCloudsHit = 0
     cannon.updateModel(zRot, angle)
     toonId = cannon.getToonInside().doId
     task = Task(self.__fireCannonTask)
     task.toonId = toonId
     task.cannon = cannon
     taskMgr.add(task, self.taskNameFireCannon)
     self.toonIds.append(toonId)
     return
Beispiel #4
0
 def __startStickTask(self, crateNormal, toonPos):
     self.__killStickTask()
     self.stuckToCrate = 1
     sTask = Task(self.__stickTask)
     sTask.crateNormal = crateNormal
     sTask.toonPos = toonPos
     taskMgr.add(sTask, self.taskName('stickTask'))
Beispiel #5
0
 def countdown(self, duration):
     countdownTask = Task(self.timerTask)
     countdownTask.duration = duration
     countdownTask.maxCount = RaceGlobals.RaceCountdown
     taskMgr.remove(self.uniqueName('countdownTimerTask'))
     return taskMgr.add(countdownTask,
                        self.uniqueName('countdownTimerTask'))
Beispiel #6
0
 def startCountdown(self):
     if not self.timerTask and self.startingBlocks:
         self.makeClockGui()
         duration = KartGlobals.COUNTDOWN_TIME - globalClockDelta.localElapsedTime(self.getTimestamp())
         countdownTask = Task(self.updateTimerTask)
         countdownTask.duration = duration
         self.timerTask = taskMgr.add(countdownTask, self.uniqueName('racePadTimerTask'))
Beispiel #7
0
    def doSpawnTitleText(self, text):
        self.titleColor = (1.0, 0.5, 0.4, 1.0)
        self.titleText = OnscreenText.OnscreenText(
            text,
            fg=self.titleColor,
            font=ToontownGlobals.getSignFont(),
            pos=(0, -0.5),
            scale=0.16,
            drawOrder=0,
            mayChange=1,
            wordwrap=16)

        self.titleText.setText(text)
        self.titleText.show()
        self.titleText.setColor(Vec4(*self.titleColor))
        self.titleText.clearColorScale()
        self.titleText.setFg(self.titleColor)
        seq = Task.sequence(
            # HACK! Let a pause go by to cover the loading pause
            # This tricks the taskMgr
            Task.pause(0.1),
            Task.pause(6.0),
            self.titleText.lerpColorScale(Vec4(1.0, 1.0, 1.0, 1.0),
                                          Vec4(1.0, 1.0, 1.0, 0.0), 0.5),
            Task(self.hideTitleTextTask))
        taskMgr.add(seq, "titleText")
Beispiel #8
0
def startCloudSky(hood,
                  parent=camera,
                  effects=CompassEffect.PRot | CompassEffect.PZ):
    hood.sky.reparentTo(parent)
    hood.sky.setDepthTest(0)
    hood.sky.setDepthWrite(0)
    hood.sky.setBin('background', 100)
    try:
        hood.sky.find('**/Sky').reparentTo(hood.sky, -1)
    except:
        pass

    hood.sky.reparentTo(parent)
    hood.sky.setZ(0.0)
    hood.sky.setHpr(0.0, 0.0, 0.0)
    ce = CompassEffect.make(NodePath(), effects)
    hood.sky.node().setEffect(ce)
    skyTrackTask = Task(hood.skyTrack)
    skyTrackTask.h = 0
    skyTrackTask.cloud1 = hood.sky.find('**/cloud1')
    skyTrackTask.cloud2 = hood.sky.find('**/cloud2')
    if not skyTrackTask.cloud1.isEmpty() and not skyTrackTask.cloud2.isEmpty():
        taskMgr.add(skyTrackTask, 'skyTrack')
    else:
        notify.warning("Couln't find clouds!")
Beispiel #9
0
 def enableInteractionButtons(self):
     self.notify.debug('enable buttons')
     proxTask = Task.loop(Task(self.__checkPetProximity), Task.pause(0.5))
     taskMgr.add(proxTask,
                 'petpanel-proximity-check',
                 priority=ToontownGlobals.PetPanelProximityPriority)
     self.__checkPetProximity()
Beispiel #10
0
 def __initSunTask(self):
     # only call this fcn the first time, in order to pass the timestamp
     self.__killSunTask()
     task = Task(self.__sunTask)
     dT = self.getDeltaTime()
     task.ts = dT
     taskMgr.add(task, self.taskName("sunTask"))
    def updateHealthBar(self, hp):
        if not self.healthBar:
            return
        if hp > self.health:
            self.health = hp
        health = 0.0
        try:
            health = float(hp) / float(self.maxHealth)
        except:
            pass

        if health > 0.95:
            condition = 0
        else:
            if health > 0.7:
                condition = 1
            else:
                if health > 0.3:
                    condition = 2
                else:
                    if health > 0.05:
                        condition = 3
                    else:
                        if health > 0.0:
                            condition = 4
                        else:
                            condition = 5
        if self.condition != condition:
            if condition == 4:
                blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.75),
                                      Task(self.__blinkGray), Task.pause(0.1))
                taskMgr.add(blinkTask, self.taskName('blink-task'))
            else:
                if condition == 5:
                    if self.condition == 4:
                        taskMgr.remove(self.taskName('blink-task'))
                    blinkTask = Task.loop(Task(self.__blinkRed),
                                          Task.pause(0.25),
                                          Task(self.__blinkGray),
                                          Task.pause(0.1))
                    taskMgr.add(blinkTask, self.taskName('blink-task'))
                else:
                    self.healthBar.setColor(
                        SuitGlobals.healthColors[condition], 1)
                    self.healthBarGlow.setColor(
                        SuitGlobals.healthGlowColors[condition], 1)
            self.condition = condition
Beispiel #12
0
 def updateHealthBar(self):
     if self.healthBar == None:
         return
     health = 1.0 - float(self.bossDamage) / float(self.bossMaxDamage)
     if health > 0.95:
         condition = 0
     elif health > 0.9:
         condition = 1
     elif health > 0.8:
         condition = 2
     elif health > 0.7:
         condition = 3
     elif health > 0.6:
         condition = 4
     elif health > 0.5:
         condition = 5
     elif health > 0.3:
         condition = 6
     elif health > 0.15:
         condition = 7
     elif health > 0.10:
         condition = 8
     elif health > 0.5:
         condition = 9
     elif health > 0.0:
         condition = 10
     else:
         condition = 11
     if self.healthCondition != condition:
         if condition == 10:
             blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.75),
                                   Task(self.__blinkGray), Task.pause(0.1))
             taskMgr.add(blinkTask, self.uniqueName('blink-task'))
         elif condition == 11:
             if self.healthCondition == 10:
                 taskMgr.remove(self.uniqueName('blink-task'))
             blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.25),
                                   Task(self.__blinkGray), Task.pause(0.1))
             taskMgr.add(blinkTask, self.uniqueName('blink-task'))
         else:
             self.healthBar.setColor(self.healthColors[condition], 1)
             self.healthBarGlow.setColor(self.healthGlowColors[condition],
                                         1)
         self.healthCondition = condition
     return
Beispiel #13
0
 def __startIntro(self):
     self.T_WATER = 1
     self.T_WATER2LONGVIEW = 1
     self.T_LONGVIEW = 1
     self.T_LONGVIEW2TOONHEAD = 2
     self.T_TOONHEAD = 2
     self.T_TOONHEAD2CANNONBACK = 2
     taskLookInWater = Task(self.__taskLookInWater)
     taskPullBackFromWater = Task(self.__taskPullBackFromWater)
     taskFlyUpToToon = Task(self.__flyUpToToon)
     taskFlyToBackOfCannon = Task(self.__flyToBackOfCannon)
     commonData = {}
     taskLookInWater.data = commonData
     taskPullBackFromWater.data = commonData
     taskFlyUpToToon.data = commonData
     taskFlyToBackOfCannon.data = commonData
     introTask = Task.sequence(taskLookInWater, Task.pause(self.T_WATER), taskPullBackFromWater, Task.pause(self.T_WATER2LONGVIEW + self.T_LONGVIEW), taskFlyUpToToon, Task.pause(self.T_LONGVIEW2TOONHEAD + self.T_TOONHEAD), taskFlyToBackOfCannon)
     taskMgr.add(introTask, self.INTRO_TASK_NAME)
Beispiel #14
0
 def __spawnLocalCannonMoveTask(self):
     self.leftPressed = 0
     self.rightPressed = 0
     self.upPressed = 0
     self.downPressed = 0
     self.cannonMoving = 0
     task = Task(self.__localCannonMoveTask)
     task.lastPositionBroadcastTime = 0.0
     taskMgr.add(task, self.LOCAL_CANNON_MOVE_TASK)
Beispiel #15
0
    def __startLocalCannonMoveTask(self):
        """
        Starts the cannon move task for the local toon.
        """
        self.localCannonMoving = False

        task = Task(self.__localCannonMoveTask)
        task.lastPositionBroadcastTime = 0.0
        taskMgr.add(task, self.LOCAL_CANNON_MOVE_TASK)
Beispiel #16
0
 def __withdrawButtonDown(self, event):
     messenger.send('wakeup')
     task = Task(self.__runCounter)
     task.delayTime = 0.4
     task.prevTime = 0.0
     task.delta = -1
     hitLimit, jar, bank, trans = self.__updateTransaction(task.delta)
     if not hitLimit:
         taskMgr.add(task, self.taskName('runCounter'))
Beispiel #17
0
    def __initDaytimeTask(self):
        # only call this fcn the first time, in order to pass the timestamp
        self.__killDaytimeTask()
        task = Task(self.__dayTimeTask)

        # figure out how far into the task we are (how far from dawn)
        dT = self.getDeltaTime()
        task.ts = dT
        taskMgr.add(task, self.taskName("daytime"))
Beispiel #18
0
 def updateHealthBar(self, hp, forceUpdate=0):
     if hp > self.currHP:
         hp = self.currHP
     self.currHP -= hp
     health = float(self.currHP) / float(self.maxHP)
     if health > 0.95:
         condition = 0
     elif health > 0.9:
         condition = 1
     elif health > 0.8:
         condition = 2
     elif health > 0.7:
         condition = 3
     elif health > 0.6:
         condition = 4
     elif health > 0.5:
         condition = 5
     elif health > 0.3:
         condition = 6
     elif health > 0.15:
         condition = 7
     elif health > 0.05:
         condition = 8
     elif health > 0.0:
         condition = 9
     else:
         condition = 10
     if self.healthCondition != condition or forceUpdate:
         if condition == 9:
             blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.75),
                                   Task(self.__blinkGray), Task.pause(0.1))
             taskMgr.add(blinkTask, self.uniqueName('blink-task'))
         elif condition == 10:
             if self.healthCondition == 9:
                 taskMgr.remove(self.uniqueName('blink-task'))
             blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.25),
                                   Task(self.__blinkGray), Task.pause(0.1))
             taskMgr.add(blinkTask, self.uniqueName('blink-task'))
         else:
             taskMgr.remove(self.uniqueName('blink-task'))
             self.healthBar.setColor(self.healthColors[condition], 1)
             self.healthBarGlow.setColor(self.healthGlowColors[condition],
                                         1)
         self.healthCondition = condition
 def _BankGui__depositButtonDown(self, event):
     messenger.send('wakeup')
     task = Task(self._BankGui__runCounter)
     task.delayTime = 0.40000000000000002
     task.prevTime = 0.0
     task.delta = 1
     (hitLimit, jar, bank,
      trans) = self._BankGui__updateTransaction(task.delta)
     if not hitLimit:
         taskMgr.add(task, self.taskName('runCounter'))
Beispiel #20
0
    def update(self, hp, forceUpdate=0):
        if not self.geom:
            return
        condition = self.getHealthCondition(hp)

        if self.healthCondition != condition or forceUpdate:
            taskMgr.remove('blink-task-%s' % id(self))

            if condition in (9, 10):
                blinkTask = Task.loop(
                    Task(self.__blinkRed),
                    Task.pause(0.75 if condition == 9 else 0.25),
                    Task(self.__blinkGray), Task.pause(0.1))
                taskMgr.add(blinkTask, 'blink-task-%s' % id(self))
            else:
                self.geom.setColor(HEALTH_COLORS[condition], 1)
                self.geomGlow.setColor(HEALTH_GLOW_COLORS[condition], 1)

            self.healthCondition = condition
Beispiel #21
0
 def updateHealthBar(self):
     condition = self.cog.healthCondition
     if condition == 4:
         self.blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.75),
                                    Task.pause(0.1))
         taskMgr.add(self.blinkTask, self.uniqueName('blink-task'))
     else:
         taskMgr.remove(self.uniqueName('blink-task'))
         self.button.setColor(self.healthColors[condition], 1)
         self.glow.setColor(self.healthGlowColors[condition], 1)
Beispiel #22
0
    def __withdrawButtonDown(self, event):
        messenger.send('wakeup')

        task = Task(self.__runCounter)
        task.delayTime = 0.2
        task.prevTime = 0.0
        task.amount = -1.0
        hitLimit = self.__updateTransaction(int(task.amount))[0]
        if not hitLimit:
            taskMgr.add(task, self.taskName('runCounter'))
    def __init__(self):
        print("TerrainTest object created")
        self.make_traverser_handler()
        self.tm = TerrainManager(16, 16)

        self.down = 0

        self.PCs = {}

        #self.make_actor()
        self.char = Character("pandabuddy")
        self.pc = self.char.panda_actor
        self.make_actor_collisions(self.pc)
        #self.make_test_capsule()
        self.tm.get_terrain(0, 0).terrain.getRoot().setTag('myObjectTag', '1')

        #self.tm.get_terrain(0, 0).terrain.getRoot().setIntoCollideMask(BitMask32.bit(0))
        #col_t = CollisionNode("col_t")
        #col_t.addSolid(CollisionPolygon(self.tm.get_terrain(0, 0).terrain.getRoot()))
        #CollisionPolygon(self.tm.get_terrain(0, 0).terrain.getRoot())
        #base.cTrav.addCollider(self.tm.get_terrain(0, 0).terrain.getRoot(), base.mchandler)

        #pusher = CollisionHandlerPusher()
        #pusher.addCollider(self.collision_node, self.char.boxc)
        #base.cTrav.addCollider(self.collision_node, pusher)

        #base.cTrav.addCollider(self.collision_node, base.mchandler)

        cp = CollisionPlane(LPlane((0, 0, 1), (0, 0, 0)))
        #self.planeANP = render.attachNewNode(ActorNode('p actor'))
        planeNP = base.render.attachNewNode(CollisionNode('planecnode'))
        #planeNP = self.planeANP.attachNewNode(CollisionNode('planecnode'))
        self.accept('into-planecnode', self.hanev)
        self.accept('pcol-again-planecnode', self.hanev)
        planeNP.node().addSolid(cp)
        planeNP.show()
        planeNP.setScale(100, 100, 100)
        planeNP.node().setIntoCollideMask(BitMask32.bit(0))
        planeNP.node().setFromCollideMask(BitMask32.allOff())
        planeNP.setPos(0, 0, -100)
        #base.mchandler.addCollider(planeNP, self.planeANP)
        #base.cTrav.addCollider(planeNP, base.mchandler)
        #base.physicsMgr.attachPhysicalNode(self.planeANP.node())

        base.cTrav.addCollider(self.char.boxc, base.mchandler)
        base.cTrav.setRespectPrevTransform(True)

        #base.mchandler.addCollider(self.collision_node, self.char.panda_actor)
        #base.mchandler.addCollider(self.collision_node, self.char.boxc)
        #base.mchandler.addCollider(self.char.boxc, self.collision_node)
        Globals.g_task_manager.add(self.move, "moveTask", priority=-100)
        self.task1 = Task(self.gravity)
        Globals.g_task_manager.add(self.task1,
                                   "gravityTask",
                                   extraArgs=[self.task1, self.pc])
Beispiel #24
0
    def __fireCannonTask(self, task):
        launchTime = task.fireTime
        results = self.__calcFlightResults(launchTime)
        startPos, startHpr, startVel, trajectory, timeOfImpact, hitWhat = results

        if not results:
            return

        self.notify.info('start position: ' + str(startPos))
        self.notify.info('start velocity: ' + str(startVel))
        self.notify.info('time of launch: ' + str(launchTime))
        self.notify.info('time of impact: ' + str(timeOfImpact))
        self.notify.info('location of impact: ' +
                         str(trajectory.getPos(timeOfImpact)))
        self.notify.info('start hpr: ' + str(startHpr))

        FlyingProp = self.gag

        self.generateGravity(FlyingProp)
        FlyingProp.reparentTo(render)
        FlyingProp.setPos(startPos)
        barrelHpr = self.barrel.getHpr(render)
        FlyingProp.setHpr(startHpr)
        #FlyingProp.setH(90)
        #self.gag.setPosHpr(0, 0, 100, 0, 0, 0) # this seems to be affecting the collision sphere btw
        info = {}
        info['trajectory'] = trajectory
        info['launchTime'] = launchTime
        info['timeOfImpact'] = timeOfImpact
        info['hitWhat'] = hitWhat
        info['flyingProp'] = self.gag
        info['hRot'] = self.cannonPosition[0]
        info['haveWhistled'] = 0
        info['maxCamPullback'] = CAMERA_PULLBACK_MIN
        self.flyColSphere = CollisionSphere(0, 0, 0, 1.2)
        self.flyColNode = CollisionNode('flySphere')
        self.flyColNode.setCollideMask(BitmaskGlobals.FloorBitmask
                                       | BitmaskGlobals.WallBitmask)
        self.flyColNode.addSolid(self.flyColSphere)
        self.flyColNodePath = self.gag.attachNewNode(self.flyColNode)
        self.flyColNodePath.setColor(1, 0, 0, 1)
        # self.flyColNodePath.show()
        self.handler = CollisionHandlerEvent()
        self.handler.setInPattern('cannonHit')
        # uh oh no work! :( << nevermind, should work now
        base.cTrav.addCollider(self.flyColNodePath, self.handler)
        print('Cannon pos: {0}'.format(self.cannon.getPos(render)))
        self.accept('cannonHit', self.__handleCannonHit)
        base.playSfx(self.sndCannonFire)
        flyTask = Task(self.__flyTask, 'flyTask')
        flyTask.info = info
        taskMgr.add(flyTask, 'flyTask')
        self.acceptOnce('stopFlyTask', self.__stopFlyTask)
        self.notify.info('done with __fireCannonTask')
        return Task.done
Beispiel #25
0
 def __checkUpdateColor(self, hp, maxhp):
     if self.bossBar:
         self.healthRatio = float(hp) / float(maxhp)
         if self.healthRatio > self.colorThresholds[0]:
             condition = 0
         elif self.healthRatio > self.colorThresholds[1]:
             condition = 1
         elif self.healthRatio > self.colorThresholds[2]:
             condition = 2
         elif self.healthRatio > self.colorThresholds[3]:
             condition = 3
         elif self.healthRatio > self.colorThresholds[4]:
             condition = 4
         else:
             condition = 5
         self.__applyNewColor(condition)
         if self.healthCondition != condition:
             if condition == 4:
                 if self.healthCondition == 5:
                     taskMgr.remove('bar-blink-task')
                     self.isBlinking = False
                 blinkTask = Task.loop(Task(self.__blinkRed),
                                       Task.pause(0.75),
                                       Task(self.__blinkGray),
                                       Task.pause(0.1))
                 taskMgr.add(blinkTask, 'bar-blink-task')
                 self.isBlinking = True
             elif condition == 5:
                 if self.healthCondition == 4:
                     taskMgr.remove('bar-blink-task')
                     self.isBlinking = False
                 blinkTask = Task.loop(Task(self.__blinkRed),
                                       Task.pause(0.25),
                                       Task(self.__blinkGray),
                                       Task.pause(0.1))
                 taskMgr.add(blinkTask, 'bar-blink-task')
                 self.isBlinking = True
             else:
                 if self.isBlinking:
                     taskMgr.remove('bar-blink-task')
                     self.isBlinking = False
             self.healthCondition = condition
Beispiel #26
0
 def updateHealthBar(self):
     health = float(float(self.hp) / float(self.maxHp))
     if health < 1:
         self.corpMedallion.hide()
         self.healthBar.show()
     if health > 0.95:
         condition = 0
     elif health > 0.7:
         condition = 1
     elif health > 0.3:
         condition = 2
     elif health > 0.05:
         condition = 3
     elif health > 0:
         condition = 4
     else:
         condition = 5
     if (self.healthCondition != condition):
         if (condition == 4):
             blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.75),
                                   Task(self.__blinkGray), Task.pause(0.1))
             base.taskMgr.add(blinkTask, 'blink-task')
         elif (condition == 5):
             if (self.healthCondition == 4):
                 base.taskMgr.remove('blink-task')
             if (self.isDefeated == False):
                 blinkTask = Task.loop(Task(self.__blinkRed),
                                       Task.pause(0.25),
                                       Task(self.__blinkGray),
                                       Task.pause(0.1))
                 base.taskMgr.add(blinkTask, 'blink-task')
                 self.isDefeated = True
                 if not self.cog.hasPythonTag("Support"):
                     roundInstance = render.getPythonTag('Round')
                     wave = roundInstance.getCurrentWave()
                     wave.setCogsDefeated(wave.getCogsDefeated() + 1)
                 base.taskMgr.doMethodLater(1.5, self.setDefeated,
                                            'Set Cog Defeated')
         else:
             self.healthBar.setColor(healthColors[condition], 1)
             self.healthBarGlow.setColor(healthGlowColors[condition], 1)
         self.healthCondition = condition
Beispiel #27
0
    def __taskUpdate(self, delta, event):
        messenger.send('wakeup')

        task = Task(self.__runTask)
        task.delayTime = 0.4
        task.prevTime = 0.0
        task.delta = delta
        hitLimit = self.__updateLaffMeter(delta)

        if not hitLimit:
            taskMgr.add(task, self.taskName('runLaffCounter'))
Beispiel #28
0
 def __decButtonDown(self, event):
     assert self.notify.debugStateCall(self)
     task = Task(self.__repeatStepTask)
     task.stepSize = -self['stepSize']
     taskName = self.taskName('repeatStep')
     #print 'decButtonDown: adding ', taskName
     taskMgr.doMethodLater(self['repeatStartdelay'], task, taskName)
     self.doStep(task.stepSize)
     messenger.send('wakeup')
     if self.__decButtonCallback:
         self.__decButtonCallback()
 def _DirectScrolledList__decButtonDown(self, event):
     task = Task(self._DirectScrolledList__scrollByTask)
     task.setDelay(1.0 / self.scrollSpeed)
     task.prevTime = 0.0
     task.delta = -1
     taskName = self.taskName('scroll')
     taskMgr.add(task, taskName)
     self.scrollBy(task.delta)
     messenger.send('wakeup')
     if self.decButtonCallback:
         self.decButtonCallback()
Beispiel #30
0
	def enterFlyDown(self):
		self.fd_sfx = audio3d.loadSfx("phase_5/audio/sfx/ENC_propeller_in.ogg")
		self.prop = Actor("phase_4/models/props/propeller-mod.bam",
						{"chan": "phase_4/models/props/propeller-chan.bam"})
		audio3d.attachSoundToObject(self.fd_sfx, self.prop)
		self.fd_sfx.play()
		self.prop.reparentTo(self.suit.find('**/joint_head'))
		propTrack = Sequence(Func(self.prop.loop, 'chan', fromFrame=0, toFrame=3),
							Wait(1.75),
							Func(self.prop.play, 'chan', fromFrame=3))
		propTrack.start()
		if not self.hasSpawned:
			showSuit = Task.sequence(Task(self.hideSuit), Task.pause(0.3), Task(self.showSuit))
			taskMgr.add(showSuit, "showsuit")
			self.hasSpawned = True
		dur = self.suit.getDuration('land')
		suitTrack = Sequence(Func(self.suit.pose, 'land', 0),
							Wait(1.9),
							ActorInterval(self.suit, 'land', duration=dur))
		suitTrack.start()