예제 #1
0
 def sayFaceoffTaunt(self, custom = False, phrase = "", dialogue = None):
     if custom:
         self.setChatAbsolute(phrase, CFSpeech | CFTimeout, dialogue)
     elif not custom:
         if random.random() < 0.2:
             taunt = SuitBattleGlobals.getFaceoffTaunt(self.getStyleName(), self.doId, randomChoice = True)
             self.setChatAbsolute(taunt, CFSpeech | CFTimeout)
예제 #2
0
 def doAction(self, task):
     if not self.currentSuit:
         return Task.done
     if self.actSeq:
         self.actSeq.finish()
     self.setSuitChat(
         SuitBattleGlobals.getFaceoffTaunt(self.currentSuit.dna.name, 0,
                                           True))
     anim = random.choice([
         'victory', 'slip-backward', 'slip-forward', 'reach', 'hypnotized',
         'lured', 'neutral', 'neutral'
     ])
     self.actSeq = Sequence(ActorInterval(self.currentSuit, anim),
                            Func(self.currentSuit.loop, 'neutral'))
     self.actSeq.start()
     task.delayTime = random.randrange(ACT_DELAY_MIN, ACT_DELAY_MAX)
     return Task.again
 def sayFaceoffTaunt(self, custom=False, phrase="", dialogue=None):
     if custom:
         self.virtualSuit.setChatAbsolute(phrase, CFSpeech | CFTimeout, dialogue)
     else:
         if self.attackProp == 'teeth':
             taunt = SuitBattleGlobals.getAttackTaunt(random.choice(['Bite', 'Chomp']))
         elif self.attackProp == 'synergy':
             taunt = SuitBattleGlobals.getAttackTaunt('Synergy')
         elif self.attackProp == 'golf-ball':
             taunt = SuitBattleGlobals.getAttackTaunt('TeeOff')
         elif self.attackProp == 'baseball':
             taunt = SuitBattleGlobals.getAttackTaunt('PlayHardball')
         elif self.attackProp == 'write-off':
             taunt = SuitBattleGlobals.getAttackTaunt('WriteOff')
         elif self.attackProp == 'crunch':
             taunt = SuitBattleGlobals.getAttackTaunt('Crunch')
         else:
             taunt = SuitBattleGlobals.getFaceoffTaunt(self.virtualSuit.style.name, self.doId)
         self.virtualSuit.setChatAbsolute(taunt, CFSpeech | CFTimeout)
