Пример #1
0
    def load(self):
        #tracks = self.__accumulateTracks()
        #for i in range(len(tracks)):
        #    track = GagTrack(self, tracks[i])
        #    track.load()
        #    track.reparentTo(self)
        #    track.setX(FRAME_OFFSET * i)
        #    self.tracks.append(track)
        track = GagTrack(self, name = "Gags", color = (67 / 255.0, 243 / 255.0, 255 / 255.0))
        track.load()
        track.reparentTo(self)
        track.setX(FRAME_OFFSET)
        self.tracks.append(track)

        self.midpoint = (len(self.tracks) / 2.0) * -FRAME_OFFSET
        # Center the gui horizontally
        self.setX(self.midpoint)
        self.ammoFrame.setX(-self.midpoint)

        if base.config.GetBool('gsg-want-hlsounds', False):
            self.newTrackSound = base.loadSfx("phase_14/audio/sfx/wpn_hudon.ogg")
            self.keyScrollSound = base.loadSfx('phase_14/audio/sfx/wpn_moveselect.ogg')
            self.selectSound = base.loadSfx('phase_14/audio/sfx/wpn_select.ogg')
            self.selectDenySound = base.loadSfx('phase_14/audio/sfx/wpn_denyselect.ogg')
        else:
            self.newTrackSound = base.loadSfx("phase_3/audio/sfx/GUI_create_toon_back.ogg")
            self.keyScrollSound = base.loadSfx('phase_3/audio/sfx/GUI_rollover.ogg')
            self.selectSound = base.loadSfx('phase_3/audio/sfx/GUI_create_toon_fwd.ogg')
            self.selectDenySound = base.loadSfx('phase_4/audio/sfx/ring_miss.ogg')

        self.fwdShakeIval = Effects.createXBounce(self, 1, Vec3(self.midpoint, 0, 0.93), 0.05, 0.05)
        self.revShakeIval = Effects.createXBounce(self, 1, Vec3(self.midpoint, 0, 0.93), 0.05, -0.05)
        
        if base.localAvatar.hasAttacks():
            self.updateCurrentTrack(0)
    def onActivate(self, ignore, suit):
        self.objTrack.finish()
        self.objTrack = None
        if not suit.isDead():
            suit.setAnimState('drop-react')
        suit.d_disableMovement(wantRay=True)

        if not self.gag or self.gag.isEmpty():
            self.build()

        self.gag.setPos(suit.find('**/joint_head').getPos(render))
        if self.name == CIGlobals.FlowerPot:
            self.gag.setZ(self.gag, 3)
        bounce = Effects.createScaleZBounce(self.gag, 1,
                                            self.gag.getScale(render), 0.3,
                                            0.75)
        dummyNode = suit.attachNewNode('fallOffNode')
        dummyNode.setX(2)
        dummyNode.setY(-2)
        flightIval = FlightProjectileInterval(self.gag,
                                              startPos=self.gag.getPos(render),
                                              endPos=dummyNode.getPos(render),
                                              duration=0.8,
                                              gravityMult=.35)
        Sequence(Parallel(bounce, flightIval), Wait(self.stunTime),
                 Func(suit.d_enableMovement)).start()

        dummyNode.removeNode()
        del dummyNode
Пример #3
0
 def startDrop(self, entity):
     if entity and self.dropLoc:
         endPos = self.dropLoc
         dropMdl = entity.find('**/DropMdl')
         startPos = Point3(endPos.getX(), endPos.getY(), endPos.getZ() + 20)
         entity.setPos(startPos.getX(),
                       startPos.getY() + 2, startPos.getZ())
         dropMdl.setScale(5 * 0.85)
         entity.node().setBounds(OmniBoundingVolume())
         entity.node().setFinal(1)
         entity.headsUp(self.avatar)
         self.buildCollisions(entity)
         objectTrack = Sequence()
         animProp = LerpPosInterval(entity,
                                    self.fallDuration,
                                    endPos,
                                    startPos=startPos)
         bounceProp = Effects.createZBounce(entity, 2, endPos, 0.5, 1.5)
         objAnimShrink = Sequence(Func(dropMdl.setScale, 5), Wait(0.5),
                                  Func(entity.reparentTo, render), animProp,
                                  bounceProp)
         objectTrack.append(objAnimShrink)
         dropShadow = CIGlobals.makeDropShadow(1.0)
         dropShadow.reparentTo(hidden)
         dropShadow.setPos(endPos)
         shadowTrack = Sequence(
             Func(dropShadow.reparentTo, render),
             LerpScaleInterval(dropShadow,
                               self.fallDuration + 0.1, (1, 1, 1),
                               startScale=Point3(0.01, 0.01, 0.01)),
             Wait(0.8), Func(dropShadow.removeNode))
         Parallel(
             Sequence(Wait(self.fallDuration), Func(self.completeDrop)),
             objectTrack, shadowTrack).start()
         self.dropLoc = None
