diff --git a/language.version b/language.version index aba46b27e..490b87551 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1133 \cu(Thu Jun 13 16:27:13 CEST 2024)\c-"; -SWWM_SHORTVER="\cw1.3pre r1133 \cu(2024-06-13 16:27:13)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1134 \cu(Fri Jun 21 19:32:13 CEST 2024)\c-"; +SWWM_SHORTVER="\cw1.3pre r1134 \cu(2024-06-21 19:32:13)\c-"; diff --git a/zscript/dlc/swwm_heavymahsheengun.zsc b/zscript/dlc/swwm_heavymahsheengun.zsc index 7e8a4bbc6..a15826ce5 100644 --- a/zscript/dlc/swwm_heavymahsheengun.zsc +++ b/zscript/dlc/swwm_heavymahsheengun.zsc @@ -177,7 +177,7 @@ Class HeavyMahSheenGun : SWWMWeapon for ( int i=5; i 0 ) - { - freezetics--; - return; - } - if ( isFrozen() ) return; - if ( !InStateSequence(CurState,FindState("Death")) ) + if ( !bDead ) { vel *= .95; vel += .2*(sin(ph.x)*amp.x,sin(ph.y)*amp.y,sin(ph.z)*amp.z); - vel.z -= .05*clamp(2.-amp.length(),0.,2.); + if ( !lastwater ) vel.z -= .05*clamp(2.-amp.length(),0.,2.); ph.x += freq.x*(360./GameTicRate); ph.y += freq.y*(360./GameTicRate); ph.z += freq.z*(360./GameTicRate); - freq *= specialf1; - amp *= specialf2; + freq *= fact1; + amp *= fact2; Vector3 newpos = level.Vec3Offset(pos,vel); if ( !level.IsPointInLevel(newpos) ) { vel *= 0; - SetStateLabel("Death"); + bDead = true; return; } - SetOrigin(newpos,true); - UpdateWaterLevel(); - if ( waterlevel > 0 ) - { - vel *= 0; - SetStateLabel("Death"); - return; - } - A_FadeOut(FRandom[ExploS](.002,.005)); + alpha = max(.0,alpha-FRandom[ExploS](.002,.005)); } - else A_FadeOut(FRandom[ExploS](.02,.05)); - frame = clamp(int(round(4-alpha*4)),0,4); - } - States - { - Spawn: - QEMB # -1 Bright; - Stop; - Death: - QEMB # -1 Bright; - Stop; + else alpha = max(0.,alpha-FRandom[ExploS](.02,.05)); + int frame = clamp(int(round(4-alpha*4)),0,4); + texture = TexMan.CheckForTexture(String.Format("QEMB%c0",0x41+frame)); + if ( alpha <= 0 ) Destroy(); } } @@ -240,18 +224,18 @@ Class QuadProj : Actor virtual void A_QuadTrail() { - let s = Spawn("QuadTrail",pos); - s.scale *= .6; - s.vel = vel*.2; - s = Spawn("SWWMHalfSmoke",pos); + let t = Spawn("QuadTrail",pos); + t.scale *= .6; + t.vel = vel*.2; + let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos); s.vel = SWWMUtility.Vec3FromAngles(FRandom[Quadravol](0,360),FRandom[Quadravol](-90,90))*.4; s.vel += vel*.3; s.alpha *= .4; int numpt = Random[Quadravol](5,15); for ( int i=0; i 0 ) { - let c = Spawn("OnFireTrail",tpos); + let c = SWWMAnimSprite.SpawnAt("OnFireTrail",tpos); c.scale *= max(.35,mult*.6); c.vel = Owner.vel*.5+SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[FlameT](.5,2.)*c.scale.x; } if ( Random[FlameT](0,3) ) continue; - let s = Spawn("SWWMHalfSmoke",tpos); + let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",tpos); s.scale *= max(.35,mult*.5); s.alpha *= min(amount+30,100)*.005; s.vel = Owner.vel*.5+SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[FlameT](.2,.6)*s.scale.x; @@ -1044,54 +1028,51 @@ Class OnFire : Inventory } } -Class OnFireTrail : SWWMNonInteractiveActor +Class OnFireTrail : SWWMAnimSprite { - Mixin SWWMMinimalMovingWaterTick; + int flametim; override void PostBeginPlay() { - Super.PostBeginPlay(); - Scale.x *= RandomPick[ExploS](-1,1); - Scale.y *= RandomPick[ExploS](-1,1); + bXFlip = Random[ExploS](0,1); + bYFlip = Random[ExploS](0,1); roll = FRandom[ExploS](0,360); - SetState(SpawnState+Random[ExploS](0,39)); } - void A_Flame() + override void SetupSprite() { - special1++; - if ( waterlevel > 0 ) - vel *= .9; + Super.SetupSprite(); + sprname = "XFIR"; + sprframe = Random[ExploS](0,19); + numframes = 20; + framestep = 2; + bLooping = true; + bCheckWater = true; + SetRenderStyle(STYLE_Add); + Flags |= SPF_FULLBRIGHT|SPF_ROLL; + Alpha = .3; + Scale = (.6,.6); + } + + override void OnTick() + { + flametim++; + if ( lastwater ) vel *= .9; else { vel *= .98; vel.z += .1+.2*abs(scale.x); } - if ( !Random[FlameT](0,int(40*(default.alpha-alpha))) ) + if ( !Random[FlameT](0,int(40*(.3-alpha))) ) { - let s = Spawn("SWWMHalfSmoke",pos); + let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos); s.vel = SWWMUtility.Vec3FromAngles(FRandom[FlameT](0,360),FRandom[FlameT](-90,90))*.2; s.vel += vel*.3; s.alpha *= alpha*.5; - s.scale *= .5+abs(scale.x*2)*(.5+special1/6.); - s.special1 = 1; + s.scale *= .5+abs(scale.x*2)*(.5+flametim/6.); + s.framestep = 2; } - A_SetScale(scale.x*.98,scale.y*.98); - A_FadeOut(.01); - } - Default - { - RenderStyle "Add"; - Speed 2; - Alpha .3; - Scale .6; - +FORCEXYBILLBOARD; - +ROLLSPRITE; - +ROLLCENTER; - } - States - { - Spawn: - XFIR AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTT 1 Bright A_Flame(); - Loop; + scale *= .98; + alpha = max(0.,alpha-.01); + if ( alpha <= 0. ) Destroy(); } } diff --git a/zscript/items/swwm_funstuff.zsc b/zscript/items/swwm_funstuff.zsc index 467b19422..1691452d5 100644 --- a/zscript/items/swwm_funstuff.zsc +++ b/zscript/items/swwm_funstuff.zsc @@ -330,7 +330,7 @@ Class SWWMGasCloud : SWWMNonInteractiveActor } } -Class SWWMFart : SWWMHalfSmoke +Class SWWMFart : SWWMSmoke { Default { @@ -1197,10 +1197,10 @@ Class Chancebox : Actor for ( int i=0; i 0 ) - { - freezetics--; - return; - } - if ( isFrozen() ) return; - Vector3 newp = level.Vec3Offset(pos,vel); - if ( level.IsPointInLevel(newp) ) SetOrigin(newp,true); - UpdateWaterLevel(); - if ( waterlevel > 0 ) A_FadeOut(); - A_FadeOut(.04/max(1.,special1)); - A_SetScale(scale.x*(1.+.04/max(1.,special1))); - vel *= 1.-.04/max(1.,special1); - } - States - { - Spawn: - BSMK ABCDEFGHIJKLMNOPQRST -1; - Stop; - } -} + int thickness; -Class mkBloodSmoke2 : mkBloodSmoke -{ - Default + override void SetupSprite() { - Scale .8; - Alpha 1.; + texture = TexMan.CheckForTexture(String.Format("BSMK%c0",0x41+Random[Blood](0,19))); + Scale = (.5,.5); + Alpha = .35; + SetRenderStyle(STYLE_Shaded); + scolor = gameinfo.defaultbloodcolor; + Flags |= SPF_ROLL; + bCheckWater = true; + bWallStop = true; + } + + override void OnTick() + { + if ( lastwater ) alpha = max(0.,alpha-.1); + alpha = max(0.,alpha-(.04/max(1.,thickness))); + scale *= 1.+(.04/max(1.,thickness)); + vel *= 1.-(.04/max(1.,thickness)); + if ( alpha <= 0. ) Destroy(); } } @@ -696,15 +672,17 @@ Class mkGibber : SWWMNonInteractiveActor for ( int i=0; i 2. ) a.vel = a.vel.unit()*2.; a.vel += dir*FRandom[Gibs](.2,.8); - a.SetShade(shadecol); - a.special1 += Random[Gibs](1,3); + a.scolor = shadecol; + a.thickness = Random[Gibs](1,3); } for ( int i=0; i 0 ) return true; + double ch = hsec.ceilingplane.ZAtPoint(pos.xy); + if ( !(hsec.moreflags&Sector.SECMF_FAKEFLOORONLY) + && (pos.z > ch) ) + return true; + } + } + else + { + // check for swimmable 3d floors + for ( int i=0; i= fh) && (pos.z <= ch) ) + return true; + } + } + return false; + } + + virtual void EnteredWater() {} + virtual void LeftWater() {} + + virtual void OnTick() {} + + override void Tick() + { + Super.Tick(); + if ( IsFrozen() ) + return; + if ( bCheckWater ) + { + bool curwater = CheckWater(); + if ( curwater && (!lastwater || !firstwater) ) + EnteredWater(); + else if ( !curwater && (lastwater || !firstwater) ) + LeftWater(); + if ( bDestroyed ) // might destroy self in either virtual function + return; + lastwater = curwater; + firstwater = true; + } + if ( bWallStop ) + { + let newpos = level.Vec3Offset(pos,vel); + if ( !level.IsPointInLevel(newpos) ) vel *= 0.; + } + if ( bWallKill && !level.IsPointInLevel(pos) ) + { + Destroy(); + return; + } + OnTick(); + } + + virtual void SetupSprite() + { + // safe defaults + texture = TexMan.CheckForTexture("BLPFA0"); + bCheckWater = false; + bWallStop = false; + bWallKill = false; + } + + static SWWMStaticSprite SpawnAt( Class type, Vector3 spawnpos ) + { + let t = SWWMStaticSprite(level.SpawnVisualThinker(type)); + t.pos = spawnpos; + t.cursector = level.PointInSector(t.pos.xy); + t.SetupSprite(); + t.speed = 1.; // default + return t; + } +} + +Class SWWMAnimSprite : SWWMStaticSprite +{ + string sprname; // base name of sprite + uint8 sprframe; // current sprite frame (0-28) + uint8 numframes; // total frame count of animation (max 29) + uint8 frameskip; // how many frames to skip each step + uint8 framestep; // how many tics to wait for each frame step + uint8 framecnt; // internal, counter for frame stepping + bool bLooping; // animation loops, otherwise die upon reaching last frame + + private void TickAnim( bool bFirstTick = false ) + { + if ( !bFirstTick ) + { + framecnt++; + if ( framecnt < framestep ) + return; + framecnt = 0; + sprframe += 1+frameskip; + if ( sprframe >= numframes ) + { + if ( !bLooping ) + { + Destroy(); + return; + } + else sprframe -= numframes; + } + } + string tname = String.Format("%.4s%c0",sprname,0x41+sprframe); + texture = TexMan.CheckForTexture(tname); + } + + override void Tick() + { + Super.Tick(); + if ( !IsFrozen() && !bDestroyed ) + TickAnim(); + } + + override void SetupSprite() + { + // safe defaults + sprname = "XEX1"; + sprframe = 0; + numframes = 28; + frameskip = 0; + framestep = 1; + framecnt = 0; + bLooping = false; + bCheckWater = false; + bWallStop = false; + bWallKill = false; + } + + static SWWMAnimSprite SpawnAt( Class type, Vector3 spawnpos ) + { + let t = SWWMAnimSprite(level.SpawnVisualThinker(type)); + t.pos = spawnpos; + t.cursector = level.PointInSector(t.pos.xy); + t.SetupSprite(); + t.speed = 1.; // default + t.TickAnim(true); + return t; + } +} + // Generic smoke, lightweight tick Class SWWMSmoke : SWWMNonInteractiveActor { @@ -168,89 +341,70 @@ Class SWWMSmoke : SWWMNonInteractiveActor } } -// strictly non-colliding smoke, much lighter tick, used for heavier effects -Class SWWMHalfSmoke : SWWMNonInteractiveActor +// Visual thinker smoke, less overhead, used for heavier effects +Class SWWMHalfSmoke : SWWMAnimSprite { - Default + override void SetupSprite() { - RenderStyle "Shaded"; - StencilColor "FFFFFF"; - Speed 1; - +FORCEXYBILLBOARD; - +ROLLSPRITE; - +ROLLCENTER; - Scale 0.3; + Super.SetupSprite(); + sprname = "XSMK"; + numframes = 20; + bCheckWater = true; + SetRenderStyle(STYLE_Shaded); + scolor = 0xFFFFFFFF; + Scale = (.3,.3); + Flags |= SPF_ROLL; } + + override void OnTick() + { + vel *= .96; + vel.z += .01; + } + + override void EnteredWater() + { + let b = SWWMAnimSprite.SpawnAt("SWWMHalfBubble",pos); + b.scale *= abs(scale.x); + b.vel = vel; + Destroy(); + } + override void PostBeginPlay() { double ang, pt; - scale *= FRandom[Puff](0.5,1.5); - alpha *= FRandom[Puff](0.5,1.5); + scale *= FRandom[Puff](.5,1.5); + alpha *= FRandom[Puff](.5,1.5); ang = FRandom[Puff](0,360); pt = FRandom[Puff](-90,90); - vel += SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[Puff](0.2,0.8)*speed; - roll = Frandom[Puff](0,360); - scale.x *= RandomPick[Puff](-1,1); - scale.y *= RandomPick[Puff](-1,1); - } - override void Tick() - { - prev = pos; // for interpolation - if ( freezetics > 0 ) - { - freezetics--; - return; - } - if ( isFrozen() ) return; - vel *= 0.96; - vel.z += 0.01; - SetOrigin(level.Vec3Offset(pos,vel),true); - UpdateWaterLevel(); - if ( (waterlevel > 0) && !bAMBUSH ) - { - let b = Spawn("SWWMBubble",pos); - b.scale *= abs(scale.x); - b.vel = vel; - Destroy(); - return; - } - if ( !CheckNoDelay() || (tics == -1) ) return; - if ( tics > 0 ) tics--; - while ( !tics ) - { - if ( !SetState(CurState.NextState) ) - return; - } - } - - States - { - Spawn: - XSMK ABCDEFGHIJKLMNOPQRST 1 A_SetTics(1+special1); - Stop; + vel += SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[Puff](.2,.8)*speed; + roll = FRandom[Puff](0,360); + bXFlip = Random[Puff](0,1); + bYFlip = Random[Puff](0,1); } } +// lesser version Class SWWMSmallSmoke : SWWMHalfSmoke { + override void SetupSprite() + { + Super.SetupSprite(); + sprname = "QSM6"; + numframes = 18; + } + override void PostBeginPlay() { double ang, pt; - scale *= FRandom[Puff](0.1,0.3); - alpha *= FRandom[Puff](0.5,1.5); + scale *= FRandom[Puff](.5,1.5); + alpha *= FRandom[Puff](.5,1.5); ang = FRandom[Puff](0,360); pt = FRandom[Puff](-90,90); - vel += SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[Puff](0.04,0.16); + vel += SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[Puff](.04,.16)*speed; roll = Frandom[Puff](0,360); - scale.x *= RandomPick[Puff](-1,1); - scale.y *= RandomPick[Puff](-1,1); - } - - States - { - Spawn: - QSM6 ABCDEFGHIJKLMNOPQR 1 A_SetTics(1+special1); - Stop; + bXFlip = Random[Puff](0,1); + bYFlip = Random[Puff](0,1); } } @@ -339,6 +493,45 @@ Class SWWMBubble : SWWMNonInteractiveActor } } +// Visual thinker version of the above, much simpler checks +Class SWWMHalfBubble : SWWMAnimSprite +{ + override void SetupSprite() + { + Super.SetupSprite(); + sprname = "XBUB"; + sprframe = Random[Puff](0,19); + numframes = 20; + bCheckWater = true; + bLooping = true; + bWallKill = true; + SetRenderStyle(STYLE_Add); + Scale = (.5,.5); + } + + override void OnTick() + { + vel *= .96; + vel.z += .05; + if ( !Random[Puff](0,100) ) + Destroy(); + } + + override void LeftWater() + { + Destroy(); + } + + override void PostBeginPlay() + { + double ang, pt; + scale *= FRandom[Puff](.5,1.5); + ang = FRandom[Puff](0,360); + pt = FRandom[Puff](-90,90); + vel += SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[Puff](.2,.8)*speed; + } +} + Class SWWMSparkTrail : SWWMNonInteractiveActor { Default @@ -720,16 +913,29 @@ Class SWWMItemFog : SWWMNonInteractiveActor scale.x *= RandomPick[ExploS](-1,1); scale.y *= RandomPick[ExploS](-1,1); int numpt = Random[ExploS](8,12); - if ( bAMBUSH ) numpt *= 2; - for ( int i=0; i 0 ) - { - freezetics--; - return; - } - if ( isFrozen() ) return; - A_SetScale(scale.x*specialf1); - A_FadeOut(specialf2); - if ( vel != (0,0,0) ) - { - prev = pos; - SetOrigin(level.Vec3Offset(pos,vel),true); - vel *= .98; - } - } - States - { - Spawn: - BLPF C -1 Bright; - Stop; + vel *= .98; + scale *= scalestep; + alpha = max(0.,alpha-alphastep); + if ( alpha <= 0. ) Destroy(); } } @@ -913,10 +1108,10 @@ Class SWWMTeleportFog : SWWMNonInteractiveActor for ( int i=0; i WaterHitList; Array ShootThroughList; - static play void DoTrail( Actor target, Vector3 pos, Vector3 dir, double dist, int bubblechance, bool smoky = false ) + static play void DoTrail( Actor target, Vector3 pos, Vector3 dir, double dist, int bubblesparse, bool smoky = false ) { let t = new("SWWMBulletTrail"); t.WaterHitList.Clear(); @@ -1207,8 +1402,9 @@ Class SWWMBulletTrail : LineTracer } for ( int i=5; i 1 ) { - s = Spawn("SWWMHalfSmoke",Owner.pos); + s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",Owner.pos); s.vel = Owner.vel*.3+SWWMUtility.Vec3FromAngles(FRandom[Ponch](0,360),FRandom[Ponch](-90,90))*FRandom[Ponch](.1,1.2); s.scale *= 2.; - s.A_SetRenderStyle(s.alpha,STYLE_AddShaded); - s.SetShade(Color(4,2,1)*Random[Ponch](32,63)); + s.SetRenderStyle(STYLE_AddShaded); + s.scolor = Color(4,2,1)*Random[Ponch](32,63); } } override void ModifyDamage( int damage, Name damageType, int &newdamage, bool passive, Actor inflictor, Actor source, int flags ) @@ -503,7 +503,7 @@ extend Class SWWMWeapon invoker.wallponch = false; } // check for shootables - SWWMBulletTrail.DoTrail(self,origin,dir,DEFMELEERANGE*rangemul,0); + SWWMBulletTrail.DoTrail(self,origin,dir,DEFMELEERANGE*rangemul,2); bool res = TryMelee((raging?.3:.2)*spreadmul,dmg,hitsound,rangemul,kickmul,flags,impactclass); if ( res && !(flags&MELEE_Rip) ) return res; // check for walls instead diff --git a/zscript/weapons/swwm_blazeit_fx.zsc b/zscript/weapons/swwm_blazeit_fx.zsc index 744da53bc..68e7b8199 100644 --- a/zscript/weapons/swwm_blazeit_fx.zsc +++ b/zscript/weapons/swwm_blazeit_fx.zsc @@ -105,10 +105,10 @@ Class HellblazerArm : Actor Spawn("HellblazerArmTrail",pos); SWWMUtility.DoExplosion(self,6+reactiontime/2,3000+500*reactiontime,80+10*reactiontime); Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](1,5); - let s = Spawn("SWWMHalfSmoke",pos); + let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos); s.vel = pvel+vel*.2; - s.SetShade(Color(4,2,1)*Random[ExploS](48,63)); - s.special1 = Random[ExploS](0,2); + s.scolor = Color(4,2,1)*Random[ExploS](48,63); + s.framestep = Random[ExploS](1,3); s.scale *= 3.; s.alpha *= 0.1+.4*(ReactionTime/8.); A_CountDown(); @@ -217,10 +217,10 @@ Class HellblazerMissile : Actor Vector3 traildir = -SWWMUtility.Vec3FromAngles(angle,pitch); for ( int i=0; i<3; i++ ) { - let s = Spawn("SWWMHalfSmoke",level.Vec3Offset(pos,traildir*3)); - s.SetShade(smokecol*Random[Hellblazer](48,63)); + let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",level.Vec3Offset(pos,traildir*3)); + s.scolor = smokecol*Random[Hellblazer](48,63); s.scale *= FRandom[Hellblazer](.8,1.2); - s.special1 = Random[Hellblazer](0,2); + s.framestep = Random[Hellblazer](1,3); s.alpha *= .5; s.vel = .3*vel + (traildir+SWWMUtility.Vec3FromAngles(FRandom[Hellblazer](0,360),FRandom[Hellblazer](-90,90))*.4).unit()*FRandom[Hellblazer](1.,2.); } diff --git a/zscript/weapons/swwm_cbt.zsc b/zscript/weapons/swwm_cbt.zsc index 747b42c01..295705d0c 100644 --- a/zscript/weapons/swwm_cbt.zsc +++ b/zscript/weapons/swwm_cbt.zsc @@ -87,8 +87,9 @@ Class Wallbuster : SWWMWeapon } for ( int i=5; i (bustmax/2)) ) continue; int numpt = Random[Wallbuster](-4,1); @@ -128,11 +128,11 @@ Class BusterWall : Thinker if ( (initial || !(busttics%2)) && !Random[Wallbuster](0,1) ) { Vector3 pvel = (bustdir+SWWMUtility.Vec3FromAngles(FRandom[Wallbuster](0,360),FRandom[Wallbuster](-90,90))).unit()*FRandom[Wallbuster](-2.,8.); - let s = Actor.Spawn("SWWMHalfSmoke",spot); + let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",spot); s.vel = pvel; s.scale *= 2.5; - s.special1 = Random[Wallbuster](3,8); - s.SetShade(Color(1,1,1)*Random[Wallbuster](40,120)); + s.framestep = Random[Wallbuster](4,9); + s.scolor = Color(1,1,1)*Random[Wallbuster](40,120); } if ( (!initial && (busttics%3)) || (busttics > (bustmax/2)) ) continue; int numpt = Random[Wallbuster](-4,1); diff --git a/zscript/weapons/swwm_danmaku.zsc b/zscript/weapons/swwm_danmaku.zsc index c40405090..a3fd3ba44 100644 --- a/zscript/weapons/swwm_danmaku.zsc +++ b/zscript/weapons/swwm_danmaku.zsc @@ -216,7 +216,7 @@ Class Eviscerator : SWWMWeapon { let [x, y, z] = SWWMUtility.GetPlayerAxes(self); Vector3 origin = SWWMUtility.GetFireOffset(self,ofs.x,ofs.y,ofs.z); - let s = Spawn("SWWMHalfSmoke",origin); + let s = Spawn("SWWMSmoke",origin); s.scale *= .2; s.alpha *= .4; s.speed *= .1; diff --git a/zscript/weapons/swwm_danmaku_fx.zsc b/zscript/weapons/swwm_danmaku_fx.zsc index 68f05798d..bfeb2b252 100644 --- a/zscript/weapons/swwm_danmaku_fx.zsc +++ b/zscript/weapons/swwm_danmaku_fx.zsc @@ -189,7 +189,7 @@ Class EvisceratorChunk : Actor A_SetTranslation(tls[clamp(int(lifetime*10),0,7)]); if ( !Random[Eviscerator](0,2) && (lifetime < .7) ) { - let s = Spawn("SWWMHalfSmoke",pos); + let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos); s.vel = .2*vel+SWWMUtility.Vec3FromAngles(FRandom[Eviscerator](0,360),FRandom[Eviscerator](-90,90)); s.scale *= .5; s.alpha *= scale.x*max(0,.7-lifetime)*1.5; @@ -552,7 +552,7 @@ Class EvisceratorProj : Actor heat -= 0.004+0.0004*vel.length(); if ( heat > 0 ) { - let s = Spawn("SWWMHalfSmoke",pos); + let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos); s.alpha *= heat; } } diff --git a/zscript/weapons/swwm_deathlydeathcannon_altfx.zsc b/zscript/weapons/swwm_deathlydeathcannon_altfx.zsc index 9752e5119..33f5315b5 100644 --- a/zscript/weapons/swwm_deathlydeathcannon_altfx.zsc +++ b/zscript/weapons/swwm_deathlydeathcannon_altfx.zsc @@ -816,11 +816,12 @@ Class YnykronSingularityExplosionArm : Actor { Spawn("YnykronSingularityExplosionTrail",pos); Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](1,5); - let s = Spawn("SWWMHalfSmoke",pos); - s.SetShade(Color(1,1,1)*Random[ExploS](128,160)+Color(28,0,31)); - s.A_SetRenderStyle(s.alpha*(.1+.4*(ReactionTime/15.)),STYLE_AddShaded); + let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos); + s.scolor = Color(1,1,1)*Random[ExploS](128,160)+Color(28,0,31); + s.alpha *= .1+.4*(ReactionTime/15.); + s.SetRenderStyle(STYLE_AddShaded); s.vel = pvel+vel*.2; - s.special1 = Random[ExploS](1,3); + s.framestep = Random[ExploS](2,4); s.scale *= 2.4; } } @@ -1359,10 +1360,11 @@ Class YnykronAltBeam : SWWMNonInteractiveActor for ( int i=0; i pop = "CandyPop", Class smk = "SWWMHalfSmoke" ) + void A_Spread( Class pop = "CandyPop", Class smk = "SWWMHalfSmoke" ) { Vector3 tdir = level.Vec3Diff(pos,nextpos); Vector3 pvel = .1*tdir+SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.1,.3); if ( special2 && !Random[ExploS](0,special2) ) { - let m = Spawn(smk,level.Vec3Offset(pos,tdir*.5)); + let m = SWWMAnimSprite.SpawnAt(smk,level.Vec3Offset(pos,tdir*.5)); m.vel = pvel; - m.SetShade(Color(1,1,1)*Random[ExploS](64,224)); - m.special1 = Random[ExploS](1,3); + m.scolor = Color(1,1,1)*Random[ExploS](64,224); + m.framestep = Random[ExploS](2,4); m.scale *= 1.5; m.alpha *= .4; } @@ -276,10 +276,10 @@ Class TinyCandyPop : CandyPop for ( int i=0; i