Poodletooth-iLand/toontown/battle/DistributedBattle.py
2015-03-03 17:10:12 -05:00

233 lines
9.9 KiB
Python

from direct.directnotify import DirectNotifyGlobal
from direct.interval.IntervalGlobal import *
from pandac.PandaModules import *
import random
from BattleBase import *
import DistributedBattleBase
import SuitBattleGlobals
from otp.avatar import Emote
from toontown.chat.ChatGlobals import *
from toontown.distributed import DelayDelete
from toontown.nametag import NametagGlobals
from toontown.toonbase import ToontownBattleGlobals
class DistributedBattle(DistributedBattleBase.DistributedBattleBase):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedBattle')
camFOFov = ToontownBattleGlobals.BattleCamFaceOffFov
camFOPos = ToontownBattleGlobals.BattleCamFaceOffPos
PlayGameSetPlaceEvent = 'playGameSetPlace'
def __init__(self, cr):
townBattle = cr.playGame.hood.loader.townBattle
DistributedBattleBase.DistributedBattleBase.__init__(self, cr, townBattle)
self.setupCollisions(self.uniqueBattleName('battle-collide'))
def generate(self):
DistributedBattleBase.DistributedBattleBase.generate(self)
def announceGenerate(self):
DistributedBattleBase.DistributedBattleBase.generate(self)
def disable(self):
DistributedBattleBase.DistributedBattleBase.disable(self)
self.ignore(self.PlayGameSetPlaceEvent)
def delete(self):
DistributedBattleBase.DistributedBattleBase.delete(self)
self.ignore(self.PlayGameSetPlaceEvent)
self.removeCollisionData()
def setInteractivePropTrackBonus(self, trackBonus):
DistributedBattleBase.DistributedBattleBase.setInteractivePropTrackBonus(self, trackBonus)
if self.interactivePropTrackBonus >= 0:
if base.cr.playGame.hood:
self.calcInteractiveProp()
else:
self.acceptOnce(self.PlayGameSetPlaceEvent, self.calcInteractiveProp)
def calcInteractiveProp(self):
if base.cr.playGame.hood:
loader = base.cr.playGame.hood.loader
if hasattr(loader, 'getInteractiveProp'):
self.interactiveProp = loader.getInteractiveProp(self.zoneId)
self.notify.debug('self.interactiveProp = %s' % self.interactiveProp)
else:
self.notify.warning('no loader.getInteractiveProp self.interactiveProp is None')
else:
self.notify.warning('no hood self.interactiveProp is None')
def setMembers(self, suits, suitsJoining, suitsPending, suitsActive, suitsLured, suitTraps, toons, toonsJoining, toonsPending, toonsActive, toonsRunning, timestamp):
if self.battleCleanedUp():
return
oldtoons = DistributedBattleBase.DistributedBattleBase.setMembers(self, suits, suitsJoining, suitsPending, suitsActive, suitsLured, suitTraps, toons, toonsJoining, toonsPending, toonsActive, toonsRunning, timestamp)
if len(self.toons) == 4 and len(oldtoons) < 4:
self.notify.debug('setMembers() - battle is now full of toons')
self.closeBattleCollision()
elif len(self.toons) < 4 and len(oldtoons) == 4:
self.openBattleCollision()
def __faceOff(self, ts, name, callback):
if len(self.suits) == 0:
self.notify.warning('__faceOff(): no suits.')
return
if len(self.toons) == 0:
self.notify.warning('__faceOff(): no toons.')
return
suit = self.suits[0]
point = self.suitPoints[0][0]
suitPos = point[0]
suitHpr = VBase3(point[1], 0.0, 0.0)
toon = self.toons[0]
point = self.toonPoints[0][0]
toonPos = point[0]
toonHpr = VBase3(point[1], 0.0, 0.0)
p = toon.getPos(self)
toon.setPos(self, p[0], p[1], 0.0)
toon.setShadowHeight(0)
suit.setState('Battle')
suitTrack = Sequence()
toonTrack = Sequence()
suitTrack.append(Func(suit.loop, 'neutral'))
suitTrack.append(Func(suit.headsUp, toon))
taunt = SuitBattleGlobals.getFaceoffTaunt(suit.getStyleName(), suit.doId)
suitTrack.append(Func(suit.setChatAbsolute, taunt, CFSpeech | CFTimeout))
toonTrack.append(Func(toon.loop, 'neutral'))
toonTrack.append(Func(toon.headsUp, suit))
suitHeight = suit.getHeight()
suitOffsetPnt = Point3(0, 0, suitHeight)
faceoffTime = self.calcFaceoffTime(self.getPos(), self.initialSuitPos)
faceoffTime = max(faceoffTime, BATTLE_SMALL_VALUE)
delay = FACEOFF_TAUNT_T
if self.hasLocalToon():
MidTauntCamHeight = suitHeight * 0.66
MidTauntCamHeightLim = suitHeight - 1.8
if MidTauntCamHeight < MidTauntCamHeightLim:
MidTauntCamHeight = MidTauntCamHeightLim
TauntCamY = 16
TauntCamX = random.choice((-5, 5))
TauntCamHeight = random.choice((MidTauntCamHeight, 1, 11))
camTrack = Sequence()
camTrack.append(Func(camera.wrtReparentTo, suit))
camTrack.append(Func(base.camLens.setMinFov, self.camFOFov/(4./3.)))
camTrack.append(Func(camera.setPos, TauntCamX, TauntCamY, TauntCamHeight))
camTrack.append(Func(camera.lookAt, suit, suitOffsetPnt))
camTrack.append(Wait(delay))
camTrack.append(Func(base.camLens.setMinFov, self.camFov/(4./3.)))
camTrack.append(Func(camera.wrtReparentTo, self))
camTrack.append(Func(camera.setPos, self.camFOPos))
camTrack.append(Func(camera.lookAt, suit.getPos(self)))
camTrack.append(Wait(faceoffTime))
if self.interactiveProp:
camTrack.append(Func(camera.lookAt, self.interactiveProp.node.getPos(self)))
camTrack.append(Wait(FACEOFF_LOOK_AT_PROP_T))
suitTrack.append(Wait(delay))
toonTrack.append(Wait(delay))
suitTrack.append(Func(suit.headsUp, self, suitPos))
suitTrack.append(Func(suit.clearChat))
toonTrack.append(Func(toon.headsUp, self, toonPos))
suitTrack.append(Func(suit.loop, 'walk'))
suitTrack.append(LerpPosInterval(suit, faceoffTime, suitPos, other=self))
suitTrack.append(Func(suit.loop, 'neutral'))
suitTrack.append(Func(suit.setHpr, self, suitHpr))
toonTrack.append(Func(toon.loop, 'run'))
toonTrack.append(LerpPosInterval(toon, faceoffTime, toonPos, other=self))
toonTrack.append(Func(toon.loop, 'neutral'))
toonTrack.append(Func(toon.setHpr, self, toonHpr))
if base.localAvatar == toon:
soundTrack = Sequence(Wait(delay), SoundInterval(base.localAvatar.soundRun, loop=1, duration=faceoffTime, node=base.localAvatar))
else:
soundTrack = Wait(delay + faceoffTime)
mtrack = Parallel(suitTrack, toonTrack, soundTrack)
if self.hasLocalToon():
NametagGlobals.setWant2dNametags(False)
mtrack = Parallel(mtrack, camTrack)
done = Func(callback)
track = Sequence(mtrack, done, name=name)
track.delayDeletes = [DelayDelete.DelayDelete(toon, '__faceOff'), DelayDelete.DelayDelete(suit, '__faceOff')]
track.start(ts)
self.storeInterval(track, name)
def enterFaceOff(self, ts):
self.notify.debug('enterFaceOff()')
self.delayDeleteMembers()
if len(self.toons) > 0 and base.localAvatar == self.toons[0]:
Emote.globalEmote.disableAll(self.toons[0], 'dbattle, enterFaceOff')
self.__faceOff(ts, self.faceOffName, self.__handleFaceOffDone)
if self.interactiveProp:
self.interactiveProp.gotoFaceoff()
def __handleFaceOffDone(self):
self.notify.debug('FaceOff done')
if len(self.toons) > 0 and base.localAvatar == self.toons[0]:
self.d_faceOffDone(base.localAvatar.doId)
def exitFaceOff(self):
self.notify.debug('exitFaceOff()')
if len(self.toons) > 0 and base.localAvatar == self.toons[0]:
Emote.globalEmote.releaseAll(self.toons[0], 'dbattle exitFaceOff')
self.finishInterval(self.faceOffName)
self.clearInterval(self.faceOffName)
self._removeMembersKeep()
def enterReward(self, ts):
self.notify.debug('enterReward()')
self.disableCollision()
self.delayDeleteMembers()
Emote.globalEmote.disableAll(base.localAvatar, 'dbattle, enterReward')
if self.hasLocalToon():
NametagGlobals.setWant2dNametags(False)
if self.localToonActive() == 0:
self.removeInactiveLocalToon(base.localAvatar)
for toon in self.toons:
toon.startSmooth()
self.accept('resumeAfterReward', self.handleResumeAfterReward)
if self.interactiveProp:
self.interactiveProp.gotoVictory()
self.playReward(ts)
def playReward(self, ts):
self.movie.playReward(ts, self.uniqueName('reward'), self.handleRewardDone)
def handleRewardDone(self):
self.notify.debug('Reward done')
if self.hasLocalToon():
self.d_rewardDone(base.localAvatar.doId)
self.movie.resetReward()
messenger.send('resumeAfterReward')
def handleResumeAfterReward(self):
self.fsm.request('Resume')
def exitReward(self):
self.notify.debug('exitReward()')
self.ignore('resumeAfterReward')
self.movie.resetReward(finish=1)
self._removeMembersKeep()
NametagGlobals.setWant2dNametags(True)
Emote.globalEmote.releaseAll(base.localAvatar, 'dbattle, exitReward')
def enterResume(self, ts = 0):
self.notify.debug('enterResume()')
if self.hasLocalToon():
self.removeLocalToon()
if self.interactiveProp:
self.interactiveProp.requestIdleOrSad()
def exitResume(self):
pass
def enterNoLocalToon(self):
self.notify.debug('enterNoLocalToon()')
self.enableCollision()
def exitNoLocalToon(self):
self.disableCollision()
def enterWaitForServer(self):
self.notify.debug('enterWaitForServer()')
def exitWaitForServer(self):
pass