Begin VisualThinker migration. Some effects still pending.

This commit is contained in:
Mari the Deer 2024-06-21 19:32:13 +02:00
commit 77b1ad89a9
28 changed files with 577 additions and 412 deletions

View file

@ -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-";

View file

@ -177,7 +177,7 @@ Class HeavyMahSheenGun : SWWMWeapon
for ( int i=5; i<st.Results.Distance; i+=10 )
{
if ( !Random[Boolet](0,2) ) continue;
let b = Actor.Spawn("SWWMBubble",level.Vec3Offset(origin,dir*i));
let b = SWWMAnimSprite.SpawnAt("SWWMHalfBubble",level.Vec3Offset(origin,dir*i));
b.Scale *= FRandom[Boolet](.1,.3);
}
foreach ( hit:st.HitList )

View file

@ -608,7 +608,7 @@ Class MisterRifle : SWWMWeapon
Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s);
FLineTraceData d;
LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
SWWMBulletTrail.DoTrail(self,origin,dir,10000,2);
SWWMBulletTrail.DoTrail(self,origin,dir,10000,4);
if ( d.HitType == TRACE_HitActor )
{
if ( d.HitActor.bNOBLOOD || d.HitActor.bDORMANT )
@ -956,11 +956,11 @@ Class MisterRifle : SWWMWeapon
if ( !Random[ExploS](0,1) ) continue;
Vector3 ofs = level.Vec3Offset(start,tdir*d);
if ( !level.IsPointInLevel(ofs) ) continue;
let b = Spawn("SWWMHalfSmoke",ofs);
let b = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",ofs);
b.Scale *= FRandom[ExploS](.7,1.4);
b.alpha *= .2;
b.special1 = Random[ExploS](1,3);
b.SetShade(Color(2,3,4)*Random[ExploS](48,63));
b.framestep = Random[ExploS](2,4);
b.scolor = Color(2,3,4)*Random[ExploS](48,63);
}
for ( int i=1; i<mrt.WallPenetrateList.Size(); i+=2 )
{
@ -991,11 +991,11 @@ Class MisterRifle : SWWMWeapon
if ( !Random[ExploS](0,1) ) continue;
Vector3 ofs = level.Vec3Offset(start,tdir*d);
if ( !level.IsPointInLevel(ofs) ) continue;
let b = Spawn("SWWMHalfSmoke",ofs);
let b = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",ofs);
b.Scale *= FRandom[ExploS](.7,1.4);
b.alpha *= .2;
b.special1 = Random[ExploS](1,3);
b.SetShade(Color(2,3,4)*Random[ExploS](48,63));
b.framestep = Random[ExploS](2,4);
b.scolor = Color(2,3,4)*Random[ExploS](48,63);
}
}
}
@ -1023,11 +1023,11 @@ Class MisterRifle : SWWMWeapon
if ( !Random[ExploS](0,1) ) continue;
Vector3 ofs = level.Vec3Offset(origin,startdir*d);
if ( !level.IsPointInLevel(ofs) ) continue;
let b = Spawn("SWWMHalfSmoke",ofs);
let b = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",ofs);
b.Scale *= FRandom[ExploS](.7,1.4);
b.alpha *= .2;
b.special1 = Random[ExploS](1,3);
b.SetShade(Color(2,3,4)*Random[ExploS](48,63));
b.framestep = Random[ExploS](2,4);
b.scolor = Color(2,3,4)*Random[ExploS](48,63);
}
}
}

View file

@ -1017,10 +1017,10 @@ Class MisterGrenade : Actor
int numpt = bAMBUSH?1:3;
for ( int i=0; i<numpt; i++ )
{
let s = Spawn("SWWMHalfSmoke",Vec3Offset(0,0,Height/2));
s.SetShade(Color(1,4,2)*Random[Mister](48,63));
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",Vec3Offset(0,0,Height/2));
s.scolor = Color(1,4,2)*Random[Mister](48,63);
s.scale *= FRandom[Mister](.5,1.1);
s.special1 = Random[Mister](0,2);
s.framestep = Random[Mister](1,3);
s.alpha *= .25;
s.vel += .3*vel;
}

View file

