MR damage tweaks + Stream Shot implemented.

This commit is contained in:
Marisa the Magician 2022-09-20 21:08:07 +02:00
parent 5c19c6fe50
commit 38499740c3
4 changed files with 177 additions and 39 deletions

View File

@ -375,6 +375,15 @@ decal YnykronBlast
lowerdecal YnykronBlast2
}
decal SmallRocketBlast
{
pic rktblast
shade "00 00 00"
x-scale 0.25
y-scale 0.25
randomflipx
randomflipy
}
decal RocketBlast
{
pic rktblast

View File

@ -1,3 +1,3 @@
[default]
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r486 \cu(Tue 20 Sep 16:01:57 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r486 \cu(2022-09-20 16:01:57)\c-";
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r487 \cu(Tue 20 Sep 21:08:07 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r487 \cu(2022-09-20 21:08:07)\c-";

View File

@ -447,35 +447,21 @@ Class MisterRifle : SWWMWeapon
[x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll);
double a, s;
Vector3 dir;
for ( int i=0; i<15; i++ )
for ( int i=0; i<8; i++ )
{
// initial shot
if ( i == 0 )
// initial shot, triangle
if ( i < 3 )
{
a = FRandom[Mister](0,360);
s = .01;
dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s);
}
// next three shots, triangle
else if ( i < 4 )
{
a = 90+120*(i-1)+FRandom[Mister](-15,15);
a = 90+120*i+FRandom[Mister](-15,15);
s = .04+FRandom[Mister](-.01,.01);
dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s);
dir = SWWMUtility.ConeSpread(x2,y2*1.5,z2,a,s);
}
// next five shots, pentagon
else if ( i < 9 )
{
a = -90+72*(i-4)+FRandom[Mister](-20,20);
s = .08+FRandom[Mister](-.02,.02);
dir = SWWMUtility.ConeSpread(x2,y2*1.2,z2,a,s);
}
// final six shots, wide hexagon
else
{
a = 60*(i-9)+FRandom[Mister](-25,25);
s = .12+FRandom[Mister](-.03,.03);
dir = SWWMUtility.ConeSpread(x2,y2*1.6,z2,a,s);
a = -90+72*(i-3)+FRandom[Mister](-9,9);
s = .08+FRandom[Mister](-.02,.02);
dir = SWWMUtility.ConeSpread(x2,y2*2.,z2,a,s);
}
FLineTraceData d;
LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d);
@ -523,7 +509,7 @@ Class MisterRifle : SWWMWeapon
b.pitch = asin(-hitnormal.z);
b.target = self;
MisterBulletImpact(b).A_BulletExplode();
if ( swwm_omnibust ) BusterWall.BustLinetrace(d,44,self,d.HitDir,d.HitLocation.z);
if ( swwm_omnibust ) BusterWall.BustLinetrace(d,444,self,d.HitDir,d.HitLocation.z);
}
}
return ResolveState("FireCluster");
@ -610,6 +596,69 @@ Class MisterRifle : SWWMWeapon
SWWMUtility.DoKnockback(self,-x,5000.);
A_QuakeEx(3,3,3,5,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4);
A_BumpFOV(.97);
if ( index == 0 ) A_AlertMonsters(swwm_uncapalert?0:5000);
for ( int i=0; i<3; i++ )
{
let s = Spawn("SWWMSmoke",origin);
s.scale *= .4;
s.alpha *= .1;
s.speed *= .5;
s.vel += vel*.5+x*FRandom[Mister](1.,2.);
s.SetShade(Color(0,3,4)*Random[ExploS](48,63));
}
Vector3 x2, y2, z2;
[x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll);
static const double spd[] = {.00,.01,.03,.06,.10};
double a = FRandom[Mister](0,360), s = FRandom[Mister](spd[index],spd[index+1]);
Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s);
FLineTraceData d;
LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION|TRF_NOSKY,origin.z,origin.x,origin.y,d);
SWWMBulletTrail.DoTrail(self,origin,dir,10000,2);
if ( d.HitType == TRACE_HitActor )
{
if ( d.HitActor.bNOBLOOD || d.HitActor.bDORMANT )
{
let p = Spawn("SWWMBulletImpact",d.HitLocation);
p.angle = atan2(d.HitDir.y,d.HitDir.x)+180;
p.pitch = asin(d.HitDir.z);
p.target = self;
}
let b = Spawn("MisterStreamImpact",d.HitLocation-d.HitDir*4.);
b.angle = atan2(d.HitDir.y,d.HitDir.x)+180;
b.pitch = asin(d.HitDir.z);
b.target = self;
MisterBulletImpact(b).A_BulletExplode();
}
else if ( d.HitType != TRACE_HitNone )
{
Vector3 hitnormal = -d.HitDir;
if ( d.HitType == TRACE_HitFloor )
{
if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal;
else hitnormal = d.HitSector.floorplane.Normal;
}
else if ( d.HitType == TRACE_HitCeiling )
{
if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal;
else hitnormal = d.HitSector.ceilingplane.Normal;
}
else if ( d.HitType == TRACE_HitWall )
{
hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit();
if ( !d.LineSide ) hitnormal *= -1;
}
let p = Spawn("SWWMBulletImpact",d.HitLocation+hitnormal*0.01);
p.angle = atan2(hitnormal.y,hitnormal.x);
p.pitch = asin(-hitnormal.z);
p.target = self;
if ( d.HitLine ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation);
let b = Spawn("MisterStreamImpact",d.HitLocation+hitnormal*4.);
b.angle = atan2(hitnormal.y,hitnormal.x);
b.pitch = asin(-hitnormal.z);
b.target = self;
MisterBulletImpact(b).A_BulletExplode();
if ( swwm_omnibust ) BusterWall.BustLinetrace(d,444,self,d.HitDir,d.HitLocation.z);
}
}
action void A_MisterStartRail()