Пример #4
0
 def startDrop(self):
     if self.gag and self.dropLoc:
         x, y, z = self.dropLoc
         startPos = Point3(x, y, z + 20)
         self.gag.setPos(x, y + 2, z)
         self.gag.node().setBounds(OmniBoundingVolume())
         self.gag.node().setFinal(1)
         self.gag.headsUp(self.avatar)
         if self.rotate90:
             self.gag.setH(self.gag.getH() - 90)
         self.buildCollisions()
         objectTrack = Sequence()
         animProp = LerpPosInterval(self.gag, self.fallDuration, self.dropLoc, startPos=startPos)
         bounceProp = Effects.createZBounce(self.gag, 2, self.dropLoc, 0.5, 1.5)
         objAnimShrink = Sequence(Wait(0.5), Func(self.gag.reparentTo, render), animProp, bounceProp)
         objectTrack.append(objAnimShrink)
         dropShadow = loader.loadModel("phase_3/models/props/drop_shadow.bam")
         dropShadow.reparentTo(render)
         dropShadow.setPos(self.dropLoc)
         dropShadow.setScale(self.getShadowScale())
         shadowTrack = Sequence(
             LerpScaleInterval(
                 dropShadow, self.fallDuration + 0.1, dropShadow.getScale(), startScale=Point3(0.01, 0.01, 0.01)
             ),
             Wait(0.3),
             Func(dropShadow.removeNode),
         )
         self.objTrack = Parallel(
             Sequence(Wait(self.fallDuration), Func(self.completeDrop)), objectTrack, shadowTrack
         )
         self.objTrack.start()
         self.dropLoc = None
     return
Пример #5
0
 def onActivate(self, ignore, suit):
     self.objTrack.finish()
     self.objTrack = None
     if not suit.isDead():
         suit.setAnimState("drop-react")
     suit.d_disableMovement(wantRay=True)
     self.gag.setPos(suit.find("**/joint_head").getPos(render))
     if self.name == CIGlobals.FlowerPot:
         self.gag.setZ(self.gag, 3)
     bounce = Effects.createScaleZBounce(self.gag, 1, self.gag.getScale(render), 0.3, 0.75)
     dummyNode = suit.attachNewNode("fallOffNode")
     dummyNode.setX(2)
     dummyNode.setY(-2)
     flightIval = FlightProjectileInterval(
         self.gag, startPos=self.gag.getPos(render), endPos=dummyNode.getPos(render), duration=0.8, gravityMult=0.35
     )
     Sequence(Parallel(bounce, flightIval), Wait(self.stunTime), Func(suit.d_enableMovement)).start()
     dummyNode.removeNode()
     del dummyNode
     return
Пример #6
0
 def startDrop(self, entity):
     if entity and self.dropLoc:
         x, y, z = self.dropLoc
         startPos = Point3(x, y, z + 20)
         entity.setPos(startPos)
         entity.node().setBounds(OmniBoundingVolume())
         entity.node().setFinal(1)
         entity.headsUp(self.avatar)
         entity.setPythonTag('EntityRoot', entity)
         if self.rotate90:
             entity.setH(entity.getH() - 90)
         self.buildCollisions(entity)
         objectTrack = Sequence()
         animProp = LerpPosInterval(entity,
                                    self.fallDuration,
                                    self.dropLoc,
                                    startPos=startPos)
         bounceProp = Effects.createZBounce(entity, 2, self.dropLoc, 0.5,
                                            1.5)
         objAnimShrink = Sequence(Wait(0.5), Func(entity.reparentTo,
                                                  render), animProp,
                                  bounceProp)
         objectTrack.append(objAnimShrink)
         dropShadow = CIGlobals.makeDropShadow(1.0)
         dropShadow.reparentTo(hidden)
         dropShadow.setPos(self.dropLoc)
         if self.name == GagGlobals.FlowerPot:
             dropShadow.setZ(dropShadow.getZ() - 3.5)
         dropShadow.setScale(0.01)
         shadowTrack = Sequence(
             Func(dropShadow.reparentTo, render),
             LerpScaleInterval(dropShadow,
                               self.fallDuration + 0.1,
                               self.getShadowScale(),
                               startScale=Point3(0.01, 0.01, 0.01)),
             Wait(0.8), Func(dropShadow.removeNode))
         self.objTrack = Parallel(
             Sequence(Wait(self.fallDuration), Func(self.completeDrop)),
             objectTrack, shadowTrack)
         self.objTrack.start()
         self.dropLoc = None
Пример #7
0
 def startDrop(self):
     if self.gag and self.dropLoc:
         endPos = self.dropLoc
         startPos = Point3(endPos.getX(), endPos.getY(), endPos.getZ() + 20)
         self.gag.setPos(startPos.getX(), startPos.getY() + 2, startPos.getZ())
         self.gag.setScale(self.gag.getScale() * 0.75)
         self.gag.node().setBounds(OmniBoundingVolume())
         self.gag.node().setFinal(1)
         self.gag.headsUp(self.avatar)
         self.buildCollisions()
         objectTrack = Sequence()
         animProp = LerpPosInterval(self.gag, self.fallDuration, endPos, startPos=startPos)
         bounceProp = Effects.createZBounce(self.gag, 2, endPos, 0.5, 1.5)
         objAnimShrink = Sequence(Wait(0.5), Func(self.gag.reparentTo, render), animProp, bounceProp)
         objectTrack.append(objAnimShrink)
         dropShadow = loader.loadModel('phase_3/models/props/drop_shadow.bam')
         dropShadow.reparentTo(render)
         dropShadow.setPos(endPos)
         shadowTrack = Sequence(LerpScaleInterval(dropShadow, self.fallDuration + 0.1, dropShadow.getScale() * 2, startScale=Point3(0.01, 0.01, 0.01)), Wait(0.3), Func(dropShadow.removeNode))
         Parallel(Sequence(Wait(self.fallDuration), Func(self.completeDrop), Wait(4), Func(self.cleanupGag)), objectTrack, shadowTrack).start()
         self.dropLoc = None
     return