@ -118,75 +118,59 @@ Class QuadTrail : SWWMNonInteractiveActor
}
}
Class QuadEmber : SWWMNonInteractiveActor
Class QuadEmber : SWWMStaticSprite
{
Vector3 freq, amp, ph;
double fact1, fact2;
bool bDead;
Default
override void SetupSprite()
{
RenderStyle "Add";
Scale .3;
+FORCEXYBILLBOARD;
texture = TexMan.CheckForTexture("QEMBA0");
scale = (.3,.3);
SetRenderStyle(STYLE_Add);
bCheckWater = true;
Flags |= SPF_FULLBRIGHT;
}
override void PostBeginPlay()
{
Scale *= FRandom[ExploS](.5,1.5);
double ang = FRandom[ExploS](0,360),
pt = FRandom[ExploS](-90,90);
vel = SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](4.,8.);
vel += SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](4.,8.);
freq = (FRandom[ExploS](.5,3.),FRandom[ExploS](.5,3.),FRandom[ExploS](.5,3.));
amp = (FRandom[ExploS](.5,2.),FRandom[ExploS](.5,2.),FRandom[ExploS](.5,2.));
ph = (FRandom[ExploS](0.,360.),FRandom[ExploS](0.,360.),FRandom[ExploS](0.,360.));
specialf1 = FRandom[ExploS](.98,.99);
specialf2 = FRandom[ExploS](.98,.99);
fact1 = FRandom[ExploS](.98,.99);
fact2 = FRandom[ExploS](.98,.99);
}
override void Tick()
override void OnTick()
{
prev = pos;
if ( freezetics > 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<numpt; i++ )
{
s = Spawn("QuadEmber",pos);
s.vel += vel*.3;
let e = SWWMStaticSprite.SpawnAt("QuadEmber",pos);
e.vel += vel*.3;
}
}
@ -384,16 +368,16 @@ Class QuadExplArm : Actor
if ( !(ReactionTime%2) )
SWWMUtility.DoExplosion(self,8+reactiontime*3,0,40+5*reactiontime,20,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer);
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*.3;
s.special1 = Random[ExploS](1,3);
s.framestep = Random[ExploS](2,4);
s.scale *= 3.;
s.alpha *= .1+.4*(ReactionTime/(8.+special1));
int numpt = Random[Quadravol](1,4);
for ( int i=0; i<numpt; i++ )
{
s = Spawn("QuadEmber",pos);
s.vel += vel*.4;
let e = SWWMStaticSprite.SpawnAt("QuadEmber",pos);
e.vel += vel*.4;
}
A_CountDown();
}
@ -423,16 +407,16 @@ Class QuadExplArm2 : QuadExplArm
SWWMUtility.DoExplosion(self,80+reactiontime*10,0,100+4*reactiontime,50,DE_HOWL|DE_NOSPLASH,ignoreme:tracer);
}
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](2,5);
let s = Spawn("SWWMHalfSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos);
s.vel = pvel+vel*.6;
s.special1 = Random[ExploS](2,4);
s.framestep = Random[ExploS](3,5);
s.scale *= 3.2;
s.alpha *= .1+.4*(ReactionTime/(12.+special1));
int numpt = Random[Quadravol](1,5);
for ( int i=0; i<numpt; i++ )
{
s = Spawn("QuadEmber",pos);
s.vel += vel*.7;
let e = SWWMStaticSprite.SpawnAt("QuadEmber",pos);
e.vel += vel*.7;
}
A_CountDown();
}
@ -494,18 +478,18 @@ Class QuadProj2 : QuadProj
}
override void A_QuadTrail()
{
let s = Spawn("QuadTrail",pos);
s.scale *= .8;
s.vel = vel*.3;
s = Spawn("SWWMHalfSmoke",pos);
let t = Spawn("QuadTrail",pos);
t.scale *= .8;
t.vel = vel*.3;
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos);
s.vel = SWWMUtility.Vec3FromAngles(FRandom[Quadravol](0,360),FRandom[Quadravol](-90,90))*.4;
s.vel += vel*.4;
s.alpha *= .6;
int numpt = Random[Quadravol](5,25);
for ( int i=0; i<numpt; i++ )
{
s = Spawn("QuadEmber",pos);
s.vel += vel*.4;
let e = SWWMStaticSprite.SpawnAt("QuadEmber",pos);
e.vel += vel*.4;
}
}
override void A_QuadExplode()
@ -588,18 +572,18 @@ Class QuadProjSub : QuadProj
}
override void A_QuadTrail()
{
let s = Spawn("QuadTrail",pos);
s.scale *= .5;
s.vel = vel*.3;
s = Spawn("SWWMHalfSmoke",pos);
let t = Spawn("QuadTrail",pos);
t.scale *= .5;
t.vel = vel*.3;
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos);
s.vel = SWWMUtility.Vec3FromAngles(FRandom[Quadravol](0,360),FRandom[Quadravol](-90,90))*.4;
s.vel += vel*.4;
s.alpha *= .2;
int numpt = Random[Quadravol](1,4);
for ( int i=0; i<numpt; i++ )
{
s = Spawn("QuadEmber",pos);
s.vel += vel*.4;
let e = SWWMStaticSprite.SpawnAt("QuadEmber",pos);
e.vel += vel*.4;
}
}
override void A_QuadExplode()
@ -671,18 +655,18 @@ Class QuadProjSub2 : QuadProj
}
override void A_QuadTrail()
{
let s = Spawn("QuadTrail",pos);
s.scale *= .3;
s.vel = vel*.3;
s = Spawn("SWWMHalfSmoke",pos);
let t = Spawn("QuadTrail",pos);
t.scale *= .3;
t.vel = vel*.3;
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos);
s.vel = SWWMUtility.Vec3FromAngles(FRandom[Quadravol](0,360),FRandom[Quadravol](-90,90))*.4;
s.vel += vel*.4;
s.alpha *= .2;
int numpt = Random[Quadravol](1,4);
for ( int i=0; i<numpt; i++ )
{
s = Spawn("QuadEmber",pos);
s.vel += vel*.4;
let e = SWWMStaticSprite.SpawnAt("QuadEmber",pos);
e.vel += vel*.4;
}
}
override void A_QuadExplode()
@ -769,19 +753,19 @@ Class QuadProj3 : QuadProj
}
override void A_QuadTrail()
{
let s = Spawn("QuadTrail",pos);
s.scale *= 1.2;
s.vel = vel*.4;
s = Spawn("SWWMHalfSmoke",pos);
let t = Spawn("QuadTrail",pos);
t.scale *= 1.2;
t.vel = vel*.4;
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos);
s.vel = SWWMUtility.Vec3FromAngles(FRandom[Quadravol](0,360),FRandom[Quadravol](-90,90))*.4;
s.vel += vel*.6;
s.alpha *= .8;
s.special1 = 1;
s.framestep = 2;
int numpt = Random[Quadravol](5,30);
for ( int i=0; i<numpt; i++ )
{
s = Spawn("QuadEmber",pos);
s.vel += vel*.6;
let e = SWWMStaticSprite.SpawnAt("QuadEmber",pos);
e.vel += vel*.6;
}
}
override void A_QuadExplode()
@ -1002,12 +986,12 @@ Class OnFire : Inventory
double pt = FRandom[FlameT](-90,90);
if ( amount > 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();
}
}

