Poodletooth-iLand/toontown/battle/MovieTrap.py

582 lines
25 KiB
Python

from direct.interval.IntervalGlobal import *
from BattleBase import *
from BattleProps import *
from BattleSounds import *
import MovieUtil
import MovieCamera
from direct.directnotify import DirectNotifyGlobal
from toontown.toonbase import ToontownBattleGlobals
from direct.actor import Actor
from direct.particles import ParticleEffect
import BattleParticles
import BattleProps
import MovieNPCSOS
from MovieSound import createSuitResetPosTrack
notify = DirectNotifyGlobal.directNotify.newCategory('MovieTrap')
def doTraps(traps):
if len(traps) == 0:
return (None, None)
npcArrivals, npcDepartures, npcs = MovieNPCSOS.doNPCTeleports(traps)
hasUberTrapConflict = False
suitTrapsDict = {}
for trap in traps:
targets = trap['target']
if len(targets) == 1:
suitId = targets[0]['suit'].doId
if suitId in suitTrapsDict:
suitTrapsDict[suitId].append(trap)
else:
suitTrapsDict[suitId] = [trap]
else:
for target in targets:
suitId = target['suit'].doId
if suitId not in suitTrapsDict:
suitTrapsDict[suitId] = [trap]
break
if trap['level'] == UBER_GAG_LEVEL_INDEX:
if len(traps) > 1:
hasUberTrapConflict = True
for oneTarget in trap['target']:
suit = oneTarget['suit']
if suit.battleTrap != NO_TRAP:
hasUberTrapConflict = True
suitTrapLists = suitTrapsDict.values()
mtrack = Parallel()
for trapList in suitTrapLists:
trapPropList = []
for i in xrange(len(trapList)):
trap = trapList[i]
level = trap['level']
if level == 0:
banana = globalPropPool.getProp('banana')
banana2 = MovieUtil.copyProp(banana)
trapPropList.append([banana, banana2])
elif level == 1:
rake = globalPropPool.getProp('rake')
rake2 = MovieUtil.copyProp(rake)
rake.pose('rake', 0)
rake2.pose('rake', 0)
trapPropList.append([rake, rake2])
elif level == 2:
marbles = globalPropPool.getProp('marbles')
marbles2 = MovieUtil.copyProp(marbles)
trapPropList.append([marbles, marbles2])
elif level == 3:
trapPropList.append([globalPropPool.getProp('quicksand')])
elif level == 4:
trapPropList.append([globalPropPool.getProp('trapdoor')])
elif level == 5:
tnt = globalPropPool.getProp('tnt')
tnt2 = MovieUtil.copyProp(tnt)
trapPropList.append([tnt, tnt2])
elif level == 6:
tnt = globalPropPool.getProp('traintrack')
tnt2 = MovieUtil.copyProp(tnt)
trapPropList.append([tnt, tnt2])
else:
notify.warning('__doTraps() - Incorrect trap level: %d' % level)
if len(trapList) == 1 and not hasUberTrapConflict:
ival = __doTrapLevel(trapList[0], trapPropList[0])
if ival:
mtrack.append(ival)
else:
subMtrack = Parallel()
for i in xrange(len(trapList)):
trap = trapList[i]
trapProps = trapPropList[i]
ival = __doTrapLevel(trap, trapProps, explode=1)
if ival:
subMtrack.append(ival)
mtrack.append(subMtrack)
trapTrack = Sequence(npcArrivals, mtrack, npcDepartures)
camDuration = mtrack.getDuration()
enterDuration = npcArrivals.getDuration()
exitDuration = npcDepartures.getDuration()
camTrack = MovieCamera.chooseTrapShot(traps, camDuration, enterDuration, exitDuration)
return (trapTrack, camTrack)
def __doTrapLevel(trap, trapProps, explode = 0):
level = trap['level']
if level == 0:
return __trapBanana(trap, trapProps, explode)
elif level == 1:
return __trapRake(trap, trapProps, explode)
elif level == 2:
return __trapMarbles(trap, trapProps, explode)
elif level == 3:
return __trapQuicksand(trap, trapProps, explode)
elif level == 4:
return __trapTrapdoor(trap, trapProps, explode)
elif level == 5:
return __trapTNT(trap, trapProps, explode)
elif level == 6:
return __trapTrain(trap, trapProps, explode)
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 __createThrownTrapMultiTrack(trap, propList, propName, propPos = None, propHpr = None, anim = 0, explode = 0):
toon = trap['toon']
level = trap['level']
battle = trap['battle']
target = trap['target']
suit = target[0]['suit']
targetPos = suit.getPos(battle)
thrownProp = propList[0]
unthrownProp = propList[1]
torso = toon.style.torso
torso = torso[0]
if torso == 'l':
throwDelay = 2.3
elif torso == 'm':
throwDelay = 2.3
else:
throwDelay = 1.9
throwDuration = 0.9
animBreakPoint = throwDelay + throwDuration
animDelay = 3.1
trapTrack = ToontownBattleGlobals.TRAP_TRACK
trapTrackNames = ToontownBattleGlobals.AvProps[trapTrack]
trapName = trapTrackNames[level]
hands = toon.getRightHands()
propTrack = Sequence()
if propPos and propHpr:
propTrack.append(Func(MovieUtil.showProps, propList, hands, propPos, propHpr))
else:
propTrack.append(Func(MovieUtil.showProps, propList, hands))
if anim == 1:
pTracks = Parallel()
for prop in propList:
pTracks.append(ActorInterval(prop, propName, duration=animBreakPoint))
propTrack.append(pTracks)
throwTrack = Sequence()
throwTrack.append(Wait(throwDelay))
throwTrack.append(Func(unthrownProp.reparentTo, hidden))
throwTrack.append(Func(toon.update))
if suit.battleTrap != NO_TRAP:
notify.debug('trapSuit() - trap: %d destroyed existing trap: %d' % (level, suit.battleTrap))
battle.removeTrap(suit)
if trapName == 'rake':
trapProp = globalPropPool.getProp('rake-react')
else:
trapProp = MovieUtil.copyProp(thrownProp)
suit.battleTrapProp = trapProp
suit.battleTrap = level
suit.battleTrapIsFresh = 1
if trapName == 'banana':
trapPoint, trapHpr = battle.getActorPosHpr(suit)
trapPoint.setY(MovieUtil.SUIT_TRAP_DISTANCE)
slidePoint = Vec3(trapPoint.getX(), trapPoint.getY() - 2, trapPoint.getZ())
throwingTrack = createThrowingTrack(thrownProp, slidePoint, duration=0.9, parent=battle)
moveTrack = LerpPosInterval(thrownProp, 0.8, pos=trapPoint, other=battle)
animTrack = ActorInterval(thrownProp, propName, startTime=animBreakPoint)
slideTrack = Parallel(moveTrack, animTrack)
motionTrack = Sequence(throwingTrack, slideTrack)
hprTrack = LerpHprInterval(thrownProp, 1.7, hpr=Point3(0, 0, 0))
soundTrack = getSoundTrack('TL_banana.ogg', node=toon)
scaleTrack = LerpScaleInterval(thrownProp, 1.7, scale=MovieUtil.PNT3_ONE)
throwTrack.append(Wait(0.25))
throwTrack.append(Func(thrownProp.wrtReparentTo, suit))
throwTrack.append(Parallel(motionTrack, hprTrack, scaleTrack, soundTrack))
elif trapName == 'tnt':
trapPoint, trapHpr = battle.getActorPosHpr(suit)
trapPoint.setY(MovieUtil.SUIT_TRAP_TNT_DISTANCE - 3.9)
trapPoint.setZ(trapPoint.getZ() + 0.4)
throwingTrack = createThrowingTrack(thrownProp, trapPoint, duration=throwDuration, parent=battle)
hprTrack = LerpHprInterval(thrownProp, 0.9, hpr=Point3(0, 90, 0))
scaleTrack = LerpScaleInterval(thrownProp, 0.9, scale=MovieUtil.PNT3_ONE)
soundTrack = getSoundTrack('TL_dynamite.ogg', delay=0.8, duration=0.7, node=suit)
throwTrack.append(Wait(0.2))
throwTrack.append(Parallel(throwingTrack, hprTrack, scaleTrack, soundTrack))
elif trapName == 'marbles':
trapPoint, trapHpr = battle.getActorPosHpr(suit)
trapPoint.setY(MovieUtil.SUIT_TRAP_MARBLES_DISTANCE)
flingDuration = 0.2
rollDuration = 1.0
throwDuration = flingDuration + rollDuration
landPoint = Point3(0, trapPoint.getY() + 2, trapPoint.getZ())
throwPoint = Point3(0, trapPoint.getY(), trapPoint.getZ())
moveTrack = Sequence(Func(thrownProp.wrtReparentTo, suit), Func(thrownProp.setHpr, Point3(94, 0, 0)), LerpPosInterval(thrownProp, flingDuration, pos=landPoint, other=suit), LerpPosInterval(thrownProp, rollDuration, pos=throwPoint, other=suit))
animTrack = ActorInterval(thrownProp, propName, startTime=throwDelay + 0.9)
scaleTrack = LerpScaleInterval(thrownProp, throwDuration, scale=MovieUtil.PNT3_ONE)
soundTrack = getSoundTrack('TL_marbles.ogg', delay=0.1, node=toon)
throwTrack.append(Wait(0.2))
throwTrack.append(Parallel(moveTrack, animTrack, scaleTrack, soundTrack))
elif trapName == 'rake':
trapPoint, trapHpr = battle.getActorPosHpr(suit)
trapPoint.setY(MovieUtil.SUIT_TRAP_RAKE_DISTANCE)
throwDuration = 1.1
throwingTrack = createThrowingTrack(thrownProp, trapPoint, duration=throwDuration, parent=suit)
hprTrack = LerpHprInterval(thrownProp, throwDuration, hpr=VBase3(63.43, -90.0, 63.43))
scaleTrack = LerpScaleInterval(thrownProp, 0.9, scale=Point3(0.7, 0.7, 0.7))
soundTrack = SoundInterval(globalBattleSoundCache.getSound('TL_rake_throw_only.ogg'), duration=1.1, node=suit)
throwTrack.append(Wait(0.2))
throwTrack.append(Parallel(throwingTrack, hprTrack, scaleTrack, soundTrack))
else:
notify.warning('__createThrownTrapMultiTrack() - Incorrect trap: %s thrown from toon' % 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)
dustNode = hidden.attachNewNode('DustNode')
def placeDustExplosion(dustNode = dustNode, thrownProp = thrownProp, battle = battle):
dustNode.reparentTo(battle)
dustNode.setPos(thrownProp.getPos(battle))
if explode == 1:
throwTrack.append(Func(thrownProp.wrtReparentTo, hidden))
throwTrack.append(Func(placeDustExplosion))
throwTrack.append(createCartoonExplosionTrack(dustNode, 'dust', explosionPoint=Point3(0, 0, 0)))
throwTrack.append(Func(battle.removeTrap, suit))
else:
throwTrack.append(Func(placeTrap, trapProp, suit))
if trapName == 'tnt':
tip = trapProp.find('**/joint_attachEmitter')
sparks = BattleParticles.createParticleEffect(file='tnt')
trapProp.sparksEffect = sparks
throwTrack.append(Func(sparks.start, tip))
throwTrack.append(Func(MovieUtil.removeProps, propList))
toonTrack = Sequence(Func(toon.headsUp, battle, targetPos), ActorInterval(toon, 'toss'), Func(toon.loop, 'neutral'))
return Parallel(propTrack, throwTrack, toonTrack)
def __createPlacedTrapMultiTrack(trap, prop, propName, propPos = None, propHpr = None, explode = 0, visibleOnlyForThisSuitId = None):
toon = trap['toon']
if 'npc' in trap:
toon = trap['npc']
level = trap['level']
battle = trap['battle']
origHpr = toon.getHpr(battle)
trapPoint = Point3(0, MovieUtil.SUIT_TRAP_DISTANCE, 0.025)
trapDelay = 2.5
hands = toon.getLeftHands()
def placeDustExplosion(dustNode, trapProp, battle):
dustNode.reparentTo(battle)
dustNode.setPos(trapProp.getPos(battle))
trapTracks = Parallel()
firstTime = 1
targets = trap['target']
for target in targets:
suit = target['suit']
suitPos = suit.getPos(battle)
targetPos = suitPos
trapProp = MovieUtil.copyProp(prop)
showThisTrap = True
if visibleOnlyForThisSuitId and visibleOnlyForThisSuitId != suit.doId:
showThisTrap = False
trapTrack = Sequence()
trapTrack.append(Wait(trapDelay))
if showThisTrap:
notify.debug('showing trap %s for %d' % (trapProp.getName(), suit.doId))
trapTrack.append(Func(trapProp.show))
else:
notify.debug('hiding trap %s for %d' % (trapProp.getName(), suit.doId))
trapTrack.append(Func(trapProp.hide))
trapTrack.append(Func(trapProp.setScale, Point3(0.1, 0.1, 0.1)))
trapTrack.append(Func(trapProp.reparentTo, suit))
trapTrack.append(Func(trapProp.setPos, trapPoint))
trapTrack.append(LerpScaleInterval(trapProp, 1.2, Point3(1.7, 1.7, 1.7)))
if explode == 1:
dustNode = hidden.attachNewNode('DustNode')
trapTrack.append(Func(trapProp.wrtReparentTo, hidden))
trapTrack.append(Func(placeDustExplosion, dustNode, trapProp, battle))
trapTrack.append(createCartoonExplosionTrack(dustNode, 'dust', explosionPoint=Point3(0, 0, 0)))
trapTrack.append(Func(MovieUtil.removeProp, trapProp))
trapTrack.append(Func(battle.removeTrap, suit))
else:
if suit.battleTrap != NO_TRAP:
notify.debug('trapSuit() - trap: %d destroyed existing trap: %d' % (level, suit.battleTrap))
battle.removeTrap(suit)
suit.battleTrapProp = trapProp
suit.battleTrap = level
suit.battleTrapIsFresh = 1
trapTracks.append(trapTrack)
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, suitPos))
toonTrack.append(ActorInterval(toon, 'pushbutton'))
toonTrack.append(Func(MovieUtil.removeProps, buttons))
toonTrack.append(Func(toon.loop, 'neutral'))
toonTrack.append(Func(toon.setHpr, battle, origHpr))
if propName == 'quicksand':
propSound = globalBattleSoundCache.getSound('TL_quicksand.ogg')
else:
propSound = globalBattleSoundCache.getSound('TL_trap_door.ogg')
buttonSound = globalBattleSoundCache.getSound('AA_drop_trigger_box.ogg')
soundTrack = Sequence(Wait(2.3), SoundInterval(buttonSound, duration=0.67, node=toon), Wait(0.3), SoundInterval(propSound, duration=0.5, node=toon))
return Parallel(trapTracks, toonTrack, soundTrack)
def __trapBanana(trap, trapProps, explode):
toon = trap['toon']
suit = trap['target'][0]['suit']
notify.debug('toon: %s lays banana peel in front of suit: %d' % (toon.getName(), suit.doId))
bananas = trapProps
return __createThrownTrapMultiTrack(trap, bananas, 'banana', anim=1, explode=explode)
def __trapRake(trap, trapProps, explode):
toon = trap['toon']
suit = trap['target'][0]['suit']
notify.debug('toon: %s lays rake in front of suit: %d' % (toon.getName(), suit.doId))
rakes = trapProps
return __createThrownTrapMultiTrack(trap, rakes, 'rake', anim=1, explode=explode)
def __trapMarbles(trap, trapProps, explode):
toon = trap['toon']
suit = trap['target'][0]['suit']
notify.debug('toon: %s lays marbles in front of suit: %d' % (toon.getName(), suit.doId))
bothMarbles = trapProps
pos = Point3(0, 0, 0)
hpr = Point3(0, 0, -30)
return __createThrownTrapMultiTrack(trap, bothMarbles, 'marbles', pos, hpr, anim=1, explode=explode)
def __trapQuicksand(trap, trapProps, explode):
toon = trap['toon']
suit = trap['target'][0]['suit']
notify.debug('toon: %s lays quicksand in front of suit: %d' % (toon.getName(), suit.doId))
quicksand = trapProps[0]
return __createPlacedTrapMultiTrack(trap, quicksand, 'quicksand', explode=explode)
def __trapTrapdoor(trap, trapProps, explode):
toon = trap['toon']
if 'npc' in trap:
toon = trap['npc']
targets = trap['target']
for target in targets:
suit = target['suit']
notify.debug('toon: %s lays trapdoor in front of suit: %d' % (toon.getName(), suit.doId))
trapdoor = trapProps[0]
return __createPlacedTrapMultiTrack(trap, trapdoor, 'trapdoor', explode=explode)
def __trapTNT(trap, trapProps, explode):
toon = trap['toon']
suit = trap['target'][0]['suit']
notify.debug('toon: %s lays TNT in front of suit: %d' % (toon.getName(), suit.doId))
tnts = trapProps
return __createThrownTrapMultiTrack(trap, tnts, 'tnt', anim=0, explode=explode)
def __trapTrain(trap, trapProps, explode):
toon = trap['toon']
if 'npc' in trap:
toon = trap['npc']
targets = trap['target']
battle = trap['battle']
visibleOnlyForThisSuitId = 0
centerSuit = None
closestXDistance = 10000
for target in targets:
suit = target['suit']
suitPoint, suitHpr = battle.getActorPosHpr(suit)
xDistance = abs(suitPoint.getX())
if xDistance < closestXDistance:
visibleOnlyForThisSuitId = suit.doId
closestXDistance = xDistance
centerSuit = suit
notify.debug('toon: %s doing traintrack in front of suit: %d' % (toon.getName(), suit.doId))
traintrack = trapProps[0]
return __createPlacedGroupTrapTrack(trap, traintrack, 'traintrack', centerSuit, explode=explode)
def createThrowingTrack(object, target, duration = 1.0, parent = render, gravity = -32.144):
values = {}
values['origin'] = None
values['velocity'] = None
def calcOriginAndVelocity(object = object, target = target, values = values, duration = duration, parent = parent, gravity = gravity):
object.wrtReparentTo(parent)
values['origin'] = object.getPos(parent)
origin = object.getPos(parent)
values['velocity'] = (target[2] - origin[2] - 0.5 * gravity * duration * duration) / duration
def throwPos(t, object, duration, target, values = values, gravity = -32.144):
if values['origin'] != None:
origin = values['origin']
else:
origin = object.getPos()
if values['velocity'] != None:
velocity = values['velocity']
else:
velocity = 16
x = origin[0] * (1 - t) + target[0] * t
y = origin[1] * (1 - t) + target[1] * t
time = t * duration
z = origin[2] + velocity * time + 0.5 * gravity * time * time
object.setPos(x, y, z)
return
return Sequence(Func(calcOriginAndVelocity), LerpFunctionInterval(throwPos, fromData=0.0, toData=1.0, duration=duration, extraArgs=[object, duration, target]))
def createCartoonExplosionTrack(parent, animName, explosionPoint = None):
explosionTrack = Sequence()
explosion = BattleProps.globalPropPool.getProp(animName)
explosion.setBillboardPointEye()
if not explosionPoint:
explosionPoint = Point3(0, 3.6, 2.1)
if animName == 'dust':
scale = Point3(0.1, 0.9, 1)
explosionTrack.append(Func(explosion.reparentTo, parent))
explosionTrack.append(Func(explosion.setPos, explosionPoint))
explosionTrack.append(Func(explosion.setScale, scale))
explosionTrack.append(ActorInterval(explosion, animName))
explosionTrack.append(Func(MovieUtil.removeProp, explosion))
return explosionTrack
def __createPlacedGroupTrapTrack(trap, prop, propName, centerSuit, propPos = None, propHpr = None, explode = 0):
toon = trap['toon']
if 'npc' in trap:
toon = trap['npc']
level = trap['level']
battle = trap['battle']
origHpr = toon.getHpr(battle)
trapPoint = Point3(0, 5 - MovieUtil.SUIT_TRAP_DISTANCE, 0.025)
trapDelay = 2.5
hands = toon.getLeftHands()
def placeDustExplosion(dustNode, trapProp, battle):
dustNode.reparentTo(battle)
dustNode.setPos(trapProp.getPos(battle))
trapTracks = Parallel()
firstTime = 1
targets = trap['target']
if True:
suit = centerSuit
suitPos = suit.getPos(battle)
targetPos = suitPos
trapProp = MovieUtil.copyProp(prop)
showThisTrap = True
trapTrack = Sequence()
trapTrack.append(Wait(trapDelay))
if showThisTrap:
notify.debug('showing trap %s for %d' % (trapProp.getName(), suit.doId))
trapTrack.append(Func(trapProp.show))
else:
notify.debug('hiding trap %s for %d' % (trapProp.getName(), suit.doId))
trapTrack.append(Func(trapProp.hide))
trapTrack.append(Func(trapProp.setScale, Point3(0.1, 0.1, 0.1)))
trapTrack.append(Func(trapProp.reparentTo, battle))
trapTrack.append(Func(trapProp.setPos, trapPoint))
trapTrack.append(Func(trapProp.setH, 0))
trapTrack.append(LerpScaleInterval(trapProp, 1.2, Point3(1.0, 1.0, 1.0)))
if explode == 1:
dustNode = hidden.attachNewNode('DustNode')
removeTrapsParallel = Parallel()
oneTrapTrack = Sequence()
oneTrapTrack.append(Func(trapProp.wrtReparentTo, hidden))
oneTrapTrack.append(Func(placeDustExplosion, dustNode, trapProp, battle))
oneTrapTrack.append(createCartoonExplosionTrack(dustNode, 'dust', explosionPoint=Point3(0, 0, 0)))
oneTrapTrack.append(Func(MovieUtil.removeProp, trapProp))
removeTrapsParallel.append(oneTrapTrack)
for target in trap['target']:
otherSuit = target['suit']
if otherSuit.battleTrapProp:
otherDustNode = hidden.attachNewNode('DustNodeOtherSuit')
otherTrapTrack = Sequence()
otherTrapTrack.append(Func(otherSuit.battleTrapProp.wrtReparentTo, hidden))
otherTrapTrack.append(Func(placeDustExplosion, dustNode, otherSuit.battleTrapProp, battle))
otherTrapTrack.append(createCartoonExplosionTrack(otherDustNode, 'dust', explosionPoint=Point3(0, 0, 0)))
otherTrapTrack.append(Func(battle.removeTrap, otherSuit))
removeTrapsParallel.append(otherTrapTrack)
trapTrack.append(removeTrapsParallel)
else:
if suit.battleTrap != NO_TRAP:
notify.debug('trapSuit() - trap: %d destroyed existing trap: %d' % (level, suit.battleTrap))
battle.removeTrap(suit)
suit.battleTrapProp = trapProp
suit.battleTrap = level
suit.battleTrapIsFresh = 1
unlureSuits = Parallel()
for target in targets:
kbbonus = target['kbbonus']
if kbbonus == 0:
unluredSuit = target['suit']
suitTrack = Sequence()
suitTrack.append(createSuitResetPosTrack(unluredSuit, battle))
suitTrack.append(Func(battle.unlureSuit, unluredSuit))
unlureSuits.append(suitTrack)
trapTrack.append(unlureSuits)
for otherSuit in battle.suits:
if not otherSuit == suit:
if otherSuit.battleTrap != NO_TRAP:
notify.debug('trapSuit() - trap: %d destroyed existing trap: %d' % (level, suit.battleTrap))
battle.removeTrap(otherSuit)
otherSuit.battleTrapProp = trapProp
otherSuit.battleTrap = level
otherSuit.battleTrapIsFresh = 1
trapTracks.append(trapTrack)
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, suitPos))
toonTrack.append(ActorInterval(toon, 'pushbutton'))
toonTrack.append(Func(MovieUtil.removeProps, buttons))
toonTrack.append(Func(toon.loop, 'neutral'))
toonTrack.append(Func(toon.setHpr, battle, origHpr))
if propName == 'quicksand':
propSound = globalBattleSoundCache.getSound('TL_quicksand.ogg')
elif propName == 'traintrack':
propSound = globalBattleSoundCache.getSound('TL_train_track_appear.ogg')
else:
propSound = globalBattleSoundCache.getSound('TL_trap_door.ogg')
buttonSound = globalBattleSoundCache.getSound('AA_drop_trigger_box.ogg')
soundTrack = Sequence(Wait(2.3), Parallel(SoundInterval(buttonSound, duration=0.67, node=toon), SoundInterval(propSound, node=toon)))
return Parallel(trapTracks, toonTrack, soundTrack)