Пример #8
0
 def startDrop(self):
     if self.gag and self.getLocation():
         endPos = self.getLocation()
         startPos = Point3(endPos.getX(), endPos.getY(), endPos.getZ() + 20)
         self.gag.setPos(startPos.getX(),
                         startPos.getY() + 2, startPos.getZ())
         self.gag.setScale(5)
         self.gag.setP(90)
         self.gag.headsUp(self.avatar)
         self.gag.setH(self.gag.getH() - 180)
         self.gag.node().setBounds(OmniBoundingVolume())
         self.gag.node().setFinal(1)
         self.buildCollisions()
         objectTrack = Sequence()
         animProp = LerpPosInterval(self.gag,
                                    self.fallDuration,
                                    endPos,
                                    startPos=startPos)
         bounceProp = Effects.createZBounce(self.gag, 2, endPos, 0.5, 1.5)
         objAnimShrink = Sequence(Func(self.gag.setP, 90), Wait(0.5),
                                  Func(self.gag.reparentTo, render),
                                  animProp, bounceProp)
         objectTrack.append(objAnimShrink)
         dropShadow = loader.loadModel(
             'phase_3/models/props/drop_shadow.bam')
         dropShadow.reparentTo(render)
         dropShadow.setPos(endPos)
         shadowTrack = Sequence(
             LerpScaleInterval(dropShadow,
                               self.fallDuration + 0.1,
                               dropShadow.getScale() * 3,
                               startScale=Point3(0.01, 0.01, 0.01)),
             Wait(0.3), Func(dropShadow.removeNode))
         Parallel(
             Sequence(Wait(self.fallDuration), Func(self.completeDrop),
                      Wait(4), Func(self.cleanupGag)), objectTrack,
             shadowTrack).start()
         self.dropLoc = None
     return
Пример #9
0
 def startDrop(self):
     if self.gag and self.dropLoc:
         x, y, z = self.dropLoc
         startPos = Point3(x, y, z + 20)
         self.gag.setPos(x, y + 2, z)
         self.gag.node().setBounds(OmniBoundingVolume())
         self.gag.node().setFinal(1)
         self.gag.headsUp(self.avatar)
         if self.rotate90:
             self.gag.setH(self.gag.getH() - 90)
         self.buildCollisions()
         objectTrack = Sequence()
         animProp = LerpPosInterval(self.gag,
                                    self.fallDuration,
                                    self.dropLoc,
                                    startPos=startPos)
         bounceProp = Effects.createZBounce(self.gag, 2, self.dropLoc, 0.5,
                                            1.5)
         objAnimShrink = Sequence(Wait(0.5),
                                  Func(self.gag.reparentTo, render),
                                  animProp, bounceProp)
         objectTrack.append(objAnimShrink)
         dropShadow = loader.loadModel(
             'phase_3/models/props/drop_shadow.bam')
         dropShadow.reparentTo(render)
         dropShadow.setPos(self.dropLoc)
         dropShadow.setScale(self.getShadowScale())
         shadowTrack = Sequence(
             LerpScaleInterval(dropShadow,
                               self.fallDuration + 0.1,
                               dropShadow.getScale(),
                               startScale=Point3(0.01, 0.01, 0.01)),
             Wait(0.3), Func(dropShadow.removeNode))
         self.objTrack = Parallel(
             Sequence(Wait(self.fallDuration), Func(self.completeDrop)),
             objectTrack, shadowTrack)
         self.objTrack.start()
         self.dropLoc = None
     return
