ToonTownRewritten/toontown/effects/FireworkShowMixin.py

345 lines
15 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 = JULY4_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()
self.trySettingBackground(1)
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 config.GetBool('want-old-fireworks', False):
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)
# TODO: Fix this properly. Hack-fixed for July 4th
delay = Wait(max(0, self.fireworkShow.getShowDuration() - max(0, t)))
if eventId == JULY4_FIREWORKS:
delay = Wait(max(0, self.fireworkShow.getShowDuration() - max(0, t)) - 9.5)
elif eventId == NEWYEARS_FIREWORKS:
delay = Wait(max(0, self.fireworkShow.getShowDuration() - max(0, t)) + 1.0)
elif eventId == PartyGlobals.FireworkShows.Summer:
delay = Wait(max(0, self.fireworkShow.getShowDuration() - max(0, t)) - 5.0)
self.currentShow = Sequence(preShow, beginFireworkShow, delay, postShow)
self.currentShow.start()
return
def preShow(self, eventId, songId, startT):
if eventId == JULY4_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 == NEWYEARS_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(self.trySettingBackground, 0),
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 trySettingBackground(self, color):
if base.localAvatar.isBookOpen():
# Our Shtickerbook is open with a custom background already set,
# so we don't want to screw that up.
pass
elif color == 0:
base.setBackgroundColor(Vec4(0, 0, 0, 1))
else:
base.setBackgroundColor(DefaultBackgroundColor)
def postShow(self, eventId):
if eventId == JULY4_FIREWORKS:
endMessage = TTLocalizer.FireworksJuly4Ending
elif eventId == NEWYEARS_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(self.trySettingBackground, 1),
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()
# Dammit disney
from toontown.hood import TTHood
from toontown.hood import DDHood
from toontown.hood import MMHood
from toontown.hood import BRHood
from toontown.hood import DGHood
from toontown.hood import DLHood
from toontown.hood import GSHood
from toontown.hood import OZHood
from toontown.hood import GZHood
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