The Quadravol is complete.

This commit is contained in:
Mari the Deer 2022-08-21 16:23:13 +02:00
commit e9f663c8ff
6 changed files with 447 additions and 25 deletions

View file

@ -1,3 +1,3 @@
[default]
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r354 \cu(Sun 21 Aug 12:44:40 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r354 \cu(2022-08-21 12:44:40)\c-";
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r356 \cu(Sun 21 Aug 16:23:32 CEST 2022)\c-";
SWWM_SHORTVER="\cw1.3pre r356 \cu(2022-08-21 16:23:32)\c-";

View file

@ -6,7 +6,7 @@ Weapon models:
- Puntzer Beta
- Puntzer Gamma
x Sheen HMG
½ Quadravol
x Quadravol
- Sparkster Rifle
- Mortal Rifle
- Ray-Khom

View file

@ -93,8 +93,5 @@ extend Class Quadravol
Screen.DrawTexture(BulletTex[0],false,bx-6,by-(10+i*8),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
if ( chambered ) Screen.DrawTexture(BulletTex[charged],false,bx-14,by-10,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
Screen.DrawText(ChargeFont,Font.CR_UNTRANSLATED,bx-14,by-20,String.Format("%d",chargelevel),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
// PLACEHOLDER
String str = "THIS WEAPON IS NOT YET FULLY IMPLEMENTED";
Screen.DrawText(NewSmallFont,Font.CR_RED,(Screen.GetWidth()-NewSmallFont.StringWidth(str)*CleanXFac_1)/2,Screen.GetHeight()-(swwm_hudmargin*hs+NewSmallFont.GetHeight()*CleanYFac_1),str,DTA_CleanNoMove_1,true);
}
}

View file

@ -109,10 +109,13 @@ Class Quadravol : SWWMWeapon
}
rings += 3;
}
if ( bMelee && fool ) SWWMUtility.AchievementProgressInc("roast",1,player);
if ( (bMelee && fool) || (idx>=4) ) A_StartSound("quadshot/pointblank",CHAN_WEAPON,CHANF_OVERLAP,.6+idx*.1,.4-idx*.05,1.2-idx*.05);
Vector3 x2, y2, z2;
[x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll);
double a, s;
Actor p;
bool bExtra = ((idx>=4)&&invoker.chambered&&!invoker.charged);
switch ( idx )
{
default:
@ -121,7 +124,7 @@ Class Quadravol : SWWMWeapon
A_SWWMFlash();
SWWMHandler.DoFlash(self,Color(64,255,192,64),5);
A_AlertMonsters(swwm_uncapalert?0:2000);
SWWMUtility.DoKnockback(self,-x,1500.);
SWWMUtility.DoKnockback(self,-x,20000.);
p = Spawn("QuadProj",origin);
p.target = self;
p.angle = atan2(x2.y,x2.x);
@ -135,7 +138,6 @@ Class Quadravol : SWWMWeapon
p.special2 += bMelee?120000:40000;
p.bAMBUSH = bMelee;
p.ExplodeMissile(null,null);
self.DamageMobj(invoker,self,bMelee?20:40,'Fire',DMG_EXPLOSION);
}
break;
case 1:
@ -144,7 +146,7 @@ Class Quadravol : SWWMWeapon
A_SWWMFlash();
SWWMHandler.DoFlash(self,Color(64,255,192,64),7);
A_AlertMonsters(swwm_uncapalert?0:3000);
SWWMUtility.DoKnockback(self,-x,2500.);
SWWMUtility.DoKnockback(self,-x,40000.);
p = Spawn("QuadProj2",origin);
p.target = self;
p.angle = atan2(x2.y,x2.x);
@ -158,20 +160,95 @@ Class Quadravol : SWWMWeapon
p.special2 = bMelee?150000:60000;
p.bAMBUSH = bMelee;
p.ExplodeMissile(null,null);
self.DamageMobj(invoker,self,bMelee?20:40,'Fire',DMG_EXPLOSION);
}
break;
case 2:
A_Log("\cg// TODO - Fire Level 3\c-");
A_QuakeEx(6,6,6,25,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.8);
A_BumpFOV(.96);
A_SWWMFlash();
SWWMHandler.DoFlash(self,Color(64,255,192,64),8);
A_AlertMonsters(swwm_uncapalert?0:4000);
SWWMUtility.DoKnockback(self,-x,80000.);
p = Spawn("QuadProj3",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?200:100;
p.special2 = bMelee?180000:80000;
p.bAMBUSH = bMelee;
p.ExplodeMissile(null,null);
}
break;
case 3:
A_Log("\cg// TODO - Fire Level 4\c-");
A_QuakeEx(7,7,7,30,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.2);
A_BumpFOV(.95);
A_SWWMFlash();
SWWMHandler.DoFlash(self,Color(64,255,192,64),12);
A_AlertMonsters(swwm_uncapalert?0:6000);
SWWMUtility.DoKnockback(self,-x,150000.);
if ( pointblank || bMelee )
{
p = Spawn("QuadProj3",origin);
p.target = self;
p.angle = atan2(x2.y,x2.x);
p.pitch = asin(-x2.z);
p.vel = x2*p.speed;
p.tracer = self;
p.master = fool;
p.special1 = bMelee?300:200;
p.special2 = bMelee?200000:100000;
p.bAMBUSH = bMelee;
p.ExplodeMissile(null,null);
}
else for ( int i=0; i<20; i++ )
{
s = FRandom[Quadravol](0,.2);
a = (i%4)*90 + FRandom[Quadravol](-50,50)*s;
dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s);
p = Spawn("QuadProjSub2",origin);
p.target = self;
p.angle = atan2(dir.y,dir.x);
p.pitch = asin(-dir.z);
p.vel = dir*p.speed*FRandom[Quadravol](1.,1.5);
}
break;
case 4:
if ( !invoker.charged ) A_Log("\cg// TODO - Fire Level 5+\c-");
else A_Log("\cg// TODO - Fire Level 5\c-");
A_QuakeEx(8+bExtra,8+bExtra,8+bExtra,40,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.5+bExtra*0.25);
A_BumpFOV(.94-bExtra*.1);
A_SWWMFlash();
SWWMHandler.DoFlash(self,Color(64,255,192,64),15+bExtra*3);
A_AlertMonsters(swwm_uncapalert?0:8000);
if ( bMelee ) SWWMUtility.DoKnockback(self,-x,600000.+bExtra*100000.);
else if ( pointblank ) SWWMUtility.DoKnockback(self,-x,1500000.+bExtra*500000.);
else SWWMUtility.DoKnockback(self,-x,400000.+bExtra*100000.);
if ( fool )
{
SWWMUtility.DoKnockback(fool,x,1500000.+bExtra*500000.);
if ( fool.bCANBLAST && !fool.bDONTBLAST ) fool.bBLASTED = true;
}
int numpt = bExtra?15:10;
for ( int i=0; i<numpt; i++ )
{
s = FRandom[Quadravol](0,bExtra?.5:.4);
a = (i%4)*90 + FRandom[Quadravol](-50,50)*s;
dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s);
p = Spawn("QuadExplArm2",origin);
p.target = self;
p.tracer = self;
p.angle = atan2(dir.y,dir.x);
p.pitch = asin(-dir.z);
p.special1 = bExtra*8;
p.special2 = bExtra*25;
}
Spawn("QuadExplLight3",origin);
break;
}
if ( pointblank || bMelee ) self.DamageMobj(invoker,self,bMelee?(20+idx*5):(40+idx*10),'Fire',DMG_EXPLOSION);
for ( int i=0; i<(4+idx); i++ )
{
let s = Spawn("SWWMSmoke",origin);

View file

@ -31,6 +31,15 @@ Class QuadExplLight2 : PaletteLight
ReactionTime 25;
}
}
Class QuadExplLight3 : PaletteLight
{
Default
{
Tag "QuadExpl";
Args 0,0,0,300;
ReactionTime 30;
}
}
Class QuadFlare : Actor
{
@ -306,8 +315,7 @@ Class QuadProj : Actor
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,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 )
SWWMUtility.AchievementProgressInc("roast",1,target.player);
SWWMUtility.DoExplosion(self,150+special1,0,200,80,DE_HOWL|DE_NOSPLASH,ignoreme:tracer);
A_StartSound("quadshot/hit",CHAN_WEAPON,attenuation:.6);
A_StartSound("quadshot/hit",CHAN_VOICE,attenuation:.4);
A_AlertMonsters(swwm_uncapalert?0:1500);
@ -401,11 +409,12 @@ Class QuadExplArm : Actor
override void PostBeginPlay()
{
Super.PostBeginPlay();
reactiontime = Random[ExploS](4,8);
reactiontime = Random[ExploS](4,8)+special1;
double ang, pt;
ang = FRandom[ExploS](0,360);
pt = FRandom[ExploS](-90,90);
vel = SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](12.,32.);
speed = FRandom[ExploS](12.,32.);
vel = SWWMUtility.Vec3FromAngles(ang,pt)*speed;
}
States
{
@ -420,7 +429,7 @@ Class QuadExplArm : Actor
s.vel = pvel+vel*.3;
s.special1 = Random[ExploS](1,3);
s.scale *= 3.;
s.alpha *= .1+.4*(ReactionTime/8.);
s.alpha *= .1+.4*(ReactionTime/(8.+special1));
int numpt = Random[Quadravol](1,4);
for ( int i=0; i<numpt; i++ )
{
@ -433,6 +442,45 @@ Class QuadExplArm : Actor
}
}
Class QuadExplArm2 : QuadExplArm
{
override void PostBeginPlay()
{
Actor.PostBeginPlay();
reactiontime = Random[ExploS](4,8)+special1;
speed = FRandom[ExploS](40.,60.)+special2;
vel = SWWMUtility.Vec3FromAngles(angle,pitch)*speed;
}
States
{
Spawn:
TNT1 A 1
{
Spawn("QuadExplTrail2",pos);
if ( !(ReactionTime%2) )
{
SWWMUtility.DoExplosion(self,0,60000+reactiontime*5000,120+6*reactiontime,50,DE_BLAST|DE_EXTRAZTHRUST,ignoreme:tracer);
SWWMUtility.DoExplosion(self,40+reactiontime*5,0,120+6*reactiontime,50,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer);
SWWMUtility.DoExplosion(self,60+reactiontime*10,0,100+4*reactiontime,50,DE_HOWL|DE_NOSPLASH,ignoreme:tracer);
}
Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](2,5);
let s = Spawn("SWWMHalfSmoke",pos);
s.vel = pvel+vel*.6;
s.special1 = Random[ExploS](2,4);
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;
}
A_CountDown();
}
Wait;
}
}
Class QuadExplTrail : Actor
{
Default
@ -463,18 +511,27 @@ Class QuadExplTrail : Actor
Stop;
}
}
Class QuadExplTrail2 : QuadExplTrail
{
States
{
Spawn:
XEX0 ABCDEFGHIJKLMNOPQRS 1 Bright A_SetScale(scale.x*1.02);
Stop;
}
}
Class QuadExplRing2 : QuadExplRing
{
Default
{
Scale 1.6;
Scale 2.;
}
States
{
Spawn:
XRG8 ABCDEFGHIJKLMNOPQRSTUVWX 1 Bright A_SetScale(scale.x*1.03);
XRG8 ABCDEFGHIJKLMNOPQRSTUVWX 1 Bright A_SetScale(scale.x*1.04);
Stop;
}
}
@ -523,8 +580,7 @@ Class QuadProj2 : QuadProj
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);
SWWMUtility.DoExplosion(self,300+special1,0,400,120,DE_HOWL|DE_NOSPLASH,ignoreme:tracer);
A_StartSound("quadshot/twohit",CHAN_WEAPON,attenuation:.5);
A_StartSound("quadshot/twohit",CHAN_VOICE,attenuation:.25);
A_AlertMonsters(swwm_uncapalert?0:2500);
@ -574,6 +630,298 @@ Class QuadProj2 : QuadProj
}
}
Class QuadProjSub : QuadProj
{
Default
{
Scale .3;
Radius 2;
Height 2;
Speed 30;
QuadProj.Drift 10.;
QuadProj.AccelRate 100;
QuadProj.MaxSpeed 150;
}
override void A_QuadTrail()
{
let s = Spawn("QuadTrail",pos);
s.scale *= .5;
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 *= .2;
int numpt = Random[Quadravol](1,4);
for ( int i=0; i<numpt; i++ )
{
s = Spawn("QuadEmber",pos);
s.vel += vel*.4;
}
}
override void A_QuadExplode()
{
A_StopSound(CHAN_BODY);
Scale *= 1.5;
A_SprayDecal("ShockMark",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),100000);
}
A_QuakeEx(2,2,2,10,0,300,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:100,rollintensity:.3);
SWWMUtility.DoExplosion(self,0,40000,120,40,DE_BLAST|DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,50,0,120,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer);
SWWMUtility.DoExplosion(self,100,0,100,40,DE_HOWL|DE_NOSPLASH,ignoreme:tracer);
A_StartSound("quadshot/hit",CHAN_WEAPON,attenuation:.8,pitch:1.2);
A_AlertMonsters(swwm_uncapalert?0:800);
Spawn("QuadExplLight",pos);
int numpt = Random[Quadravol](6,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](2,8);
let s = Spawn("SWWMSmoke",pos);
s.vel = pvel;
s.special1 = Random[Quadravol](2,3);
s.scale *= 4.;
s.alpha *= .3;
}
numpt = Random[Quadravol](5,10);
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](2,4);
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);
}
if ( swwm_omnibust ) BusterWall.ProjectileBust(self,100,SWWMUtility.Vec3FromAngles(angle,pitch));
}
States
{
Death:
TNT1 A 0 A_QuadExplode();
XEX0 ACEGIKMOQS 1 Bright A_SetScale(scale.x*1.1);
Stop;
}
}
Class QuadProjSub2 : QuadProj
{
Default
{
Scale .3;
Radius 4;
Height 4;
Speed 30;
QuadProj.Drift 3.;
QuadProj.AccelRate 80;
QuadProj.MaxSpeed 120;
}
override void A_QuadTrail()
{
let s = Spawn("QuadTrail",pos);
s.scale *= .3;
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 *= .2;
int numpt = Random[Quadravol](1,4);
for ( int i=0; i<numpt; i++ )
{
s = Spawn("QuadEmber",pos);
s.vel += vel*.4;
}
}
override void A_QuadExplode()
{
A_StopSound(CHAN_BODY);
Scale *= 1.5;
A_SprayDecal("ShockMark",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),100000);
}
A_QuakeEx(2,2,2,10,0,200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:80,rollintensity:.2);
SWWMUtility.DoExplosion(self,0,40000,120,40,DE_BLAST|DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,100,0,120,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer);
SWWMUtility.DoExplosion(self,120,0,100,40,DE_HOWL|DE_NOSPLASH,ignoreme:tracer);
A_StartSound("quadshot/hit",CHAN_WEAPON,attenuation:.6,pitch:1.1);
A_AlertMonsters(swwm_uncapalert?0:600);
Spawn("QuadExplLight",pos);
int numpt = Random[Quadravol](6,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](2,8);
let s = Spawn("SWWMSmoke",pos);
s.vel = pvel;
s.special1 = Random[Quadravol](2,3);
s.scale *= 4.;
s.alpha *= .3;
}
numpt = Random[Quadravol](5,10);
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](2,4);
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);
}
if ( swwm_omnibust ) BusterWall.ProjectileBust(self,120,SWWMUtility.Vec3FromAngles(angle,pitch));
}
States
{
Death:
TNT1 A 0 A_QuadExplode();
XEX0 ACEGIKMOQS 1 Bright A_SetScale(scale.x*1.1);
Stop;
}
}
Class QuadExplRing3 : QuadExplRing
{
Default
{
Scale 2.5;
}
States
{
Spawn:
XRG8 ABCDEFGHIJKLMNOPQRSTUVWX 1 Bright A_SetScale(scale.x*1.05);
Stop;
}
}
Class QuadProj3 : QuadProj
{
Default
{
Scale 1.;
Radius 10;
Height 10;
Speed 20;
QuadProj.Drift .8;
QuadProj.AccelRate 40;
QuadProj.MaxSpeed 60;
}
override void A_QuadTrail()
{
let s = Spawn("QuadTrail",pos);
s.scale *= 1.2;
s.vel = vel*.4;
s = Spawn("SWWMHalfSmoke",pos);
s.vel = (FRandom[Quadravol](-.4,.4),FRandom[Quadravol](-.4,.4),FRandom[Quadravol](-.4,.4));
s.vel += vel*.6;
s.alpha *= .8;
s.special1 = 1;
int numpt = Random[Quadravol](5,30);
for ( int i=0; i<numpt; i++ )
{
s = Spawn("QuadEmber",pos);
s.vel += vel*.6;
}
}
override void A_QuadExplode()
{
A_StopSound(CHAN_BODY);
Scale *= 3.;
A_SprayDecal("ShockMarkHuge",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),300000+special2);
}
if ( tracer ) SWWMUtility.DoKnockback(tracer,-x+(0,0,.1),bAMBUSH?180000:800000);
A_QuakeEx(7,7,7,35,0,1200,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:600,rollintensity:1.2);
SWWMUtility.DoExplosion(self,0,150000+special2,700,150,DE_BLAST|DE_EXTRAZTHRUST);
SWWMUtility.DoExplosion(self,400+special1,0,700,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer);
SWWMUtility.DoExplosion(self,500+special1,0,600,150,DE_HOWL|DE_NOSPLASH,ignoreme:tracer);
A_StartSound("quadshot/twohit",CHAN_WEAPON,attenuation:.4,pitch:.9);
A_StartSound("quadshot/twohit",CHAN_VOICE,attenuation:.3,pitch:.8);
A_StartSound("quadshot/extrahit",CHAN_ITEM,attenuation:.2,pitch:1.1);
A_AlertMonsters(swwm_uncapalert?0:3500);
Spawn("QuadExplLight3",pos);
Spawn("QuadExplRing3",pos);
int numpt = Random[Quadravol](25,35);
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](20,25);
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](10,15);
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](16,20);
for ( int i=0; i<numpt; i++ )
{
let s = Spawn("QuadExplArm",pos);
s.target = target;
s.tracer = tracer;
s.special1 = 10;
}
for ( int j=-90; j<=90; j+=30 ) for ( int i=0; i<360; i+=60 )
{
double ang = i+FRandom[ExploS](-30,30);
double pt = j+FRandom[ExploS](-15,15);
// skip if directly hitting a wall
if ( LineTrace(ang,40,pt,TRF_THRUACTORS|TRF_THRUHITSCAN) ) continue;
let s = Spawn("QuadProjSub",pos);
s.target = target;
s.tracer = tracer;
s.angle = ang;
s.pitch = pt;
s.vel = SWWMUtility.Vec3FromAngles(ang,pt)*s.speed*FRandom[ExploS](.8,1.2);
s.bHITOWNER = !tracer;
if ( (j == -90) || (j == 90) ) break; // only one per pole
}
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.08);
Stop;
}
}
Class OnFireLight : PointLightFlickerRandomAttenuated
{
OnFire of;
@ -615,7 +963,7 @@ Class OnFire : Thinker
if ( lite ) lite.Destroy();
amount -= int(victim.waterlevel**2);
}
if ( victim is 'Demolitionist' ) amount = min(amount-2,200); // Demo's body puts out fire faster
if ( victim is 'Demolitionist' ) amount = min(amount-1,200); // Demo's body puts out fire faster
if ( victim.Health <= 0 ) amount = min(amount,100);
if ( !(level.maptime%3) )
amount--;