View File

@ -115,8 +115,8 @@ Class MisterExLight : PaletteLight
Default
{
Tag "Cyanblu";
ReactionTime 30;
Args 0,0,0,200;
ReactionTime 35;
Args 0,0,0,250;
}
}
Class MisterExLightBig : MisterExLight
@ -139,7 +139,7 @@ Class MisterExLightTiny : MisterExLight
{
Default
{
ReactionTime 20;
ReactionTime 15;
Args 0,0,0,80;
}
}
@ -208,14 +208,14 @@ Class MisterFuzzy : Actor
}
override void PostBeginPlay()
{
special1 += Random[ExploS](4,8);
special1 += Random[ExploS](4,10);
specialf1 = special1;
vel = SWWMUtility.Vec3FromAngles(angle,pitch)*FRandom[ExploS](8,24);
}
override void Tick()
{
if ( isFrozen() ) return;
SWWMUtility.DoExplosion(self,(special2==1)?444:(special2==0)?44:4,3000,80,80,DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,(special2<0)?4:44,3000,80,80,DE_EXTRAZTHRUST);
special1--;
if ( special1 <= 0 )
{
@ -440,7 +440,7 @@ Class MisterBulletImpact : Actor
let s = Spawn("SWWMChip",pos);
s.vel = pvel;
}
numpt = Random[ExploS](10,12);
numpt = Random[ExploS](15,20);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn("MisterFuzzy",pos);
@ -453,9 +453,9 @@ Class MisterBulletImpact : Actor
}
virtual void A_BulletSubExplode()
{
if ( special1 && (special1 <= 10) )
if ( special1 && (special1 <= 15) )
{
SWWMUtility.DoExplosion(self,44,5000+special1*300,50+special1*15,50+special1*15,DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,44,5000+special1*200,50+special1*10,50+special1*10,DE_EXTRAZTHRUST);
int numpt = Random[ExploS](0,special1);
for ( int i=0; i<numpt; i++ )
{
@ -483,7 +483,7 @@ Class MisterBulletImpact : Actor
{
Spawn:
TNT1 A 0;
XEX7 ACEGIKMOQSUWY[] 1 Bright A_BulletSubExplode();
XEX7 ABDEGHJKMNPQSTVWYZ\] 1 Bright A_BulletSubExplode();
Stop;
}
}
@ -497,14 +497,14 @@ Class MisterBuckshotImpact : MisterBulletImpact
override void A_BulletExplode()
{
A_AlertMonsters(swwm_uncapalert?0:1000);
SWWMUtility.DoExplosion(self,44,4000,100,100,DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,444,8000,80,80,DE_EXTRAZTHRUST);
A_QuakeEx(2,2,2,5,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:60,rollintensity:.2);
A_StartSound("mister/hitscatter",CHAN_VOICE,attenuation:.35);
A_SprayDecal("ShockMark",-172);
Scale *= FRandom[ExploS](0.8,1.1);
Scale.x *= RandomPick[ExploS](-1,1);
Scale.y *= RandomPick[ExploS](-1,1);
int numpt = Random[ExploS](5,10);
int numpt = Random[ExploS](4,8);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](1,4);
@ -529,14 +529,14 @@ Class MisterBuckshotImpact : MisterBulletImpact
let s = Spawn("SWWMChip",pos);
s.vel = pvel;
}
numpt = Random[ExploS](6,8);
numpt = Random[ExploS](-2,4);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn("MisterFuzzy",pos);
s.angle = FRandom[ExploS](0,360);
s.pitch = FRandom[ExploS](-90,90);
s.target = target;
s.special1 -= 2;
s.special1 -= 3;
s.special2 = -1;
}
Spawn("MisterExLightTiny",pos);
@ -544,10 +544,90 @@ Class MisterBuckshotImpact : MisterBulletImpact
p.A_SetScale(1.5);
}
override void A_BulletSubExplode()
{
if ( special1 && (special1 <= 5) )
{
SWWMUtility.DoExplosion(self,44,600+special1*80,40+special1*12,40+special1*12,DE_EXTRAZTHRUST);
int numpt = Random[ExploS](0,special1/3);
for ( int i=0; i<numpt; i++ )
{
Vector3 np = level.Vec3Offset(pos,SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](2,16)*special1);
if ( !level.IsPointInLevel(np) ) continue;
let p = Spawn("MisterPop",np);
p.target = target;
}
}
special1++;
}
States
{
Spawn:
TNT1 A 0;
XEX7 ADGJMPSVY\ 1 Bright A_BulletSubExplode();
Stop;
}
}
Class MisterStreamImpact : MisterBulletImpact
{
Default
{
Scale 1.;
}
override void A_BulletExplode()
{
A_AlertMonsters(swwm_uncapalert?0:4000);
SWWMUtility.DoExplosion(self,444,150000,120,120,DE_EXTRAZTHRUST);
A_QuakeEx(5,5,5,5,0,300,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollintensity:.5);
A_StartSound("mister/hitstream",CHAN_VOICE,attenuation:.35);
A_StartSound("mister/hitstream",CHAN_WEAPON,attenuation:.25);
A_SprayDecal("SmallRocketBlast",-172);
Scale *= FRandom[ExploS](0.8,1.1);
Scale.x *= RandomPick[ExploS](-1,1);
Scale.y *= RandomPick[ExploS](-1,1);
int numpt = Random[ExploS](8,12);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](1,8);
let s = Spawn("SWWMSmoke",pos);
s.vel = pvel;
s.SetShade(Color(0,3,4)*Random[ExploS](48,63));
s.special1 = Random[ExploS](0,2);
s.scale *= 3.5;
s.alpha *= .4;
}
numpt = Random[ExploS](4,6);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](8,12);
let s = Spawn("SWWMSpark",pos);
s.vel = pvel;
}
numpt = Random[ExploS](3,6);
for ( int i=0; i<numpt; i++ )
{
Vector3 pvel = SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90))*FRandom[ExploS](4,16);
let s = Spawn("SWWMChip",pos);
s.vel = pvel;
}
numpt = Random[ExploS](4,8);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn("MisterFuzzy",pos);
s.angle = FRandom[ExploS](0,360);
s.pitch = FRandom[ExploS](-90,90);
s.target = target;
s.special1 -= 2;
}
Spawn("MisterExLightSmall",pos);
let p = Spawn("MisterBulletImpactPop",pos);
p.A_SetScale(3.);
}
override void A_BulletSubExplode()
{
if ( special1 && (special1 <= 10) )
{
SWWMUtility.DoExplosion(self,4,300+special1*20,50+special1*10,50+special1*10,DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,44,2000+special1*50,80+special1*8,80+special1*8,DE_EXTRAZTHRUST);
int numpt = Random[ExploS](0,special1/2);
for ( int i=0; i<numpt; i++ )
{