Begin VisualThinker migration. Some effects still pending.
This commit is contained in:
parent
af8f8fc6ee
commit
77b1ad89a9
28 changed files with 577 additions and 412 deletions
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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++ )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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++ )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue