ToonTownRewritten/toontown/battle/Movie.py

909 lines
36 KiB
Python

from toontown.toonbase.ToontownBattleGlobals import *
from BattleBase import *
from direct.interval.IntervalGlobal import *
from direct.showbase import DirectObject
import MovieFire
import MovieSOS
import MovieNPCSOS
import MoviePetSOS
import MovieHeal
import MovieTrap
import MovieLure
import MovieSound
import MovieThrow
import MovieSquirt
import MovieDrop
import MovieSuitAttacks
import MovieToonVictory
import PlayByPlayText
import BattleParticles
from toontown.distributed import DelayDelete
import BattleExperience
from SuitBattleGlobals import *
from direct.directnotify import DirectNotifyGlobal
import RewardPanel
import random
import MovieUtil
from toontown.toon import Toon
from toontown.toonbase import ToontownGlobals
from toontown.toontowngui import TTDialog
import copy
from toontown.toonbase import TTLocalizer
from toontown.toon import NPCToons
from otp.nametag.NametagConstants import *
from otp.nametag import NametagGlobals
camPos = Point3(14, 0, 10)
camHpr = Vec3(89, -30, 0)
randomBattleTimestamp = 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 NPCToons
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 = NPCToons.createLocalNPC(20000)
self.tutorialTom.uniqueName = uniqueName
if config.GetString('language', 'english') == 'japanese':
self.tomDialogue03 = base.loadSfx('phase_3.5/audio/dial/CC_tom_movie_tutorial_reward01.ogg')
self.tomDialogue04 = base.loadSfx('phase_3.5/audio/dial/CC_tom_movie_tutorial_reward02.ogg')
self.tomDialogue05 = base.loadSfx('phase_3.5/audio/dial/CC_tom_movie_tutorial_reward03.ogg')
self.musicVolume = 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 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]
if adict.has_key('npcId'):
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 ta.has_key('special'):
tp.append(ta)
if track == SQUIRT:
setCapture = 1
if track == TRAP:
sortedTraps = []
for attack in tp:
if not attack.has_key('npcId'):
sortedTraps.append(attack)
for attack in tp:
if attack.has_key('npcId'):
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:
# TODO: Realistically fix this. This issue was becoming a pain in the butthole
# whenever anyone entered SBHQ. This is a 'hackfix' and should be removed/fixed
# asap.
continue
#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 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