def __doTesla(zap, delay, fShowStun):
    toon = zap['toon']
    level = zap['level']
    hpbonus = zap['hpbonus']
    target = zap['target']
    suit = target['suit']
    hp = target['hp']
    kbbonus = target['kbbonus']
    died = target['died']
    revived = target['revived']
    leftSuits = target['leftSuits']
    rightSuits = target['rightSuits']
    battle = zap['battle']
    suitPos = suit.getPos(battle)
    origHpr = toon.getHpr(battle)
    hitSuit = hp > 0
    scale = sprayScales[level]
    tButton = 0.0
    dButtonScale = 0.5
    dButtonHold = 3.0
    dSprayScale = 0.1
    dSprayHold = 1.8
    tContact = 2.9
    tSpray = 2.5
    tSprayDelay = 2.5
    tSuitDodges = 1.8
    shrinkDuration = 0.4
    tracks = Parallel()
    soundTrack = __getSoundTrack(level, hitSuit, 2.3, toon)
    tracks.append(soundTrack)
    button = globalPropPool.getProp('button')
    button2 = MovieUtil.copyProp(button)
    buttons = [button, button2]
    hands = toon.getLeftHands()
    toonTrack = Sequence(Func(MovieUtil.showProps, buttons, hands),
                         Func(toon.headsUp, battle, suitPos),
                         ActorInterval(toon, 'pushbutton'),
                         Func(MovieUtil.removeProps, buttons),
                         Func(toon.loop, 'neutral'),
                         Func(toon.setHpr, battle, origHpr))
    tracks.append(toonTrack)
    coil = globalPropPool.getProp('tesla')
    coilPos = Point3(toon.getX(battle), 2, 0)
    coilHpr = Point3(0, 0, 0)
    propTrack = Sequence()
    propTrack.append(Func(coil.show))
    propTrack.append(Func(coil.setScale, Point3(0.1, 0.1, 0.1)))
    propTrack.append(Func(coil.reparentTo, battle))
    propTrack.append(LerpScaleInterval(coil, 1.5, Point3(1.0, 1.0, 1.0)))
    propTrack.append(Wait(tSpray + 2))
    propTrack.append(
        LerpScaleInterval(nodePath=coil,
                          scale=Point3(1.0, 1.0, 0.1),
                          duration=shrinkDuration))
    propTrack.append(Func(MovieUtil.removeProp, coil))
    tracks.append(propTrack)
    targetPoint = lambda suit=suit: __suitTargetPoint(suit)

    def getSprayStartPos(coil=coil, toon=toon):
        toon.update(0)
        p = coil.getPos(render)
        p.setZ(5)
        return p

    sprayTrack = Sequence()
    sprayTrack.append(Wait(tSprayDelay))
    sprayTrack.append(
        MovieUtil.getZapTrack(battle,
                              WaterSprayColor,
                              getSprayStartPos,
                              targetPoint,
                              dSprayScale,
                              dSprayHold,
                              dSprayScale,
                              horizScale=scale,
                              vertScale=scale))
    tracks.append(sprayTrack)
    if hp > 0 or delay <= 0:
        tracks.append(
            __getSuitTrack(suit,
                           tContact,
                           tSuitDodges,
                           hp,
                           hpbonus,
                           kbbonus,
                           'shock',
                           died,
                           leftSuits,
                           rightSuits,
                           battle,
                           toon,
                           fShowStun,
                           revived=revived))
    return tracks
