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) else: if trapName == 'banana': trapProp.setHpr(0, 0, 0) trapProp.setPos(0, MovieUtil.SUIT_TRAP_DISTANCE, -0.35) trapProp.pose(trapName, trapProp.getNumFrames(trapName) - 1) else: if trapName == 'marbles': trapProp.setHpr(Point3(94, 0, 0)) trapProp.setPos(0, MovieUtil.SUIT_TRAP_MARBLES_DISTANCE, 0) trapProp.pose(trapName, trapProp.getNumFrames(trapName) - 1) else: if 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)
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)
def placeTrap(trapProp, suit, battle=battle, trapName=trapName): # In case multiple traps are thrown to the same spot, we must return (doing # nothing) if the trapProp we have has actually been removed and replaced # by another trap (it won't exist anymore) if not trapProp or trapProp.isEmpty(): return trapProp.wrtReparentTo(suit) trapProp.show() # Set the new trap prop # All the traps use the default trap distance, except the rake if (trapName == 'rake'): # The rake will actually be completed replaced with a different rake model # which has a different animation on it for when the rake is stepped on trapProp.setPos(0, MovieUtil.SUIT_TRAP_RAKE_DISTANCE, 0) # reorient the rake correctly to be stepped on trapProp.setHpr(Point3(0, 270, 0)) trapProp.setScale(Point3(0.7, 0.7, 0.7)) # The rake must be a specific distance from each suit for that # suit to be able to walk into the rake 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)
def __createSuitDamageTrack(battle, suit, hp, lure, trapProp): if trapProp is None or trapProp.isEmpty(): return Func(suit.loop, 'neutral') 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)) 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 == '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 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)) suitTrack = Sequence( ActorInterval(suit, 'flail', duration=0.7), ActorInterval(suit, 'flail', startTime=0.7, endTime=0.0), ActorInterval(suit, 'neutral', duration=0.4), ActorInterval(suit, 'flail', startTime=0.6, endTime=0.7), Wait(0.4), ActorInterval(suit, 'slip-forward', startTime=2.48, duration=0.1), Func(battle.movie.needRestoreColor), Func(suit.setColorScale, Vec4(0.2, 0.2, 0.2, 1)), Func(trapProp.reparentTo, hidden), ActorInterval(suit, 'slip-forward', startTime=2.58), Func(suit.clearColorScale), Func(trapProp.sparksEffect.cleanup), 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)) 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
def __createSuitDamageTrack(battle, suit, hp, lure, trapProp): if trapProp == None or trapProp.isEmpty(): return Track([FunctionInterval(suit.loop, extraArgs=['neutral'])]) trapProp.wrtReparentTo(battle) trapTrack = ToontownBattleGlobals.TRAP_TRACK trapLevel = suit.battleTrap trapTrackNames = ToontownBattleGlobals.AvProps[trapTrack] trapName = trapTrackNames[trapLevel] ivals = [] def reparentTrap(trapProp=trapProp, battle=battle): trapProp.wrtReparentTo(battle) ivals.append(FunctionInterval(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) else: if 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 = Track([ WaitInterval(0.1), LerpPosInterval(trapProp, 0.1, slidePos, other=battle) ]) animTrack = Track([ ActorInterval(trapProp, 'banana', startTime=3.1), WaitInterval(1.1), LerpScaleInterval(trapProp, 1, Point3(0.01, 0.01, 0.01)) ]) suitTrack = Track([ActorInterval(suit, 'slip-backward')]) damageTrack = Track([ WaitInterval(0.5), FunctionInterval(suit.showLaffNumber, openEnded=0, extraArgs=[-hp]), FunctionInterval(suit.updateHealthBar, extraArgs=[hp]) ]) soundTrack = Track([ SoundInterval( globalBattleSoundCache.getSound('AA_pie_throw_only.mp3'), duration=0.55, node=suit), SoundInterval( globalBattleSoundCache.getSound('Toon_bodyfall_synergy.mp3'), node=suit) ]) ivals.append( MultiTrack( [moveTrack, animTrack, suitTrack, damageTrack, soundTrack])) else: if 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 = Track([ WaitInterval(0.5), LerpHprInterval(trapProp, 0.1, upHpr, startHpr=hpr), WaitInterval(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), WaitInterval(0.2), LerpScaleInterval(trapProp, 0.2, Point3(0.01, 0.01, 0.01)) ]) rakeAnimDuration = 3.125 suitTrack = Track( [ActorInterval(suit, 'rake-react', duration=rakeAnimDuration)]) damageTrack = Track([ WaitInterval(0.5), FunctionInterval(suit.showLaffNumber, openEnded=0, extraArgs=[-hp]), FunctionInterval(suit.updateHealthBar, extraArgs=[hp]) ]) soundTrack = getSoundTrack('TL_step_on_rake.mp3', delay=0.6, node=suit) ivals.append( MultiTrack([rakeTrack, suitTrack, damageTrack, soundTrack])) else: if trapName == 'marbles': slidePos = trapProp.getPos(parent) slidePos.setY(slidePos.getY() - 6.5) moveTrack = Track([ WaitInterval(0.1), LerpPosInterval(trapProp, 0.8, slidePos, other=battle), WaitInterval(1.1), LerpScaleInterval(trapProp, 1, Point3(0.01, 0.01, 0.01)) ]) animTrack = Track( [ActorInterval(trapProp, 'marbles', startTime=3.1)]) suitTrack = Track([ActorInterval(suit, 'slip-backward')]) damageTrack = Track([ WaitInterval(0.5), FunctionInterval(suit.showLaffNumber, openEnded=0, extraArgs=[-hp]), FunctionInterval(suit.updateHealthBar, extraArgs=[hp]) ]) soundTrack = Track([ SoundInterval(globalBattleSoundCache.getSound( 'AA_pie_throw_only.mp3'), duration=0.55, node=suit), SoundInterval(globalBattleSoundCache.getSound( 'Toon_bodyfall_synergy.mp3'), node=suit) ]) ivals.append( MultiTrack([ moveTrack, animTrack, suitTrack, damageTrack, soundTrack ])) else: if 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) nameTag = suit.find('**/joint-nameTag') trapTrack = Track([ WaitInterval(2.4), LerpScaleInterval(trapProp, 0.8, Point3(0.01, 0.01, 0.01)) ]) moveTrack = Track([ WaitInterval(0.9), LerpPosInterval(suit, 0.9, sinkPos1, other=battle), LerpPosInterval(suit, 0.4, sinkPos2, other=battle), FunctionInterval(suit.setPos, extraArgs=[battle, dropPos]), FunctionInterval(suit.wrtReparentTo, extraArgs=[hidden]), WaitInterval(1.1), FunctionInterval(suit.wrtReparentTo, extraArgs=[battle]), LerpPosInterval(suit, 0.3, landPos, other=battle) ]) animTrack = Track([ ActorInterval(suit, 'flail'), ActorInterval(suit, 'flail', startTime=1.1), WaitInterval(0.7), ActorInterval(suit, 'slip-forward', duration=2.1) ]) damageTrack = Track([ WaitInterval(3.5), FunctionInterval(suit.showLaffNumber, openEnded=0, extraArgs=[-hp]), FunctionInterval(suit.updateHealthBar, extraArgs=[hp]) ]) soundTrack = Track([ WaitInterval(0.7), SoundInterval(globalBattleSoundCache.getSound( 'TL_quicksand.mp3'), node=suit), WaitInterval(0.1), SoundInterval(globalBattleSoundCache.getSound( 'Toon_bodyfall_synergy.mp3'), node=suit) ]) ivals.append( MultiTrack([ trapTrack, moveTrack, animTrack, damageTrack, soundTrack ])) else: if 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 = Track([ WaitInterval(2.4), LerpScaleInterval(trapProp, 0.8, Point3(0.01, 0.01, 0.01)) ]) moveTrack = Track([ WaitInterval(2.2), LerpPosInterval(suit, 0.4, sinkPos, other=battle), FunctionInterval(suit.setPos, extraArgs=[battle, dropPos]), FunctionInterval(suit.wrtReparentTo, extraArgs=[hidden]), WaitInterval(1.6), FunctionInterval(suit.wrtReparentTo, extraArgs=[battle]), LerpPosInterval(suit, 0.3, landPos, other=battle) ]) animIvals = [] animIvals.extend( getSplicedLerpAnims(suit, 'flail', 0.7, 0.25)) animIvals.append( FunctionInterval(trapProp.setColor, extraArgs=[Vec4(0, 0, 0, 1)])) animIvals.append( ActorInterval(suit, 'flail', startTime=0.7, endTime=0)) animIvals.append( ActorInterval(suit, 'neutral', duration=0.5)) animIvals.append( ActorInterval(suit, 'flail', startTime=1.1)) animIvals.append(WaitInterval(1.1)) animIvals.append( ActorInterval(suit, 'slip-forward', duration=2.1)) animTrack = Track(animIvals) damageTrack = Track([ WaitInterval(3.5), FunctionInterval(suit.showLaffNumber, openEnded=0, extraArgs=[-hp]), FunctionInterval(suit.updateHealthBar, extraArgs=[hp]) ]) soundTrack = Track([ WaitInterval(0.8), SoundInterval(globalBattleSoundCache.getSound( 'TL_trap_door.mp3'), node=suit), WaitInterval(0.8), SoundInterval(globalBattleSoundCache.getSound( 'Toon_bodyfall_synergy.mp3'), node=suit) ]) ivals.append( MultiTrack([ trapTrack, moveTrack, animTrack, damageTrack, soundTrack ])) else: if trapName == 'tnt': tntTrack = Track([ActorInterval(trapProp, 'tnt')]) explosionIvals = [] explosionIvals.append(WaitInterval(2.3)) explosionIvals.extend( createTNTExplosionIvals(battle, trapProp=trapProp, relativeTo=parent)) explosionTrack = Track(explosionIvals) suitTrack = Track([ ActorInterval(suit, 'flail', duration=0.7), ActorInterval(suit, 'flail', startTime=0.7, endTime=0.0), ActorInterval(suit, 'neutral', duration=0.4), ActorInterval(suit, 'flail', startTime=0.6, endTime=0.7), WaitInterval(0.4), ActorInterval(suit, 'slip-forward', startTime=2.48, duration=0.1), FunctionInterval( battle.movie.needRestoreColor), FunctionInterval(suit.setColorScale, extraArgs=[Vec4(0, 0, 0, 1)]), FunctionInterval(trapProp.reparentTo, extraArgs=[hidden]), ActorInterval(suit, 'slip-forward', startTime=2.58), FunctionInterval(suit.clearColorScale), FunctionInterval( trapProp.sparksEffect.cleanup), FunctionInterval( battle.movie.clearRestoreColor) ]) damageTrack = Track([ WaitInterval(2.3), FunctionInterval(suit.showLaffNumber, openEnded=0, extraArgs=[-hp]), FunctionInterval(suit.updateHealthBar, extraArgs=[hp]) ]) explosionSound = base.loadSfx( 'phase_3.5/audio/sfx/ENC_cogfall_apart.mp3') soundTrack = Track([ SoundInterval(globalBattleSoundCache.getSound( 'TL_dynamite.mp3'), duration=2.0, node=suit), SoundInterval(explosionSound, duration=0.6, node=suit) ]) ivals.append( MultiTrack([ tntTrack, suitTrack, damageTrack, explosionTrack, soundTrack ])) else: notify.warning( 'unknown trapName: %s detected on suit: %s' % trapName, suit) suit.battleTrapProp = trapProp ivals.append(FunctionInterval(battle.removeTrap, extraArgs=[suit])) ivals.append(FunctionInterval(battle.unlureSuit, extraArgs=[suit])) ivals.append(__createSuitResetPosTrack(suit, battle)) ivals.append(FunctionInterval(suit.loop, extraArgs=['neutral'])) return Track(ivals) return
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)) 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 == '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() # Cog looks down and up 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
def __createSuitDamageTrack(battle, suit, hp, lure, trapProp): if trapProp == None or trapProp.isEmpty(): return Track([ FunctionInterval(suit.loop, extraArgs = [ 'neutral'])]) trapProp.wrtReparentTo(battle) trapTrack = ToontownBattleGlobals.TRAP_TRACK trapLevel = suit.battleTrap trapTrackNames = ToontownBattleGlobals.AvProps[trapTrack] trapName = trapTrackNames[trapLevel] ivals = [] def reparentTrap(trapProp = trapProp, battle = battle): trapProp.wrtReparentTo(battle) ivals.append(FunctionInterval(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.69999999999999996, 0.69999999999999996, 0.69999999999999996)) rakeOffset = MovieUtil.getSuitRakeOffset(suit) trapProp.setY(trapProp.getY() + rakeOffset) else: parent = render if trapName == 'banana': slidePos = trapProp.getPos(parent) slidePos.setY(slidePos.getY() - 5.0999999999999996) moveTrack = Track([ WaitInterval(0.10000000000000001), LerpPosInterval(trapProp, 0.10000000000000001, slidePos, other = battle)]) animTrack = Track([ ActorInterval(trapProp, 'banana', startTime = 3.1000000000000001), WaitInterval(1.1000000000000001), LerpScaleInterval(trapProp, 1, Point3(0.01, 0.01, 0.01))]) suitTrack = Track([ ActorInterval(suit, 'slip-backward')]) damageTrack = Track([ WaitInterval(0.5), FunctionInterval(suit.showLaffNumber, openEnded = 0, extraArgs = [ -hp]), FunctionInterval(suit.updateHealthBar, extraArgs = [ hp])]) soundTrack = Track([ SoundInterval(globalBattleSoundCache.getSound('AA_pie_throw_only.mp3'), duration = 0.55000000000000004, node = suit), SoundInterval(globalBattleSoundCache.getSound('Toon_bodyfall_synergy.mp3'), node = suit)]) ivals.append(MultiTrack([ 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 = Track([ WaitInterval(0.5), LerpHprInterval(trapProp, 0.10000000000000001, upHpr, startHpr = hpr), WaitInterval(0.69999999999999996), LerpHprInterval(trapProp, 0.40000000000000002, hpr, startHpr = upHpr), LerpHprInterval(trapProp, 0.14999999999999999, bounce1Hpr, startHpr = hpr), LerpHprInterval(trapProp, 0.050000000000000003, hpr, startHpr = bounce1Hpr), LerpHprInterval(trapProp, 0.14999999999999999, bounce2Hpr, startHpr = hpr), LerpHprInterval(trapProp, 0.050000000000000003, hpr, startHpr = bounce2Hpr), WaitInterval(0.20000000000000001), LerpScaleInterval(trapProp, 0.20000000000000001, Point3(0.01, 0.01, 0.01))]) rakeAnimDuration = 3.125 suitTrack = Track([ ActorInterval(suit, 'rake-react', duration = rakeAnimDuration)]) damageTrack = Track([ WaitInterval(0.5), FunctionInterval(suit.showLaffNumber, openEnded = 0, extraArgs = [ -hp]), FunctionInterval(suit.updateHealthBar, extraArgs = [ hp])]) soundTrack = getSoundTrack('TL_step_on_rake.mp3', delay = 0.59999999999999998, node = suit) ivals.append(MultiTrack([ rakeTrack, suitTrack, damageTrack, soundTrack])) elif trapName == 'marbles': slidePos = trapProp.getPos(parent) slidePos.setY(slidePos.getY() - 6.5) moveTrack = Track([ WaitInterval(0.10000000000000001), LerpPosInterval(trapProp, 0.80000000000000004, slidePos, other = battle), WaitInterval(1.1000000000000001), LerpScaleInterval(trapProp, 1, Point3(0.01, 0.01, 0.01))]) animTrack = Track([ ActorInterval(trapProp, 'marbles', startTime = 3.1000000000000001)]) suitTrack = Track([ ActorInterval(suit, 'slip-backward')]) damageTrack = Track([ WaitInterval(0.5), FunctionInterval(suit.showLaffNumber, openEnded = 0, extraArgs = [ -hp]), FunctionInterval(suit.updateHealthBar, extraArgs = [ hp])]) soundTrack = Track([ SoundInterval(globalBattleSoundCache.getSound('AA_pie_throw_only.mp3'), duration = 0.55000000000000004, node = suit), SoundInterval(globalBattleSoundCache.getSound('Toon_bodyfall_synergy.mp3'), node = suit)]) ivals.append(MultiTrack([ 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.1000000000000001) sinkPos2.setZ(sinkPos2.getZ() - 9.0999999999999996) dropPos.setZ(dropPos.getZ() + 15) nameTag = suit.find('**/joint-nameTag') trapTrack = Track([ WaitInterval(2.3999999999999999), LerpScaleInterval(trapProp, 0.80000000000000004, Point3(0.01, 0.01, 0.01))]) moveTrack = Track([ WaitInterval(0.90000000000000002), LerpPosInterval(suit, 0.90000000000000002, sinkPos1, other = battle), LerpPosInterval(suit, 0.40000000000000002, sinkPos2, other = battle), FunctionInterval(suit.setPos, extraArgs = [ battle, dropPos]), FunctionInterval(suit.wrtReparentTo, extraArgs = [ hidden]), WaitInterval(1.1000000000000001), FunctionInterval(suit.wrtReparentTo, extraArgs = [ battle]), LerpPosInterval(suit, 0.29999999999999999, landPos, other = battle)]) animTrack = Track([ ActorInterval(suit, 'flail'), ActorInterval(suit, 'flail', startTime = 1.1000000000000001), WaitInterval(0.69999999999999996), ActorInterval(suit, 'slip-forward', duration = 2.1000000000000001)]) damageTrack = Track([ WaitInterval(3.5), FunctionInterval(suit.showLaffNumber, openEnded = 0, extraArgs = [ -hp]), FunctionInterval(suit.updateHealthBar, extraArgs = [ hp])]) soundTrack = Track([ WaitInterval(0.69999999999999996), SoundInterval(globalBattleSoundCache.getSound('TL_quicksand.mp3'), node = suit), WaitInterval(0.10000000000000001), SoundInterval(globalBattleSoundCache.getSound('Toon_bodyfall_synergy.mp3'), node = suit)]) ivals.append(MultiTrack([ 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.0999999999999996) dropPos.setZ(dropPos.getZ() + 15) trapTrack = Track([ WaitInterval(2.3999999999999999), LerpScaleInterval(trapProp, 0.80000000000000004, Point3(0.01, 0.01, 0.01))]) moveTrack = Track([ WaitInterval(2.2000000000000002), LerpPosInterval(suit, 0.40000000000000002, sinkPos, other = battle), FunctionInterval(suit.setPos, extraArgs = [ battle, dropPos]), FunctionInterval(suit.wrtReparentTo, extraArgs = [ hidden]), WaitInterval(1.6000000000000001), FunctionInterval(suit.wrtReparentTo, extraArgs = [ battle]), LerpPosInterval(suit, 0.29999999999999999, landPos, other = battle)]) animIvals = [] animIvals.extend(getSplicedLerpAnims(suit, 'flail', 0.69999999999999996, 0.25)) animIvals.append(FunctionInterval(trapProp.setColor, extraArgs = [ Vec4(0, 0, 0, 1)])) animIvals.append(ActorInterval(suit, 'flail', startTime = 0.69999999999999996, endTime = 0)) animIvals.append(ActorInterval(suit, 'neutral', duration = 0.5)) animIvals.append(ActorInterval(suit, 'flail', startTime = 1.1000000000000001)) animIvals.append(WaitInterval(1.1000000000000001)) animIvals.append(ActorInterval(suit, 'slip-forward', duration = 2.1000000000000001)) animTrack = Track(animIvals) damageTrack = Track([ WaitInterval(3.5), FunctionInterval(suit.showLaffNumber, openEnded = 0, extraArgs = [ -hp]), FunctionInterval(suit.updateHealthBar, extraArgs = [ hp])]) soundTrack = Track([ WaitInterval(0.80000000000000004), SoundInterval(globalBattleSoundCache.getSound('TL_trap_door.mp3'), node = suit), WaitInterval(0.80000000000000004), SoundInterval(globalBattleSoundCache.getSound('Toon_bodyfall_synergy.mp3'), node = suit)]) ivals.append(MultiTrack([ trapTrack, moveTrack, animTrack, damageTrack, soundTrack])) elif trapName == 'tnt': tntTrack = Track([ ActorInterval(trapProp, 'tnt')]) explosionIvals = [] explosionIvals.append(WaitInterval(2.2999999999999998)) explosionIvals.extend(createTNTExplosionIvals(battle, trapProp = trapProp, relativeTo = parent)) explosionTrack = Track(explosionIvals) suitTrack = Track([ ActorInterval(suit, 'flail', duration = 0.69999999999999996), ActorInterval(suit, 'flail', startTime = 0.69999999999999996, endTime = 0.0), ActorInterval(suit, 'neutral', duration = 0.40000000000000002), ActorInterval(suit, 'flail', startTime = 0.59999999999999998, endTime = 0.69999999999999996), WaitInterval(0.40000000000000002), ActorInterval(suit, 'slip-forward', startTime = 2.48, duration = 0.10000000000000001), FunctionInterval(battle.movie.needRestoreColor), FunctionInterval(suit.setColorScale, extraArgs = [ Vec4(0, 0, 0, 1)]), FunctionInterval(trapProp.reparentTo, extraArgs = [ hidden]), ActorInterval(suit, 'slip-forward', startTime = 2.5800000000000001), FunctionInterval(suit.clearColorScale), FunctionInterval(trapProp.sparksEffect.cleanup), FunctionInterval(battle.movie.clearRestoreColor)]) damageTrack = Track([ WaitInterval(2.2999999999999998), FunctionInterval(suit.showLaffNumber, openEnded = 0, extraArgs = [ -hp]), FunctionInterval(suit.updateHealthBar, extraArgs = [ hp])]) explosionSound = base.loadSfx('phase_3.5/audio/sfx/ENC_cogfall_apart.mp3') soundTrack = Track([ SoundInterval(globalBattleSoundCache.getSound('TL_dynamite.mp3'), duration = 2.0, node = suit), SoundInterval(explosionSound, duration = 0.59999999999999998, node = suit)]) ivals.append(MultiTrack([ tntTrack, suitTrack, damageTrack, explosionTrack, soundTrack])) else: notify.warning('unknown trapName: %s detected on suit: %s' % trapName, suit) suit.battleTrapProp = trapProp ivals.append(FunctionInterval(battle.removeTrap, extraArgs = [ suit])) ivals.append(FunctionInterval(battle.unlureSuit, extraArgs = [ suit])) ivals.append(__createSuitResetPosTrack(suit, battle)) ivals.append(FunctionInterval(suit.loop, extraArgs = [ 'neutral'])) return Track(ivals)
def __createSuitDamageTrack(battle, suit, hp, lure, trapProp): """ __createSuitDamageIvals(suit, hp, battle) """ # This function creates intervals for the suit taking damage # If trapProp doesn't exist, do nothing, with no reaction #import pdb; pdb.set_trace() if ((trapProp == None) or trapProp.isEmpty()): return Func(suit.loop, 'neutral') # Make sure to leave the trapProp in place (not parented to the suit) # while the suit performs its animation trapProp.wrtReparentTo(battle) # Now we learn which level trap we're using to use the appropriate suit reaction 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)) # Now detect if our trap was just thrown in this round, or leftover from before. # If just thrown, our cordinates for the banana, marbles, and tnt will be based off of # render, not battle, thus we make parent equal to render instead of the default battle. # And if the trap is fresh and is the quicksand, trapdoor, or rake, we create a hidden # dummy trapProp in the right position to obtain the correct coordinates for those # animations. 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) # reorient the rake correctly to be stepped on trapProp.setHpr(Point3(0, 270, 0)) trapProp.setScale(Point3(0.7, 0.7, 0.7)) # The rake must be a specific distance from each suit for that # suit to be able to walk into the rake rakeOffset = MovieUtil.getSuitRakeOffset(suit) trapProp.setY(trapProp.getY() + rakeOffset) else: parent = render # Now decide which trap this is and use the different suit animation reactions if (trapName == 'banana'): slidePos = trapProp.getPos(parent) slidePos.setY(slidePos.getY() - 5.1) moveTrack = Sequence( Wait(0.1), # Wait before sliding the peel LerpPosInterval(trapProp, 0.1, slidePos, other=battle), ) animTrack = Sequence( ActorInterval(trapProp, 'banana', startTime=3.1), # Animate banana spinning Wait(1.1), # Wait a bit before scaling banana away 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), ) soundTrack = Sequence( SoundInterval(globalBattleSoundCache.getSound('AA_pie_throw_only.mp3'), duration=0.55, node=suit), SoundInterval(globalBattleSoundCache.getSound('Toon_bodyfall_synergy.mp3'), node=suit), ) result.append(Parallel(moveTrack, animTrack, suitTrack, damageTrack, soundTrack)) elif ((trapName == 'rake') or (trapName == 'rake-react')): # Also need to make the rake pop up when stepped on, then fall back down 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.mp3', 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), # Wait a bit before sliding the marbles 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.mp3'), duration=0.55, node=suit), SoundInterval(globalBattleSoundCache.getSound('Toon_bodyfall_synergy.mp3'), 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) # Where suit drops from after the quicksand landPos = trapProp.getPos(battle) # Where the suit lands from the drop sinkPos1.setZ(sinkPos1.getZ() - 3.1) sinkPos2.setZ(sinkPos2.getZ() - 9.1) dropPos.setZ(dropPos.getZ() + 15) # We grab the name tag so we can hide it while the suit is in the quicksand 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), # Wait before starting to sink LerpPosInterval(suit, 0.9, sinkPos1, other=battle), # Start to sink a bit LerpPosInterval(suit, 0.4, sinkPos2, other=battle), # Fall in quicksand Func(suit.setPos, battle, dropPos), Func(suit.wrtReparentTo, hidden), Wait(1.1), # Wait while stuck in the quicksand Func(suit.wrtReparentTo, battle), LerpPosInterval(suit, 0.3, landPos, other=battle), # Drop back down ) 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.mp3'), node=suit), Wait(0.1), SoundInterval(globalBattleSoundCache.getSound('Toon_bodyfall_synergy.mp3'), node=suit), ) result.append(Parallel(trapTrack, moveTrack, animTrack, damageTrack, soundTrack)) elif (trapName == 'trapdoor'): sinkPos = trapProp.getPos(battle) dropPos = trapProp.getPos(battle) # Where suit drops from after the trap door landPos = trapProp.getPos(battle) # Where the suit lands from the drop 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), # Wait before falling through the trap door LerpPosInterval(suit, 0.4, sinkPos, other=battle), # Fall through trap door Func(suit.setPos, battle, dropPos), Func(suit.wrtReparentTo, hidden), Wait(1.6), # Wait while through the trap door Func(suit.wrtReparentTo, battle), LerpPosInterval(suit, 0.3, landPos, other=battle), # Drop back down ) animTrack = Sequence( # Suit quickly looks down getSplicedLerpAnimsTrack(suit, 'flail', 0.7, 0.25), # Spring the trap door (make it go black) Func(trapProp.setColor, Vec4(0, 0, 0, 1)), # Suit slowly looks back up with resignation ActorInterval(suit, 'flail', startTime=0.7, endTime=0), # Suspenseful wait ActorInterval(suit, 'neutral', duration=0.5), # Suit falls through the trap door 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.mp3'), node=suit), Wait(0.8), SoundInterval(globalBattleSoundCache.getSound('Toon_bodyfall_synergy.mp3'), 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), ) suitTrack = Sequence( ActorInterval(suit, 'flail', duration=0.7), ActorInterval(suit, 'flail', startTime=0.7, endTime=0.0), ActorInterval(suit, 'neutral', duration=0.4), ActorInterval(suit, 'flail', startTime=0.6, endTime=0.7), Wait(0.4), ActorInterval(suit, 'slip-forward', startTime=2.48, duration=0.1), Func(battle.movie.needRestoreColor), Func(suit.setColorScale, Vec4(0, 0, 0, 1)), Func(trapProp.reparentTo, hidden), ActorInterval(suit, 'slip-forward', startTime=2.58), Func(suit.clearColorScale), Func(trapProp.sparksEffect.cleanup), 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.mp3") soundTrack = Sequence( SoundInterval(globalBattleSoundCache.getSound('TL_dynamite.mp3'), duration=2.0, node=suit), SoundInterval(explosionSound, duration=0.6, node=suit), ) result.append(Parallel(tntTrack, suitTrack, damageTrack, explosionTrack, soundTrack)) 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 assert notify.debug('adding battle.removeTrap for suit %d' % suit.doId) 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': #a bit of a hack, when a suit is joining, the train track still stays, really make sure it goes away #TODO this nukes the train tunnels shrinking, figure out a better way result.append(Func(MovieUtil.removeProp, trapProp)) return result