View file

@ -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<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.3,8);
let s = Spawn("SWWMHalfSmoke",Vec3Offset(0,0,16));
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",Vec3Offset(0,0,16));
s.vel = pvel;
s.SetShade(Color(2,1,3)*Random[ExploS](64,85));
s.special1 = Random[ExploS](1,4);
s.scolor = Color(2,1,3)*Random[ExploS](64,85);
s.framestep = Random[ExploS](2,5);
s.alpha *= .4;
s.scale *= 2.4;
}

View file

@ -219,7 +219,7 @@ Class LampMoth : Actor
lifespan--;
if ( lifespan <= 0 )
{
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.alpha *= .3;
Destroy();
}
@ -255,7 +255,7 @@ Class LampMoth : Actor
TNT1 A 1
{
A_StartSound("moth/die",CHAN_VOICE,CHANF_OVERLAP,.6,2.5);
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.alpha *= .3;
}
Stop;
@ -321,7 +321,7 @@ Class CompanionLamp : Actor
m.Destroy();
return;
}
let s = Spawn("SWWMSmallSmoke",m.pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",m.pos);
s.alpha *= .3;
m.master = parent;
m.lamp = self;

View file

@ -366,7 +366,7 @@ Class TheBall : Actor
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[Spreadgun](0,360),FRandom[Spreadgun](-90,90))*FRandom[Spreadgun](1,8);
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.scale *= 3.;
s.alpha *= .2;
s.vel = pvel;
@ -378,7 +378,7 @@ Class TheBall : Actor
heat -= 0.004+0.0004*vel.length();
A_SoundVolume(CHAN_WEAPON,vel.length()/75.);
if ( heat <= 0 ) return;
let s = Spawn("SWWMHalfSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos);
s.alpha *= heat;
}
void A_HandleBounce()
@ -599,11 +599,12 @@ Class SaltBeam : SWWMNonInteractiveActor
for ( int i=4; i<t.Results.Distance; i+=8 )
{
if ( Random[Spreadgun](0,Stamina) ) continue;
let b = Actor.Spawn("SWWMHalfSmoke",level.Vec3Offset(pos,x*i));
b.Scale *= FRandom[Spreadgun](.6,.8);
b.special1 = Random[Spreadgun](1,2);
b.A_SetRenderStyle(.3,STYLE_AddShaded);
b.SetShade(Color(1,3,4)*Random[Spreadgun](48,63));
let b = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",level.Vec3Offset(pos,x*i));
b.scale *= FRandom[Spreadgun](.6,.8);
b.framestep =Random[Spreadgun](2,3);
b.alpha = .3;
b.SetRenderStyle(STYLE_AddShaded);
b.scolor = Color(1,3,4)*Random[Spreadgun](48,63);
b.vel += x*FRandom[Spreadgun](-.5,3);
}
if ( t.Results.HitType != TRACE_HitNone )

View file

@ -369,11 +369,12 @@ Class MykradvoBurst : SWWMNonInteractiveActor
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.25,8);
let s = Spawn("SWWMHalfSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos);
s.vel = pvel;
s.SetShade(Color(1,1,1)*Random[ExploS](128,160)+Color(28,0,31));
s.A_SetRenderStyle(.4,STYLE_AddShaded);
s.special1 = Random[ExploS](1,5);
s.scolor = Color(1,1,1)*Random[ExploS](128,160)+Color(28,0,31);
s.alpha = .4;
s.SetRenderStyle(STYLE_AddShaded);
s.framestep = Random[ExploS](2,6);
s.scale *= 2.;
}
numpt = Random[ExploS](8,12);
@ -405,11 +406,12 @@ Class MykradvoBurst : SWWMNonInteractiveActor
for ( int j=0; j<numpt; j++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.25,8);
let s = Spawn("SWWMHalfSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos);
s.vel = pvel;
s.SetShade(Color(1,1,1)*Random[ExploS](128,160)+Color(28,0,31));
s.A_SetRenderStyle(.4,STYLE_AddShaded);
s.special1 = Random[ExploS](1,5);
s.scolor = Color(1,1,1)*Random[ExploS](128,160)+Color(28,0,31);
s.alpha = .4;
s.SetRenderStyle(STYLE_AddShaded);
s.framestep = Random[ExploS](2,6);
s.scale *= 2.;
}
numpt = Random[ExploS](1,2);

