toontown-just-works/toontown/battle/MovieCamera.py
2024-07-07 18:08:39 -05:00

922 lines
34 KiB
Python

from panda3d.core import *
from direct.interval.IntervalGlobal import *
from BattleBase import *
from BattleProps import *
from toontown.toonbase.ToontownBattleGlobals import *
from SuitBattleGlobals import *
from direct.directnotify import DirectNotifyGlobal
import random
import MovieUtil
notify = DirectNotifyGlobal.directNotify.newCategory('MovieCamera')
def chooseHealShot(heals, attackDuration):
isUber = 0
for heal in heals:
if heal['level'] == 6 and not heal.get('petId'):
isUber = 1
if isUber:
openShot = chooseHealOpenShot(heals, attackDuration, isUber)
openDuration = openShot.getDuration()
openName = openShot.getName()
closeShot = chooseHealCloseShot(heals, openDuration, openName, attackDuration * 3, isUber)
track = Sequence(closeShot)
else:
openShot = chooseHealOpenShot(heals, attackDuration, isUber)
openDuration = openShot.getDuration()
openName = openShot.getName()
closeShot = chooseHealCloseShot(heals, openDuration, openName, attackDuration, isUber)
track = Sequence(openShot, closeShot)
return track
def chooseHealOpenShot(heals, attackDuration, isUber = 0):
numHeals = len(heals)
av = None
duration = 2.8
if isUber:
duration = 5.0
shotChoices = [toonGroupShot]
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseHealMidShot(heals, attackDuration, isUber = 0):
numHeals = len(heals)
av = None
duration = 2.1
if isUber:
duration = 2.1
shotChoices = [toonGroupHighShot]
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseHealCloseShot(heals, openDuration, openName, attackDuration, isUber = 0):
av = None
duration = attackDuration - openDuration
shotChoices = [toonGroupShot]
if isUber:
shotChoices = [allGroupLowShot]
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseTrapShot(traps, attackDuration, enterDuration = 0, exitDuration = 0):
enterShot = chooseNPCEnterShot(traps, enterDuration)
openShot = chooseTrapOpenShot(traps, attackDuration)
openDuration = openShot.getDuration()
openName = openShot.getName()
closeShot = chooseTrapCloseShot(traps, openDuration, openName, attackDuration)
exitShot = chooseNPCExitShot(traps, exitDuration)
track = Sequence(enterShot, openShot, closeShot, exitShot)
return track
def chooseTrapOpenShot(traps, attackDuration):
numTraps = len(traps)
av = None
duration = 3.0
shotChoices = [allGroupLowShot]
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseTrapCloseShot(traps, openDuration, openName, attackDuration):
av = None
duration = attackDuration - openDuration
shotChoices = [allGroupLowShot]
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseLureShot(lures, attackDuration, enterDuration = 0.0, exitDuration = 0.0):
enterShot = chooseNPCEnterShot(lures, enterDuration)
openShot = chooseLureOpenShot(lures, attackDuration)
openDuration = openShot.getDuration()
openName = openShot.getName()
closeShot = chooseLureCloseShot(lures, openDuration, openName, attackDuration)
exitShot = chooseNPCExitShot(lures, exitDuration)
track = Sequence(enterShot, openShot, closeShot, exitShot)
return track
def chooseLureOpenShot(lures, attackDuration):
numLures = len(lures)
av = None
duration = 3.0
shotChoices = [allGroupLowShot]
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseLureCloseShot(lures, openDuration, openName, attackDuration):
av = None
duration = attackDuration - openDuration
hasTrainTrackTrap = False
battle = lures[0]['battle']
for suit in battle.suits:
if hasattr(suit, 'battleTrap') and suit.battleTrap == UBER_GAG_LEVEL_INDEX:
hasTrainTrackTrap = True
if hasTrainTrackTrap:
shotChoices = [avatarBehindHighRightShot]
av = lures[0]['toon']
else:
shotChoices = [allGroupLowShot]
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseSoundShot(sounds, targets, attackDuration, enterDuration = 0.0, exitDuration = 0.0):
enterShot = chooseNPCEnterShot(sounds, enterDuration)
openShot = chooseSoundOpenShot(sounds, targets, attackDuration)
openDuration = openShot.getDuration()
openName = openShot.getName()
closeShot = chooseSoundCloseShot(sounds, targets, openDuration, openName, attackDuration)
exitShot = chooseNPCExitShot(sounds, exitDuration)
track = Sequence(enterShot, openShot, closeShot, exitShot)
return track
def chooseSoundOpenShot(sounds, targets, attackDuration):
duration = 3.1
isUber = 0
for sound in sounds:
if sound['level'] == 6:
isUber = 1
duration = 5.0
numSounds = len(sounds)
av = None
if numSounds == 1:
av = sounds[0]['toon']
if isUber:
shotChoices = [avatarCloseUpThreeQuarterRightShotWide, allGroupLowShot, suitGroupThreeQuarterLeftBehindShot]
else:
shotChoices = [avatarCloseUpThreeQuarterRightShot, allGroupLowShot, suitGroupThreeQuarterLeftBehindShot]
elif numSounds >= 2 and numSounds <= 4:
shotChoices = [allGroupLowShot, suitGroupThreeQuarterLeftBehindShot]
else:
notify.error('Bad number of sounds: %s' % numSounds)
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseSoundCloseShot(sounds, targets, openDuration, openName, attackDuration):
numSuits = len(targets)
av = None
duration = attackDuration - openDuration
if numSuits == 1:
av = targets[0]['suit']
shotChoices = [avatarCloseUpThrowShot,
avatarCloseUpThreeQuarterLeftShot,
allGroupLowShot,
suitGroupThreeQuarterLeftBehindShot]
elif numSuits >= 2 and numSuits <= 4:
shotChoices = [allGroupLowShot, suitGroupThreeQuarterLeftBehindShot]
else:
notify.error('Bad number of suits: %s' % numSuits)
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseThrowShot(throws, suitThrowsDict, attackDuration):
openShot = chooseThrowOpenShot(throws, suitThrowsDict, attackDuration)
openDuration = openShot.getDuration()
openName = openShot.getName()
closeShot = chooseThrowCloseShot(throws, suitThrowsDict, openDuration, openName, attackDuration)
track = Sequence(openShot, closeShot)
return track
def chooseThrowOpenShot(throws, suitThrowsDict, attackDuration):
numThrows = len(throws)
av = None
duration = 3.0
if numThrows == 1:
av = throws[0]['toon']
shotChoices = [avatarCloseUpThrowShot,
avatarCloseUpThreeQuarterRightShot,
avatarBehindShot,
allGroupLowShot,
suitGroupThreeQuarterLeftBehindShot]
elif numThrows >= 2 and numThrows <= 4:
shotChoices = [allGroupLowShot, suitGroupThreeQuarterLeftBehindShot]
else:
notify.error('Bad number of throws: %s' % numThrows)
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseThrowCloseShot(throws, suitThrowsDict, openDuration, openName, attackDuration):
numSuits = len(suitThrowsDict)
av = None
duration = attackDuration - openDuration
if numSuits == 1:
av = base.cr.doId2do[suitThrowsDict.keys()[0]]
shotChoices = [avatarCloseUpThrowShot,
avatarCloseUpThreeQuarterLeftShot,
allGroupLowShot,
suitGroupThreeQuarterLeftBehindShot]
elif numSuits >= 2 and numSuits <= 4 or numSuits == 0:
shotChoices = [allGroupLowShot, suitGroupThreeQuarterLeftBehindShot]
else:
notify.error('Bad number of suits: %s' % numSuits)
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseSquirtShot(squirts, suitSquirtsDict, attackDuration):
openShot = chooseSquirtOpenShot(squirts, suitSquirtsDict, attackDuration)
openDuration = openShot.getDuration()
openName = openShot.getName()
closeShot = chooseSquirtCloseShot(squirts, suitSquirtsDict, openDuration, openName, attackDuration)
track = Sequence(openShot, closeShot)
return track
def chooseSquirtOpenShot(squirts, suitSquirtsDict, attackDuration):
numSquirts = len(squirts)
av = None
duration = 3.0
if numSquirts == 1:
av = squirts[0]['toon']
shotChoices = [avatarCloseUpThrowShot,
avatarCloseUpThreeQuarterRightShot,
avatarBehindShot,
allGroupLowShot,
suitGroupThreeQuarterLeftBehindShot]
elif numSquirts >= 2 and numSquirts <= 4:
shotChoices = [allGroupLowShot, suitGroupThreeQuarterLeftBehindShot]
else:
notify.error('Bad number of squirts: %s' % numSquirts)
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseSquirtCloseShot(squirts, suitSquirtsDict, openDuration, openName, attackDuration):
numSuits = len(suitSquirtsDict)
av = None
duration = attackDuration - openDuration
if numSuits == 1:
av = base.cr.doId2do[suitSquirtsDict.keys()[0]]
shotChoices = [avatarCloseUpThrowShot,
avatarCloseUpThreeQuarterLeftShot,
allGroupLowShot,
suitGroupThreeQuarterLeftBehindShot]
elif numSuits >= 2 and numSuits <= 4:
shotChoices = [allGroupLowShot, suitGroupThreeQuarterLeftBehindShot]
else:
notify.error('Bad number of suits: %s' % numSuits)
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseDropShot(drops, suitDropsDict, attackDuration, enterDuration = 0.0, exitDuration = 0.0):
enterShot = chooseNPCEnterShot(drops, enterDuration)
openShot = chooseDropOpenShot(drops, suitDropsDict, attackDuration)
openDuration = openShot.getDuration()
openName = openShot.getName()
closeShot = chooseDropCloseShot(drops, suitDropsDict, openDuration, openName, attackDuration)
exitShot = chooseNPCExitShot(drops, exitDuration)
track = Sequence(enterShot, openShot, closeShot, exitShot)
return track
def chooseDropOpenShot(drops, suitDropsDict, attackDuration):
numDrops = len(drops)
av = None
duration = 3.0
if numDrops == 1:
av = drops[0]['toon']
shotChoices = [avatarCloseUpThrowShot,
avatarCloseUpThreeQuarterRightShot,
avatarBehindShot,
allGroupLowShot,
suitGroupThreeQuarterLeftBehindShot]
elif numDrops >= 2 and numDrops <= 4 or numDrops == 0:
shotChoices = [allGroupLowShot, suitGroupThreeQuarterLeftBehindShot]
else:
notify.error('Bad number of drops: %s' % numDrops)
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseDropCloseShot(drops, suitDropsDict, openDuration, openName, attackDuration):
numSuits = len(suitDropsDict)
av = None
duration = attackDuration - openDuration
if numSuits == 1:
av = base.cr.doId2do[suitDropsDict.keys()[0]]
shotChoices = [avatarCloseUpThrowShot,
avatarCloseUpThreeQuarterLeftShot,
allGroupLowShot,
suitGroupThreeQuarterLeftBehindShot]
elif numSuits >= 2 and numSuits <= 4 or numSuits == 0:
shotChoices = [allGroupLowShot, suitGroupThreeQuarterLeftBehindShot]
else:
notify.error('Bad number of suits: %s' % numSuits)
choice = random.choice(shotChoices)
track = choice(av, duration)
return track
def chooseNPCEnterShot(enters, entersDuration):
av = None
duration = entersDuration
shotChoices = [toonGroupShot]
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseNPCExitShot(exits, exitsDuration):
av = None
duration = exitsDuration
shotChoices = [toonGroupShot]
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseSuitShot(attack, attackDuration):
groupStatus = attack['group']
target = attack['target']
if groupStatus == ATK_TGT_SINGLE:
toon = target['toon']
suit = attack['suit']
name = attack['id']
battle = attack['battle']
camTrack = Sequence()
def defaultCamera(attack = attack, attackDuration = attackDuration, openShotDuration = 3.5, target = target):
if attack['group'] == ATK_TGT_GROUP:
return randomGroupAttackCam(attack['suit'], target, attack['battle'], attackDuration, openShotDuration)
else:
return randomAttackCam(attack['suit'], target['toon'], attack['battle'], attackDuration, openShotDuration, 'suit')
if name == AUDIT:
camTrack.append(defaultCamera())
elif name == BITE:
camTrack.append(defaultCamera(openShotDuration=2.8))
elif name == BOUNCE_CHECK:
camTrack.append(defaultCamera())
elif name == BRAIN_STORM:
camTrack.append(defaultCamera(openShotDuration=2.4))
elif name == BUZZ_WORD:
camTrack.append(defaultCamera(openShotDuration=4.7))
elif name == CALCULATE:
camTrack.append(defaultCamera())
elif name == CANNED:
camTrack.append(defaultCamera(openShotDuration=2.9))
elif name == CHOMP:
camTrack.append(defaultCamera(openShotDuration=2.8))
elif name == CIGAR_SMOKE:
camTrack.append(defaultCamera(openShotDuration=3.0))
elif name == CLIPON_TIE:
camTrack.append(defaultCamera(openShotDuration=3.3))
elif name == CRUNCH:
camTrack.append(defaultCamera(openShotDuration=3.4))
elif name == DEMOTION:
camTrack.append(defaultCamera(openShotDuration=1.7))
elif name == DOUBLE_TALK:
camTrack.append(defaultCamera(openShotDuration=3.9))
elif name == EVICTION_NOTICE:
camTrack.append(defaultCamera(openShotDuration=3.2))
elif name == EVIL_EYE:
camTrack.append(defaultCamera(openShotDuration=2.7))
elif name == FILIBUSTER:
camTrack.append(defaultCamera(openShotDuration=2.7))
elif name == FILL_WITH_LEAD:
camTrack.append(defaultCamera(openShotDuration=3.2))
elif name == FINGER_WAG:
camTrack.append(defaultCamera(openShotDuration=2.3))
elif name == FIRED:
camTrack.append(defaultCamera(openShotDuration=1.7))
elif name == FOUNTAIN_PEN:
camTrack.append(defaultCamera(openShotDuration=2.6))
elif name == FREEZE_ASSETS:
camTrack.append(defaultCamera(openShotDuration=2.5))
elif name == HALF_WINDSOR:
camTrack.append(defaultCamera(openShotDuration=2.8))
elif name == HEAD_SHRINK:
camTrack.append(defaultCamera(openShotDuration=1.3))
elif name == GLOWER_POWER:
camTrack.append(defaultCamera(openShotDuration=1.4))
elif name == GUILT_TRIP:
camTrack.append(defaultCamera(openShotDuration=0.9))
elif name == HANG_UP:
camTrack.append(defaultCamera(openShotDuration=5.1))
elif name == HOT_AIR:
camTrack.append(defaultCamera(openShotDuration=2.5))
elif name == JARGON:
camTrack.append(defaultCamera())
elif name == LEGALESE:
camTrack.append(defaultCamera(openShotDuration=1.5))
elif name == LIQUIDATE:
camTrack.append(defaultCamera(openShotDuration=2.5))
elif name == MARKET_CRASH:
camTrack.append(defaultCamera(openShotDuration=2.9))
elif name == MUMBO_JUMBO:
camTrack.append(defaultCamera(openShotDuration=2.8))
elif name == PARADIGM_SHIFT:
camTrack.append(defaultCamera(openShotDuration=1.6))
elif name == PECKING_ORDER:
camTrack.append(defaultCamera(openShotDuration=2.8))
elif name == PLAY_HARDBALL:
camTrack.append(defaultCamera(openShotDuration=2.3))
elif name == PICK_POCKET:
camTrack.append(allGroupLowShot(suit, 2.7))
elif name == PINK_SLIP:
camTrack.append(defaultCamera(openShotDuration=2.8))
elif name == POUND_KEY:
camTrack.append(defaultCamera(openShotDuration=2.8))
elif name == POWER_TIE:
camTrack.append(defaultCamera(openShotDuration=2.4))
elif name == POWER_TRIP:
camTrack.append(defaultCamera(openShotDuration=1.1))
elif name == QUAKE:
shakeIntensity = 5.15
quake = 1
camTrack.append(suitCameraShakeShot(suit, attackDuration, shakeIntensity, quake))
elif name == RAZZLE_DAZZLE:
camTrack.append(defaultCamera(openShotDuration=2.2))
elif name == RED_TAPE:
camTrack.append(defaultCamera(openShotDuration=3.5))
elif name == RE_ORG:
camTrack.append(defaultCamera(openShotDuration=1.1))
elif name == RESTRAINING_ORDER:
camTrack.append(defaultCamera(openShotDuration=2.8))
elif name == ROLODEX:
camTrack.append(defaultCamera())
elif name == RUBBER_STAMP:
camTrack.append(defaultCamera(openShotDuration=3.2))
elif name == RUB_OUT:
camTrack.append(defaultCamera(openShotDuration=2.2))
elif name == SACKED:
camTrack.append(defaultCamera(openShotDuration=2.9))
elif name == SCHMOOZE:
camTrack.append(defaultCamera(openShotDuration=2.8))
elif name == SHAKE:
shakeIntensity = 1.75
camTrack.append(suitCameraShakeShot(suit, attackDuration, shakeIntensity))
elif name == SHRED:
camTrack.append(defaultCamera(openShotDuration=4.1))
elif name == SPIN:
camTrack.append(defaultCamera(openShotDuration=1.7))
elif name == SYNERGY:
camTrack.append(defaultCamera(openShotDuration=1.7))
elif name == TABULATE:
camTrack.append(defaultCamera())
elif name == TEE_OFF:
camTrack.append(defaultCamera(openShotDuration=4.5))
elif name == TREMOR:
shakeIntensity = 0.25
camTrack.append(suitCameraShakeShot(suit, attackDuration, shakeIntensity))
elif name == WATERCOOLER:
camTrack.append(defaultCamera())
elif name == WITHDRAWAL:
camTrack.append(defaultCamera(openShotDuration=1.2))
elif name == WRITE_OFF:
camTrack.append(defaultCamera())
elif name == THROW_BOOK:
camTrack.append(defaultCamera(openShotDuration=2.9))
else:
notify.warning('unknown attack id in chooseSuitShot: %d using default cam' % name)
camTrack.append(defaultCamera())
pbpText = attack['playByPlayText']
displayName = TTLocalizer.SuitAttackNames[attack['name']]
pbpTrack = pbpText.getShowInterval(displayName, 3.5)
return Parallel(camTrack, pbpTrack)
def makeShot(x, y, z, h, p, r, duration, other = None, name = 'makeShot'):
if other:
return heldRelativeShot(other, x, y, z, h, p, r, duration, name)
else:
return heldShot(x, y, z, h, p, r, duration, name)
def focusShot(x, y, z, duration, target, other = None, splitFocusPoint = None, name = 'focusShot'):
track = Sequence()
if other:
track.append(Func(camera.setPos, other, Point3(x, y, z)))
else:
track.append(Func(camera.setPos, Point3(x, y, z)))
if splitFocusPoint:
track.append(Func(focusCameraBetweenPoints, target, splitFocusPoint))
else:
track.append(Func(camera.lookAt, target))
track.append(Wait(duration))
return track
def moveShot(x, y, z, h, p, r, duration, other = None, name = 'moveShot'):
return motionShot(x, y, z, h, p, r, duration, other, name)
def focusMoveShot(x, y, z, duration, target, other = None, name = 'focusMoveShot'):
camera.setPos(Point3(x, y, z))
camera.lookAt(target)
hpr = camera.getHpr()
return motionShot(x, y, z, hpr[0], hpr[1], hpr[2], duration, other, name)
def chooseSOSShot(av, duration):
shotChoices = [avatarCloseUpThreeQuarterRightShot,
avatarBehindShot,
avatarBehindHighShot,
suitGroupThreeQuarterLeftBehindShot]
track = apply(random.choice(shotChoices), [av, duration])
return track
def chooseRewardShot(av, duration, allowGroupShot = 1):
def chooseRewardShotNow(av):
if av.playingAnim == 'victory' or not allowGroupShot:
shotChoices = [(0,
8,
av.getHeight() * 0.66,
179,
15,
0), (5.2,
5.45,
av.getHeight() * 0.66,
131.5,
3.6,
0)]
shot = random.choice(shotChoices)
camera.setPosHpr(av, *shot)
else:
camera.setPosHpr(10, 0, 10, 115, -30, 0)
return Sequence(Func(chooseRewardShotNow, av), Wait(duration))
def heldShot(x, y, z, h, p, r, duration, name = 'heldShot'):
track = Sequence(name=name)
track.append(Func(camera.setPosHpr, x, y, z, h, p, r))
track.append(Wait(duration))
return track
def heldRelativeShot(other, x, y, z, h, p, r, duration, name = 'heldRelativeShot'):
track = Sequence(name=name)
track.append(Func(camera.setPosHpr, other, x, y, z, h, p, r))
track.append(Wait(duration))
return track
def motionShot(x, y, z, h, p, r, duration, other = None, name = 'motionShot'):
if other:
posTrack = LerpPosInterval(camera, duration, pos=Point3(x, y, z), other=other)
hprTrack = LerpHprInterval(camera, duration, hpr=Point3(h, p, r), other=other)
else:
posTrack = LerpPosInterval(camera, duration, pos=Point3(x, y, z))
hprTrack = LerpHprInterval(camera, duration, hpr=Point3(h, p, r))
return Parallel(posTrack, hprTrack)
def allGroupShot(avatar, duration):
return heldShot(10, 0, 10, 89, -30, 0, duration, 'allGroupShot')
def allGroupLowShot(avatar, duration):
return heldShot(15, 0, 3, 89, 0, 0, duration, 'allGroupLowShot')
def allGroupLowDiagonalShot(avatar, duration):
return heldShot(7, 5, 6, 119, -30, 0, duration, 'allGroupLowShot')
def toonGroupShot(avatar, duration):
return heldShot(10, 0, 10, 115, -30, 0, duration, 'toonGroupShot')
def toonGroupHighShot(avatar, duration):
return heldShot(5, 0, 1, 115, 45, 0, duration, 'toonGroupHighShot')
def suitGroupShot(avatar, duration):
return heldShot(10, 0, 10, 65, -30, 0, duration, 'suitGroupShot')
def suitGroupLowLeftShot(avatar, duration):
return heldShot(8.4, -3.85, 2.75, 36.3, 3.25, 0, duration, 'suitGroupLowLeftShot')
def suitGroupThreeQuarterLeftBehindShot(avatar, duration):
if random.random() > 0.5:
x = 12.37
h = 134.61
else:
x = -12.37
h = -134.61
return heldShot(x, 11.5, 8.16, h, -22.7, 0, duration, 'suitGroupThreeQuarterLeftBehindShot')
def suitWakeUpShot(avatar, duration):
return heldShot(10, -5, 10, 65, -30, 0, duration, 'suitWakeUpShot')
def suitCameraShakeShot(avatar, duration, shakeIntensity, quake = 0):
track = Sequence(name='suitShakeCameraShot')
if quake == 1:
shakeDelay = 1.1
numShakes = 4
else:
shakeDelay = 0.3
numShakes = 5
postShakeDelay = 0.5
shakeTime = (duration - shakeDelay - postShakeDelay) / numShakes
shakeDuration = shakeTime * (1.0 / numShakes)
shakeWaitInterval = shakeTime * ((numShakes - 1.0) / numShakes)
def shakeCameraTrack(intensity, shakeWaitInterval = shakeWaitInterval, quake = quake, shakeDuration = shakeDuration, numShakes = numShakes):
vertShakeTrack = Sequence(Wait(shakeWaitInterval), Func(camera.setZ, camera.getZ() + intensity / 2), Wait(shakeDuration / 2), Func(camera.setZ, camera.getZ() - intensity), Wait(shakeDuration / 2), Func(camera.setZ, camera.getZ() + intensity / 2))
horizShakeTrack = Sequence(Wait(shakeWaitInterval - shakeDuration / 2), Func(camera.setY, camera.getY() + intensity / 4), Wait(shakeDuration / 2), Func(camera.setY, camera.getY() - intensity / 2), Wait(shakeDuration / 2), Func(camera.setY, camera.getY() + intensity / 4), Wait(shakeDuration / 2), Func(camera.lookAt, Point3(0, 0, 0)))
shakeTrack = Sequence()
for i in xrange(0, numShakes):
if quake == 0:
shakeTrack.append(vertShakeTrack)
else:
shakeTrack.append(Parallel(vertShakeTrack, horizShakeTrack))
return shakeTrack
x = 10 + random.random() * 3
if random.random() > 0.5:
x = -x
z = 7 + random.random() * 3
track.append(Func(camera.setPos, x, -5, z))
track.append(Func(camera.lookAt, Point3(0, 0, 0)))
track.append(Wait(shakeDelay))
track.append(shakeCameraTrack(shakeIntensity))
track.append(Wait(postShakeDelay))
return track
def avatarCloseUpShot(avatar, duration):
return heldRelativeShot(avatar, 0, 8, avatar.getHeight() * 0.66, 179, 15, 0, duration, 'avatarCloseUpShot')
def avatarCloseUpThrowShot(avatar, duration):
return heldRelativeShot(avatar, 3, 8, avatar.getHeight() * 0.66, 159, 3.6, 0, duration, 'avatarCloseUpThrowShot')
def avatarCloseUpThreeQuarterRightShot(avatar, duration):
return heldRelativeShot(avatar, 5.2, 5.45, avatar.getHeight() * 0.66, 131.5, 3.6, 0, duration, 'avatarCloseUpThreeQuarterRightShot')
def avatarCloseUpThreeQuarterRightShotWide(avatar, duration):
return heldRelativeShot(avatar, 7.2, 8.45, avatar.getHeight() * 0.66, 131.5, 3.6, 0, duration, 'avatarCloseUpThreeQuarterRightShot')
def avatarCloseUpThreeQuarterLeftShot(avatar, duration):
return heldRelativeShot(avatar, -5.2, 5.45, avatar.getHeight() * 0.66, -131.5, 3.6, 0, duration, 'avatarCloseUpThreeQuarterLeftShot')
def avatarCloseUpThreeQuarterRightFollowShot(avatar, duration):
track = Sequence(name='avatarCloseUpThreeQuarterRightFollowShot')
track.append(heldRelativeShot(avatar, 5.2, 5.45, avatar.getHeight() * 0.66, 131.5, 3.6, 0, duration * 0.65))
track.append(LerpHprInterval(nodePath=camera, other=avatar, duration=duration * 0.2, hpr=Point3(110, 3.6, 0), blendType='easeInOut'))
track.append(Wait(duration * 0.25))
return track
def avatarCloseUpZoomShot(avatar, duration):
track = Sequence('avatarCloseUpZoomShot')
track.append(LerpPosHprInterval(nodePath=camera, other=avatar, duration=duration / 2, startPos=Point3(0, 10, avatar.getHeight()), startHpr=Point3(179, -10, 0), pos=Point3(0, 6, avatar.getHeight()), hpr=Point3(179, -10, 0), blendType='easeInOut'))
track.append(Wait(duration / 2))
return track
def avatarBehindShot(avatar, duration):
return heldRelativeShot(avatar, 5, -7, avatar.getHeight(), 40, -12, 0, duration, 'avatarBehindShot')
def avatarBehindHighShot(avatar, duration):
return heldRelativeShot(avatar, -4, -7, 5 + avatar.getHeight(), -30, -35, 0, duration, 'avatarBehindHighShot')
def avatarBehindHighRightShot(avatar, duration):
return heldRelativeShot(avatar, 4, -7, 5 + avatar.getHeight(), 30, -35, 0, duration, 'avatarBehindHighShot')
def avatarBehindThreeQuarterRightShot(avatar, duration):
return heldRelativeShot(avatar, 7.67, -8.52, avatar.getHeight() * 0.66, 25, 7.5, 0, duration, 'avatarBehindThreeQuarterRightShot')
def avatarSideFollowAttack(suit, toon, duration, battle):
windupDuration = duration * (0.1 + random.random() * 0.1)
projectDuration = duration * 0.75
impactDuration = duration - windupDuration - projectDuration
suitHeight = suit.getHeight()
toonHeight = toon.getHeight()
suitCentralPoint = suit.getPos(battle)
suitCentralPoint.setZ(suitCentralPoint.getZ() + suitHeight * 0.75)
toonCentralPoint = toon.getPos(battle)
toonCentralPoint.setZ(toonCentralPoint.getZ() + toonHeight * 0.75)
initialX = random.randint(12, 14)
finalX = random.randint(7, 8)
initialY = finalY = random.randint(-3, 0)
initialZ = suitHeight * 0.5 + random.random() * suitHeight
finalZ = toonHeight * 0.5 + random.random() * toonHeight
if random.random() > 0.5:
initialX = -initialX
finalX = -finalX
return Sequence(focusShot(initialX, initialY, initialZ, windupDuration, suitCentralPoint), focusMoveShot(finalX, finalY, finalZ, projectDuration, toonCentralPoint), Wait(impactDuration))
def focusCameraBetweenPoints(point1, point2):
if point1[0] > point2[0]:
x = point2[0] + (point1[0] - point2[0]) * 0.5
else:
x = point1[0] + (point2[0] - point1[0]) * 0.5
if point1[1] > point2[1]:
y = point2[1] + (point1[1] - point2[1]) * 0.5
else:
y = point1[1] + (point2[1] - point1[1]) * 0.5
if point1[2] > point2[2]:
z = point2[2] + (point1[2] - point2[2]) * 0.5
else:
z = point1[2] + (point2[2] - point1[2]) * 0.5
camera.lookAt(Point3(x, y, z))
def randomCamera(suit, toon, battle, attackDuration, openShotDuration):
return randomAttackCam(suit, toon, battle, attackDuration, openShotDuration, 'suit')
def randomAttackCam(suit, toon, battle, attackDuration, openShotDuration, attackerString = 'suit'):
if openShotDuration > attackDuration:
openShotDuration = attackDuration
closeShotDuration = attackDuration - openShotDuration
if attackerString == 'suit':
attacker = suit
defender = toon
defenderString = 'toon'
else:
attacker = toon
defender = suit
defenderString = 'suit'
randomDouble = random.random()
if randomDouble > 0.6:
openShot = randomActorShot(attacker, battle, openShotDuration, attackerString)
elif randomDouble > 0.2:
openShot = randomOverShoulderShot(suit, toon, battle, openShotDuration, focus=attackerString)
else:
openShot = randomSplitShot(attacker, defender, battle, openShotDuration)
randomDouble = random.random()
if randomDouble > 0.6:
closeShot = randomActorShot(defender, battle, closeShotDuration, defenderString)
elif randomDouble > 0.2:
closeShot = randomOverShoulderShot(suit, toon, battle, closeShotDuration, focus=defenderString)
else:
closeShot = randomSplitShot(attacker, defender, battle, closeShotDuration)
return Sequence(openShot, closeShot)
def randomGroupAttackCam(suit, targets, battle, attackDuration, openShotDuration):
if openShotDuration > attackDuration:
openShotDuration = attackDuration
closeShotDuration = attackDuration - openShotDuration
openShot = randomActorShot(suit, battle, openShotDuration, 'suit', groupShot=0)
closeShot = randomToonGroupShot(targets, suit, closeShotDuration, battle)
return Sequence(openShot, closeShot)
def randomActorShot(actor, battle, duration, actorType, groupShot = 0):
height = actor.getHeight()
centralPoint = actor.getPos(battle)
centralPoint.setZ(centralPoint.getZ() + height * 0.75)
if actorType == 'suit':
x = 4 + random.random() * 8
y = -2 - random.random() * 4
z = height * 0.5 + random.random() * height * 1.5
if groupShot == 1:
y = -4
z = height * 0.5
else:
x = 2 + random.random() * 8
y = -2 + random.random() * 3
z = height + random.random() * height * 1.5
if groupShot == 1:
y = y + 3
z = height * 0.5
if MovieUtil.shotDirection == 'left':
x = -x
return focusShot(x, y, z, duration, centralPoint)
def randomSplitShot(suit, toon, battle, duration):
suitHeight = suit.getHeight()
toonHeight = toon.getHeight()
suitCentralPoint = suit.getPos(battle)
suitCentralPoint.setZ(suitCentralPoint.getZ() + suitHeight * 0.75)
toonCentralPoint = toon.getPos(battle)
toonCentralPoint.setZ(toonCentralPoint.getZ() + toonHeight * 0.75)
x = 9 + random.random() * 2
y = -2 - random.random() * 2
z = suitHeight * 0.5 + random.random() * suitHeight
if MovieUtil.shotDirection == 'left':
x = -x
return focusShot(x, y, z, duration, toonCentralPoint, splitFocusPoint=suitCentralPoint)
def randomOverShoulderShot(suit, toon, battle, duration, focus):
suitHeight = suit.getHeight()
toonHeight = toon.getHeight()
suitCentralPoint = suit.getPos(battle)
suitCentralPoint.setZ(suitCentralPoint.getZ() + suitHeight * 0.75)
toonCentralPoint = toon.getPos(battle)
toonCentralPoint.setZ(toonCentralPoint.getZ() + toonHeight * 0.75)
x = 2 + random.random() * 10
if focus == 'toon':
y = 8 + random.random() * 6
z = suitHeight * 1.2 + random.random() * suitHeight
else:
y = -10 - random.random() * 6
z = toonHeight * 1.5
if MovieUtil.shotDirection == 'left':
x = -x
return focusShot(x, y, z, duration, toonCentralPoint, splitFocusPoint=suitCentralPoint)
def randomToonGroupShot(toons, suit, duration, battle):
sum = 0
for t in toons:
toon = t['toon']
height = toon.getHeight()
sum = sum + height
avgHeight = sum / len(toons) * 0.75
suitPos = suit.getPos(battle)
x = 1 + random.random() * 6
if suitPos.getX() > 0:
x = -x
if random.random() > 0.5:
y = 4 + random.random() * 1
z = avgHeight + random.random() * 6
else:
y = 11 + random.random() * 2
z = 13 + random.random() * 2
focalPoint = Point3(0, -4, avgHeight)
return focusShot(x, y, z, duration, focalPoint)
def chooseFireShot(throws, suitThrowsDict, attackDuration):
openShot = chooseFireOpenShot(throws, suitThrowsDict, attackDuration)
openDuration = openShot.getDuration()
openName = openShot.getName()
closeShot = chooseFireCloseShot(throws, suitThrowsDict, openDuration, openName, attackDuration)
track = Sequence(openShot, closeShot)
return track
def chooseFireOpenShot(throws, suitThrowsDict, attackDuration):
numThrows = len(throws)
av = None
duration = 3.0
if numThrows == 1:
av = throws[0]['toon']
shotChoices = [avatarCloseUpThrowShot,
avatarCloseUpThreeQuarterRightShot,
avatarBehindShot,
allGroupLowShot,
suitGroupThreeQuarterLeftBehindShot]
elif numThrows >= 2 and numThrows <= 4:
shotChoices = [allGroupLowShot, suitGroupThreeQuarterLeftBehindShot]
else:
notify.error('Bad number of throws: %s' % numThrows)
shotChoice = random.choice(shotChoices)
track = apply(shotChoice, [av, duration])
print 'chooseFireOpenShot %s' % shotChoice
return track
def chooseFireCloseShot(throws, suitThrowsDict, openDuration, openName, attackDuration):
numSuits = len(suitThrowsDict)
av = None
duration = attackDuration - openDuration
if numSuits == 1:
av = base.cr.doId2do[suitThrowsDict.keys()[0]]
shotChoices = [avatarCloseUpFireShot,
avatarCloseUpThreeQuarterLeftFireShot,
allGroupLowShot,
suitGroupThreeQuarterLeftBehindShot]
elif numSuits >= 2 and numSuits <= 4 or numSuits == 0:
shotChoices = [allGroupLowShot, suitGroupThreeQuarterLeftBehindShot]
else:
notify.error('Bad number of suits: %s' % numSuits)
shotChoice = random.choice(shotChoices)
track = apply(shotChoice, [av, duration])
print 'chooseFireOpenShot %s' % shotChoice
return track
def avatarCloseUpFireShot(avatar, duration):
return heldRelativeShot(avatar, 7, 17, avatar.getHeight() * 0.66, 159, 3.6, 0, duration, 'avatarCloseUpFireShot')
def avatarCloseUpThreeQuarterLeftFireShot(avatar, duration):
return heldRelativeShot(avatar, -8.2, 8.45, avatar.getHeight() * 0.66, -131.5, 3.6, 0, duration, 'avatarCloseUpThreeQuarterLeftShot')