Poodletooth-iLand/toontown/effects/FireworkShowMixin.py

285 lines
14 KiB
Python

from direct.directnotify import DirectNotifyGlobal
from direct.distributed.ClockDelta import *
from direct.interval.IntervalGlobal import *
from toontown.toonbase.ToontownGlobals import *
from toontown.toonbase import TTLocalizer
from toontown.parties import PartyGlobals
from toontown.hood import *
import Fireworks
import FireworkShows
from FireworkGlobals import skyTransitionDuration, preShowPauseDuration, postShowPauseDuration, preNormalMusicPauseDuration
from toontown.effects.FireworkShow import FireworkShow
class FireworkShowMixin:
notify = DirectNotifyGlobal.directNotify.newCategory('FireworkShowMixin')
def __init__(self, restorePlaygroundMusic = True, startDelay = 0.0):
self.currentShow = None
self.restorePlaygroundMusic = restorePlaygroundMusic
self.startDelay = startDelay
self.timestamp = None
self.fireworkShow = None
self.eventId = SUMMER_FIREWORKS
self.accept('MusicEnabled', self.startMusic)
return
def disable(self):
if self.currentShow:
self.currentShow.pause()
self.currentShow = None
if base.cr.config.GetBool('want-old-fireworks', 0):
ivalMgr.finishIntervalsMatching('shootFirework*')
else:
self.destroyFireworkShow()
from toontown.hood import DDHood
if isinstance(self.getHood(), DDHood.DDHood):
self.getHood().whiteFogColor = Vec4(0.8, 0.8, 0.8, 1)
self.restoreCameraLens()
if hasattr(self.getHood(), 'loader'):
self.getGeom().clearColorScale()
if hasattr(self.getHood(), 'sky'):
self.getSky().show()
self.getSky().clearColorScale()
if hasattr(base, 'localAvatar') and base.localAvatar:
base.localAvatar.clearColorScale()
base.setBackgroundColor(DefaultBackgroundColor)
self.ignoreAll()
return
def startMusic(self):
if self.timestamp:
self.getLoader().music.stop()
t = globalClockDelta.localElapsedTime(self.timestamp) - self.startDelay
base.playMusic(self.showMusic, 0, 1, 1, max(0, t))
def shootFirework(self, x, y, z, style, color1, color2):
amp = 5
Fireworks.shootFirework(style, x, y, z, color1, color2, amp)
def startShow(self, eventId, style, songId, timestamp, root = render):
t = globalClockDelta.localElapsedTime(timestamp) - self.startDelay
self.timestamp = timestamp
self.showMusic = None
self.eventId = eventId
if base.config.GetBool('want-old-fireworks', 0):
self.currentShow = self.getFireworkShowIval(eventId, style, songId, t)
if self.currentShow:
self.currentShow.start(t)
else:
self.createFireworkShow()
if t > self.fireworkShow.getShowDuration():
return
preShow = self.preShow(eventId, songId, t)
postShow = self.postShow(eventId)
beginFireworkShow = Func(self.beginFireworkShow, max(0, t), root)
self.currentShow = Sequence(preShow, beginFireworkShow, Wait(max(0, self.fireworkShow.getShowDuration() - max(0, t))), postShow)
self.currentShow.start()
return
def preShow(self, eventId, songId, startT):
if eventId == SUMMER_FIREWORKS:
instructionMessage = TTLocalizer.FireworksInstructions
startMessage = TTLocalizer.FireworksJuly4Beginning
endMessage = TTLocalizer.FireworksJuly4Ending
songs = ['tt_summer', 'firework_music']
musicFile = 'phase_4/audio/bgm/%s.ogg' % songs[songId]
elif eventId == NEW_YEAR_FIREWORKS:
instructionMessage = TTLocalizer.FireworksInstructions
startMessage = TTLocalizer.FireworksNewYearsEveBeginning
endMessage = TTLocalizer.FireworksNewYearsEveEnding
songs = ['new_years_fireworks_music', 'tt_s_ara_gen_fireworks_auldLangSyne']
musicFile = 'phase_4/audio/bgm/%s.ogg' % songs[songId]
elif eventId == PartyGlobals.FireworkShows.Summer:
instructionMessage = TTLocalizer.FireworksActivityInstructions
startMessage = TTLocalizer.FireworksActivityBeginning
endMessage = TTLocalizer.FireworksActivityEnding
songs = ['tt_party1', 'tt_party2']
musicFile = 'phase_4/audio/bgm/%s.ogg' % songs[songId]
elif eventId == COMBO_FIREWORKS:
instructionMessage = TTLocalizer.FireworksInstructions
startMessage = TTLocalizer.FireworksComboBeginning
endMessage = TTLocalizer.FireworksComboEnding
songs = ['new_years_fireworks_music', 'tt_s_ara_gen_fireworks_auldLangSyne']
musicFile = 'phase_4/audio/bgm/%s.ogg' % songs[songId]
else:
FireworkShowMixin.notify.warning('Invalid fireworks event ID: %d' % eventId)
return None
self.showMusic = loader.loadMusic(musicFile)
self.showMusic.setVolume(1)
def __lightDecorationOn__():
place = base.cr.playGame.getPlace()
if place is None:
return
if hasattr(place, 'halloweenLights'):
if not self.__checkStreetValidity():
return
else:
place.halloweenLights = base.cr.playGame.getPlace().loader.geom.findAllMatches('**/*light*')
place.halloweenLights.extend(base.cr.playGame.getPlace().loader.geom.findAllMatches('**/*lamp*'))
for light in place.halloweenLights:
light.setColorScaleOff(0)
elif not self.__checkHoodValidity():
return
else:
place.loader.hood.halloweenLights = base.cr.playGame.hood.loader.geom.findAllMatches('**/*light*')
place.loader.hood.halloweenLights.extend(base.cr.playGame.hood.loader.geom.findAllMatches('**/*lamp*'))
for light in base.cr.playGame.hood.halloweenLights:
light.setColorScaleOff(0)
if self.fireworkShow and not self.fireworkShow.isEmpty():
self.fireworkShow.setColorScaleOff(0)
return
if self.__checkHoodValidity() and hasattr(base.cr.playGame, 'hood') and base.cr.playGame.hood and hasattr(base.cr.playGame.hood, 'sky') and base.cr.playGame.hood.sky:
preShow = Sequence(Func(base.localAvatar.setSystemMessage, 0, startMessage), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.sky, 2.5, Vec4(0.0, 0.0, 0.0, 1.0)), LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, 2.5, Vec4(0.25, 0.25, 0.35, 1)), LerpColorScaleInterval(base.localAvatar, 2.5, Vec4(0.85, 0.85, 0.85, 1)), Func(__lightDecorationOn__)), Func(base.setBackgroundColor, Vec4(0, 0, 0, 1)), Func(self.__checkDDFog), Func(base.camLens.setFar, 1000.0), Func(base.cr.playGame.hood.sky.hide), Func(base.localAvatar.setSystemMessage, 0, instructionMessage), Func(self.getLoader().music.stop), Wait(2.0), Func(base.playMusic, self.showMusic, 0, 1, 0.8, max(0, startT)))
return preShow
return None
def restoreCameraLens(self):
hood = self.getHood()
if hood != None:
if hood.id == GoofySpeedway or hood.id == OutdoorZone:
base.camLens.setFar(SpeedwayCameraFar)
else:
base.camLens.setFar(DefaultCameraFar)
def postShow(self, eventId):
if eventId == SUMMER_FIREWORKS:
endMessage = TTLocalizer.FireworksJuly4Ending
elif eventId == NEW_YEAR_FIREWORKS:
endMessage = TTLocalizer.FireworksNewYearsEveEnding
elif eventId == PartyGlobals.FireworkShows.Summer:
endMessage = TTLocalizer.FireworksActivityEnding
elif eventId == COMBO_FIREWORKS:
endMessage = TTLocalizer.FireworksComboEnding
else:
FireworkShowMixin.notify.warning('Invalid fireworks event ID: %d' % eventId)
return None
if self.__checkHoodValidity() and hasattr(base.cr.playGame.hood, 'sky') and base.cr.playGame.hood.sky:
postShow = Sequence(Func(base.cr.playGame.hood.sky.show), Parallel(LerpColorScaleInterval(base.cr.playGame.hood.sky, 2.5, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(base.cr.playGame.hood.loader.geom, 2.5, Vec4(1, 1, 1, 1)), LerpColorScaleInterval(base.localAvatar, 2.5, Vec4(1, 1, 1, 1))), Func(self.__restoreDDFog), Func(self.restoreCameraLens), Func(base.setBackgroundColor, DefaultBackgroundColor), Func(self.showMusic.stop), Func(base.localAvatar.setSystemMessage, 0, endMessage))
if self.restorePlaygroundMusic:
postShow.append(Wait(2.0))
postShow.append(Func(base.playMusic, self.getLoader().music, 1, 1, 0.8))
return postShow
def createFireworkShow(self):
if not self.fireworkShow:
self.fireworkShow = FireworkShow(self.eventId)
def destroyFireworkShow(self):
if self.fireworkShow:
self.fireworkShow.cleanupShow()
self.fireworkShow = None
return
def beginFireworkShow(self, timeStamp, root):
if self.fireworkShow and not self.fireworkShow.isPlaying():
self.fireworkShow.begin(timeStamp)
self.fireworkShow.reparentTo(root)
hood = self.getHood()
if isinstance(hood, TTHood.TTHood):
self.fireworkShow.setPos(150, 0, 80)
self.fireworkShow.setHpr(90, 0, 0)
elif isinstance(hood, BRHood.BRHood):
self.fireworkShow.setPos(-200, -60, 50)
self.fireworkShow.setHpr(270, 0, 0)
elif isinstance(hood, MMHood.MMHood):
self.fireworkShow.setPos(150, -25, 40)
self.fireworkShow.setHpr(90, 0, 0)
elif isinstance(hood, DGHood.DGHood):
self.fireworkShow.setPos(-80, -50, 60)
self.fireworkShow.setHpr(0, 0, 0)
elif isinstance(hood, DLHood.DLHood):
self.fireworkShow.setPos(-160, 0, 80)
self.fireworkShow.setHpr(270, 0, 0)
elif isinstance(hood, GSHood.GSHood):
self.fireworkShow.setPos(60, -350, 80)
self.fireworkShow.setHpr(20, 0, 0)
elif isinstance(hood, DDHood.DDHood):
self.fireworkShow.setPos(150, 0, 50)
self.fireworkShow.setHpr(90, 0, 0)
elif isinstance(hood, OZHood.OZHood):
self.fireworkShow.setPos(-450, -80, 140)
self.fireworkShow.setHpr(300, 0, 0)
elif isinstance(hood, PartyHood.PartyHood):
self.fireworkShow.setPos(0, -400, 120)
self.fireworkShow.lookAt(0, 0, 0)
self.fireworkShow.setScale(1.8)
def getFireworkShowIval(self, eventId, index, songId, startT):
show = FireworkShows.getShow(eventId, index)
if show is None:
FireworkShowMixin.notify.warning('could not find firework show: index: %s' % index)
return
preShow = self.preShow(eventId, songId, startT)
mainShow = Sequence()
currentT = skyTransitionDuration + preShowPauseDuration
for effect in show:
waitTime, style, colorIndex1, colorIndex2, amp, x, y, z = effect
if waitTime > 0:
currentT += waitTime
mainShow.append(Wait(waitTime))
if currentT >= startT:
mainShow.append(Func(Fireworks.shootFirework, style, x, y, z, colorIndex1, colorIndex2, amp))
postShow = self.postShow(eventId)
return Sequence(preShow, mainShow, postShow)
def clearMyColorScales(self):
if self.getGeom() and not self.getGeom().isEmpty():
self.getGeom().clearColorScale()
if self.getSky() and not self.getSky().isEmpty():
self.getSky().clearColorScale()
def getLoader(self):
if base.cr.playGame.hood != None:
return base.cr.playGame.hood.loader
return
def getHood(self):
if base.cr.playGame.hood != None:
return base.cr.playGame.hood
return
def getGeom(self):
loader = self.getLoader()
if loader:
return loader.geom
return None
def getSky(self):
hood = self.getHood()
if hood:
return hood.sky
return None
def __checkDDFog(self):
from toontown.hood import DDHood
if isinstance(self.getHood(), DDHood.DDHood):
self.getHood().whiteFogColor = Vec4(0.2, 0.2, 0.2, 1)
if hasattr(base.cr.playGame.getPlace(), 'cameraSubmerged'):
if not base.cr.playGame.getPlace().cameraSubmerged:
self.getHood().setWhiteFog()
def __restoreDDFog(self):
from toontown.hood import DDHood
if isinstance(self.getHood(), DDHood.DDHood):
self.getHood().whiteFogColor = Vec4(0.8, 0.8, 0.8, 1)
if hasattr(base.cr.playGame.getPlace(), 'cameraSubmerged'):
if not base.cr.playGame.getPlace().cameraSubmerged:
self.getHood().setWhiteFog()
def __checkStreetValidity(self):
if hasattr(base.cr.playGame, 'getPlace') and base.cr.playGame.getPlace() and hasattr(base.cr.playGame.getPlace(), 'loader') and base.cr.playGame.getPlace().loader and hasattr(base.cr.playGame.getPlace().loader, 'geom') and base.cr.playGame.getPlace().loader.geom:
return True
else:
return False
def __checkHoodValidity(self):
if hasattr(base.cr.playGame, 'hood') and base.cr.playGame.hood and hasattr(base.cr.playGame.hood, 'loader') and base.cr.playGame.hood.loader and hasattr(base.cr.playGame.hood.loader, 'geom') and base.cr.playGame.hood.loader.geom:
return True
else:
return False