def doToonVictory(localToonActive, toons, rewardDicts, deathList, rpanel): tracks = [] if localToonActive == 1: tracks.append(Func(rpanel.show)) tracks.append(Func(NametagGlobals.setOnscreenChatForced, 1)) camTracks = [] endTracks = [] danceSound = globalBattleSoundCache.getSound('ENC_Win.mp3') for t in toons: rdict = __findToonReward(rewardDicts, t) expTrack = rpanel.getExpTrack(t, rdict['origExp'], rdict['earnedExp'], deathList, rdict['items'], rdict['missedItems'], toons) if expTrack: tracks.append(expTrack) camDuration = expTrack.getDuration() camExpTrack = MovieCamera.chooseRewardShot(t, camDuration) camTracks.append(MovieCamera.chooseRewardShot(t, camDuration)) if localToonActive == 1: tracks.append(Func(rpanel.hide)) tracks.append(Func(NametagGlobals.setOnscreenChatForced, 0)) tracks = tracks + endTracks seq = Sequence(tracks) seqdur = seq.getDuration() print 'dance duration: ', seqdur soundTrack = SoundInterval(danceSound, duration = seqdur, loop = 1) mtrack = Parallel(Sequence(tracks), soundTrack) camTrack = Track(camTracks) return (mtrack, camTrack)
def doToonVictory(localToonActive, toons, rewardDicts, deathList, rpanel): tracks = [] if localToonActive == 1: tracks.append(Func(rpanel.show)) tracks.append(Func(NametagGlobals.setOnscreenChatForced, 1)) camTracks = [] endTracks = [] danceSound = globalBattleSoundCache.getSound('ENC_Win.mp3') for t in toons: rdict = __findToonReward(rewardDicts, t) expTrack = rpanel.getExpTrack(t, rdict['origExp'], rdict['earnedExp'], deathList, rdict['items'], rdict['missedItems'], toons) if expTrack: tracks.append(expTrack) camDuration = expTrack.getDuration() camExpTrack = MovieCamera.chooseRewardShot(t, camDuration) camTracks.append(MovieCamera.chooseRewardShot(t, camDuration)) if localToonActive == 1: tracks.append(Func(rpanel.hide)) tracks.append(Func(NametagGlobals.setOnscreenChatForced, 0)) tracks = tracks + endTracks seq = Sequence(tracks) seqdur = seq.getDuration() print 'dance duration: ', seqdur soundTrack = SoundInterval(danceSound, duration=seqdur, loop=1) mtrack = Parallel(Sequence(tracks), soundTrack) camTrack = Track(camTracks) return (mtrack, camTrack)
def doToonVictory(localToonActive, toons, rewardToonIds, rewardDicts, deathList, rpanel, allowGroupShot = 1, uberList = [], helpfulToonsList = [], noSkip = False): track = Sequence() if localToonActive == 1: track.append(Func(rpanel.show)) track.append(Func(NametagGlobals.setOnscreenChatForced, 1)) camTrack = Sequence() endTrack = Sequence() danceSound = globalBattleSoundCache.getSound('ENC_Win.ogg') toonList = [] countToons = 0 uberListNew = [] for t in toons: if isinstance(t, types.IntType): t = base.cr.doId2do.get(t) if t: toonList.append(t) uberListNew.append(uberList[countToons]) countToons += 1 toonId2toon = {} for toon in toonList: toonId2toon[toon.doId] = toon rewardToonList = [] for id in rewardToonIds: rewardToonList.append(toonId2toon.get(id)) skipper = ToonVictorySkipper(len(toonList), noSkip) lastListenIndex = 0 track.append(skipper.getSetupFunc(lastListenIndex)) for tIndex in range(len(toonList)): t = toonList[tIndex] rdict = __findToonReward(rewardDicts, t) if rdict != None: expTrack = rpanel.getExpTrack(t, rdict['origExp'], rdict['earnedExp'], deathList, rdict['origQuests'], rdict['items'], rdict['missedItems'], rdict['origMerits'], rdict['merits'], rdict['parts'], rewardToonList, uberListNew[tIndex], helpfulToonsList, noSkip=noSkip) if expTrack: skipper.setStartTime(tIndex, track.getDuration()) track.append(skipper.getTeardownFunc(lastListenIndex)) lastListenIndex = tIndex track.append(skipper.getSetupFunc(lastListenIndex)) track.append(expTrack) camDuration = expTrack.getDuration() camExpTrack = MovieCamera.chooseRewardShot(t, camDuration) camTrack.append(MovieCamera.chooseRewardShot(t, camDuration, allowGroupShot=allowGroupShot)) track.append(skipper.getTeardownFunc(lastListenIndex)) track.append(Func(skipper.destroy)) if localToonActive == 1: track.append(Func(rpanel.hide)) track.append(Func(NametagGlobals.setOnscreenChatForced, 0)) track.append(endTrack) trackdur = track.getDuration() soundTrack = SoundInterval(danceSound, duration=trackdur, loop=1) mtrack = Parallel(track, soundTrack) skipper.setIvals((mtrack, camTrack)) return (mtrack, camTrack, skipper)
def doToonVictory(localToonActive, toons, rewardToonIds, rewardDicts, deathList, rpanel, allowGroupShot = 1, uberList = [], helpfulToonsList = [], noSkip = False): track = Sequence() if localToonActive == 1: track.append(Func(rpanel.show)) track.append(Func(NametagGlobals.setOnscreenChatForced, 1)) camTrack = Sequence() endTrack = Sequence() danceSound = globalBattleSoundCache.getSound('ENC_Win.ogg') toonList = [] countToons = 0 uberListNew = [] for t in toons: if isinstance(t, types.IntType): t = base.cr.doId2do.get(t) if t: toonList.append(t) uberListNew.append(uberList[countToons]) countToons += 1 toonId2toon = {} for toon in toonList: toonId2toon[toon.doId] = toon rewardToonList = [] for id in rewardToonIds: rewardToonList.append(toonId2toon.get(id)) skipper = ToonVictorySkipper(len(toonList), noSkip) lastListenIndex = 0 track.append(skipper.getSetupFunc(lastListenIndex)) for tIndex in xrange(len(toonList)): t = toonList[tIndex] rdict = __findToonReward(rewardDicts, t) if rdict != None: expTrack = rpanel.getExpTrack(t, rdict['origExp'], rdict['earnedExp'], deathList, rdict['origQuests'], rdict['items'], rdict['missedItems'], rdict['origMerits'], rdict['merits'], rdict['parts'], rewardToonList, uberListNew[tIndex], helpfulToonsList, noSkip=noSkip) if expTrack: skipper.setStartTime(tIndex, track.getDuration()) track.append(skipper.getTeardownFunc(lastListenIndex)) lastListenIndex = tIndex track.append(skipper.getSetupFunc(lastListenIndex)) track.append(expTrack) camDuration = expTrack.getDuration() camExpTrack = MovieCamera.chooseRewardShot(t, camDuration) camTrack.append(MovieCamera.chooseRewardShot(t, camDuration, allowGroupShot=allowGroupShot)) track.append(skipper.getTeardownFunc(lastListenIndex)) track.append(Func(skipper.destroy)) if localToonActive == 1: track.append(Func(rpanel.hide)) track.append(Func(NametagGlobals.setOnscreenChatForced, 0)) track.append(endTrack) trackdur = track.getDuration() soundTrack = SoundInterval(danceSound, duration=trackdur, loop=1) mtrack = Parallel(track, soundTrack) skipper.setIvals((mtrack, camTrack)) return (mtrack, camTrack, skipper)
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 doSounds(sounds): if len(sounds) == 0: return (None, None) tracks = [] 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: tracks += __doSoundsLevel(soundList, delay, hitCount) delay += TOON_SOUND_DELAY mtrack = MultiTrack(tracks) targets = sounds[0]['target'] camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseSoundShot(sounds, targets, camDuration) return (mtrack, camTrack) return
def doLures(lures): """ doLures(lures) Lures occur in the following order: 1) level 1 lures one at a time, from right to left 2) level 2 lures one at a time, from right to left etc. """ if (len(lures) == 0): return (None, None) npcArrivals, npcDepartures, npcs = MovieNPCSOS.doNPCTeleports(lures) mtrack = Parallel() for l in lures: ival = __doLureLevel(l, npcs) if (ival): mtrack.append(ival) lureTrack = Sequence(npcArrivals, mtrack, npcDepartures) camDuration = mtrack.getDuration() enterDuration = npcArrivals.getDuration() exitDuration = npcDepartures.getDuration() camTrack = MovieCamera.chooseLureShot(lures, camDuration, enterDuration, exitDuration) return (lureTrack, camTrack)
def doSOSs(calls): if len(calls) == 0: return (None, None) def callerFunc(toon, handle): toon.setChatAbsolute(TTLocalizer.MovieSOSCallHelp % handle.getName(), CFSpeech | CFTimeout) handle.d_battleSOS(handle.doId) def calleeFunc(toon, handle): toon.setChatAbsolute(TTLocalizer.MovieSOSCallHelp % handle.getName(), CFSpeech | CFTimeout) def observerFunc(toon): toon.setChatAbsolute(TTLocalizer.MovieSOSObserverHelp, CFSpeech | CFTimeout) mtrack = Sequence() for c in calls: toon = c['toon'] targetType = c['targetType'] handle = c['target'] mtrack.append(Wait(0.5)) if targetType == 'observer': ival = Func(observerFunc, toon) elif targetType == 'caller': ival = Func(callerFunc, toon, handle) elif targetType == 'callee': ival = Func(calleeFunc, toon, handle) else: notify.error('invalid target type: %s' % targetType) mtrack.append(ival) mtrack.append(Wait(2.0)) notify.debug('toon: %s calls for help' % toon.getName()) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseSOSShot(toon, camDuration) return (mtrack, camTrack)
def doFires(fires): if len(fires) == 0: return (None, None) suitFiresDict = { } for fire in fires: suitId = fire['target']['suit'].doId if suitFiresDict.has_key(suitId): suitFiresDict[suitId].append(fire) continue suitFiresDict[suitId] = [ fire] suitFires = suitFiresDict.values() def compFunc(a, b): if len(a) > len(b): return 1 elif len(a) < len(b): return -1 return 0 suitFires.sort(compFunc) totalHitDict = { } singleHitDict = { } groupHitDict = { } for fire in fires: suitId = fire['target']['suit'].doId if fire['target']['hp'] > 0: addHit(singleHitDict, suitId, 1) addHit(totalHitDict, suitId, 1) else: addHit(singleHitDict, suitId, 0) addHit(totalHitDict, suitId, 0) fire['target']['hp'] > 0 notify.debug('singleHitDict = %s' % singleHitDict) notify.debug('groupHitDict = %s' % groupHitDict) notify.debug('totalHitDict = %s' % totalHitDict) delay = 0.0 mtrack = Parallel() firedTargets = [] for sf in suitFires: if len(sf) > 0: ival = __doSuitFires(sf) if ival: mtrack.append(Sequence(Wait(delay), ival)) delay = delay + TOON_FIRE_SUIT_DELAY continue retTrack = Sequence() retTrack.append(mtrack) camDuration = retTrack.getDuration() camTrack = MovieCamera.chooseFireShot(fires, suitFiresDict, camDuration) return (retTrack, camTrack)
def doSquirts(squirts): if len(squirts) == 0: return (None, None) suitSquirtsDict = { } doneUber = 0 skip = 0 for squirt in squirts: skip = 0 if skip: continue if type(squirt['target']) == type([]): target = squirt['target'][0] suitId = target['suit'].doId if suitSquirtsDict.has_key(suitId): suitSquirtsDict[suitId].append(squirt) else: suitSquirtsDict[suitId] = [ squirt] type(squirt['target']) == type([]) suitId = squirt['target']['suit'].doId if suitSquirtsDict.has_key(suitId): suitSquirtsDict[suitId].append(squirt) continue suitSquirtsDict[suitId] = [ squirt] suitSquirts = suitSquirtsDict.values() def compFunc(a, b): if len(a) > len(b): return 1 elif len(a) < len(b): return -1 return 0 suitSquirts.sort(compFunc) delay = 0.0 mtrack = Parallel() for st in suitSquirts: if len(st) > 0: ival = __doSuitSquirts(st) if ival: mtrack.append(Sequence(Wait(delay), ival)) delay = delay + TOON_SQUIRT_SUIT_DELAY continue camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseSquirtShot(squirts, suitSquirtsDict, camDuration) return (mtrack, camTrack)
def doHeals(heals, hasInteractivePropHealBonus): if len(heals) == 0: return (None, None) track = Sequence() for h in heals: ival = __doHealLevel(h, hasInteractivePropHealBonus) if ival: track.append(ival) camDuration = track.getDuration() camTrack = MovieCamera.chooseHealShot(heals, camDuration) return (track, camTrack)
def doZaps(zaps): if len(zaps) == 0: return (None, None) suitZapsDict = {} doneUber = 0 skip = 0 for zap in zaps: skip = 0 if skip: pass elif type(zap['target']) == type([]): if 1: target = zap['target'][0] suitId = target['suit'].doId if suitId in suitZapsDict: suitZapsDict[suitId].append(zap) else: suitZapsDict[suitId] = [zap] else: suitId = zap['target']['suit'].doId if suitId in suitZapsDict: suitZapsDict[suitId].append(zap) else: suitZapsDict[suitId] = [zap] suitZaps = suitZapsDict.values() def compFunc(a, b): if len(a) > len(b): return 1 elif len(a) < len(b): return -1 return 0 suitZaps.sort(compFunc) delay = 0.0 mtrack = Parallel() for st in suitZaps: if len(st) > 0: ival = __doSuitZaps(st) if ival: mtrack.append(Sequence(Wait(delay), ival)) delay = delay + TOON_ZAP_SUIT_DELAY npcArrivals, npcDepartures, npcs = MovieNPCSOS.doNPCTeleports(zaps) enterDuration = npcArrivals.getDuration() exitDuration = npcDepartures.getDuration() camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseLureShot(zaps, camDuration, enterDuration, exitDuration) return (mtrack, camTrack)
def doSquirts(squirts): if len(squirts) == 0: return (None, None) suitSquirtsDict = {} doneUber = 0 skip = 0 for squirt in squirts: skip = 0 if skip: continue if type(squirt['target']) == type([]): target = squirt['target'][0] suitId = target['suit'].doId if suitSquirtsDict.has_key(suitId): suitSquirtsDict[suitId].append(squirt) else: suitSquirtsDict[suitId] = [squirt] type(squirt['target']) == type([]) suitId = squirt['target']['suit'].doId if suitSquirtsDict.has_key(suitId): suitSquirtsDict[suitId].append(squirt) continue suitSquirtsDict[suitId] = [squirt] suitSquirts = suitSquirtsDict.values() def compFunc(a, b): if len(a) > len(b): return 1 elif len(a) < len(b): return -1 return 0 suitSquirts.sort(compFunc) delay = 0.0 mtrack = Parallel() for st in suitSquirts: if len(st) > 0: ival = __doSuitSquirts(st) if ival: mtrack.append(Sequence(Wait(delay), ival)) delay = delay + TOON_SQUIRT_SUIT_DELAY continue camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseSquirtShot(squirts, suitSquirtsDict, camDuration) return (mtrack, camTrack)
def doPetSOSs(PetSOSs): if len(PetSOSs) == 0: return (None, None) track = Sequence() textTrack = Sequence() for p in PetSOSs: ival = __doPetSOS(p) if ival: track.append(ival) camDuration = track.getDuration() camTrack = MovieCamera.chooseHealShot(PetSOSs, camDuration) return (track, camTrack)
def doLures(lures): if len(lures) == 0: return (None, None) ivals = [] for l in lures: ival = __doLureLevel(l) if ival: ivals.append(Track([ival])) mtrack = MultiTrack(ivals) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseLureShot(lures, camDuration) return (mtrack, camTrack) return
def doHeals(heals): if len(heals) == 0: return (None, None) ivals = [] for h in heals: ival = __doHealLevel(h) if ival: ivals.append(ival) mtrack = Track(ivals) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseHealShot(heals, camDuration) return (mtrack, camTrack) return
def doHeals(heals): if len(heals) == 0: return (None, None) ivals = [] for h in heals: ival = __doHealLevel(h) if ival: ivals.append(ival) mtrack = Track(ivals) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseHealShot(heals, camDuration) return (mtrack, camTrack)
def doLures(lures): if len(lures) == 0: return (None, None) npcArrivals, npcDepartures, npcs = MovieNPCSOS.doNPCTeleports(lures) mtrack = Parallel() for l in lures: ival = __doLureLevel(l, npcs) if ival: mtrack.append(ival) lureTrack = Sequence(npcArrivals, mtrack, npcDepartures) camDuration = mtrack.getDuration() enterDuration = npcArrivals.getDuration() exitDuration = npcDepartures.getDuration() camTrack = MovieCamera.chooseLureShot(lures, camDuration, enterDuration, exitDuration) return (lureTrack, camTrack)
def doLures(lures): if len(lures) == 0: return (None, None) ivals = [] for l in lures: ival = __doLureLevel(l) if ival: ivals.append(Track([ ival])) mtrack = MultiTrack(ivals) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseLureShot(lures, camDuration) return (mtrack, camTrack)
def doNPCSOSs(NPCSOSs): if len(NPCSOSs) == 0: return (None, None) track = Sequence() textTrack = Sequence() for n in NPCSOSs: ival, textIval = __doNPCSOS(n) if ival: track.append(ival) textTrack.append(textIval) camDuration = track.getDuration() if camDuration > 0.0: camTrack = MovieCamera.chooseHealShot(NPCSOSs, camDuration) else: camTrack = Sequence() return (track, Parallel(camTrack, textTrack))
def doSOSs(calls): if len(calls) == 0: return (None, None) def callerFunc(toon, handle): toon.setChatAbsolute(Localizer.MovieSOSCallHelp % handle.getName(), CFSpeech | CFTimeout) handle.d_battleSOS(toonbase.localToon.doId) def calleeFunc(toon, handle): toon.setChatAbsolute(Localizer.MovieSOSCallHelp % handle.getName(), CFSpeech | CFTimeout) def observerFunc(toon): toon.setChatAbsolute(Localizer.MovieSOSObserverHelp, CFSpeech | CFTimeout) ivals = [] for c in calls: toon = c['toon'] targetType = c['targetType'] handle = c['target'] ivals.append(WaitInterval(0.5)) if targetType == 'observer': ival = FunctionInterval(observerFunc, extraArgs = [ toon]) elif targetType == 'caller': ival = FunctionInterval(callerFunc, extraArgs = [ toon, handle]) elif targetType == 'callee': ival = FunctionInterval(calleeFunc, extraArgs = [ toon, handle]) else: notify.error('ivalid target type: %s' % targetType) ivals.append(ival) ivals.append(WaitInterval(2.0)) notify.debug('toon: %s calls for help' % toon.getName()) mtrack = Track(ivals) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseSOSShot(toon, camDuration) return (mtrack, camTrack)
def doHeals(heals, hasInteractivePropHealBonus): """ doHeals(heals) Heals occur in the following order: 1) level 1 heals one at a time, from right to left 2) level 2 heals one at a time, from right to left etc. """ #print("do Heals") if (len(heals) == 0): return (None, None) track = Sequence() for h in heals: ival = __doHealLevel(h, hasInteractivePropHealBonus) if (ival): track.append(ival) camDuration = track.getDuration() camTrack = MovieCamera.chooseHealShot(heals, camDuration) return (track, camTrack)
def doSOSs(calls): if len(calls) == 0: return (None, None) def callerFunc(toon, handle): toon.setChatAbsolute(Localizer.MovieSOSCallHelp % handle.getName(), CFSpeech | CFTimeout) handle.d_battleSOS(toonbase.localToon.doId) def calleeFunc(toon, handle): toon.setChatAbsolute(Localizer.MovieSOSCallHelp % handle.getName(), CFSpeech | CFTimeout) def observerFunc(toon): toon.setChatAbsolute(Localizer.MovieSOSObserverHelp, CFSpeech | CFTimeout) ivals = [] for c in calls: toon = c['toon'] targetType = c['targetType'] handle = c['target'] ivals.append(WaitInterval(0.5)) if targetType == 'observer': ival = FunctionInterval(observerFunc, extraArgs=[toon]) else: if targetType == 'caller': ival = FunctionInterval(callerFunc, extraArgs=[toon, handle]) else: if targetType == 'callee': ival = FunctionInterval(calleeFunc, extraArgs=[toon, handle]) else: notify.error('ivalid target type: %s' % targetType) ivals.append(ival) ivals.append(WaitInterval(2.0)) notify.debug('toon: %s calls for help' % toon.getName()) mtrack = Track(ivals) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseSOSShot(toon, camDuration) return (mtrack, camTrack) return
def doSOSs(calls): if len(calls) == 0: return None, None def callerFunc(toon, handle): toon.setChatAbsolute( TTLocalizer.MovieSOSCallHelp % handle.getName(), CFSpeech | CFTimeout) base.cr.ttrFriendsManager.sendUpdate('sendTalkWhisper', [handle.doId, 'I Need Help In A Battle!!!']) def calleeFunc(toon, handle): toon.setChatAbsolute( TTLocalizer.MovieSOSCallHelp % handle.getName(), CFSpeech | CFTimeout) def observerFunc(toon): toon.setChatAbsolute( TTLocalizer.MovieSOSObserverHelp, CFSpeech | CFTimeout) mtrack = Sequence() for c in calls: toon = c['toon'] targetType = c['targetType'] handle = c['target'] mtrack.append(Wait(0.5)) if targetType == 'observer': ival = Func(observerFunc, toon) elif targetType == 'caller': ival = Func(callerFunc, toon, handle) elif targetType == 'callee': ival = Func(calleeFunc, toon, handle) else: notify.error('invalid target type: %s' % targetType) mtrack.append(ival) mtrack.append(Wait(2.0)) notify.debug('toon: %s calls for help' % toon.getName()) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseSOSShot(toon, camDuration) return mtrack, camTrack
def doSOSs(calls): """ doSOSs(calls) Calls for help occur in the following order: right to left, one at a time """ if (len(calls) == 0): return (None, None) # setChatAbsolute gets around the speedchat def callerFunc(toon, handle): toon.setChatAbsolute(TTLocalizer.MovieSOSCallHelp % handle.getName(), CFSpeech | CFTimeout) handle.d_battleSOS(base.localAvatar.doId) def calleeFunc(toon, handle): toon.setChatAbsolute(TTLocalizer.MovieSOSCallHelp % handle.getName(), CFSpeech | CFTimeout) def observerFunc(toon): toon.setChatAbsolute(TTLocalizer.MovieSOSObserverHelp, CFSpeech | CFTimeout) mtrack = Sequence() for c in calls: toon = c['toon'] targetType = c['targetType'] handle = c['target'] mtrack.append(Wait(0.5)) if (targetType == 'observer'): ival = Func(observerFunc, toon) elif (targetType == 'caller'): ival = Func(callerFunc, toon, handle) elif (targetType == 'callee'): ival = Func(calleeFunc, toon, handle) else: notify.error('invalid target type: %s' % targetType) mtrack.append(ival) # Hold on the word balloon for 2 seconds mtrack.append(Wait(2.0)) notify.debug('toon: %s calls for help' % toon.getName()) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseSOSShot(toon, camDuration) return (mtrack, camTrack)
def doDrops(drops): if len(drops) == 0: return (None, None) suitDropsDict = { } for drop in drops: suitId = drop['target']['suit'].doId if suitDropsDict.has_key(suitId): suitDropsDict[suitId].append(drop) else: suitDropsDict[suitId] = [ drop] suitDrops = suitDropsDict.values() def compFunc(a, b): if len(a) > len(b): return 1 elif len(a) < len(b): return -1 return 0 suitDrops.sort(compFunc) delay = 0.0 tracks = [] for st in suitDrops: if len(st) > 0: ival = __doSuitDrops(st) if ival: tracks.append(Track([ (delay, ival)])) delay = delay + TOON_DROP_SUIT_DELAY mtrack = MultiTrack(tracks, name = 'toplevel-drop') camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseDropShot(drops, suitDropsDict, camDuration) return (mtrack, camTrack)
def doDrops(drops): if len(drops) == 0: return (None, None) suitDropsDict = {} for drop in drops: suitId = drop['target']['suit'].doId if suitDropsDict.has_key(suitId): suitDropsDict[suitId].append(drop) else: suitDropsDict[suitId] = [ drop] suitDrops = suitDropsDict.values() def compFunc(a, b): if len(a) > len(b): return 1 else: if len(a) < len(b): return -1 return 0 suitDrops.sort(compFunc) delay = 0.0 tracks = [] for st in suitDrops: if len(st) > 0: ival = __doSuitDrops(st) if ival: tracks.append(Track([(delay, ival)])) delay = delay + TOON_DROP_SUIT_DELAY mtrack = MultiTrack(tracks, name='toplevel-drop') camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseDropShot(drops, suitDropsDict, camDuration) return ( mtrack, camTrack) return
def doSquirts(squirts): if len(squirts) == 0: return (None, None) suitSquirtsDict = {} for squirt in squirts: suitId = squirt['target']['suit'].doId if suitSquirtsDict.has_key(suitId): suitSquirtsDict[suitId].append(squirt) else: suitSquirtsDict[suitId] = [squirt] suitSquirts = suitSquirtsDict.values() def compFunc(a, b): if len(a) > len(b): return 1 elif len(a) < len(b): return -1 return 0 suitSquirts.sort(compFunc) delay = 0.0 tracks = [] for st in suitSquirts: if len(st) > 0: ival = __doSuitSquirts(st) if ival: tracks.append(Track([(delay, ival)])) delay = delay + TOON_SQUIRT_SUIT_DELAY mtrack = MultiTrack(tracks) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseSquirtShot(squirts, suitSquirtsDict, camDuration) return (mtrack, camTrack)
def doThrows(throws): if len(throws) == 0: return (None, None) suitThrowsDict = {} for throw in throws: suitId = throw['target']['suit'].doId if suitThrowsDict.has_key(suitId): suitThrowsDict[suitId].append(throw) else: suitThrowsDict[suitId] = [ throw] suitThrows = suitThrowsDict.values() def compFunc(a, b): if len(a) > len(b): return 1 else: if len(a) < len(b): return -1 return 0 suitThrows.sort(compFunc) delay = 0.0 tracks = [] for st in suitThrows: if len(st) > 0: ival = __doSuitThrows(st) if ival: tracks.append(Track([(delay, ival)])) delay = delay + TOON_THROW_SUIT_DELAY mtrack = MultiTrack(tracks) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseThrowShot(throws, suitThrowsDict, camDuration) return ( mtrack, camTrack) return
def doSquirts(squirts): if len(squirts) == 0: return (None, None) suitSquirtsDict = {} for squirt in squirts: suitId = squirt["target"]["suit"].doId if suitSquirtsDict.has_key(suitId): suitSquirtsDict[suitId].append(squirt) else: suitSquirtsDict[suitId] = [squirt] suitSquirts = suitSquirtsDict.values() def compFunc(a, b): if len(a) > len(b): return 1 elif len(a) < len(b): return -1 return 0 suitSquirts.sort(compFunc) delay = 0.0 tracks = [] for st in suitSquirts: if len(st) > 0: ival = __doSuitSquirts(st) if ival: tracks.append(Track([(delay, ival)])) delay = delay + TOON_SQUIRT_SUIT_DELAY mtrack = MultiTrack(tracks) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseSquirtShot(squirts, suitSquirtsDict, camDuration) return (mtrack, camTrack)
def doThrows(throws): if len(throws) == 0: return (None, None) suitThrowsDict = {} for throw in throws: if attackAffectsGroup(throw['track'], throw['level']): pass else: suitId = throw['target']['suit'].doId if suitId in suitThrowsDict: suitThrowsDict[suitId].append(throw) else: suitThrowsDict[suitId] = [throw] suitThrows = suitThrowsDict.values() def compFunc(a, b): if len(a) > len(b): return 1 elif len(a) < len(b): return -1 return 0 suitThrows.sort(compFunc) totalHitDict = {} singleHitDict = {} groupHitDict = {} for throw in throws: if attackAffectsGroup(throw['track'], throw['level']): for i in xrange(len(throw['target'])): target = throw['target'][i] suitId = target['suit'].doId if target['hp'] > 0: addHit(groupHitDict, suitId, 1) addHit(totalHitDict, suitId, 1) else: addHit(groupHitDict, suitId, 0) addHit(totalHitDict, suitId, 0) else: suitId = throw['target']['suit'].doId if throw['target']['hp'] > 0: addHit(singleHitDict, suitId, 1) addHit(totalHitDict, suitId, 1) else: addHit(singleHitDict, suitId, 0) addHit(totalHitDict, suitId, 0) notify.debug('singleHitDict = %s' % singleHitDict) notify.debug('groupHitDict = %s' % groupHitDict) notify.debug('totalHitDict = %s' % totalHitDict) delay = 0.0 mtrack = Parallel() for st in suitThrows: if len(st) > 0: ival = __doSuitThrows(st) if ival: mtrack.append(Sequence(Wait(delay), ival)) delay = delay + TOON_THROW_SUIT_DELAY retTrack = Sequence() retTrack.append(mtrack) groupThrowIvals = Parallel() groupThrows = [] for throw in throws: if attackAffectsGroup(throw['track'], throw['level']): groupThrows.append(throw) for throw in groupThrows: tracks = None tracks = __throwGroupPie(throw, 0, groupHitDict) if tracks: for track in tracks: groupThrowIvals.append(track) retTrack.append(groupThrowIvals) camDuration = retTrack.getDuration() camTrack = MovieCamera.chooseThrowShot(throws, suitThrowsDict, camDuration) return (retTrack, camTrack)
def doDrops(drops): if len(drops) == 0: return (None, None) npcArrivals, npcDepartures, npcs = MovieNPCSOS.doNPCTeleports(drops) suitDropsDict = {} groupDrops = [] for drop in drops: track = drop['track'] level = drop['level'] targets = drop['target'] if len(targets) == 1: suitId = targets[0]['suit'].doId if suitId in suitDropsDict: suitDropsDict[suitId].append((drop, targets[0])) else: suitDropsDict[suitId] = [(drop, targets[0])] elif level <= MAX_LEVEL_INDEX and attackAffectsGroup(track, level): groupDrops.append(drop) else: for target in targets: suitId = target['suit'].doId if suitId in suitDropsDict: otherDrops = suitDropsDict[suitId] alreadyInList = 0 for oDrop in otherDrops: if oDrop[0]['toon'] == drop['toon']: alreadyInList = 1 if alreadyInList == 0: suitDropsDict[suitId].append((drop, target)) else: suitDropsDict[suitId] = [(drop, target)] suitDrops = suitDropsDict.values() def compFunc(a, b): if len(a) > len(b): return 1 elif len(a) < len(b): return -1 return 0 suitDrops.sort(compFunc) delay = 0.0 mtrack = Parallel(name='toplevel-drop') npcDrops = {} for st in suitDrops: if len(st) > 0: ival = __doSuitDrops(st, npcs, npcDrops) if ival: mtrack.append(Sequence(Wait(delay), ival)) delay = delay + TOON_DROP_SUIT_DELAY dropTrack = Sequence(npcArrivals, mtrack, npcDepartures) camDuration = mtrack.getDuration() if groupDrops: ival = __doGroupDrops(groupDrops) dropTrack.append(ival) camDuration += ival.getDuration() enterDuration = npcArrivals.getDuration() exitDuration = npcDepartures.getDuration() camTrack = MovieCamera.chooseDropShot(drops, suitDropsDict, camDuration, enterDuration, exitDuration) return (dropTrack, camTrack)
def doThrows(throws): if len(throws) == 0: return None, None suitThrowsDict = {} for throw in throws: if attackAffectsGroup(throw['track'], throw['level']): pass else: suitId = throw['target']['suit'].doId if suitId in suitThrowsDict: suitThrowsDict[suitId].append(throw) else: suitThrowsDict[suitId] = [throw] suitThrows = suitThrowsDict.values() def compFunc(a, b): if len(a) > len(b): return 1 elif len(a) < len(b): return -1 return 0 suitThrows.sort(compFunc) totalHitDict = {} singleHitDict = {} groupHitDict = {} for throw in throws: if attackAffectsGroup(throw['track'], throw['level']): for i in range(len(throw['target'])): target = throw['target'][i] suitId = target['suit'].doId if target['hp'] > 0: addHit(groupHitDict, suitId, 1) addHit(totalHitDict, suitId, 1) else: addHit(groupHitDict, suitId, 0) addHit(totalHitDict, suitId, 0) else: suitId = throw['target']['suit'].doId if throw['target']['hp'] > 0: addHit(singleHitDict, suitId, 1) addHit(totalHitDict, suitId, 1) else: addHit(singleHitDict, suitId, 0) addHit(totalHitDict, suitId, 0) notify.debug('singleHitDict = %s' % singleHitDict) notify.debug('groupHitDict = %s' % groupHitDict) notify.debug('totalHitDict = %s' % totalHitDict) delay = 0.0 mtrack = Parallel() for st in suitThrows: if len(st) > 0: ival = __doSuitThrows(st) if ival: mtrack.append(Sequence(Wait(delay), ival)) delay = delay + TOON_THROW_SUIT_DELAY retTrack = Sequence() retTrack.append(mtrack) groupThrowIvals = Parallel() groupThrows = [] for throw in throws: if attackAffectsGroup(throw['track'], throw['level']): groupThrows.append(throw) for throw in groupThrows: tracks = None tracks = __throwGroupPie(throw, 0, groupHitDict) if tracks: for track in tracks: groupThrowIvals.append(track) retTrack.append(groupThrowIvals) camDuration = retTrack.getDuration() camTrack = MovieCamera.chooseThrowShot(throws, suitThrowsDict, camDuration) return retTrack, camTrack
def doDrops(drops): """ Drops occur in the following order: a) by suit, in order of increasing number of drops per suit 1) level 1 drops, right to left, (TOON_DROP_DELAY later) 2) level 2 drops, right to left, (TOON_DROP_DELAY later) 3) level 3 drops, right to left, (TOON_DROP_DELAY later) etc. b) next suit, (TOON_DROP_SUIT_DELAY later) """ if (len(drops) == 0): return (None, None) npcArrivals, npcDepartures, npcs = MovieNPCSOS.doNPCTeleports(drops) # Group the drops by targeted suit suitDropsDict = {} groupDrops = [] for drop in drops: track = drop['track'] level = drop['level'] targets = drop['target'] if (len(targets) == 1): suitId = targets[0]['suit'].doId if (suitDropsDict.has_key(suitId)): suitDropsDict[suitId].append((drop, targets[0])) else: suitDropsDict[suitId] = [(drop, targets[0])] elif level <= MAX_LEVEL_INDEX and attackAffectsGroup(track, level): groupDrops.append(drop) else: # We're dealing with an NPC drop, which can have multiple # targets for target in targets: suitId = target['suit'].doId if (suitDropsDict.has_key(suitId)): otherDrops = suitDropsDict[suitId] alreadyInList = 0 for oDrop in otherDrops: if (oDrop[0]['toon'] == drop['toon']): alreadyInList = 1 if (alreadyInList == 0): suitDropsDict[suitId].append((drop, target)) else: suitDropsDict[suitId] = [(drop, target)] suitDrops = suitDropsDict.values() # Sort the suits based on the number of drops per suit def compFunc(a, b): if (len(a) > len(b)): return 1 elif (len(a) < len(b)): return -1 return 0 suitDrops.sort(compFunc) delay = 0.0 mtrack = Parallel(name='toplevel-drop') npcDrops = {} for st in suitDrops: if (len(st) > 0): ival = __doSuitDrops(st, npcs, npcDrops) if (ival): mtrack.append(Sequence(Wait(delay), ival)) delay = delay + TOON_DROP_SUIT_DELAY dropTrack = Sequence(npcArrivals, mtrack, npcDepartures) camDuration = mtrack.getDuration() #we do the group drops after all the single drops have gone if groupDrops: ival = __doGroupDrops(groupDrops) dropTrack.append(ival) camDuration += ival.getDuration() enterDuration = npcArrivals.getDuration() exitDuration = npcDepartures.getDuration() camTrack = MovieCamera.chooseDropShot(drops, suitDropsDict, camDuration, enterDuration, exitDuration) return (dropTrack, camTrack)
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 suitTrapsDict.has_key(suitId): suitTrapsDict[suitId].append(trap) else: suitTrapsDict[suitId] = [ trap] else: for target in targets: suitId = target['suit'].doId if not suitTrapsDict.has_key(suitId): 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 range(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 range(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 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 range(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 range(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 doTraps(traps): if len(traps) == 0: return (None, None) suitTrapsDict = { } for trap in traps: suitId = trap['target']['suit'].doId if suitTrapsDict.has_key(suitId): suitTrapsDict[suitId].append(trap) else: suitTrapsDict[suitId] = [ trap] suitTrapLists = suitTrapsDict.values() ivals = [] for trapList in suitTrapLists: trapPropList = [] for i in range(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]) else: notify.warning('__doTraps() - Incorrect trap level: %d' % level) if len(trapList) == 1: ival = __doTrapLevel(trapList[0], trapPropList[0]) if ival: ivals.append(Track([ ival])) else: subIvals = [] for i in range(len(trapList)): trap = trapList[i] trapProps = trapPropList[i] ival = __doTrapLevel(trap, trapProps, explode = 1) if ival: subIvals.append(Track([ ival])) ivals.append(MultiTrack(subIvals)) mtrack = MultiTrack(ivals) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseTrapShot(traps, camDuration) return (mtrack, camTrack)
def __healDive(heal, hasInteractivePropHealBonus): splash = Splash.Splash(render) splash.reparentTo(render) npcId = 0 if 'npcId' in heal: npcId = heal['npcId'] toon = NPCToons.createLocalNPC(npcId) if toon == None: return else: toon = heal['toon'] targets = heal['target'] ineffective = heal['sidestep'] level = heal['level'] if npcId != 0: track = Sequence(MovieNPCSOS.teleportIn(heal, toon)) else: track = Sequence(__runToHealSpot(heal)) delay = 7.0 first = 1 targetTrack = Sequence() for target in targets: targetToon = target['toon'] hp = target['hp'] reactIval = Func(__healToon, targetToon, hp, ineffective, hasInteractivePropHealBonus) if first == 1: targetTrack.append(Wait(delay)) first = 0 targetTrack.append(reactIval) thisBattle = heal['battle'] toonsInBattle = thisBattle.toons glass = globalPropPool.getProp('glass') glass.setScale(4.0) glass.setHpr(0.0, 90.0, 0.0) ladder = globalPropPool.getProp('ladder') placeNode = NodePath('lookNode') diveProps = [glass, ladder] ladderScale = toon.getBodyScale() / 0.66 scaleUpPoint = Point3(0.5, 0.5, 0.45) * ladderScale basePos = toon.getPos() glassOffset = Point3(0, 1.1, 0.2) glassToonOffset = Point3(0, 1.2, 0.2) splashOffset = Point3(0, 1.0, 0.4) ladderOffset = Point3(0, 4, 0) ladderToonSep = Point3(0, 1, 0) * ladderScale diveOffset = Point3(0, 0, 10) divePos = add3(add3(ladderOffset, diveOffset), ladderToonSep) ladder.setH(toon.getH()) glassPos = render.getRelativePoint(toon, glassOffset) glassToonPos = render.getRelativePoint(toon, glassToonOffset) ladderPos = render.getRelativePoint(toon, ladderOffset) climbladderPos = render.getRelativePoint(toon, add3(ladderOffset, ladderToonSep)) divePos = render.getRelativePoint(toon, divePos) topDivePos = render.getRelativePoint(toon, diveOffset) lookBase = render.getRelativePoint(toon, ladderOffset) lookTop = render.getRelativePoint(toon, add3(ladderOffset, diveOffset)) LookGlass = render.getRelativePoint(toon, glassOffset) splash.setPos(splashOffset) walkToLadderTime = 1.0 climbTime = 5.0 diveTime = 1.0 ladderGrowTime = 1.5 splash.setPos(glassPos) toonNode = toon.getGeomNode() placeNode.reparentTo(render) placeNode.setScale(5.0) placeNode.setPos(toon.getPos(render)) placeNode.setHpr(toon.getHpr(render)) toonscale = toonNode.getScale() toonFacing = toon.getHpr() propTrack = Sequence( Func(MovieUtil.showProp, glass, render, glassPos), Func(MovieUtil.showProp, ladder, render, ladderPos), Func(toonsLook, toonsInBattle, placeNode, Point3(0, 0, 0)), Func(placeNode.setPos, lookBase), LerpScaleInterval(ladder, ladderGrowTime, scaleUpPoint, startScale=MovieUtil.PNT3_NEARZERO), Func(placeNode.setPos, lookTop), Wait(2.1), MovieCamera.toonGroupHighShot(None, 0), Wait(2.1), Func(placeNode.setPos, LookGlass), Wait(0.4), MovieCamera.allGroupLowShot(None, 0), Wait(1.8), LerpScaleInterval(ladder, ladderGrowTime, MovieUtil.PNT3_NEARZERO, startScale=scaleUpPoint), Func(MovieUtil.removeProps, diveProps)) mtrack = Parallel( propTrack, __getSoundTrack(level, 0.6, duration=9.0, node=toon), Sequence( Parallel( Sequence( ActorInterval(toon, 'walk', loop=0, duration=walkToLadderTime), ActorInterval(toon, 'neutral', loop=0, duration=0.1)), LerpPosInterval(toon, walkToLadderTime, climbladderPos), Wait(ladderGrowTime)), Parallel( ActorInterval(toon, 'climb', loop=0, endFrame=116), Sequence( Wait(4.6), Func(toonNode.setTransparency, 1), LerpColorScaleInterval(toonNode, 0.25, VBase4(1, 1.0, 1, 0.0), blendType='easeInOut'), LerpScaleInterval(toonNode, 0.01, 0.1, startScale=toonscale), LerpHprInterval(toon, 0.01, toonFacing), LerpPosInterval(toon, 0.0, glassToonPos), Func(toonNode.clearTransparency), Func(toonNode.clearColorScale), Parallel( ActorInterval(toon, 'swim', loop=1, startTime=0.0, endTime=1.0), Wait(1.0))), Sequence(Wait(4.6), Func(splash.play), Wait(1.0), Func(splash.destroy))), Wait(0.5), Parallel( ActorInterval(toon, 'jump', loop=0, startTime=0.2), LerpScaleInterval(toonNode, 0.5, toonscale, startScale=0.1), Func(stopLook, toonsInBattle))), targetTrack) track.append(mtrack) if npcId != 0: track.append(MovieNPCSOS.teleportOut(heal, toon)) else: track.append(__returnToBase(heal)) for target in targets: targetToon = target['toon'] track.append(Func(targetToon.clearChat)) return track
def __healDive(heal, hasInteractivePropHealBonus): splash = Splash.Splash(render) splash.reparentTo(render) npcId = 0 if heal.has_key('npcId'): npcId = heal['npcId'] toon = NPCToons.createLocalNPC(npcId) if toon == None: return None else: toon = heal['toon'] targets = heal['target'] ineffective = heal['sidestep'] level = heal['level'] if npcId != 0: track = Sequence(MovieNPCSOS.teleportIn(heal, toon)) else: track = Sequence(__runToHealSpot(heal)) delay = 7.0 first = 1 targetTrack = Sequence() for target in targets: targetToon = target['toon'] hp = target['hp'] reactIval = Func(__healToon, targetToon, hp, ineffective, hasInteractivePropHealBonus) if first == 1: targetTrack.append(Wait(delay)) first = 0 targetTrack.append(reactIval) thisBattle = heal['battle'] toonsInBattle = thisBattle.toons glass = globalPropPool.getProp('glass') glass.setScale(4.0) glass.setHpr(0.0, 90.0, 0.0) ladder = globalPropPool.getProp('ladder') placeNode = NodePath('lookNode') diveProps = [ glass, ladder] ladderScale = toon.getBodyScale() / 0.66000000000000003 scaleUpPoint = Point3(0.5, 0.5, 0.45000000000000001) * ladderScale basePos = toon.getPos() glassOffset = Point3(0, 1.1000000000000001, 0.20000000000000001) glassToonOffset = Point3(0, 1.2, 0.20000000000000001) splashOffset = Point3(0, 1.0, 0.40000000000000002) ladderOffset = Point3(0, 4, 0) ladderToonSep = Point3(0, 1, 0) * ladderScale diveOffset = Point3(0, 0, 10) divePos = add3(add3(ladderOffset, diveOffset), ladderToonSep) ladder.setH(toon.getH()) glassPos = render.getRelativePoint(toon, glassOffset) glassToonPos = render.getRelativePoint(toon, glassToonOffset) ladderPos = render.getRelativePoint(toon, ladderOffset) climbladderPos = render.getRelativePoint(toon, add3(ladderOffset, ladderToonSep)) divePos = render.getRelativePoint(toon, divePos) topDivePos = render.getRelativePoint(toon, diveOffset) lookBase = render.getRelativePoint(toon, ladderOffset) lookTop = render.getRelativePoint(toon, add3(ladderOffset, diveOffset)) LookGlass = render.getRelativePoint(toon, glassOffset) splash.setPos(splashOffset) walkToLadderTime = 1.0 climbTime = 5.0 diveTime = 1.0 ladderGrowTime = 1.5 splash.setPos(glassPos) toonNode = toon.getGeomNode() placeNode.reparentTo(render) placeNode.setScale(5.0) placeNode.setPos(toon.getPos(render)) placeNode.setHpr(toon.getHpr(render)) toonscale = toonNode.getScale() toonFacing = toon.getHpr() propTrack = Sequence(Func(MovieUtil.showProp, glass, render, glassPos), Func(MovieUtil.showProp, ladder, render, ladderPos), Func(toonsLook, toonsInBattle, placeNode, Point3(0, 0, 0)), Func(placeNode.setPos, lookBase), LerpScaleInterval(ladder, ladderGrowTime, scaleUpPoint, startScale = MovieUtil.PNT3_NEARZERO), Func(placeNode.setPos, lookTop), Wait(2.1000000000000001), MovieCamera.toonGroupHighShot(None, 0), Wait(2.1000000000000001), Func(placeNode.setPos, LookGlass), Wait(0.40000000000000002), MovieCamera.allGroupLowShot(None, 0), Wait(1.8), LerpScaleInterval(ladder, ladderGrowTime, MovieUtil.PNT3_NEARZERO, startScale = scaleUpPoint), Func(MovieUtil.removeProps, diveProps)) mtrack = Parallel(propTrack, __getSoundTrack(level, 0.59999999999999998, duration = 9.0, node = toon), Sequence(Parallel(Sequence(ActorInterval(toon, 'walk', loop = 0, duration = walkToLadderTime), ActorInterval(toon, 'neutral', loop = 0, duration = 0.10000000000000001)), LerpPosInterval(toon, walkToLadderTime, climbladderPos), Wait(ladderGrowTime)), Parallel(ActorInterval(toon, 'climb', loop = 0, endFrame = 116), Sequence(Wait(4.5999999999999996), Func(toonNode.setTransparency, 1), LerpColorScaleInterval(toonNode, 0.25, VBase4(1, 1.0, 1, 0.0), blendType = 'easeInOut'), LerpScaleInterval(toonNode, 0.01, 0.10000000000000001, startScale = toonscale), LerpHprInterval(toon, 0.01, toonFacing), LerpPosInterval(toon, 0.0, glassToonPos), Func(toonNode.clearTransparency), Func(toonNode.clearColorScale), Parallel(ActorInterval(toon, 'swim', loop = 1, startTime = 0.0, endTime = 1.0), Wait(1.0))), Sequence(Wait(4.5999999999999996), Func(splash.play), Wait(1.0), Func(splash.destroy))), Wait(0.5), Parallel(ActorInterval(toon, 'jump', loop = 0, startTime = 0.20000000000000001), LerpScaleInterval(toonNode, 0.5, toonscale, startScale = 0.10000000000000001), Func(stopLook, toonsInBattle))), targetTrack) track.append(mtrack) if npcId != 0: track.append(MovieNPCSOS.teleportOut(heal, toon)) else: track.append(__returnToBase(heal)) for target in targets: targetToon = target['toon'] track.append(Func(targetToon.clearChat)) return track
def doThrows(throws): """ Throws occur in the following order: a) by suit, in order of increasing number of throws per suit 1) level 1 throws, right to left, (TOON_THROW_DELAY later) 2) level 2 throws, right to left, (TOON_THROW_DELAY later) 3) level 3 throws, right to left, (TOON_THROW_DELAY later) etc. b) next suit, (TOON_THROW_SUIT_DELAY later) """ #import pdb; pdb.set_trace() if (len(throws) == 0): return (None, None) # Group the throws by targeted suit suitThrowsDict = {} # throw['toon'] is the thrower. for throw in throws: # TODO: Count suits, and if there is only one, save that variable. if attackAffectsGroup(throw['track'], throw['level']): #hmmm lets try throwing at all of them #for target in throw['target']: # suitId = targett['suit'].doId # if (suitThrowsDict.has_key(suitId)): # suitThrowsDict[suitId].append(throw) # else: # suitThrowsDict[suitId] = [throw] pass else: suitId = throw['target']['suit'].doId if (suitThrowsDict.has_key(suitId)): suitThrowsDict[suitId].append(throw) else: suitThrowsDict[suitId] = [throw] # A list of lists of throws grouped by suit suitThrows = suitThrowsDict.values() # Sort the suits based on the number of throws per suit def compFunc(a, b): if (len(a) > len(b)): return 1 elif (len(a) < len(b)): return -1 return 0 suitThrows.sort(compFunc) #since we have group throws now, we calculate how #many times each suit gets hit over here totalHitDict = {} singleHitDict = {} groupHitDict = {} for throw in throws: if attackAffectsGroup(throw['track'], throw['level']): for i in range(len(throw['target'])): target = throw['target'][i] suitId = target['suit'].doId if target['hp'] > 0: addHit(groupHitDict, suitId, 1) addHit(totalHitDict, suitId, 1) else: addHit(groupHitDict, suitId, 0) addHit(totalHitDict, suitId, 0) else: suitId = throw['target']['suit'].doId if throw['target']['hp'] > 0: addHit(singleHitDict, suitId, 1) addHit(totalHitDict, suitId, 1) else: addHit(singleHitDict, suitId, 0) addHit(totalHitDict, suitId, 0) notify.debug('singleHitDict = %s' % singleHitDict) notify.debug('groupHitDict = %s' % groupHitDict) notify.debug('totalHitDict = %s' % totalHitDict) # Apply attacks in order delay = 0.0 mtrack = Parallel() for st in suitThrows: if (len(st) > 0): ival = __doSuitThrows(st) if (ival): mtrack.append(Sequence(Wait(delay), ival)) delay = delay + TOON_THROW_SUIT_DELAY retTrack = Sequence() retTrack.append(mtrack) #we've done the single target throws, handle the group throws groupThrowIvals = Parallel() groupThrows = [] for throw in throws: # TODO: Count suits, and if there is only one, save that variable. if attackAffectsGroup(throw['track'], throw['level']): groupThrows.append(throw) for throw in groupThrows: tracks = None tracks = __throwGroupPie(throw, 0, groupHitDict) if (tracks): #groupThrowIvals.append(Sequence(Wait(delay), ival)) for track in tracks: groupThrowIvals.append(track) #delay = delay + TOON_THROW_SUIT_DELAY retTrack.append(groupThrowIvals) camDuration = retTrack.getDuration() camTrack = MovieCamera.chooseThrowShot(throws, suitThrowsDict, camDuration) return (retTrack, camTrack)
def __healDive(heal, hasInteractivePropHealBonus): """ __healJuggle(heal) """ # Determine if this is an NPC heal #print("heal Dive Anim") # Splash object for when toon hits the water splash = Splash.Splash(render) #remember to destroy splash.reparentTo(render) #import pdb; pdb.set_trace() npcId = 0 if (heal.has_key('npcId')): npcId = heal['npcId'] toon = NPCToons.createLocalNPC(npcId) if (toon == None): return None else: toon = heal['toon'] targets = heal['target'] ineffective = heal['sidestep'] level = heal['level'] #print("toonScale %s" % (toon.getBodyScale())) # Make a 'sandwich' around the track specific interval if (npcId != 0): track = Sequence(MovieNPCSOS.teleportIn(heal, toon)) else: track = Sequence(__runToHealSpot(heal)) delay = 7.0 first = 1 targetTrack = Sequence() for target in targets: targetToon = target['toon'] #hp = min(targetToon.hp + target['hp'], targetToon.maxHp) hp = target['hp'] reactIval = Func(__healToon, targetToon, hp, ineffective, hasInteractivePropHealBonus) if (first == 1): targetTrack.append(Wait(delay)) first = 0 targetTrack.append(reactIval) thisBattle = heal['battle'] toonsInBattle = thisBattle.toons glass = globalPropPool.getProp('glass') glass.setScale(4.0) glass.setHpr(0.0, 90.0, 0.0) ladder = globalPropPool.getProp('ladder') #MovieUtil.copyProp(cube) #placeNode = MovieUtil.copyProp(glass) placeNode = NodePath("lookNode") diveProps = [glass, ladder] #, placeNode] ladderScale = (toon.getBodyScale() / 0.66) scaleUpPoint = Point3(.50, .5, .45) * ladderScale basePos = toon.getPos() glassOffset = Point3(0, 1.1, 0.2) glassToonOffset = Point3(0, 1.2, 0.2) splashOffset = Point3(0, 1.0, 0.4) ladderOffset = Point3(0, 4, 0) ladderToonSep = Point3(0, 1, 0) * ladderScale diveOffset = Point3(0, 0, 10) divePos = add3(add3(ladderOffset, diveOffset), ladderToonSep) ladder.setH(toon.getH()) glassPos = render.getRelativePoint( toon, glassOffset) #add3(basePos, glassOffset) glassToonPos = render.getRelativePoint(toon, glassToonOffset) ladderPos = render.getRelativePoint(toon, ladderOffset) climbladderPos = render.getRelativePoint( toon, add3(ladderOffset, ladderToonSep)) #add3(basePos, ladderOffset) divePos = render.getRelativePoint(toon, divePos) topDivePos = render.getRelativePoint(toon, diveOffset) lookBase = render.getRelativePoint(toon, ladderOffset) lookTop = render.getRelativePoint(toon, add3(ladderOffset, diveOffset)) LookGlass = render.getRelativePoint(toon, glassOffset) splash.setPos(splashOffset) walkToLadderTime = 1.0 climbTime = 5.0 diveTime = 1.0 ladderGrowTime = 1.5 splash.setPos(glassPos) toonNode = toon.getGeomNode() #nameTagNode = NodePath(toon.nametag.getNametag3d()) #nameTagNode = NodePath(toon.getHeadParts()[0]) #placeNode = NodePath("lookNode") placeNode.reparentTo(render) placeNode.setScale(5.0) #placeNode.attachNewNode("lookNode") placeNode.setPos(toon.getPos(render)) placeNode.setHpr(toon.getHpr(render)) toonscale = toonNode.getScale() toonFacing = toon.getHpr() #for someToon in toonsInBattle: # someToon.startStareAt(nameTagNode, Point3(0,0,3)) #toonsLook(toonsInBattle, placeNode, Point3(0,0,3)) propTrack = Sequence( #Func(MovieUtil.showProps, cubes, hips), Func(MovieUtil.showProp, glass, render, glassPos), Func(MovieUtil.showProp, ladder, render, ladderPos), Func(toonsLook, toonsInBattle, placeNode, Point3(0, 0, 0)), Func(placeNode.setPos, lookBase), LerpScaleInterval(ladder, ladderGrowTime, scaleUpPoint, startScale=MovieUtil.PNT3_NEARZERO), Func(placeNode.setPos, lookTop), Wait(2.1), MovieCamera.toonGroupHighShot(None, 0), Wait(2.1), Func(placeNode.setPos, LookGlass), Wait(0.4), MovieCamera.allGroupLowShot(None, 0), Wait(1.8), LerpScaleInterval(ladder, ladderGrowTime, MovieUtil.PNT3_NEARZERO, startScale=scaleUpPoint), Func(MovieUtil.removeProps, diveProps), #Func(MovieUtil.removeProps, placeNode), ) mtrack = Parallel( propTrack, __getSoundTrack(level, 0.6, duration=9.0, node=toon), Sequence( Parallel( Sequence( ActorInterval(toon, 'walk', loop=0, duration=walkToLadderTime), ActorInterval(toon, 'neutral', loop=0, duration=0.1), ), LerpPosInterval(toon, walkToLadderTime, climbladderPos), Wait(ladderGrowTime), ), Parallel( ActorInterval(toon, 'climb', loop=0, endFrame=116), Sequence( Wait(4.6), #LerpScaleInterval(toon, diveTime*0.1, 0.1), #Func(toon.doToonAlphaColorScale, VBase4(1, 0.0, 1, 0.0), 0.5), Func(toonNode.setTransparency, 1), LerpColorScaleInterval(toonNode, 0.25, VBase4(1, 1.0, 1, 0.0), blendType='easeInOut'), LerpScaleInterval(toonNode, 0.01, 0.1, startScale=toonscale), LerpHprInterval(toon, 0.01, toonFacing), LerpPosInterval(toon, 0.0, glassToonPos), Func(toonNode.clearTransparency), Func(toonNode.clearColorScale), Parallel( ActorInterval(toon, 'swim', loop=1, startTime=0.0, endTime=1.00), Wait(1.0), ), # ), Sequence( Wait(4.6), Func(splash.play), Wait(1.0), Func(splash.destroy), ), ), #ActorInterval(toon, 'walk', loop = 1, duration=walkToLadderTime), #ActorInterval(toon, 'swim', loop = 1, duration=climbTime), #ActorInterval(toon, 'swim', loop = 1, duration=diveTime*1.0), #LerpScaleInterval(toon, diveTime*0.1, 0.1), Wait(0.5), Parallel( #LerpHprInterval(toon, 0.1, Point3(0,0,0)), ActorInterval(toon, 'jump', loop=0, startTime=0.2), LerpScaleInterval(toonNode, 0.5, toonscale, startScale=0.1), Func(stopLook, toonsInBattle), )), targetTrack) track.append(mtrack) if (npcId != 0): track.append(MovieNPCSOS.teleportOut(heal, toon)) else: track.append(__returnToBase(heal)) for target in targets: targetToon = target['toon'] track.append(Func(targetToon.clearChat)) return track
def doDrops(drops): if len(drops) == 0: return (None, None) npcArrivals, npcDepartures, npcs = MovieNPCSOS.doNPCTeleports(drops) suitDropsDict = {} groupDrops = [] for drop in drops: track = drop['track'] level = drop['level'] targets = drop['target'] if len(targets) == 1: suitId = targets[0]['suit'].doId if suitDropsDict.has_key(suitId): suitDropsDict[suitId].append((drop, targets[0])) else: suitDropsDict[suitId] = [(drop, targets[0])] elif level <= MAX_LEVEL_INDEX and attackAffectsGroup(track, level): groupDrops.append(drop) else: for target in targets: suitId = target['suit'].doId if suitDropsDict.has_key(suitId): otherDrops = suitDropsDict[suitId] alreadyInList = 0 for oDrop in otherDrops: if oDrop[0]['toon'] == drop['toon']: alreadyInList = 1 if alreadyInList == 0: suitDropsDict[suitId].append((drop, target)) else: suitDropsDict[suitId] = [(drop, target)] suitDrops = suitDropsDict.values() def compFunc(a, b): if len(a) > len(b): return 1 elif len(a) < len(b): return -1 return 0 suitDrops.sort(compFunc) delay = 0.0 mtrack = Parallel(name='toplevel-drop') npcDrops = {} for st in suitDrops: if len(st) > 0: ival = __doSuitDrops(st, npcs, npcDrops) if ival: mtrack.append(Sequence(Wait(delay), ival)) delay = delay + TOON_DROP_SUIT_DELAY dropTrack = Sequence(npcArrivals, mtrack, npcDepartures) camDuration = mtrack.getDuration() if groupDrops: ival = __doGroupDrops(groupDrops) dropTrack.append(ival) camDuration += ival.getDuration() enterDuration = npcArrivals.getDuration() exitDuration = npcDepartures.getDuration() camTrack = MovieCamera.chooseDropShot(drops, suitDropsDict, camDuration, enterDuration, exitDuration) return (dropTrack, camTrack)
def doTraps(traps): if len(traps) == 0: return (None, None) suitTrapsDict = {} for trap in traps: suitId = trap['target']['suit'].doId if suitTrapsDict.has_key(suitId): suitTrapsDict[suitId].append(trap) else: suitTrapsDict[suitId] = [trap] suitTrapLists = suitTrapsDict.values() ivals = [] for trapList in suitTrapLists: trapPropList = [] for i in range(len(trapList)): trap = trapList[i] level = trap['level'] if level == 0: banana = globalPropPool.getProp('banana') banana2 = MovieUtil.copyProp(banana) trapPropList.append([banana, banana2]) else: if level == 1: rake = globalPropPool.getProp('rake') rake2 = MovieUtil.copyProp(rake) rake.pose('rake', 0) rake2.pose('rake', 0) trapPropList.append([rake, rake2]) else: if level == 2: marbles = globalPropPool.getProp('marbles') marbles2 = MovieUtil.copyProp(marbles) trapPropList.append([marbles, marbles2]) else: if level == 3: trapPropList.append( [globalPropPool.getProp('quicksand')]) else: if level == 4: trapPropList.append( [globalPropPool.getProp('trapdoor')]) else: if level == 5: tnt = globalPropPool.getProp('tnt') tnt2 = MovieUtil.copyProp(tnt) trapPropList.append([tnt, tnt2]) else: notify.warning( '__doTraps() - Incorrect trap level: %d' % level) if len(trapList) == 1: ival = __doTrapLevel(trapList[0], trapPropList[0]) if ival: ivals.append(Track([ival])) else: subIvals = [] for i in range(len(trapList)): trap = trapList[i] trapProps = trapPropList[i] ival = __doTrapLevel(trap, trapProps, explode=1) if ival: subIvals.append(Track([ival])) ivals.append(MultiTrack(subIvals)) mtrack = MultiTrack(ivals) camDuration = mtrack.getDuration() camTrack = MovieCamera.chooseTrapShot(traps, camDuration) return (mtrack, camTrack) return
def __healDive(heal, hasInteractivePropHealBonus): splash = Splash.Splash(render) splash.reparentTo(render) npcId = 0 if "npcId" in heal: npcId = heal["npcId"] toon = NPCToons.createLocalNPC(npcId) if toon == None: return else: toon = heal["toon"] targets = heal["target"] ineffective = heal["sidestep"] level = heal["level"] if npcId != 0: track = Sequence(MovieNPCSOS.teleportIn(heal, toon)) else: track = Sequence(__runToHealSpot(heal)) delay = 7.0 first = 1 targetTrack = Sequence() for target in targets: targetToon = target["toon"] hp = target["hp"] reactIval = Func(__healToon, targetToon, hp, ineffective, hasInteractivePropHealBonus) if first == 1: targetTrack.append(Wait(delay)) first = 0 targetTrack.append(reactIval) thisBattle = heal["battle"] toonsInBattle = thisBattle.toons glass = globalPropPool.getProp("glass") glass.setScale(4.0) glass.setHpr(0.0, 90.0, 0.0) ladder = globalPropPool.getProp("ladder") placeNode = NodePath("lookNode") diveProps = [glass, ladder] ladderScale = toon.getBodyScale() / 0.66 scaleUpPoint = Point3(0.5, 0.5, 0.45) * ladderScale basePos = toon.getPos() glassOffset = Point3(0, 1.1, 0.2) glassToonOffset = Point3(0, 1.2, 0.2) splashOffset = Point3(0, 1.0, 0.4) ladderOffset = Point3(0, 4, 0) ladderToonSep = Point3(0, 1, 0) * ladderScale diveOffset = Point3(0, 0, 10) divePos = add3(add3(ladderOffset, diveOffset), ladderToonSep) ladder.setH(toon.getH()) glassPos = render.getRelativePoint(toon, glassOffset) glassToonPos = render.getRelativePoint(toon, glassToonOffset) ladderPos = render.getRelativePoint(toon, ladderOffset) climbladderPos = render.getRelativePoint(toon, add3(ladderOffset, ladderToonSep)) divePos = render.getRelativePoint(toon, divePos) topDivePos = render.getRelativePoint(toon, diveOffset) lookBase = render.getRelativePoint(toon, ladderOffset) lookTop = render.getRelativePoint(toon, add3(ladderOffset, diveOffset)) lookGlass = render.getRelativePoint(toon, glassOffset) splash.setPos(splashOffset) walkToLadderTime = 1.0 climbTime = 5.0 diveTime = 1.0 ladderGrowTime = 1.5 splash.setPos(glassPos) toonNode = toon.getGeomNode() placeNode.reparentTo(render) placeNode.setScale(5.0) placeNode.setPos(toon.getPos(render)) placeNode.setHpr(toon.getHpr(render)) toonscale = toonNode.getScale() toonFacing = toon.getHpr() if base.localAvatar in thisBattle.activeToons: propTrack = Sequence( Func(MovieUtil.showProp, glass, render, glassPos), Func(MovieUtil.showProp, ladder, render, ladderPos), Func(toonsLook, toonsInBattle, placeNode, Point3(0, 0, 0)), Func(placeNode.setPos, lookBase), LerpScaleInterval(ladder, ladderGrowTime, scaleUpPoint, startScale=MovieUtil.PNT3_NEARZERO), Func(placeNode.setPos, lookTop), Wait(2.1), MovieCamera.toonGroupHighShot(None, 0), Wait(2.1), Func(placeNode.setPos, lookGlass), Wait(0.4), MovieCamera.allGroupLowShot(None, 0), Wait(1.8), LerpScaleInterval(ladder, ladderGrowTime, MovieUtil.PNT3_NEARZERO, startScale=scaleUpPoint), Func(MovieUtil.removeProps, diveProps), ) else: propTrack = Sequence( Func(MovieUtil.showProp, glass, render, glassPos), Func(MovieUtil.showProp, ladder, render, ladderPos), Func(toonsLook, toonsInBattle, placeNode, Point3(0, 0, 0)), Func(placeNode.setPos, lookBase), LerpScaleInterval(ladder, ladderGrowTime, scaleUpPoint, startScale=MovieUtil.PNT3_NEARZERO), Func(placeNode.setPos, lookTop), Wait(4.2), Func(placeNode.setPos, lookGlass), Wait(2.2), LerpScaleInterval(ladder, ladderGrowTime, MovieUtil.PNT3_NEARZERO, startScale=scaleUpPoint), Func(MovieUtil.removeProps, diveProps), ) mtrack = Parallel( propTrack, __getSoundTrack(level, 0.6, duration=9.0, node=toon), Sequence( Parallel( Sequence( ActorInterval(toon, "walk", loop=0, duration=walkToLadderTime), ActorInterval(toon, "neutral", loop=0, duration=0.1), ), LerpPosInterval(toon, walkToLadderTime, climbladderPos), Wait(ladderGrowTime), ), Parallel( ActorInterval(toon, "climb", loop=0, endFrame=116), Sequence( Wait(4.6), Func(toonNode.setTransparency, 1), LerpColorScaleInterval(toonNode, 0.25, VBase4(1, 1.0, 1, 0.0), blendType="easeInOut"), LerpScaleInterval(toonNode, 0.01, 0.1, startScale=toonscale), LerpHprInterval(toon, 0.01, toonFacing), LerpPosInterval(toon, 0.0, glassToonPos), Func(toonNode.clearTransparency), Func(toonNode.clearColorScale), Parallel(ActorInterval(toon, "swim", loop=1, startTime=0.0, endTime=1.0), Wait(1.0)), ), Sequence(Wait(4.6), Func(splash.play), Wait(1.0), Func(splash.destroy)), ), Wait(0.5), Parallel( ActorInterval(toon, "jump", loop=0, startTime=0.2), LerpScaleInterval(toonNode, 0.5, toonscale, startScale=0.1), Func(stopLook, toonsInBattle), ), ), targetTrack, ) track.append(mtrack) if npcId != 0: track.append(MovieNPCSOS.teleportOut(heal, toon)) else: track.append(__returnToBase(heal)) for target in targets: targetToon = target["toon"] track.append(Func(targetToon.clearChat)) return track