예제 #4
0
 def sayFaceoffTaunt(self, custom=False, phrase="", dialogue=None):
     if custom:
         self.virtualSuit.setChatAbsolute(phrase, CFSpeech | CFTimeout,
                                          dialogue)
     else:
         if self.attackProp == 'teeth':
             taunt = SuitBattleGlobals.getAttackTaunt(
                 random.choice(['Bite', 'Chomp']))
         elif self.attackProp == 'synergy':
             taunt = SuitBattleGlobals.getAttackTaunt('Synergy')
         elif self.attackProp == 'golf-ball':
             taunt = SuitBattleGlobals.getAttackTaunt('TeeOff')
         elif self.attackProp == 'baseball':
             taunt = SuitBattleGlobals.getAttackTaunt('PlayHardball')
         elif self.attackProp == 'write-off':
             taunt = SuitBattleGlobals.getAttackTaunt('WriteOff')
         elif self.attackProp == 'crunch':
             taunt = SuitBattleGlobals.getAttackTaunt('Crunch')
         else:
             taunt = SuitBattleGlobals.getFaceoffTaunt(
                 self.virtualSuit.style.name, self.doId)
         self.virtualSuit.setChatAbsolute(taunt, CFSpeech | CFTimeout)
    def __faceOff(self, ts, name, callback):
        if len(self.suits) == 0:
            self.notify.warning('__faceOff(): no suits.')
            return
        if len(self.toons) == 0:
            self.notify.warning('__faceOff(): no toons.')
            return
        toon = self.toons[0]
        point = self.toonPoints[0][0]
        toonPos = point[0]
        toonHpr = VBase3(point[1], 0.0, 0.0)
        p = toon.getPos(self)
        toon.setPos(self, p[0], p[1], 0.0)
        toon.setShadowHeight(0)
        if len(self.suits) == 1:
            leaderIndex = 0
        elif self.bossBattle == 1:
            for suit in self.suits:
                if suit.boss:
                    leaderIndex = self.suits.index(suit)
                    break

        else:
            maxTypeNum = -1
            for suit in self.suits:
                suitTypeNum = SuitDNA.getSuitType(suit.dna.name)
                if maxTypeNum < suitTypeNum:
                    maxTypeNum = suitTypeNum
                    leaderIndex = self.suits.index(suit)

        delay = FACEOFF_TAUNT_T
        suitTrack = Parallel()
        suitLeader = None
        for suit in self.suits:
            suit.setState('Battle')
            suitIsLeader = 0
            oneSuitTrack = Sequence()
            oneSuitTrack.append(Func(suit.loop, 'neutral'))
            oneSuitTrack.append(Func(suit.headsUp, toonPos))
            if self.suits.index(suit) == leaderIndex:
                suitLeader = suit
                suitIsLeader = 1
                if self.bossBattle == 1 and self.levelDoId in base.cr.doId2do:
                    level = base.cr.doId2do[self.levelDoId]
                    if suit.boss:
                        taunt = level.getBossTaunt()
                    else:
                        taunt = level.getBossBattleTaunt()
                else:
                    taunt = SuitBattleGlobals.getFaceoffTaunt(suit.getStyleName(), suit.doId)
                oneSuitTrack.append(Func(suit.setChatAbsolute, taunt, CFSpeech | CFTimeout))
            destPos, destHpr = self.getActorPosHpr(suit, self.suits)
            oneSuitTrack.append(Wait(delay))
            if suitIsLeader == 1:
                oneSuitTrack.append(Func(suit.clearChat))
            oneSuitTrack.append(self.createAdjustInterval(suit, destPos, destHpr))
            suitTrack.append(oneSuitTrack)

        suitHeight = suitLeader.getHeight()
        suitOffsetPnt = Point3(0, 0, suitHeight)
        toonTrack = Parallel()
        for toon in self.toons:
            oneToonTrack = Sequence()
            destPos, destHpr = self.getActorPosHpr(toon, self.toons)
            oneToonTrack.append(Wait(delay))
            oneToonTrack.append(self.createAdjustInterval(toon, destPos, destHpr, toon=1, run=1))
            toonTrack.append(oneToonTrack)

        if self.hasLocalToon():
            MidTauntCamHeight = suitHeight * 0.66
            MidTauntCamHeightLim = suitHeight - 1.8
            if MidTauntCamHeight < MidTauntCamHeightLim:
                MidTauntCamHeight = MidTauntCamHeightLim
            TauntCamY = 18
            TauntCamX = 0
            TauntCamHeight = random.choice((MidTauntCamHeight, 1, 11))
            camTrack = Sequence()
            camTrack.append(Func(base.camera.reparentTo, suitLeader))
            camTrack.append(Func(base.camLens.setMinFov, self.camFOFov/(4./3.)))
            camTrack.append(Func(base.camera.setPos, TauntCamX, TauntCamY, TauntCamHeight))
            camTrack.append(Func(base.camera.lookAt, suitLeader, suitOffsetPnt))
            camTrack.append(Wait(delay))
            camTrack.append(Func(base.camLens.setMinFov, self.camFov/(4./3.)))
            camTrack.append(Func(base.camera.wrtReparentTo, self))
            camTrack.append(Func(base.camera.setPos, self.camFOPos))
            camTrack.append(Func(base.camera.lookAt, suit))
        mtrack = Parallel(suitTrack, toonTrack)
        if self.hasLocalToon():
            NametagGlobals.setWant2dNametags(False)
            mtrack = Parallel(mtrack, camTrack)
        done = Func(callback)
        track = Sequence(mtrack, done, name=name)
        track.start(ts)
        self.storeInterval(track, name)
        return
예제 #6
0
    def __faceOff(self, ts, name, callback):
        if len(self.suits) == 0:
            self.notify.warning('__faceOff(): no suits.')
            return
        if len(self.toons) == 0:
            self.notify.warning('__faceOff(): no toons.')
            return
        elevatorPos = self.toons[0].getPos()
        if len(self.suits) == 1:
            leaderIndex = 0
        elif self.bossBattle == 1:
            leaderIndex = 1
        else:
            maxTypeNum = -1
            for suit in self.suits:
                suitTypeNum = SuitDNA.getSuitType(suit.dna.name)
                if maxTypeNum < suitTypeNum:
                    maxTypeNum = suitTypeNum
                    leaderIndex = self.suits.index(suit)

        delay = FACEOFF_TAUNT_T
        suitTrack = Parallel()
        suitLeader = None
        for suit in self.suits:
            suit.setState('Battle')
            suitIsLeader = 0
            oneSuitTrack = Sequence()
            oneSuitTrack.append(Func(suit.loop, 'neutral'))
            oneSuitTrack.append(Func(suit.headsUp, elevatorPos))
            if self.suits.index(suit) == leaderIndex:
                suitLeader = suit
                suitIsLeader = 1
                if self.bossBattle == 1:
                    taunt = self.getBossBattleTaunt()
                else:
                    taunt = SuitBattleGlobals.getFaceoffTaunt(
                        suit.getStyleName(), suit.doId)
                oneSuitTrack.append(
                    Func(suit.setChatAbsolute, taunt, CFSpeech | CFTimeout))
            destPos, destHpr = self.getActorPosHpr(suit, self.suits)
            oneSuitTrack.append(Wait(delay))
            if suitIsLeader == 1:
                oneSuitTrack.append(Func(suit.clearChat))
            oneSuitTrack.append(
                self.createAdjustInterval(suit, destPos, destHpr))
            suitTrack.append(oneSuitTrack)

        toonTrack = Parallel()
        for toon in self.toons:
            oneToonTrack = Sequence()
            destPos, destHpr = self.getActorPosHpr(toon, self.toons)
            oneToonTrack.append(Wait(delay))
            oneToonTrack.append(
                self.createAdjustInterval(toon,
                                          destPos,
                                          destHpr,
                                          toon=1,
                                          run=1))
            toonTrack.append(oneToonTrack)

        camTrack = Sequence()

        def setCamFov(fov):
            base.camLens.setMinFov(fov / (4.0 / 3.0))

        camTrack.append(Func(camera.wrtReparentTo, suitLeader))
        camTrack.append(Func(setCamFov, self.camFOFov))
        suitHeight = suitLeader.getHeight()
        suitOffsetPnt = Point3(0, 0, suitHeight)
        MidTauntCamHeight = suitHeight * 0.66
        MidTauntCamHeightLim = suitHeight - 1.8
        if MidTauntCamHeight < MidTauntCamHeightLim:
            MidTauntCamHeight = MidTauntCamHeightLim
        TauntCamY = 18
        TauntCamX = 0
        TauntCamHeight = random.choice((MidTauntCamHeight, 1, 11))
        camTrack.append(
            Func(camera.setPos, TauntCamX, TauntCamY, TauntCamHeight))
        camTrack.append(Func(camera.lookAt, suitLeader, suitOffsetPnt))
        camTrack.append(Wait(delay))
        camPos = Point3(0, -6, 4)
        camHpr = Vec3(0, 0, 0)
        camTrack.append(Func(camera.wrtReparentTo, base.localAvatar))
        camTrack.append(Func(setCamFov, settings['fieldofview']))
        camTrack.append(Func(camera.setPosHpr, camPos, camHpr))
        mtrack = Parallel(suitTrack, toonTrack, camTrack)
        done = Func(callback)
        track = Sequence(mtrack, done, name=name)
        track.start(ts)
        self.storeInterval(track, name)
