def placeTrap(trapProp, suit, battle=battle, trapName=trapName):
     if not trapProp or trapProp.isEmpty():
         return
     trapProp.wrtReparentTo(suit)
     trapProp.show()
     if trapName == 'rake':
         trapProp.setPos(0, MovieUtil.SUIT_TRAP_RAKE_DISTANCE, 0)
         trapProp.setHpr(Point3(0, 270, 0))
         trapProp.setScale(Point3(0.7, 0.7, 0.7))
         rakeOffset = MovieUtil.getSuitRakeOffset(suit)
         trapProp.setY(trapProp.getY() + rakeOffset)
     elif trapName == 'banana':
         trapProp.setHpr(0, 0, 0)
         trapProp.setPos(0, MovieUtil.SUIT_TRAP_DISTANCE, -0.35)
         trapProp.pose(trapName, trapProp.getNumFrames(trapName) - 1)
     elif trapName == 'marbles':
         trapProp.setHpr(Point3(94, 0, 0))
         trapProp.setPos(0, MovieUtil.SUIT_TRAP_MARBLES_DISTANCE, 0)
         trapProp.pose(trapName, trapProp.getNumFrames(trapName) - 1)
     elif trapName == 'tnt':
         trapProp.setHpr(0, 90, 0)
         trapProp.setPos(0, MovieUtil.SUIT_TRAP_TNT_DISTANCE, 0.4)
     else:
         notify.warning(
             'placeTrap() - Incorrect trap: %s placed on a suit' % trapName)
