ToonTownRewritten/toontown/battle/MovieSound.py

630 lines
29 KiB
Python

from direct.interval.IntervalGlobal import *
from BattleBase import *
from BattleProps import *
from BattleSounds import *
import BattleParticles
from RewardPanel import *
import MovieCamera
from direct.directnotify import DirectNotifyGlobal
import MovieUtil
import MovieNPCSOS
from toontown.toonbase import ToontownBattleGlobals
notify = DirectNotifyGlobal.directNotify.newCategory('MovieSound')
soundFiles = ('AA_sound_bikehorn.ogg', 'AA_sound_whistle.ogg', 'AA_sound_bugle.ogg', 'AA_sound_aoogah.ogg', 'AA_sound_elephant.ogg', 'SZ_DD_foghorn.ogg', 'AA_sound_Opera_Singer.ogg')
appearSoundFiles = ('MG_tag_1.ogg', 'LB_receive_evidence.ogg', 'm_match_trumpet.ogg', 'TL_step_on_rake.ogg', 'toonbldg_grow.ogg', 'mailbox_full_wobble.ogg', 'mailbox_full_wobble.ogg')
hitSoundFiles = ('AA_sound_Opera_Singer_Cog_Glass.ogg',)
tSound = 2.45
tSuitReact = 2.8
DISTANCE_TO_WALK_BACK = MovieUtil.SUIT_LURE_DISTANCE * 0.75
TIME_TO_WALK_BACK = 0.5
if DISTANCE_TO_WALK_BACK == 0:
TIME_TO_WALK_BACK = 0
INSTRUMENT_SCALE_MODIFIER = 0.5
BEFORE_STARS = 0.5
AFTER_STARS = 1.75
def doSounds(sounds):
if len(sounds) == 0:
return (None, None)
npcArrivals, npcDepartures, npcs = MovieNPCSOS.doNPCTeleports(sounds)
mtrack = Parallel()
hitCount = 0
prevLevel = 0
prevSounds = [[],
[],
[],
[],
[],
[],
[]]
for sound in sounds:
level = sound['level']
prevSounds[level].append(sound)
for target in sound['target']:
if target['hp'] > 0:
hitCount += 1
break
delay = 0.0
for soundList in prevSounds:
if len(soundList) > 0:
mtrack.append(__doSoundsLevel(soundList, delay, hitCount, npcs))
delay += TOON_SOUND_DELAY
soundTrack = Sequence(npcArrivals, mtrack, npcDepartures)
targets = sounds[0]['target']
camDuration = mtrack.getDuration()
enterDuration = npcArrivals.getDuration()
exitDuration = npcDepartures.getDuration()
camTrack = MovieCamera.chooseSoundShot(sounds, targets, camDuration, enterDuration, exitDuration)
return (soundTrack, camTrack)
def __getSuitTrack(sound, lastSoundThatHit, delay, hitCount, targets, totalDamage, hpbonus, toon, npcs):
tracks = Parallel()
attacks = 0
uberDelay = 0.0
isUber = 0
if sound['level'] >= ToontownBattleGlobals.UBER_GAG_LEVEL_INDEX:
uberDelay = 3.0
isUber = 1
for target in targets:
suit = target['suit']
if totalDamage > 0 and sound == lastSoundThatHit:
hp = target['hp']
died = target['died']
battle = sound['battle']
kbbonus = target['kbbonus']
suitTrack = Sequence()
showDamage = Func(suit.showHpText, -totalDamage, openEnded=0)
updateHealthBar = Func(suit.updateHealthBar, totalDamage)
if isUber:
breakEffect = BattleParticles.createParticleEffect(file='soundBreak')
breakEffect.setDepthWrite(0)
breakEffect.setDepthTest(0)
breakEffect.setTwoSided(1)
soundEffect = globalBattleSoundCache.getSound(hitSoundFiles[0])
suitTrack.append(Wait(delay + tSuitReact))
if isUber:
delayTime = random.random()
suitTrack.append(Wait(delayTime + 2.0))
suitTrack.append(Func(setPosFromOther, breakEffect, suit, Point3(0, 0.0, suit.getHeight() - 1.0)))
suitTrack.append(Parallel(showDamage, updateHealthBar, SoundInterval(soundEffect, node=suit), __getPartTrack(breakEffect, 0.0, 1.0, [breakEffect, suit, 0], softStop=-0.5)))
else:
suitTrack.append(showDamage)
suitTrack.append(updateHealthBar)
if hitCount == 1:
suitTrack.append(Parallel(ActorInterval(suit, 'squirt-small-react'), MovieUtil.createSuitStunInterval(suit, 0.5, 1.8)))
else:
suitTrack.append(ActorInterval(suit, 'squirt-small-react'))
if kbbonus == 0:
suitTrack.append(__createSuitResetPosTrack(suit, battle))
suitTrack.append(Func(battle.unlureSuit, suit))
bonusTrack = None
if hpbonus > 0:
bonusTrack = Sequence(Wait(delay + tSuitReact + delay + 0.75 + uberDelay), Func(suit.showHpText, -hpbonus, 1, openEnded=0))
suitTrack.append(Func(suit.loop, 'neutral'))
if bonusTrack == None:
tracks.append(suitTrack)
else:
tracks.append(Parallel(suitTrack, bonusTrack))
elif totalDamage <= 0:
tracks.append(Sequence(Wait(2.9), Func(MovieUtil.indicateMissed, suit, 1.0)))
return tracks
def __doSoundsLevel(sounds, delay, hitCount, npcs):
lastSoundThatHit = None
totalDamage = 0
for sound in sounds:
for target in sound['target']:
if target['hp'] > 0:
lastSoundThatHit = sound
totalDamage += target['hp']
break
mainTrack = Sequence()
tracks = Parallel()
deathTracks = Parallel()
for sound in sounds:
toon = sound['toon']
if sound.has_key('npc'):
toon = sound['npc']
level = sound['level']
targets = sound['target']
hpbonus = sound['hpbonus']
attackMTrack = soundfn_array[sound['level']](sound, delay, toon, targets, level)
tracks.append(Sequence(Wait(delay), attackMTrack))
tracks.append(__getSuitTrack(sound, lastSoundThatHit, delay, hitCount, targets, totalDamage, hpbonus, toon, npcs))
for target in targets:
battle = sound['battle']
suit = target['suit']
died = target['died']
revived = target['revived']
if revived:
deathTracks.append(MovieUtil.createSuitReviveTrack(suit, toon, battle, npcs))
elif died:
deathTracks.append(MovieUtil.createSuitDeathTrack(suit, toon, battle, npcs))
mainTrack.append(tracks)
mainTrack.append(deathTracks)
return mainTrack
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 createSuitResetPosTrack(suit, battle):
return __createSuitResetPosTrack(suit, battle)
def __createToonInterval(sound, delay, toon, operaInstrument = None):
isNPC = 0
if sound.get('npc'):
isNPC = 1
battle = sound['battle']
hasLuredSuits = __hasLuredSuits(sound)
if not isNPC:
oldPos, oldHpr = battle.getActorPosHpr(toon)
newPos = Point3(oldPos)
newPos.setY(newPos.getY() - DISTANCE_TO_WALK_BACK)
retval = Sequence(Wait(delay))
if DISTANCE_TO_WALK_BACK and hasLuredSuits and not isNPC:
retval.append(Parallel(ActorInterval(toon, 'walk', startTime=1, duration=TIME_TO_WALK_BACK, endTime=0.0001), LerpPosInterval(toon, TIME_TO_WALK_BACK, newPos, other=battle)))
if operaInstrument:
sprayEffect = BattleParticles.createParticleEffect(file='soundWave')
sprayEffect.setDepthWrite(0)
sprayEffect.setDepthTest(0)
sprayEffect.setTwoSided(1)
I1 = 2.8
retval.append(ActorInterval(toon, 'sound', playRate=1.0, startTime=0.0, endTime=I1))
retval.append(Func(setPosFromOther, sprayEffect, operaInstrument, Point3(0, 1.6, -0.18)))
retval.append(__getPartTrack(sprayEffect, 0.0, 6.0, [sprayEffect, toon, 0], softStop=-3.5))
retval.append(ActorInterval(toon, 'sound', playRate=1.0, startTime=I1))
else:
retval.append(ActorInterval(toon, 'sound'))
if DISTANCE_TO_WALK_BACK and hasLuredSuits and not isNPC:
retval.append(Parallel(ActorInterval(toon, 'walk', startTime=0.0001, duration=TIME_TO_WALK_BACK, endTime=1), LerpPosInterval(toon, TIME_TO_WALK_BACK, oldPos, other=battle)))
retval.append(Func(toon.loop, 'neutral'))
return retval
def __hasLuredSuits(sound):
retval = False
targets = sound['target']
for target in targets:
kbbonus = target['kbbonus']
if kbbonus == 0:
retval = True
break
return retval
def __doBikehorn(sound, delay, toon, targets, level):
tracks = Parallel()
instrMin = Vec3(0.001, 0.001, 0.001)
instrMax = Vec3(0.65, 0.65, 0.65)
instrMax *= INSTRUMENT_SCALE_MODIFIER
instrStretch = Vec3(0.6, 1.1, 0.6)
instrStretch *= INSTRUMENT_SCALE_MODIFIER
megaphone = globalPropPool.getProp('megaphone')
megaphone2 = MovieUtil.copyProp(megaphone)
megaphones = [megaphone, megaphone2]
instrument = globalPropPool.getProp('bikehorn')
instrument2 = MovieUtil.copyProp(instrument)
instruments = [instrument, instrument2]
def setInstrumentStats(instrument = instrument, instrument2 = instrument2):
instrument.setPos(-1.1, -1.4, 0.1)
instrument.setHpr(145, 0, 0)
instrument.setScale(instrMin)
instrument2.setPos(-1.1, -1.4, 0.1)
instrument2.setHpr(145, 0, 0)
instrument2.setScale(instrMin)
hands = toon.getRightHands()
megaphoneShow = Sequence(Func(MovieUtil.showProps, megaphones, hands), Func(MovieUtil.showProps, instruments, hands), Func(setInstrumentStats))
megaphoneHide = Sequence(Func(MovieUtil.removeProps, megaphones), Func(MovieUtil.removeProps, instruments))
instrumentAppearSfx = globalBattleSoundCache.getSound(appearSoundFiles[level])
grow = getScaleIntervals(instruments, duration=0.2, startScale=instrMin, endScale=instrMax)
instrumentAppear = Parallel(grow, Sequence(Wait(0.15), SoundInterval(instrumentAppearSfx, node=toon)))
stretchInstr = getScaleBlendIntervals(instruments, duration=0.2, startScale=instrMax, endScale=instrStretch, blendType='easeOut')
backInstr = getScaleBlendIntervals(instruments, duration=0.2, startScale=instrStretch, endScale=instrMax, blendType='easeIn')
stretchMega = getScaleBlendIntervals(megaphones, duration=0.2, startScale=megaphone.getScale(), endScale=0.9, blendType='easeOut')
backMega = getScaleBlendIntervals(megaphones, duration=0.2, startScale=0.9, endScale=megaphone.getScale(), blendType='easeIn')
attackTrack = Parallel(Sequence(stretchInstr, backInstr), Sequence(stretchMega, backMega))
hasLuredSuits = __hasLuredSuits(sound)
delayTime = delay
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
megaphoneTrack = Sequence(Wait(delayTime), megaphoneShow, Wait(1.0), instrumentAppear, Wait(3.0), megaphoneHide)
tracks.append(megaphoneTrack)
toonTrack = __createToonInterval(sound, delay, toon)
tracks.append(toonTrack)
soundEffect = globalBattleSoundCache.getSound(soundFiles[level])
instrumentshrink = getScaleIntervals(instruments, duration=0.1, startScale=instrMax, endScale=instrMin)
if soundEffect:
delayTime = delay + tSound
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
soundTrack = Sequence(Wait(delayTime), Parallel(attackTrack, SoundInterval(soundEffect, node=toon)), Wait(0.2), instrumentshrink)
tracks.append(soundTrack)
return tracks
def __doWhistle(sound, delay, toon, targets, level):
tracks = Parallel()
instrMin = Vec3(0.001, 0.001, 0.001)
instrMax = Vec3(0.2, 0.2, 0.2)
instrMax *= INSTRUMENT_SCALE_MODIFIER
instrStretch = Vec3(0.25, 0.25, 0.25)
instrStretch *= INSTRUMENT_SCALE_MODIFIER
megaphone = globalPropPool.getProp('megaphone')
megaphone2 = MovieUtil.copyProp(megaphone)
megaphones = [megaphone, megaphone2]
instrument = globalPropPool.getProp('whistle')
instrument2 = MovieUtil.copyProp(instrument)
instruments = [instrument, instrument2]
def setInstrumentStats(instrument = instrument, instrument2 = instrument2):
instrument.setPos(-1.2, -1.3, 0.1)
instrument.setHpr(145, 0, 85)
instrument.setScale(instrMin)
instrument2.setPos(-1.2, -1.3, 0.1)
instrument2.setHpr(145, 0, 85)
instrument2.setScale(instrMin)
hands = toon.getRightHands()
megaphoneShow = Sequence(Func(MovieUtil.showProps, megaphones, hands), Func(MovieUtil.showProps, instruments, hands), Func(setInstrumentStats))
megaphoneHide = Sequence(Func(MovieUtil.removeProps, megaphones), Func(MovieUtil.removeProps, instruments))
instrumentAppearSfx = globalBattleSoundCache.getSound(appearSoundFiles[level])
grow = getScaleIntervals(instruments, duration=0.2, startScale=instrMin, endScale=instrMax)
instrumentAppear = Parallel(grow, Sequence(Wait(0.05), SoundInterval(instrumentAppearSfx, node=toon)))
stretchInstr = getScaleBlendIntervals(instruments, duration=0.2, startScale=instrMax, endScale=instrStretch, blendType='easeOut')
backInstr = getScaleBlendIntervals(instruments, duration=0.2, startScale=instrStretch, endScale=instrMax, blendType='easeIn')
attackTrack = Sequence(stretchInstr, backInstr)
hasLuredSuits = __hasLuredSuits(sound)
delayTime = delay
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
megaphoneTrack = Sequence(Wait(delayTime), megaphoneShow, Wait(1.0), instrumentAppear, Wait(3.0), megaphoneHide)
tracks.append(megaphoneTrack)
toonTrack = __createToonInterval(sound, delay, toon)
tracks.append(toonTrack)
soundEffect = globalBattleSoundCache.getSound(soundFiles[level])
instrumentshrink = getScaleIntervals(instruments, duration=0.1, startScale=instrMax, endScale=instrMin)
if soundEffect:
delayTime = delay + tSound
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
soundTrack = Sequence(Wait(delayTime), Parallel(attackTrack, SoundInterval(soundEffect, node=toon)), Wait(0.2), instrumentshrink)
tracks.append(soundTrack)
return tracks
def __doBugle(sound, delay, toon, targets, level):
tracks = Parallel()
instrMin = Vec3(0.001, 0.001, 0.001)
instrMax = Vec3(0.4, 0.4, 0.4)
instrMax *= INSTRUMENT_SCALE_MODIFIER
instrStretch = Vec3(0.5, 0.5, 0.5)
instrStretch *= INSTRUMENT_SCALE_MODIFIER
megaphone = globalPropPool.getProp('megaphone')
megaphone2 = MovieUtil.copyProp(megaphone)
megaphones = [megaphone, megaphone2]
instrument = globalPropPool.getProp('bugle')
instrument2 = MovieUtil.copyProp(instrument)
instruments = [instrument, instrument2]
def setInstrumentStats(instrument = instrument, instrument2 = instrument2):
instrument.setPos(-1.3, -1.4, 0.1)
instrument.setHpr(145, 0, 85)
instrument.setScale(instrMin)
instrument2.setPos(-1.3, -1.4, 0.1)
instrument2.setHpr(145, 0, 85)
instrument2.setScale(instrMin)
def longshake(models, num):
inShake = getScaleBlendIntervals(models, duration=0.2, startScale=instrMax, endScale=instrStretch, blendType='easeInOut')
outShake = getScaleBlendIntervals(models, duration=0.2, startScale=instrStretch, endScale=instrMax, blendType='easeInOut')
i = 1
seq = Sequence()
while i < num:
if i % 2 == 0:
seq.append(inShake)
else:
seq.append(outShake)
i += 1
seq.start()
hands = toon.getRightHands()
megaphoneShow = Sequence(Func(MovieUtil.showProps, megaphones, hands), Func(MovieUtil.showProps, instruments, hands), Func(setInstrumentStats))
megaphoneHide = Sequence(Func(MovieUtil.removeProps, megaphones), Func(MovieUtil.removeProps, instruments))
instrumentAppearSfx = globalBattleSoundCache.getSound(appearSoundFiles[level])
grow = getScaleBlendIntervals(instruments, duration=1, startScale=instrMin, endScale=instrMax, blendType='easeInOut')
instrumentshrink = getScaleIntervals(instruments, duration=0.1, startScale=instrMax, endScale=instrMin)
instrumentAppear = Sequence(grow, Wait(0), Func(longshake, instruments, 5))
hasLuredSuits = __hasLuredSuits(sound)
delayTime = delay
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
soundEffect = globalBattleSoundCache.getSound(soundFiles[level])
megaphoneTrack = Parallel(Sequence(Wait(delay + 1.7), SoundInterval(soundEffect, node=toon)), Sequence(Wait(delayTime), megaphoneShow, Wait(1.7), instrumentAppear, Wait(1), instrumentshrink, Wait(1.5), megaphoneHide))
tracks.append(megaphoneTrack)
toonTrack = __createToonInterval(sound, delay, toon)
tracks.append(toonTrack)
if soundEffect:
delayTime = delay + tSound
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
soundTrack = Wait(delayTime)
tracks.append(soundTrack)
return tracks
def __doAoogah(sound, delay, toon, targets, level):
tracks = Parallel()
instrMin = Vec3(0.001, 0.001, 0.001)
instrMax = Vec3(0.5, 0.5, 0.5)
instrMax *= INSTRUMENT_SCALE_MODIFIER
instrStretch = Vec3(1.1, 0.9, 0.4)
instrStretch *= INSTRUMENT_SCALE_MODIFIER
megaphone = globalPropPool.getProp('megaphone')
megaphone2 = MovieUtil.copyProp(megaphone)
megaphones = [megaphone, megaphone2]
instrument = globalPropPool.getProp('aoogah')
instrument2 = MovieUtil.copyProp(instrument)
instruments = [instrument, instrument2]
def setInstrumentStats(instrument = instrument, instrument2 = instrument2):
instrument.setPos(-1.0, -1.5, 0.2)
instrument.setHpr(145, 0, 85)
instrument.setScale(instrMin)
instrument2.setPos(-1.0, -1.5, 0.2)
instrument2.setHpr(145, 0, 85)
instrument2.setScale(instrMin)
hands = toon.getRightHands()
megaphoneShow = Sequence(Func(MovieUtil.showProps, megaphones, hands), Func(MovieUtil.showProps, instruments, hands), Func(setInstrumentStats))
megaphoneHide = Sequence(Func(MovieUtil.removeProps, megaphones), Func(MovieUtil.removeProps, instruments))
instrumentAppearSfx = globalBattleSoundCache.getSound(appearSoundFiles[level])
grow = getScaleIntervals(instruments, duration=0.2, startScale=instrMin, endScale=instrMax)
instrumentAppear = Parallel(grow, Sequence(Wait(0.05), SoundInterval(instrumentAppearSfx, node=toon)))
stretchInstr = getScaleBlendIntervals(instruments, duration=0.2, startScale=instrMax, endScale=instrStretch, blendType='easeOut')
backInstr = getScaleBlendIntervals(instruments, duration=0.2, startScale=instrStretch, endScale=instrMax, blendType='easeInOut')
attackTrack = Sequence(stretchInstr, Wait(1), backInstr)
hasLuredSuits = __hasLuredSuits(sound)
delayTime = delay
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
megaphoneTrack = Sequence(Wait(delayTime), megaphoneShow, Wait(1.0), instrumentAppear, Wait(3.0), megaphoneHide)
tracks.append(megaphoneTrack)
toonTrack = __createToonInterval(sound, delay, toon)
tracks.append(toonTrack)
soundEffect = globalBattleSoundCache.getSound(soundFiles[level])
instrumentshrink = getScaleIntervals(instruments, duration=0.1, startScale=instrMax, endScale=instrMin)
if soundEffect:
delayTime = delay + tSound
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
soundTrack = Sequence(Wait(delayTime), Parallel(attackTrack, SoundInterval(soundEffect, node=toon), Sequence(Wait(1.5), instrumentshrink)))
tracks.append(soundTrack)
return tracks
def __doElephant(sound, delay, toon, targets, level):
tracks = Parallel()
instrMin = Vec3(0.001, 0.001, 0.001)
instrMax1 = Vec3(0.3, 0.4, 0.2)
instrMax1 *= INSTRUMENT_SCALE_MODIFIER
instrMax2 = Vec3(0.3, 0.3, 0.3)
instrMax2 *= INSTRUMENT_SCALE_MODIFIER
instrStretch1 = Vec3(0.3, 0.5, 0.25)
instrStretch1 *= INSTRUMENT_SCALE_MODIFIER
instrStretch2 = Vec3(0.3, 0.7, 0.3)
instrStretch2 *= INSTRUMENT_SCALE_MODIFIER
megaphone = globalPropPool.getProp('megaphone')
megaphone2 = MovieUtil.copyProp(megaphone)
megaphones = [megaphone, megaphone2]
instrument = globalPropPool.getProp('elephant')
instrument2 = MovieUtil.copyProp(instrument)
instruments = [instrument, instrument2]
def setInstrumentStats(instrument = instrument, instrument2 = instrument2):
instrument.setPos(-.6, -.9, 0.15)
instrument.setHpr(145, 0, 85)
instrument.setScale(instrMin)
instrument2.setPos(-.6, -.9, 0.15)
instrument2.setHpr(145, 0, 85)
instrument2.setScale(instrMin)
hands = toon.getRightHands()
megaphoneShow = Sequence(Func(MovieUtil.showProps, megaphones, hands), Func(MovieUtil.showProps, instruments, hands), Func(setInstrumentStats))
megaphoneHide = Sequence(Func(MovieUtil.removeProps, megaphones), Func(MovieUtil.removeProps, instruments))
instrumentAppearSfx = globalBattleSoundCache.getSound(appearSoundFiles[level])
grow1 = getScaleIntervals(instruments, duration=0.3, startScale=instrMin, endScale=instrMax1)
grow2 = getScaleIntervals(instruments, duration=0.3, startScale=instrMax1, endScale=instrMax2)
instrumentAppear = Parallel(Sequence(grow1, grow2), Sequence(Wait(0.05), SoundInterval(instrumentAppearSfx, node=toon)))
stretchInstr1 = getScaleBlendIntervals(instruments, duration=0.1, startScale=instrMax2, endScale=instrStretch1, blendType='easeOut')
stretchInstr2 = getScaleBlendIntervals(instruments, duration=0.1, startScale=instrStretch1, endScale=instrStretch2, blendType='easeOut')
stretchInstr = Sequence(stretchInstr1, stretchInstr2)
backInstr = getScaleBlendIntervals(instruments, duration=0.1, startScale=instrStretch2, endScale=instrMax2, blendType='easeOut')
attackTrack = Sequence(stretchInstr, Wait(1), backInstr)
hasLuredSuits = __hasLuredSuits(sound)
delayTime = delay
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
megaphoneTrack = Sequence(Wait(delayTime), megaphoneShow, Wait(1.0), instrumentAppear, Wait(3.0), megaphoneHide)
tracks.append(megaphoneTrack)
toonTrack = __createToonInterval(sound, delay, toon)
tracks.append(toonTrack)
soundEffect = globalBattleSoundCache.getSound(soundFiles[level])
instrumentshrink = getScaleIntervals(instruments, duration=0.1, startScale=instrMax2, endScale=instrMin)
if soundEffect:
delayTime = delay + tSound
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
soundTrack = Sequence(Wait(delayTime), Parallel(attackTrack, SoundInterval(soundEffect, node=toon), Sequence(Wait(1.5), instrumentshrink)))
tracks.append(soundTrack)
return tracks
def __doFoghorn(sound, delay, toon, targets, level):
tracks = Parallel()
instrMin = Vec3(0.001, 0.001, 0.001)
instrMax1 = Vec3(0.1, 0.1, 0.1)
instrMax1 *= INSTRUMENT_SCALE_MODIFIER
instrMax2 = Vec3(0.3, 0.3, 0.3)
instrMax2 *= INSTRUMENT_SCALE_MODIFIER
instrStretch = Vec3(0.4, 0.4, 0.4)
instrStretch *= INSTRUMENT_SCALE_MODIFIER
megaphone = globalPropPool.getProp('megaphone')
megaphone2 = MovieUtil.copyProp(megaphone)
megaphones = [megaphone, megaphone2]
instrument = globalPropPool.getProp('fog_horn')
instrument2 = MovieUtil.copyProp(instrument)
instruments = [instrument, instrument2]
def setInstrumentStats(instrument = instrument, instrument2 = instrument2):
instrument.setPos(-.8, -.9, 0.2)
instrument.setHpr(145, 0, 0)
instrument.setScale(instrMin)
instrument2.setPos(-.8, -.9, 0.2)
instrument2.setHpr(145, 0, 0)
instrument2.setScale(instrMin)
hands = toon.getRightHands()
megaphoneShow = Sequence(Func(MovieUtil.showProps, megaphones, hands), Func(MovieUtil.showProps, instruments, hands), Func(setInstrumentStats))
megaphoneHide = Sequence(Func(MovieUtil.removeProps, megaphones), Func(MovieUtil.removeProps, instruments))
instrumentAppearSfx = globalBattleSoundCache.getSound(appearSoundFiles[level])
grow1 = getScaleIntervals(instruments, duration=1, startScale=instrMin, endScale=instrMax1)
grow2 = getScaleIntervals(instruments, duration=0.1, startScale=instrMax1, endScale=instrMax2)
instrumentAppear = Parallel(Sequence(grow1, grow2), Sequence(Wait(0.05), SoundInterval(instrumentAppearSfx, node=toon)))
stretchInstr = getScaleBlendIntervals(instruments, duration=0.3, startScale=instrMax2, endScale=instrStretch, blendType='easeOut')
backInstr = getScaleBlendIntervals(instruments, duration=1.0, startScale=instrStretch, endScale=instrMin, blendType='easeIn')
spinInstr1 = LerpHprInterval(instrument, duration=1.5, startHpr=Vec3(145, 0, 0), hpr=Vec3(145, 0, 90), blendType='easeInOut')
spinInstr2 = LerpHprInterval(instrument2, duration=1.5, startHpr=Vec3(145, 0, 0), hpr=Vec3(145, 0, 90), blendType='easeInOut')
spinInstr = Parallel(spinInstr1, spinInstr2)
attackTrack = Parallel(Sequence(Wait(0.2), spinInstr), Sequence(stretchInstr, Wait(0.5), backInstr))
hasLuredSuits = __hasLuredSuits(sound)
delayTime = delay
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
megaphoneTrack = Sequence(Wait(delayTime), megaphoneShow, Wait(1.0), instrumentAppear, Wait(3.0), megaphoneHide)
tracks.append(megaphoneTrack)
toonTrack = __createToonInterval(sound, delay, toon)
tracks.append(toonTrack)
soundEffect = globalBattleSoundCache.getSound(soundFiles[level])
if soundEffect:
delayTime = delay + tSound
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
soundTrack = Sequence(Wait(delayTime), Parallel(attackTrack, SoundInterval(soundEffect, node=toon)))
tracks.append(soundTrack)
return tracks
def __doOpera(sound, delay, toon, targets, level):
tracks = Parallel()
delay = delay
instrMin = Vec3(0.001, 0.001, 0.001)
instrMax1 = Vec3(1.7, 1.7, 1.7)
instrMax1 *= INSTRUMENT_SCALE_MODIFIER
instrMax2 = Vec3(2.2, 2.2, 2.2)
instrMax2 *= INSTRUMENT_SCALE_MODIFIER
instrStretch = Vec3(0.4, 0.4, 0.4)
instrStretch *= INSTRUMENT_SCALE_MODIFIER
megaphone = globalPropPool.getProp('megaphone')
megaphone2 = MovieUtil.copyProp(megaphone)
megaphones = [megaphone, megaphone2]
instrument = globalPropPool.getProp('singing')
instrument2 = MovieUtil.copyProp(instrument)
instruments = [instrument, instrument2]
head = instrument2.find('**/opera_singer')
head.setPos(0, 0, 0)
def setInstrumentStats(instrument = instrument, instrument2 = instrument2):
notify.debug('setInstrumentStats')
newPos = Vec3(-0.8, -0.9, 0.2)
newPos *= 1.3
instrument.setPos(newPos[0], newPos[1], newPos[2])
instrument.setHpr(145, 0, 90)
instrument.setScale(instrMin)
instrument2.setPos(newPos[0], newPos[1], newPos[2])
instrument2.setHpr(145, 0, 90)
instrument2.setScale(instrMin)
hands = toon.getRightHands()
megaphoneShow = Sequence(Func(MovieUtil.showProps, megaphones, hands), Func(MovieUtil.showProps, instruments, hands), Func(setInstrumentStats))
megaphoneHide = Sequence(Func(MovieUtil.removeProps, megaphones), Func(MovieUtil.removeProps, instruments))
instrumentAppearSfx = globalBattleSoundCache.getSound(appearSoundFiles[level])
grow1 = getScaleBlendIntervals(instruments, duration=1, startScale=instrMin, endScale=instrMax1, blendType='easeOut')
grow2 = getScaleBlendIntervals(instruments, duration=1.1, startScale=instrMax1, endScale=instrMax2, blendType='easeIn')
shrink2 = getScaleIntervals(instruments, duration=0.1, startScale=instrMax2, endScale=instrMin)
instrumentAppear = Parallel(Sequence(grow1, grow2, Wait(6.0), shrink2), Sequence(Wait(0.0), SoundInterval(instrumentAppearSfx, node=toon)))
hasLuredSuits = __hasLuredSuits(sound)
delayTime = delay
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
megaphoneTrack = Sequence(Wait(delayTime), megaphoneShow, Wait(1.0), instrumentAppear, Wait(2.0), megaphoneHide)
tracks.append(megaphoneTrack)
toonTrack = __createToonInterval(sound, delay, toon, operaInstrument=instrument)
tracks.append(toonTrack)
soundEffect = globalBattleSoundCache.getSound(soundFiles[level])
if soundEffect:
delayTime = delay + tSound - 0.3
if hasLuredSuits:
delayTime += TIME_TO_WALK_BACK
soundTrack = Sequence(Wait(delayTime), SoundInterval(soundEffect, node=toon))
tracks.append(Sequence(Wait(0)))
tracks.append(soundTrack)
return tracks
def setPosFromOther(dest, source, offset = Point3(0, 0, 0)):
pos = render.getRelativePoint(source, offset)
dest.setPos(pos)
dest.reparentTo(render)
def getScaleIntervals(props, duration, startScale, endScale):
tracks = Parallel()
for prop in props:
tracks.append(LerpScaleInterval(prop, duration, endScale, startScale=startScale))
return tracks
def getScaleBlendIntervals(props, duration, startScale, endScale, blendType):
tracks = Parallel()
for prop in props:
tracks.append(LerpScaleInterval(prop, duration, endScale, startScale=startScale, blendType=blendType))
return tracks
soundfn_array = (__doBikehorn,
__doWhistle,
__doBugle,
__doAoogah,
__doElephant,
__doFoghorn,
__doOpera)
def __getPartTrack(particleEffect, startDelay, durationDelay, partExtraArgs, softStop = 0):
pEffect = partExtraArgs[0]
parent = partExtraArgs[1]
if len(partExtraArgs) == 3:
worldRelative = partExtraArgs[2]
else:
worldRelative = 1
return Sequence(Wait(startDelay), ParticleInterval(pEffect, parent, worldRelative, duration=durationDelay, cleanup=True, softStopT=softStop))