Use it sparingly in places where it should have been needed (Hellblazer and Biospark pre/post fire, Hammer alt charge, MR overpressure charge). Also, replace all instances of A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH) with it, since that was basically the same thing but with extra steps (and with the side effect of potentially resetting psprite offsets).
611 lines
16 KiB
Text
611 lines
16 KiB
Text
// Decade Mechanics Model S-5 Biospark Carbine aka "Legacy Sparkster" (from UnSX series, also featured in SWWM series)
|
|
// Slot 7, replaces Plasma Rifle, Hellstaff, Arc of Death
|
|
|
|
Class Sparkster : SWWMWeapon
|
|
{
|
|
int clipcount;
|
|
bool doublestacc;
|
|
bool nomag;
|
|
|
|
Property ClipCount : clipcount;
|
|
|
|
transient int failtime;
|
|
|
|
override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount )
|
|
{
|
|
if ( sv_infiniteammo || Owner.FindInventory('PowerInfiniteAmmo',true) ) return true;
|
|
if ( (fireMode == PrimaryFire) || (fireMode == AltFire) ) return ((clipcount > 0) || (Ammo1.Amount > 0));
|
|
return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount);
|
|
}
|
|
|
|
override bool ReportHUDAmmo()
|
|
{
|
|
if ( clipcount > 0 ) return true;
|
|
return Super.ReportHUDAmmo();
|
|
}
|
|
|
|
override Vector3 GetTraceOffset( int index )
|
|
{
|
|
return (10.,4.5,-5.);
|
|
}
|
|
|
|
action void A_FireSpark( int mode )
|
|
{
|
|
int scnt = invoker.clipcount%4;
|
|
if ( mode == 2 )
|
|
{
|
|
if ( invoker.clipcount > 4 ) invoker.clipcount = 4;
|
|
else invoker.clipcount = 0;
|
|
}
|
|
else invoker.clipcount = max(0,invoker.clipcount-1);
|
|
Vector3 dir;
|
|
Vector3 x = SWWMUtility.GetPlayerViewDir(self);
|
|
Vector3 origin = SWWMUtility.GetFireOffset(self,10,4.5,-5);
|
|
let [x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self);
|
|
double a, s;
|
|
Actor p;
|
|
switch ( mode )
|
|
{
|
|
case 0:
|
|
// spark
|
|
A_StartSound("biospark/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.7);
|
|
A_QuakeEx(2.,2.,2.,5,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2);
|
|
A_BumpFOV(.96);
|
|
A_BumpView(-.5);
|
|
A_SWWMFlash();
|
|
SWWMHandler.DoFlash(self,Color(64,192,255,96),3);
|
|
A_AlertMonsters(swwm_uncapalert?0:5000);
|
|
A_PlayerFire();
|
|
a = FRandom[Spread](0,360);
|
|
s = FRandom[Spread](0,.007);
|
|
dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s);
|
|
p = Spawn("BiosparkBall",origin);
|
|
p.target = self;
|
|
p.angle = atan2(dir.y,dir.x);
|
|
p.pitch = asin(-dir.z);
|
|
p.vel = dir*p.speed;
|
|
if ( invoker.doublestacc ) p.bMISSILEMORE = true;
|
|
break;
|
|
case 1:
|
|
// beam
|
|
A_StartSound("biospark/altfire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.8);
|
|
A_QuakeEx(3.,3.,3.,5,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3);
|
|
A_BumpFOV(.95);
|
|
A_BumpView(-.6);
|
|
A_SWWMFlash();
|
|
SWWMHandler.DoFlash(self,Color(64,192,255,96),3);
|
|
A_AlertMonsters(swwm_uncapalert?0:4000);
|
|
A_PlayerFire();
|
|
a = FRandom[Spread](0,360);
|
|
s = FRandom[Spread](0,.003);
|
|
dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s);
|
|
p = Spawn("BiosparkBeam",origin);
|
|
p.target = self;
|
|
p.angle = atan2(dir.y,dir.x);
|
|
p.pitch = asin(-dir.z);
|
|
p.frame = 0;
|
|
if ( invoker.doublestacc ) p.bMISSILEMORE = true;
|
|
break;
|
|
case 2:
|
|
// big spark
|
|
A_StartSound("biospark/thirdfire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:1.5);
|
|
A_QuakeEx(5.,5.,5.,10,0,8,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.6);
|
|
A_BumpFOV(.94);
|
|
A_BumpView(-.8);
|
|
A_AlertMonsters(swwm_uncapalert?0:1200);
|
|
A_PlayerFire();
|
|
SWWMUtility.DoKnockback(self,-x,2500.);
|
|
a = FRandom[Spread](0,360);
|
|
s = FRandom[Spread](0,.012);
|
|
dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s);
|
|
p = Spawn("BiosparkCore",origin);
|
|
p.target = self;
|
|
p.angle = atan2(dir.y,dir.x);
|
|
p.pitch = asin(-dir.z);
|
|
p.vel = dir*p.speed;
|
|
p.vel.z += 3.5;
|
|
p.special1 = scnt;
|
|
if ( invoker.doublestacc )
|
|
{
|
|
p.bMISSILEMORE = true;
|
|
p.ReactionTime -= 10;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
action void A_DropMag( bool stacc = false )
|
|
{
|
|
if ( swwm_nomagdrop ) return;
|
|
let [x, y, z] = SWWMUtility.GetPlayerAxes(self);
|
|
Vector3 origin = SWWMUtility.GetFireOffset(self,10,-2,-10);
|
|
let c = Spawn("SparksterMag",origin);
|
|
c.angle = angle;
|
|
c.pitch = pitch;
|
|
c.vel = x*FRandom[Junk](-.5,.5)+y*FRandom[Junk](-1.2,.3)-(0,0,FRandom[Junk](2,3));
|
|
c.vel += vel*.5;
|
|
if ( !stacc ) return;
|
|
origin = SWWMUtility.GetFireOffset(self,8,-2,-12);
|
|
c = Spawn("SparksterMag",origin);
|
|
c.angle = angle;
|
|
c.pitch = pitch;
|
|
c.vel = x*FRandom[Junk](-.5,.5)+y*FRandom[Junk](-1.2,.3)-(0,0,FRandom[Junk](2,3));
|
|
c.vel += vel*.5;
|
|
}
|
|
|
|
override void Travelled()
|
|
{
|
|
Super.Travelled();
|
|
if ( Owner.player && (Owner.player.Readyweapon == self) )
|
|
{
|
|
Owner.A_StartSound("biospark/idle",CHAN_WEAPONEXTRA,CHANF_LOOP,doublestacc?.6:.4,4.);
|
|
if ( doublestacc ) Owner.A_StartSound("biospark/idle2",CHAN_WEAPONEXTRA2,CHANF_LOOP,.2,4.);
|
|
}
|
|
}
|
|
|
|
action void A_FailZoom()
|
|
{
|
|
invoker.failtime = gametic+48;
|
|
A_StartSound("biospark/fail",CHAN_WEAPON,CHANF_OVERLAP);
|
|
}
|
|
|
|
action void A_UpdatePickup()
|
|
{
|
|
frame = invoker.doublestacc;
|
|
}
|
|
|
|
override void MarkPrecacheSounds()
|
|
{
|
|
Super.MarkPrecacheSounds();
|
|
MarkSound("biospark/select");
|
|
MarkSound("biospark/deselect");
|
|
MarkSound("biospark/fire1");
|
|
MarkSound("biospark/fire2");
|
|
MarkSound("biospark/fire3");
|
|
MarkSound("biospark/altfire1");
|
|
MarkSound("biospark/altfire2");
|
|
MarkSound("biospark/altfire3");
|
|
MarkSound("biospark/thirdfire");
|
|
MarkSound("biospark/meleestart");
|
|
MarkSound("biospark/meleeend");
|
|
MarkSound("biospark/idle");
|
|
MarkSound("biospark/idle2");
|
|
MarkSound("biospark/magout");
|
|
MarkSound("biospark/magin");
|
|
MarkSound("biospark/spark");
|
|
MarkSound("biospark/hit1");
|
|
MarkSound("biospark/hit2");
|
|
MarkSound("biospark/hit3");
|
|
MarkSound("biospark/beamhit1");
|
|
MarkSound("biospark/beamhit2");
|
|
MarkSound("biospark/deploy1");
|
|
MarkSound("biospark/deploy2");
|
|
MarkSound("biospark/deploy3");
|
|
MarkSound("biospark/bighit1");
|
|
MarkSound("biospark/bighit2");
|
|
MarkSound("biospark/bigspark");
|
|
MarkSound("biospark/arc1");
|
|
MarkSound("biospark/arc2");
|
|
MarkSound("biospark/arc3");
|
|
MarkSound("biospark/arc4");
|
|
MarkSound("biospark/bigarc1");
|
|
MarkSound("biospark/bigarc2");
|
|
MarkSound("biospark/bigarc3");
|
|
MarkSound("biospark/bigarc4");
|
|
MarkSound("biospark/hugearc1");
|
|
MarkSound("biospark/hugearc2");
|
|
MarkSound("biospark/hugearc3");
|
|
MarkSound("biospark/zap1");
|
|
MarkSound("biospark/zap2");
|
|
MarkSound("biospark/zap3");
|
|
MarkSound("biospark/zap4");
|
|
MarkSound("biospark/zap5");
|
|
MarkSound("biospark/zap6");
|
|
MarkSound("biospark/prefire");
|
|
MarkSound("biospark/prethird");
|
|
MarkSound("biospark/hiss");
|
|
MarkSound("biospark/fail");
|
|
MarkSound("biospark/checkout");
|
|
}
|
|
|
|
Default
|
|
{
|
|
Tag "$T_SPARKSTER";
|
|
Inventory.Icon "graphics/HUD/Icons/W_Sparkster.png";
|
|
Inventory.PickupMessage "$I_SPARKSTER";
|
|
Obituary "$O_SPARKSTER";
|
|
SWWMWeapon.Tooltip "$TT_SPARKSTER";
|
|
SWWMWeapon.GetLine "getsparkster";
|
|
Weapon.SlotNumber 7;
|
|
Weapon.UpSound "biospark/select";
|
|
Weapon.SelectionOrder 600;
|
|
Stamina 200000;
|
|
Weapon.AmmoType1 "SparkUnit";
|
|
Weapon.AmmoGive1 1;
|
|
SWWMWeapon.DropAmmoType "SWWMCellAmmoSmall";
|
|
Sparkster.ClipCount 4;
|
|
+SWWMWEAPON.NOFIRSTGIVE;
|
|
+WEAPON.EXPLOSIVE;
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
XZW1 A -1 NoDelay A_UpdatePickup();
|
|
Stop;
|
|
Select:
|
|
XZW2 G 2
|
|
{
|
|
invoker.nomag = false;
|
|
A_FullRaise();
|
|
A_StartSound("biospark/idle",CHAN_WEAPONEXTRA,CHANF_LOOP,.4,4.);
|
|
return A_JumpIf(invoker.doublestacc,"DoubleSelect");
|
|
}
|
|
XZW2 HIJKLM 2;
|
|
Goto Ready;
|
|
DoubleSelect:
|
|
XZW6 X 2
|
|
{
|
|
A_SoundVolume(CHAN_WEAPONEXTRA,.6);
|
|
A_StartSound("biospark/idle2",CHAN_WEAPONEXTRA2,CHANF_LOOP,.2,4.);
|
|
}
|
|
XZW6 YZ 2;
|
|
XZW7 ABCD 2;
|
|
Goto DoubleReady;
|
|
Deselect:
|
|
XZW2 A 2
|
|
{
|
|
A_StartSound("biospark/deselect",CHAN_WEAPON,CHANF_OVERLAP);
|
|
return A_JumpIf(invoker.doublestacc,"DoubleDeselect");
|
|
}
|
|
XZW2 BCDEF 2;
|
|
XZW2 G -1
|
|
{
|
|
A_StopSound(CHAN_WEAPONEXTRA);
|
|
A_FullLower();
|
|
}
|
|
Stop;
|
|
DoubleDeselect:
|
|
XZW5 Z 2;
|
|
XZW6 STUVW 2;
|
|
XZW6 X -1
|
|
{
|
|
A_StopSound(CHAN_WEAPONEXTRA);
|
|
A_StopSound(CHAN_WEAPONEXTRA2);
|
|
A_FullLower();
|
|
}
|
|
Stop;
|
|
Ready:
|
|
XZW2 A 1
|
|
{
|
|
A_WeaponReady(WRF_ALLOWZOOM|WRF_ALLOWUSER1|WRF_ALLOWRELOAD);
|
|
if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK|BT_ZOOM) )
|
|
invoker.CheckAmmo(EitherFire,true);
|
|
}
|
|
Wait;
|
|
DoubleReady:
|
|
XZW5 Z 1
|
|
{
|
|
A_WeaponReady(WRF_ALLOWZOOM|WRF_ALLOWUSER1|WRF_ALLOWRELOAD);
|
|
if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK|BT_ZOOM) )
|
|
invoker.CheckAmmo(EitherFire,true);
|
|
}
|
|
Wait;
|
|
Fire:
|
|
XZW2 A 0 A_JumpIf(invoker.ClipCount<=0,"Reload");
|
|
XZW2 A 1
|
|
{
|
|
A_StartSound("biospark/prefire",CHAN_WEAPON,CHANF_OVERLAP);
|
|
return A_JumpIf(invoker.doublestacc,"DoubleFire");
|
|
}
|
|
XZW4 Y 12 A_CanBob();
|
|
XZW4 Y 1 A_FireSpark(0);
|
|
XZW2 NOPQ 2;
|
|
Goto PreVent;
|
|
DoubleFire:
|
|
XZW5 Z 1;
|
|
XZW8 L 12 A_CanBob();
|
|
XZW8 L 1 A_FireSpark(0);
|
|
XZW7 EFGH 2;
|
|
Goto DoublePreVent;
|
|
AltFire:
|
|
XZW2 A 0 A_JumpIf(invoker.ClipCount<=0,"Reload");
|
|
XZW2 A 1
|
|
{
|
|
A_StartSound("biospark/prefire",CHAN_WEAPON,CHANF_OVERLAP);
|
|
return A_JumpIf(invoker.doublestacc,"DoubleAltFire");
|
|
}
|
|
XZW4 Z 12 A_CanBob();
|
|
XZW4 Z 1 A_FireSpark(1);
|
|
XZW2 RSTU 2;
|
|
Goto PreVent;
|
|
DoubleAltFire:
|
|
XZW5 Z 1;
|
|
XZW8 M 12 A_CanBob();
|
|
XZW8 M 1 A_FireSpark(1);
|
|
XZW7 IJKL 2;
|
|
Goto DoublePreVent;
|
|
PreVent:
|
|
XZW2 AAAAAAAA 1
|
|
{
|
|
A_CanBob();
|
|
if ( invoker.ClipCount > 0 )
|
|
{
|
|
if ( player.cmd.buttons&BT_ATTACK )
|
|
return ResolveState("Refire");
|
|
if ( player.cmd.buttons&BT_ALTATTACK )
|
|
return ResolveState("AltRefire");
|
|
}
|
|
return ResolveState(null);
|
|
}
|
|
Goto Vent;
|
|
DoublePreVent:
|
|
XZW5 ZZZZZZZZ 1
|
|
{
|
|
A_CanBob();
|
|
if ( (invoker.ClipCount > 0) && (invoker.ClipCount%4) )
|
|
{
|
|
if ( player.cmd.buttons&BT_ATTACK )
|
|
return ResolveState("DoubleRefire");
|
|
if ( player.cmd.buttons&BT_ALTATTACK )
|
|
return ResolveState("DoubleAltRefire");
|
|
}
|
|
return ResolveState(null);
|
|
}
|
|
Goto DoubleVent;
|
|
Refire:
|
|
XZW2 A 1;
|
|
XZW4 Y 3;
|
|
Goto Fire+3;
|
|
DoubleRefire:
|
|
XZW5 Z 1;
|
|
XZW8 L 3;
|
|
Goto DoubleFire+2;
|
|
AltRefire:
|
|
XZW2 A 1;
|
|
XZW4 Y 3;
|
|
Goto AltFire+3;
|
|
DoubleAltRefire:
|
|
XZW5 Z 1;
|
|
XZW8 M 3;
|
|
Goto DoubleAltFire+2;
|
|
Vent:
|
|
XZW2 A 8
|
|
{
|
|
A_CanBob();
|
|
A_Overlay(PSP_WEAPON+2,"VentFlash");
|
|
A_OverlayFlags(PSP_WEAPON+2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true);
|
|
A_OverlayRenderStyle(PSP_WEAPON+2,STYLE_Add);
|
|
A_StartSound("biospark/hiss",CHAN_WEAPON,CHANF_OVERLAP);
|
|
}
|
|
Goto Ready;
|
|
DoubleVent:
|
|
XZW5 Z 8
|
|
{
|
|
A_CanBob();
|
|
A_Overlay(PSP_WEAPON+2,"VentFlash");
|
|
A_OverlayFlags(PSP_WEAPON+2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true);
|
|
A_OverlayRenderStyle(PSP_WEAPON+2,STYLE_Add);
|
|
A_StartSound("biospark/hiss",CHAN_WEAPON,CHANF_OVERLAP);
|
|
}
|
|
Goto DoubleReady;
|
|
VentFlash:
|
|
XZWY ABCDEFGHIJKLMNOPQRSTUVWX 1;
|
|
Stop;
|
|
Zoom:
|
|
XZW2 A 0 A_JumpIf(invoker.ClipCount<=0,"Reload");
|
|
XZW2 A 0 A_JumpIf(invoker.doublestacc,"DoubleZoom");
|
|
XZW2 A 0 A_JumpIf(invoker.ClipCount<2,"NoZoom");
|
|
XZW2 A 1 A_StartSound("biospark/prethird",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW5 A 12 A_CanBob();
|
|
XZW5 A 1 A_FireSpark(2);
|
|
XZW2 VWXYZ 2;
|
|
Goto Ready;
|
|
DoubleZoom:
|
|
XZW5 Z 0 A_JumpIf((invoker.ClipCount<2)||((invoker.ClipCount>4)&&(invoker.ClipCount<6)),"DoubleNoZoom");
|
|
XZW5 Z 1 A_StartSound("biospark/prethird",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW8 N 12 A_CanBob();
|
|
XZW8 N 1 A_FireSpark(2);
|
|
XZW7 MNOPQ 2;
|
|
Goto DoubleReady;
|
|
NoZoom:
|
|
XZW2 A 1 A_StartSound("biospark/prethird",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW5 A 12 A_CanBob();
|
|
XZW5 A 8 A_FailZoom();
|
|
XZW2 A 20 A_CanBob();
|
|
Goto Ready;
|
|
DoubleNoZoom:
|
|
XZW5 Z 1 A_StartSound("biospark/prethird",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW8 N 12 A_CanBob();
|
|
XZW8 N 8 A_FailZoom();
|
|
XZW5 Z 20 A_CanBob();
|
|
Goto DoubleReady;
|
|
Reload:
|
|
XZW2 A 0
|
|
{
|
|
if ( invoker.clipcount > 0 )
|
|
{
|
|
if ( !invoker.doublestacc && ((invoker.Ammo1.Amount > 0) || sv_infiniteammo || FindInventory('PowerInfiniteAmmo')) )
|
|
return ResolveState("AttachExtra");
|
|
return ResolveState("Idle");
|
|
}
|
|
if ( (invoker.Ammo1.Amount <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo') )
|
|
return ResolveState("Idle");
|
|
if ( invoker.doublestacc )
|
|
return ResolveState("UnloadExtra");
|
|
return ResolveState(null);
|
|
}
|
|
XZW2 A 2
|
|
{
|
|
A_StartSound("biospark/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_PlayerReload();
|
|
}
|
|
XZW3 ABCDE 2;
|
|
XZW3 F 2
|
|
{
|
|
invoker.clipcount = 0;
|
|
invoker.nomag = true;
|
|
A_BumpView(1);
|
|
A_QuakeEx(.3,.3,.3,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1);
|
|
A_StartSound("biospark/magout",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_StopSound(CHAN_WEAPONEXTRA);
|
|
}
|
|
XZW3 GHIJKL 2;
|
|
XZW3 M 2 A_DropMag();
|
|
Goto Reload2;
|
|
UnloadExtra:
|
|
XZW5 Z 2
|
|
{
|
|
A_StartSound("biospark/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_PlayerReload();
|
|
}
|
|
XZW9 MNOPQ 2;
|
|
XZW9 R 2
|
|
{
|
|
invoker.clipcount = 0;
|
|
invoker.nomag = true;
|
|
invoker.doublestacc = false;
|
|
A_BumpView(1);
|
|
A_QuakeEx(.3,.3,.3,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1);
|
|
A_StartSound("biospark/magout",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_StopSound(CHAN_WEAPONEXTRA);
|
|
A_StopSound(CHAN_WEAPONEXTRA2);
|
|
}
|
|
XZW9 STUVWX 2;
|
|
XZW9 Y 2 A_DropMag(true);
|
|
XZW9 Z 0;
|
|
Goto Reload2;
|
|
Reload2:
|
|
XZW3 NOPQR 2;
|
|
XZW3 S 2
|
|
{
|
|
if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) )
|
|
invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1);
|
|
invoker.clipcount = invoker.default.clipcount;
|
|
invoker.nomag = false;
|
|
A_BumpView(-1.5);
|
|
A_QuakeEx(.6,.6,.6,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2);
|
|
A_StartSound("biospark/magin",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_StartSound("biospark/idle",CHAN_WEAPONEXTRA,CHANF_LOOP,.4,4.);
|
|
}
|
|
XZW3 UV 2;
|
|
XZW3 W 0 A_JumpIf((player.cmd.buttons&BT_RELOAD)&&((invoker.Ammo1.Amount>0)||sv_infiniteammo||FindInventory('PowerInfiniteAmmo')),"DoubleStacc");
|
|
Goto Reload3;
|
|
Reload3:
|
|
XZW3 W 2;
|
|
XZW3 X 2 A_StartSound("biospark/meleeend",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW3 YZ 2;
|
|
XZW4 ABCD 2;
|
|
Goto Vent;
|
|
DoubleStacc:
|
|
XZWA ABCDEFG 2;
|
|
XZWA H 2
|
|
{
|
|
if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) )
|
|
invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1);
|
|
invoker.clipcount += invoker.default.clipcount;
|
|
invoker.doublestacc = true;
|
|
A_BumpView(-2);
|
|
A_QuakeEx(.75,.75,.75,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.25);
|
|
A_StartSound("biospark/magin",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_SoundVolume(CHAN_WEAPONEXTRA,.6);
|
|
A_StartSound("biospark/idle2",CHAN_WEAPONEXTRA2,CHANF_LOOP,.2,4.);
|
|
}
|
|
XZWA IJKL 2;
|
|
XZWA M 2 A_StartSound("biospark/meleeend",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZWA NOPQRS 2;
|
|
Goto DoubleVent;
|
|
AttachExtra:
|
|
XZW2 A 2
|
|
{
|
|
A_StartSound("biospark/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_PlayerReload();
|
|
}
|
|
XZW6 ABCDEFGHI 2;
|
|
XZW6 J 2
|
|
{
|
|
if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) )
|
|
invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1);
|
|
invoker.clipcount += invoker.default.clipcount;
|
|
invoker.doublestacc = true;
|
|
A_BumpView(-.8);
|
|
A_QuakeEx(.6,.6,.6,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.2);
|
|
A_StartSound("biospark/magin",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_SoundVolume(CHAN_WEAPONEXTRA,.6);
|
|
A_StartSound("biospark/idle2",CHAN_WEAPONEXTRA2,CHANF_LOOP,.2,4.);
|
|
}
|
|
XZW6 K 2;
|
|
XZW6 L 2 A_StartSound("biospark/meleeend",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW6 MNOPQR 2;
|
|
Goto DoubleVent;
|
|
Idle:
|
|
XZW2 A 2
|
|
{
|
|
A_StartSound("biospark/checkout",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_PlayerCheckGun();
|
|
return A_JumpIf(invoker.doublestacc,"DoubleIdle");
|
|
}
|
|
XZW5 BCDE 2;
|
|
XZW5 FGHI 3;
|
|
XZW5 JKLM 2;
|
|
XZW5 NOPQ 3;
|
|
XZW5 RST 2;
|
|
XZW5 UVWXY 3;
|
|
Goto Ready;
|
|
DoubleIdle:
|
|
XZW5 Z 2;
|
|
XZW8 OPQR 2;
|
|
XZW8 STUV 3;
|
|
XZW8 WXYZ 2;
|
|
XZW9 ABCD 3;
|
|
XZW9 EFG 2;
|
|
XZW9 HIJKL 3;
|
|
Goto DoubleReady;
|
|
User1:
|
|
XZW2 A 2
|
|
{
|
|
A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_StartSound("biospark/meleestart",CHAN_WEAPON,CHANF_OVERLAP);
|
|
A_PlayerMelee();
|
|
return A_JumpIf(invoker.doublestacc,"DoubleUser1");
|
|
}
|
|
XZW4 EFG 2 A_BumpView(1,tics:2);
|
|
XZW4 H 1
|
|
{
|
|
A_BumpFOV(.98);
|
|
A_QuakeEx(.8,.8,.8,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3);
|
|
A_Parry(9);
|
|
}
|
|
XZW4 IJ 1 A_BumpView(-4);
|
|
XZW4 K 2 A_Melee(60,"demolitionist/whitm",1.,1.1,1.1);
|
|
XZW4 LMNOPQ 2;
|
|
XZW4 R 2 A_StartSound("biospark/meleeend",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW4 STUVWX 2;
|
|
Goto Ready;
|
|
DoubleUser1:
|
|
XZW5 Z 2;
|
|
XZW7 RST 2 A_BumpView(1,tics:2);
|
|
XZW7 U 1
|
|
{
|
|
A_BumpFOV(.98);
|
|
A_QuakeEx(.8,.8,.8,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.3);
|
|
A_Parry(9);
|
|
}
|
|
XZW7 VW 1 A_BumpView(-4);
|
|
XZW7 X 2 A_Melee(60,"demolitionist/whitm",1.,1.1);
|
|
XZW7 YZ 2;
|
|
XZW8 ABCD 2;
|
|
XZW8 E 2 A_StartSound("biospark/meleeend",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW8 FGHIJK 2;
|
|
Goto DoubleReady;
|
|
Flash:
|
|
XZWZ A 2 Bright
|
|
{
|
|
let l = Spawn("SWWMWeaponLight",pos);
|
|
l.args[0] = 192;
|
|
l.args[1] = 255;
|
|
l.args[2] = 96;
|
|
l.target = self;
|
|
}
|
|
Stop;
|
|
}
|
|
}
|