570 lines
16 KiB
Text
570 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 ui TextureID WeaponBox, AmmoBar[6];
|
|
transient ui Font TewiFont;
|
|
transient ui DynamicValueInterpolator iclip;
|
|
transient int failtime;
|
|
|
|
override void DrawWeapon( double TicFrac, double bx, double by, Vector2 hs, Vector2 ss )
|
|
{
|
|
if ( !TewiFont ) TewiFont = Font.GetFont('TewiShaded');
|
|
if ( !WeaponBox )
|
|
{
|
|
WeaponBox = TexMan.CheckForTexture("graphics/HUD/BiosparkDisplay.png",TexMan.Type_Any);
|
|
AmmoBar[0] = TexMan.CheckForTexture("graphics/HUD/BiosparkBar.png",TexMan.Type_Any);
|
|
AmmoBar[1] = TexMan.CheckForTexture("graphics/HUD/BiosparkBarRed.png",TexMan.Type_Any);
|
|
AmmoBar[2] = TexMan.CheckForTexture("graphics/HUD/BiosparkBarGray.png",TexMan.Type_Any);
|
|
AmmoBar[3] = TexMan.CheckForTexture("graphics/HUD/BiosparkBarSlim.png",TexMan.Type_Any);
|
|
AmmoBar[4] = TexMan.CheckForTexture("graphics/HUD/BiosparkBarSlimRed.png",TexMan.Type_Any);
|
|
AmmoBar[5] = TexMan.CheckForTexture("graphics/HUD/BiosparkBarSlimGray.png",TexMan.Type_Any);
|
|
}
|
|
Screen.DrawTexture(WeaponBox,false,bx-28,by-28,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
|
Screen.DrawText(TewiFont,Font.CR_FIRE,bx-26,by-26,String.Format("%2d",Ammo1.Amount),DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
|
if ( nomag ) return;
|
|
bool blinking = (failtime>gametic)&&((failtime-gametic)%16>=8);
|
|
if ( doublestacc )
|
|
{
|
|
Screen.DrawTexture(AmmoBar[5],false,bx-26,by-8,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
|
Screen.DrawTexture(AmmoBar[5],false,bx-14,by-8,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
|
Screen.DrawTexture(AmmoBar[3+(clipcount<2)],false,bx-26,by-8,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_WindowRightF,iclip?(iclip.GetValue()/10.):0.,DTA_ColorOverlay,(blinking&&(clipcount<=4))?Color(128,0,0,0):Color(0,0,0,0));
|
|
if ( (iclip && (iclip.GetValue() > 120)) || (!iclip && (clipcount > 4)) )
|
|
Screen.DrawTexture(AmmoBar[3+(clipcount<6)],false,bx-14,by-8,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_WindowRightF,iclip?(((iclip.GetValue()/10.))-12.):0.,DTA_ColorOverlay,blinking?Color(128,0,0,0):Color(0,0,0,0));
|
|
}
|
|
else
|
|
{
|
|
Screen.DrawTexture(AmmoBar[2],false,bx-26,by-8,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true);
|
|
Screen.DrawTexture(AmmoBar[clipcount<2],false,bx-26,by-8,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_WindowRightF,iclip?(iclip.GetValue()/5.):0.,DTA_ColorOverlay,blinking?Color(128,0,0,0):Color(0,0,0,0));
|
|
}
|
|
}
|
|
|
|
override void HudTick()
|
|
{
|
|
Super.HudTick();
|
|
if ( !iclip ) iclip = DynamicValueInterpolator.Create(clipcount*30,.25,1,10);
|
|
else iclip.Update(clipcount*30);
|
|
}
|
|
|
|
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()
|
|
{
|
|
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 x, y, z, x2, y2, z2, dir;
|
|
[x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
|
|
Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+4.5*y-5*z);
|
|
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,rollIntensity:.2);
|
|
A_BumpFOV(.96);
|
|
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);
|
|
[x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll);
|
|
dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
|
|
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,rollIntensity:.3);
|
|
A_BumpFOV(.95);
|
|
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);
|
|
[x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll);
|
|
dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
|
|
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,rollIntensity:.6);
|
|
A_BumpFOV(.94);
|
|
A_AlertMonsters(swwm_uncapalert?0:1200);
|
|
A_PlayerFire();
|
|
SWWMUtility.DoKnockback(self,-x,2500.);
|
|
a = FRandom[Spread](0,360);
|
|
s = FRandom[Spread](0,.012);
|
|
[x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll);
|
|
dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
|
|
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 )
|
|
{
|
|
Vector3 x, y, z;
|
|
[x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll);
|
|
Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x-2*y-10*z);
|
|
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 = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),8*x-2*y-12*z);
|
|
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);
|
|
}
|
|
|
|
Default
|
|
{
|
|
Tag "$T_SPARKSTER";
|
|
Inventory.PickupMessage "$I_SPARKSTER";
|
|
Obituary "$O_SPARKSTER";
|
|
Inventory.Icon "graphics/HUD/Icons/W_Sparkster.png";
|
|
Weapon.SlotNumber 7;
|
|
Weapon.UpSound "biospark/select";
|
|
Weapon.SelectionOrder 600;
|
|
Stamina 200000;
|
|
Weapon.AmmoType1 "SparkUnit";
|
|
Weapon.AmmoGive1 1;
|
|
SWWMWeapon.DropAmmoType "SparkUnit";
|
|
Sparkster.ClipCount 4;
|
|
+SWWMWEAPON.NOFIRSTGIVE;
|
|
+WEAPON.EXPLOSIVE;
|
|
Radius 22;
|
|
Height 24;
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
XZW1 A -1 NoDelay A_JumpIf(invoker.doublestacc,1);
|
|
XZW1 B -1;
|
|
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 BCDEFG 2;
|
|
XZW2 G -1
|
|
{
|
|
A_StopSound(CHAN_WEAPONEXTRA);
|
|
A_FullLower();
|
|
}
|
|
Stop;
|
|
DoubleDeselect:
|
|
XZW5 Z 2;
|
|
XZW6 STUVWX 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;
|
|
XZW4 Y 1 A_FireSpark(0);
|
|
XZW2 NOPQ 2;
|
|
Goto PreVent;
|
|
DoubleFire:
|
|
XZW5 Z 1;
|
|
XZW8 L 12;
|
|
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;
|
|
XZW4 Z 1 A_FireSpark(1);
|
|
XZW2 RSTU 2;
|
|
Goto PreVent;
|
|
DoubleAltFire:
|
|
XZW5 Z 1;
|
|
XZW8 M 12;
|
|
XZW8 M 1 A_FireSpark(1);
|
|
XZW7 IJKL 2;
|
|
Goto DoublePreVent;
|
|
PreVent:
|
|
XZW2 AAAAAAAA 1
|
|
{
|
|
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
|
|
{
|
|
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_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_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;
|
|
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;
|
|
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;
|
|
XZW5 A 8 A_FailZoom();
|
|
XZW2 A 20;
|
|
Goto Ready;
|
|
DoubleNoZoom:
|
|
XZW5 Z 1 A_StartSound("biospark/prethird",CHAN_WEAPON,CHANF_OVERLAP);
|
|
XZW8 N 12;
|
|
XZW8 N 8 A_FailZoom();
|
|
XZW5 Z 20;
|
|
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_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_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_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_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_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;
|
|
XZW4 H 1 A_Parry(9);
|
|
XZW4 IJ 1;
|
|
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;
|
|
XZW7 U 1 A_Parry(9);
|
|
XZW7 VW 1;
|
|
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;
|
|
}
|
|
}
|