Reduce performance impact of MR overpressure shot.

This commit is contained in:
Mari the Deer 2022-09-28 21:40:16 +02:00
commit 144d076f75
3 changed files with 57 additions and 44 deletions

View file

@ -1,3 +1,3 @@
[default]
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r524 \cu(Wed 28 Sep 21:00:24 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r524 \cu(2022-09-28 21:00:24)\c-";
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r526 \cu(Wed 28 Sep 21:42:26 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r526 \cu(2022-09-28 21:42:26)\c-";

View file

@ -913,8 +913,28 @@ Class MisterRifle : SWWMWeapon
b.A_CheckTerrain();
}
Array<MisterBulletImpact> bi; // so we can ignite them all at once after main contact damage
bool bskipme = false;
for ( int i=0; i<mrt.hitlist.Size(); i++ )
{
if ( mrt.HitList[i].HitActor && !mrt.HitList[i].bExit )
{
SWWMUtility.DoKnockback(mrt.HitList[i].HitActor,mrt.HitList[i].x+(0,0,0.025),80000);
let p = SWWMPuff.Setup(mrt.HitList[i].HitLocation,mrt.HitList[i].x,invoker,self,mrt.HitList[i].HitActor);
mrt.HitList[i].HitActor.DamageMobj(p,self,4444,'Mortal',DMG_FOILINVUL|DMG_THRUSTLESS|DMG_INFLICTOR_IS_PUFF);
if ( !mrt.HitList[i].HitActor || (mrt.HitList[i].HitActor.Health <= 0) )
mrc.nkill++;
}
if ( mrt.HitList[i].bExit && (i < mrt.hitlist.Size()-1)
&& (level.Vec3Diff(mrt.HitList[i].HitLocation,mrt.HitList[i+1].HitLocation).length() < 100) )
{
bskipme = true;
continue;
}
if ( bskipme )
{
bskipme = false;
continue;
}
if ( mrt.HitList[i].bExit )
{
let b = MisterBulletImpact(Spawn("MisterRailExitImpact",mrt.hitlist[i].HitLocation-mrt.hitlist[i].x*4.));
@ -924,37 +944,19 @@ Class MisterRifle : SWWMWeapon
b.mrc = mrc;
mrc.effectors.Push(b);
bi.Push(b);
continue;
}
else
{
let b = MisterBulletImpact(Spawn("MisterRailEntryImpact",mrt.hitlist[i].HitLocation+mrt.hitlist[i].x*4.));
b.angle = atan2(mrt.HitList[i].x.y,mrt.HitList[i].x.x)+180;
b.pitch = asin(mrt.HitList[i].x.z);
b.target = self;
b.mrc = mrc;
mrc.effectors.Push(b);
bi.Push(b);
}
if ( !mrt.HitList[i].HitActor || mrt.HitList[i].bExit ) continue;
SWWMUtility.DoKnockback(mrt.HitList[i].HitActor,mrt.HitList[i].x+(0,0,0.025),80000);
let p = SWWMPuff.Setup(mrt.HitList[i].HitLocation,mrt.HitList[i].x,invoker,self,mrt.HitList[i].HitActor);
mrt.HitList[i].HitActor.DamageMobj(p,self,4444,'Mortal',DMG_FOILINVUL|DMG_THRUSTLESS|DMG_INFLICTOR_IS_PUFF);
if ( !mrt.HitList[i].HitActor || (mrt.HitList[i].HitActor.Health <= 0) )
mrc.nkill++;
}
LineTracer faketracer = new("LineTracer");
for ( int i=0; i<mrt.wallpenetratelist.Size(); i++ )
{
bool bExit = !!(i%2); // odd-numbered entries are exit points
Vector3 hitpos = mrt.WallPenetrateList[i].hitpos;
Vector3 hitnormal = mrt.WallPenetrateList[i].hitnormal;
let b = MisterBulletImpact(Spawn(bExit?"MisterRailExitImpact":"MisterRailEntryImpact",hitpos+hitnormal*4.));
b.angle = atan2(hitnormal.y,hitnormal.x);
b.pitch = asin(-hitnormal.z);
let b = MisterBulletImpact(Spawn("MisterRailEntryImpact",mrt.hitlist[i].HitLocation+mrt.hitlist[i].x*4.));
b.angle = atan2(mrt.HitList[i].x.y,mrt.HitList[i].x.x)+180;
b.pitch = asin(mrt.HitList[i].x.z);
b.target = self;
b.mrc = mrc;
mrc.effectors.Push(b);
bi.Push(b);
}
LineTracer faketracer = new("LineTracer");
for ( int i=0; i<mrt.wallpenetratelist.Size(); i++ )
{
if ( mrt.WallPenetrateList[i].hittype == TRACE_HitWall )
mrt.WallPenetrateList[i].hitline.Activate(self,mrt.WallPenetrateList[i].hitside,SPAC_Impact);
if ( swwm_omnibust )
@ -967,6 +969,27 @@ Class MisterRifle : SWWMWeapon
faketracer.Results.Tier = mrt.WallPenetrateList[i].HitTier;
BusterWall.Bust(faketracer.Results,444,self,mrt.WallPenetrateList[i].BustDir,mrt.WallPenetrateList[i].HitPos.z);
}
bool bExit = !!(i%2); // odd-numbered entries are exit points
if ( bExit && (i < mrt.wallpenetratelist.Size()-1)
&& (level.Vec3Diff(mrt.wallpenetratelist[i].HitPos,mrt.wallpenetratelist[i+1].HitPos).length() < 100) )
{
bskipme = true;
continue;
}
if ( bskipme )
{
bskipme = false;
continue;
}
Vector3 hitpos = mrt.WallPenetrateList[i].hitpos;
Vector3 hitnormal = mrt.WallPenetrateList[i].hitnormal;
let b = MisterBulletImpact(Spawn(bExit?"MisterRailExitImpact":"MisterRailEntryImpact",hitpos+hitnormal*4.));
b.angle = atan2(hitnormal.y,hitnormal.x);
b.pitch = asin(-hitnormal.z);
b.target = self;
b.mrc = mrc;
mrc.effectors.Push(b);
bi.Push(b);
}
if ( (mrt.Results.HitType != TRACE_HitNone) && (mrt.Results.HitType != TRACE_HasHitSky) && (mrt.Results.HitType != TRACE_HitActor) )
{
@ -998,24 +1021,12 @@ Class MisterRifle : SWWMWeapon
}
for ( int i=0; i<bi.Size(); i++ ) bi[i].A_BulletExplode();
double dist = level.Vec3Diff(origin,mrt.Results.HitPos).length();
for ( double d=0.; d<=dist; d+=200. )
for ( double d=0.; d<=dist; d+=250. )
{
Vector3 p = level.Vec3Offset(origin,startdir*d);
if ( !level.IsPointInlevel(p) ) continue;
Spawn("MisterRailLight",p);
}
int numpt = Random[ExploS](50,100);
double dv = max(16.,dist/numpt);
for ( double d=32.; d<=dist; d+=dv )
{
Vector3 np = level.Vec3Offset(origin,startdir*d);
np = level.Vec3Offset(np,SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](4,12));
if ( !level.IsPointInLevel(np) ) continue;
let p = Spawn("MisterPop",np);
p.target = self;
MisterPop(p).mrc = mrc;
mrc.effectors.Push(p);
}
if ( mrt.wallpenetratelist.Size() > 0 )
{
Vector3 start = origin;

View file

@ -666,7 +666,7 @@ Class MisterRailEntryImpact : MisterBulletImpact
}
override void A_BulletExplode()
{
A_AlertMonsters(swwm_uncapalert?0:4000);
A_AlertMonsters(swwm_uncapalert?0:2000);
int nhit, nkill;
[nhit, nkill] = SWWMUtility.DoExplosion(self,444,200000,100,100,DE_EXTRAZTHRUST|DE_COUNTENEMIES);
if ( mrc ) mrc.nkill += nkill;
@ -701,7 +701,7 @@ Class MisterRailEntryImpact : MisterBulletImpact
let s = Spawn("SWWMChip",pos);
s.vel = pvel;
}
numpt = Random[ExploS](4,6);
numpt = Random[ExploS](4,8);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn("MisterFuzzy",pos);
@ -790,7 +790,7 @@ Class MisterRailExitImpact : MisterBulletImpact
let s = Spawn("SWWMChip",pos);
s.vel = pvel;
}
numpt = Random[ExploS](10,15);
numpt = Random[ExploS](8,12);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn("MisterFuzzy",pos);
@ -1169,6 +1169,7 @@ Class MisterGrenade : Actor
A_QuakeEx(8,8,8,20,0,900,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollintensity:1.5);
A_StartSound("mister/hitgrenade",CHAN_VOICE,attenuation:.3);
A_StartSound("mister/hitgrenade",CHAN_WEAPON,attenuation:.2);
A_AlertMonsters(swwm_uncapalert?0:3500);
SetOrigin(Vec3Offset(0,0,Height/2),false);
int numpt = Random[ExploS](30,50);
for ( int i=0; i<numpt; i++ )
@ -1370,6 +1371,7 @@ Class MisterSubGrenade : MisterGrenade
A_QuakeEx(5,5,5,10,0,500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:.8);
A_StartSound("mister/hitgrenadesub",CHAN_VOICE,attenuation:.5);
A_StartSound("mister/hitgrenadesub",CHAN_WEAPON,attenuation:.4);
A_AlertMonsters(swwm_uncapalert?0:1500);
SetOrigin(Vec3Offset(0,0,Height/2),false);
int numpt = Random[ExploS](15,25);
for ( int i=0; i<numpt; i++ )