View file

@ -393,11 +393,11 @@ Class Demolitionist : PlayerPawn
numpt = Random[ExploS](12,16);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn("SWWMHalfSmoke",source.Vec3Offset(0,0,1.+FRandom[ExploS](0,max(0.,source.height-source.floorclip))));
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",source.Vec3Offset(0,0,1.+FRandom[ExploS](0,max(0.,source.height-source.floorclip))));
s.vel = ((0,0,1)+SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))).unit()*FRandom[ExploS](-2,8.);
s.scale *= 2.5;
s.special1 = Random[ExploS](3,8);
s.SetShade(Color(5,4,3)*Random[ExploS](20,40));
s.framestep = Random[ExploS](4,9);
s.scolor = Color(5,4,3)*Random[ExploS](20,40);
}
Spawn("SWWMCrushedSpike",source.pos);
if ( source.master ) source.master.Destroy();

View file

@ -45,10 +45,10 @@ Class mkBlood : SWWMNonInteractiveActor
level.SpawnParticle(puff);
}
}
let s = Spawn("mkBloodSmoke",pos);
s.SetShade(b.fillcolor);
let s = mkBloodSmoke(SWWMStaticSprite.SpawnAt("mkBloodSmoke",pos));
s.scolor = b.fillcolor;
s.scale *= .4*str;
s.special1 += str-1;
s.thickness = str-1;
}
States
{
@ -450,53 +450,29 @@ Class mkBloodDrop : SWWMNonInteractiveActor
}
// chunky salsa in the air
Class mkBloodSmoke : SWWMNonInteractiveActor
Class mkBloodSmoke : SWWMStaticSprite
{
Default
{
+FORCEXYBILLBOARD;
+ROLLSPRITE;
Scale .5;
Alpha .35;
RenderStyle "Shaded";
}
override void PostBeginPlay()
{
int jumps = Random[Blood](0,19);
state dest = ResolveState("Spawn");
SetState(dest+jumps);
roll = FRandom[Blood](0,360);
}
override void Tick()
{
if ( freezetics > 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<gibsize; i++ )
{
if ( bloodthrottle && (!i || (i%bloodthrottle)) ) continue;
let a = Spawn("mkBloodSmoke2",pos+(FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](0.,.9)*height));
let a = mkBloodSmoke(SWWMStaticSprite.SpawnAt("mkBloodSmoke",pos+(FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](0.,.9)*height)));
a.scale = (.5,.5);
a.alpha = 1.;
ang = FRandom[Gibs](0,360);
pt = FRandom[Gibs](-90,90);
dir = SWWMUtility.Vec3FromAngles(ang,pt);
a.vel = vel*.1;
if ( a.vel.length() > 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<gibsize; i++ )
{

View file

@ -67,6 +67,179 @@ Class PaletteLight : PointLight
}
}
// base visual thinker subclasses
Class SWWMStaticSprite : VisualThinker abstract
{
bool bCheckWater; // checks water level, calls EnteredWater and LeftWater virtuals (perf intensive)
bool lastwater; // internal, water state from previous tic
bool firstwater; // internal, water state has been checked at least once
bool bWallStop; // stops moving if the next tic takes us out of bounds (perf intensive)
bool bWallKill; // destroy self if out of bounds (perf intensive)
double speed; // multiply any initial thrust by this (used by subclasses, mainly)
protected bool CheckWater()
{
if ( !cursector ) return false;
if ( cursector.moreflags&Sector.SECMF_UNDERWATER )
{
// directly underwater
return true;
}
let hsec = cursector.GetHeightSec();
if ( hsec )
{
// check for height transfer
double fh = hsec.floorplane.ZAtPoint(pos.xy);
if ( hsec.moreflags&Sector.SECMF_UNDERWATERMASK )
{
if ( fh-pos.z > 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<cursector.Get3DFloorCount(); i++ )
{
let ff = cursector.Get3DFloor(i);
if ( !(ff.flags&F3DFloor.FF_EXISTS)
|| (ff.flags&F3DFloor.FF_SOLID)
|| !(ff.flags&F3DFloor.FF_SWIMMABLE) )
continue;
double fh = ff.bottom.ZAtPoint(pos.xy);
double ch = ff.top.ZAtPoint(pos.xy);
if ( (pos.z >= 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<SWWMStaticSprite> 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<SWWMAnimSprite> 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<numpt; i++ )
if ( bAMBUSH )
{
numpt *= 2;
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.3,8);
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos);
s.vel = pvel;
s.scolor = Color(3,2,1)*Random[ExploS](64,85);
s.SetRenderStyle(STYLE_AddShaded);
s.scale *= 3.;
s.alpha *= .4;
}
}
else for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.3,8);
let s = Spawn(bAMBUSH?"SWWMSmoke":"SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.vel = pvel;
s.SetShade(Color(3,2,1)*Random[ExploS](64,85));
s.A_SetRenderStyle(s.alpha,STYLE_AddShaded);
s.scolor = Color(3,2,1)*Random[ExploS](64,85);
s.SetRenderStyle(STYLE_AddShaded);
s.scale *= 3.;
s.alpha *= bAMBUSH?.4:.2;
s.alpha *= .2;
}
Spawn(bAMBUSH?"PoofLight2":"PoofLight",pos);
}
@ -748,38 +954,27 @@ Class TeleLight : PaletteLight
}
}
Class SWWMTeleportSparkle : SWWMNonInteractiveActor
Class SWWMTeleportSparkle : SWWMStaticSprite
{
Default
double scalestep, alphastep;
override void SetupSprite()
{
RenderStyle "Add";
Scale .3;
+ROLLSPRITE;
+ROLLCENTER;
+FORCEXYBILLBOARD;
texture = TexMan.CheckForTexture("BLPFC0");
bCheckWater = false;
bWallStop = false;
bWallKill = false;
Scale = (.3,.3);
Flags |= SPF_FULLBRIGHT;
SetRenderStyle(STYLE_Add);
}
override void Tick()
override void OnTick()
{
if ( freezetics > 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<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.3,8)*alpha;
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.vel = pvel;
s.SetShade(Color(1,2,3)*int(Random[ExploS](64,85)*alpha));
s.A_SetRenderStyle(s.alpha,STYLE_AddShaded);
s.scolor = Color(1,2,3)*int(Random[ExploS](64,85)*alpha);
s.SetRenderStyle(STYLE_AddShaded);
s.scale *= 3.*alpha;
s.alpha *= alpha;
}
@ -929,10 +1124,10 @@ Class SWWMTeleportFog : SWWMNonInteractiveActor
if ( LineTrace(ang,dist,pt,TRF_THRUACTORS|TRF_THRUHITSCAN) ) continue;
Vector3 ofs = SWWMUtility.Vec3FromAngles(ang,pt)*dist;
Vector3 spos = level.Vec3Offset(pos,ofs);
let s = Spawn("SWWMTeleportSparkle",spos);
let s = SWWMTeleportSparkle(SWWMStaticSprite.SpawnAt("SWWMTeleportSparkle",spos));
s.scale *= FRandom[ExploS](.8,1.2);
s.specialf1 = FRandom[ExploS](.93,.97);
s.specialf2 = FRandom[ExploS](.02,.04);
s.scalestep = FRandom[ExploS](.93,.97);
s.alphastep = FRandom[ExploS](.02,.04);
s.roll = FRandom[ExploS](0,360);
}
A_FadeOut(.07);
@ -973,10 +1168,10 @@ Class SWWMPickupFlash : SWWMNonInteractiveActor
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.3,8);
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.vel = pvel;
s.SetShade(Color(Args[1],Args[2],Args[3])*Random[ExploS](64,85));
s.A_SetRenderStyle(s.alpha,STYLE_AddShaded);
s.scolor = Color(Args[1],Args[2],Args[3])*Random[ExploS](64,85);
s.SetRenderStyle(STYLE_AddShaded);
s.scale *= 3.;
s.alpha *= .5;
}
@ -1187,7 +1382,7 @@ Class SWWMBulletTrail : LineTracer
Array<WaterHit> WaterHitList;
Array<Line> 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<t.Results.Distance; i+=10 )
{
if ( !Random[Boolet](0,bubblechance) ) continue;
let b = Actor.Spawn(smoky?"SWWMSmallSmoke":"SWWMBubble",level.Vec3Offset(pos,dir*i));
if ( Random[Boolet](0,bubblesparse) ) continue;
if ( !Random[Boolet](0,i/100) ) continue; // fall off w/ distance
let b = SWWMAnimSprite.SpawnAt(smoky?"SWWMHalfSmoke":"SWWMHalfBubble",level.Vec3Offset(pos,dir*i));
b.Scale *= FRandom[Boolet](.4,.6);
}
t.Destroy();
@ -1737,12 +1933,13 @@ Class SWWMSizzleSmoke : SWWMBaseSplash
pt = FRandom[ExploS](-90,-30);
dir = SWWMUtility.Vec3FromAngles(ang,pt);
str = FRandom[ExploS](.5,2.);
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.vel = dir*str+(0,0,.4);
s.SetShade(Color(1,1,1)*Random[ExploS](192,224));
s.scolor = Color(1,1,1)*Random[ExploS](192,224);
s.scale *= 40.;
s.A_SetRenderStyle(s.alpha*.4,STYLE_AddShaded);
s.special1 = Random[ExploS](0,2);
s.alpha *= .4;
s.SetRenderStyle(STYLE_AddShaded);
s.framestep = Random[ExploS](1,3);
}
A_AlertMonsters(swwm_uncapalert?0:1200,AMF_EMITFROMTARGET);
}
@ -1757,12 +1954,13 @@ Class SWWMSizzleSmoke2 : SWWMBaseSplash
pt = FRandom[ExploS](-90,-30);
dir = SWWMUtility.Vec3FromAngles(ang,pt);
str = FRandom[ExploS](.25,1.);
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.vel = dir*str+(0,0,.15);
s.SetShade(Color(1,1,1)*Random[ExploS](192,224));
s.scolor = Color(1,1,1)*Random[ExploS](192,224);
s.scale *= 20.;
s.A_SetRenderStyle(s.alpha*.3,STYLE_AddShaded);
s.special1 = Random[ExploS](0,1);
s.alpha *= .3;
s.SetRenderStyle(STYLE_AddShaded);
s.framestep = Random[ExploS](1,2);
A_AlertMonsters(swwm_uncapalert?0:300,AMF_EMITFROMTARGET);
}
}

