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

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