Esempio n. 2
0
def __createSuitDamageTrack(battle, suit, hp, lure, trapProp):
    if trapProp is None or trapProp.isEmpty():
        return Func(suit.loop, 'lured')
    trapProp.wrtReparentTo(battle)
    trapTrack = ToontownBattleGlobals.TRAP_TRACK
    trapLevel = suit.battleTrap
    trapTrackNames = ToontownBattleGlobals.AvProps[trapTrack]
    trapName = trapTrackNames[trapLevel]
    result = Sequence()

    def reparentTrap(trapProp=trapProp, battle=battle):
        if trapProp and not trapProp.isEmpty():
            trapProp.wrtReparentTo(battle)

    result.append(Func(reparentTrap))
    parent = battle
    if suit.battleTrapIsFresh == 1:
        if trapName == 'quicksand' or trapName == 'trapdoor':
            trapProp.hide()
            trapProp.reparentTo(suit)
            trapProp.setPos(Point3(0, MovieUtil.SUIT_TRAP_DISTANCE, 0))
            trapProp.setHpr(Point3(0, 0, 0))
            trapProp.wrtReparentTo(battle)
        elif trapName == 'rake':
            trapProp.hide()
            trapProp.reparentTo(suit)
            trapProp.setPos(0, MovieUtil.SUIT_TRAP_RAKE_DISTANCE, 0)
            trapProp.setHpr(Point3(0, 270, 0))
            trapProp.setScale(Point3(0.7, 0.7, 0.7))
            rakeOffset = MovieUtil.getSuitRakeOffset(suit)
            trapProp.setY(trapProp.getY() + rakeOffset)
        else:
            parent = render
    if trapName == 'banana':
        slidePos = trapProp.getPos(parent)
        slidePos.setY(slidePos.getY() - 5.1)
        moveTrack = Sequence(
            Wait(0.1), LerpPosInterval(trapProp, 0.1, slidePos, other=battle))
        animTrack = Sequence(
            ActorInterval(trapProp, 'banana', startTime=3.1), Wait(1.1),
            LerpScaleInterval(trapProp, 1, Point3(0.01, 0.01, 0.01)))
        suitTrack = ActorInterval(suit, 'slip-backward')
        damageTrack = Sequence(Wait(0.5),
                               Func(suit.showHpText, -hp, openEnded=0),
                               Func(suit.updateHealthBar, hp))
        if random.random() <= 0.01:
            soundTrack = Sequence(
                Parallel(
                    SoundInterval(globalBattleSoundCache.getSound(
                        'AA_pie_throw_only.ogg'),
                                  node=suit),
                    Func(
                        base.playSfx,
                        globalBattleSoundCache.getSound(
                            'AA_WHATAREYOUDOING.ogg'))),
                SoundInterval(globalBattleSoundCache.getSound(
                    'Toon_bodyfall_synergy.ogg'),
                              node=suit))
        else:
            soundTrack = Sequence(
                SoundInterval(
                    globalBattleSoundCache.getSound('AA_pie_throw_only.ogg'),
                    node=suit),
                SoundInterval(globalBattleSoundCache.getSound(
                    'Toon_bodyfall_synergy.ogg'),
                              node=suit))
        result.append(
            Parallel(moveTrack, animTrack, suitTrack, damageTrack, soundTrack))
    elif trapName == 'rake' or trapName == 'rake-react':
        hpr = trapProp.getHpr(parent)
        upHpr = Vec3(hpr[0], 179.9999, hpr[2])
        bounce1Hpr = Vec3(hpr[0], 120, hpr[2])
        bounce2Hpr = Vec3(hpr[0], 100, hpr[2])
        rakeTrack = Sequence(
            Wait(0.5), LerpHprInterval(trapProp, 0.1, upHpr, startHpr=hpr),
            Wait(0.7), LerpHprInterval(trapProp, 0.4, hpr, startHpr=upHpr),
            LerpHprInterval(trapProp, 0.15, bounce1Hpr, startHpr=hpr),
            LerpHprInterval(trapProp, 0.05, hpr, startHpr=bounce1Hpr),
            LerpHprInterval(trapProp, 0.15, bounce2Hpr, startHpr=hpr),
            LerpHprInterval(trapProp, 0.05, hpr, startHpr=bounce2Hpr),
            Wait(0.2),
            LerpScaleInterval(trapProp, 0.2, Point3(0.01, 0.01, 0.01)))
        rakeAnimDuration = 3.125
        suitTrack = ActorInterval(suit,
                                  'rake-react',
                                  duration=rakeAnimDuration)
        damageTrack = Sequence(Wait(0.5),
                               Func(suit.showHpText, -hp, openEnded=0),
                               Func(suit.updateHealthBar, hp))
        soundTrack = getSoundTrack('TL_step_on_rake.ogg', delay=0.6, node=suit)
        result.append(Parallel(rakeTrack, suitTrack, damageTrack, soundTrack))
    elif trapName == 'marbles':
        slidePos = trapProp.getPos(parent)
        slidePos.setY(slidePos.getY() - 6.5)
        moveTrack = Sequence(
            Wait(0.1), LerpPosInterval(trapProp, 0.8, slidePos, other=battle),
            Wait(1.1), LerpScaleInterval(trapProp, 1, Point3(0.01, 0.01,
                                                             0.01)))
        animTrack = ActorInterval(trapProp, 'marbles', startTime=3.1)
        suitTrack = ActorInterval(suit, 'slip-backward')
        damageTrack = Sequence(Wait(0.5),
                               Func(suit.showHpText, -hp, openEnded=0),
                               Func(suit.updateHealthBar, hp))
        soundTrack = Sequence(
            SoundInterval(
                globalBattleSoundCache.getSound('AA_pie_throw_only.ogg'),
                duration=0.55,
                node=suit),
            SoundInterval(
                globalBattleSoundCache.getSound('Toon_bodyfall_synergy.ogg'),
                node=suit))
        result.append(
            Parallel(moveTrack, animTrack, suitTrack, damageTrack, soundTrack))
    elif trapName == 'quicksand':
        sinkPos1 = trapProp.getPos(battle)
        sinkPos2 = trapProp.getPos(battle)
        dropPos = trapProp.getPos(battle)
        landPos = trapProp.getPos(battle)
        sinkPos1.setZ(sinkPos1.getZ() - 3.1)
        sinkPos2.setZ(sinkPos2.getZ() - 9.1)
        dropPos.setZ(dropPos.getZ() + 15)
        if base.config.GetBool('want-new-cogs', 0):
            nameTag = suit.find('**/def_nameTag')
        else:
            nameTag = suit.find('**/joint_nameTag')
        trapTrack = Sequence(
            Wait(2.4),
            LerpScaleInterval(trapProp, 0.8, Point3(0.01, 0.01, 0.01)))
        moveTrack = Sequence(
            Wait(0.9), LerpPosInterval(suit, 0.9, sinkPos1, other=battle),
            LerpPosInterval(suit, 0.4, sinkPos2, other=battle),
            Func(suit.setPos, battle, dropPos), Func(suit.wrtReparentTo,
                                                     hidden), Wait(1.1),
            Func(suit.wrtReparentTo, battle),
            LerpPosInterval(suit, 0.3, landPos, other=battle))
        animTrack = Sequence(ActorInterval(suit, 'flail'),
                             ActorInterval(suit, 'flail', startTime=1.1),
                             Wait(0.7),
                             ActorInterval(suit, 'slip-forward', duration=2.1))
        damageTrack = Sequence(Wait(3.5),
                               Func(suit.showHpText, -hp, openEnded=0),
                               Func(suit.updateHealthBar, hp))
        soundTrack = Sequence(
            Wait(0.7),
            SoundInterval(globalBattleSoundCache.getSound('TL_quicksand.ogg'),
                          node=suit), Wait(0.1),
            SoundInterval(
                globalBattleSoundCache.getSound('Toon_bodyfall_synergy.ogg'),
                node=suit))
        result.append(
            Parallel(trapTrack, moveTrack, animTrack, damageTrack, soundTrack))
    elif trapName == 'trapdoor':
        sinkPos = trapProp.getPos(battle)
        dropPos = trapProp.getPos(battle)
        landPos = trapProp.getPos(battle)
        sinkPos.setZ(sinkPos.getZ() - 9.1)
        dropPos.setZ(dropPos.getZ() + 15)
        trapTrack = Sequence(
            Wait(2.4),
            LerpScaleInterval(trapProp, 0.8, Point3(0.01, 0.01, 0.01)))
        moveTrack = Sequence(Wait(2.2),
                             LerpPosInterval(suit, 0.4, sinkPos, other=battle),
                             Func(suit.setPos, battle, dropPos),
                             Func(suit.wrtReparentTo, hidden), Wait(1.6),
                             Func(suit.wrtReparentTo, battle),
                             LerpPosInterval(suit, 0.3, landPos, other=battle))
        animTrack = Sequence(
            getSplicedLerpAnimsTrack(suit, 'flail', 0.7, 0.25),
            Func(trapProp.setColor, Vec4(0, 0, 0, 1)),
            ActorInterval(suit, 'flail', startTime=0.7, endTime=0),
            ActorInterval(suit, 'neutral', duration=0.5),
            ActorInterval(suit, 'flail', startTime=1.1), Wait(1.1),
            ActorInterval(suit, 'slip-forward', duration=2.1))
        damageTrack = Sequence(Wait(3.5),
                               Func(suit.showHpText, -hp, openEnded=0),
                               Func(suit.updateHealthBar, hp))
        soundTrack = Sequence(
            Wait(0.8),
            SoundInterval(globalBattleSoundCache.getSound('TL_trap_door.ogg'),
                          node=suit), Wait(0.8),
            SoundInterval(
                globalBattleSoundCache.getSound('Toon_bodyfall_synergy.ogg'),
                node=suit))
        result.append(
            Parallel(trapTrack, moveTrack, animTrack, damageTrack, soundTrack))
    elif trapName == 'tnt':
        tntTrack = ActorInterval(trapProp, 'tnt')
        explosionTrack = Sequence(
            Wait(2.3),
            createTNTExplosionTrack(battle,
                                    trapProp=trapProp,
                                    relativeTo=parent))
        flyPos = suit.getPos()
        flyPos.setZ(suit.getZ() + 17)
        dropPos = suit.getPos()
        oldCamera = base.camera.getPos()
        oldHPR = base.camera.getHpr()
        suitTrack = Sequence(ActorInterval(suit, 'flail', duration=0.7))
        suitTrack.append(
            ActorInterval(suit, 'flail', startTime=0.7, endTime=0.0))
        suitTrack.append(ActorInterval(suit, 'neutral', duration=0.4))
        suitTrack.append(
            ActorInterval(suit, 'flail', startTime=0.6, endTime=0.7))
        if base.localAvatar in battle.activeToons:
            suitTrack.append(
                Parallel(
                    base.camera.posHprInterval(0.4,
                                               Point3(oldCamera[0],
                                                      oldCamera[1],
                                                      oldCamera[2]),
                                               Point3(0, 30, 0),
                                               blendType='easeInOut'),
                    Func(battle.movie.needRestoreColor),
                    Func(suit.setColorScale, Vec4(0.2, 0.2, 0.2, 1)),
                    Func(trapProp.reparentTo, hidden),
                    ActorInterval(suit,
                                  'flail',
                                  startTime=0.9,
                                  duration=0.4,
                                  endTime=1.3),
                    LerpPosInterval(suit, 0.3, flyPos)))
        else:
            suitTrack.append(
                Parallel(Func(battle.movie.needRestoreColor),
                         Func(suit.setColorScale, Vec4(0.2, 0.2, 0.2, 1)),
                         Func(trapProp.reparentTo, hidden),
                         ActorInterval(suit, 'flail', startTime=0.9),
                         LerpPosInterval(suit, 0.3, flyPos)))
        if suit.maxHP <= 42:
            suitTrack.append(midairSuitExplodeTrack(suit, battle))
            damageTrack = Sequence(Wait(2.4),
                                   Func(suit.showHpText, -hp, openEnded=0),
                                   Func(suit.updateHealthBar, hp))
            explosionSound = base.loadSfx(
                'phase_3.5/audio/sfx/ENC_cogfall_apart.ogg')
            soundTrack = Sequence(
                SoundInterval(
                    globalBattleSoundCache.getSound('TL_dynamite.ogg'),
                    duration=2.0,
                    node=suit),
                SoundInterval(explosionSound, duration=0.6, node=suit))
        else:
            if base.localAvatar in battle.activeToons:
                suitTrack.append(
                    Parallel(
                        Sequence(
                            Wait(0.3),
                            base.camera.posHprInterval(0.5,
                                                       Point3(*oldCamera),
                                                       Point3(*oldHPR),
                                                       blendType='easeInOut')),
                        ActorInterval(suit, 'slip-backward', playRate=1),
                        LerpPosInterval(suit, 0.7, dropPos)))
            else:
                suitTrack.append(
                    Parallel(ActorInterval(suit, 'slip-backward', playRate=1),
                             LerpPosInterval(suit, 0.7, dropPos)))
            suitTrack.append(Func(suit.clearColorScale))
            suitTrack.append(Func(trapProp.sparksEffect.cleanup))
            suitTrack.append(Func(battle.movie.clearRestoreColor))
            damageTrack = Sequence(Wait(2.3),
                                   Func(suit.showHpText, -hp, openEnded=0),
                                   Func(suit.updateHealthBar, hp))
            explosionSound = base.loadSfx(
                'phase_3.5/audio/sfx/ENC_cogfall_apart.ogg')
            soundTrack = Sequence(
                SoundInterval(
                    globalBattleSoundCache.getSound('TL_dynamite.ogg'),
                    duration=2.0,
                    node=suit),
                SoundInterval(explosionSound, duration=0.6, node=suit))
        result.append(
            Parallel(tntTrack, suitTrack, damageTrack, explosionTrack,
                     soundTrack))
        if suit.maxHP <= 42:
            suit.battleTrapProp = trapProp
            result.append(Func(battle.removeTrap, suit, True))
            return result
    elif trapName == 'traintrack':
        trainInterval = createIncomingTrainInterval(battle, suit, hp, lure,
                                                    trapProp)
        result.append(trainInterval)
    else:
        notify.warning('unknown trapName: %s detected on suit: %s' %
                       (trapName, suit))
    suit.battleTrapProp = trapProp
    result.append(Func(battle.removeTrap, suit, True))
    result.append(Func(battle.unlureSuit, suit))
    result.append(__createSuitResetPosTrack(suit, battle))
    result.append(Func(suit.loop, 'neutral'))
    if trapName == 'traintrack':
        result.append(Func(MovieUtil.removeProp, trapProp))
    return result