View file

@ -173,7 +173,7 @@ Class SWWMStats : SWWMStaticThinker
else if ( (inflictor is 'EvisceratorChunk') || (inflictor is 'EvisceratorProj') ) which = 'Eviscerator';
else if ( inflictor is 'SheenTrail' ) which = 'HeavyMahSheenGun';
else if ( (inflictor is 'HellblazerMissile') || (inflictor is 'HellblazerRavagerArm') || (inflictor is 'HellblazerWarheadArm') ) which = 'Hellblazer';
else if ( (inflictor is 'QuadProj') || ((inflictor is 'Demolitionist') && (DamageType == 'Fire')) ) which = 'Quadravol'; // second one is a hack for fire effects
else if ( (inflictor is 'QuadProj') || (inflictor is 'QuadExplArm') || ((inflictor is 'Demolitionist') && (DamageType == 'Fire')) ) which = 'Quadravol'; // last one is a hack for fire effects
else if ( (inflictor is 'BigBiospark') || (inflictor is 'BiosparkBall') || (inflictor is 'BiosparkBeamImpact') || (inflictor is 'BiosparkComboImpact') || (inflictor is 'BiosparkComboImpactSub') || (inflictor is 'BiosparkBeam') || (inflictor is 'BiosparkArc') || (inflictor is 'BiosparkCore') ) which = 'Sparkster';
else if ( (inflictor is 'SilverAirRip') || (inflictor is 'SilverAirRip2') || (inflictor is 'SilverImpact') || (inflictor is 'FatChodeImpact') || (inflictor is 'FatChodeExplosionArm') ) which = 'SilverBullet';
else if ( (inflictor is 'CandyBeam') || (inflictor is 'CandyPop') || (inflictor is 'CandyMagArm') || (inflictor is 'CandyGunProj') || (inflictor is 'CandyMagProj') || (inflictor is 'CandyBulletImpact') ) which = 'CandyGun';