View file

@ -185,10 +185,10 @@ Class SWWMBossBrainExplArm : Actor
A_CountDown();
Spawn("ExplodiumMagTrail",pos);
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(1,1,1)*Random[ExploS](64,224));
s.special1 = Random[ExploS](1,3);
s.scolor = Color(1,1,1)*Random[ExploS](64,224);
s.framestep = Random[ExploS](2,4);
s.scale *= 2.4;
s.alpha *= 0.1+.4*(ReactionTime/15.);
}

View file

@ -58,7 +58,7 @@ Class SWWMCasing : Actor abstract
pitchvel *= .98;
}
if ( heat <= 0 ) return;
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.alpha *= heat;
heat -= 0.05;
}

View file

@ -25,21 +25,21 @@ Class ParriedBuff : Inventory
}
if ( special1 <= 0 ) return;
// smoke trail
Actor s;
SWWMAnimSprite s;
if ( special1&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,.6);
s.scale *= 1.2;
s.alpha *= .3;
}
if ( special1 > 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

View file

@ -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.);
}

View file

@ -87,8 +87,9 @@ Class Wallbuster : SWWMWeapon
}
for ( int i=5; i<t.Results.Distance; i+=10 )
{
if ( !Random[Boolet](0,bc) ) continue;
let b = Actor.Spawn("SWWMBubble",level.Vec3Offset(origin,dir*i));
if ( Random[Boolet](0,bc) ) continue;
if ( Random[Boolet](0,i/100) ) continue; // fall off w/ distance
let b = SWWMAnimSprite.SpawnAt("SWWMHalfBubble",level.Vec3Offset(origin,dir*i));
b.Scale *= FRandom[Boolet](.1,.3);
}
foreach( hit:t.HitList )

