import random from pandac.PandaModules import VBase3, Point3 from direct.interval.IntervalGlobal import Sequence, Wait, Func, Parallel, Track from direct.directnotify import DirectNotifyGlobal from toontown.battle import DistributedBattleFinal from toontown.suit import SuitTimings from toontown.toonbase import ToontownGlobals class DistributedBattleWaiters(DistributedBattleFinal.DistributedBattleFinal): notify = DirectNotifyGlobal.directNotify.newCategory('DistributedBattleWaiters') def __init__(self, cr): DistributedBattleFinal.DistributedBattleFinal.__init__(self, cr) self.initialReservesJoiningDone = False base.dbw = self def announceGenerate(self): DistributedBattleFinal.DistributedBattleFinal.announceGenerate(self) for suit in self.suits: suit.makeWaiter() self.moveSuitsToInitialPos() def showSuitsJoining(self, suits, ts, name, callback): if len(suits) == 0 and not self.initialReservesJoiningDone: self.initialReservesJoiningDone = True self.doInitialSuitsJoining(ts, name, callback) return self.showSuitsFalling(suits, ts, name, callback) def doInitialSuitsJoining(self, ts, name, callback): done = Func(callback) if self.hasLocalToon(): self.notify.debug('parenting camera to distributed battle waiters') camera.reparentTo(self) if random.choice([0, 1]): camera.setPosHpr(20, -4, 7, 60, 0, 0) else: camera.setPosHpr(-20, -4, 7, -60, 0, 0) track = Sequence(Wait(0.5), done, name=name) track.start(ts) self.storeInterval(track, name) def moveSuitsToInitialPos(self): battlePts = self.suitPoints[len(self.suitPendingPoints) - 1] for i in xrange(len(self.suits)): suit = self.suits[i] suit.reparentTo(self) destPos, destHpr = self.getActorPosHpr(suit, self.suits) suit.setPos(destPos) suit.setHpr(destHpr) def showSuitsFalling(self, suits, ts, name, callback): if self.bossCog == None: return suitTrack = Parallel() delay = 0 for suit in suits: suit.makeWaiter() suit.setState('Battle') if suit.dna.dept == 'l': suit.reparentTo(self.bossCog) suit.setPos(0, 0, 0) if suit in self.joiningSuits: i = len(self.pendingSuits) + self.joiningSuits.index(suit) destPos, h = self.suitPendingPoints[i] destHpr = VBase3(h, 0, 0) else: destPos, destHpr = self.getActorPosHpr(suit, self.suits) startPos = destPos + Point3(0, 0, SuitTimings.fromSky * ToontownGlobals.SuitWalkSpeed) self.notify.debug('startPos for %s = %s' % (suit, startPos)) suit.reparentTo(self) suit.setPos(startPos) suit.headsUp(self) flyIval = suit.beginSupaFlyMove(destPos, True, 'flyIn') suitTrack.append(Track((delay, Sequence(flyIval, Func(suit.loop, 'neutral'))))) delay += 1 if self.hasLocalToon(): camera.reparentTo(self) if random.choice([0, 1]): camera.setPosHpr(20, -4, 7, 60, 0, 0) else: camera.setPosHpr(-20, -4, 7, -60, 0, 0) done = Func(callback) track = Sequence(suitTrack, done, name=name) track.start(ts) self.storeInterval(track, name) return def enterWaitForInput(self, ts = 0): DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput(self, ts) if self.hasLocalToon(): camera.reparentTo(self)