ToonTownRewritten/toontown/battle/MovieLure.py

628 lines
30 KiB
Python

from direct.interval.IntervalGlobal import *
from BattleBase import *
from BattleProps import *
from toontown.suit.SuitBase import *
from toontown.toon.ToonDNA import *
from BattleSounds import *
import MovieCamera
from direct.directnotify import DirectNotifyGlobal
import MovieUtil
from toontown.toonbase import ToontownBattleGlobals
import BattleParticles
import BattleProps
import MovieNPCSOS
notify = DirectNotifyGlobal.directNotify.newCategory('MovieLures')
def safeWrtReparentTo(nodePath, parent):
if nodePath and not nodePath.isEmpty():
nodePath.wrtReparentTo(parent)
def doLures(lures):
if len(lures) == 0:
return (None, None)
npcArrivals, npcDepartures, npcs = MovieNPCSOS.doNPCTeleports(lures)
mtrack = Parallel()
for l in lures:
ival = __doLureLevel(l, npcs)
if ival:
mtrack.append(ival)
lureTrack = Sequence(npcArrivals, mtrack, npcDepartures)
camDuration = mtrack.getDuration()
enterDuration = npcArrivals.getDuration()
exitDuration = npcDepartures.getDuration()
camTrack = MovieCamera.chooseLureShot(lures, camDuration, enterDuration, exitDuration)
return (lureTrack, camTrack)
def __doLureLevel(lure, npcs):
level = lure['level']
if level == 0:
return __lureOneDollar(lure)
elif level == 1:
return __lureSmallMagnet(lure, npcs)
elif level == 2:
return __lureFiveDollar(lure)
elif level == 3:
return __lureLargeMagnet(lure, npcs)
elif level == 4:
return __lureTenDollar(lure)
elif level == 5:
return __lureHypnotize(lure, npcs)
elif level == 6:
return __lureSlideshow(lure, npcs)
return None
def getSoundTrack(fileName, delay = 0.01, duration = None, node = None):
soundEffect = globalBattleSoundCache.getSound(fileName)
if duration:
return Sequence(Wait(delay), SoundInterval(soundEffect, duration=duration, node=node))
else:
return Sequence(Wait(delay), SoundInterval(soundEffect, node=node))
def __createFishingPoleMultiTrack(lure, dollar, dollarName):
toon = lure['toon']
target = lure['target']
battle = lure['battle']
sidestep = lure['sidestep']
hp = target['hp']
kbbonus = target['kbbonus']
suit = target['suit']
targetPos = suit.getPos(battle)
died = target['died']
revived = target['revived']
reachAnimDuration = 3.5
trapProp = suit.battleTrapProp
pole = globalPropPool.getProp('fishing-pole')
pole2 = MovieUtil.copyProp(pole)
poles = [pole, pole2]
hands = toon.getRightHands()
def positionDollar(dollar, suit):
dollar.reparentTo(suit)
dollar.setPos(0, MovieUtil.SUIT_LURE_DOLLAR_DISTANCE, 0)
dollarTrack = Sequence(Func(positionDollar, dollar, suit), Func(dollar.wrtReparentTo, battle), ActorInterval(dollar, dollarName, duration=3), getSplicedLerpAnimsTrack(dollar, dollarName, 0.7, 2.0, startTime=3), LerpPosInterval(dollar, 0.2, Point3(0, -10, 7)), Func(MovieUtil.removeProp, dollar))
poleTrack = Sequence(Func(MovieUtil.showProps, poles, hands), ActorInterval(pole, 'fishing-pole'), Func(MovieUtil.removeProps, poles))
toonTrack = Sequence(Func(toon.headsUp, battle, targetPos), ActorInterval(toon, 'battlecast'), Func(toon.loop, 'neutral'))
tracks = Parallel(dollarTrack, poleTrack, toonTrack)
if sidestep == 0:
if kbbonus == 1 or hp > 0:
suitTrack = Sequence()
opos, ohpr = battle.getActorPosHpr(suit)
reachDist = MovieUtil.SUIT_LURE_DISTANCE
reachPos = Point3(opos[0], opos[1] - reachDist, opos[2])
suitTrack.append(Func(suit.loop, 'neutral'))
suitTrack.append(Wait(3.5))
suitName = suit.getStyleName()
retardPos, retardHpr = battle.getActorPosHpr(suit)
retardPos.setY(retardPos.getY() + MovieUtil.SUIT_EXTRA_REACH_DISTANCE)
if suitName in MovieUtil.largeSuits:
moveTrack = lerpSuit(suit, 0.0, reachAnimDuration / 2.5, retardPos, battle, trapProp)
reachTrack = ActorInterval(suit, 'reach', duration=reachAnimDuration)
suitTrack.append(Parallel(moveTrack, reachTrack))
else:
suitTrack.append(ActorInterval(suit, 'reach', duration=reachAnimDuration))
if trapProp:
suitTrack.append(Func(trapProp.wrtReparentTo, battle))
suitTrack.append(Func(suit.setPos, battle, reachPos))
if trapProp:
suitTrack.append(Func(trapProp.wrtReparentTo, suit))
suit.battleTrapProp = trapProp
suitTrack.append(Func(suit.loop, 'lured'))
suitTrack.append(Func(battle.lureSuit, suit))
if hp > 0:
suitTrack.append(__createSuitDamageTrack(battle, suit, hp, lure, trapProp))
if revived != 0:
suitTrack.append(MovieUtil.createSuitReviveTrack(suit, toon, battle))
if died != 0:
suitTrack.append(MovieUtil.createSuitDeathTrack(suit, toon, battle))
tracks.append(suitTrack)
else:
tracks.append(Sequence(Wait(3.7), Func(MovieUtil.indicateMissed, suit)))
tracks.append(getSoundTrack('TL_fishing_pole.ogg', delay=0.5, node=toon))
return tracks
def __createMagnetMultiTrack(lure, magnet, pos, hpr, scale, isSmallMagnet = 1, npcs = []):
toon = lure['toon']
if lure.has_key('npc'):
toon = lure['npc']
battle = lure['battle']
sidestep = lure['sidestep']
targets = lure['target']
tracks = Parallel()
tracks.append(Sequence(ActorInterval(toon, 'hold-magnet'), Func(toon.loop, 'neutral')))
hands = toon.getLeftHands()
magnet2 = MovieUtil.copyProp(magnet)
magnets = [magnet, magnet2]
magnetTrack = Sequence(Wait(0.7), Func(MovieUtil.showProps, magnets, hands, pos, hpr, scale), Wait(6.3), Func(MovieUtil.removeProps, magnets))
tracks.append(magnetTrack)
for target in targets:
suit = target['suit']
trapProp = suit.battleTrapProp
if sidestep == 0:
hp = target['hp']
kbbonus = target['kbbonus']
died = target['died']
revived = target['revived']
if kbbonus == 1 or hp > 0:
suitDelay = 2.6
suitMoveDuration = 0.8
suitTrack = Sequence()
opos, ohpr = battle.getActorPosHpr(suit)
reachDist = MovieUtil.SUIT_LURE_DISTANCE
reachPos = Point3(opos[0], opos[1] - reachDist, opos[2])
numShakes = 3
shakeTotalDuration = 0.8
shakeDuration = shakeTotalDuration / float(numShakes)
suitTrack.append(Func(suit.loop, 'neutral'))
suitTrack.append(Wait(suitDelay))
suitTrack.append(ActorInterval(suit, 'landing', startTime=2.37, endTime=1.82))
for i in range(0, numShakes):
suitTrack.append(ActorInterval(suit, 'landing', startTime=1.82, endTime=1.16, duration=shakeDuration))
suitTrack.append(ActorInterval(suit, 'landing', startTime=1.16, endTime=0.7))
suitTrack.append(ActorInterval(suit, 'landing', startTime=0.7, duration=1.3))
suitTrack.append(Func(suit.loop, 'lured'))
suitTrack.append(Func(battle.lureSuit, suit))
if hp > 0:
suitTrack.append(__createSuitDamageTrack(battle, suit, hp, lure, trapProp))
if revived != 0:
suitTrack.append(MovieUtil.createSuitReviveTrack(suit, toon, battle, npcs))
elif died != 0:
suitTrack.append(MovieUtil.createSuitDeathTrack(suit, toon, battle, npcs))
tracks.append(suitTrack)
tracks.append(lerpSuit(suit, suitDelay + 0.55 + shakeTotalDuration, suitMoveDuration, reachPos, battle, trapProp))
else:
tracks.append(Sequence(Wait(3.7), Func(MovieUtil.indicateMissed, suit)))
if isSmallMagnet == 1:
tracks.append(getSoundTrack('TL_small_magnet.ogg', delay=0.7, node=toon))
else:
tracks.append(getSoundTrack('TL_large_magnet.ogg', delay=0.7, node=toon))
return tracks
def __createHypnoGogglesMultiTrack(lure, npcs = []):
toon = lure['toon']
if lure.has_key('npc'):
toon = lure['npc']
targets = lure['target']
battle = lure['battle']
sidestep = lure['sidestep']
goggles = globalPropPool.getProp('hypno-goggles')
goggles2 = MovieUtil.copyProp(goggles)
bothGoggles = [goggles, goggles2]
pos = Point3(-1.03, 1.04, -0.3)
hpr = Point3(-96.55, 36.14, -170.59)
scale = Point3(1.5, 1.5, 1.5)
hands = toon.getLeftHands()
gogglesTrack = Sequence(Wait(0.6), Func(MovieUtil.showProps, bothGoggles, hands, pos, hpr, scale), ActorInterval(goggles, 'hypno-goggles', duration=2.2), Func(MovieUtil.removeProps, bothGoggles))
toonTrack = Sequence(ActorInterval(toon, 'hypnotize'), Func(toon.loop, 'neutral'))
tracks = Parallel(gogglesTrack, toonTrack)
for target in targets:
suit = target['suit']
trapProp = suit.battleTrapProp
if sidestep == 0:
hp = target['hp']
kbbonus = target['kbbonus']
died = target['died']
revived = target['revived']
if kbbonus == 1 or hp > 0:
suitTrack = Sequence()
suitDelay = 1.6
suitAnimDuration = 1.5
opos, ohpr = battle.getActorPosHpr(suit)
reachDist = MovieUtil.SUIT_LURE_DISTANCE
reachPos = Point3(opos[0], opos[1] - reachDist, opos[2])
suitTrack.append(Func(suit.loop, 'neutral'))
suitTrack.append(Wait(suitDelay))
suitTrack.append(ActorInterval(suit, 'hypnotized', duration=3.1))
suitTrack.append(Func(suit.setPos, battle, reachPos))
suitTrack.append(Func(suit.loop, 'lured'))
suitTrack.append(Func(battle.lureSuit, suit))
if hp > 0:
suitTrack.append(__createSuitDamageTrack(battle, suit, hp, lure, trapProp))
if revived != 0:
suitTrack.append(MovieUtil.createSuitReviveTrack(suit, toon, battle, npcs))
elif died != 0:
suitTrack.append(MovieUtil.createSuitDeathTrack(suit, toon, battle, npcs))
tracks.append(suitTrack)
tracks.append(lerpSuit(suit, suitDelay + 1.7, 0.7, reachPos, battle, trapProp))
else:
tracks.append(Sequence(Wait(2.3), Func(MovieUtil.indicateMissed, suit, 1.1)))
tracks.append(getSoundTrack('TL_hypnotize.ogg', delay=0.5, node=toon))
return tracks
def __lureOneDollar(lure):
dollarProp = '1dollar'
dollar = globalPropPool.getProp(dollarProp)
return __createFishingPoleMultiTrack(lure, dollar, dollarProp)
def __lureSmallMagnet(lure, npcs = []):
magnet = globalPropPool.getProp('small-magnet')
pos = Point3(-0.27, 0.19, 0.29)
hpr = Point3(-90.0, 84.17, -180.0)
scale = Point3(0.85, 0.85, 0.85)
return __createMagnetMultiTrack(lure, magnet, pos, hpr, scale, isSmallMagnet=1, npcs=npcs)
def __lureFiveDollar(lure):
dollarProp = '5dollar'
dollar = globalPropPool.getProp(dollarProp)
return __createFishingPoleMultiTrack(lure, dollar, dollarProp)
def __lureLargeMagnet(lure, npcs = []):
magnet = globalPropPool.getProp('big-magnet')
pos = Point3(-0.27, 0.08, 0.29)
hpr = Point3(-90.0, 84.17, -180)
scale = Point3(1.32, 1.32, 1.32)
return __createMagnetMultiTrack(lure, magnet, pos, hpr, scale, isSmallMagnet=0, npcs=npcs)
def __lureTenDollar(lure):
dollarProp = '10dollar'
dollar = globalPropPool.getProp(dollarProp)
return __createFishingPoleMultiTrack(lure, dollar, dollarProp)
def __lureHypnotize(lure, npcs = []):
return __createHypnoGogglesMultiTrack(lure, npcs)
def __lureSlideshow(lure, npcs):
return __createSlideshowMultiTrack(lure, npcs)
def __createSuitDamageTrack(battle, suit, hp, lure, trapProp):
if trapProp == 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 __createSuitResetPosTrack(suit, battle):
resetPos, resetHpr = battle.getActorPosHpr(suit)
moveDist = Vec3(suit.getPos(battle) - resetPos).length()
moveDuration = 0.5
walkTrack = Sequence(Func(suit.setHpr, battle, resetHpr), ActorInterval(suit, 'walk', startTime=1, duration=moveDuration, endTime=0.0001), Func(suit.loop, 'neutral'))
moveTrack = LerpPosInterval(suit, moveDuration, resetPos, other=battle)
return Parallel(walkTrack, moveTrack)
def getSplicedLerpAnimsTrack(object, animName, origDuration, newDuration, startTime = 0, fps = 30):
track = Sequence()
addition = 0
numIvals = origDuration * fps
timeInterval = newDuration / numIvals
animInterval = origDuration / numIvals
for i in range(0, int(numIvals)):
track.append(Wait(timeInterval))
track.append(ActorInterval(object, animName, startTime=startTime + addition, duration=animInterval))
addition += animInterval
return track
def lerpSuit(suit, delay, duration, reachPos, battle, trapProp):
track = Sequence()
if trapProp:
track.append(Func(safeWrtReparentTo, trapProp, battle))
track.append(Wait(delay))
track.append(LerpPosInterval(suit, duration, reachPos, other=battle))
if trapProp:
if trapProp.getName() == 'traintrack':
notify.debug('UBERLURE MovieLure.lerpSuit deliberately not parenting trainTrack to suit')
else:
track.append(Func(safeWrtReparentTo, trapProp, suit))
suit.battleTrapProp = trapProp
return track
def createTNTExplosionTrack(parent, explosionPoint = None, trapProp = None, relativeTo = render):
explosionTrack = Sequence()
explosion = BattleProps.globalPropPool.getProp('kapow')
explosion.setBillboardPointEye()
if not explosionPoint:
if trapProp:
explosionPoint = trapProp.getPos(relativeTo)
explosionPoint.setZ(explosionPoint.getZ() + 2.3)
else:
explosionPoint = Point3(0, 3.6, 2.1)
explosionTrack.append(Func(explosion.reparentTo, parent))
explosionTrack.append(Func(explosion.setPos, explosionPoint))
explosionTrack.append(Func(explosion.setScale, 0.11))
explosionTrack.append(ActorInterval(explosion, 'kapow'))
explosionTrack.append(Func(MovieUtil.removeProp, explosion))
return explosionTrack
TRAIN_STARTING_X = -7.131
TRAIN_TUNNEL_END_X = 7.1
TRAIN_TRAVEL_DISTANCE = 45
TRAIN_SPEED = 35.0
TRAIN_DURATION = TRAIN_TRAVEL_DISTANCE / TRAIN_SPEED
TRAIN_MATERIALIZE_TIME = 3
TOTAL_TRAIN_TIME = TRAIN_DURATION + TRAIN_MATERIALIZE_TIME
def createSuitReactionToTrain(battle, suit, hp, lure, trapProp):
toon = lure['toon']
retval = Sequence()
suitPos, suitHpr = battle.getActorPosHpr(suit)
distance = suitPos.getX() - TRAIN_STARTING_X
timeToGetHit = distance / TRAIN_SPEED
suitTrack = Sequence()
showDamage = Func(suit.showHpText, -hp, openEnded=0)
updateHealthBar = Func(suit.updateHealthBar, hp)
anim = 'flatten'
suitReact = ActorInterval(suit, anim)
cogGettingHit = getSoundTrack('TL_train_cog.ogg', node=toon)
hideTrack = Sequence()
hideTrack.append(Wait(2.0))
hideTrack.append(LerpColorScaleInterval(trapProp, 1.0, Point4(1, 1, 1, 0)))
hideTrack.append(showDamage)
suitTrack.append(Func(suit.loop, 'lured'))
suitTrack.append(Wait(timeToGetHit + TRAIN_MATERIALIZE_TIME))
suitTrack.append(updateHealthBar)
suitTrack.append(Parallel(suitReact, cogGettingHit, hideTrack))
curDuration = suitTrack.getDuration()
timeTillEnd = TOTAL_TRAIN_TIME - curDuration
if timeTillEnd > 0:
suitTrack.append(Wait(timeTillEnd))
retval.append(suitTrack)
return retval
def createIncomingTrainInterval(battle, suit, hp, lure, trapProp):
toon = lure['toon']
retval = Parallel()
suitTrack = createSuitReactionToTrain(battle, suit, hp, lure, trapProp)
retval.append(suitTrack)
if not trapProp.find('**/train_gag').isEmpty():
return retval
clipper = PlaneNode('clipper')
clipper.setPlane(Plane(Vec3(1, 0, 0), Point3(TRAIN_STARTING_X, 0, 0)))
clipNP = trapProp.attachNewNode(clipper)
trapProp.setClipPlane(clipNP)
clipper2 = PlaneNode('clipper2')
clipper2.setPlane(Plane(Vec3(-1, 0, 0), Point3(TRAIN_TUNNEL_END_X, 0, 0)))
clipNP2 = trapProp.attachNewNode(clipper2)
trapProp.setClipPlane(clipNP2)
train = globalPropPool.getProp('train')
train.hide()
train.reparentTo(trapProp)
tempScale = trapProp.getScale()
trainScale = Vec3(1.0 / tempScale[0], 1.0 / tempScale[1], 1.0 / tempScale[2])
trainIval = Sequence()
trainIval.append(Func(train.setScale, trainScale))
trainIval.append(Func(train.setH, 90))
trainIval.append(Func(train.setX, TRAIN_STARTING_X))
trainIval.append(Func(train.setTransparency, 1))
trainIval.append(Func(train.setColorScale, Point4(1, 1, 1, 0)))
trainIval.append(Func(train.show))
tunnel2 = trapProp.find('**/tunnel3')
tunnel3 = trapProp.find('**/tunnel2')
tunnels = [tunnel2, tunnel3]
for tunnel in tunnels:
trainIval.append(Func(tunnel.setTransparency, 1))
trainIval.append(Func(tunnel.setColorScale, Point4(1, 1, 1, 0)))
trainIval.append(Func(tunnel.setScale, Point3(1.0, 0.01, 0.01)))
trainIval.append(Func(tunnel.show))
materializeIval = Parallel()
materializeIval.append(LerpColorScaleInterval(train, TRAIN_MATERIALIZE_TIME, Point4(1, 1, 1, 1)))
for tunnel in tunnels:
materializeIval.append(LerpColorScaleInterval(tunnel, TRAIN_MATERIALIZE_TIME - 1.5, Point4(1, 1, 1, 1)))
for tunnel in tunnels:
tunnelScaleIval = Sequence()
tunnelScaleIval.append(LerpScaleInterval(tunnel, 0.75, Point3(1.0, 1.5, 1.7)))
tunnelScaleIval.append(LerpScaleInterval(tunnel, 0.5, Point3(1.0, 2.0, 2.1)))
tunnelScaleIval.append(LerpScaleInterval(tunnel, 0.5, Point3(1.0, 1.6, 1.7)))
materializeIval.append(tunnelScaleIval)
trainIval.append(materializeIval)
endingX = TRAIN_STARTING_X + TRAIN_TRAVEL_DISTANCE
trainIval.append(LerpPosInterval(train, TRAIN_DURATION, Point3(endingX, 0, 0), other=battle))
dematerializeIval = Parallel()
dematerializeIval.append(LerpColorScaleInterval(train, TRAIN_MATERIALIZE_TIME, Point4(1, 1, 1, 0)))
for tunnel in tunnels:
dematerializeIval.append(LerpColorScaleInterval(tunnel, TRAIN_MATERIALIZE_TIME - 2.0, Point4(1, 1, 1, 0)))
dematerializeIval.append(LerpScaleInterval(tunnel, TRAIN_MATERIALIZE_TIME - 1.5, Point3(1.0, 0.01, 0.01)))
trainIval.append(dematerializeIval)
retval.append(trainIval)
trainSoundTrack = getSoundTrack('TL_train.ogg', node=toon)
retval.append(trainSoundTrack)
return retval
def __createSlideshowMultiTrack(lure, npcs = []):
toon = lure['toon']
battle = lure['battle']
sidestep = lure['sidestep']
origHpr = toon.getHpr(battle)
slideshowDelay = 2.5
hands = toon.getLeftHands()
endPos = toon.getPos(battle)
endPos.setY(endPos.getY() + 4)
button = globalPropPool.getProp('button')
button2 = MovieUtil.copyProp(button)
buttons = [button, button2]
toonTrack = Sequence()
toonTrack.append(Func(MovieUtil.showProps, buttons, hands))
toonTrack.append(Func(toon.headsUp, battle, endPos))
toonTrack.append(ActorInterval(toon, 'pushbutton'))
toonTrack.append(Func(MovieUtil.removeProps, buttons))
toonTrack.append(Func(toon.loop, 'neutral'))
toonTrack.append(Func(toon.setHpr, battle, origHpr))
slideShowProp = globalPropPool.getProp('slideshow')
propTrack = Sequence()
propTrack.append(Wait(slideshowDelay))
propTrack.append(Func(slideShowProp.show))
propTrack.append(Func(slideShowProp.setScale, Point3(0.1, 0.1, 0.1)))
propTrack.append(Func(slideShowProp.reparentTo, battle))
propTrack.append(Func(slideShowProp.setPos, endPos))
propTrack.append(LerpScaleInterval(slideShowProp, 1.2, Point3(1.0, 1.0, 1.0)))
shrinkDuration = 0.4
totalDuration = 7.1
propTrackDurationAtThisPoint = propTrack.getDuration()
waitTime = totalDuration - propTrackDurationAtThisPoint - shrinkDuration
if waitTime > 0:
propTrack.append(Wait(waitTime))
propTrack.append(LerpScaleInterval(nodePath=slideShowProp, scale=Point3(1.0, 1.0, 0.1), duration=shrinkDuration))
propTrack.append(Func(MovieUtil.removeProp, slideShowProp))
tracks = Parallel(propTrack, toonTrack)
targets = lure['target']
for target in targets:
suit = target['suit']
trapProp = suit.battleTrapProp
if sidestep == 0:
hp = target['hp']
kbbonus = target['kbbonus']
died = target['died']
revived = target['revived']
if kbbonus == 1 or hp > 0:
suitTrack = Sequence()
suitDelay = 3.8
suitAnimDuration = 1.5
opos, ohpr = battle.getActorPosHpr(suit)
reachDist = MovieUtil.SUIT_LURE_DISTANCE
reachPos = Point3(opos[0], opos[1] - reachDist, opos[2])
suitTrack.append(Func(suit.loop, 'neutral'))
suitTrack.append(Wait(suitDelay))
suitTrack.append(ActorInterval(suit, 'hypnotized', duration=3.1))
suitTrack.append(Func(suit.setPos, battle, reachPos))
suitTrack.append(Func(suit.loop, 'lured'))
suitTrack.append(Func(battle.lureSuit, suit))
if hp > 0:
suitTrack.append(__createSuitDamageTrack(battle, suit, hp, lure, trapProp))
if revived != 0:
suitTrack.append(MovieUtil.createSuitReviveTrack(suit, toon, battle, npcs))
elif died != 0:
suitTrack.append(MovieUtil.createSuitDeathTrack(suit, toon, battle, npcs))
tracks.append(suitTrack)
tracks.append(lerpSuit(suit, suitDelay + 1.7, 0.7, reachPos, battle, trapProp))
else:
tracks.append(Sequence(Wait(2.3), Func(MovieUtil.indicateMissed, suit, 1.1)))
tracks.append(getSoundTrack('TL_presentation.ogg', delay=2.3, node=toon))
tracks.append(getSoundTrack('AA_drop_trigger_box.ogg', delay=slideshowDelay, node=toon))
return tracks