ToonTownRewritten/toontown/battle/DistributedBattleWaiters.py

94 lines
3.7 KiB
Python

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)