View file

@ -92,11 +92,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);
@ -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);

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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<t.Results.Distance; i+=16 )
{
if ( Random[Ynykron](0,2) ) continue;
let b = Spawn("SWWMHalfSmoke",level.Vec3Offset(pos,x*i));
let b = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",level.Vec3Offset(pos,x*i));
b.Scale *= FRandom[Ynykron](1.6,2.8);
b.special1 = Random[Ynykron](3,5);
b.A_SetRenderStyle(b.alpha*.3,STYLE_Subtract);
b.framestep = Random[Ynykron](4,6);
b.alpha *= .3;
b.SetRenderStyle(STYLE_Subtract);
b.vel += x*FRandom[Ynykron](-.2,.4);
}
if ( t.Results.HitType != TRACE_HitNone )

View file

@ -245,9 +245,9 @@ Class YnykronImpactArm : Actor
{
Spawn("YnykronImpactTrail",pos);
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.special1 = Random[ExploS](1,3);
s.framestep = Random[ExploS](2,4);
s.scale *= 2.4;
s.alpha *= 0.1+.4*(ReactionTime/15.);
}
@ -448,9 +448,9 @@ Class YnykronImpact : SWWMNonInteractiveActor
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.5,2);
let s = Spawn("SWWMHalfSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos);
s.vel = pvel;
s.special1 = Random[ExploS](1,8);
s.framestep = Random[ExploS](2,9);
s.scale *= 3.;
s.alpha *= .4;
}
@ -635,9 +635,9 @@ Class YnykronBeam : SWWMNonInteractiveActor
for ( int i=0; i<t.Results.Distance; i+=32 )
{
if ( Random[Ynykron](0,5) ) continue;
let b = Spawn("SWWMHalfSmoke",level.Vec3Offset(pos,x*i));
let b = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",level.Vec3Offset(pos,x*i));
b.Scale *= FRandom[Ynykron](1.6,2.8);
b.special1 = Random[Ynykron](3,5);
b.framestep = Random[Ynykron](4,6);
b.alpha *= .3;
b.vel += x*FRandom[Ynykron](-.2,.4);
}
@ -731,9 +731,9 @@ Class YnykronBeam : SWWMNonInteractiveActor
{
Vector3 ofs = level.Vec3Offset(pos,x*i);
if ( Random[Ynykron](0,5) || !level.IsPointInLevel(ofs) ) continue;
let b = Spawn("SWWMHalfSmoke",ofs);
let b = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",ofs);
b.Scale *= FRandom[Ynykron](1.6,2.8);
b.special1 = Random[Ynykron](3,5);
b.framestep = Random[Ynykron](4,6);
b.alpha *= .3;
b.vel += x*FRandom[Ynykron](-.2,.4);
}

