447 lines
23 KiB
Python
447 lines
23 KiB
Python
from panda3d.core import *
|
|
from direct.interval.IntervalGlobal import *
|
|
import random
|
|
from toontown.effects.FireworkGlobals import *
|
|
from toontown.effects.Glow import Glow
|
|
from toontown.effects.GlowTrail import GlowTrail
|
|
from toontown.effects.SparksTrail import SparksTrail
|
|
from toontown.effects.SparksTrailLong import SparksTrailLong
|
|
from toontown.effects.PolyTrail import PolyTrail
|
|
from toontown.effects.FlashEffect import FlashEffect
|
|
from toontown.effects.BlastEffect import BlastEffect
|
|
from toontown.effects.FireworkSparkles import FireworkSparkles
|
|
from toontown.effects.SimpleSparkles import SimpleSparkles
|
|
from toontown.effects.PeonyEffect import PeonyEffect
|
|
from toontown.effects.RayBurst import RayBurst
|
|
from toontown.effects.StarBurst import StarBurst
|
|
from toontown.effects.ChrysanthemumEffect import ChrysanthemumEffect
|
|
from toontown.effects.RingEffect import RingEffect
|
|
from toontown.effects.NoiseSparkles import NoiseSparkles
|
|
from toontown.effects.SkullBurst import SkullBurst
|
|
from toontown.effects.SkullFlash import SkullFlash
|
|
from toontown.effects.TrailExplosion import TrailExplosion
|
|
from toontown.effects.IceCream import IceCream
|
|
trailSfxNames = ['phase_4/audio/sfx/firework_whistle_01.ogg', 'phase_4/audio/sfx/firework_whistle_02.ogg']
|
|
burstSfxNames = ['phase_4/audio/sfx/firework_explosion_01.ogg',
|
|
'phase_4/audio/sfx/firework_explosion_02.ogg',
|
|
'phase_4/audio/sfx/firework_explosion_03.ogg',
|
|
'phase_4/audio/sfx/firework_distance_01.ogg',
|
|
'phase_4/audio/sfx/firework_distance_02.ogg',
|
|
'phase_4/audio/sfx/firework_distance_03.ogg']
|
|
|
|
class FireworkEffect(NodePath):
|
|
|
|
def __init__(self, burstEffectId, trailEffectId = FireworkTrailType.Default, velocity = Vec3(0, 0, 500), scale = 1.0, primaryColor = Vec4(1, 1, 1, 1), secondaryColor = None, burstDelay = 1.25):
|
|
NodePath.__init__(self, 'FireworkEffect')
|
|
self.burstTypeId = burstEffectId
|
|
self.trailTypeId = trailEffectId
|
|
self.velocity = velocity
|
|
self.scale = scale / 7
|
|
self.primaryColor = primaryColor
|
|
self.secondaryColor = secondaryColor
|
|
if not self.secondaryColor:
|
|
self.secondaryColor = self.primaryColor
|
|
self.burstDelay = burstDelay
|
|
self.gravityMult = 1.0
|
|
self.fireworkMainIval = None
|
|
self.trailEffectsIval = None
|
|
self.burstEffectsIval = None
|
|
self.effectsNode = self.attachNewNode('fireworkEffectsNode')
|
|
self.trailEffects = []
|
|
self.burstEffects = []
|
|
self.trailSfx = []
|
|
for audio in trailSfxNames:
|
|
audio = loader.loadSfx(audio)
|
|
audio.setVolume(0.075)
|
|
self.trailSfx.append(audio)
|
|
|
|
self.burstSfx = []
|
|
for audio in burstSfxNames:
|
|
audio = loader.loadSfx(audio)
|
|
audio.setVolume(0.8)
|
|
self.burstSfx.append(audio)
|
|
|
|
return
|
|
|
|
def play(self):
|
|
self.getFireworkMainIval().start()
|
|
|
|
def getFireworkMainIval(self):
|
|
self.effectsNode.setPos(0, 0, 0)
|
|
if not self.fireworkMainIval:
|
|
self.fireworkMainIval = Parallel()
|
|
self.fireworkMainIval.append(self.getTrailEffectsIval())
|
|
self.fireworkMainIval.append(Sequence(Wait(self.burstDelay), Func(self.cleanupTrailEffects), self.getBurstEffectsIval(), Func(self.cleanupBurstEffects), Func(self.cleanupEffect)))
|
|
return self.fireworkMainIval
|
|
|
|
def getTrailEffectsIval(self):
|
|
if not self.trailEffectsIval:
|
|
if self.trailTypeId is None:
|
|
self.effectNode.setPos(self.velocity)
|
|
self.trailEffectsIval = Wait(self.burstDelay)
|
|
return self.trailEffectsIval
|
|
self.trailEffectsIval = Parallel()
|
|
self.trailEffectsIval.append(ProjectileInterval(self.effectsNode, startVel=self.velocity, duration=self.burstDelay, gravityMult=self.gravityMult))
|
|
if self.trailTypeId is None:
|
|
return self.trailEffectsIval
|
|
self.trailEffectsIval.append(Func(random.choice(self.trailSfx).play))
|
|
if base.config.GetInt('toontown-sfx-setting', 1) == 0:
|
|
if self.trailTypeId != FireworkTrailType.LongGlowSparkle:
|
|
self.trailTypeId = FireworkTrailType.Default
|
|
if self.trailTypeId == FireworkTrailType.Default:
|
|
glowEffect = Glow.getEffect()
|
|
if glowEffect:
|
|
glowEffect.reparentTo(self.effectsNode)
|
|
glowEffect.setColorScale(Vec4(1, 1, 1, 1))
|
|
glowEffect.setScale(10.0)
|
|
self.trailEffects.append(glowEffect)
|
|
self.trailEffectsIval.append(Func(glowEffect.startLoop))
|
|
elif self.trailTypeId == FireworkTrailType.Polygonal:
|
|
r = 0.75
|
|
mColor = Vec4(1, 1, 1, 1)
|
|
vertex_list = [Vec4(r, 0.0, r, 1.0),
|
|
Vec4(r, 0.0, -r, 1.0),
|
|
Vec4(-r, 0.0, -r, 1.0),
|
|
Vec4(-r, 0.0, r, 1.0),
|
|
Vec4(r, 0.0, r, 1.0)]
|
|
motion_color = [mColor,
|
|
mColor,
|
|
mColor,
|
|
mColor,
|
|
mColor]
|
|
trailEffect = PolyTrail(None, vertex_list, motion_color, 0.5)
|
|
trailEffect.setUnmodifiedVertexColors(motion_color)
|
|
trailEffect.reparentTo(self.effectsNode)
|
|
trailEffect.motion_trail.geom_node_path.setTwoSided(False)
|
|
trailEffect.setBlendModeOn()
|
|
trailEffect.setLightOff()
|
|
self.trailEffects.append(trailEffect)
|
|
self.trailEffectsIval.append(Func(trailEffect.beginTrail))
|
|
elif self.trailTypeId == FireworkTrailType.Glow:
|
|
trailEffect = GlowTrail.getEffect()
|
|
if trailEffect:
|
|
trailEffect.reparentTo(self.effectsNode)
|
|
trailEffect.setEffectScale(self.scale * 0.75)
|
|
trailEffect.setEffectColor(Vec4(1, 1, 1, 1))
|
|
trailEffect.setLifespan(0.25)
|
|
self.trailEffects.append(trailEffect)
|
|
self.trailEffectsIval.append(Func(trailEffect.startLoop))
|
|
elif self.trailTypeId == FireworkTrailType.Sparkle:
|
|
trailEffect = SparksTrail.getEffect()
|
|
if trailEffect:
|
|
trailEffect.reparentTo(self.effectsNode)
|
|
trailEffect.setEffectScale(self.scale)
|
|
trailEffect.setEffectColor(Vec4(1, 1, 1, 1))
|
|
self.trailEffects.append(trailEffect)
|
|
self.trailEffectsIval.append(Func(trailEffect.startLoop))
|
|
elif self.trailTypeId == FireworkTrailType.GlowSparkle:
|
|
glowEffect = Glow.getEffect()
|
|
if glowEffect:
|
|
glowEffect.reparentTo(self.effectsNode)
|
|
glowEffect.setColorScale(Vec4(1, 1, 1, 1))
|
|
glowEffect.setScale(15.0)
|
|
self.trailEffects.append(glowEffect)
|
|
self.trailEffectsIval.append(Func(glowEffect.startLoop))
|
|
trailEffect = SparksTrail.getEffect()
|
|
if trailEffect:
|
|
trailEffect.reparentTo(self.effectsNode)
|
|
trailEffect.setEffectScale(self.scale)
|
|
trailEffect.setEffectColor(Vec4(1, 1, 1, 1))
|
|
self.trailEffects.append(trailEffect)
|
|
self.trailEffectsIval.append(Func(trailEffect.startLoop))
|
|
elif self.trailTypeId == FireworkTrailType.LongSparkle:
|
|
trailEffect = SparksTrailLong.getEffect()
|
|
if trailEffect:
|
|
trailEffect.reparentTo(self.effectsNode)
|
|
trailEffect.setEffectScale(self.scale)
|
|
trailEffect.setEffectColor(Vec4(1, 1, 1, 1))
|
|
trailEffect.setLifespan(4.0)
|
|
self.trailEffects.append(trailEffect)
|
|
self.trailEffectsIval.append(Func(trailEffect.startLoop))
|
|
elif self.trailTypeId == FireworkTrailType.LongGlowSparkle:
|
|
trailEffect = SparksTrailLong.getEffect()
|
|
if trailEffect:
|
|
trailEffect.reparentTo(self.effectsNode)
|
|
trailEffect.setEffectScale(self.scale)
|
|
trailEffect.setEffectColor(self.secondaryColor)
|
|
trailEffect.setLifespan(3.5)
|
|
self.trailEffects.append(trailEffect)
|
|
self.trailEffectsIval.append(Func(trailEffect.startLoop))
|
|
if base.config.GetInt('toontown-sfx-setting', 1) >= 1:
|
|
trailEffect = GlowTrail.getEffect()
|
|
if trailEffect:
|
|
trailEffect.reparentTo(self.effectsNode)
|
|
trailEffect.setEffectScale(self.scale)
|
|
trailEffect.setEffectColor(self.primaryColor)
|
|
trailEffect.setLifespan(1.0)
|
|
self.trailEffects.append(trailEffect)
|
|
self.trailEffectsIval.append(Func(trailEffect.startLoop))
|
|
return self.trailEffectsIval
|
|
|
|
def getBurstEffectsIval(self):
|
|
if not self.burstEffectsIval:
|
|
self.burstEffectsIval = Parallel()
|
|
if self.burstTypeId is None:
|
|
return self.burstEffectsIval
|
|
self.burstEffectsIval.append(Wait(0.5))
|
|
self.burstEffectsIval.append(Func(random.choice(self.burstSfx).play))
|
|
flash = FlashEffect()
|
|
flash.reparentTo(self.effectsNode)
|
|
flash.setEffectColor(self.primaryColor)
|
|
flash.setScale(1200 * self.scale)
|
|
flash.fadeTime = 0.5
|
|
self.burstEffectsIval.append(flash.getTrack())
|
|
self.burstEffects.append(flash)
|
|
primaryBlast = BlastEffect()
|
|
primaryBlast.reparentTo(self.effectsNode)
|
|
primaryBlast.setScale(100 * self.scale)
|
|
primaryBlast.setEffectColor(Vec4(1, 1, 1, 1))
|
|
primaryBlast.fadeTime = 0.75
|
|
self.burstEffectsIval.append(primaryBlast.getTrack())
|
|
self.burstEffects.append(primaryBlast)
|
|
if base.config.GetInt('toontown-sfx-setting', 1) >= 1:
|
|
secondaryBlast = BlastEffect()
|
|
secondaryBlast.reparentTo(self.effectsNode)
|
|
secondaryBlast.setScale(250 * self.scale)
|
|
secondaryBlast.setEffectColor(self.primaryColor)
|
|
secondaryBlast.fadeTime = 0.3
|
|
self.burstEffectsIval.append(secondaryBlast.getTrack())
|
|
self.burstEffects.append(secondaryBlast)
|
|
if self.burstTypeId == FireworkBurstType.Sparkles:
|
|
sparkles = FireworkSparkles.getEffect()
|
|
if sparkles:
|
|
sparkles.reparentTo(self.effectsNode)
|
|
sparkles.setEffectScale(self.scale)
|
|
sparkles.setRadius(100 * self.scale)
|
|
sparkles.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(sparkles.getTrack())
|
|
self.burstEffects.append(sparkles)
|
|
elif self.burstTypeId == FireworkBurstType.PeonyShell:
|
|
explosion = PeonyEffect.getEffect()
|
|
if explosion:
|
|
explosion.reparentTo(self.effectsNode)
|
|
explosion.setEffectScale(self.scale)
|
|
explosion.setEffectColor(self.primaryColor)
|
|
explosion.startDelay = 0.0
|
|
self.burstEffectsIval.append(explosion.getTrack())
|
|
self.burstEffects.append(explosion)
|
|
if base.config.GetInt('toontown-sfx-setting', 1) >= 1:
|
|
rays = RayBurst()
|
|
rays.reparentTo(self.effectsNode)
|
|
rays.setEffectScale(self.scale)
|
|
rays.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(rays.getTrack())
|
|
self.burstEffects.append(rays)
|
|
if base.config.GetInt('toontown-sfx-setting', 1) >= 2:
|
|
sparkles = FireworkSparkles.getEffect()
|
|
if sparkles:
|
|
sparkles.reparentTo(self.effectsNode)
|
|
sparkles.setEffectScale(self.scale)
|
|
sparkles.setEffectColor(self.primaryColor)
|
|
sparkles.startDelay = 0.0
|
|
self.burstEffectsIval.append(sparkles.getTrack())
|
|
self.burstEffects.append(sparkles)
|
|
if base.config.GetInt('toontown-sfx-setting', 1) >= 1:
|
|
explosion = PeonyEffect.getEffect()
|
|
if explosion:
|
|
explosion.reparentTo(self.effectsNode)
|
|
explosion.setEffectScale(self.scale * 0.8)
|
|
explosion.setEffectColor(self.primaryColor)
|
|
explosion.startDelay = 0.15
|
|
explosion.setR(220)
|
|
self.burstEffectsIval.append(explosion.getTrack())
|
|
self.burstEffects.append(explosion)
|
|
elif self.burstTypeId == FireworkBurstType.PeonyParticleShell:
|
|
explosion = StarBurst.getEffect()
|
|
if explosion:
|
|
explosion.reparentTo(self.effectsNode)
|
|
explosion.setEffectScale(self.scale)
|
|
explosion.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(explosion.getTrack())
|
|
self.burstEffects.append(explosion)
|
|
if base.config.GetInt('toontown-sfx-setting', 1) >= 1:
|
|
rays = RayBurst()
|
|
rays.reparentTo(self.effectsNode)
|
|
rays.setEffectScale(self.scale * 0.75)
|
|
rays.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(rays.getTrack())
|
|
self.burstEffects.append(rays)
|
|
elif self.burstTypeId == FireworkBurstType.PeonyDiademShell:
|
|
explosion = StarBurst.getEffect()
|
|
if explosion:
|
|
explosion.reparentTo(self.effectsNode)
|
|
explosion.setEffectScale(self.scale)
|
|
explosion.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(explosion.getTrack())
|
|
self.burstEffects.append(explosion)
|
|
if base.config.GetInt('toontown-sfx-setting', 1) >= 1:
|
|
rays = RayBurst()
|
|
rays.reparentTo(self.effectsNode)
|
|
rays.setEffectScale(self.scale)
|
|
rays.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(rays.getTrack())
|
|
self.burstEffects.append(rays)
|
|
sparkles = SimpleSparkles.getEffect()
|
|
if sparkles:
|
|
sparkles.reparentTo(self.effectsNode)
|
|
sparkles.setEffectScale(self.scale)
|
|
sparkles.setRadius(100 * self.scale)
|
|
sparkles.setEffectColor(self.secondaryColor)
|
|
self.burstEffectsIval.append(sparkles.getTrack())
|
|
self.burstEffects.append(sparkles)
|
|
elif self.burstTypeId == FireworkBurstType.ChrysanthemumShell:
|
|
explosion = ChrysanthemumEffect()
|
|
explosion.reparentTo(self.effectsNode)
|
|
explosion.setEffectScale(self.scale)
|
|
explosion.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(explosion.getTrack())
|
|
self.burstEffects.append(explosion)
|
|
if base.config.GetInt('toontown-sfx-setting', 1) >= 2:
|
|
sparkles = FireworkSparkles.getEffect()
|
|
if sparkles:
|
|
sparkles.reparentTo(self.effectsNode)
|
|
sparkles.setEffectScale(self.scale * 0.8)
|
|
sparkles.setEffectColor(self.primaryColor)
|
|
sparkles.startDelay = 0.2
|
|
self.burstEffectsIval.append(sparkles.getTrack())
|
|
self.burstEffects.append(sparkles)
|
|
elif self.burstTypeId == FireworkBurstType.ChrysanthemumDiademShell:
|
|
explosion = ChrysanthemumEffect()
|
|
explosion.reparentTo(self.effectsNode)
|
|
explosion.setEffectScale(self.scale)
|
|
explosion.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(explosion.getTrack())
|
|
self.burstEffects.append(explosion)
|
|
sparkles = SimpleSparkles.getEffect()
|
|
if sparkles:
|
|
sparkles.reparentTo(self.effectsNode)
|
|
sparkles.setEffectScale(self.scale)
|
|
sparkles.setRadius(100 * self.scale)
|
|
sparkles.setEffectColor(self.secondaryColor)
|
|
self.burstEffectsIval.append(sparkles.getTrack())
|
|
self.burstEffects.append(sparkles)
|
|
elif self.burstTypeId == FireworkBurstType.RingShell:
|
|
explosion = RingEffect.getEffect()
|
|
if explosion:
|
|
explosion.reparentTo(self.effectsNode)
|
|
explosion.setEffectScale(self.scale)
|
|
explosion.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(explosion.getTrack())
|
|
self.burstEffects.append(explosion)
|
|
elif self.burstTypeId == FireworkBurstType.SaturnShell:
|
|
explosion = RingEffect.getEffect()
|
|
if explosion:
|
|
explosion.reparentTo(self.effectsNode)
|
|
explosion.setEffectScale(self.scale)
|
|
explosion.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(explosion.getTrack())
|
|
self.burstEffects.append(explosion)
|
|
sparkles = SimpleSparkles.getEffect()
|
|
if sparkles:
|
|
sparkles.reparentTo(self.effectsNode)
|
|
sparkles.setEffectScale(self.scale)
|
|
sparkles.setRadius(75 * self.scale)
|
|
sparkles.setEffectColor(self.secondaryColor)
|
|
self.burstEffectsIval.append(sparkles.getTrack())
|
|
self.burstEffects.append(sparkles)
|
|
elif self.burstTypeId == FireworkBurstType.BeeShell:
|
|
explosion = NoiseSparkles.getEffect()
|
|
if explosion:
|
|
explosion.reparentTo(self.effectsNode)
|
|
explosion.setEffectScale(self.scale)
|
|
explosion.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(Sequence(Wait(0.1), explosion.getTrack()))
|
|
self.burstEffects.append(explosion)
|
|
if base.config.GetInt('toontown-sfx-setting', 1) >= 1:
|
|
rays = RayBurst()
|
|
rays.reparentTo(self.effectsNode)
|
|
rays.setEffectScale(self.scale)
|
|
rays.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(rays.getTrack())
|
|
self.burstEffects.append(rays)
|
|
elif self.burstTypeId == FireworkBurstType.SkullBlast:
|
|
explosion = SkullBurst.getEffect()
|
|
if explosion:
|
|
explosion.reparentTo(self.effectsNode)
|
|
explosion.setEffectScale(self.scale)
|
|
explosion.setEffectColor(self.primaryColor)
|
|
explosion.startDelay = 0.1
|
|
self.burstEffectsIval.append(explosion.getTrack())
|
|
self.burstEffects.append(explosion)
|
|
skullFlash = SkullFlash.getEffect()
|
|
if skullFlash:
|
|
skullFlash.reparentTo(self.effectsNode)
|
|
skullFlash.setScale(650 * self.scale)
|
|
skullFlash.fadeTime = 0.75
|
|
skullFlash.startDelay = 0.08
|
|
self.burstEffectsIval.append(skullFlash.getTrack())
|
|
self.burstEffects.append(skullFlash)
|
|
if base.config.GetInt('toontown-sfx-setting', 1) >= 1:
|
|
rays = RayBurst()
|
|
rays.reparentTo(self.effectsNode)
|
|
rays.setEffectScale(self.scale)
|
|
rays.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(rays.getTrack())
|
|
self.burstEffects.append(rays)
|
|
if base.config.GetInt('toontown-sfx-setting', 1) >= 2:
|
|
sparkles = FireworkSparkles.getEffect()
|
|
if sparkles:
|
|
sparkles.reparentTo(self.effectsNode)
|
|
sparkles.setEffectScale(self.scale)
|
|
sparkles.setRadius(400 * self.scale)
|
|
sparkles.startDelay = 0.1
|
|
sparkles.setEffectColor(self.secondaryColor)
|
|
self.burstEffectsIval.append(sparkles.getTrack())
|
|
self.burstEffects.append(sparkles)
|
|
elif self.burstTypeId == FireworkBurstType.TrailExplosion:
|
|
explosion = TrailExplosion.getEffect()
|
|
if explosion:
|
|
explosion.reparentTo(self.effectsNode)
|
|
explosion.setEffectScale(self.scale)
|
|
explosion.setEffectColor(self.primaryColor)
|
|
explosion.numTrails = 3 + base.config.GetInt('toontown-sfx-setting', 1)
|
|
self.burstEffectsIval.append(explosion.getTrack())
|
|
self.burstEffects.append(explosion)
|
|
elif self.burstTypeId == FireworkBurstType.IceCream:
|
|
explosion = IceCream.getEffect()
|
|
if explosion:
|
|
explosion.reparentTo(self.effectsNode)
|
|
explosion.setEffectScale(self.scale)
|
|
explosion.setEffectColor(self.primaryColor)
|
|
self.burstEffectsIval.append(explosion.getTrack())
|
|
self.burstEffects.append(explosion)
|
|
return self.burstEffectsIval
|
|
|
|
def cleanupTrailEffects(self):
|
|
if self.trailEffectsIval:
|
|
self.trailEffectsIval.pause()
|
|
self.trailEffectsIval = None
|
|
for effect in self.trailEffects:
|
|
if isinstance(effect, PolyTrail):
|
|
effect.destroy()
|
|
effect = None
|
|
else:
|
|
effect.stopLoop()
|
|
effect = None
|
|
|
|
self.trailEffects = []
|
|
return
|
|
|
|
def cleanupBurstEffects(self):
|
|
if self.burstEffectsIval:
|
|
self.burstEffectsIval.pause()
|
|
self.burstEffectsIval = None
|
|
for effect in self.burstEffects:
|
|
effect.stop()
|
|
effect = None
|
|
|
|
self.burstEffects = []
|
|
return
|
|
|
|
def cleanupEffect(self):
|
|
if self.fireworkMainIval:
|
|
self.fireworkMainIval.pause()
|
|
self.fireworkMainIval = None
|
|
self.cleanupTrailEffects()
|
|
self.cleanupBurstEffects()
|
|
return
|