2019-11-02 17:27:54 -05:00
|
|
|
from toontown.toonbase.ToontownBattleGlobals import *
|
2019-12-30 00:07:56 -06:00
|
|
|
from .BattleBase import *
|
2019-11-02 17:27:54 -05:00
|
|
|
from direct.interval.IntervalGlobal import *
|
|
|
|
from direct.showbase import DirectObject
|
2019-12-30 00:07:56 -06:00
|
|
|
from . import MovieFire
|
|
|
|
from . import MovieSOS
|
|
|
|
from . import MovieNPCSOS
|
|
|
|
from . import MoviePetSOS
|
|
|
|
from . import MovieHeal
|
|
|
|
from . import MovieTrap
|
|
|
|
from . import MovieLure
|
|
|
|
from . import MovieSound
|
|
|
|
from . import MovieThrow
|
|
|
|
from . import MovieSquirt
|
|
|
|
from . import MovieDrop
|
|
|
|
from . import MovieSuitAttacks
|
|
|
|
from . import MovieToonVictory
|
|
|
|
from . import PlayByPlayText
|
|
|
|
from . import BattleParticles
|
2019-11-02 17:27:54 -05:00
|
|
|
from toontown.distributed import DelayDelete
|
2019-12-30 00:07:56 -06:00
|
|
|
from . import BattleExperience
|
|
|
|
from .SuitBattleGlobals import *
|
2019-11-02 17:27:54 -05:00
|
|
|
from direct.directnotify import DirectNotifyGlobal
|
2019-12-30 00:07:56 -06:00
|
|
|
from . import RewardPanel
|
2019-11-02 17:27:54 -05:00
|
|
|
import random
|
2019-12-30 00:07:56 -06:00
|
|
|
from . import MovieUtil
|
2019-11-02 17:27:54 -05:00
|
|
|
from toontown.toon import Toon
|
|
|
|
from toontown.toonbase import ToontownGlobals
|
|
|
|
from toontown.toontowngui import TTDialog
|
|
|
|
import copy
|
2019-12-30 19:37:37 -06:00
|
|
|
import functools
|
2019-11-02 17:27:54 -05:00
|
|
|
from toontown.toonbase import TTLocalizer
|
|
|
|
from toontown.toon import NPCToons
|
|
|
|
camPos = Point3(14, 0, 10)
|
|
|
|
camHpr = Vec3(89, -30, 0)
|
|
|
|
randomBattleTimestamp = base.config.GetBool('random-battle-timestamp', 0)
|
|
|
|
|
|
|
|
class Movie(DirectObject.DirectObject):
|
|
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('Movie')
|
|
|
|
|
|
|
|
def __init__(self, battle):
|
|
|
|
self.battle = battle
|
|
|
|
self.track = None
|
|
|
|
self.rewardPanel = None
|
|
|
|
self.rewardCallback = None
|
|
|
|
self.playByPlayText = PlayByPlayText.PlayByPlayText()
|
|
|
|
self.playByPlayText.hide()
|
|
|
|
self.renderProps = []
|
|
|
|
self.hasBeenReset = 0
|
|
|
|
self.reset()
|
|
|
|
self.rewardHasBeenReset = 0
|
|
|
|
self.resetReward()
|
|
|
|
return
|
|
|
|
|
|
|
|
def cleanup(self):
|
|
|
|
self.reset()
|
|
|
|
self.resetReward()
|
|
|
|
self.battle = None
|
|
|
|
if self.playByPlayText != None:
|
|
|
|
self.playByPlayText.cleanup()
|
|
|
|
self.playByPlayText = None
|
|
|
|
if self.rewardPanel != None:
|
|
|
|
self.rewardPanel.cleanup()
|
|
|
|
self.rewardPanel = None
|
|
|
|
self.rewardCallback = None
|
|
|
|
return
|
|
|
|
|
|
|
|
def needRestoreColor(self):
|
|
|
|
self.restoreColor = 1
|
|
|
|
|
|
|
|
def clearRestoreColor(self):
|
|
|
|
self.restoreColor = 0
|
|
|
|
|
|
|
|
def needRestoreHips(self):
|
|
|
|
self.restoreHips = 1
|
|
|
|
|
|
|
|
def clearRestoreHips(self):
|
|
|
|
self.restoreHips = 0
|
|
|
|
|
|
|
|
def needRestoreHeadScale(self):
|
|
|
|
self.restoreHeadScale = 1
|
|
|
|
|
|
|
|
def clearRestoreHeadScale(self):
|
|
|
|
self.restoreHeadScale = 0
|
|
|
|
|
|
|
|
def needRestoreToonScale(self):
|
|
|
|
self.restoreToonScale = 1
|
|
|
|
|
|
|
|
def clearRestoreToonScale(self):
|
|
|
|
self.restoreToonScale = 0
|
|
|
|
|
|
|
|
def needRestoreParticleEffect(self, effect):
|
|
|
|
self.specialParticleEffects.append(effect)
|
|
|
|
|
|
|
|
def clearRestoreParticleEffect(self, effect):
|
|
|
|
if self.specialParticleEffects.count(effect) > 0:
|
|
|
|
self.specialParticleEffects.remove(effect)
|
|
|
|
|
|
|
|
def needRestoreRenderProp(self, prop):
|
|
|
|
self.renderProps.append(prop)
|
|
|
|
|
|
|
|
def clearRenderProp(self, prop):
|
|
|
|
if self.renderProps.count(prop) > 0:
|
|
|
|
self.renderProps.remove(prop)
|
|
|
|
|
|
|
|
def restore(self):
|
|
|
|
return
|
|
|
|
for toon in self.battle.activeToons:
|
|
|
|
toon.loop('neutral')
|
|
|
|
origPos, origHpr = self.battle.getActorPosHpr(toon)
|
|
|
|
toon.setPosHpr(self.battle, origPos, origHpr)
|
|
|
|
hands = toon.getRightHands()[:]
|
|
|
|
hands += toon.getLeftHands()
|
|
|
|
for hand in hands:
|
|
|
|
props = hand.getChildren()
|
|
|
|
for prop in props:
|
|
|
|
if prop.getName() != 'book':
|
|
|
|
MovieUtil.removeProp(prop)
|
|
|
|
|
|
|
|
if self.restoreColor == 1:
|
|
|
|
headParts = toon.getHeadParts()
|
|
|
|
torsoParts = toon.getTorsoParts()
|
|
|
|
legsParts = toon.getLegsParts()
|
|
|
|
partsList = [headParts, torsoParts, legsParts]
|
|
|
|
for parts in partsList:
|
|
|
|
for partNum in range(0, parts.getNumPaths()):
|
|
|
|
nextPart = parts.getPath(partNum)
|
|
|
|
nextPart.clearColorScale()
|
|
|
|
nextPart.clearTransparency()
|
|
|
|
|
|
|
|
if self.restoreHips == 1:
|
|
|
|
parts = toon.getHipsParts()
|
|
|
|
for partNum in range(0, parts.getNumPaths()):
|
|
|
|
nextPart = parts.getPath(partNum)
|
|
|
|
props = nextPart.getChildren()
|
|
|
|
for prop in props:
|
|
|
|
if prop.getName() == 'redtape-tube.egg':
|
|
|
|
MovieUtil.removeProp(prop)
|
|
|
|
|
|
|
|
if self.restoreHeadScale == 1:
|
|
|
|
headScale = ToontownGlobals.toonHeadScales[toon.style.getAnimal()]
|
|
|
|
for lod in toon.getLODNames():
|
|
|
|
toon.getPart('head', lod).setScale(headScale)
|
|
|
|
|
|
|
|
if self.restoreToonScale == 1:
|
|
|
|
toon.setScale(1)
|
|
|
|
headParts = toon.getHeadParts()
|
|
|
|
for partNum in range(0, headParts.getNumPaths()):
|
|
|
|
part = headParts.getPath(partNum)
|
|
|
|
part.setHpr(0, 0, 0)
|
|
|
|
part.setPos(0, 0, 0)
|
|
|
|
|
|
|
|
arms = toon.findAllMatches('**/arms')
|
|
|
|
sleeves = toon.findAllMatches('**/sleeves')
|
|
|
|
hands = toon.findAllMatches('**/hands')
|
|
|
|
for partNum in range(0, arms.getNumPaths()):
|
|
|
|
armPart = arms.getPath(partNum)
|
|
|
|
sleevePart = sleeves.getPath(partNum)
|
|
|
|
handsPart = hands.getPath(partNum)
|
|
|
|
armPart.setHpr(0, 0, 0)
|
|
|
|
sleevePart.setHpr(0, 0, 0)
|
|
|
|
handsPart.setHpr(0, 0, 0)
|
|
|
|
|
|
|
|
for suit in self.battle.activeSuits:
|
|
|
|
if suit._Actor__animControlDict != None:
|
|
|
|
suit.loop('neutral')
|
|
|
|
suit.battleTrapIsFresh = 0
|
|
|
|
origPos, origHpr = self.battle.getActorPosHpr(suit)
|
|
|
|
suit.setPosHpr(self.battle, origPos, origHpr)
|
|
|
|
hands = [suit.getRightHand(), suit.getLeftHand()]
|
|
|
|
for hand in hands:
|
|
|
|
props = hand.getChildren()
|
|
|
|
for prop in props:
|
|
|
|
MovieUtil.removeProp(prop)
|
|
|
|
|
|
|
|
for effect in self.specialParticleEffects:
|
|
|
|
if effect != None:
|
|
|
|
effect.cleanup()
|
|
|
|
|
|
|
|
self.specialParticleEffects = []
|
|
|
|
for prop in self.renderProps:
|
|
|
|
MovieUtil.removeProp(prop)
|
|
|
|
|
|
|
|
self.renderProps = []
|
|
|
|
return
|
|
|
|
|
|
|
|
def _deleteTrack(self):
|
|
|
|
if self.track:
|
|
|
|
DelayDelete.cleanupDelayDeletes(self.track)
|
|
|
|
self.track = None
|
|
|
|
return
|
|
|
|
|
|
|
|
def reset(self, finish = 0):
|
|
|
|
if self.hasBeenReset == 1:
|
|
|
|
return
|
|
|
|
self.hasBeenReset = 1
|
|
|
|
self.stop()
|
|
|
|
self._deleteTrack()
|
|
|
|
if finish == 1:
|
|
|
|
self.restore()
|
|
|
|
self.toonAttackDicts = []
|
|
|
|
self.suitAttackDicts = []
|
|
|
|
self.restoreColor = 0
|
|
|
|
self.restoreHips = 0
|
|
|
|
self.restoreHeadScale = 0
|
|
|
|
self.restoreToonScale = 0
|
|
|
|
self.specialParticleEffects = []
|
|
|
|
for prop in self.renderProps:
|
|
|
|
MovieUtil.removeProp(prop)
|
|
|
|
|
|
|
|
self.renderProps = []
|
|
|
|
|
|
|
|
def resetReward(self, finish = 0):
|
|
|
|
if self.rewardHasBeenReset == 1:
|
|
|
|
return
|
|
|
|
self.rewardHasBeenReset = 1
|
|
|
|
self.stop()
|
|
|
|
self._deleteTrack()
|
|
|
|
if finish == 1:
|
|
|
|
self.restore()
|
|
|
|
self.toonRewardDicts = []
|
|
|
|
if self.rewardPanel != None:
|
|
|
|
self.rewardPanel.destroy()
|
|
|
|
self.rewardPanel = None
|
|
|
|
return
|
|
|
|
|
|
|
|
def play(self, ts, callback):
|
|
|
|
self.hasBeenReset = 0
|
|
|
|
ptrack = Sequence()
|
|
|
|
camtrack = Sequence()
|
|
|
|
if random.random() > 0.5:
|
|
|
|
MovieUtil.shotDirection = 'left'
|
|
|
|
else:
|
|
|
|
MovieUtil.shotDirection = 'right'
|
|
|
|
for s in self.battle.activeSuits:
|
|
|
|
s.battleTrapIsFresh = 0
|
|
|
|
|
|
|
|
tattacks, tcam = self.__doToonAttacks()
|
|
|
|
if tattacks:
|
|
|
|
ptrack.append(tattacks)
|
|
|
|
camtrack.append(tcam)
|
|
|
|
sattacks, scam = self.__doSuitAttacks()
|
|
|
|
if sattacks:
|
|
|
|
ptrack.append(sattacks)
|
|
|
|
camtrack.append(scam)
|
|
|
|
ptrack.append(Func(callback))
|
|
|
|
self._deleteTrack()
|
|
|
|
self.track = Sequence(ptrack, name='movie-track-%d' % self.battle.doId)
|
|
|
|
if self.battle.localToonPendingOrActive():
|
|
|
|
self.track = Parallel(self.track, Sequence(camtrack), name='movie-track-with-cam-%d' % self.battle.doId)
|
|
|
|
if randomBattleTimestamp == 1:
|
|
|
|
randNum = random.randint(0, 99)
|
|
|
|
dur = self.track.getDuration()
|
|
|
|
ts = float(randNum) / 100.0 * dur
|
|
|
|
self.track.delayDeletes = []
|
|
|
|
for suit in self.battle.suits:
|
|
|
|
self.track.delayDeletes.append(DelayDelete.DelayDelete(suit, 'Movie.play'))
|
|
|
|
|
|
|
|
for toon in self.battle.toons:
|
|
|
|
self.track.delayDeletes.append(DelayDelete.DelayDelete(toon, 'Movie.play'))
|
|
|
|
|
|
|
|
self.track.start(ts)
|
|
|
|
return None
|
|
|
|
|
|
|
|
def finish(self):
|
|
|
|
self.track.finish()
|
|
|
|
return None
|
|
|
|
|
|
|
|
def playReward(self, ts, name, callback, noSkip = False):
|
|
|
|
self.rewardHasBeenReset = 0
|
|
|
|
ptrack = Sequence()
|
|
|
|
camtrack = Sequence()
|
|
|
|
self.rewardPanel = RewardPanel.RewardPanel(name)
|
|
|
|
self.rewardPanel.hide()
|
|
|
|
victory, camVictory, skipper = MovieToonVictory.doToonVictory(self.battle.localToonActive(), self.battle.activeToons, self.toonRewardIds, self.toonRewardDicts, self.deathList, self.rewardPanel, 1, self.uberList, self.helpfulToonsList, noSkip=noSkip)
|
|
|
|
if victory:
|
|
|
|
skipper.setIvals((ptrack, camtrack), ptrack.getDuration())
|
|
|
|
ptrack.append(victory)
|
|
|
|
camtrack.append(camVictory)
|
|
|
|
ptrack.append(Func(callback))
|
|
|
|
self._deleteTrack()
|
|
|
|
self.track = Sequence(ptrack, name='movie-reward-track-%d' % self.battle.doId)
|
|
|
|
if self.battle.localToonActive():
|
|
|
|
self.track = Parallel(self.track, camtrack, name='movie-reward-track-with-cam-%d' % self.battle.doId)
|
|
|
|
self.track.delayDeletes = []
|
|
|
|
for t in self.battle.activeToons:
|
|
|
|
self.track.delayDeletes.append(DelayDelete.DelayDelete(t, 'Movie.playReward'))
|
|
|
|
|
|
|
|
skipper.setIvals((self.track,), 0.0)
|
|
|
|
skipper.setBattle(self.battle)
|
|
|
|
self.track.start(ts)
|
|
|
|
return None
|
|
|
|
|
|
|
|
def playTutorialReward(self, ts, name, callback):
|
|
|
|
self.rewardHasBeenReset = 0
|
|
|
|
self.rewardPanel = RewardPanel.RewardPanel(name)
|
|
|
|
self.rewardCallback = callback
|
|
|
|
self.questList = self.rewardPanel.getQuestIntervalList(base.localAvatar, [0,
|
|
|
|
1,
|
|
|
|
1,
|
|
|
|
0], [base.localAvatar], base.localAvatar.quests[0], [], [base.localAvatar.getDoId()])
|
|
|
|
camera.setPosHpr(0, 8, base.localAvatar.getHeight() * 0.66, 179, 15, 0)
|
|
|
|
self.playTutorialReward_1()
|
|
|
|
|
|
|
|
def playTutorialReward_1(self):
|
|
|
|
self.tutRewardDialog_1 = TTDialog.TTDialog(text=TTLocalizer.MovieTutorialReward1, command=self.playTutorialReward_2, style=TTDialog.Acknowledge, fadeScreen=None, pos=(0.65, 0, 0.5), scale=0.8)
|
|
|
|
self.tutRewardDialog_1.hide()
|
|
|
|
self._deleteTrack()
|
|
|
|
self.track = Sequence(name='tutorial-reward-1')
|
|
|
|
self.track.append(Func(self.rewardPanel.initGagFrame, base.localAvatar, [0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0], [0,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0], noSkip=True))
|
|
|
|
self.track += self.rewardPanel.getTrackIntervalList(base.localAvatar, THROW_TRACK, 0, 1, 0)
|
|
|
|
self.track.append(Func(self.tutRewardDialog_1.show))
|
|
|
|
self.track.start()
|
|
|
|
return
|
|
|
|
|
|
|
|
def playTutorialReward_2(self, value):
|
|
|
|
self.tutRewardDialog_1.cleanup()
|
|
|
|
self.tutRewardDialog_2 = TTDialog.TTDialog(text=TTLocalizer.MovieTutorialReward2, command=self.playTutorialReward_3, style=TTDialog.Acknowledge, fadeScreen=None, pos=(0.65, 0, 0.5), scale=0.8)
|
|
|
|
self.tutRewardDialog_2.hide()
|
|
|
|
self._deleteTrack()
|
|
|
|
self.track = Sequence(name='tutorial-reward-2')
|
|
|
|
self.track.append(Wait(1.0))
|
|
|
|
self.track += self.rewardPanel.getTrackIntervalList(base.localAvatar, SQUIRT_TRACK, 0, 1, 0)
|
|
|
|
self.track.append(Func(self.tutRewardDialog_2.show))
|
|
|
|
self.track.start()
|
|
|
|
return
|
|
|
|
|
|
|
|
def playTutorialReward_3(self, value):
|
|
|
|
self.tutRewardDialog_2.cleanup()
|
|
|
|
from toontown.toon import Toon
|
|
|
|
from toontown.toon import ToonDNA
|
|
|
|
|
|
|
|
def doneChat1(page, elapsed = 0):
|
|
|
|
self.track2.start()
|
|
|
|
|
|
|
|
def doneChat2(elapsed):
|
|
|
|
self.track2.pause()
|
|
|
|
self.track3.start()
|
|
|
|
|
|
|
|
def uniqueName(hook):
|
|
|
|
return 'TutorialTom-' + hook
|
|
|
|
|
|
|
|
self.tutorialTom = Toon.Toon()
|
|
|
|
dna = ToonDNA.ToonDNA()
|
|
|
|
dnaList = ('dll', 'ms', 'm', 'm', 7, 0, 7, 7, 2, 6, 2, 6, 2, 16)
|
|
|
|
dna.newToonFromProperties(*dnaList)
|
|
|
|
self.tutorialTom.setDNA(dna)
|
|
|
|
self.tutorialTom.setName(TTLocalizer.NPCToonNames[20000])
|
|
|
|
self.tutorialTom.uniqueName = uniqueName
|
|
|
|
if base.config.GetString('language', 'english') == 'japanese':
|
2019-11-23 16:07:27 -06:00
|
|
|
self.tomDialogue03 = base.loader.loadSfx('phase_3.5/audio/dial/CC_tom_movie_tutorial_reward01.mp3')
|
|
|
|
self.tomDialogue04 = base.loader.loadSfx('phase_3.5/audio/dial/CC_tom_movie_tutorial_reward02.mp3')
|
|
|
|
self.tomDialogue05 = base.loader.loadSfx('phase_3.5/audio/dial/CC_tom_movie_tutorial_reward03.mp3')
|
2019-11-02 17:27:54 -05:00
|
|
|
self.musicVolume = base.config.GetFloat('tutorial-music-volume', 0.5)
|
|
|
|
else:
|
|
|
|
self.tomDialogue03 = None
|
|
|
|
self.tomDialogue04 = None
|
|
|
|
self.tomDialogue05 = None
|
|
|
|
self.musicVolume = 0.9
|
|
|
|
music = base.cr.playGame.place.loader.battleMusic
|
|
|
|
if self.questList:
|
|
|
|
self.track1 = Sequence(Wait(1.0), Func(self.rewardPanel.initQuestFrame, base.localAvatar, copy.deepcopy(base.localAvatar.quests)), Wait(1.0), Sequence(*self.questList), Wait(1.0), Func(self.rewardPanel.hide), Func(camera.setPosHpr, render, 34, 19.88, 3.48, -90, -2.36, 0), Func(base.localAvatar.animFSM.request, 'neutral'), Func(base.localAvatar.setPosHpr, 40.31, 22.0, -0.47, 150.0, 360.0, 0.0), Wait(0.5), Func(self.tutorialTom.reparentTo, render), Func(self.tutorialTom.show), Func(self.tutorialTom.setPosHpr, 40.29, 17.9, -0.47, 11.31, 0.0, 0.07), Func(self.tutorialTom.animFSM.request, 'TeleportIn'), Wait(1.517), Func(self.tutorialTom.animFSM.request, 'neutral'), Func(self.acceptOnce, self.tutorialTom.uniqueName('doneChatPage'), doneChat1), Func(self.tutorialTom.addActive), Func(music.setVolume, self.musicVolume), Func(self.tutorialTom.setLocalPageChat, TTLocalizer.MovieTutorialReward3, 0, None, [self.tomDialogue03]), name='tutorial-reward-3a')
|
|
|
|
self.track2 = Sequence(Func(self.acceptOnce, self.tutorialTom.uniqueName('doneChatPage'), doneChat2), Func(self.tutorialTom.setLocalPageChat, TTLocalizer.MovieTutorialReward4, 1, None, [self.tomDialogue04]), Func(self.tutorialTom.setPlayRate, 1.5, 'right-hand-start'), Func(self.tutorialTom.play, 'right-hand-start'), Wait(self.tutorialTom.getDuration('right-hand-start') / 1.5), Func(self.tutorialTom.loop, 'right-hand'), name='tutorial-reward-3b')
|
|
|
|
self.track3 = Parallel(Sequence(Func(self.tutorialTom.setPlayRate, -1.8, 'right-hand-start'), Func(self.tutorialTom.play, 'right-hand-start'), Wait(self.tutorialTom.getDuration('right-hand-start') / 1.8), Func(self.tutorialTom.animFSM.request, 'neutral'), name='tutorial-reward-3ca'), Sequence(Wait(0.5), Func(self.tutorialTom.setChatAbsolute, TTLocalizer.MovieTutorialReward5, CFSpeech | CFTimeout, self.tomDialogue05), Wait(1.0), Func(self.tutorialTom.animFSM.request, 'TeleportOut'), Wait(self.tutorialTom.getDuration('teleport')), Wait(1.0), Func(self.playTutorialReward_4, 0), name='tutorial-reward-3cb'), name='tutorial-reward-3c')
|
|
|
|
self.track1.start()
|
|
|
|
else:
|
|
|
|
self.playTutorialReward_4(0)
|
|
|
|
return
|
|
|
|
|
|
|
|
def playTutorialReward_4(self, value):
|
|
|
|
base.localAvatar.setH(270)
|
|
|
|
self.tutorialTom.removeActive()
|
|
|
|
self.tutorialTom.delete()
|
|
|
|
self.questList = None
|
|
|
|
self.rewardCallback()
|
|
|
|
return
|
|
|
|
|
|
|
|
def stop(self):
|
|
|
|
if self.track:
|
|
|
|
self.track.finish()
|
|
|
|
self._deleteTrack()
|
|
|
|
if hasattr(self, 'track1'):
|
|
|
|
self.track1.finish()
|
|
|
|
self.track1 = None
|
|
|
|
if hasattr(self, 'track2'):
|
|
|
|
self.track2.finish()
|
|
|
|
self.track2 = None
|
|
|
|
if hasattr(self, 'track3'):
|
|
|
|
self.track3.finish()
|
|
|
|
self.track3 = None
|
|
|
|
if self.rewardPanel:
|
|
|
|
self.rewardPanel.hide()
|
|
|
|
if self.playByPlayText:
|
|
|
|
self.playByPlayText.hide()
|
|
|
|
return
|
|
|
|
|
|
|
|
def __doToonAttacks(self):
|
|
|
|
if base.config.GetBool('want-toon-attack-anims', 1):
|
|
|
|
track = Sequence(name='toon-attacks')
|
|
|
|
camTrack = Sequence(name='toon-attacks-cam')
|
|
|
|
ival, camIval = MovieFire.doFires(self.__findToonAttack(FIRE))
|
|
|
|
if ival:
|
|
|
|
track.append(ival)
|
|
|
|
camTrack.append(camIval)
|
|
|
|
ival, camIval = MovieSOS.doSOSs(self.__findToonAttack(SOS))
|
|
|
|
if ival:
|
|
|
|
track.append(ival)
|
|
|
|
camTrack.append(camIval)
|
|
|
|
ival, camIval = MovieNPCSOS.doNPCSOSs(self.__findToonAttack(NPCSOS))
|
|
|
|
if ival:
|
|
|
|
track.append(ival)
|
|
|
|
camTrack.append(camIval)
|
|
|
|
ival, camIval = MoviePetSOS.doPetSOSs(self.__findToonAttack(PETSOS))
|
|
|
|
if ival:
|
|
|
|
track.append(ival)
|
|
|
|
camTrack.append(camIval)
|
|
|
|
hasHealBonus = self.battle.getInteractivePropTrackBonus() == HEAL
|
|
|
|
ival, camIval = MovieHeal.doHeals(self.__findToonAttack(HEAL), hasHealBonus)
|
|
|
|
if ival:
|
|
|
|
track.append(ival)
|
|
|
|
camTrack.append(camIval)
|
|
|
|
ival, camIval = MovieTrap.doTraps(self.__findToonAttack(TRAP))
|
|
|
|
if ival:
|
|
|
|
track.append(ival)
|
|
|
|
camTrack.append(camIval)
|
|
|
|
ival, camIval = MovieLure.doLures(self.__findToonAttack(LURE))
|
|
|
|
if ival:
|
|
|
|
track.append(ival)
|
|
|
|
camTrack.append(camIval)
|
|
|
|
ival, camIval = MovieSound.doSounds(self.__findToonAttack(SOUND))
|
|
|
|
if ival:
|
|
|
|
track.append(ival)
|
|
|
|
camTrack.append(camIval)
|
|
|
|
ival, camIval = MovieThrow.doThrows(self.__findToonAttack(THROW))
|
|
|
|
if ival:
|
|
|
|
track.append(ival)
|
|
|
|
camTrack.append(camIval)
|
|
|
|
ival, camIval = MovieSquirt.doSquirts(self.__findToonAttack(SQUIRT))
|
|
|
|
if ival:
|
|
|
|
track.append(ival)
|
|
|
|
camTrack.append(camIval)
|
|
|
|
ival, camIval = MovieDrop.doDrops(self.__findToonAttack(DROP))
|
|
|
|
if ival:
|
|
|
|
track.append(ival)
|
|
|
|
camTrack.append(camIval)
|
|
|
|
if len(track) == 0:
|
|
|
|
return (None, None)
|
|
|
|
else:
|
|
|
|
return (track, camTrack)
|
|
|
|
else:
|
|
|
|
return (None, None)
|
|
|
|
return None
|
|
|
|
|
|
|
|
def genRewardDicts(self, id0, origExp0, earnedExp0, origQuests0, items0, missedItems0, origMerits0, merits0, parts0, id1, origExp1, earnedExp1, origQuests1, items1, missedItems1, origMerits1, merits1, parts1, id2, origExp2, earnedExp2, origQuests2, items2, missedItems2, origMerits2, merits2, parts2, id3, origExp3, earnedExp3, origQuests3, items3, missedItems3, origMerits3, merits3, parts3, deathList, uberList, helpfulToonsList):
|
|
|
|
self.deathList = deathList
|
|
|
|
self.helpfulToonsList = helpfulToonsList
|
|
|
|
entries = ((id0,
|
|
|
|
origExp0,
|
|
|
|
earnedExp0,
|
|
|
|
origQuests0,
|
|
|
|
items0,
|
|
|
|
missedItems0,
|
|
|
|
origMerits0,
|
|
|
|
merits0,
|
|
|
|
parts0),
|
|
|
|
(id1,
|
|
|
|
origExp1,
|
|
|
|
earnedExp1,
|
|
|
|
origQuests1,
|
|
|
|
items1,
|
|
|
|
missedItems1,
|
|
|
|
origMerits1,
|
|
|
|
merits1,
|
|
|
|
parts1),
|
|
|
|
(id2,
|
|
|
|
origExp2,
|
|
|
|
earnedExp2,
|
|
|
|
origQuests2,
|
|
|
|
items2,
|
|
|
|
missedItems2,
|
|
|
|
origMerits2,
|
|
|
|
merits2,
|
|
|
|
parts2),
|
|
|
|
(id3,
|
|
|
|
origExp3,
|
|
|
|
earnedExp3,
|
|
|
|
origQuests3,
|
|
|
|
items3,
|
|
|
|
missedItems3,
|
|
|
|
origMerits3,
|
|
|
|
merits3,
|
|
|
|
parts3))
|
|
|
|
self.toonRewardDicts = BattleExperience.genRewardDicts(entries)
|
|
|
|
self.toonRewardIds = [id0,
|
|
|
|
id1,
|
|
|
|
id2,
|
|
|
|
id3]
|
|
|
|
self.uberList = uberList
|
|
|
|
|
|
|
|
def genAttackDicts(self, toons, suits, id0, tr0, le0, tg0, hp0, ac0, hpb0, kbb0, died0, revive0, id1, tr1, le1, tg1, hp1, ac1, hpb1, kbb1, died1, revive1, id2, tr2, le2, tg2, hp2, ac2, hpb2, kbb2, died2, revive2, id3, tr3, le3, tg3, hp3, ac3, hpb3, kbb3, died3, revive3, sid0, at0, stg0, dm0, sd0, sb0, st0, sid1, at1, stg1, dm1, sd1, sb1, st1, sid2, at2, stg2, dm2, sd2, sb2, st2, sid3, at3, stg3, dm3, sd3, sb3, st3):
|
|
|
|
if self.track and self.track.isPlaying():
|
|
|
|
self.notify.warning('genAttackDicts() - track is playing!')
|
|
|
|
toonAttacks = ((id0,
|
|
|
|
tr0,
|
|
|
|
le0,
|
|
|
|
tg0,
|
|
|
|
hp0,
|
|
|
|
ac0,
|
|
|
|
hpb0,
|
|
|
|
kbb0,
|
|
|
|
died0,
|
|
|
|
revive0),
|
|
|
|
(id1,
|
|
|
|
tr1,
|
|
|
|
le1,
|
|
|
|
tg1,
|
|
|
|
hp1,
|
|
|
|
ac1,
|
|
|
|
hpb1,
|
|
|
|
kbb1,
|
|
|
|
died1,
|
|
|
|
revive1),
|
|
|
|
(id2,
|
|
|
|
tr2,
|
|
|
|
le2,
|
|
|
|
tg2,
|
|
|
|
hp2,
|
|
|
|
ac2,
|
|
|
|
hpb2,
|
|
|
|
kbb2,
|
|
|
|
died2,
|
|
|
|
revive2),
|
|
|
|
(id3,
|
|
|
|
tr3,
|
|
|
|
le3,
|
|
|
|
tg3,
|
|
|
|
hp3,
|
|
|
|
ac3,
|
|
|
|
hpb3,
|
|
|
|
kbb3,
|
|
|
|
died3,
|
|
|
|
revive3))
|
|
|
|
self.__genToonAttackDicts(toons, suits, toonAttacks)
|
|
|
|
suitAttacks = ((sid0,
|
|
|
|
at0,
|
|
|
|
stg0,
|
|
|
|
dm0,
|
|
|
|
sd0,
|
|
|
|
sb0,
|
|
|
|
st0),
|
|
|
|
(sid1,
|
|
|
|
at1,
|
|
|
|
stg1,
|
|
|
|
dm1,
|
|
|
|
sd1,
|
|
|
|
sb1,
|
|
|
|
st1),
|
|
|
|
(sid2,
|
|
|
|
at2,
|
|
|
|
stg2,
|
|
|
|
dm2,
|
|
|
|
sd2,
|
|
|
|
sb2,
|
|
|
|
st2),
|
|
|
|
(sid3,
|
|
|
|
at3,
|
|
|
|
stg3,
|
|
|
|
dm3,
|
|
|
|
sd3,
|
|
|
|
sb3,
|
|
|
|
st3))
|
|
|
|
self.__genSuitAttackDicts(toons, suits, suitAttacks)
|
|
|
|
|
|
|
|
def __genToonAttackDicts(self, toons, suits, toonAttacks):
|
|
|
|
for ta in toonAttacks:
|
|
|
|
targetGone = 0
|
|
|
|
track = ta[TOON_TRACK_COL]
|
|
|
|
if track != NO_ATTACK:
|
|
|
|
adict = {}
|
|
|
|
toonIndex = ta[TOON_ID_COL]
|
|
|
|
toonId = toons[toonIndex]
|
|
|
|
toon = self.battle.findToon(toonId)
|
|
|
|
if toon == None:
|
|
|
|
continue
|
|
|
|
level = ta[TOON_LVL_COL]
|
|
|
|
adict['toon'] = toon
|
|
|
|
adict['track'] = track
|
|
|
|
adict['level'] = level
|
|
|
|
hps = ta[TOON_HP_COL]
|
|
|
|
kbbonuses = ta[TOON_KBBONUS_COL]
|
|
|
|
if track == NPCSOS:
|
|
|
|
adict['npcId'] = ta[TOON_TGT_COL]
|
|
|
|
toonId = ta[TOON_TGT_COL]
|
|
|
|
track, npc_level, npc_hp = NPCToons.getNPCTrackLevelHp(adict['npcId'])
|
|
|
|
if track == None:
|
|
|
|
track = NPCSOS
|
|
|
|
adict['track'] = track
|
|
|
|
adict['level'] = npc_level
|
|
|
|
elif track == PETSOS:
|
|
|
|
petId = ta[TOON_TGT_COL]
|
|
|
|
adict['toonId'] = toonId
|
|
|
|
adict['petId'] = petId
|
|
|
|
if track == SOS:
|
|
|
|
targetId = ta[TOON_TGT_COL]
|
|
|
|
if targetId == base.localAvatar.doId:
|
|
|
|
target = base.localAvatar
|
|
|
|
adict['targetType'] = 'callee'
|
|
|
|
elif toon == base.localAvatar:
|
|
|
|
target = base.cr.identifyAvatar(targetId)
|
|
|
|
adict['targetType'] = 'caller'
|
|
|
|
else:
|
|
|
|
target = None
|
|
|
|
adict['targetType'] = 'observer'
|
|
|
|
adict['target'] = target
|
|
|
|
elif track == NPCSOS or track == NPC_COGS_MISS or track == NPC_TOONS_HIT or track == NPC_RESTOCK_GAGS or track == PETSOS:
|
|
|
|
adict['special'] = 1
|
|
|
|
toonHandles = []
|
|
|
|
for t in toons:
|
|
|
|
if t != -1:
|
|
|
|
target = self.battle.findToon(t)
|
|
|
|
if target == None:
|
|
|
|
continue
|
|
|
|
if track == NPC_TOONS_HIT and t == toonId:
|
|
|
|
continue
|
|
|
|
toonHandles.append(target)
|
|
|
|
|
|
|
|
adict['toons'] = toonHandles
|
|
|
|
suitHandles = []
|
|
|
|
for s in suits:
|
|
|
|
if s != -1:
|
|
|
|
target = self.battle.findSuit(s)
|
|
|
|
if target == None:
|
|
|
|
continue
|
|
|
|
suitHandles.append(target)
|
|
|
|
|
|
|
|
adict['suits'] = suitHandles
|
|
|
|
if track == PETSOS:
|
|
|
|
del adict['special']
|
|
|
|
targets = []
|
|
|
|
for t in toons:
|
|
|
|
if t != -1:
|
|
|
|
target = self.battle.findToon(t)
|
|
|
|
if target == None:
|
|
|
|
continue
|
|
|
|
tdict = {}
|
|
|
|
tdict['toon'] = target
|
|
|
|
tdict['hp'] = hps[toons.index(t)]
|
|
|
|
self.notify.debug('PETSOS: toon: %d healed for hp: %d' % (target.doId, hps[toons.index(t)]))
|
|
|
|
targets.append(tdict)
|
|
|
|
|
|
|
|
if len(targets) > 0:
|
|
|
|
adict['target'] = targets
|
|
|
|
elif track == HEAL:
|
|
|
|
if levelAffectsGroup(HEAL, level):
|
|
|
|
targets = []
|
|
|
|
for t in toons:
|
|
|
|
if t != toonId and t != -1:
|
|
|
|
target = self.battle.findToon(t)
|
|
|
|
if target == None:
|
|
|
|
continue
|
|
|
|
tdict = {}
|
|
|
|
tdict['toon'] = target
|
|
|
|
tdict['hp'] = hps[toons.index(t)]
|
|
|
|
self.notify.debug('HEAL: toon: %d healed for hp: %d' % (target.doId, hps[toons.index(t)]))
|
|
|
|
targets.append(tdict)
|
|
|
|
|
|
|
|
if len(targets) > 0:
|
|
|
|
adict['target'] = targets
|
|
|
|
else:
|
|
|
|
targetGone = 1
|
|
|
|
else:
|
|
|
|
targetIndex = ta[TOON_TGT_COL]
|
|
|
|
if targetIndex < 0:
|
|
|
|
targetGone = 1
|
|
|
|
else:
|
|
|
|
targetId = toons[targetIndex]
|
|
|
|
target = self.battle.findToon(targetId)
|
|
|
|
if target != None:
|
|
|
|
tdict = {}
|
|
|
|
tdict['toon'] = target
|
|
|
|
tdict['hp'] = hps[targetIndex]
|
|
|
|
adict['target'] = tdict
|
|
|
|
else:
|
|
|
|
targetGone = 1
|
|
|
|
elif attackAffectsGroup(track, level, ta[TOON_TRACK_COL]):
|
|
|
|
targets = []
|
|
|
|
for s in suits:
|
|
|
|
if s != -1:
|
|
|
|
target = self.battle.findSuit(s)
|
|
|
|
if ta[TOON_TRACK_COL] == NPCSOS:
|
|
|
|
if track == LURE and self.battle.isSuitLured(target) == 1:
|
|
|
|
continue
|
|
|
|
elif track == TRAP and (self.battle.isSuitLured(target) == 1 or target.battleTrap != NO_TRAP):
|
|
|
|
continue
|
|
|
|
targetIndex = suits.index(s)
|
|
|
|
sdict = {}
|
|
|
|
sdict['suit'] = target
|
|
|
|
sdict['hp'] = hps[targetIndex]
|
|
|
|
if ta[TOON_TRACK_COL] == NPCSOS and track == DROP and hps[targetIndex] == 0:
|
|
|
|
continue
|
|
|
|
sdict['kbbonus'] = kbbonuses[targetIndex]
|
|
|
|
sdict['died'] = ta[SUIT_DIED_COL] & 1 << targetIndex
|
|
|
|
sdict['revived'] = ta[SUIT_REVIVE_COL] & 1 << targetIndex
|
|
|
|
if sdict['died'] != 0:
|
|
|
|
pass
|
|
|
|
sdict['leftSuits'] = []
|
|
|
|
sdict['rightSuits'] = []
|
|
|
|
targets.append(sdict)
|
|
|
|
|
|
|
|
adict['target'] = targets
|
|
|
|
else:
|
|
|
|
targetIndex = ta[TOON_TGT_COL]
|
|
|
|
if targetIndex < 0:
|
|
|
|
targetGone = 1
|
|
|
|
else:
|
|
|
|
targetId = suits[targetIndex]
|
|
|
|
target = self.battle.findSuit(targetId)
|
|
|
|
sdict = {}
|
|
|
|
sdict['suit'] = target
|
|
|
|
if self.battle.activeSuits.count(target) == 0:
|
|
|
|
targetGone = 1
|
|
|
|
suitIndex = 0
|
|
|
|
else:
|
|
|
|
suitIndex = self.battle.activeSuits.index(target)
|
|
|
|
leftSuits = []
|
|
|
|
for si in range(0, suitIndex):
|
|
|
|
asuit = self.battle.activeSuits[si]
|
|
|
|
if self.battle.isSuitLured(asuit) == 0:
|
|
|
|
leftSuits.append(asuit)
|
|
|
|
|
|
|
|
lenSuits = len(self.battle.activeSuits)
|
|
|
|
rightSuits = []
|
|
|
|
if lenSuits > suitIndex + 1:
|
|
|
|
for si in range(suitIndex + 1, lenSuits):
|
|
|
|
asuit = self.battle.activeSuits[si]
|
|
|
|
if self.battle.isSuitLured(asuit) == 0:
|
|
|
|
rightSuits.append(asuit)
|
|
|
|
|
|
|
|
sdict['leftSuits'] = leftSuits
|
|
|
|
sdict['rightSuits'] = rightSuits
|
|
|
|
sdict['hp'] = hps[targetIndex]
|
|
|
|
sdict['kbbonus'] = kbbonuses[targetIndex]
|
|
|
|
sdict['died'] = ta[SUIT_DIED_COL] & 1 << targetIndex
|
|
|
|
sdict['revived'] = ta[SUIT_REVIVE_COL] & 1 << targetIndex
|
|
|
|
if sdict['revived'] != 0:
|
|
|
|
pass
|
|
|
|
if sdict['died'] != 0:
|
|
|
|
pass
|
|
|
|
if track == DROP or track == TRAP:
|
|
|
|
adict['target'] = [sdict]
|
|
|
|
else:
|
|
|
|
adict['target'] = sdict
|
|
|
|
adict['hpbonus'] = ta[TOON_HPBONUS_COL]
|
|
|
|
adict['sidestep'] = ta[TOON_ACCBONUS_COL]
|
2019-12-30 00:07:56 -06:00
|
|
|
if 'npcId' in adict:
|
2019-11-02 17:27:54 -05:00
|
|
|
adict['sidestep'] = 0
|
|
|
|
adict['battle'] = self.battle
|
|
|
|
adict['playByPlayText'] = self.playByPlayText
|
|
|
|
if targetGone == 0:
|
|
|
|
self.toonAttackDicts.append(adict)
|
|
|
|
else:
|
|
|
|
self.notify.warning('genToonAttackDicts() - target gone!')
|
|
|
|
|
|
|
|
def compFunc(a, b):
|
|
|
|
alevel = a['level']
|
|
|
|
blevel = b['level']
|
|
|
|
if alevel > blevel:
|
|
|
|
return 1
|
|
|
|
elif alevel < blevel:
|
|
|
|
return -1
|
|
|
|
return 0
|
|
|
|
|
2019-12-30 19:37:37 -06:00
|
|
|
self.toonAttackDicts.sort(key=functools.cmp_to_key(compFunc))
|
2019-11-02 17:27:54 -05:00
|
|
|
return
|
|
|
|
|
|
|
|
def __findToonAttack(self, track):
|
|
|
|
setCapture = 0
|
|
|
|
tp = []
|
|
|
|
for ta in self.toonAttackDicts:
|
2019-12-30 00:07:56 -06:00
|
|
|
if ta['track'] == track or track == NPCSOS and 'special' in ta:
|
2019-11-02 17:27:54 -05:00
|
|
|
tp.append(ta)
|
|
|
|
if track == SQUIRT:
|
|
|
|
setCapture = 1
|
|
|
|
|
|
|
|
if track == TRAP:
|
|
|
|
sortedTraps = []
|
|
|
|
for attack in tp:
|
2019-12-30 00:07:56 -06:00
|
|
|
if 'npcId' not in attack:
|
2019-11-02 17:27:54 -05:00
|
|
|
sortedTraps.append(attack)
|
|
|
|
|
|
|
|
for attack in tp:
|
2019-12-30 00:07:56 -06:00
|
|
|
if 'npcId' in attack:
|
2019-11-02 17:27:54 -05:00
|
|
|
sortedTraps.append(attack)
|
|
|
|
|
|
|
|
tp = sortedTraps
|
|
|
|
if setCapture:
|
|
|
|
pass
|
|
|
|
return tp
|
|
|
|
|
|
|
|
def __genSuitAttackDicts(self, toons, suits, suitAttacks):
|
|
|
|
for sa in suitAttacks:
|
|
|
|
targetGone = 0
|
|
|
|
attack = sa[SUIT_ATK_COL]
|
|
|
|
if attack != NO_ATTACK:
|
|
|
|
suitIndex = sa[SUIT_ID_COL]
|
|
|
|
suitId = suits[suitIndex]
|
|
|
|
suit = self.battle.findSuit(suitId)
|
|
|
|
if suit == None:
|
|
|
|
self.notify.error('suit: %d not in battle!' % suitId)
|
|
|
|
adict = getSuitAttack(suit.getStyleName(), suit.getLevel(), attack)
|
|
|
|
adict['suit'] = suit
|
|
|
|
adict['battle'] = self.battle
|
|
|
|
adict['playByPlayText'] = self.playByPlayText
|
|
|
|
adict['taunt'] = sa[SUIT_TAUNT_COL]
|
|
|
|
hps = sa[SUIT_HP_COL]
|
|
|
|
if adict['group'] == ATK_TGT_GROUP:
|
|
|
|
targets = []
|
|
|
|
for t in toons:
|
|
|
|
if t != -1:
|
|
|
|
target = self.battle.findToon(t)
|
|
|
|
if target == None:
|
|
|
|
continue
|
|
|
|
targetIndex = toons.index(t)
|
|
|
|
tdict = {}
|
|
|
|
tdict['toon'] = target
|
|
|
|
tdict['hp'] = hps[targetIndex]
|
|
|
|
self.notify.debug('DAMAGE: toon: %d hit for hp: %d' % (target.doId, hps[targetIndex]))
|
|
|
|
toonDied = sa[TOON_DIED_COL] & 1 << targetIndex
|
|
|
|
tdict['died'] = toonDied
|
|
|
|
targets.append(tdict)
|
|
|
|
|
|
|
|
if len(targets) > 0:
|
|
|
|
adict['target'] = targets
|
|
|
|
else:
|
|
|
|
targetGone = 1
|
|
|
|
elif adict['group'] == ATK_TGT_SINGLE:
|
|
|
|
targetIndex = sa[SUIT_TGT_COL]
|
|
|
|
targetId = toons[targetIndex]
|
|
|
|
target = self.battle.findToon(targetId)
|
|
|
|
if target == None:
|
|
|
|
targetGone = 1
|
|
|
|
break
|
|
|
|
tdict = {}
|
|
|
|
tdict['toon'] = target
|
|
|
|
tdict['hp'] = hps[targetIndex]
|
|
|
|
self.notify.debug('DAMAGE: toon: %d hit for hp: %d' % (target.doId, hps[targetIndex]))
|
|
|
|
toonDied = sa[TOON_DIED_COL] & 1 << targetIndex
|
|
|
|
tdict['died'] = toonDied
|
|
|
|
toonIndex = self.battle.activeToons.index(target)
|
|
|
|
rightToons = []
|
|
|
|
for ti in range(0, toonIndex):
|
|
|
|
rightToons.append(self.battle.activeToons[ti])
|
|
|
|
|
|
|
|
lenToons = len(self.battle.activeToons)
|
|
|
|
leftToons = []
|
|
|
|
if lenToons > toonIndex + 1:
|
|
|
|
for ti in range(toonIndex + 1, lenToons):
|
|
|
|
leftToons.append(self.battle.activeToons[ti])
|
|
|
|
|
|
|
|
tdict['leftToons'] = leftToons
|
|
|
|
tdict['rightToons'] = rightToons
|
|
|
|
adict['target'] = tdict
|
|
|
|
else:
|
|
|
|
self.notify.warning('got suit attack not group or single!')
|
|
|
|
if targetGone == 0:
|
|
|
|
self.suitAttackDicts.append(adict)
|
|
|
|
else:
|
|
|
|
self.notify.warning('genSuitAttackDicts() - target gone!')
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
def __doSuitAttacks(self):
|
|
|
|
if base.config.GetBool('want-suit-anims', 1):
|
|
|
|
track = Sequence(name='suit-attacks')
|
|
|
|
camTrack = Sequence(name='suit-attacks-cam')
|
|
|
|
isLocalToonSad = False
|
|
|
|
for a in self.suitAttackDicts:
|
|
|
|
ival, camIval = MovieSuitAttacks.doSuitAttack(a)
|
|
|
|
if ival:
|
|
|
|
track.append(ival)
|
|
|
|
camTrack.append(camIval)
|
|
|
|
targetField = a.get('target')
|
|
|
|
if targetField is None:
|
|
|
|
continue
|
|
|
|
if a['group'] == ATK_TGT_GROUP:
|
|
|
|
for target in targetField:
|
|
|
|
if target['died'] and target['toon'].doId == base.localAvatar.doId:
|
|
|
|
isLocalToonSad = True
|
|
|
|
|
|
|
|
elif a['group'] == ATK_TGT_SINGLE:
|
|
|
|
if targetField['died'] and targetField['toon'].doId == base.localAvatar.doId:
|
|
|
|
isLocalToonSad = True
|
|
|
|
if isLocalToonSad:
|
|
|
|
break
|
|
|
|
|
|
|
|
if len(track) == 0:
|
|
|
|
return (None, None)
|
|
|
|
return (track, camTrack)
|
|
|
|
else:
|
|
|
|
return (None, None)
|
|
|
|
return
|