예제 #7
0
    def __faceOff(self, ts, name, callback):
        if (len(self.suits) == 0):
            self.notify.warning('__faceOff(): no suits.')
            return
        if (len(self.toons) == 0):
            self.notify.warning('__faceOff(): no toons.')
            return

        toon = self.toons[0]
        point = self.toonPoints[0][0]
        toonPos = point[0]
        toonHpr = VBase3(point[1], 0.0, 0.0)

        p = toon.getPos(self)
        toon.setPos(self, p[0], p[1], 0.0)
        toon.setShadowHeight(0)

        if (len(self.suits) == 1):
            # TODO: it looks like we only have the suit that we bumped
            # into at this point; he may or may not be the boss.
            # Need to add other suits before battle generate on AI
            leaderIndex = 0
        else:
            if (self.bossBattle == 1):
                for suit in self.suits:
                    if suit.boss:
                        leaderIndex = self.suits.index(suit)
                        break
            else:
                # otherwise __genSuitInfos ensures nothing, so pick the suit with the highest type to be the leader
                maxTypeNum = -1
                for suit in self.suits:
                    suitTypeNum = SuitDNA.getSuitType(suit.dna.name)
                    if (maxTypeNum < suitTypeNum):
                        maxTypeNum = suitTypeNum
                        leaderIndex = self.suits.index(suit)

        delay = FACEOFF_TAUNT_T
        suitTrack = Parallel()
        suitLeader = None

        for suit in self.suits:
            suit.setState('Battle')
            suitIsLeader = 0
            oneSuitTrack = Sequence()
            # Suits stop what they're doing and look at the toons
            oneSuitTrack.append(Func(suit.loop, 'neutral'))
            oneSuitTrack.append(Func(suit.headsUp, toonPos))

            # Only the suit leader taunts the toons
            if (self.suits.index(suit) == leaderIndex):
                suitLeader = suit
                suitIsLeader = 1

                # TODO: have an inside of building taunt here
                if (self.bossBattle
                        == 1) and self.levelDoId in base.cr.doId2do:
                    level = base.cr.doId2do[self.levelDoId]
                    if suit.boss:
                        taunt = level.getBossTaunt()
                    else:
                        taunt = level.getBossBattleTaunt()
                else:
                    taunt = SuitBattleGlobals.getFaceoffTaunt(
                        suit.getStyleName(), suit.doId)

                oneSuitTrack.append(
                    Func(suit.setChatAbsolute, taunt, CFSpeech | CFTimeout))

            # Move all suits into position after taunt delay
            destPos, destHpr = self.getActorPosHpr(suit, self.suits)
            oneSuitTrack.append(Wait(delay))
            if (suitIsLeader == 1):
                oneSuitTrack.append(Func(suit.clearChat))
            oneSuitTrack.append(
                self.createAdjustInterval(suit, destPos, destHpr))
            suitTrack.append(oneSuitTrack)

        suitHeight = suitLeader.getHeight()
        suitOffsetPnt = Point3(0, 0, suitHeight)

        # Do the toons faceoff
        toonTrack = Parallel()
        for toon in self.toons:
            oneToonTrack = Sequence()
            destPos, destHpr = self.getActorPosHpr(toon, self.toons)
            oneToonTrack.append(Wait(delay))
            oneToonTrack.append(
                self.createAdjustInterval(toon,
                                          destPos,
                                          destHpr,
                                          toon=1,
                                          run=1))
            toonTrack.append(oneToonTrack)

        if (self.hasLocalToon()):
            # empirical hack to pick a mid-height view, left in to sortof match the old view
            MidTauntCamHeight = suitHeight * 0.66
            MidTauntCamHeightLim = suitHeight - 1.8
            if (MidTauntCamHeight < MidTauntCamHeightLim):
                MidTauntCamHeight = MidTauntCamHeightLim
            TauntCamY = 18
            TauntCamX = 0
            TauntCamHeight = random.choice((MidTauntCamHeight, 1, 11))

            # Put the camera somewhere
            camTrack = Sequence()
            camTrack.append(Func(camera.reparentTo, suitLeader))
            camTrack.append(Func(base.camLens.setMinFov, self.camFOFov))
            camTrack.append(
                Func(camera.setPos, TauntCamX, TauntCamY, TauntCamHeight))
            camTrack.append(Func(camera.lookAt, suitLeader, suitOffsetPnt))
            camTrack.append(Wait(delay))
            camTrack.append(Func(base.camLens.setMinFov, self.camFov))
            camTrack.append(Func(camera.wrtReparentTo, self))
            camTrack.append(Func(camera.setPos, self.camFOPos))
            camTrack.append(Func(camera.lookAt, suit))

        mtrack = Parallel(suitTrack, toonTrack)

        if (self.hasLocalToon()):
            # No arrows - they just get in the way
            NametagGlobals.setMasterArrowsOn(0)
            mtrack = Parallel(mtrack, camTrack)

        done = Func(callback)
        track = Sequence(mtrack, done, name=name)
        track.start(ts)
        self.storeInterval(track, name)