View file

@ -145,7 +145,7 @@ Class DeepImpact : SWWMWeapon
t.hitposy.Clear();
t.hitposz.Clear();
t.Trace(origin,level.PointInSector(origin.xy),dir,250-i*150,0,ignore:self);
SWWMBulletTrail.DoTrail(self,origin,dir,250-i*150,0);
SWWMBulletTrail.DoTrail(self,origin,dir,250-i*150,10);
for ( int k=0; k<t.hitlist.Size(); k++ )
{
int inl = -1;

View file

@ -167,8 +167,9 @@ Class Spreadgun : SWWMWeapon
}
for ( int i=5; i<t.Results.Distance; i+=10 )
{
if ( !Random[Boolet](0,bc) ) continue;
let b = Actor.Spawn("SWWMBubble",level.Vec3Offset(origin,dir*i));
if ( Random[Boolet](0,bc) ) continue;
if ( Random[Boolet](0,i/100) ) continue; // fall off w/ distance
let b = SWWMAnimSprite.SpawnAt("SWWMHalfBubble",level.Vec3Offset(origin,dir*i));
b.Scale *= FRandom[Boolet](.1,.3);
}
foreach( hit:t.HitList )
@ -293,7 +294,7 @@ Class Spreadgun : SWWMWeapon
st.shootthroughlist.Clear();
st.waterhitlist.Clear();
st.Trace(origin,level.PointInSector(origin.xy),dir,8000.,0,ignore:self);
ProcessTraceHit(st,origin,dir,10,7000,bc:5);
ProcessTraceHit(st,origin,dir,10,7000,bc:3);
}
for ( int i=0; i<16; i++ )
{

View file

@ -322,13 +322,13 @@ Class BigBiospark : Actor
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.3,16)*factor;
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.vel = pvel;
s.SetShade(Color(4,5,2)*int(Random[ExploS](40,50)*factor));
s.A_SetRenderStyle(s.alpha,STYLE_AddShaded);
s.scolor = Color(4,5,2)*int(Random[ExploS](40,50)*factor);
s.SetRenderStyle(STYLE_AddShaded);
s.scale *= 8.*factor;
s.alpha *= factor;
s.bAMBUSH = true;
s.bCheckWater = false;
}
numpt = int(Random[ExploS](8,12));
for ( int i=0; i<numpt; i++ )
@ -585,13 +585,13 @@ Class BiosparkBall : Actor
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.3,8)*factor;
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.vel = pvel;
s.SetShade(Color(4,5,2)*int(Random[ExploS](40,50)*factor));
s.A_SetRenderStyle(s.alpha,STYLE_AddShaded);
s.scolor = Color(4,5,2)*int(Random[ExploS](40,50)*factor);
s.SetRenderStyle(STYLE_AddShaded);
s.scale *= 4.*factor;
s.alpha *= factor;
s.bAMBUSH = true;
s.bCheckWater = false;
}
numpt = int(Random[ExploS](4,8));
for ( int i=0; i<numpt; i++ )
@ -743,13 +743,13 @@ Class BiosparkBeamImpact : SWWMNonInteractiveActor
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.3,8)*factor;
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.vel = pvel;
s.SetShade(Color(4,5,2)*int(Random[ExploS](40,50)*factor));
s.A_SetRenderStyle(s.alpha,STYLE_AddShaded);
s.scolor = Color(4,5,2)*int(Random[ExploS](40,50)*factor);
s.SetRenderStyle(STYLE_AddShaded);
s.scale *= 4.*factor;
s.alpha *= factor;
s.bAMBUSH = true;
s.bCheckWater = false;
}
numpt = int(Random[ExploS](2,4));
for ( int i=0; i<numpt; i++ )
@ -925,13 +925,13 @@ Class BiosparkComboImpact : SWWMNonInteractiveActor
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.3,16)*factor;
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.vel = pvel;
s.SetShade(Color(4,5,2)*int(Random[ExploS](40,50)*factor));
s.A_SetRenderStyle(s.alpha,STYLE_AddShaded);
s.scolor = Color(4,5,2)*int(Random[ExploS](40,50)*factor);
s.SetRenderStyle(STYLE_AddShaded);
s.scale *= 4.*factor;
s.alpha *= factor;
s.bAMBUSH = true;
s.bCheckWater = false;
}
numpt = int(Random[ExploS](4,8));
for ( int i=0; i<numpt; i++ )
@ -1634,13 +1634,13 @@ Class BiosparkCore : Actor
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.3,8)*factor;
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.vel = pvel;
s.SetShade(Color(4,5,2)*int(Random[ExploS](40,50)*factor));
s.A_SetRenderStyle(s.alpha,STYLE_AddShaded);
s.scolor = Color(4,5,2)*int(Random[ExploS](40,50)*factor);
s.SetRenderStyle(STYLE_AddShaded);
s.scale *= 4.*factor;
s.alpha *= factor;
s.bAMBUSH = true;
s.bCheckWater = false;
}
numpt = int(Random[ExploS](4,8));
for ( int i=0; i<numpt; i++ )
@ -1678,12 +1678,13 @@ Class BiosparkCore : Actor
pitch += pitchvel;
roll += rollvel;
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.1,.4);
let s = Spawn("SWWMHalfSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",pos);
s.vel = pvel+vel*.1;
s.SetShade(Color(4,5,2)*Random[ExploS](40,50));
s.A_SetRenderStyle(s.alpha*.4,STYLE_AddShaded);
s.scolor = Color(4,5,2)*Random[ExploS](40,50);
s.alpha *= .4;
s.SetRenderStyle(STYLE_AddShaded);
s.scale *= 2.;
s.bAMBUSH = true;
s.bCheckWater = false;
}
States
{

View file

@ -72,10 +72,10 @@ Class ExplodiumMagArm : Actor
if ( target && special1 ) SWWMUtility.AchievementProgressInc("grenade",nkill,target.player);
}
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(1,1,1)*Random[ExploS](64,224));
s.special1 = Random[ExploS](1,3);
s.scolor = Color(1,1,1)*Random[ExploS](64,224);
s.framestep = Random[ExploS](2,4);
s.scale *= 2.4;
s.alpha *= 0.1+.4*(ReactionTime/15.);
A_CountDown();