def __doRug(zap, delay, fShowStun):
    toon = zap['toon']
    level = zap['level']
    hpbonus = zap['hpbonus']
    target = zap['target']
    suit = target['suit']
    hp = target['hp']
    kbbonus = target['kbbonus']
    died = target['died']
    revived = target['revived']
    leftSuits = target['leftSuits']
    rightSuits = target['rightSuits']
    battle = zap['battle']
    suitPos = suit.getPos(battle)
    origHpr = toon.getHpr(battle)
    hitSuit = hp > 0
    scale = sprayScales[level]
    tSpray = 5.2
    sprayPoseFrame = 88
    dSprayScale = 0.1
    dSprayHold = 0.1
    tContact = tSpray + dSprayScale
    tSuitDodges = max(tSpray - 0.5, 0.0)
    tracks = Parallel()
    tracks.append(ActorInterval(toon, 'run'))
    soundTrack = __getSoundTrack(level, hitSuit, 0, toon)
    tracks.append(soundTrack)
    rug = globalPropPool.getProp('zapRug')
    rugPos = Point3(0, 0, 0.025)
    rugHpr = Point3(0, 0, 0)
    glassTrack = Sequence(
        Func(MovieUtil.showProp, rug, toon, rugPos, rugHpr),
        ActorInterval(toon, 'walk', playRate=0.7), ActorInterval(toon, 'run'),
        ActorInterval(toon, 'run', playRate=1.1),
        ActorInterval(toon, 'run', playRate=1.2),
        ActorInterval(toon, 'run', playRate=1.3),
        ActorInterval(toon, 'run', playRate=1.4),
        ActorInterval(toon, 'water', playRate=1, startFrame=0, endFrame=36),
        Wait(1), Func(MovieUtil.removeProp, rug), Func(toon.loop, 'neutral'),
        Func(toon.setHpr, battle, origHpr))
    tracks.append(glassTrack)
    targetPoint = lambda suit=suit: __suitTargetPoint(suit)

    def getSprayStartPos(toon=toon):
        toon.update(0)
        lod0 = toon.getLOD(toon.getLODNames()[0])
        if base.config.GetBool('want-new-anims', 1):
            if not lod0.find('**/def_joint_right_hold').isEmpty():
                joint = lod0.find('**/def_joint_right_hold')
            else:
                joint = lod0.find('**/joint_Rhold')
        else:
            joint = lod0.find('**/joint_Rhold')
        p = joint.getPos(render)
        return p

    sprayTrack = MovieUtil.getZapTrack(battle,
                                       WaterSprayColor,
                                       getSprayStartPos,
                                       targetPoint,
                                       dSprayScale,
                                       dSprayHold,
                                       dSprayScale,
                                       horizScale=scale,
                                       vertScale=scale)
    tracks.append(Sequence(Wait(tSpray), sprayTrack))
    if hp > 0 or delay <= 0:
        tracks.append(
            __getSuitTrack(suit,
                           tContact,
                           tSuitDodges,
                           hp,
                           hpbonus,
                           kbbonus,
                           'shock',
                           died,
                           leftSuits,
                           rightSuits,
                           battle,
                           toon,
                           fShowStun,
                           revived=revived))
    return tracks
def __doTazer(zap, delay, fShowStun):
    toon = zap['toon']
    level = zap['level']
    hpbonus = zap['hpbonus']
    target = zap['target']
    suit = target['suit']
    hp = target['hp']
    kbbonus = target['kbbonus']
    died = target['died']
    revived = target['revived']
    leftSuits = target['leftSuits']
    rightSuits = target['rightSuits']
    battle = zap['battle']
    suitPos = suit.getPos(battle)
    origHpr = toon.getHpr(battle)
    origPos = toon.getPos(battle)
    tazer = globalPropPool.getProp('tazer')
    tazer.setHpr(180, 0, 0)
    runBackHpr = Vec3(0, 0, 0)
    hands = toon.getRightHands()
    hand_jointpath0 = hands[0].attachNewNode('handJoint0-path')
    hand_jointpath1 = hand_jointpath0.instanceTo(hands[1])
    hitSuit = hp > 0
    scale = 0.3
    tAppearDelay = 0.7
    dHoseHold = 0.7
    midPos = Point3(toon.getX(battle) * .5, 0, 0)
    runDur = 1
    tSprayDelay = 2
    tSpray = 1
    dSprayScale = 0.1
    dSprayHold = 1.8
    tContact = 2
    tSuitDodges = 2.1
    tracks = Parallel()
    toonTrack = Sequence(Wait(tAppearDelay),
                         Func(MovieUtil.showProp, tazer, hand_jointpath0),
                         Func(toon.headsUp, battle, suitPos),
                         Func(toon.loop, 'run'), Wait(1),
                         Func(toon.pingpong, 'cast', fromFrame=30, toFrame=40),
                         Wait(3), Func(toon.stop),
                         Func(toon.setHpr, battle, runBackHpr),
                         Func(toon.loop, 'run'), Func(toon.loop, 'neutral'),
                         Func(MovieUtil.removeProp, tazer),
                         Func(toon.setHpr, battle, origHpr))
    moveTrack = Sequence(Wait(tAppearDelay),
                         LerpPosInterval(toon, runDur, midPos, other=battle),
                         Wait(3),
                         LerpPosInterval(toon, runDur, origPos, other=battle))
    tracks.append(toonTrack)
    tracks.append(moveTrack)
    soundTrack = __getSoundTrack(level, hitSuit, tSprayDelay, toon)
    tracks.append(soundTrack)
    targetPoint = lambda suit=suit: __suitTargetPoint(suit)

    def getSprayStartPos(tazer=tazer, toon=toon):
        toon.update(0)
        p = tazer.getPos(render)
        return p

    sprayTrack = Sequence()
    sprayTrack.append(Wait(tSprayDelay))
    sprayTrack.append(
        MovieUtil.getZapTrack(battle,
                              WaterSprayColor,
                              getSprayStartPos,
                              targetPoint,
                              dSprayScale,
                              dSprayHold,
                              dSprayScale,
                              horizScale=scale,
                              vertScale=scale))
    tracks.append(sprayTrack)
    if hp > 0 or delay <= 0:
        tracks.append(
            __getSuitTrack(suit,
                           tContact,
                           tSuitDodges,
                           hp,
                           hpbonus,
                           kbbonus,
                           'shock',
                           died,
                           leftSuits,
                           rightSuits,
                           battle,
                           toon,
                           fShowStun,
                           revived=revived))
    return tracks
def __doJoybuzzer(zap, delay, fShowStun):
    toon = zap['toon']
    level = zap['level']
    hpbonus = zap['hpbonus']
    target = zap['target']
    suit = target['suit']
    hp = target['hp']
    kbbonus = target['kbbonus']
    died = target['died']
    revived = target['revived']
    leftSuits = target['leftSuits']
    rightSuits = target['rightSuits']
    battle = zap['battle']
    suitPos = suit.getPos(battle)
    origHpr = toon.getHpr(battle)
    hitSuit = hp > 0
    scale = sprayScales[level]
    tTotalFlowerToonAnimationTime = 2
    tFlowerFirstAppears = 1.0
    dFlowerScaleTime = 0.5
    tSprayStarts = tTotalFlowerToonAnimationTime
    dSprayScale = 0.2
    dSprayHold = 0.1
    tContact = tSprayStarts + dSprayScale
    tSuitDodges = tTotalFlowerToonAnimationTime
    tracks = Parallel()
    button = globalPropPool.getProp('joybuzz')
    button2 = MovieUtil.copyProp(button)
    buttons = [button, button2]
    hands = toon.getRightHands()
    toonTrack = Sequence(
        Func(MovieUtil.showProps, buttons, hands, Vec3((0.3, 0, 0)),
             Vec3((-10, -60, 0))), Func(toon.headsUp, battle, suitPos),
        ActorInterval(toon, 'water-gun'), Func(MovieUtil.removeProps, buttons),
        Func(toon.loop, 'neutral'), Func(toon.setHpr, battle, origHpr))
    tracks.append(toonTrack)
    tracks.append(
        __getSoundTrack(level, hitSuit, tTotalFlowerToonAnimationTime, toon))
    targetPoint = lambda suit=suit: __suitTargetPoint(suit)

    def getSprayStartPos(toon=toon):
        toon.update(0)
        p = button2.getPos(toon)
        return p

    sprayTrack = MovieUtil.getZapTrack(battle,
                                       WaterSprayColor,
                                       getSprayStartPos,
                                       targetPoint,
                                       dSprayScale,
                                       dSprayHold,
                                       dSprayScale,
                                       horizScale=scale,
                                       vertScale=scale)
    if hp > 0 or delay <= 0:
        tracks.append(
            __getSuitTrack(suit,
                           tContact,
                           tSuitDodges,
                           hp,
                           hpbonus,
                           kbbonus,
                           'shock',
                           died,
                           leftSuits,
                           rightSuits,
                           battle,
                           toon,
                           fShowStun,
                           revived=revived))
    return tracks