예제 #8
0
    def __faceOff(self, ts, name, callback):
        if len(self.suits) == 0:
            self.notify.warning('__faceOff(): no suits.')
            return
        if len(self.toons) == 0:
            self.notify.warning('__faceOff(): no toons.')
            return
        toon = self.toons[0]
        point = self.toonPoints[0][0]
        toonPos = point[0]
        toonHpr = VBase3(point[1], 0.0, 0.0)
        p = toon.getPos(self)
        toon.setPos(self, p[0], p[1], 0.0)
        toon.setShadowHeight(0)
        if len(self.suits) == 1:
            leaderIndex = 0
        elif self.bossBattle == 1:
            for suit in self.suits:
                if suit.boss:
                    leaderIndex = self.suits.index(suit)
                    break

        else:
            maxTypeNum = -1
            for suit in self.suits:
                suitTypeNum = SuitDNA.getSuitType(suit.dna.name)
                if maxTypeNum < suitTypeNum:
                    maxTypeNum = suitTypeNum
                    leaderIndex = self.suits.index(suit)

        delay = FACEOFF_TAUNT_T
        suitTrack = Parallel()
        suitLeader = None
        for suit in self.suits:
            suit.setState('Battle')
            suitIsLeader = 0
            oneSuitTrack = Sequence()
            oneSuitTrack.append(Func(suit.loop, 'neutral'))
            oneSuitTrack.append(Func(suit.headsUp, toonPos))
            if self.suits.index(suit) == leaderIndex:
                suitLeader = suit
                suitIsLeader = 1
                if self.bossBattle == 1 and self.levelDoId in base.cr.doId2do:
                    level = base.cr.doId2do[self.levelDoId]
                    if suit.boss:
                        taunt = level.getBossTaunt()
                    else:
                        taunt = level.getBossBattleTaunt()
                else:
                    taunt = SuitBattleGlobals.getFaceoffTaunt(
                        suit.getStyleName(), suit.doId)
                oneSuitTrack.append(
                    Func(suit.setChatAbsolute, taunt, CFSpeech | CFTimeout))
            destPos, destHpr = self.getActorPosHpr(suit, self.suits)
            oneSuitTrack.append(Wait(delay))
            if suitIsLeader == 1:
                oneSuitTrack.append(Func(suit.clearChat))
            oneSuitTrack.append(
                self.createAdjustInterval(suit, destPos, destHpr))
            suitTrack.append(oneSuitTrack)

        suitHeight = suitLeader.getHeight()
        suitOffsetPnt = Point3(0, 0, suitHeight)
        toonTrack = Parallel()
        for toon in self.toons:
            oneToonTrack = Sequence()
            destPos, destHpr = self.getActorPosHpr(toon, self.toons)
            oneToonTrack.append(Wait(delay))
            oneToonTrack.append(
                self.createAdjustInterval(toon,
                                          destPos,
                                          destHpr,
                                          toon=1,
                                          run=1))
            toonTrack.append(oneToonTrack)

        if self.hasLocalToon():
            MidTauntCamHeight = suitHeight * 0.66
            MidTauntCamHeightLim = suitHeight - 1.8
            if MidTauntCamHeight < MidTauntCamHeightLim:
                MidTauntCamHeight = MidTauntCamHeightLim
            TauntCamY = 18
            TauntCamX = 0
            TauntCamHeight = random.choice((MidTauntCamHeight, 1, 11))
            camTrack = Sequence()
            camTrack.append(Func(camera.reparentTo, suitLeader))
            camTrack.append(Func(base.camLens.setFov, self.camFOFov))
            camTrack.append(
                Func(camera.setPos, TauntCamX, TauntCamY, TauntCamHeight))
            camTrack.append(Func(camera.lookAt, suitLeader, suitOffsetPnt))
            camTrack.append(Wait(delay))
            camTrack.append(Func(base.camLens.setFov, self.camFov))
            camTrack.append(Func(camera.wrtReparentTo, self))
            camTrack.append(Func(camera.setPos, self.camFOPos))
            camTrack.append(Func(camera.lookAt, suit))
        mtrack = Parallel(suitTrack, toonTrack)
        if self.hasLocalToon():
            NametagGlobals.setMasterArrowsOn(0)
            mtrack = Parallel(mtrack, camTrack)
        done = Func(callback)
        track = Sequence(mtrack, done, name=name)
        track.start(ts)
        self.storeInterval(track, name)
        return