Пример #10
0
def __dropObject(drop, delay, objName, level, alreadyDodged, alreadyTeased,
                 npcs, target, npcDrops):
    toon = drop['toon']
    repeatNPC = 0
    battle = drop['battle']
    if ('npc' in drop):
        toon = drop['npc']
        if (toon in npcDrops):
            repeatNPC = 1
        else:
            npcDrops[toon] = 1
        origHpr = Vec3(0, 0, 0)
    else:
        origHpr = toon.getHpr(battle)
    hpbonus = drop['hpbonus']
    suit = target['suit']
    hp = target['hp']
    hitSuit = (hp > 0)
    died = target['died']
    leftSuits = target['leftSuits']
    rightSuits = target['rightSuits']
    kbbonus = target['kbbonus']
    suitPos = suit.getPos(battle)

    majorObject = (level >= 3)

    if (repeatNPC == 0):
        button = globalPropPool.getProp('button')
        buttonType = globalPropPool.getPropType('button')
        button2 = MovieUtil.copyProp(button)
        buttons = [button, button2]
        hands = toon.getLeftHands()

    object = globalPropPool.getProp(objName)
    objectType = globalPropPool.getPropType(objName)

    # The safe and weight are a bit too big
    if (objName == 'weight'):
        object.setScale(object.getScale() * 0.75)
    elif (objName == 'safe'):
        object.setScale(object.getScale() * 0.85)

    # The object will likely animate far from its initial bounding
    # volume while it drops.  To work around this bug, we artificially
    # change the object's bounding volume to be really big.  In fact,
    # we make it infinite, so it will never be culled while it's
    # onscreen.
    node = object.node()
    node.setBounds(OmniBoundingVolume())
    node.setFinal(1)

    # create the soundTrack
    soundTrack = __getSoundTrack(level, hitSuit, toon)

    # toon pulls the button out, presses it, and puts it away
    toonTrack = Sequence()
    if (repeatNPC == 0):
        toonFace = Func(toon.headsUp, battle, suitPos)
        toonTrack.append(Wait(delay))
        toonTrack.append(toonFace)
        toonTrack.append(ActorInterval(toon, 'pushbutton'))
        toonTrack.append(Func(toon.loop, 'neutral'))
        toonTrack.append(Func(toon.setHpr, battle, origHpr))

    # button scales up in toon's hand as he takes it out, and
    # scales down to nothing as it is put away
    buttonTrack = Sequence()
    if (repeatNPC == 0):
        buttonShow = Func(MovieUtil.showProps, buttons, hands)
        buttonScaleUp = LerpScaleInterval(button,
                                          1.0,
                                          button.getScale(),
                                          startScale=Point3(0.01, 0.01, 0.01))
        buttonScaleDown = LerpScaleInterval(button,
                                            1.0,
                                            Point3(0.01, 0.01, 0.01),
                                            startScale=button.getScale())
        buttonHide = Func(MovieUtil.removeProps, buttons)
        buttonTrack.append(Wait(delay))
        buttonTrack.append(buttonShow)
        buttonTrack.append(buttonScaleUp)
        buttonTrack.append(Wait(2.5))
        buttonTrack.append(buttonScaleDown)
        buttonTrack.append(buttonHide)

    # object appears above suit
    objectTrack = Sequence()

    def posObject(object, suit, level, majorObject, miss, battle=battle):
        object.reparentTo(battle)
        # Options for positioning a drop:
        #   1) Any successful drop on an unlured suit - strikes at suit battle pos
        #   2) Unsuccessful drops on an unlured suit that are of the largest three -
        #      these strike behind the suit (who shouldn't dodge)
        #   3) The first three (smallest drops) on a lured suit strike the battle pos,
        #      where the larger ones get bumped back a bit.
        if (battle.isSuitLured(suit)):
            # suit is lured, strike at battle position
            suitPos, suitHpr = battle.getActorPosHpr(suit)
            object.setPos(suitPos)
            object.setHpr(suitHpr)
            if (level >= 3):  # bump back larger drops
                object.setY(object.getY() + 2)
        else:
            object.setPos(suit.getPos(battle))
            object.setHpr(suit.getHpr(battle))
            if (miss and level >= 3):
                object.setY(object.getY(battle) + 5)

        if not majorObject:
            if not miss:
                shoulderHeight = shoulderHeights[suit.style.body] * suit.scale
                object.setZ(object.getPos(battle)[2] + shoulderHeight)
        # fix up the Z offset of the prop
        object.setZ(object.getPos(battle)[2] + objZOffsets[level])

    # the object will need to scale down to nothing at some point
    # and then it will immediately get deleted
    # since we already have an animation interval playing,
    # we need to put the scale on a separate track.
    # to avoid cases where the object has been deleted,
    # and the scale interval is still trying to scale the
    # object, we'll put the animation and scale intervals into
    # separate tracks, combine them into a track, and
    # put the hide interval after the track.
    objectTrack.append(Func(battle.movie.needRestoreRenderProp, object))
    objInit = Func(posObject, object, suit, level, majorObject, (hp <= 0))
    objectTrack.append(Wait(delay + tObjectAppears))
    objectTrack.append(objInit)

    # we can assume that all drop props are animated
    if hp > 0 or (level == 1 or level == 2):
        # prop hits the suit
        #import pdb; pdb.set_trace()
        if hasattr(object, 'getAnimControls'):
            animProp = ActorInterval(object, objName)
            shrinkProp = LerpScaleInterval(object,
                                           dShrink,
                                           Point3(0.01, 0.01, 0.01),
                                           startScale=object.getScale())
            objAnimShrink = ParallelEndTogether(animProp, shrinkProp)
            objectTrack.append(objAnimShrink)
        else:
            # donald boat currently does not have animation
            startingScale = objStartingScales[level]
            object2 = MovieUtil.copyProp(object)
            posObject(object2, suit, level, majorObject, (hp <= 0))
            endingPos = object2.getPos()
            startPos = Point3(endingPos[0], endingPos[1], endingPos[2] + 5)
            startHpr = object2.getHpr()
            endHpr = Point3(startHpr[0] + 90, startHpr[1], startHpr[2])

            animProp = LerpPosInterval(object,
                                       landFrames[level] / 24.0,
                                       endingPos,
                                       startPos=startPos)
            shrinkProp = LerpScaleInterval(object,
                                           dShrink,
                                           Point3(0.01, 0.01, 0.01),
                                           startScale=startingScale)

            bounceProp = Effects.createZBounce(object, 2, endingPos, 0.5, 1.5)

            #objAnimShrink = ParallelEndTogether(animProp, shrinkProp)
            objAnimShrink = Sequence(Func(object.setScale, startingScale),
                                     Func(object.setH, endHpr[0]), animProp,
                                     bounceProp, Wait(1.5), shrinkProp)

            objectTrack.append(objAnimShrink)

            MovieUtil.removeProp(object2)

    else:
        # prop misses the suit
        # only play the animation up to the point where it lands
        if hasattr(object, 'getAnimControls'):
            animProp = ActorInterval(object,
                                     objName,
                                     duration=landFrames[level] / 24.)

            def poseProp(prop, animName, level):
                prop.pose(animName, landFrames[level])

            poseProp = Func(poseProp, object, objName, level)
            wait = Wait(1.0)
            shrinkProp = LerpScaleInterval(object,
                                           dShrinkOnMiss,
                                           Point3(0.01, 0.01, 0.01),
                                           startScale=object.getScale())
            objectTrack.append(animProp)
            objectTrack.append(poseProp)
            objectTrack.append(wait)
            objectTrack.append(shrinkProp)
        else:
            #donald boat currently does not have animation
            startingScale = objStartingScales[level]
            object2 = MovieUtil.copyProp(object)
            posObject(object2, suit, level, majorObject, (hp <= 0))
            endingPos = object2.getPos()
            startPos = Point3(endingPos[0], endingPos[1], endingPos[2] + 5)
            startHpr = object2.getHpr()
            endHpr = Point3(startHpr[0] + 90, startHpr[1], startHpr[2])

            animProp = LerpPosInterval(object,
                                       landFrames[level] / 24.0,
                                       endingPos,
                                       startPos=startPos)
            shrinkProp = LerpScaleInterval(object,
                                           dShrinkOnMiss,
                                           Point3(0.01, 0.01, 0.01),
                                           startScale=startingScale)

            bounceProp = Effects.createZBounce(object, 2, endingPos, 0.5, 1.5)

            #objAnimShrink = ParallelEndTogether(animProp, shrinkProp)
            objAnimShrink = Sequence(Func(object.setScale, startingScale),
                                     Func(object.setH, endHpr[0]), animProp,
                                     bounceProp, Wait(1.5), shrinkProp)
            objectTrack.append(objAnimShrink)
            MovieUtil.removeProp(object2)

    objectTrack.append(Func(MovieUtil.removeProp, object))
    objectTrack.append(Func(battle.movie.clearRenderProp, object))

    # we will see a shadow scale up before the object drops
    dropShadow = MovieUtil.copyProp(suit.getShadowJoint())
    if (level == 0):
        dropShadow.setScale(0.5)
    elif (level <= 2):
        dropShadow.setScale(0.8)
    elif (level == 3):
        dropShadow.setScale(2.0)
    elif (level == 4):
        dropShadow.setScale(2.3)
    else:
        dropShadow.setScale(3.6)

    def posShadow(dropShadow=dropShadow,
                  suit=suit,
                  battle=battle,
                  hp=hp,
                  level=level):
        dropShadow.reparentTo(battle)
        if (battle.isSuitLured(suit)):
            # suit is lured, shadow at battle position
            suitPos, suitHpr = battle.getActorPosHpr(suit)
            dropShadow.setPos(suitPos)
            dropShadow.setHpr(suitHpr)
            if (level >= 3):  # bump back larger drops
                dropShadow.setY(dropShadow.getY() + 2)
        else:
            dropShadow.setPos(suit.getPos(battle))
            dropShadow.setHpr(suit.getHpr(battle))
            if (hp <= 0 and level >= 3):
                dropShadow.setY(dropShadow.getY(battle) + 5)
        # Raise the drop shadow to curb level
        dropShadow.setZ(dropShadow.getZ() + 0.5)

    shadowTrack = Sequence(
        Wait(delay + tButtonPressed),
        Func(battle.movie.needRestoreRenderProp, dropShadow),
        Func(posShadow),
        LerpScaleInterval(dropShadow,
                          tObjectAppears - tButtonPressed,
                          dropShadow.getScale(),
                          startScale=Point3(0.01, 0.01, 0.01)),
        Wait(0.3),
        Func(MovieUtil.removeProp, dropShadow),
        Func(battle.movie.clearRenderProp, dropShadow),
    )

    return Parallel(toonTrack, soundTrack, buttonTrack, objectTrack,
                    shadowTrack)
