1848 lines
82 KiB
Python
1848 lines
82 KiB
Python
|
from direct.showbase.ShowBase import *
|
||
|
from direct.interval.IntervalGlobal import *
|
||
|
from toontown.battle.BattleProps import *
|
||
|
from direct.distributed.ClockDelta import *
|
||
|
from direct.showbase.PythonUtil import Functor
|
||
|
from direct.showbase.PythonUtil import StackTrace
|
||
|
from direct.gui.DirectGui import *
|
||
|
from panda3d.core import *
|
||
|
from libotp import *
|
||
|
from direct.fsm import FSM
|
||
|
from direct.fsm import ClassicFSM
|
||
|
from direct.fsm import State
|
||
|
from direct.directnotify import DirectNotifyGlobal
|
||
|
from toontown.toonbase import ToontownGlobals
|
||
|
from toontown.toonbase import ToontownBattleGlobals
|
||
|
import DistributedBossCog
|
||
|
from toontown.toonbase import TTLocalizer
|
||
|
import SuitDNA
|
||
|
from toontown.toon import Toon
|
||
|
from toontown.battle import BattleBase
|
||
|
from direct.directutil import Mopath
|
||
|
from direct.showutil import Rope
|
||
|
from toontown.distributed import DelayDelete
|
||
|
from toontown.battle import MovieToonVictory
|
||
|
from toontown.building import ElevatorUtils
|
||
|
from toontown.battle import RewardPanel
|
||
|
from toontown.toon import NPCToons
|
||
|
from direct.task import Task
|
||
|
import random
|
||
|
import math
|
||
|
from toontown.coghq import CogDisguiseGlobals
|
||
|
from toontown.building import ElevatorConstants
|
||
|
from toontown.toonbase import ToontownTimer
|
||
|
OneBossCog = None
|
||
|
|
||
|
class DistributedLawbotBoss(DistributedBossCog.DistributedBossCog, FSM.FSM):
|
||
|
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedLawbotBoss')
|
||
|
debugPositions = False
|
||
|
|
||
|
def __init__(self, cr):
|
||
|
self.notify.debug('----- __init___')
|
||
|
DistributedBossCog.DistributedBossCog.__init__(self, cr)
|
||
|
FSM.FSM.__init__(self, 'DistributedLawbotBoss')
|
||
|
self.lawyers = []
|
||
|
self.lawyerRequest = None
|
||
|
self.bossDamage = 0
|
||
|
self.attackCode = None
|
||
|
self.attackAvId = 0
|
||
|
self.recoverRate = 0
|
||
|
self.recoverStartTime = 0
|
||
|
self.bossDamageMovie = None
|
||
|
self.everThrownPie = 0
|
||
|
self.battleThreeMusicTime = 0
|
||
|
self.insidesANodePath = None
|
||
|
self.insidesBNodePath = None
|
||
|
self.strafeInterval = None
|
||
|
self.onscreenMessage = None
|
||
|
self.bossMaxDamage = ToontownGlobals.LawbotBossMaxDamage
|
||
|
self.elevatorType = ElevatorConstants.ELEVATOR_CJ
|
||
|
self.gavels = {}
|
||
|
self.chairs = {}
|
||
|
self.cannons = {}
|
||
|
self.useCannons = 1
|
||
|
self.juryBoxIval = None
|
||
|
self.juryTimer = None
|
||
|
self.witnessToon = None
|
||
|
self.witnessToonOnstage = False
|
||
|
self.numToonJurorsSeated = 0
|
||
|
self.mainDoor = None
|
||
|
self.reflectedMainDoor = None
|
||
|
self.panFlashInterval = None
|
||
|
self.panDamage = ToontownGlobals.LawbotBossDefensePanDamage
|
||
|
if base.config.GetBool('lawbot-boss-cheat', 0):
|
||
|
self.panDamage = 25
|
||
|
self.evidenceHitSfx = None
|
||
|
self.toonUpSfx = None
|
||
|
self.bonusTimer = None
|
||
|
self.warningSfx = None
|
||
|
self.juryMovesSfx = None
|
||
|
self.baseColStashed = False
|
||
|
self.battleDifficulty = 0
|
||
|
self.bonusWeight = 0
|
||
|
self.numJurorsLocalToonSeated = 0
|
||
|
self.cannonIndex = -1
|
||
|
return
|
||
|
|
||
|
def announceGenerate(self):
|
||
|
global OneBossCog
|
||
|
self.notify.debug('----- announceGenerate')
|
||
|
DistributedBossCog.DistributedBossCog.announceGenerate(self)
|
||
|
self.setName(TTLocalizer.LawbotBossName)
|
||
|
nameInfo = TTLocalizer.BossCogNameWithDept % {'name': self._name,
|
||
|
'dept': SuitDNA.getDeptFullname(self.style.dept)}
|
||
|
self.setDisplayName(nameInfo)
|
||
|
self.piesRestockSfx = loader.loadSfx('phase_5/audio/sfx/LB_receive_evidence.ogg')
|
||
|
self.rampSlideSfx = loader.loadSfx('phase_9/audio/sfx/CHQ_VP_ramp_slide.ogg')
|
||
|
self.evidenceHitSfx = loader.loadSfx('phase_11/audio/sfx/LB_evidence_hit.ogg')
|
||
|
self.warningSfx = loader.loadSfx('phase_9/audio/sfx/CHQ_GOON_tractor_beam_alarmed.ogg')
|
||
|
self.juryMovesSfx = loader.loadSfx('phase_11/audio/sfx/LB_jury_moves.ogg')
|
||
|
self.toonUpSfx = loader.loadSfx('phase_11/audio/sfx/LB_toonup.ogg')
|
||
|
self.strafeSfx = []
|
||
|
for i in xrange(10):
|
||
|
self.strafeSfx.append(loader.loadSfx('phase_3.5/audio/sfx/SA_shred.ogg'))
|
||
|
|
||
|
render.setTag('pieCode', str(ToontownGlobals.PieCodeNotBossCog))
|
||
|
insidesA = CollisionPolygon(Point3(4.0, -2.0, 5.0), Point3(-4.0, -2.0, 5.0), Point3(-4.0, -2.0, 0.5), Point3(4.0, -2.0, 0.5))
|
||
|
insidesANode = CollisionNode('BossZap')
|
||
|
insidesANode.addSolid(insidesA)
|
||
|
insidesANode.setCollideMask(ToontownGlobals.PieBitmask | ToontownGlobals.WallBitmask)
|
||
|
self.insidesANodePath = self.axle.attachNewNode(insidesANode)
|
||
|
self.insidesANodePath.setTag('pieCode', str(ToontownGlobals.PieCodeBossInsides))
|
||
|
self.insidesANodePath.stash()
|
||
|
insidesB = CollisionPolygon(Point3(-4.0, 2.0, 5.0), Point3(4.0, 2.0, 5.0), Point3(4.0, 2.0, 0.5), Point3(-4.0, 2.0, 0.5))
|
||
|
insidesBNode = CollisionNode('BossZap')
|
||
|
insidesBNode.addSolid(insidesB)
|
||
|
insidesBNode.setCollideMask(ToontownGlobals.PieBitmask | ToontownGlobals.WallBitmask)
|
||
|
self.insidesBNodePath = self.axle.attachNewNode(insidesBNode)
|
||
|
self.insidesBNodePath.setTag('pieCode', str(ToontownGlobals.PieCodeBossInsides))
|
||
|
self.insidesBNodePath.stash()
|
||
|
target = CollisionTube(0, -1, 4, 0, -1, 9, 3.5)
|
||
|
targetNode = CollisionNode('BossZap')
|
||
|
targetNode.addSolid(target)
|
||
|
targetNode.setCollideMask(ToontownGlobals.PieBitmask)
|
||
|
self.targetNodePath = self.pelvis.attachNewNode(targetNode)
|
||
|
self.targetNodePath.setTag('pieCode', str(ToontownGlobals.PieCodeBossCog))
|
||
|
shield = CollisionTube(0, 1, 4, 0, 1, 7, 3.5)
|
||
|
shieldNode = CollisionNode('BossZap')
|
||
|
shieldNode.addSolid(shield)
|
||
|
shieldNode.setCollideMask(ToontownGlobals.PieBitmask | ToontownGlobals.CameraBitmask)
|
||
|
shieldNodePath = self.pelvis.attachNewNode(shieldNode)
|
||
|
disk = loader.loadModel('phase_9/models/char/bossCog-gearCollide')
|
||
|
disk.find('**/+CollisionNode').setName('BossZap')
|
||
|
disk.reparentTo(self.pelvis)
|
||
|
disk.setZ(0.8)
|
||
|
self.loadEnvironment()
|
||
|
self.__makeWitnessToon()
|
||
|
self.__loadMopaths()
|
||
|
localAvatar.chatMgr.chatInputSpeedChat.addCJMenu()
|
||
|
if OneBossCog != None:
|
||
|
self.notify.warning('Multiple BossCogs visible.')
|
||
|
OneBossCog = self
|
||
|
return
|
||
|
|
||
|
def disable(self):
|
||
|
global OneBossCog
|
||
|
self.notify.debug('----- disable')
|
||
|
DistributedBossCog.DistributedBossCog.disable(self)
|
||
|
self.request('Off')
|
||
|
self.unloadEnvironment()
|
||
|
self.__cleanupWitnessToon()
|
||
|
self.__unloadMopaths()
|
||
|
self.__clearOnscreenMessage()
|
||
|
taskMgr.remove(self.uniqueName('PieAdvice'))
|
||
|
self.__cleanupStrafe()
|
||
|
self.__cleanupJuryBox()
|
||
|
render.clearTag('pieCode')
|
||
|
self.targetNodePath.detachNode()
|
||
|
self.cr.relatedObjectMgr.abortRequest(self.lawyerRequest)
|
||
|
self.lawyerRequest = None
|
||
|
self.betweenBattleMusic.stop()
|
||
|
self.promotionMusic.stop()
|
||
|
self.stingMusic.stop()
|
||
|
self.battleTwoMusic.stop()
|
||
|
self.battleThreeMusic.stop()
|
||
|
self.epilogueMusic.stop()
|
||
|
if self.juryTimer:
|
||
|
self.juryTimer.destroy()
|
||
|
del self.juryTimer
|
||
|
if self.bonusTimer:
|
||
|
self.bonusTimer.destroy()
|
||
|
del self.bonusTimer
|
||
|
localAvatar.chatMgr.chatInputSpeedChat.removeCJMenu()
|
||
|
if OneBossCog == self:
|
||
|
OneBossCog = None
|
||
|
return
|
||
|
|
||
|
def delete(self):
|
||
|
self.notify.debug('----- delete')
|
||
|
DistributedBossCog.DistributedBossCog.delete(self)
|
||
|
|
||
|
def d_hitBoss(self, bossDamage):
|
||
|
self.notify.debug('----- d_hitBoss')
|
||
|
self.sendUpdate('hitBoss', [bossDamage])
|
||
|
|
||
|
def d_healBoss(self, bossHeal):
|
||
|
self.notify.debug('----- d_bossHeal')
|
||
|
self.sendUpdate('healBoss', [bossHeal])
|
||
|
|
||
|
def d_hitBossInsides(self):
|
||
|
self.notify.debug('----- d_hitBossInsides')
|
||
|
self.sendUpdate('hitBossInsides', [])
|
||
|
|
||
|
def d_hitDefensePan(self):
|
||
|
self.notify.debug('----- d_hitDefensePan')
|
||
|
self.sendUpdate('hitDefensePan', [])
|
||
|
|
||
|
def d_hitProsecutionPan(self):
|
||
|
self.notify.debug('----- d_hitProsecutionPan')
|
||
|
self.sendUpdate('hitProsecutionPan', [])
|
||
|
|
||
|
def d_hitToon(self, toonId):
|
||
|
self.notify.debug('----- d_hitToon')
|
||
|
self.sendUpdate('hitToon', [toonId])
|
||
|
|
||
|
def gotToon(self, toon):
|
||
|
stateName = self.state
|
||
|
if stateName == 'Elevator':
|
||
|
self.placeToonInElevator(toon)
|
||
|
|
||
|
def setLawyerIds(self, lawyerIds):
|
||
|
self.lawyers = []
|
||
|
self.cr.relatedObjectMgr.abortRequest(self.lawyerRequest)
|
||
|
self.lawyerRequest = self.cr.relatedObjectMgr.requestObjects(lawyerIds, allCallback=self.__gotLawyers)
|
||
|
|
||
|
def __gotLawyers(self, lawyers):
|
||
|
self.lawyerRequest = None
|
||
|
self.lawyers = lawyers
|
||
|
for i in xrange(len(self.lawyers)):
|
||
|
suit = self.lawyers[i]
|
||
|
suit.fsm.request('neutral')
|
||
|
suit.loop('neutral')
|
||
|
suit.setBossCogId(self.doId)
|
||
|
|
||
|
return
|
||
|
|
||
|
def setBossDamage(self, bossDamage, recoverRate, timestamp):
|
||
|
recoverStartTime = globalClockDelta.networkToLocalTime(timestamp)
|
||
|
self.bossDamage = bossDamage
|
||
|
self.recoverRate = recoverRate
|
||
|
self.recoverStartTime = recoverStartTime
|
||
|
taskName = 'RecoverBossDamage'
|
||
|
taskMgr.remove(taskName)
|
||
|
if self.bossDamageMovie:
|
||
|
if self.bossDamage >= self.bossMaxDamage:
|
||
|
self.notify.debug('finish the movie then transition to NearVictory')
|
||
|
self.bossDamageMovie.resumeUntil(self.bossDamageMovie.getDuration())
|
||
|
else:
|
||
|
self.bossDamageMovie.resumeUntil(self.bossDamage * self.bossDamageToMovie)
|
||
|
if self.recoverRate:
|
||
|
taskMgr.add(self.__recoverBossDamage, taskName)
|
||
|
self.makeScaleReflectDamage()
|
||
|
|
||
|
def getBossDamage(self):
|
||
|
self.notify.debug('----- getBossDamage')
|
||
|
now = globalClock.getFrameTime()
|
||
|
elapsed = now - self.recoverStartTime
|
||
|
return max(self.bossDamage - self.recoverRate * elapsed / 60.0, 0)
|
||
|
|
||
|
def __recoverBossDamage(self, task):
|
||
|
self.notify.debug('----- __recoverBossDamage')
|
||
|
if self.bossDamageMovie:
|
||
|
self.bossDamageMovie.setT(self.getBossDamage() * self.bossDamageToMovie)
|
||
|
return Task.cont
|
||
|
|
||
|
def __walkToonToPromotion(self, toonId, delay, mopath, track, delayDeletes):
|
||
|
self.notify.debug('----- __walkToonToPromotion')
|
||
|
toon = base.cr.doId2do.get(toonId)
|
||
|
if toon:
|
||
|
destPos = toon.getPos()
|
||
|
self.placeToonInElevator(toon)
|
||
|
toon.wrtReparentTo(render)
|
||
|
ival = Sequence(Wait(delay), Func(toon.suit.setPlayRate, 1, 'walk'), Func(toon.suit.loop, 'walk'), toon.posInterval(1, Point3(0, 90, 20)), ParallelEndTogether(MopathInterval(mopath, toon), toon.posInterval(2, destPos, blendType='noBlend')), Func(toon.suit.loop, 'neutral'))
|
||
|
track.append(ival)
|
||
|
delayDeletes.append(DelayDelete.DelayDelete(toon, 'LawbotBoss.__walkToonToPromotion'))
|
||
|
|
||
|
def __walkSuitToPoint(self, node, fromPos, toPos):
|
||
|
self.notify.debug('----- __walkSuitToPoint')
|
||
|
vector = Vec3(toPos - fromPos)
|
||
|
distance = vector.length()
|
||
|
time = distance / (ToontownGlobals.SuitWalkSpeed * 1.8)
|
||
|
return Sequence(Func(node.setPos, fromPos), Func(node.headsUp, toPos), node.posInterval(time, toPos))
|
||
|
|
||
|
def __makeRollToBattleTwoMovie(self):
|
||
|
startPos = Point3(ToontownGlobals.LawbotBossBattleOnePosHpr[0], ToontownGlobals.LawbotBossBattleOnePosHpr[1], ToontownGlobals.LawbotBossBattleOnePosHpr[2])
|
||
|
if self.arenaSide:
|
||
|
topRampPos = Point3(*ToontownGlobals.LawbotBossTopRampPosB)
|
||
|
topRampTurnPos = Point3(*ToontownGlobals.LawbotBossTopRampTurnPosB)
|
||
|
p3Pos = Point3(*ToontownGlobals.LawbotBossP3PosB)
|
||
|
else:
|
||
|
topRampPos = Point3(*ToontownGlobals.LawbotBossTopRampPosA)
|
||
|
topRampTurnPos = Point3(*ToontownGlobals.LawbotBossTopRampTurnPosA)
|
||
|
p3Pos = Point3(*ToontownGlobals.LawbotBossP3PosA)
|
||
|
battlePos = Point3(ToontownGlobals.LawbotBossBattleTwoPosHpr[0], ToontownGlobals.LawbotBossBattleTwoPosHpr[1], ToontownGlobals.LawbotBossBattleTwoPosHpr[2])
|
||
|
battleHpr = VBase3(ToontownGlobals.LawbotBossBattleTwoPosHpr[3], ToontownGlobals.LawbotBossBattleTwoPosHpr[4], ToontownGlobals.LawbotBossBattleTwoPosHpr[5])
|
||
|
bossTrack = Sequence()
|
||
|
self.notify.debug('calling setPosHpr')
|
||
|
myInterval = camera.posHprInterval(8, Point3(-22, -100, 35), Point3(-10, -13, 0), startPos=Point3(-22, -90, 35), startHpr=Point3(-10, -13, 0), blendType='easeInOut')
|
||
|
chatTrack = Sequence(Func(self.setChatAbsolute, TTLocalizer.LawbotBossTempJury1, CFSpeech), Func(camera.reparentTo, localAvatar), Func(camera.setPos, localAvatar.cameraPositions[0][0]), Func(camera.setHpr, 0, 0, 0), Func(self.releaseToons, 1))
|
||
|
bossTrack.append(Func(self.getGeomNode().setH, 180))
|
||
|
track, hpr = self.rollBossToPoint(startPos, None, battlePos, None, 0)
|
||
|
bossTrack.append(track)
|
||
|
track, hpr = self.rollBossToPoint(battlePos, hpr, battlePos, battleHpr, 0)
|
||
|
self.makeToonsWait()
|
||
|
finalPodiumPos = Point3(self.podium.getX(), self.podium.getY(), self.podium.getZ() + ToontownGlobals.LawbotBossBattleTwoPosHpr[2])
|
||
|
finalReflectedPodiumPos = Point3(self.reflectedPodium.getX(), self.reflectedPodium.getY(), self.reflectedPodium.getZ() + ToontownGlobals.LawbotBossBattleTwoPosHpr[2])
|
||
|
return Sequence(chatTrack, bossTrack, Func(self.getGeomNode().setH, 0), Parallel(self.podium.posInterval(5.0, finalPodiumPos), self.reflectedPodium.posInterval(5.0, finalReflectedPodiumPos), Func(self.stashBoss), self.posInterval(5.0, battlePos), Func(taskMgr.doMethodLater, 0.01, self.unstashBoss, 'unstashBoss')), name=self.uniqueName('BattleTwoMovie'))
|
||
|
|
||
|
def __makeRollToBattleThreeMovie(self):
|
||
|
startPos = Point3(ToontownGlobals.LawbotBossBattleTwoPosHpr[0], ToontownGlobals.LawbotBossBattleTwoPosHpr[1], ToontownGlobals.LawbotBossBattleTwoPosHpr[2])
|
||
|
battlePos = Point3(ToontownGlobals.LawbotBossBattleThreePosHpr[0], ToontownGlobals.LawbotBossBattleThreePosHpr[1], ToontownGlobals.LawbotBossBattleThreePosHpr[2])
|
||
|
battleHpr = VBase3(ToontownGlobals.LawbotBossBattleThreePosHpr[3], ToontownGlobals.LawbotBossBattleThreePosHpr[4], ToontownGlobals.LawbotBossBattleThreePosHpr[5])
|
||
|
bossTrack = Sequence()
|
||
|
myInterval = camera.posHprInterval(8, Point3(-22, -100, 35), Point3(-10, -13, 0), startPos=Point3(-22, -90, 35), startHpr=Point3(-10, -13, 0), blendType='easeInOut')
|
||
|
chatTrack = Sequence(Func(self.setChatAbsolute, TTLocalizer.LawbotBossTrialChat1, CFSpeech), Func(camera.reparentTo, localAvatar), Func(camera.setPos, localAvatar.cameraPositions[0][0]), Func(camera.setHpr, 0, 0, 0), Func(self.releaseToons, 1))
|
||
|
bossTrack.append(Func(self.getGeomNode().setH, 180))
|
||
|
bossTrack.append(Func(self.loop, 'Ff_neutral'))
|
||
|
track, hpr = self.rollBossToPoint(startPos, None, battlePos, None, 0)
|
||
|
bossTrack.append(track)
|
||
|
track, hpr = self.rollBossToPoint(battlePos, hpr, battlePos, battleHpr, 0)
|
||
|
self.makeToonsWait()
|
||
|
return Sequence(chatTrack, bossTrack, Func(self.getGeomNode().setH, 0), name=self.uniqueName('BattleTwoMovie'))
|
||
|
|
||
|
def toNeutralMode(self):
|
||
|
if self.cr:
|
||
|
place = self.cr.playGame.getPlace()
|
||
|
if place and hasattr(place, 'fsm'):
|
||
|
place.setState('waitForBattle')
|
||
|
|
||
|
def makeToonsWait(self):
|
||
|
self.notify.debug('makeToonsWait')
|
||
|
for toonId in self.involvedToons:
|
||
|
toon = self.cr.doId2do.get(toonId)
|
||
|
if toon:
|
||
|
toon.stopLookAround()
|
||
|
toon.stopSmooth()
|
||
|
|
||
|
if self.hasLocalToon():
|
||
|
self.toMovieMode()
|
||
|
for toonId in self.involvedToons:
|
||
|
toon = self.cr.doId2do.get(toonId)
|
||
|
if toon:
|
||
|
toon.loop('neutral')
|
||
|
|
||
|
def makeEndOfBattleMovie(self, hasLocalToon):
|
||
|
name = self.uniqueName('Drop')
|
||
|
seq = Sequence(name=name)
|
||
|
seq += [Wait(0.0)]
|
||
|
if hasLocalToon:
|
||
|
seq += [Func(self.show),
|
||
|
Func(camera.reparentTo, localAvatar),
|
||
|
Func(camera.setPos, localAvatar.cameraPositions[0][0]),
|
||
|
Func(camera.setHpr, 0, 0, 0)]
|
||
|
seq.append(Func(self.setChatAbsolute, TTLocalizer.LawbotBossPassExam, CFSpeech))
|
||
|
seq.append(Wait(5.0))
|
||
|
seq.append(Func(self.clearChat))
|
||
|
return seq
|
||
|
|
||
|
def __makeBossDamageMovie(self):
|
||
|
self.notify.debug('---- __makeBossDamageMovie')
|
||
|
startPos = Point3(ToontownGlobals.LawbotBossBattleThreePosHpr[0], ToontownGlobals.LawbotBossBattleThreePosHpr[1], ToontownGlobals.LawbotBossBattleThreePosHpr[2])
|
||
|
startHpr = Point3(*ToontownGlobals.LawbotBossBattleThreeHpr)
|
||
|
bottomPos = Point3(*ToontownGlobals.LawbotBossBottomPos)
|
||
|
deathPos = Point3(*ToontownGlobals.LawbotBossDeathPos)
|
||
|
self.setPosHpr(startPos, startHpr)
|
||
|
bossTrack = Sequence()
|
||
|
bossTrack.append(Func(self.loop, 'Ff_neutral'))
|
||
|
track, hpr = self.rollBossToPoint(startPos, startHpr, bottomPos, None, 1)
|
||
|
bossTrack.append(track)
|
||
|
track, hpr = self.rollBossToPoint(bottomPos, startHpr, deathPos, None, 1)
|
||
|
bossTrack.append(track)
|
||
|
duration = bossTrack.getDuration()
|
||
|
return bossTrack
|
||
|
|
||
|
def __showOnscreenMessage(self, text):
|
||
|
self.notify.debug('----- __showOnscreenmessage')
|
||
|
if self.onscreenMessage:
|
||
|
self.onscreenMessage.destroy()
|
||
|
self.onscreenMessage = None
|
||
|
self.onscreenMessage = DirectLabel(text=text, text_fg=VBase4(1, 1, 1, 1), text_align=TextNode.ACenter, relief=None, pos=(0, 0, 0.35), scale=0.1)
|
||
|
return
|
||
|
|
||
|
def __clearOnscreenMessage(self):
|
||
|
if self.onscreenMessage:
|
||
|
self.onscreenMessage.destroy()
|
||
|
self.onscreenMessage = None
|
||
|
return
|
||
|
|
||
|
def __showWaitingMessage(self, task):
|
||
|
self.notify.debug('----- __showWaitingMessage')
|
||
|
self.__showOnscreenMessage(TTLocalizer.BuildingWaitingForVictors)
|
||
|
|
||
|
def loadEnvironment(self):
|
||
|
self.notify.debug('----- loadEnvironment')
|
||
|
DistributedBossCog.DistributedBossCog.loadEnvironment(self)
|
||
|
self.geom = loader.loadModel('phase_11/models/lawbotHQ/LawbotCourtroom3')
|
||
|
self.geom.setPos(0, 0, -71.601)
|
||
|
self.geom.setScale(1)
|
||
|
self.elevatorEntrance = self.geom.find('**/elevator_origin')
|
||
|
self.elevatorEntrance.getChildren().detach()
|
||
|
self.elevatorEntrance.setScale(1)
|
||
|
elevatorModel = loader.loadModel('phase_11/models/lawbotHQ/LB_Elevator')
|
||
|
elevatorModel.reparentTo(self.elevatorEntrance)
|
||
|
self.setupElevator(elevatorModel)
|
||
|
self.promotionMusic = base.loader.loadMusic('phase_7/audio/bgm/encntr_suit_winning_indoor.ogg')
|
||
|
self.betweenBattleMusic = base.loader.loadMusic('phase_9/audio/bgm/encntr_toon_winning.ogg')
|
||
|
self.battleTwoMusic = base.loader.loadMusic('phase_11/audio/bgm/LB_juryBG.ogg')
|
||
|
floor = self.geom.find('**/MidVaultFloor1')
|
||
|
if floor.isEmpty():
|
||
|
floor = self.geom.find('**/CR3_Floor')
|
||
|
self.evFloor = self.replaceCollisionPolysWithPlanes(floor)
|
||
|
self.evFloor.reparentTo(self.geom)
|
||
|
self.evFloor.setName('floor')
|
||
|
plane = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, -50)))
|
||
|
planeNode = CollisionNode('dropPlane')
|
||
|
planeNode.addSolid(plane)
|
||
|
planeNode.setCollideMask(ToontownGlobals.PieBitmask)
|
||
|
self.geom.attachNewNode(planeNode)
|
||
|
self.door3 = self.geom.find('**/SlidingDoor1/')
|
||
|
if self.door3.isEmpty():
|
||
|
self.door3 = self.geom.find('**/interior/CR3_Door')
|
||
|
self.mainDoor = self.geom.find('**/Door_1')
|
||
|
if not self.mainDoor.isEmpty():
|
||
|
itemsToHide = ['interior/Door_1']
|
||
|
for str in itemsToHide:
|
||
|
stuffToHide = self.geom.find('**/%s' % str)
|
||
|
if not stuffToHide.isEmpty():
|
||
|
self.notify.debug('found %s' % stuffToHide)
|
||
|
stuffToHide.wrtReparentTo(self.mainDoor)
|
||
|
else:
|
||
|
self.notify.debug('not found %s' % stuffToHide)
|
||
|
|
||
|
self.reflectedMainDoor = self.geom.find('**/interiorrefl/CR3_Door')
|
||
|
if not self.reflectedMainDoor.isEmpty():
|
||
|
itemsToHide = ['Reflections/Door_1']
|
||
|
for str in itemsToHide:
|
||
|
stuffToHide = self.geom.find('**/%s' % str)
|
||
|
if not stuffToHide.isEmpty():
|
||
|
self.notify.debug('found %s' % stuffToHide)
|
||
|
stuffToHide.wrtReparentTo(self.reflectedMainDoor)
|
||
|
else:
|
||
|
self.notify.debug('not found %s' % stuffToHide)
|
||
|
|
||
|
self.geom.reparentTo(render)
|
||
|
self.loadWitnessStand()
|
||
|
self.loadScale()
|
||
|
self.scaleNodePath.stash()
|
||
|
self.loadJuryBox()
|
||
|
self.loadPodium()
|
||
|
ug = self.geom.find('**/Reflections')
|
||
|
ug.setBin('ground', -10)
|
||
|
|
||
|
def loadJuryBox(self):
|
||
|
self.juryBox = self.geom.find('**/JuryBox')
|
||
|
juryBoxPos = self.juryBox.getPos()
|
||
|
newPos = juryBoxPos - Point3(*ToontownGlobals.LawbotBossJuryBoxRelativeEndPos)
|
||
|
if not self.debugPositions:
|
||
|
self.juryBox.setPos(newPos)
|
||
|
self.reflectedJuryBox = self.geom.find('**/JuryBox_Geo_Reflect')
|
||
|
reflectedJuryBoxPos = self.reflectedJuryBox.getPos()
|
||
|
newReflectedPos = reflectedJuryBoxPos - Point3(*ToontownGlobals.LawbotBossJuryBoxRelativeEndPos)
|
||
|
if not self.debugPositions:
|
||
|
self.reflectedJuryBox.setPos(newReflectedPos)
|
||
|
if not self.reflectedJuryBox.isEmpty():
|
||
|
if self.debugPositions:
|
||
|
self.reflectedJuryBox.show()
|
||
|
self.reflectedJuryBox.setZ(self.reflectedJuryBox.getZ() + ToontownGlobals.LawbotBossJuryBoxRelativeEndPos[2])
|
||
|
|
||
|
def loadPodium(self):
|
||
|
self.podium = self.geom.find('**/Podium')
|
||
|
newZ = self.podium.getZ() - ToontownGlobals.LawbotBossBattleTwoPosHpr[2]
|
||
|
if not self.debugPositions:
|
||
|
self.podium.setZ(newZ)
|
||
|
self.reflectedPodium = self.geom.find('**/Podium_Geo1_Refl')
|
||
|
reflectedZ = self.reflectedPodium.getZ()
|
||
|
if not self.debugPositions:
|
||
|
self.reflectedPodium.setZ(reflectedZ)
|
||
|
if not self.reflectedPodium.isEmpty():
|
||
|
if self.debugPositions:
|
||
|
self.reflectedPodium.show()
|
||
|
|
||
|
def loadCannons(self):
|
||
|
pass
|
||
|
|
||
|
def loadWitnessStand(self):
|
||
|
self.realWitnessStand = self.geom.find('**/WitnessStand')
|
||
|
if not self.realWitnessStand.isEmpty():
|
||
|
pass
|
||
|
self.reflectedWitnessStand = self.geom.find('**/Witnessstand_Geo_Reflect')
|
||
|
if not self.reflectedWitnessStand.isEmpty():
|
||
|
pass
|
||
|
colNode = self.realWitnessStand.find('**/witnessStandCollisions/Witnessstand_Collision')
|
||
|
colNode.setName('WitnessStand')
|
||
|
|
||
|
def loadScale(self):
|
||
|
self.useProgrammerScale = base.config.GetBool('want-injustice-scale-debug', 0)
|
||
|
if self.useProgrammerScale:
|
||
|
self.loadScaleOld()
|
||
|
else:
|
||
|
self.loadScaleNew()
|
||
|
|
||
|
def __debugScale(self):
|
||
|
prosecutionPanPos = self.prosecutionPanNodePath.getPos()
|
||
|
origin = Point3(0, 0, 0)
|
||
|
prosecutionPanRelPos = self.scaleNodePath.getRelativePoint(self.prosecutionPanNodePath, origin)
|
||
|
panRenderPos = render.getRelativePoint(self.prosecutionPanNodePath, origin)
|
||
|
self.notify.debug('prosecutionPanPos = %s' % prosecutionPanPos)
|
||
|
self.notify.debug('prosecutionPanRelPos = %s' % prosecutionPanRelPos)
|
||
|
self.notify.debug('panRenderPos = %s' % panRenderPos)
|
||
|
prosecutionLocatorPos = self.prosecutionLocator.getPos()
|
||
|
prosecutionLocatorRelPos = self.scaleNodePath.getRelativePoint(self.prosecutionLocator, origin)
|
||
|
locatorRenderPos = render.getRelativePoint(self.prosecutionLocator, origin)
|
||
|
self.notify.debug('prosecutionLocatorPos = %s ' % prosecutionLocatorPos)
|
||
|
self.notify.debug('prosecutionLocatorRelPos = %s ' % prosecutionLocatorRelPos)
|
||
|
self.notify.debug('locatorRenderPos = %s' % locatorRenderPos)
|
||
|
beamPos = self.beamNodePath.getPos()
|
||
|
beamRelPos = self.scaleNodePath.getRelativePoint(self.beamNodePath, origin)
|
||
|
beamRenderPos = render.getRelativePoint(self.beamNodePath, origin)
|
||
|
self.notify.debug('beamPos = %s' % beamPos)
|
||
|
self.notify.debug('beamRelPos = %s' % beamRelPos)
|
||
|
self.notify.debug('beamRenderPos = %s' % beamRenderPos)
|
||
|
beamBoundsCenter = self.beamNodePath.getBounds().getCenter()
|
||
|
self.notify.debug('beamBoundsCenter = %s' % beamBoundsCenter)
|
||
|
beamLocatorBounds = self.beamLocator.getBounds()
|
||
|
beamLocatorPos = beamLocatorBounds.getCenter()
|
||
|
self.notify.debug('beamLocatorPos = %s' % beamLocatorPos)
|
||
|
|
||
|
def loadScaleNew(self):
|
||
|
self.scaleNodePath = loader.loadModel('phase_11/models/lawbotHQ/scale')
|
||
|
self.beamNodePath = self.scaleNodePath.find('**/scaleBeam')
|
||
|
self.defensePanNodePath = self.scaleNodePath.find('**/defensePan')
|
||
|
self.prosecutionPanNodePath = self.scaleNodePath.find('**/prosecutionPan')
|
||
|
self.defenseColNodePath = self.scaleNodePath.find('**/DefenseCol')
|
||
|
self.defenseColNodePath.setTag('pieCode', str(ToontownGlobals.PieCodeDefensePan))
|
||
|
self.prosecutionColNodePath = self.scaleNodePath.find('**/ProsecutionCol')
|
||
|
self.prosecutionColNodePath.setTag('pieCode', str(ToontownGlobals.PieCodeProsecutionPan))
|
||
|
self.standNodePath = self.scaleNodePath.find('**/scaleStand')
|
||
|
self.scaleNodePath.setPosHpr(*ToontownGlobals.LawbotBossInjusticePosHpr)
|
||
|
self.defenseLocator = self.scaleNodePath.find('**/DefenseLocator')
|
||
|
defenseLocBounds = self.defenseLocator.getBounds()
|
||
|
defenseLocPos = defenseLocBounds.getCenter()
|
||
|
self.notify.debug('defenseLocatorPos = %s' % defenseLocPos)
|
||
|
self.defensePanNodePath.setPos(defenseLocPos)
|
||
|
self.defensePanNodePath.reparentTo(self.beamNodePath)
|
||
|
self.notify.debug('defensePanNodePath.getPos()=%s' % self.defensePanNodePath.getPos())
|
||
|
self.prosecutionLocator = self.scaleNodePath.find('**/ProsecutionLocator')
|
||
|
prosecutionLocBounds = self.prosecutionLocator.getBounds()
|
||
|
prosecutionLocPos = prosecutionLocBounds.getCenter()
|
||
|
self.notify.debug('prosecutionLocatorPos = %s' % prosecutionLocPos)
|
||
|
self.prosecutionPanNodePath.setPos(prosecutionLocPos)
|
||
|
self.prosecutionPanNodePath.reparentTo(self.beamNodePath)
|
||
|
self.beamLocator = self.scaleNodePath.find('**/StandLocator1')
|
||
|
beamLocatorBounds = self.beamLocator.getBounds()
|
||
|
beamLocatorPos = beamLocatorBounds.getCenter()
|
||
|
negBeamLocatorPos = -beamLocatorPos
|
||
|
self.notify.debug('beamLocatorPos = %s' % beamLocatorPos)
|
||
|
self.notify.debug('negBeamLocatorPos = %s' % negBeamLocatorPos)
|
||
|
self.beamNodePath.setPos(beamLocatorPos)
|
||
|
self.scaleNodePath.setScale(*ToontownGlobals.LawbotBossInjusticeScale)
|
||
|
self.scaleNodePath.wrtReparentTo(self.geom)
|
||
|
self.baseHighCol = self.scaleNodePath.find('**/BaseHighCol')
|
||
|
oldBitMask = self.baseHighCol.getCollideMask()
|
||
|
newBitMask = oldBitMask & ~ToontownGlobals.PieBitmask
|
||
|
newBitMask = newBitMask & ~ToontownGlobals.CameraBitmask
|
||
|
self.baseHighCol.setCollideMask(newBitMask)
|
||
|
self.defenseHighCol = self.scaleNodePath.find('**/DefenseHighCol')
|
||
|
self.defenseHighCol.stash()
|
||
|
self.defenseHighCol.setCollideMask(newBitMask)
|
||
|
self.baseTopCol = self.scaleNodePath.find('**/Scale_base_top_collision')
|
||
|
self.baseSideCol = self.scaleNodePath.find('**/Scale_base_side_col')
|
||
|
self.defenseLocator.hide()
|
||
|
self.prosecutionLocator.hide()
|
||
|
self.beamLocator.hide()
|
||
|
|
||
|
def loadScaleOld(self):
|
||
|
startingTilt = 0
|
||
|
self.scaleNodePath = NodePath('injusticeScale')
|
||
|
beamGeom = self.createBlock(0.25, 2, 0.125, -0.25, -2, -0.125, 0, 1.0, 0, 1.0)
|
||
|
self.beamNodePath = NodePath('scaleBeam')
|
||
|
self.beamNodePath.attachNewNode(beamGeom)
|
||
|
self.beamNodePath.setPos(0, 0, 3)
|
||
|
self.beamNodePath.reparentTo(self.scaleNodePath)
|
||
|
defensePanGeom = self.createBlock(0.5, 0.5, 0, -0.5, -0.5, -2, 0, 0, 1.0, 0.25)
|
||
|
self.defensePanNodePath = NodePath('defensePan')
|
||
|
self.defensePanNodePath.attachNewNode(defensePanGeom)
|
||
|
self.defensePanNodePath.setPos(0, -2, 0)
|
||
|
self.defensePanNodePath.reparentTo(self.beamNodePath)
|
||
|
defenseTube = CollisionTube(0, 0, -0.5, 0, 0, -1.5, 0.6)
|
||
|
defenseTube.setTangible(1)
|
||
|
defenseCollNode = CollisionNode('DefenseCol')
|
||
|
defenseCollNode.addSolid(defenseTube)
|
||
|
self.defenseColNodePath = self.defensePanNodePath.attachNewNode(defenseCollNode)
|
||
|
self.defenseColNodePath.setTag('pieCode', str(ToontownGlobals.PieCodeDefensePan))
|
||
|
prosecutionPanGeom = self.createBlock(0.5, 0.5, 0, -0.5, -0.5, -2, 1.0, 0, 0, 1.0)
|
||
|
self.prosecutionPanNodePath = NodePath('prosecutionPan')
|
||
|
self.prosecutionPanNodePath.attachNewNode(prosecutionPanGeom)
|
||
|
self.prosecutionPanNodePath.setPos(0, 2, 0)
|
||
|
self.prosecutionPanNodePath.reparentTo(self.beamNodePath)
|
||
|
prosecutionTube = CollisionTube(0, 0, -0.5, 0, 0, -1.5, 0.6)
|
||
|
prosecutionTube.setTangible(1)
|
||
|
prosecutionCollNode = CollisionNode(self.uniqueName('ProsecutionCol'))
|
||
|
prosecutionCollNode.addSolid(prosecutionTube)
|
||
|
self.prosecutionColNodePath = self.prosecutionPanNodePath.attachNewNode(prosecutionCollNode)
|
||
|
self.prosecutionColNodePath.setTag('pieCode', str(ToontownGlobals.PieCodeProsecutionPan))
|
||
|
standGeom = self.createBlock(0.25, 0.25, 0, -0.25, -0.25, 3)
|
||
|
self.standNodePath = NodePath('scaleStand')
|
||
|
self.standNodePath.attachNewNode(standGeom)
|
||
|
self.standNodePath.reparentTo(self.scaleNodePath)
|
||
|
self.scaleNodePath.setPosHpr(*ToontownGlobals.LawbotBossInjusticePosHpr)
|
||
|
self.scaleNodePath.setScale(5.0)
|
||
|
self.scaleNodePath.wrtReparentTo(self.geom)
|
||
|
self.setScaleTilt(startingTilt)
|
||
|
|
||
|
def setScaleTilt(self, tilt):
|
||
|
self.beamNodePath.setP(tilt)
|
||
|
if self.useProgrammerScale:
|
||
|
self.defensePanNodePath.setP(-tilt)
|
||
|
self.prosecutionPanNodePath.setP(-tilt)
|
||
|
else:
|
||
|
self.defensePanNodePath.setP(-tilt)
|
||
|
self.prosecutionPanNodePath.setP(-tilt)
|
||
|
|
||
|
def stashBaseCol(self):
|
||
|
if not self.baseColStashed:
|
||
|
self.notify.debug('stashBaseCol')
|
||
|
self.baseTopCol.stash()
|
||
|
self.baseSideCol.stash()
|
||
|
self.baseColStashed = True
|
||
|
|
||
|
def unstashBaseCol(self):
|
||
|
if self.baseColStashed:
|
||
|
self.notify.debug('unstashBaseCol')
|
||
|
self.baseTopCol.unstash()
|
||
|
self.baseSideCol.unstash()
|
||
|
self.baseColStashed = False
|
||
|
|
||
|
def makeScaleReflectDamage(self):
|
||
|
diffDamage = self.bossDamage - ToontownGlobals.LawbotBossInitialDamage
|
||
|
diffDamage *= 1.0
|
||
|
if diffDamage >= 0:
|
||
|
percentDamaged = diffDamage / (ToontownGlobals.LawbotBossMaxDamage - ToontownGlobals.LawbotBossInitialDamage)
|
||
|
tilt = percentDamaged * ToontownGlobals.LawbotBossWinningTilt
|
||
|
else:
|
||
|
percentDamaged = diffDamage / (ToontownGlobals.LawbotBossInitialDamage - 0)
|
||
|
tilt = percentDamaged * ToontownGlobals.LawbotBossWinningTilt
|
||
|
self.setScaleTilt(tilt)
|
||
|
if self.bossDamage < ToontownGlobals.LawbotBossMaxDamage * 0.85:
|
||
|
self.unstashBaseCol()
|
||
|
else:
|
||
|
self.stashBaseCol()
|
||
|
|
||
|
def unloadEnvironment(self):
|
||
|
self.notify.debug('----- unloadEnvironment')
|
||
|
DistributedBossCog.DistributedBossCog.unloadEnvironment(self)
|
||
|
self.geom.removeNode()
|
||
|
del self.geom
|
||
|
|
||
|
def __loadMopaths(self):
|
||
|
self.notify.debug('----- __loadMopaths')
|
||
|
self.toonsEnterA = Mopath.Mopath()
|
||
|
self.toonsEnterA.loadFile('phase_9/paths/bossBattle-toonsEnterA')
|
||
|
self.toonsEnterA.fFaceForward = 1
|
||
|
self.toonsEnterA.timeScale = 35
|
||
|
self.toonsEnterB = Mopath.Mopath()
|
||
|
self.toonsEnterB.loadFile('phase_9/paths/bossBattle-toonsEnterB')
|
||
|
self.toonsEnterB.fFaceForward = 1
|
||
|
self.toonsEnterB.timeScale = 35
|
||
|
|
||
|
def __unloadMopaths(self):
|
||
|
self.notify.debug('----- __unloadMopaths')
|
||
|
self.toonsEnterA.reset()
|
||
|
self.toonsEnterB.reset()
|
||
|
|
||
|
def enterOff(self):
|
||
|
self.notify.debug('----- enterOff')
|
||
|
DistributedBossCog.DistributedBossCog.enterOff(self)
|
||
|
if self.witnessToon:
|
||
|
self.witnessToon.clearChat()
|
||
|
|
||
|
def enterWaitForToons(self):
|
||
|
self.notify.debug('----- enterWaitForToons')
|
||
|
DistributedBossCog.DistributedBossCog.enterWaitForToons(self)
|
||
|
self.geom.hide()
|
||
|
self.witnessToon.removeActive()
|
||
|
|
||
|
def exitWaitForToons(self):
|
||
|
self.notify.debug('----- exitWaitForToons')
|
||
|
DistributedBossCog.DistributedBossCog.exitWaitForToons(self)
|
||
|
self.geom.show()
|
||
|
self.witnessToon.addActive()
|
||
|
|
||
|
def enterElevator(self):
|
||
|
self.notify.debug('----- enterElevator')
|
||
|
DistributedBossCog.DistributedBossCog.enterElevator(self)
|
||
|
self.witnessToon.removeActive()
|
||
|
self.reparentTo(render)
|
||
|
self.setPosHpr(*ToontownGlobals.LawbotBossBattleOnePosHpr)
|
||
|
self.happy = 1
|
||
|
self.raised = 1
|
||
|
self.forward = 1
|
||
|
self.doAnimate()
|
||
|
self.__hideWitnessToon()
|
||
|
if not self.mainDoor.isEmpty():
|
||
|
self.mainDoor.stash()
|
||
|
if not self.reflectedMainDoor.isEmpty():
|
||
|
self.reflectedMainDoor.stash()
|
||
|
camera.reparentTo(self.elevatorModel)
|
||
|
camera.setPosHpr(0, 30, 8, 180, 0, 0)
|
||
|
|
||
|
def exitElevator(self):
|
||
|
self.notify.debug('----- exitElevator')
|
||
|
DistributedBossCog.DistributedBossCog.exitElevator(self)
|
||
|
self.witnessToon.removeActive()
|
||
|
|
||
|
def enterIntroduction(self):
|
||
|
self.notify.debug('----- enterIntroduction')
|
||
|
self.reparentTo(render)
|
||
|
self.setPosHpr(*ToontownGlobals.LawbotBossBattleOnePosHpr)
|
||
|
self.stopAnimate()
|
||
|
self.__hideWitnessToon()
|
||
|
DistributedBossCog.DistributedBossCog.enterIntroduction(self)
|
||
|
base.playMusic(self.promotionMusic, looping=1, volume=0.9)
|
||
|
if not self.mainDoor.isEmpty():
|
||
|
self.mainDoor.stash()
|
||
|
if not self.reflectedMainDoor.isEmpty():
|
||
|
self.reflectedMainDoor.stash()
|
||
|
|
||
|
def exitIntroduction(self):
|
||
|
self.notify.debug('----- exitIntroduction')
|
||
|
DistributedBossCog.DistributedBossCog.exitIntroduction(self)
|
||
|
self.promotionMusic.stop()
|
||
|
if not self.mainDoor.isEmpty():
|
||
|
pass
|
||
|
if not self.reflectedMainDoor.isEmpty():
|
||
|
self.reflectedMainDoor.unstash()
|
||
|
if not self.elevatorEntrance.isEmpty():
|
||
|
pass
|
||
|
|
||
|
def enterBattleOne(self):
|
||
|
self.notify.debug('----- LawbotBoss.enterBattleOne ')
|
||
|
DistributedBossCog.DistributedBossCog.enterBattleOne(self)
|
||
|
self.reparentTo(render)
|
||
|
self.setPosHpr(*ToontownGlobals.LawbotBossBattleOnePosHpr)
|
||
|
self.clearChat()
|
||
|
self.loop('Ff_neutral')
|
||
|
self.notify.debug('self.battleANode = %s' % self.battleANode)
|
||
|
self.__hideWitnessToon()
|
||
|
if self.battleA == None or self.battleB == None:
|
||
|
pass
|
||
|
return
|
||
|
|
||
|
def exitBattleOne(self):
|
||
|
self.notify.debug('----- exitBattleOne')
|
||
|
DistributedBossCog.DistributedBossCog.exitBattleOne(self)
|
||
|
|
||
|
def stashBoss(self):
|
||
|
self.stash()
|
||
|
|
||
|
def unstashBoss(self, task):
|
||
|
self.unstash()
|
||
|
self.reparentTo(render)
|
||
|
|
||
|
def enterRollToBattleTwo(self):
|
||
|
self.notify.debug('----- enterRollToBattleTwo')
|
||
|
self.releaseToons(finalBattle=1)
|
||
|
self.stashBoss()
|
||
|
self.toonsToBattlePosition(self.involvedToons, self.battleANode)
|
||
|
self.stickBossToFloor()
|
||
|
intervalName = 'RollToBattleTwo'
|
||
|
seq = Sequence(self.__makeRollToBattleTwoMovie(), Func(self.__onToPrepareBattleTwo), name=intervalName)
|
||
|
seq.start()
|
||
|
self.storeInterval(seq, intervalName)
|
||
|
base.playMusic(self.betweenBattleMusic, looping=1, volume=0.9)
|
||
|
taskMgr.doMethodLater(0.01, self.unstashBoss, 'unstashBoss')
|
||
|
|
||
|
def __onToPrepareBattleTwo(self):
|
||
|
self.notify.debug('----- __onToPrepareBattleTwo')
|
||
|
self.unstickBoss()
|
||
|
self.setPosHpr(*ToontownGlobals.LawbotBossBattleTwoPosHpr)
|
||
|
self.doneBarrier('RollToBattleTwo')
|
||
|
|
||
|
def exitRollToBattleTwo(self):
|
||
|
self.notify.debug('----- exitRollToBattleTwo')
|
||
|
self.unstickBoss()
|
||
|
intervalName = 'RollToBattleTwo'
|
||
|
self.clearInterval(intervalName)
|
||
|
self.betweenBattleMusic.stop()
|
||
|
|
||
|
def enterPrepareBattleTwo(self):
|
||
|
self.notify.debug('----- enterPrepareBattleTwo')
|
||
|
self.cleanupIntervals()
|
||
|
self.controlToons()
|
||
|
self.setToonsToNeutral(self.involvedToons)
|
||
|
self.clearChat()
|
||
|
self.reparentTo(render)
|
||
|
self.__showWitnessToon()
|
||
|
prepareBattleTwoMovie = self.__makePrepareBattleTwoMovie()
|
||
|
intervalName = 'prepareBattleTwo'
|
||
|
seq = Sequence(prepareBattleTwoMovie, name=intervalName)
|
||
|
seq.start()
|
||
|
self.storeInterval(seq, intervalName)
|
||
|
self.acceptOnce('doneChatPage', self.__showCannonsAppearing)
|
||
|
base.playMusic(self.stingMusic, looping=0, volume=1.0)
|
||
|
|
||
|
def __showCannonsAppearing(self, elapsedTime = 0):
|
||
|
allCannonsAppear = Sequence(Func(self.__positionToonsInFrontOfCannons), Func(camera.reparentTo, localAvatar), Func(camera.setPos, localAvatar.cameraPositions[2][0]), Func(camera.lookAt, localAvatar))
|
||
|
multiCannons = Parallel()
|
||
|
index = 0
|
||
|
self.involvedToons.sort()
|
||
|
for toonId in self.involvedToons:
|
||
|
toon = self.cr.doId2do.get(toonId)
|
||
|
if toon:
|
||
|
if index in self.cannons:
|
||
|
cannon = self.cannons[index]
|
||
|
cannonSeq = cannon.generateCannonAppearTrack(toon)
|
||
|
multiCannons.append(cannonSeq)
|
||
|
index += 1
|
||
|
else:
|
||
|
self.notify.warning('No cannon %d but we have a toon =%d' % (index, toonId))
|
||
|
|
||
|
allCannonsAppear.append(multiCannons)
|
||
|
intervalName = 'prepareBattleTwoCannonsAppear'
|
||
|
seq = Sequence(allCannonsAppear, Func(self.__onToBattleTwo), name=intervalName)
|
||
|
seq.start()
|
||
|
self.storeInterval(seq, intervalName)
|
||
|
|
||
|
def __onToBattleTwo(self, elapsedTime = 0):
|
||
|
self.notify.debug('----- __onToBattleTwo')
|
||
|
self.doneBarrier('PrepareBattleTwo')
|
||
|
taskMgr.doMethodLater(1, self.__showWaitingMessage, self.uniqueName('WaitingMessage'))
|
||
|
|
||
|
def exitPrepareBattleTwo(self):
|
||
|
self.notify.debug('----- exitPrepareBattleTwo')
|
||
|
self.show()
|
||
|
taskMgr.remove(self.uniqueName('WaitingMessage'))
|
||
|
self.ignore('doneChatPage')
|
||
|
self.__clearOnscreenMessage()
|
||
|
self.stingMusic.stop()
|
||
|
|
||
|
def enterBattleTwo(self):
|
||
|
self.notify.debug('----- enterBattleTwo')
|
||
|
self.cleanupIntervals()
|
||
|
mult = ToontownBattleGlobals.getBossBattleCreditMultiplier(2)
|
||
|
localAvatar.inventory.setBattleCreditMultiplier(mult)
|
||
|
self.reparentTo(render)
|
||
|
self.setPosHpr(*ToontownGlobals.LawbotBossBattleTwoPosHpr)
|
||
|
self.clearChat()
|
||
|
self.witnessToon.clearChat()
|
||
|
self.releaseToons(finalBattle=1)
|
||
|
self.__showWitnessToon()
|
||
|
if not self.useCannons:
|
||
|
self.toonsToBattlePosition(self.toonsA, self.battleANode)
|
||
|
self.toonsToBattlePosition(self.toonsB, self.battleBNode)
|
||
|
base.playMusic(self.battleTwoMusic, looping=1, volume=0.9)
|
||
|
self.startJuryBoxMoving()
|
||
|
for index in xrange(len(self.cannons)):
|
||
|
cannon = self.cannons[index]
|
||
|
cannon.cannon.show()
|
||
|
|
||
|
def getChairParent(self):
|
||
|
return self.juryBox
|
||
|
|
||
|
def startJuryBoxMoving(self):
|
||
|
curPos = self.juryBox.getPos()
|
||
|
endingAbsPos = Point3(curPos[0] + ToontownGlobals.LawbotBossJuryBoxRelativeEndPos[0], curPos[1] + ToontownGlobals.LawbotBossJuryBoxRelativeEndPos[1], curPos[2] + ToontownGlobals.LawbotBossJuryBoxRelativeEndPos[2])
|
||
|
curReflectedPos = self.reflectedJuryBox.getPos()
|
||
|
reflectedEndingAbsPos = Point3(curReflectedPos[0] + ToontownGlobals.LawbotBossJuryBoxRelativeEndPos[0], curReflectedPos[1] + ToontownGlobals.LawbotBossJuryBoxRelativeEndPos[1], curReflectedPos[2] + ToontownGlobals.LawbotBossJuryBoxRelativeEndPos[2])
|
||
|
self.juryBoxIval = Parallel(self.juryBox.posInterval(ToontownGlobals.LawbotBossJuryBoxMoveTime, endingAbsPos), self.reflectedJuryBox.posInterval(ToontownGlobals.LawbotBossJuryBoxMoveTime, reflectedEndingAbsPos), SoundInterval(self.juryMovesSfx, node=self.chairs[2].nodePath, duration=ToontownGlobals.LawbotBossJuryBoxMoveTime, loop=1, volume=1.0))
|
||
|
self.juryBoxIval.start()
|
||
|
self.juryTimer = ToontownTimer.ToontownTimer()
|
||
|
self.juryTimer.posInTopRightCorner()
|
||
|
self.juryTimer.countdown(ToontownGlobals.LawbotBossJuryBoxMoveTime)
|
||
|
|
||
|
def exitBattleTwo(self):
|
||
|
self.notify.debug('----- exitBattleTwo')
|
||
|
intervalName = self.uniqueName('Drop')
|
||
|
self.clearInterval(intervalName)
|
||
|
self.cleanupBattles()
|
||
|
self.battleTwoMusic.stop()
|
||
|
localAvatar.inventory.setBattleCreditMultiplier(1)
|
||
|
if self.juryTimer:
|
||
|
self.juryTimer.destroy()
|
||
|
del self.juryTimer
|
||
|
self.juryTimer = None
|
||
|
for chair in self.chairs.values():
|
||
|
chair.stopCogsFlying()
|
||
|
|
||
|
return
|
||
|
|
||
|
def enterRollToBattleThree(self):
|
||
|
self.notify.debug('----- enterRollToBattleThree')
|
||
|
self.reparentTo(render)
|
||
|
self.stickBossToFloor()
|
||
|
intervalName = 'RollToBattleThree'
|
||
|
seq = Sequence(self.__makeRollToBattleThreeMovie(), Func(self.__onToPrepareBattleThree), name=intervalName)
|
||
|
seq.start()
|
||
|
self.storeInterval(seq, intervalName)
|
||
|
base.playMusic(self.betweenBattleMusic, looping=1, volume=0.9)
|
||
|
|
||
|
def __onToPrepareBattleThree(self):
|
||
|
self.notify.debug('----- __onToPrepareBattleThree')
|
||
|
self.unstickBoss()
|
||
|
self.setPosHpr(*ToontownGlobals.LawbotBossBattleThreePosHpr)
|
||
|
self.doneBarrier('RollToBattleThree')
|
||
|
|
||
|
def exitRollToBattleThree(self):
|
||
|
self.notify.debug('----- exitRollToBattleThree')
|
||
|
self.unstickBoss()
|
||
|
intervalName = 'RollToBattleThree'
|
||
|
self.clearInterval(intervalName)
|
||
|
self.betweenBattleMusic.stop()
|
||
|
|
||
|
def enterPrepareBattleThree(self):
|
||
|
self.notify.debug('----- enterPrepareBattleThree')
|
||
|
self.cleanupIntervals()
|
||
|
self.controlToons()
|
||
|
self.setToonsToNeutral(self.involvedToons)
|
||
|
self.clearChat()
|
||
|
self.reparentTo(render)
|
||
|
base.playMusic(self.betweenBattleMusic, looping=1, volume=0.9)
|
||
|
self.__showWitnessToon()
|
||
|
prepareBattleThreeMovie = self.__makePrepareBattleThreeMovie()
|
||
|
self.acceptOnce('doneChatPage', self.__onToBattleThree)
|
||
|
intervalName = 'prepareBattleThree'
|
||
|
seq = Sequence(prepareBattleThreeMovie, name=intervalName)
|
||
|
seq.start()
|
||
|
self.storeInterval(seq, intervalName)
|
||
|
|
||
|
def __onToBattleThree(self, elapsed):
|
||
|
self.notify.debug('----- __onToBattleThree')
|
||
|
self.doneBarrier('PrepareBattleThree')
|
||
|
taskMgr.doMethodLater(1, self.__showWaitingMessage, self.uniqueName('WaitingMessage'))
|
||
|
|
||
|
def exitPrepareBattleThree(self):
|
||
|
self.notify.debug('----- exitPrepareBattleThree')
|
||
|
self.show()
|
||
|
taskMgr.remove(self.uniqueName('WaitingMessage'))
|
||
|
self.ignore('doneChatPage')
|
||
|
intervalName = 'PrepareBattleThree'
|
||
|
self.clearInterval(intervalName)
|
||
|
self.__clearOnscreenMessage()
|
||
|
self.betweenBattleMusic.stop()
|
||
|
|
||
|
def enterBattleThree(self):
|
||
|
DistributedBossCog.DistributedBossCog.enterBattleThree(self)
|
||
|
self.scaleNodePath.unstash()
|
||
|
localAvatar.setPos(-3, 0, 0)
|
||
|
camera.reparentTo(localAvatar)
|
||
|
camera.setPos(localAvatar.cameraPositions[0][0])
|
||
|
camera.setHpr(0, 0, 0)
|
||
|
self.clearChat()
|
||
|
self.witnessToon.clearChat()
|
||
|
self.reparentTo(render)
|
||
|
self.happy = 1
|
||
|
self.raised = 1
|
||
|
self.forward = 1
|
||
|
self.doAnimate()
|
||
|
self.accept('enterWitnessStand', self.__touchedWitnessStand)
|
||
|
self.accept('pieSplat', self.__pieSplat)
|
||
|
self.accept('localPieSplat', self.__localPieSplat)
|
||
|
self.accept('outOfPies', self.__outOfPies)
|
||
|
self.accept('begin-pie', self.__foundPieButton)
|
||
|
self.accept('enterDefenseCol', self.__enterDefenseCol)
|
||
|
self.accept('enterProsecutionCol', self.__enterProsecutionCol)
|
||
|
localAvatar.setCameraFov(ToontownGlobals.BossBattleCameraFov)
|
||
|
taskMgr.doMethodLater(30, self.__howToGetPies, self.uniqueName('PieAdvice'))
|
||
|
self.stickBossToFloor()
|
||
|
self.setPosHpr(*ToontownGlobals.LawbotBossBattleThreePosHpr)
|
||
|
self.bossMaxDamage = ToontownGlobals.LawbotBossMaxDamage
|
||
|
base.playMusic(self.battleThreeMusic, looping=1, volume=0.9)
|
||
|
self.__showWitnessToon()
|
||
|
diffSettings = ToontownGlobals.LawbotBossDifficultySettings[self.battleDifficulty]
|
||
|
if diffSettings[4]:
|
||
|
localAvatar.chatMgr.chatInputSpeedChat.removeCJMenu()
|
||
|
localAvatar.chatMgr.chatInputSpeedChat.addCJMenu(self.bonusWeight)
|
||
|
|
||
|
def __doneBattleThree(self):
|
||
|
self.notify.debug('----- __doneBattleThree')
|
||
|
self.setState('NearVictory')
|
||
|
self.unstickBoss()
|
||
|
|
||
|
def exitBattleThree(self):
|
||
|
self.notify.debug('----- exitBattleThree')
|
||
|
DistributedBossCog.DistributedBossCog.exitBattleThree(self)
|
||
|
NametagGlobals.setMasterArrowsOn(1)
|
||
|
bossDoneEventName = self.uniqueName('DestroyedBoss')
|
||
|
self.ignore(bossDoneEventName)
|
||
|
taskMgr.remove(self.uniqueName('StandUp'))
|
||
|
self.ignore('enterWitnessStand')
|
||
|
self.ignore('pieSplat')
|
||
|
self.ignore('localPieSplat')
|
||
|
self.ignore('outOfPies')
|
||
|
self.ignore('begin-pie')
|
||
|
self.ignore('enterDefenseCol')
|
||
|
self.ignore('enterProsecutionCol')
|
||
|
self.__clearOnscreenMessage()
|
||
|
taskMgr.remove(self.uniqueName('PieAdvice'))
|
||
|
localAvatar.setCameraFov(ToontownGlobals.CogHQCameraFov)
|
||
|
if self.bossDamageMovie:
|
||
|
self.bossDamageMovie.finish()
|
||
|
self.bossDamageMovie = None
|
||
|
self.unstickBoss()
|
||
|
taskName = 'RecoverBossDamage'
|
||
|
taskMgr.remove(taskName)
|
||
|
self.battleThreeMusicTime = self.battleThreeMusic.getTime()
|
||
|
self.battleThreeMusic.stop()
|
||
|
return
|
||
|
|
||
|
def enterNearVictory(self):
|
||
|
self.cleanupIntervals()
|
||
|
self.reparentTo(render)
|
||
|
self.setPos(*ToontownGlobals.LawbotBossDeathPos)
|
||
|
self.setHpr(*ToontownGlobals.LawbotBossBattleThreeHpr)
|
||
|
self.clearChat()
|
||
|
self.releaseToons(finalBattle=1)
|
||
|
self.accept('pieSplat', self.__finalPieSplat)
|
||
|
self.accept('localPieSplat', self.__localPieSplat)
|
||
|
self.accept('outOfPies', self.__outOfPies)
|
||
|
localAvatar.setCameraFov(ToontownGlobals.BossBattleCameraFov)
|
||
|
self.happy = 0
|
||
|
self.raised = 0
|
||
|
self.forward = 1
|
||
|
self.doAnimate()
|
||
|
self.setDizzy(1)
|
||
|
base.playMusic(self.battleThreeMusic, looping=1, volume=0.9, time=self.battleThreeMusicTime)
|
||
|
|
||
|
def exitNearVictory(self):
|
||
|
self.notify.debug('----- exitNearVictory')
|
||
|
self.ignore('pieSplat')
|
||
|
self.ignore('localPieSplat')
|
||
|
self.ignore('outOfPies')
|
||
|
self.__clearOnscreenMessage()
|
||
|
taskMgr.remove(self.uniqueName('PieAdvice'))
|
||
|
localAvatar.setCameraFov(ToontownGlobals.CogHQCameraFov)
|
||
|
self.setDizzy(0)
|
||
|
self.battleThreeMusicTime = self.battleThreeMusic.getTime()
|
||
|
self.battleThreeMusic.stop()
|
||
|
|
||
|
def enterVictory(self):
|
||
|
self.notify.debug('----- enterVictory')
|
||
|
self.cleanupIntervals()
|
||
|
self.reparentTo(render)
|
||
|
self.setPosHpr(*ToontownGlobals.LawbotBossBattleThreePosHpr)
|
||
|
self.loop('neutral')
|
||
|
localAvatar.setCameraFov(ToontownGlobals.BossBattleCameraFov)
|
||
|
self.clearChat()
|
||
|
self.witnessToon.clearChat()
|
||
|
self.controlToons()
|
||
|
self.setToonsToNeutral(self.involvedToons)
|
||
|
self.happy = 1
|
||
|
self.raised = 1
|
||
|
self.forward = 1
|
||
|
intervalName = 'VictoryMovie'
|
||
|
seq = Sequence(self.makeVictoryMovie(), Func(self.__continueVictory), name=intervalName)
|
||
|
seq.start()
|
||
|
self.storeInterval(seq, intervalName)
|
||
|
base.playMusic(self.battleThreeMusic, looping=1, volume=0.9, time=self.battleThreeMusicTime)
|
||
|
|
||
|
def __continueVictory(self):
|
||
|
self.notify.debug('----- __continueVictory')
|
||
|
self.stopAnimate()
|
||
|
self.doneBarrier('Victory')
|
||
|
|
||
|
def exitVictory(self):
|
||
|
self.notify.debug('----- exitVictory')
|
||
|
self.stopAnimate()
|
||
|
self.unstash()
|
||
|
localAvatar.setCameraFov(ToontownGlobals.CogHQCameraFov)
|
||
|
self.battleThreeMusicTime = self.battleThreeMusic.getTime()
|
||
|
self.battleThreeMusic.stop()
|
||
|
|
||
|
def enterDefeat(self):
|
||
|
self.notify.debug('----- enterDefeat')
|
||
|
self.cleanupIntervals()
|
||
|
localAvatar.setCameraFov(ToontownGlobals.BossBattleCameraFov)
|
||
|
self.reparentTo(render)
|
||
|
self.clearChat()
|
||
|
self.releaseToons(finalBattle=1)
|
||
|
self.happy = 0
|
||
|
self.raised = 0
|
||
|
self.forward = 1
|
||
|
intervalName = 'DefeatMovie'
|
||
|
seq = Sequence(self.makeDefeatMovie(), Func(self.__continueDefeat), name=intervalName)
|
||
|
seq.start()
|
||
|
self.storeInterval(seq, intervalName)
|
||
|
base.playMusic(self.battleThreeMusic, looping=1, volume=0.9, time=self.battleThreeMusicTime)
|
||
|
|
||
|
def __continueDefeat(self):
|
||
|
self.notify.debug('----- __continueDefeat')
|
||
|
self.stopAnimate()
|
||
|
self.doneBarrier('Defeat')
|
||
|
|
||
|
def exitDefeat(self):
|
||
|
self.notify.debug('----- exitDefeat')
|
||
|
self.stopAnimate()
|
||
|
self.unstash()
|
||
|
localAvatar.setCameraFov(ToontownGlobals.CogHQCameraFov)
|
||
|
self.battleThreeMusicTime = self.battleThreeMusic.getTime()
|
||
|
self.battleThreeMusic.stop()
|
||
|
|
||
|
def enterReward(self):
|
||
|
self.cleanupIntervals()
|
||
|
self.clearChat()
|
||
|
self.witnessToon.clearChat()
|
||
|
self.stash()
|
||
|
self.stopAnimate()
|
||
|
self.controlToons()
|
||
|
panelName = self.uniqueName('reward')
|
||
|
self.rewardPanel = RewardPanel.RewardPanel(panelName)
|
||
|
victory, camVictory, skipper = MovieToonVictory.doToonVictory(1, self.involvedToons, self.toonRewardIds, self.toonRewardDicts, self.deathList, self.rewardPanel, allowGroupShot=0, uberList=self.uberList, noSkip=True)
|
||
|
ival = Sequence(Parallel(victory, camVictory), Func(self.__doneReward))
|
||
|
intervalName = 'RewardMovie'
|
||
|
delayDeletes = []
|
||
|
for toonId in self.involvedToons:
|
||
|
toon = self.cr.doId2do.get(toonId)
|
||
|
if toon:
|
||
|
delayDeletes.append(DelayDelete.DelayDelete(toon, 'LawbotBoss.enterReward'))
|
||
|
|
||
|
ival.delayDeletes = delayDeletes
|
||
|
ival.start()
|
||
|
self.storeInterval(ival, intervalName)
|
||
|
base.playMusic(self.battleThreeMusic, looping=1, volume=0.9, time=self.battleThreeMusicTime)
|
||
|
|
||
|
def __doneReward(self):
|
||
|
self.notify.debug('----- __doneReward')
|
||
|
self.doneBarrier('Reward')
|
||
|
self.toWalkMode()
|
||
|
|
||
|
def exitReward(self):
|
||
|
self.notify.debug('----- exitReward')
|
||
|
intervalName = 'RewardMovie'
|
||
|
self.clearInterval(intervalName)
|
||
|
self.unstash()
|
||
|
self.rewardPanel.destroy()
|
||
|
del self.rewardPanel
|
||
|
self.battleThreeMusicTime = 0
|
||
|
self.battleThreeMusic.stop()
|
||
|
|
||
|
def enterEpilogue(self):
|
||
|
self.cleanupIntervals()
|
||
|
self.clearChat()
|
||
|
self.witnessToon.clearChat()
|
||
|
self.stash()
|
||
|
self.stopAnimate()
|
||
|
self.controlToons()
|
||
|
self.__showWitnessToon()
|
||
|
self.witnessToon.reparentTo(render)
|
||
|
self.witnessToon.setPosHpr(*ToontownGlobals.LawbotBossWitnessEpiloguePosHpr)
|
||
|
self.witnessToon.loop('Sit')
|
||
|
self.__arrangeToonsAroundWitnessToon()
|
||
|
camera.reparentTo(render)
|
||
|
camera.setPos(self.witnessToon, -9, 12, 6)
|
||
|
camera.lookAt(self.witnessToon, 0, 0, 3)
|
||
|
intervalName = 'EpilogueMovie'
|
||
|
seq = Sequence(self.makeEpilogueMovie(), name=intervalName)
|
||
|
seq.start()
|
||
|
self.storeInterval(seq, intervalName)
|
||
|
self.accept('doneChatPage', self.__doneEpilogue)
|
||
|
base.playMusic(self.epilogueMusic, looping=1, volume=0.9)
|
||
|
|
||
|
def __doneEpilogue(self, elapsedTime = 0):
|
||
|
self.notify.debug('----- __doneEpilogue')
|
||
|
intervalName = 'EpilogueMovieToonAnim'
|
||
|
self.clearInterval(intervalName)
|
||
|
track = Parallel(Sequence(Wait(0.5), Func(self.localToonToSafeZone)))
|
||
|
self.storeInterval(track, intervalName)
|
||
|
track.start()
|
||
|
|
||
|
def exitEpilogue(self):
|
||
|
self.notify.debug('----- exitEpilogue')
|
||
|
self.clearInterval('EpilogueMovieToonAnim')
|
||
|
self.unstash()
|
||
|
self.epilogueMusic.stop()
|
||
|
|
||
|
def enterFrolic(self):
|
||
|
self.notify.debug('----- enterFrolic')
|
||
|
self.setPosHpr(*ToontownGlobals.LawbotBossBattleOnePosHpr)
|
||
|
DistributedBossCog.DistributedBossCog.enterFrolic(self)
|
||
|
self.show()
|
||
|
|
||
|
def doorACallback(self, isOpen):
|
||
|
if self.insidesANodePath:
|
||
|
if isOpen:
|
||
|
self.insidesANodePath.unstash()
|
||
|
else:
|
||
|
self.insidesANodePath.stash()
|
||
|
|
||
|
def doorBCallback(self, isOpen):
|
||
|
if self.insidesBNodePath:
|
||
|
if isOpen:
|
||
|
self.insidesBNodePath.unstash()
|
||
|
else:
|
||
|
self.insidesBNodePath.stash()
|
||
|
|
||
|
def __toonsToPromotionPosition(self, toonIds, battleNode):
|
||
|
self.notify.debug('----- __toonsToPromotionPosition')
|
||
|
points = BattleBase.BattleBase.toonPoints[len(toonIds) - 1]
|
||
|
for i in xrange(len(toonIds)):
|
||
|
toon = base.cr.doId2do.get(toonIds[i])
|
||
|
if toon:
|
||
|
toon.reparentTo(render)
|
||
|
pos, h = points[i]
|
||
|
toon.setPosHpr(battleNode, pos[0], pos[1] + 10, pos[2], h, 0, 0)
|
||
|
|
||
|
def __outOfPies(self):
|
||
|
self.notify.debug('----- outOfPies')
|
||
|
self.__showOnscreenMessage(TTLocalizer.LawbotBossNeedMoreEvidence)
|
||
|
taskMgr.doMethodLater(20, self.__howToGetPies, self.uniqueName('PieAdvice'))
|
||
|
|
||
|
def __howToGetPies(self, task):
|
||
|
self.notify.debug('----- __howToGetPies')
|
||
|
self.__showOnscreenMessage(TTLocalizer.LawbotBossHowToGetEvidence)
|
||
|
|
||
|
def __howToThrowPies(self, task):
|
||
|
self.notify.debug('----- __howToThrowPies')
|
||
|
self.__showOnscreenMessage(TTLocalizer.LawbotBossHowToThrowPies)
|
||
|
|
||
|
def __foundPieButton(self):
|
||
|
self.everThrownPie = 1
|
||
|
self.__clearOnscreenMessage()
|
||
|
taskMgr.remove(self.uniqueName('PieAdvice'))
|
||
|
|
||
|
def __touchedWitnessStand(self, entry):
|
||
|
self.sendUpdate('touchWitnessStand', [])
|
||
|
self.__clearOnscreenMessage()
|
||
|
taskMgr.remove(self.uniqueName('PieAdvice'))
|
||
|
base.playSfx(self.piesRestockSfx)
|
||
|
if not self.everThrownPie:
|
||
|
taskMgr.doMethodLater(30, self.__howToThrowPies, self.uniqueName('PieAdvice'))
|
||
|
|
||
|
def __pieSplat(self, toon, pieCode):
|
||
|
if pieCode == ToontownGlobals.PieCodeBossInsides:
|
||
|
if toon == localAvatar:
|
||
|
self.d_hitBossInsides()
|
||
|
self.flashRed()
|
||
|
elif pieCode == ToontownGlobals.PieCodeBossCog:
|
||
|
if toon == localAvatar:
|
||
|
self.d_hitBoss(1)
|
||
|
if self.dizzy:
|
||
|
self.flashRed()
|
||
|
self.doAnimate('hit', now=1)
|
||
|
elif pieCode == ToontownGlobals.PieCodeDefensePan:
|
||
|
self.flashRed()
|
||
|
self.flashPanBlue()
|
||
|
base.playSfx(self.evidenceHitSfx, node=self.defensePanNodePath, volume=0.25)
|
||
|
if toon == localAvatar:
|
||
|
self.d_hitBoss(self.panDamage)
|
||
|
elif pieCode == ToontownGlobals.PieCodeProsecutionPan:
|
||
|
self.flashGreen()
|
||
|
if toon == localAvatar:
|
||
|
pass
|
||
|
elif pieCode == ToontownGlobals.PieCodeLawyer:
|
||
|
pass
|
||
|
|
||
|
def __localPieSplat(self, pieCode, entry):
|
||
|
if pieCode == ToontownGlobals.PieCodeLawyer:
|
||
|
self.__lawyerGotHit(entry)
|
||
|
if pieCode != ToontownGlobals.PieCodeToon:
|
||
|
return
|
||
|
avatarDoId = entry.getIntoNodePath().getNetTag('avatarDoId')
|
||
|
if avatarDoId == '':
|
||
|
self.notify.warning('Toon %s has no avatarDoId tag.' % repr(entry.getIntoNodePath()))
|
||
|
return
|
||
|
doId = int(avatarDoId)
|
||
|
if doId != localAvatar.doId:
|
||
|
self.d_hitToon(doId)
|
||
|
|
||
|
def __lawyerGotHit(self, entry):
|
||
|
lawyerCol = entry.getIntoNodePath()
|
||
|
names = lawyerCol.getName().split('-')
|
||
|
lawyerDoId = int(names[1])
|
||
|
for lawyer in self.lawyers:
|
||
|
if lawyerDoId == lawyer.doId:
|
||
|
lawyer.sendUpdate('hitByToon', [])
|
||
|
|
||
|
def __finalPieSplat(self, toon, pieCode):
|
||
|
if pieCode != ToontownGlobals.PieCodeDefensePan:
|
||
|
return
|
||
|
self.sendUpdate('finalPieSplat', [])
|
||
|
self.ignore('pieSplat')
|
||
|
|
||
|
def cleanupAttacks(self):
|
||
|
self.notify.debug('----- cleanupAttacks')
|
||
|
self.__cleanupStrafe()
|
||
|
|
||
|
def __cleanupStrafe(self):
|
||
|
self.notify.debug('----- __cleanupStrage')
|
||
|
if self.strafeInterval:
|
||
|
self.strafeInterval.finish()
|
||
|
self.strafeInterval = None
|
||
|
return
|
||
|
|
||
|
def __cleanupJuryBox(self):
|
||
|
self.notify.debug('----- __cleanupJuryBox')
|
||
|
if self.juryBoxIval:
|
||
|
self.juryBoxIval.finish()
|
||
|
self.juryBoxIval = None
|
||
|
if self.juryBox:
|
||
|
self.juryBox.removeNode()
|
||
|
return
|
||
|
|
||
|
def doStrafe(self, side, direction):
|
||
|
gearRoot = self.rotateNode.attachNewNode('gearRoot')
|
||
|
if side == 0:
|
||
|
gearRoot.setPos(0, -7, 3)
|
||
|
gearRoot.setHpr(180, 0, 0)
|
||
|
door = self.doorA
|
||
|
else:
|
||
|
gearRoot.setPos(0, 7, 3)
|
||
|
door = self.doorB
|
||
|
gearRoot.setTag('attackCode', str(ToontownGlobals.BossCogStrafeAttack))
|
||
|
gearModel = self.getGearFrisbee()
|
||
|
gearModel.setScale(0.1)
|
||
|
t = self.getBossDamage() / 100.0
|
||
|
gearTrack = Parallel()
|
||
|
numGears = int(4 + 6 * t + 0.5)
|
||
|
time = 5.0 - 4.0 * t
|
||
|
spread = 60 * math.pi / 180.0
|
||
|
if direction == 1:
|
||
|
spread = -spread
|
||
|
dist = 50
|
||
|
rate = time / numGears
|
||
|
for i in xrange(numGears):
|
||
|
node = gearRoot.attachNewNode(str(i))
|
||
|
node.hide()
|
||
|
node.setPos(0, 0, 0)
|
||
|
gear = gearModel.instanceTo(node)
|
||
|
angle = (float(i) / (numGears - 1) - 0.5) * spread
|
||
|
x = dist * math.sin(angle)
|
||
|
y = dist * math.cos(angle)
|
||
|
h = random.uniform(-720, 720)
|
||
|
gearTrack.append(Sequence(Wait(i * rate), Func(node.show), Parallel(node.posInterval(1, Point3(x, y, 0), fluid=1), node.hprInterval(1, VBase3(h, 0, 0), fluid=1), Sequence(SoundInterval(self.strafeSfx[i], volume=0.2, node=self), duration=0)), Func(node.detachNode)))
|
||
|
|
||
|
seq = Sequence(Func(door.request, 'open'), Wait(0.7), gearTrack, Func(door.request, 'close'))
|
||
|
self.__cleanupStrafe()
|
||
|
self.strafeInterval = seq
|
||
|
seq.start()
|
||
|
|
||
|
def replaceCollisionPolysWithPlanes(self, model):
|
||
|
newCollisionNode = CollisionNode('collisions')
|
||
|
newCollideMask = BitMask32(0)
|
||
|
planes = []
|
||
|
collList = model.findAllMatches('**/+CollisionNode')
|
||
|
if not collList:
|
||
|
collList = [model]
|
||
|
for cnp in collList:
|
||
|
cn = cnp.node()
|
||
|
if not isinstance(cn, CollisionNode):
|
||
|
self.notify.warning('Not a collision node: %s' % repr(cnp))
|
||
|
break
|
||
|
newCollideMask = newCollideMask | cn.getIntoCollideMask()
|
||
|
for i in xrange(cn.getNumSolids()):
|
||
|
solid = cn.getSolid(i)
|
||
|
if isinstance(solid, CollisionPolygon):
|
||
|
plane = Plane(solid.getPlane())
|
||
|
planes.append(plane)
|
||
|
else:
|
||
|
self.notify.warning('Unexpected collision solid: %s' % repr(solid))
|
||
|
newCollisionNode.addSolid(plane)
|
||
|
|
||
|
newCollisionNode.setIntoCollideMask(newCollideMask)
|
||
|
threshold = 0.1
|
||
|
planes.sort(lambda p1, p2: p1.compareTo(p2, threshold))
|
||
|
lastPlane = None
|
||
|
for plane in planes:
|
||
|
if lastPlane == None or plane.compareTo(lastPlane, threshold) != 0:
|
||
|
cp = CollisionPlane(plane)
|
||
|
newCollisionNode.addSolid(cp)
|
||
|
lastPlane = plane
|
||
|
|
||
|
return NodePath(newCollisionNode)
|
||
|
|
||
|
def makeIntroductionMovie(self, delayDeletes):
|
||
|
self.notify.debug('----- makeIntroductionMovie')
|
||
|
for toonId in self.involvedToons:
|
||
|
toon = self.cr.doId2do.get(toonId)
|
||
|
if toon:
|
||
|
delayDeletes.append(DelayDelete.DelayDelete(toon, 'LawbotBoss.makeIntroductionMovie'))
|
||
|
|
||
|
track = Parallel()
|
||
|
bossAnimTrack = Sequence(
|
||
|
ActorInterval(self, 'Ff_speech', startTime=2, duration=10, loop=1),
|
||
|
ActorInterval(self, 'Ff_lookRt', duration=3),
|
||
|
ActorInterval(self, 'Ff_lookRt', duration=3, startTime=3, endTime=0),
|
||
|
ActorInterval(self, 'Ff_neutral', duration=2),
|
||
|
ActorInterval(self, 'Ff_speech', duration=7, loop=1))
|
||
|
track.append(bossAnimTrack)
|
||
|
attackToons = TTLocalizer.BossCogAttackToons
|
||
|
dialogTrack = Track(
|
||
|
(0, Func(self.setChatAbsolute, TTLocalizer.LawbotBossTempIntro0, CFSpeech)),
|
||
|
(5.6, Func(self.setChatAbsolute, TTLocalizer.LawbotBossTempIntro1, CFSpeech)),
|
||
|
(12, Func(self.setChatAbsolute, TTLocalizer.LawbotBossTempIntro2, CFSpeech)),
|
||
|
(18, Func(self.setChatAbsolute, TTLocalizer.LawbotBossTempIntro3, CFSpeech)),
|
||
|
(22, Func(self.setChatAbsolute, TTLocalizer.LawbotBossTempIntro4, CFSpeech)),
|
||
|
(24, Sequence(
|
||
|
Func(self.clearChat),
|
||
|
self.loseCogSuits(self.toonsA + self.toonsB, render, (-2.798, -70, 10, 180, 0, 0)))),
|
||
|
(27, Sequence(
|
||
|
self.toonNormalEyes(self.involvedToons),
|
||
|
Func(self.loop, 'Ff_neutral'),
|
||
|
Func(self.setChatAbsolute, attackToons, CFSpeech))))
|
||
|
track.append(dialogTrack)
|
||
|
return Sequence(
|
||
|
Func(self.stickToonsToFloor),
|
||
|
track,
|
||
|
Func(self.unstickToons), name=self.uniqueName('Introduction'))
|
||
|
|
||
|
def walkToonsToBattlePosition(self, toonIds, battleNode):
|
||
|
self.notify.debug('walkToonsToBattlePosition-----------------------------------------------')
|
||
|
self.notify.debug('toonIds=%s battleNode=%s' % (toonIds, battleNode))
|
||
|
ival = Parallel()
|
||
|
points = BattleBase.BattleBase.toonPoints[len(toonIds) - 1]
|
||
|
self.notify.debug('walkToonsToBattlePosition: points = %s' % points[0][0])
|
||
|
for i in xrange(len(toonIds)):
|
||
|
toon = base.cr.doId2do.get(toonIds[i])
|
||
|
if toon:
|
||
|
pos, h = points[i]
|
||
|
origPos = pos
|
||
|
self.notify.debug('origPos = %s' % origPos)
|
||
|
self.notify.debug('batlleNode.getTransform = %s render.getTransform=%s' % (battleNode.getTransform(), render.getTransform()))
|
||
|
self.notify.debug('render.getScale()=%s battleNode.getScale()=%s' % (render.getScale(), battleNode.getScale()))
|
||
|
myCurPos = self.getPos()
|
||
|
self.notify.debug('myCurPos = %s' % self.getPos())
|
||
|
self.notify.debug('battleNode.parent() = %s' % battleNode.getParent())
|
||
|
self.notify.debug('battleNode.parent().getPos() = %s' % battleNode.getParent().getPos())
|
||
|
bnParent = battleNode.getParent()
|
||
|
battleNode.wrtReparentTo(render)
|
||
|
bnWorldPos = battleNode.getPos()
|
||
|
battleNode.wrtReparentTo(bnParent)
|
||
|
self.notify.debug('battle node world pos = %s' % bnWorldPos)
|
||
|
pos = render.getRelativePoint(battleNode, pos)
|
||
|
self.notify.debug('walktToonsToBattlePosition: render.getRelativePoint result = %s' % pos)
|
||
|
self.notify.debug('walkToonsToBattlePosition: final pos = %s' % pos)
|
||
|
ival.append(Sequence(Func(toon.setPlayRate, 0.8, 'walk'), Func(toon.loop, 'walk'), toon.posInterval(3, pos), Func(toon.setPlayRate, 1, 'walk'), Func(toon.loop, 'neutral')))
|
||
|
|
||
|
return ival
|
||
|
|
||
|
def toonsToBattlePosition(self, toonIds, battleNode):
|
||
|
self.notify.debug('DistrutedLawbotBoss.toonsToBattlePosition----------------------------------------')
|
||
|
self.notify.debug('toonIds=%s battleNode=%s' % (toonIds, battleNode))
|
||
|
if len(toonIds) < 5:
|
||
|
points = BattleBase.BattleBase.toonPoints[len(toonIds) - 1]
|
||
|
else:
|
||
|
points = list(BattleBase.BattleBase.toonPoints[3])
|
||
|
points.extend(BattleBase.BattleBase.toonPoints[len(toonIds) - 5])
|
||
|
self.notify.debug('toonsToBattlePosition: points = %s' % points[0][0])
|
||
|
for i in xrange(len(toonIds)):
|
||
|
toon = base.cr.doId2do.get(toonIds[i])
|
||
|
if toon:
|
||
|
toon.wrtReparentTo(render)
|
||
|
pos, h = points[i]
|
||
|
if i > 3:
|
||
|
pos.setY(pos.getY() + 2.0)
|
||
|
bnParent = battleNode.getParent()
|
||
|
battleNode.wrtReparentTo(render)
|
||
|
bnWorldPos = battleNode.getPos()
|
||
|
battleNode.wrtReparentTo(bnParent)
|
||
|
toon.setPosHpr(battleNode, pos[0], pos[1], pos[2], h, 0, 0)
|
||
|
self.notify.debug('new toon pos %s ' % toon.getPos())
|
||
|
|
||
|
def touchedGavel(self, gavel, entry):
|
||
|
self.notify.debug('touchedGavel')
|
||
|
attackCodeStr = entry.getIntoNodePath().getNetTag('attackCode')
|
||
|
if attackCodeStr == '':
|
||
|
self.notify.warning('Node %s has no attackCode tag.' % repr(entry.getIntoNodePath()))
|
||
|
return
|
||
|
attackCode = int(attackCodeStr)
|
||
|
into = entry.getIntoNodePath()
|
||
|
self.zapLocalToon(attackCode, into)
|
||
|
|
||
|
def touchedGavelHandle(self, gavel, entry):
|
||
|
attackCodeStr = entry.getIntoNodePath().getNetTag('attackCode')
|
||
|
if attackCodeStr == '':
|
||
|
self.notify.warning('Node %s has no attackCode tag.' % repr(entry.getIntoNodePath()))
|
||
|
return
|
||
|
attackCode = int(attackCodeStr)
|
||
|
into = entry.getIntoNodePath()
|
||
|
self.zapLocalToon(attackCode, into)
|
||
|
|
||
|
def createBlock(self, x1, y1, z1, x2, y2, z2, r = 1.0, g = 1.0, b = 1.0, a = 1.0):
|
||
|
gFormat = GeomVertexFormat.getV3n3cpt2()
|
||
|
myVertexData = GeomVertexData('holds my vertices', gFormat, Geom.UHDynamic)
|
||
|
vertexWriter = GeomVertexWriter(myVertexData, 'vertex')
|
||
|
normalWriter = GeomVertexWriter(myVertexData, 'normal')
|
||
|
colorWriter = GeomVertexWriter(myVertexData, 'color')
|
||
|
texWriter = GeomVertexWriter(myVertexData, 'texcoord')
|
||
|
vertexWriter.addData3f(x1, y1, z1)
|
||
|
vertexWriter.addData3f(x2, y1, z1)
|
||
|
vertexWriter.addData3f(x1, y2, z1)
|
||
|
vertexWriter.addData3f(x2, y2, z1)
|
||
|
vertexWriter.addData3f(x1, y1, z2)
|
||
|
vertexWriter.addData3f(x2, y1, z2)
|
||
|
vertexWriter.addData3f(x1, y2, z2)
|
||
|
vertexWriter.addData3f(x2, y2, z2)
|
||
|
for index in xrange(8):
|
||
|
normalWriter.addData3f(1.0, 1.0, 1.0)
|
||
|
colorWriter.addData4f(r, g, b, a)
|
||
|
texWriter.addData2f(1.0, 1.0)
|
||
|
|
||
|
tris = GeomTriangles(Geom.UHDynamic)
|
||
|
tris.addVertex(0)
|
||
|
tris.addVertex(1)
|
||
|
tris.addVertex(2)
|
||
|
tris.closePrimitive()
|
||
|
tris.addVertex(1)
|
||
|
tris.addVertex(3)
|
||
|
tris.addVertex(2)
|
||
|
tris.closePrimitive()
|
||
|
tris.addVertex(2)
|
||
|
tris.addVertex(3)
|
||
|
tris.addVertex(6)
|
||
|
tris.closePrimitive()
|
||
|
tris.addVertex(3)
|
||
|
tris.addVertex(7)
|
||
|
tris.addVertex(6)
|
||
|
tris.closePrimitive()
|
||
|
tris.addVertex(0)
|
||
|
tris.addVertex(2)
|
||
|
tris.addVertex(4)
|
||
|
tris.closePrimitive()
|
||
|
tris.addVertex(2)
|
||
|
tris.addVertex(6)
|
||
|
tris.addVertex(4)
|
||
|
tris.closePrimitive()
|
||
|
tris.addVertex(1)
|
||
|
tris.addVertex(5)
|
||
|
tris.addVertex(3)
|
||
|
tris.closePrimitive()
|
||
|
tris.addVertex(3)
|
||
|
tris.addVertex(5)
|
||
|
tris.addVertex(7)
|
||
|
tris.closePrimitive()
|
||
|
tris.addVertex(0)
|
||
|
tris.addVertex(4)
|
||
|
tris.addVertex(5)
|
||
|
tris.closePrimitive()
|
||
|
tris.addVertex(1)
|
||
|
tris.addVertex(0)
|
||
|
tris.addVertex(5)
|
||
|
tris.closePrimitive()
|
||
|
tris.addVertex(4)
|
||
|
tris.addVertex(6)
|
||
|
tris.addVertex(7)
|
||
|
tris.closePrimitive()
|
||
|
tris.addVertex(7)
|
||
|
tris.addVertex(5)
|
||
|
tris.addVertex(4)
|
||
|
tris.closePrimitive()
|
||
|
cubeGeom = Geom(myVertexData)
|
||
|
cubeGeom.addPrimitive(tris)
|
||
|
cubeGN = GeomNode('cube')
|
||
|
cubeGN.addGeom(cubeGeom)
|
||
|
return cubeGN
|
||
|
|
||
|
def __enterDefenseCol(self, entry):
|
||
|
self.notify.debug('__enterDefenseCol')
|
||
|
|
||
|
def __enterProsecutionCol(self, entry):
|
||
|
self.notify.debug('__enterProsecutionCol')
|
||
|
|
||
|
def makeVictoryMovie(self):
|
||
|
myFromPos = Point3(ToontownGlobals.LawbotBossBattleThreePosHpr[0], ToontownGlobals.LawbotBossBattleThreePosHpr[1], ToontownGlobals.LawbotBossBattleThreePosHpr[2])
|
||
|
myToPos = Point3(myFromPos[0], myFromPos[1] + 30, myFromPos[2])
|
||
|
rollThroughDoor = self.rollBossToPoint(fromPos=myFromPos, fromHpr=None, toPos=myToPos, toHpr=None, reverse=0)
|
||
|
rollTrack = Sequence(
|
||
|
Func(self.getGeomNode().setH, 180),
|
||
|
rollThroughDoor[0],
|
||
|
Func(self.getGeomNode().setH, 0))
|
||
|
rollTrackDuration = rollTrack.getDuration()
|
||
|
self.notify.debug('rollTrackDuration = %f' % rollTrackDuration)
|
||
|
doorStartPos = self.door3.getPos()
|
||
|
doorEndPos = Point3(doorStartPos[0], doorStartPos[1], doorStartPos[2] + 25)
|
||
|
bossTrack = Track(
|
||
|
(0.5, Sequence(
|
||
|
Func(self.clearChat),
|
||
|
Func(camera.reparentTo, render),
|
||
|
Func(camera.setPos, -3, 45, 25),
|
||
|
Func(camera.setHpr, 0, 10, 0))),
|
||
|
(1.0, Func(self.setChatAbsolute, TTLocalizer.LawbotBossDefenseWins1, CFSpeech)),
|
||
|
(5.5, Func(self.setChatAbsolute, TTLocalizer.LawbotBossDefenseWins2, CFSpeech)),
|
||
|
(9.5, Sequence(Func(camera.wrtReparentTo, render))),
|
||
|
(9.6, Parallel(
|
||
|
rollTrack,
|
||
|
Func(self.setChatAbsolute, TTLocalizer.LawbotBossDefenseWins3, CFSpeech),
|
||
|
self.door3.posInterval(2, doorEndPos, startPos=doorStartPos))),
|
||
|
(13.1, Sequence(self.door3.posInterval(1, doorStartPos))))
|
||
|
retTrack = Parallel(bossTrack, ActorInterval(self, 'Ff_speech', loop=1))
|
||
|
return bossTrack
|
||
|
|
||
|
def makeEpilogueMovie(self):
|
||
|
epSpeech = TTLocalizer.WitnessToonCongratulations
|
||
|
epSpeech = self.__talkAboutPromotion(epSpeech)
|
||
|
bossTrack = Sequence(Func(self.witnessToon.animFSM.request, 'neutral'), Func(self.witnessToon.setLocalPageChat, epSpeech, 0))
|
||
|
return bossTrack
|
||
|
|
||
|
def makeDefeatMovie(self):
|
||
|
bossTrack = Track((0.0, Sequence(Func(self.clearChat), Func(self.reverseHead), ActorInterval(self, 'Ff_speech'))), (1.0, Func(self.setChatAbsolute, TTLocalizer.LawbotBossProsecutionWins, CFSpeech)))
|
||
|
return bossTrack
|
||
|
|
||
|
def __makeWitnessToon(self):
|
||
|
dnaNetString = 't\x1b\x00\x01\x01\x00\x03\x00\x03\x01\x10\x13\x00\x13\x13'
|
||
|
npc = Toon.Toon()
|
||
|
npc.setDNAString(dnaNetString)
|
||
|
npc.setName(TTLocalizer.WitnessToonName)
|
||
|
npc.setPickable(0)
|
||
|
npc.setPlayerType(NametagGroup.CCNonPlayer)
|
||
|
npc.animFSM.request('Sit')
|
||
|
self.witnessToon = npc
|
||
|
self.witnessToon.setPosHpr(*ToontownGlobals.LawbotBossWitnessStandPosHpr)
|
||
|
|
||
|
def __cleanupWitnessToon(self):
|
||
|
self.__hideWitnessToon()
|
||
|
if self.witnessToon:
|
||
|
self.witnessToon.removeActive()
|
||
|
self.witnessToon.delete()
|
||
|
self.witnessToon = None
|
||
|
return
|
||
|
|
||
|
def __showWitnessToon(self):
|
||
|
if not self.witnessToonOnstage:
|
||
|
self.witnessToon.addActive()
|
||
|
self.witnessToon.reparentTo(self.geom)
|
||
|
seatCenter = self.realWitnessStand.find('**/witnessStandSeatEdge')
|
||
|
center = seatCenter.getPos()
|
||
|
self.notify.debug('center = %s' % center)
|
||
|
self.witnessToon.setPos(center)
|
||
|
self.witnessToon.setH(180)
|
||
|
self.witnessToon.setZ(self.witnessToon.getZ() - 1.5)
|
||
|
self.witnessToon.setY(self.witnessToon.getY() - 1.15)
|
||
|
self.witnessToonOnstage = 1
|
||
|
|
||
|
def __hideWitnessToon(self):
|
||
|
if self.witnessToonOnstage:
|
||
|
self.witnessToon.removeActive()
|
||
|
self.witnessToon.detachNode()
|
||
|
self.witnessToonOnstage = 0
|
||
|
|
||
|
def __hideToons(self):
|
||
|
for toonId in self.involvedToons:
|
||
|
toon = self.cr.doId2do.get(toonId)
|
||
|
if toon:
|
||
|
toon.hide()
|
||
|
|
||
|
def __showToons(self):
|
||
|
for toonId in self.involvedToons:
|
||
|
toon = self.cr.doId2do.get(toonId)
|
||
|
if toon:
|
||
|
toon.show()
|
||
|
|
||
|
def __arrangeToonsAroundWitnessToon(self):
|
||
|
radius = 7
|
||
|
numToons = len(self.involvedToons)
|
||
|
center = (numToons - 1) / 2.0
|
||
|
for i in xrange(numToons):
|
||
|
toon = self.cr.doId2do.get(self.involvedToons[i])
|
||
|
if toon:
|
||
|
angle = 90 - 15 * (i - center)
|
||
|
radians = angle * math.pi / 180.0
|
||
|
x = math.cos(radians) * radius
|
||
|
y = math.sin(radians) * radius
|
||
|
toon.setPos(self.witnessToon, x, y, 0)
|
||
|
toon.headsUp(self.witnessToon)
|
||
|
toon.loop('neutral')
|
||
|
toon.show()
|
||
|
|
||
|
def __talkAboutPromotion(self, speech):
|
||
|
if self.prevCogSuitLevel < ToontownGlobals.MaxCogSuitLevel:
|
||
|
newCogSuitLevel = localAvatar.getCogLevels()[CogDisguiseGlobals.dept2deptIndex(self.style.dept)]
|
||
|
if newCogSuitLevel == ToontownGlobals.MaxCogSuitLevel:
|
||
|
speech += TTLocalizer.WitnessToonLastPromotion % (ToontownGlobals.MaxCogSuitLevel + 1)
|
||
|
if newCogSuitLevel in ToontownGlobals.CogSuitHPLevels:
|
||
|
speech += TTLocalizer.WitnessToonHPBoost
|
||
|
else:
|
||
|
speech += TTLocalizer.WitnessToonMaxed % (ToontownGlobals.MaxCogSuitLevel + 1)
|
||
|
return speech
|
||
|
|
||
|
def __positionToonsInFrontOfCannons(self):
|
||
|
self.notify.debug('__positionToonsInFrontOfCannons')
|
||
|
index = 0
|
||
|
self.involvedToons.sort()
|
||
|
for toonId in self.involvedToons:
|
||
|
if index in self.cannons:
|
||
|
cannon = self.cannons[index]
|
||
|
toon = self.cr.doId2do.get(toonId)
|
||
|
self.notify.debug('cannonId = %d' % cannon.doId)
|
||
|
cannonPos = cannon.nodePath.getPos(render)
|
||
|
self.notify.debug('cannonPos = %s' % cannonPos)
|
||
|
if toon:
|
||
|
self.notify.debug('toon = %s' % toon.getName())
|
||
|
toon.reparentTo(cannon.nodePath)
|
||
|
toon.setPos(0, 8, 0)
|
||
|
toon.setH(180)
|
||
|
renderPos = toon.getPos(render)
|
||
|
self.notify.debug('renderPos =%s' % renderPos)
|
||
|
index += 1
|
||
|
|
||
|
self.notify.debug('done with positionToons')
|
||
|
|
||
|
def __makePrepareBattleTwoMovie(self):
|
||
|
chatString = TTLocalizer.WitnessToonPrepareBattleTwo % ToontownGlobals.LawbotBossJurorsForBalancedScale
|
||
|
movie = Sequence(Func(camera.reparentTo, self.witnessToon), Func(camera.setPos, 0, 8, 2), Func(camera.setHpr, 180, 10, 0), Func(self.witnessToon.setLocalPageChat, chatString, 0))
|
||
|
return movie
|
||
|
|
||
|
def __doWitnessPrepareBattleThreeChat(self):
|
||
|
self.notify.debug('__doWitnessPrepareBattleThreeChat: original self.numToonJurorsSeated = %d' % self.numToonJurorsSeated)
|
||
|
self.countToonJurors()
|
||
|
self.notify.debug('after calling self.countToonJurors, numToonJurorsSeated=%d' % self.numToonJurorsSeated)
|
||
|
if self.numToonJurorsSeated == 0:
|
||
|
juryResult = TTLocalizer.WitnessToonNoJuror
|
||
|
elif self.numToonJurorsSeated == 1:
|
||
|
juryResult = TTLocalizer.WitnessToonOneJuror
|
||
|
elif self.numToonJurorsSeated == 12:
|
||
|
juryResult = TTLocalizer.WitnessToonAllJurors
|
||
|
else:
|
||
|
juryResult = TTLocalizer.WitnessToonSomeJurors % self.numToonJurorsSeated
|
||
|
juryResult += '\x07'
|
||
|
trialSpeech = juryResult
|
||
|
trialSpeech += TTLocalizer.WitnessToonPrepareBattleThree
|
||
|
diffSettings = ToontownGlobals.LawbotBossDifficultySettings[self.battleDifficulty]
|
||
|
if diffSettings[4]:
|
||
|
newWeight, self.bonusWeight, self.numJurorsLocalToonSeated = self.calculateWeightOfToon(base.localAvatar.doId)
|
||
|
if self.bonusWeight > 0:
|
||
|
if self.bonusWeight == 1:
|
||
|
juryWeightBonus = TTLocalizer.WitnessToonJuryWeightBonusSingular.get(self.battleDifficulty)
|
||
|
else:
|
||
|
juryWeightBonus = TTLocalizer.WitnessToonJuryWeightBonusPlural.get(self.battleDifficulty)
|
||
|
if juryWeightBonus:
|
||
|
weightBonusText = juryWeightBonus % (self.numJurorsLocalToonSeated, self.bonusWeight)
|
||
|
trialSpeech += '\x07'
|
||
|
trialSpeech += weightBonusText
|
||
|
self.witnessToon.setLocalPageChat(trialSpeech, 0)
|
||
|
|
||
|
def __makePrepareBattleThreeMovie(self):
|
||
|
movie = Sequence(Func(camera.reparentTo, render), Func(camera.setPos, -15, 15, 20), Func(camera.setHpr, -90, 0, 0), Wait(3), Func(camera.reparentTo, self.witnessToon), Func(camera.setPos, 0, 8, 2), Func(camera.setHpr, 180, 10, 0), Func(self.__doWitnessPrepareBattleThreeChat))
|
||
|
return movie
|
||
|
|
||
|
def countToonJurors(self):
|
||
|
self.numToonJurorsSeated = 0
|
||
|
for key in self.chairs.keys():
|
||
|
chair = self.chairs[key]
|
||
|
if chair.state == 'ToonJuror' or chair.state == None and chair.newState == 'ToonJuror':
|
||
|
self.numToonJurorsSeated += 1
|
||
|
|
||
|
self.notify.debug('self.numToonJurorsSeated = %d' % self.numToonJurorsSeated)
|
||
|
return
|
||
|
|
||
|
def cleanupPanFlash(self):
|
||
|
if self.panFlashInterval:
|
||
|
self.panFlashInterval.finish()
|
||
|
self.panFlashInterval = None
|
||
|
return
|
||
|
|
||
|
def flashPanBlue(self):
|
||
|
self.cleanupPanFlash()
|
||
|
intervalName = 'FlashPanBlue'
|
||
|
self.defensePanNodePath.setColorScale(1, 1, 1, 1)
|
||
|
seq = Sequence(self.defensePanNodePath.colorScaleInterval(0.1, colorScale=VBase4(0, 0, 1, 1)), self.defensePanNodePath.colorScaleInterval(0.3, colorScale=VBase4(1, 1, 1, 1)), name=intervalName)
|
||
|
self.panFlashInterval = seq
|
||
|
seq.start()
|
||
|
self.storeInterval(seq, intervalName)
|
||
|
|
||
|
def saySomething(self, chatString):
|
||
|
intervalName = 'ChiefJusticeTaunt'
|
||
|
seq = Sequence(name=intervalName)
|
||
|
seq.append(Func(self.setChatAbsolute, chatString, CFSpeech))
|
||
|
seq.append(Wait(4.0))
|
||
|
seq.append(Func(self.clearChat))
|
||
|
oldSeq = self.activeIntervals.get(intervalName)
|
||
|
if oldSeq:
|
||
|
oldSeq.finish()
|
||
|
seq.start()
|
||
|
self.storeInterval(seq, intervalName)
|
||
|
|
||
|
def setTaunt(self, tauntIndex, extraInfo):
|
||
|
gotError = False
|
||
|
if not hasattr(self, 'state'):
|
||
|
self.notify.warning('returning from setTaunt, no attr state')
|
||
|
gotError = True
|
||
|
elif not self.state == 'BattleThree':
|
||
|
self.notify.warning('returning from setTaunt, not in battle three state, state=%s', self.state)
|
||
|
gotError = True
|
||
|
if not hasattr(self, 'nametag'):
|
||
|
self.notify.warning('returning from setTaunt, no attr nametag')
|
||
|
gotError = True
|
||
|
if gotError:
|
||
|
st = StackTrace()
|
||
|
print st
|
||
|
return
|
||
|
chatString = TTLocalizer.LawbotBossTaunts[1]
|
||
|
if tauntIndex == 0:
|
||
|
if extraInfo < len(self.involvedToons):
|
||
|
toonId = self.involvedToons[extraInfo]
|
||
|
toon = base.cr.doId2do.get(toonId)
|
||
|
if toon:
|
||
|
chatString = TTLocalizer.LawbotBossTaunts[tauntIndex] % toon.getName()
|
||
|
else:
|
||
|
chatString = TTLocalizer.LawbotBossTaunts[tauntIndex]
|
||
|
self.saySomething(chatString)
|
||
|
|
||
|
def toonGotHealed(self, toonId):
|
||
|
toon = base.cr.doId2do.get(toonId)
|
||
|
if toon:
|
||
|
base.playSfx(self.toonUpSfx, node=toon)
|
||
|
|
||
|
def hideBonusTimer(self):
|
||
|
if self.bonusTimer:
|
||
|
self.bonusTimer.hide()
|
||
|
|
||
|
def enteredBonusState(self):
|
||
|
self.witnessToon.clearChat()
|
||
|
text = TTLocalizer.WitnessToonBonus % (ToontownGlobals.LawbotBossBonusWeightMultiplier, ToontownGlobals.LawbotBossBonusDuration)
|
||
|
self.witnessToon.setChatAbsolute(text, CFSpeech | CFTimeout)
|
||
|
base.playSfx(self.toonUpSfx)
|
||
|
if not self.bonusTimer:
|
||
|
self.bonusTimer = ToontownTimer.ToontownTimer()
|
||
|
self.bonusTimer.posInTopRightCorner()
|
||
|
self.bonusTimer.show()
|
||
|
self.bonusTimer.countdown(ToontownGlobals.LawbotBossBonusDuration, self.hideBonusTimer)
|
||
|
|
||
|
def setAttackCode(self, attackCode, avId = 0):
|
||
|
DistributedBossCog.DistributedBossCog.setAttackCode(self, attackCode, avId)
|
||
|
if attackCode == ToontownGlobals.BossCogAreaAttack:
|
||
|
self.saySomething(TTLocalizer.LawbotBossAreaAttackTaunt)
|
||
|
base.playSfx(self.warningSfx)
|
||
|
|
||
|
def setBattleDifficulty(self, diff):
|
||
|
self.notify.debug('battleDifficulty = %d' % diff)
|
||
|
self.battleDifficulty = diff
|
||
|
|
||
|
def toonEnteredCannon(self, toonId, cannonIndex):
|
||
|
if base.localAvatar.doId == toonId:
|
||
|
self.cannonIndex = cannonIndex
|
||
|
|
||
|
def numJurorsSeatedByCannon(self, cannonIndex):
|
||
|
retVal = 0
|
||
|
for chair in self.chairs.values():
|
||
|
if chair.state == 'ToonJuror':
|
||
|
if chair.toonJurorIndex == cannonIndex:
|
||
|
retVal += 1
|
||
|
|
||
|
return retVal
|
||
|
|
||
|
def calculateWeightOfToon(self, toonId):
|
||
|
defaultWeight = 1
|
||
|
bonusWeight = 0
|
||
|
newWeight = 1
|
||
|
cannonIndex = self.cannonIndex
|
||
|
numJurors = 0
|
||
|
if not cannonIndex == None and cannonIndex >= 0:
|
||
|
diffSettings = ToontownGlobals.LawbotBossDifficultySettings[self.battleDifficulty]
|
||
|
if diffSettings[4]:
|
||
|
numJurors = self.numJurorsSeatedByCannon(cannonIndex)
|
||
|
bonusWeight = numJurors - diffSettings[5]
|
||
|
if bonusWeight < 0:
|
||
|
bonusWeight = 0
|
||
|
newWeight = defaultWeight + bonusWeight
|
||
|
self.notify.debug('toon %d has weight of %d' % (toonId, newWeight))
|
||
|
return (newWeight, bonusWeight, numJurors)
|