View file

@ -122,16 +122,16 @@ Class CandyBeam : SWWMNonInteractiveActor
double a = FRandom[Candy](0,360), s = FRandom[Candy](0.,.8);
nextdir = SWWMUtility.ConeSpread(dir,y,z,a,s);
}
void A_Spread( Class<Actor> pop = "CandyPop", Class<Actor> smk = "SWWMHalfSmoke" )
void A_Spread( Class<Actor> pop = "CandyPop", Class<SWWMAnimSprite> 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<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](.2,.9);
let s = Spawn("SWWMSmallSmoke",pos);
let s = SWWMAnimSprite.SpawnAt("SWWMSmallSmoke",pos);
s.vel = pvel;
s.SetShade(Color(1,1,1)*Random[ExploS](64,224));
s.special1 = Random[ExploS](1,3);
s.scolor = Color(1,1,1)*Random[ExploS](64,224);
s.framestep = Random[ExploS](2,4);
s.scale *= 1.8;
s.alpha *= .4;
}
@ -330,10 +330,10 @@ Class CandyMagArm : Actor
double spd = vel.length();
vel = (vel*.1+SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*.7).unit()*spd;
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(1,1,1)*Random[ExploS](64,224));
s.special1 = Random[ExploS](2,7);
s.scolor = Color(1,1,1)*Random[ExploS](64,224);
s.framestep = Random[ExploS](3,8);
s.scale *= 2.4;
s.alpha *= 0.1+.4*(ReactionTime/8.);
int numpt = Random[ExploS](ReactionTime-12,3);
@ -403,10 +403,10 @@ Class CandyMagArmBig : CandyMagArm
double spd = vel.length();
vel = (vel*.1+SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*.5).unit()*spd;
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(1,1,1)*Random[ExploS](64,224));
s.special1 = Random[ExploS](2,7);
s.scolor = Color(1,1,1)*Random[ExploS](64,224);
s.framestep = Random[ExploS](3,8);
s.scale *= 2.4;
s.alpha *= 0.1+.4*(ReactionTime/6.);
int numpt = Random[ExploS](ReactionTime-15,1);

View file

@ -386,10 +386,10 @@ Class SilverBullet : SWWMWeapon
if ( !Random[Boolet](0,1) ) continue;
Vector3 ofs = level.Vec3Offset(start,tdir*i);
if ( !level.IsPointInLevel(ofs) ) continue;
let b = Spawn("SWWMHalfSmoke",ofs);
let b = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",ofs);
b.Scale *= FRandom[Boolet](.9,1.6);
b.alpha *= .5;
b.special1 = Random[Boolet](0,2);
b.framestep = Random[Boolet](1,3);
}
for ( int i=1; i<t.WallPenetrateList.Size(); i+=2 )
{
@ -419,10 +419,10 @@ Class SilverBullet : SWWMWeapon
if ( !Random[Boolet](0,1) ) continue;
Vector3 ofs = level.Vec3Offset(start,tdir*i);
if ( !level.IsPointInLevel(ofs) ) continue;
let b = Spawn("SWWMHalfSmoke",ofs);
let b = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",ofs);
b.Scale *= FRandom[Boolet](.9,1.6);
b.alpha *= .5;
b.special1 = Random[Boolet](0,2);
b.framestep = Random[Boolet](1,3);
}
}
}
@ -449,10 +449,10 @@ Class SilverBullet : SWWMWeapon
if ( !Random[Boolet](0,1) ) continue;
Vector3 ofs = level.Vec3Offset(origin,dir*i);
if ( !level.IsPointInLevel(ofs) ) continue;
let b = Spawn("SWWMHalfSmoke",ofs);
let b = SWWMAnimSprite.SpawnAt("SWWMHalfSmoke",ofs);
b.Scale *= FRandom[Boolet](.9,1.6);
b.alpha *= .5;
b.special1 = Random[Boolet](0,2);
b.framestep = Random[Boolet](1,3);
}
}
}