Пример #11
0
def __dropObject(drop, delay, objName, level, alreadyDodged, alreadyTeased,
                 npcs, target, npcDrops):
    toon = drop['toon']
    repeatNPC = 0
    battle = drop['battle']
    if drop.has_key('npc'):
        toon = drop['npc']
        if npcDrops.has_key(toon):
            repeatNPC = 1
        else:
            npcDrops[toon] = 1
        origHpr = Vec3(0, 0, 0)
    else:
        origHpr = toon.getHpr(battle)
    hpbonus = drop['hpbonus']
    suit = target['suit']
    hp = target['hp']
    hitSuit = hp > 0
    died = target['died']
    leftSuits = target['leftSuits']
    rightSuits = target['rightSuits']
    kbbonus = target['kbbonus']
    suitPos = suit.getPos(battle)
    majorObject = level >= 3
    if repeatNPC == 0:
        button = globalPropPool.getProp('button')
        buttonType = globalPropPool.getPropType('button')
        button2 = MovieUtil.copyProp(button)
        buttons = [button, button2]
        hands = toon.getLeftHands()
    object = globalPropPool.getProp(objName)
    objectType = globalPropPool.getPropType(objName)
    if objName == 'weight':
        object.setScale(object.getScale() * 0.75)
    elif objName == 'safe':
        object.setScale(object.getScale() * 0.85)
    node = object.node()
    node.setBounds(OmniBoundingVolume())
    node.setFinal(1)
    soundTrack = __getSoundTrack(level, hitSuit, toon)
    toonTrack = Sequence()
    if repeatNPC == 0:
        toonFace = Func(toon.headsUp, battle, suitPos)
        toonTrack.append(Wait(delay))
        toonTrack.append(toonFace)
        toonTrack.append(ActorInterval(toon, 'pushbutton'))
        toonTrack.append(Func(toon.loop, 'neutral'))
        toonTrack.append(Func(toon.setHpr, battle, origHpr))
    buttonTrack = Sequence()
    if repeatNPC == 0:
        buttonShow = Func(MovieUtil.showProps, buttons, hands)
        buttonScaleUp = LerpScaleInterval(button,
                                          1.0,
                                          button.getScale(),
                                          startScale=Point3(0.01, 0.01, 0.01))
        buttonScaleDown = LerpScaleInterval(button,
                                            1.0,
                                            Point3(0.01, 0.01, 0.01),
                                            startScale=button.getScale())
        buttonHide = Func(MovieUtil.removeProps, buttons)
        buttonTrack.append(Wait(delay))
        buttonTrack.append(buttonShow)
        buttonTrack.append(buttonScaleUp)
        buttonTrack.append(Wait(2.5))
        buttonTrack.append(buttonScaleDown)
        buttonTrack.append(buttonHide)
    objectTrack = Sequence()

    def posObject(object, suit, level, majorObject, miss, battle=battle):
        object.reparentTo(battle)
        if battle.isSuitLured(suit):
            suitPos, suitHpr = battle.getActorPosHpr(suit)
            object.setPos(suitPos)
            object.setHpr(suitHpr)
            if level >= 3:
                object.setY(object.getY() + 2)
        else:
            object.setPos(suit.getPos(battle))
            object.setHpr(suit.getHpr(battle))
            if miss and level >= 3:
                object.setY(object.getY(battle) + 5)
        if not majorObject:
            if not miss:
                shoulderHeight = shoulderHeights[suit.style.body] * suit.scale
                object.setZ(object.getPos(battle)[2] + shoulderHeight)
        object.setZ(object.getPos(battle)[2] + objZOffsets[level])

    objectTrack.append(Func(battle.movie.needRestoreRenderProp, object))
    objInit = Func(posObject, object, suit, level, majorObject, hp <= 0)
    objectTrack.append(Wait(delay + tObjectAppears))
    objectTrack.append(objInit)
    if hp > 0 or level == 1 or level == 2:
        if hasattr(object, 'getAnimControls'):
            animProp = ActorInterval(object, objName)
            shrinkProp = LerpScaleInterval(object,
                                           dShrink,
                                           Point3(0.01, 0.01, 0.01),
                                           startScale=object.getScale())
            objAnimShrink = ParallelEndTogether(animProp, shrinkProp)
            objectTrack.append(objAnimShrink)
        else:
            startingScale = objStartingScales[level]
            object2 = MovieUtil.copyProp(object)
            posObject(object2, suit, level, majorObject, hp <= 0)
            endingPos = object2.getPos()
            startPos = Point3(endingPos[0], endingPos[1], endingPos[2] + 5)
            startHpr = object2.getHpr()
            endHpr = Point3(startHpr[0] + 90, startHpr[1], startHpr[2])
            animProp = LerpPosInterval(object,
                                       landFrames[level] / 24.0,
                                       endingPos,
                                       startPos=startPos)
            shrinkProp = LerpScaleInterval(object,
                                           dShrink,
                                           Point3(0.01, 0.01, 0.01),
                                           startScale=startingScale)
            bounceProp = Effects.createZBounce(object, 2, endingPos, 0.5, 1.5)
            objAnimShrink = Sequence(Func(object.setScale, startingScale),
                                     Func(object.setH, endHpr[0]), animProp,
                                     bounceProp, Wait(1.5), shrinkProp)
            objectTrack.append(objAnimShrink)
            MovieUtil.removeProp(object2)
    elif hasattr(object, 'getAnimControls'):
        animProp = ActorInterval(object,
                                 objName,
                                 duration=landFrames[level] / 24.0)

        def poseProp(prop, animName, level):
            prop.pose(animName, landFrames[level])

        poseProp = Func(poseProp, object, objName, level)
        wait = Wait(1.0)
        shrinkProp = LerpScaleInterval(object,
                                       dShrinkOnMiss,
                                       Point3(0.01, 0.01, 0.01),
                                       startScale=object.getScale())
        objectTrack.append(animProp)
        objectTrack.append(poseProp)
        objectTrack.append(wait)
        objectTrack.append(shrinkProp)
    else:
        startingScale = objStartingScales[level]
        object2 = MovieUtil.copyProp(object)
        posObject(object2, suit, level, majorObject, hp <= 0)
        endingPos = object2.getPos()
        startPos = Point3(endingPos[0], endingPos[1], endingPos[2] + 5)
        startHpr = object2.getHpr()
        endHpr = Point3(startHpr[0] + 90, startHpr[1], startHpr[2])
        animProp = LerpPosInterval(object,
                                   landFrames[level] / 24.0,
                                   endingPos,
                                   startPos=startPos)
        shrinkProp = LerpScaleInterval(object,
                                       dShrinkOnMiss,
                                       Point3(0.01, 0.01, 0.01),
                                       startScale=startingScale)
        bounceProp = Effects.createZBounce(object, 2, endingPos, 0.5, 1.5)
        objAnimShrink = Sequence(Func(object.setScale, startingScale),
                                 Func(object.setH, endHpr[0]), animProp,
                                 bounceProp, Wait(1.5), shrinkProp)
        objectTrack.append(objAnimShrink)
        MovieUtil.removeProp(object2)
    objectTrack.append(Func(MovieUtil.removeProp, object))
    objectTrack.append(Func(battle.movie.clearRenderProp, object))
    dropShadow = MovieUtil.copyProp(suit.getShadowJoint())
    if level == 0:
        dropShadow.setScale(0.5)
    elif level <= 2:
        dropShadow.setScale(0.8)
    elif level == 3:
        dropShadow.setScale(2.0)
    elif level == 4:
        dropShadow.setScale(2.3)
    else:
        dropShadow.setScale(3.6)

    def posShadow(dropShadow=dropShadow,
                  suit=suit,
                  battle=battle,
                  hp=hp,
                  level=level):
        dropShadow.reparentTo(battle)
        if battle.isSuitLured(suit):
            suitPos, suitHpr = battle.getActorPosHpr(suit)
            dropShadow.setPos(suitPos)
            dropShadow.setHpr(suitHpr)
            if level >= 3:
                dropShadow.setY(dropShadow.getY() + 2)
        else:
            dropShadow.setPos(suit.getPos(battle))
            dropShadow.setHpr(suit.getHpr(battle))
            if hp <= 0 and level >= 3:
                dropShadow.setY(dropShadow.getY(battle) + 5)
        dropShadow.setZ(dropShadow.getZ() + 0.5)

    shadowTrack = Sequence(
        Wait(delay + tButtonPressed),
        Func(battle.movie.needRestoreRenderProp, dropShadow), Func(posShadow),
        LerpScaleInterval(dropShadow,
                          tObjectAppears - tButtonPressed,
                          dropShadow.getScale(),
                          startScale=Point3(0.01, 0.01, 0.01)), Wait(0.3),
        Func(MovieUtil.removeProp, dropShadow),
        Func(battle.movie.clearRenderProp, dropShadow))
    return Parallel(toonTrack, soundTrack, buttonTrack, objectTrack,
                    shadowTrack)