예제 #9
0
 def __faceOff(self, ts, name, callback):
     if len(self.suits) == 0:
         self.notify.warning('__faceOff(): no suits.')
         return
     if len(self.toons) == 0:
         self.notify.warning('__faceOff(): no toons.')
         return
     suit = self.suits[0]
     point = self.suitPoints[0][0]
     suitPos = point[0]
     suitHpr = VBase3(point[1], 0.0, 0.0)
     toon = self.toons[0]
     point = self.toonPoints[0][0]
     toonPos = point[0]
     toonHpr = VBase3(point[1], 0.0, 0.0)
     p = toon.getPos(self)
     toon.setPos(self, p[0], p[1], 0.0)
     toon.setShadowHeight(0)
     suit.setState('Battle')
     suitTrack = Sequence()
     toonTrack = Sequence()
     suitTrack.append(Func(suit.loop, 'neutral'))
     suitTrack.append(Func(suit.headsUp, toon))
     taunt = SuitBattleGlobals.getFaceoffTaunt(suit.getStyleName(),
                                               suit.doId)
     suitTrack.append(
         Func(suit.setChatAbsolute, taunt, CFSpeech | CFTimeout))
     toonTrack.append(Func(toon.loop, 'neutral'))
     toonTrack.append(Func(toon.headsUp, suit))
     suitHeight = suit.getHeight()
     suitOffsetPnt = Point3(0, 0, suitHeight)
     faceoffTime = self.calcFaceoffTime(self.getPos(), self.initialSuitPos)
     faceoffTime = max(faceoffTime, BATTLE_SMALL_VALUE)
     delay = FACEOFF_TAUNT_T
     if self.hasLocalToon():
         MidTauntCamHeight = suitHeight * 0.66
         MidTauntCamHeightLim = suitHeight - 1.8
         if MidTauntCamHeight < MidTauntCamHeightLim:
             MidTauntCamHeight = MidTauntCamHeightLim
         TauntCamY = 16
         TauntCamX = random.choice((-5, 5))
         TauntCamHeight = random.choice((MidTauntCamHeight, 1, 11))
         camTrack = Sequence()
         camTrack.append(Func(camera.wrtReparentTo, suit))
         camTrack.append(
             Func(base.camLens.setMinFov, self.camFOFov / (4.0 / 3.0)))
         camTrack.append(
             Func(camera.setPos, TauntCamX, TauntCamY, TauntCamHeight))
         camTrack.append(Func(camera.lookAt, suit, suitOffsetPnt))
         camTrack.append(Wait(delay))
         camTrack.append(
             Func(base.camLens.setMinFov, self.camFov / (4.0 / 3.0)))
         camTrack.append(Func(camera.wrtReparentTo, self))
         camTrack.append(Func(camera.setPos, self.camFOPos))
         camTrack.append(Func(camera.lookAt, suit.getPos(self)))
         camTrack.append(Wait(faceoffTime))
         if self.interactiveProp:
             camTrack.append(
                 Func(camera.lookAt,
                      self.interactiveProp.node.getPos(self)))
             camTrack.append(Wait(FACEOFF_LOOK_AT_PROP_T))
     suitTrack.append(Wait(delay))
     toonTrack.append(Wait(delay))
     suitTrack.append(Func(suit.headsUp, self, suitPos))
     suitTrack.append(Func(suit.clearChat))
     toonTrack.append(Func(toon.headsUp, self, toonPos))
     suitTrack.append(Func(suit.loop, 'walk'))
     suitTrack.append(
         LerpPosInterval(suit, faceoffTime, suitPos, other=self))
     suitTrack.append(Func(suit.loop, 'neutral'))
     suitTrack.append(Func(suit.setHpr, self, suitHpr))
     toonTrack.append(Func(toon.loop, 'run'))
     toonTrack.append(
         LerpPosInterval(toon, faceoffTime, toonPos, other=self))
     toonTrack.append(Func(toon.loop, 'neutral'))
     toonTrack.append(Func(toon.setHpr, self, toonHpr))
     if base.localAvatar == toon:
         soundTrack = Sequence(
             Wait(delay),
             SoundInterval(base.localAvatar.soundRun,
                           loop=1,
                           duration=faceoffTime,
                           node=base.localAvatar))
     else:
         soundTrack = Wait(delay + faceoffTime)
     mtrack = Parallel(suitTrack, toonTrack, soundTrack)
     if self.hasLocalToon():
         NametagGlobals.setWant2dNametags(False)
         mtrack = Parallel(mtrack, camTrack)
     done = Func(callback)
     track = Sequence(mtrack, done, name=name)
     track.delayDeletes = [
         DelayDelete.DelayDelete(toon, '__faceOff'),
         DelayDelete.DelayDelete(suit, '__faceOff')
     ]
     track.start(ts)
     self.storeInterval(track, name)