Quadravol level 2 projectile + melee tweaks.
|
|
@ -1,3 +1,3 @@
|
||||||
[default]
|
[default]
|
||||||
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r353 \cu(Sat 20 Aug 19:59:18 CEST 2022)\c-";
|
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r354 \cu(Sun 21 Aug 12:44:40 CEST 2022)\c-";
|
||||||
SWWM_SHORTVER="\cw1.3pre r353 \cu(2022-08-20 19:59:18)\c-";
|
SWWM_SHORTVER="\cw1.3pre r354 \cu(2022-08-21 12:44:40)\c-";
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 8.8 KiB |
BIN
sprites/XRG8A0.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
sprites/XRG8B0.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
sprites/XRG8C0.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
sprites/XRG8D0.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
sprites/XRG8E0.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
sprites/XRG8F0.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
sprites/XRG8G0.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
sprites/XRG8H0.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
sprites/XRG8I0.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
sprites/XRG8J0.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
sprites/XRG8K0.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
sprites/XRG8L0.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
sprites/XRG8M0.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
sprites/XRG8N0.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
sprites/XRG8O0.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
sprites/XRG8P0.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
sprites/XRG8Q0.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
sprites/XRG8R0.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
sprites/XRG8S0.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
sprites/XRG8T0.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
sprites/XRG8U0.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
sprites/XRG8V0.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
sprites/XRG8W0.png
Normal file
|
After Width: | Height: | Size: 1 KiB |
BIN
sprites/XRG8X0.png
Normal file
|
After Width: | Height: | Size: 670 B |
|
|
@ -115,7 +115,7 @@ Class Quadravol : SWWMWeapon
|
||||||
Actor p;
|
Actor p;
|
||||||
switch ( idx )
|
switch ( idx )
|
||||||
{
|
{
|
||||||
case 0:
|
default:
|
||||||
A_QuakeEx(3,3,3,15,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4);
|
A_QuakeEx(3,3,3,15,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4);
|
||||||
A_BumpFOV(.98);
|
A_BumpFOV(.98);
|
||||||
A_SWWMFlash();
|
A_SWWMFlash();
|
||||||
|
|
@ -131,30 +131,35 @@ Class Quadravol : SWWMWeapon
|
||||||
{
|
{
|
||||||
p.tracer = self;
|
p.tracer = self;
|
||||||
p.master = fool;
|
p.master = fool;
|
||||||
p.special1 = bMelee?100:50;
|
p.special1 += bMelee?100:50;
|
||||||
p.special2 = bMelee?120000:40000;
|
p.special2 += bMelee?120000:40000;
|
||||||
p.bAMBUSH = bMelee;
|
p.bAMBUSH = bMelee;
|
||||||
p.ExplodeMissile(null,null);
|
p.ExplodeMissile(null,null);
|
||||||
self.DamageMobj(invoker,self,bAMBUSH?20:40,'Fire',DMG_EXPLOSION);
|
self.DamageMobj(invoker,self,bMelee?20:40,'Fire',DMG_EXPLOSION);
|
||||||
}
|
|
||||||
for ( int i=0; i<4; i++ )
|
|
||||||
{
|
|
||||||
let s = Spawn("SWWMSmoke",origin);
|
|
||||||
s.special1 = 1;
|
|
||||||
s.scale *= 1.3;
|
|
||||||
s.alpha *= .2;
|
|
||||||
s.vel += vel*.5+x*FRandom[Quadravol](5.,15.)+y*FRandom[Quadravol](-.5,.5)+z*FRandom[Quadravol](-.5,.5);
|
|
||||||
}
|
|
||||||
for ( int i=0; i<10; i++ )
|
|
||||||
{
|
|
||||||
let s = Spawn("SWWMSpark",origin);
|
|
||||||
s.scale *= .3;
|
|
||||||
s.alpha *= .4;
|
|
||||||
s.vel += vel*.5+x*FRandom[Quadravol](4.,8.)+y*FRandom[Quadravol](-1.,1.)+z*FRandom[Quadravol](-1.,1.);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
A_Log("\cg// TODO - Fire Level 2\c-");
|
A_QuakeEx(4,4,4,18,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.5);
|
||||||
|
A_BumpFOV(.97);
|
||||||
|
A_SWWMFlash();
|
||||||
|
SWWMHandler.DoFlash(self,Color(64,255,192,64),7);
|
||||||
|
A_AlertMonsters(swwm_uncapalert?0:3000);
|
||||||
|
SWWMUtility.DoKnockback(self,-x,2500.);
|
||||||
|
p = Spawn("QuadProj2",origin);
|
||||||
|
p.target = self;
|
||||||
|
p.angle = atan2(x2.y,x2.x);
|
||||||
|
p.pitch = asin(-x2.z);
|
||||||
|
p.vel = x2*p.speed;
|
||||||
|
if ( pointblank || bMelee )
|
||||||
|
{
|
||||||
|
p.tracer = self;
|
||||||
|
p.master = fool;
|
||||||
|
p.special1 = bMelee?150:80;
|
||||||
|
p.special2 = bMelee?150000:60000;
|
||||||
|
p.bAMBUSH = bMelee;
|
||||||
|
p.ExplodeMissile(null,null);
|
||||||
|
self.DamageMobj(invoker,self,bMelee?20:40,'Fire',DMG_EXPLOSION);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
A_Log("\cg// TODO - Fire Level 3\c-");
|
A_Log("\cg// TODO - Fire Level 3\c-");
|
||||||
|
|
@ -167,6 +172,23 @@ Class Quadravol : SWWMWeapon
|
||||||
else A_Log("\cg// TODO - Fire Level 5\c-");
|
else A_Log("\cg// TODO - Fire Level 5\c-");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
for ( int i=0; i<(4+idx); i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("SWWMSmoke",origin);
|
||||||
|
s.special1 = 1;
|
||||||
|
s.scale *= 1.3;
|
||||||
|
s.alpha *= .2;
|
||||||
|
s.vel += vel*.5+x*FRandom[Quadravol](5.,15.)+y*FRandom[Quadravol](-.5,.5)+z*FRandom[Quadravol](-.5,.5);
|
||||||
|
s.vel *= 1.+.1*idx;
|
||||||
|
}
|
||||||
|
for ( int i=0; i<(10+2*idx); i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("SWWMSpark",origin);
|
||||||
|
s.scale *= .3;
|
||||||
|
s.alpha *= .4;
|
||||||
|
s.vel += vel*.5+x*FRandom[Quadravol](4.,8.)+y*FRandom[Quadravol](-1.,1.)+z*FRandom[Quadravol](-1.,1.);
|
||||||
|
s.vel *= 1.+.1*idx;
|
||||||
|
}
|
||||||
invoker.chargelevel = 0;
|
invoker.chargelevel = 0;
|
||||||
invoker.charged = true; // eat it up
|
invoker.charged = true; // eat it up
|
||||||
if ( bMelee ) return ResolveState(null);
|
if ( bMelee ) return ResolveState(null);
|
||||||
|
|
@ -248,7 +270,7 @@ Class Quadravol : SWWMWeapon
|
||||||
action void A_FireBayonet()
|
action void A_FireBayonet()
|
||||||
{
|
{
|
||||||
A_StartSound("quadshot/bayonetfire",CHAN_WEAPON,CHANF_OVERLAP);
|
A_StartSound("quadshot/bayonetfire",CHAN_WEAPON,CHANF_OVERLAP);
|
||||||
A_Melee(50,"spreadgun/slug",1.5,.8,-.5,MELEE_Rip|MELEE_FleshSound|MELEE_NoRage|MELEE_NoUse);
|
A_Melee(60,"spreadgun/slug",1.5,.6,-.2,MELEE_Rip|MELEE_FleshSound|MELEE_NoRage|MELEE_NoUse,null);
|
||||||
Vector3 dir = SWWMUtility.Vec3FromAngles(angle,pitch);
|
Vector3 dir = SWWMUtility.Vec3FromAngles(angle,pitch);
|
||||||
vel += dir*4.;
|
vel += dir*4.;
|
||||||
A_QuakeEx(4,4,4,8,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.75);
|
A_QuakeEx(4,4,4,8,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.75);
|
||||||
|
|
@ -465,14 +487,18 @@ Class Quadravol : SWWMWeapon
|
||||||
XZW2 A 2
|
XZW2 A 2
|
||||||
{
|
{
|
||||||
A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP);
|
A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP);
|
||||||
A_PlayerMelee();
|
|
||||||
return A_JumpIf(invoker.onehand,"User11H");
|
return A_JumpIf(invoker.onehand,"User11H");
|
||||||
}
|
}
|
||||||
XZW7 BCDEF 2;
|
XZW7 BCD 2;
|
||||||
XZW7 G 2 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
|
XZW7 E 2
|
||||||
|
{
|
||||||
|
A_PlayerMelee();
|
||||||
|
A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
|
||||||
|
}
|
||||||
|
XZW7 FG 2;
|
||||||
XZW7 H 2 A_Parry(6);
|
XZW7 H 2 A_Parry(6);
|
||||||
XZW7 I 1;
|
XZW7 I 1;
|
||||||
XZW7 J 1 A_JumpIf(A_Melee(10,"demolitionist/whitm",1.5,.8,.2),"Bayonet");
|
XZW7 J 1 A_JumpIf(A_Melee(20,"demolitionist/whitm",1.2,.6,.2),"Bayonet");
|
||||||
XZW7 KLM 1;
|
XZW7 KLM 1;
|
||||||
XZW7 NOPQRST 2;
|
XZW7 NOPQRST 2;
|
||||||
XZW7 UVWX 3;
|
XZW7 UVWX 3;
|
||||||
|
|
@ -602,11 +628,16 @@ Class Quadravol : SWWMWeapon
|
||||||
User11H:
|
User11H:
|
||||||
XZW9 G 2;
|
XZW9 G 2;
|
||||||
XZWC Z 2;
|
XZWC Z 2;
|
||||||
XZWD ABCD 2;
|
XZWD AB 2;
|
||||||
XZWD E 2 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
|
XZWD C 2
|
||||||
|
{
|
||||||
|
A_PlayerMelee();
|
||||||
|
A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
|
||||||
|
}
|
||||||
|
XZWD DE 2;
|
||||||
XZWD F 2 A_Parry(6);
|
XZWD F 2 A_Parry(6);
|
||||||
XZWD G 1;
|
XZWD G 1;
|
||||||
XZWD H 1 A_JumpIf(A_Melee(10,"demolitionist/whitm",1.5,.8,.2),"Bayonet1H");
|
XZWD H 1 A_JumpIf(A_Melee(20,"demolitionist/whitm",1.2,.6,.2),"Bayonet1H");
|
||||||
XZWD IJK 1;
|
XZWD IJK 1;
|
||||||
XZWD LMNOPQR 2;
|
XZWD LMNOPQR 2;
|
||||||
XZWD STUV 3;
|
XZWD STUV 3;
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,15 @@ Class QuadExplLight : PaletteLight
|
||||||
ReactionTime 20;
|
ReactionTime 20;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Class QuadExplLight2 : PaletteLight
|
||||||
|
{
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
Tag "QuadExpl";
|
||||||
|
Args 0,0,0,250;
|
||||||
|
ReactionTime 25;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Class QuadFlare : Actor
|
Class QuadFlare : Actor
|
||||||
{
|
{
|
||||||
|
|
@ -198,6 +207,39 @@ Class QuadEmber : Actor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Class QuadExplRing : Actor
|
||||||
|
{
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
RenderStyle "Add";
|
||||||
|
Scale 1.2;
|
||||||
|
Radius .1;
|
||||||
|
Height 0;
|
||||||
|
+NOGRAVITY;
|
||||||
|
+NOBLOCKMAP;
|
||||||
|
+FORCEXYBILLBOARD;
|
||||||
|
+NOTELEPORT;
|
||||||
|
+NOINTERACTION;
|
||||||
|
}
|
||||||
|
override void Tick()
|
||||||
|
{
|
||||||
|
if ( isFrozen() ) return;
|
||||||
|
if ( !CheckNoDelay() || (tics == -1) ) return;
|
||||||
|
if ( tics > 0 ) tics--;
|
||||||
|
while ( !tics )
|
||||||
|
{
|
||||||
|
if ( !SetState(CurState.NextState) )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
XRG8 ACEGIKMOQSUW 1 Bright A_SetScale(scale.x*1.05);
|
||||||
|
Stop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Class QuadProj : Actor
|
Class QuadProj : Actor
|
||||||
{
|
{
|
||||||
double drift, accelrate, maxspeed;
|
double drift, accelrate, maxspeed;
|
||||||
|
|
@ -252,7 +294,7 @@ Class QuadProj : Actor
|
||||||
{
|
{
|
||||||
A_StopSound(CHAN_BODY);
|
A_StopSound(CHAN_BODY);
|
||||||
Scale *= 2.;
|
Scale *= 2.;
|
||||||
A_SprayDecal("ShockMarkBig",50);
|
A_SprayDecal("ShockMark",50);
|
||||||
Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch);
|
Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch);
|
||||||
if ( master && ((master.pos.z <= master.floorz) || !master.TestMobjZ()) )
|
if ( master && ((master.pos.z <= master.floorz) || !master.TestMobjZ()) )
|
||||||
{
|
{
|
||||||
|
|
@ -261,14 +303,16 @@ Class QuadProj : Actor
|
||||||
SWWMUtility.DoKnockback(master,x+(0,0,hdiff*.5),200000+special2);
|
SWWMUtility.DoKnockback(master,x+(0,0,hdiff*.5),200000+special2);
|
||||||
}
|
}
|
||||||
if ( tracer ) SWWMUtility.DoKnockback(tracer,-x+(0,0,.1),bAMBUSH?150000:500000);
|
if ( tracer ) SWWMUtility.DoKnockback(tracer,-x+(0,0,.1),bAMBUSH?150000:500000);
|
||||||
|
A_QuakeEx(3,3,3,20,0,500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollintensity:.6);
|
||||||
SWWMUtility.DoExplosion(self,0,80000+special2,240,80,DE_BLAST|DE_EXTRAZTHRUST);
|
SWWMUtility.DoExplosion(self,0,80000+special2,240,80,DE_BLAST|DE_EXTRAZTHRUST);
|
||||||
SWWMUtility.DoExplosion(self,100+special1,0,240,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer);
|
SWWMUtility.DoExplosion(self,100+special1,0,240,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer);
|
||||||
if ( SWWMUtility.DoExplosion(self,150+special1,0,200,80,DE_HOWL|DE_NOSPLASH,ignoreme:tracer) && bAMBUSH && target )
|
if ( SWWMUtility.DoExplosion(self,150+special1,0,200,80,DE_HOWL|DE_NOSPLASH,ignoreme:tracer) && bAMBUSH && target )
|
||||||
SWWMUtility.AchievementProgressInc("roast",1,target.player);
|
SWWMUtility.AchievementProgressInc("roast",1,target.player);
|
||||||
A_StartSound("quadshot/hit",CHAN_WEAPON,attenuation:.8);
|
A_StartSound("quadshot/hit",CHAN_WEAPON,attenuation:.6);
|
||||||
A_StartSound("quadshot/hit",CHAN_VOICE,attenuation:.6);
|
A_StartSound("quadshot/hit",CHAN_VOICE,attenuation:.4);
|
||||||
A_AlertMonsters(swwm_uncapalert?0:1500);
|
A_AlertMonsters(swwm_uncapalert?0:1500);
|
||||||
Spawn("QuadExplLight",pos);
|
Spawn("QuadExplLight",pos);
|
||||||
|
Spawn("QuadExplRing",pos);
|
||||||
int numpt = Random[Quadravol](12,18);
|
int numpt = Random[Quadravol](12,18);
|
||||||
for ( int i=0; i<numpt; i++ )
|
for ( int i=0; i<numpt; i++ )
|
||||||
{
|
{
|
||||||
|
|
@ -336,6 +380,200 @@ Class QuadProj : Actor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Class QuadExplArm : Actor
|
||||||
|
{
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
PROJECTILE;
|
||||||
|
+THRUACTORS;
|
||||||
|
+BOUNCEONWALLS;
|
||||||
|
+BOUNCEONFLOORS;
|
||||||
|
+BOUNCEONCEILINGS;
|
||||||
|
+CANBOUNCEWATER;
|
||||||
|
+NODAMAGETHRUST;
|
||||||
|
+FORCERADIUSDMG;
|
||||||
|
-NOGRAVITY;
|
||||||
|
Gravity .35;
|
||||||
|
BounceFactor 1.;
|
||||||
|
Radius 2;
|
||||||
|
Height 4;
|
||||||
|
}
|
||||||
|
override void PostBeginPlay()
|
||||||
|
{
|
||||||
|
Super.PostBeginPlay();
|
||||||
|
reactiontime = Random[ExploS](4,8);
|
||||||
|
double ang, pt;
|
||||||
|
ang = FRandom[ExploS](0,360);
|
||||||
|
pt = FRandom[ExploS](-90,90);
|
||||||
|
vel = SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](12.,32.);
|
||||||
|
}
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
TNT1 A 1
|
||||||
|
{
|
||||||
|
Spawn("QuadExplTrail",pos);
|
||||||
|
if ( !(ReactionTime%2) )
|
||||||
|
SWWMUtility.DoExplosion(self,8+reactiontime*3,0,40+5*reactiontime,20,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer);
|
||||||
|
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5);
|
||||||
|
let s = Spawn("SWWMHalfSmoke",pos);
|
||||||
|
s.vel = pvel+vel*.3;
|
||||||
|
s.special1 = Random[ExploS](1,3);
|
||||||
|
s.scale *= 3.;
|
||||||
|
s.alpha *= .1+.4*(ReactionTime/8.);
|
||||||
|
int numpt = Random[Quadravol](1,4);
|
||||||
|
for ( int i=0; i<numpt; i++ )
|
||||||
|
{
|
||||||
|
s = Spawn("QuadEmber",pos);
|
||||||
|
s.vel += vel*.4;
|
||||||
|
}
|
||||||
|
A_CountDown();
|
||||||
|
}
|
||||||
|
Wait;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Class QuadExplTrail : Actor
|
||||||
|
{
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
RenderStyle "Add";
|
||||||
|
+NOBLOCKMAP;
|
||||||
|
+NOGRAVITY;
|
||||||
|
+FORCEXYBILLBOARD;
|
||||||
|
+NOTELEPORT;
|
||||||
|
+NOINTERACTION;
|
||||||
|
Scale 1.2;
|
||||||
|
}
|
||||||
|
override void Tick()
|
||||||
|
{
|
||||||
|
if ( isFrozen() ) return;
|
||||||
|
if ( !CheckNoDelay() || (tics == -1) ) return;
|
||||||
|
if ( tics > 0 ) tics--;
|
||||||
|
while ( !tics )
|
||||||
|
{
|
||||||
|
if ( !SetState(CurState.NextState) )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
XEX0 ACEGIKMOQS 1 Bright A_SetScale(scale.x*1.03);
|
||||||
|
Stop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Class QuadExplRing2 : QuadExplRing
|
||||||
|
{
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
Scale 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
XRG8 ABCDEFGHIJKLMNOPQRSTUVWX 1 Bright A_SetScale(scale.x*1.03);
|
||||||
|
Stop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Class QuadProj2 : QuadProj
|
||||||
|
{
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
Scale .85;
|
||||||
|
Radius 8;
|
||||||
|
Height 8;
|
||||||
|
Speed 40;
|
||||||
|
QuadProj.Drift .25;
|
||||||
|
QuadProj.AccelRate 20;
|
||||||
|
QuadProj.MaxSpeed 80;
|
||||||
|
}
|
||||||
|
override void A_QuadTrail()
|
||||||
|
{
|
||||||
|
let s = Spawn("QuadTrail",pos);
|
||||||
|
s.scale *= .8;
|
||||||
|
s.vel = vel*.3;
|
||||||
|
s = Spawn("SWWMHalfSmoke",pos);
|
||||||
|
s.vel = (FRandom[Quadravol](-.4,.4),FRandom[Quadravol](-.4,.4),FRandom[Quadravol](-.4,.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
override void A_QuadExplode()
|
||||||
|
{
|
||||||
|
A_StopSound(CHAN_BODY);
|
||||||
|
Scale *= 2.4;
|
||||||
|
A_SprayDecal("ShockMarkBig",50);
|
||||||
|
Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch);
|
||||||
|
if ( master && ((master.pos.z <= master.floorz) || !master.TestMobjZ()) )
|
||||||
|
{
|
||||||
|
Vector3 rel = level.Vec3Diff(master.pos,pos);
|
||||||
|
double hdiff = 1.-2.*clamp((rel.z-4.)/master.height,0.,.5);
|
||||||
|
SWWMUtility.DoKnockback(master,x+(0,0,hdiff*.5),250000+special2);
|
||||||
|
}
|
||||||
|
if ( tracer ) SWWMUtility.DoKnockback(tracer,-x+(0,0,.1),bAMBUSH?160000:600000);
|
||||||
|
A_QuakeEx(5,5,5,25,0,900,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:400,rollintensity:.8);
|
||||||
|
SWWMUtility.DoExplosion(self,0,100000+special2,480,120,DE_BLAST|DE_EXTRAZTHRUST);
|
||||||
|
SWWMUtility.DoExplosion(self,200+special1,0,480,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer);
|
||||||
|
if ( SWWMUtility.DoExplosion(self,300+special1,0,400,120,DE_HOWL|DE_NOSPLASH,ignoreme:tracer) && bAMBUSH && target )
|
||||||
|
SWWMUtility.AchievementProgressInc("roast",1,target.player);
|
||||||
|
A_StartSound("quadshot/twohit",CHAN_WEAPON,attenuation:.5);
|
||||||
|
A_StartSound("quadshot/twohit",CHAN_VOICE,attenuation:.25);
|
||||||
|
A_AlertMonsters(swwm_uncapalert?0:2500);
|
||||||
|
Spawn("QuadExplLight2",pos);
|
||||||
|
Spawn("QuadExplRing2",pos);
|
||||||
|
int numpt = Random[Quadravol](20,30);
|
||||||
|
for ( int i=0; i<numpt; i++ )
|
||||||
|
{
|
||||||
|
Vector3 pvel = (FRandom[Quadravol](-1,1),FRandom[Quadravol](-1,1),FRandom[Quadravol](-1,1)).unit()*FRandom[Quadravol](2,12);
|
||||||
|
let s = Spawn("SWWMSmoke",pos);
|
||||||
|
s.vel = pvel;
|
||||||
|
s.special1 = Random[Quadravol](2,3);
|
||||||
|
s.scale *= 4.;
|
||||||
|
s.alpha *= .3;
|
||||||
|
}
|
||||||
|
numpt = Random[Quadravol](15,20);
|
||||||
|
for ( int i=0; i<numpt; i++ )
|
||||||
|
{
|
||||||
|
Vector3 pvel = (FRandom[Quadravol](-1,1),FRandom[Quadravol](-1,1),FRandom[Quadravol](-1,1)).unit()*FRandom[Quadravol](4,16);
|
||||||
|
let s = Spawn("SWWMSpark",pos);
|
||||||
|
s.vel = pvel;
|
||||||
|
}
|
||||||
|
numpt = Random[Quadravol](8,12);
|
||||||
|
for ( int i=0; i<numpt; i++ )
|
||||||
|
{
|
||||||
|
Vector3 pvel = (FRandom[Quadravol](-1,1),FRandom[Quadravol](-1,1),FRandom[Quadravol](-1,1)).unit()*FRandom[Quadravol](6,12);
|
||||||
|
let s = Spawn("SWWMChip",pos);
|
||||||
|
s.vel = pvel;
|
||||||
|
s.scale *= FRandom[Quadravol](0.9,1.8);
|
||||||
|
}
|
||||||
|
numpt = Random[Quadravol](12,16);
|
||||||
|
for ( int i=0; i<numpt; i++ )
|
||||||
|
{
|
||||||
|
let s = Spawn("QuadExplArm",pos);
|
||||||
|
s.target = target;
|
||||||
|
s.tracer = tracer;
|
||||||
|
}
|
||||||
|
if ( swwm_omnibust ) BusterWall.ProjectileBust(self,300,SWWMUtility.Vec3FromAngles(angle,pitch));
|
||||||
|
}
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Death:
|
||||||
|
TNT1 A 0 A_QuadExplode();
|
||||||
|
XEX0 ABCDEFGHIJKLMNOPQRS 1 Bright A_SetScale(scale.x*1.065);
|
||||||
|
Stop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Class OnFireLight : PointLightFlickerRandomAttenuated
|
Class OnFireLight : PointLightFlickerRandomAttenuated
|
||||||
{
|
{
|
||||||
OnFire of;
|
OnFire of;
|
||||||
|
|
|
||||||
|
|
@ -177,6 +177,7 @@ Class PunchImpact : Actor
|
||||||
{
|
{
|
||||||
Default
|
Default
|
||||||
{
|
{
|
||||||
|
Tag "WallCrack";
|
||||||
Radius 0.1;
|
Radius 0.1;
|
||||||
Height 0;
|
Height 0;
|
||||||
+NOGRAVITY;
|
+NOGRAVITY;
|
||||||
|
|
@ -189,7 +190,7 @@ Class PunchImpact : Actor
|
||||||
Super.PostBeginPlay();
|
Super.PostBeginPlay();
|
||||||
A_QuakeEx(2,2,2,12,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollIntensity:.3);
|
A_QuakeEx(2,2,2,12,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollIntensity:.3);
|
||||||
A_StartSound("demolitionist/punch",CHAN_VOICE,CHANF_DEFAULT,bAMBUSH?.6:1.);
|
A_StartSound("demolitionist/punch",CHAN_VOICE,CHANF_DEFAULT,bAMBUSH?.6:1.);
|
||||||
A_SprayDecal("WallCrack",-20);
|
A_SprayDecal(GetTag(),-20);
|
||||||
int numpt = Random[Ponch](5,10);
|
int numpt = Random[Ponch](5,10);
|
||||||
if ( bAMBUSH ) numpt /= 3;
|
if ( bAMBUSH ) numpt /= 3;
|
||||||
Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch);
|
Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch);
|
||||||
|
|
|
||||||
|
|
@ -390,7 +390,7 @@ extend Class SWWMWeapon
|
||||||
GiveInventory("ParryDamageChecker",1); // need this so parried projectiles deal extra damage
|
GiveInventory("ParryDamageChecker",1); // need this so parried projectiles deal extra damage
|
||||||
}
|
}
|
||||||
// multi-hit cone rather than the usual one-hit arc, more fun
|
// multi-hit cone rather than the usual one-hit arc, more fun
|
||||||
private action bool TryMelee( double spread, int dmg, String hitsound, double rangemul, double kickmul, int flags )
|
private action bool TryMelee( double spread, int dmg, String hitsound, double rangemul, double kickmul, int flags, Class<Actor> impactclass )
|
||||||
{
|
{
|
||||||
Vector3 x, y, z, dir;
|
Vector3 x, y, z, dir;
|
||||||
[x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
|
[x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
|
||||||
|
|
@ -446,9 +446,9 @@ extend Class SWWMWeapon
|
||||||
mt.hits[i].a.TraceBleed(newdmg,invoker);
|
mt.hits[i].a.TraceBleed(newdmg,invoker);
|
||||||
mt.hits[i].a.SpawnBlood(mt.hits[i].pos,atan2(mt.hits[i].dir.y,mt.hits[i].dir.x)+180,newdmg);
|
mt.hits[i].a.SpawnBlood(mt.hits[i].pos,atan2(mt.hits[i].dir.y,mt.hits[i].dir.x)+180,newdmg);
|
||||||
}
|
}
|
||||||
else
|
else if ( impactclass )
|
||||||
{
|
{
|
||||||
let p = Spawn(raging?"BigPunchImpact":"PunchImpact",mt.hits[i].pos);
|
let p = Spawn(raging?(Class<Actor>)("BigPunchImpact"):impactclass,mt.hits[i].pos);
|
||||||
p.angle = atan2(mt.hits[i].dir.y,mt.hits[i].dir.x);
|
p.angle = atan2(mt.hits[i].dir.y,mt.hits[i].dir.x);
|
||||||
}
|
}
|
||||||
if ( (flags&MELEE_HammerHit) && (mt.hits[i].a.Health <= mt.hits[i].a.GetGibHealth()) )
|
if ( (flags&MELEE_HammerHit) && (mt.hits[i].a.Health <= mt.hits[i].a.GetGibHealth()) )
|
||||||
|
|
@ -498,7 +498,7 @@ extend Class SWWMWeapon
|
||||||
A_BumpFOV(.96);
|
A_BumpFOV(.96);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
action bool A_Melee( int dmg = 40, String hitsound = "", double rangemul = 1., double spreadmul = 1., double kickmul = 1., int flags = 0 )
|
action bool A_Melee( int dmg = 40, String hitsound = "", double rangemul = 1., double spreadmul = 1., double kickmul = 1., int flags = 0, Class<Actor> impactclass = "PunchImpact" )
|
||||||
{
|
{
|
||||||
let raging = RagekitPower(FindInventory("RagekitPower"));
|
let raging = RagekitPower(FindInventory("RagekitPower"));
|
||||||
if ( flags&MELEE_NoRage ) raging = null;
|
if ( flags&MELEE_NoRage ) raging = null;
|
||||||
|
|
@ -535,7 +535,7 @@ extend Class SWWMWeapon
|
||||||
// check for shootables
|
// check for shootables
|
||||||
SWWMBulletTrail.DoTrail(self,origin,dir,DEFMELEERANGE*rangemul,0);
|
SWWMBulletTrail.DoTrail(self,origin,dir,DEFMELEERANGE*rangemul,0);
|
||||||
}
|
}
|
||||||
bool res = TryMelee((raging?.3:.2)*spreadmul,dmg,hitsound,rangemul,kickmul,flags);
|
bool res = TryMelee((raging?.3:.2)*spreadmul,dmg,hitsound,rangemul,kickmul,flags,impactclass);
|
||||||
if ( res && !(flags&MELEE_Rip) ) return res;
|
if ( res && !(flags&MELEE_Rip) ) return res;
|
||||||
// check for walls instead
|
// check for walls instead
|
||||||
FTranslatedLineTarget t;
|
FTranslatedLineTarget t;
|
||||||
|
|
@ -560,10 +560,13 @@ extend Class SWWMWeapon
|
||||||
if ( !d.LineSide ) HitNormal *= -1;
|
if ( !d.LineSide ) HitNormal *= -1;
|
||||||
if ( !(flags&MELEE_NoUse) ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation+HitNormal*4);
|
if ( !(flags&MELEE_NoUse) ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation+HitNormal*4);
|
||||||
}
|
}
|
||||||
let p = Spawn(raging?"BigPunchImpact":"PunchImpact",d.HitLocation+HitNormal*4);
|
if ( impactclass )
|
||||||
p.angle = atan2(HitNormal.y,HitNormal.x);
|
{
|
||||||
p.pitch = asin(-HitNormal.z);
|
let p = Spawn(raging?(Class<Actor>)("BigPunchImpact"):impactclass,d.HitLocation+HitNormal*4);
|
||||||
if ( d.HitType == TRACE_HitFloor ) p.CheckSplash(40);
|
p.angle = atan2(HitNormal.y,HitNormal.x);
|
||||||
|
p.pitch = asin(-HitNormal.z);
|
||||||
|
if ( d.HitType == TRACE_HitFloor ) p.CheckSplash(40);
|
||||||
|
}
|
||||||
if ( raging )
|
if ( raging )
|
||||||
{
|
{
|
||||||
let ps = Spawn("BigPunchSplash",d.HitLocation+HitNormal*4);
|
let ps = Spawn("BigPunchSplash",d.HitLocation+HitNormal*4);
|
||||||
|
|
|
||||||