def __dropObject(drop, delay, objName, level, alreadyDodged, alreadyTeased, npcs, target, npcDrops):
    toon = drop['toon']
    repeatNPC = 0
    battle = drop['battle']
    if 'npc' in drop:
        toon = drop['npc']
        if toon in npcDrops:
            repeatNPC = 1
        else:
            npcDrops[toon] = 1
        origHpr = Vec3(0, 0, 0)
    else:
        origHpr = toon.getHpr(battle)
    hpbonus = drop['hpbonus']
    suit = target['suit']
    hp = target['hp']
    hitSuit = hp > 0
    died = target['died']
    leftSuits = target['leftSuits']
    rightSuits = target['rightSuits']
    kbbonus = target['kbbonus']
    suitPos = suit.getPos(battle)
    majorObject = level >= 3
    if repeatNPC == 0:
        button = globalPropPool.getProp('button')
        buttonType = globalPropPool.getPropType('button')
        button2 = MovieUtil.copyProp(button)
        buttons = [button, button2]
        hands = toon.getLeftHands()
    object = globalPropPool.getProp(objName)
    objectType = globalPropPool.getPropType(objName)
    if objName == 'weight':
        object.setScale(object.getScale() * 0.75)
    elif objName == 'safe':
        object.setScale(object.getScale() * 0.85)
    node = object.node()
    node.setBounds(OmniBoundingVolume())
    node.setFinal(1)
    soundTrack = __getSoundTrack(level, hitSuit, toon)
    toonTrack = Sequence()
    if repeatNPC == 0:
        toonFace = Func(toon.headsUp, battle, suitPos)
        toonTrack.append(Wait(delay))
        toonTrack.append(toonFace)
        toonTrack.append(ActorInterval(toon, 'pushbutton'))
        toonTrack.append(Func(toon.loop, 'neutral'))
        toonTrack.append(Func(toon.setHpr, battle, origHpr))
    buttonTrack = Sequence()
    if repeatNPC == 0:
        buttonShow = Func(MovieUtil.showProps, buttons, hands)
        buttonScaleUp = LerpScaleInterval(button, 1.0, button.getScale(), startScale=Point3(0.01, 0.01, 0.01))
        buttonScaleDown = LerpScaleInterval(button, 1.0, Point3(0.01, 0.01, 0.01), startScale=button.getScale())
        buttonHide = Func(MovieUtil.removeProps, buttons)
        buttonTrack.append(Wait(delay))
        buttonTrack.append(buttonShow)
        buttonTrack.append(buttonScaleUp)
        buttonTrack.append(Wait(2.5))
        buttonTrack.append(buttonScaleDown)
        buttonTrack.append(buttonHide)
    objectTrack = Sequence()

    def posObject(object, suit, level, majorObject, miss, battle = battle):
        object.reparentTo(battle)
        if battle.isSuitLured(suit):
            suitPos, suitHpr = battle.getActorPosHpr(suit)
            object.setPos(suitPos)
            object.setHpr(suitHpr)
            if level >= 3:
                object.setY(object.getY() + 2)
        else:
            object.setPos(suit.getPos(battle))
            object.setHpr(suit.getHpr(battle))
            if miss and level >= 3:
                object.setY(object.getY(battle) + 5)
        if not majorObject:
            if not miss:
                shoulderHeight = shoulderHeights[suit.style.body] * suit.scale
                object.setZ(object.getPos(battle)[2] + shoulderHeight)
        object.setZ(object.getPos(battle)[2] + objZOffsets[level])

    objectTrack.append(Func(battle.movie.needRestoreRenderProp, object))
    objInit = Func(posObject, object, suit, level, majorObject, hp <= 0)
    objectTrack.append(Wait(delay + tObjectAppears))
    objectTrack.append(objInit)
    if hp > 0 or level == 1 or level == 2:
        if hasattr(object, 'getAnimControls'):
            animProp = ActorInterval(object, objName)
            shrinkProp = LerpScaleInterval(object, dShrink, Point3(0.01, 0.01, 0.01), startScale=object.getScale())
            objAnimShrink = ParallelEndTogether(animProp, shrinkProp)
            objectTrack.append(objAnimShrink)
        else:
            startingScale = objStartingScales[level]
            object2 = MovieUtil.copyProp(object)
            posObject(object2, suit, level, majorObject, hp <= 0)
            endingPos = object2.getPos()
            startPos = Point3(endingPos[0], endingPos[1], endingPos[2] + 5)
            startHpr = object2.getHpr()
            endHpr = Point3(startHpr[0] + 90, startHpr[1], startHpr[2])
            animProp = LerpPosInterval(object, landFrames[level] / 24.0, endingPos, startPos=startPos)
            shrinkProp = LerpScaleInterval(object, dShrink, Point3(0.01, 0.01, 0.01), startScale=startingScale)
            bounceProp = Effects.createZBounce(object, 2, endingPos, 0.5, 1.5)
            objAnimShrink = Sequence(Func(object.setScale, startingScale), Func(object.setH, endHpr[0]), animProp, bounceProp, Wait(1.5), shrinkProp)
            objectTrack.append(objAnimShrink)
            MovieUtil.removeProp(object2)
    elif hasattr(object, 'getAnimControls'):
        animProp = ActorInterval(object, objName, duration=landFrames[level] / 24.0)

        def poseProp(prop, animName, level):
            prop.pose(animName, landFrames[level])

        poseProp = Func(poseProp, object, objName, level)
        wait = Wait(1.0)
        shrinkProp = LerpScaleInterval(object, dShrinkOnMiss, Point3(0.01, 0.01, 0.01), startScale=object.getScale())
        objectTrack.append(animProp)
        objectTrack.append(poseProp)
        objectTrack.append(wait)
        objectTrack.append(shrinkProp)
    else:
        startingScale = objStartingScales[level]
        object2 = MovieUtil.copyProp(object)
        posObject(object2, suit, level, majorObject, hp <= 0)
        endingPos = object2.getPos()
        startPos = Point3(endingPos[0], endingPos[1], endingPos[2] + 5)
        startHpr = object2.getHpr()
        endHpr = Point3(startHpr[0] + 90, startHpr[1], startHpr[2])
        animProp = LerpPosInterval(object, landFrames[level] / 24.0, endingPos, startPos=startPos)
        shrinkProp = LerpScaleInterval(object, dShrinkOnMiss, Point3(0.01, 0.01, 0.01), startScale=startingScale)
        bounceProp = Effects.createZBounce(object, 2, endingPos, 0.5, 1.5)
        objAnimShrink = Sequence(Func(object.setScale, startingScale), Func(object.setH, endHpr[0]), animProp, bounceProp, Wait(1.5), shrinkProp)
        objectTrack.append(objAnimShrink)
        MovieUtil.removeProp(object2)
    objectTrack.append(Func(MovieUtil.removeProp, object))
    objectTrack.append(Func(battle.movie.clearRenderProp, object))
    dropShadow = MovieUtil.copyProp(suit.getShadowJoint())
    if level == 0:
        dropShadow.setScale(0.5)
    elif level <= 2:
        dropShadow.setScale(0.8)
    elif level == 3:
        dropShadow.setScale(2.0)
    elif level == 4:
        dropShadow.setScale(2.3)
    else:
        dropShadow.setScale(3.6)

    def posShadow(dropShadow = dropShadow, suit = suit, battle = battle, hp = hp, level = level):
        dropShadow.reparentTo(battle)
        if battle.isSuitLured(suit):
            suitPos, suitHpr = battle.getActorPosHpr(suit)
            dropShadow.setPos(suitPos)
            dropShadow.setHpr(suitHpr)
            if level >= 3:
                dropShadow.setY(dropShadow.getY() + 2)
        else:
            dropShadow.setPos(suit.getPos(battle))
            dropShadow.setHpr(suit.getHpr(battle))
            if hp <= 0 and level >= 3:
                dropShadow.setY(dropShadow.getY(battle) + 5)
        dropShadow.setZ(dropShadow.getZ() + 0.5)

    shadowTrack = Sequence(Wait(delay + tButtonPressed), Func(battle.movie.needRestoreRenderProp, dropShadow), Func(posShadow), LerpScaleInterval(dropShadow, tObjectAppears - tButtonPressed, dropShadow.getScale(), startScale=Point3(0.01, 0.01, 0.01)), Wait(0.3), Func(MovieUtil.removeProp, dropShadow), Func(battle.movie.clearRenderProp, dropShadow))
    return Parallel(toonTrack, soundTrack, buttonTrack, objectTrack, shadowTrack)