import copy from direct.directnotify import DirectNotifyGlobal from direct.interval.IntervalGlobal import * from direct.showbase import DirectObject import random from BattleBase import * import BattleExperience import BattleParticles import MovieDrop import MovieFire import MovieHeal import MovieLure import MovieNPCSOS import MoviePetSOS import MovieSOS import MovieSound import MovieSquirt import MovieSuitAttacks import MovieThrow import MovieToonVictory import MovieTrap import MovieUtil import PlayByPlayText import RewardPanel from SuitBattleGlobals import * from toontown.chat.ChatGlobals import * from toontown.distributed import DelayDelete from toontown.toon import NPCToons from toontown.toon import Toon from toontown.toonbase import TTLocalizer from toontown.toonbase import ToontownGlobals from toontown.toonbase.ToontownBattleGlobals import * from toontown.toontowngui import TTDialog from toontown.nametag import NametagGlobals 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.tutRewardDialog = None 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 xrange(0, parts.getNumPaths()): nextPart = parts.getPath(partNum) nextPart.clearColorScale() nextPart.clearTransparency() if self.restoreHips == 1: parts = toon.getHipsParts() for partNum in xrange(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 xrange(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 xrange(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.rewardPanel.initGagFrame(base.localAvatar, [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0], noSkip=True) self.playTutorialReward_1(None, self.toonRewardDicts[0]['earnedExp']) def playTutorialReward_1(self, result, earnedXp, tutTrack=0): if self.tutRewardDialog: self.tutRewardDialog.cleanup() elif tutTrack >= len(earnedXp): self.playTutorialReward_2() return xp = earnedXp[tutTrack] if xp > 0: self.tutRewardDialog = TTDialog.TTDialog(text=TTLocalizer.MovieTutorialReward1 % (xp, TTLocalizer.BattleGlobalTracks[tutTrack].capitalize()), command=self.playTutorialReward_1, extraArgs=[earnedXp, tutTrack + 1], style=TTDialog.Acknowledge, fadeScreen=None, pos=(0.65, 0, 0.5), scale=0.8) sequence = Sequence() sequence += self.rewardPanel.getTrackIntervalList(base.localAvatar, tutTrack, 0, xp, 0) sequence.start() else: self.playTutorialReward_1(None, earnedXp, tutTrack + 1) def playTutorialReward_2(self, value=None): 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() dna.newToonFromProperties(*('dls', 'ms', 'm', 'm', 7, 0, 7, 7, 2, 6, 2, 6, 2, 16, 0)) self.tutorialTom.setDNA(dna) self.tutorialTom.setName(TTLocalizer.NPCToonNames[20000]) self.tutorialTom.setPickable(0) self.tutorialTom.setPlayerType(NametagGlobals.CCNonPlayer) self.tutorialTom.uniqueName = uniqueName 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, [None]), name='tutorial-reward-3a') self.track2 = Sequence(Func(self.acceptOnce, self.tutorialTom.uniqueName('doneChatPage'), doneChat2), Func(self.tutorialTom.setLocalPageChat, TTLocalizer.MovieTutorialReward4, 1, None, [None]), 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), Wait(1.0), Func(self.tutorialTom.animFSM.request, 'TeleportOut'), Wait(self.tutorialTom.getDuration('teleport')), Wait(1.0), Func(self.playTutorialReward_3, 0), name='tutorial-reward-3cb'), name='tutorial-reward-3c') self.track1.start() else: self.playTutorialReward_3() def playTutorialReward_3(self, value=None): base.localAvatar.setH(270) self.tutorialTom.removeActive() self.tutorialTom.delete() self.questList = None self.rewardCallback() 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) ival, camIval = MovieHeal.doHeals(self.__findToonAttack(HEAL), self.battle.getInteractivePropTrackBonus() == HEAL) 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 xrange(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 xrange(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] if 'npcId' in adict: 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 self.toonAttackDicts.sort(compFunc) return def __findToonAttack(self, track): setCapture = 0 tp = [] for ta in self.toonAttackDicts: if ta['track'] == track or track == NPCSOS and 'sepcial' in ta: tp.append(ta) if track == SQUIRT: setCapture = 1 if track == TRAP: sortedTraps = [] for attack in tp: if 'npcId' not in attack: sortedTraps.append(attack) for attack in tp: if 'npcId' in attack: 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.warning('suit: %d not in battle!' % suitId) return 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 xrange(0, toonIndex): rightToons.append(self.battle.activeToons[ti]) lenToons = len(self.battle.activeToons) leftToons = [] if lenToons > toonIndex + 1: for ti in xrange(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