swwmgz_m/zscript/weapons/swwm_tastytreat.zsc

690 lines
20 KiB
Text

// Munch Innovations "Taste the Sweetness" Candy Gun (from unreleased "Weird Weapons" UT minimod)
// Slot 9, replaces BFG9000, Firemace, Bloodscourge (stub)
Class CandyGun : SWWMWeapon
{
int clipcount;
bool chambered;
double casex, casey;
bool tospecial;
bool swapdrop; // used by weapon swapping so CreateTossable actually tosses the gun, rather than spares
Property ClipCount : ClipCount;
// re-edit to allow picking up spares in coop
override bool HandlePickup( Inventory item )
{
// can't hold both weapons at once
if ( swwm_swapweapons && IsSwapWeapon(item) )
return true;
if ( (item.GetClass() == GetClass()) && !item.ShouldStay() )
{
bool ammoget, spareget;
[ammoget, spareget] = CandyGun(item).PickupForAmmoAndSpares(self);
if ( ammoget || spareget )
item.bPickupGood = true;
if ( !deathmatch && !spareget )
{
// sell excess
int sellprice = abs(item.Stamina)/2;
SWWMScoreObj.Spawn(sellprice,level.Vec3Offset(Owner.pos,SWWMUtility.Vec3FromAngles(FRandom[ScoreBits](0,360),FRandom[ScoreBits](-90,90))*8.+(0,0,Owner.Height/2)));
SWWMCredits.Give(Owner.player,sellprice);
if ( Owner.player )
{
if ( Owner.player == players[consoleplayer] ) Console.Printf(StringTable.Localize(SWWMUtility.SellFemaleItem(item)?"$SWWM_SELLEXTRA_FEM":"$SWWM_SELLEXTRA"),GetTag(),sellprice);
else Console.Printf(StringTable.Localize(SWWMUtility.SellFemaleItem(item)?"$SWWM_SELLEXTRAREM_FEM":"$SWWM_SELLEXTRAREM"),Owner.player.GetUserName(),GetTag(),sellprice);
}
item.bPickupGood = true;
}
// reset the price in case it has to respawn
item.Stamina = item.default.Stamina;
return true;
}
return Weapon.HandlePickup(item);
}
protected bool, bool PickupForAmmoAndSpares( Weapon ownedWeapon )
{
bool gotstuff = false, gotspares = false;
int oldamount = ownedWeapon.Ammo1.Amount;
gotstuff = AddExistingAmmo(ownedWeapon.Ammo1,AmmoGive1);
gotspares = AddExistingAmmo(ownedWeapon.Ammo2,1); // always give one of ourselves, always
let Owner = ownedWeapon.Owner;
if ( gotstuff && Owner && Owner.player && (oldamount == 0) )
PlayerPawn(Owner).CheckWeaponSwitch(ownedWeapon.Ammo1.GetClass());
if ( ownedWeapon.Ammo1 )
{
// subtract price of ammo we don't give
int ammonotgiven = default.AmmoGive1-AmmoGive1;
if ( ammonotgiven > 0 ) Stamina -= int(ownedWeapon.Ammo1.Stamina*(1.+.75*(ammonotgiven-1)));
// subtract price of given ammo
int ammogiven = ownedWeapon.Ammo1.Amount-oldamount;
if ( ammogiven > 0 ) Stamina -= int(ownedWeapon.Ammo1.Stamina*(1.+.75*(ammogiven-1)));
// drop excess
int dropme = AmmoGive1-ammogiven;
if ( dropme > 0 )
{
if ( (ownedWeapon.Ammo1 is 'SWWMAmmo') && SWWMAmmo(ownedWeapon.Ammo1).MagAmmoType )
{
// can we add it as mag ammo?
MagAmmo ma = MagAmmo(Owner.FindInventory(SWWMAmmo(ownedWeapon.Ammo1).MagAmmoType));
if ( !ma )
{
ma = MagAmmo(Spawn(SWWMAmmo(ownedWeapon.Ammo1).MagAmmoType));
ma.Amount = 0;
ma.AttachToOwner(Owner);
}
while ( ma.Amount <= (ma.MaxAmount-ma.ClipSize) )
{
ma.Amount += ma.ClipSize;
dropme--;
}
}
if ( dropme > 0 )
{
// hacky, but it works
ownedWeapon.Ammo1.CreateTossable(dropme);
ownedWeapon.Ammo1.Amount += dropme;
}
}
}
if ( (AmmoGive1 == 0) && ((clipcount > 0) || chambered) )
{
// we were dropped, see if we can add the bullets we contain
int bul = clipcount+chambered;
MagAmmo ma = MagAmmo(Owner.FindInventory("CandyGunBullets"));
if ( !ma )
{
ma = MagAmmo(Spawn("CandyGunBullets"));
ma.Amount = 0;
ma.AttachToOwner(Owner);
}
// can we add a full mag?
if ( (bul >= ma.clipsize) && (ma.pamo.Amount < ma.pamo.MaxAmount) )
{
bul -= ma.clipsize;
ma.pamo.Amount++;
}
int maxgiveamt = min(ma.MaxAmount-ma.Amount,bul);
int dropamt = bul-maxgiveamt;
if ( dropamt > 0 ) ma.CreateTossable(dropamt);
ma.Amount = min(ma.MaxAmount,ma.Amount+bul);
gotstuff = true;
}
return gotstuff, gotspares;
}
override Vector3 GetTraceOffset( int index )
{
return (10.,3,-2.);
}
action void A_Schutt()
{
let weap = Weapon(invoker);
if ( !weap ) return;
invoker.chambered = invoker.clipcount;
invoker.clipcount = max(invoker.clipcount-1,0);
A_StartSound("candygun/fire",CHAN_WEAPON,CHANF_OVERLAP);
A_QuakeEx(5,5,5,5,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:2.);
A_BumpFOV(.94);
A_SWWMFlash();
SWWMHandler.DoFlash(self,Color(64,224,64,255),5);
A_AlertMonsters(swwm_uncapalert?0:9000);
A_PlayerFire();
Vector3 x, x2, y2, z2;
x = SWWMUtility.GetPlayerViewDir(self);
SWWMUtility.DoKnockback(self,-x,18000.);
Vector3 origin = SWWMUtility.GetFireOffset(self,10,3,-2);
double a = FRandom[Spread](0,360), s = FRandom[Spread](0,.005);
[x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self);
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 )
{
int dmg = 300;
// might as well apply explosion on top
if ( dmg >= d.HitActor.Health ) dmg += 900;
SWWMUtility.DoKnockback(d.HitActor,d.HitDir,72000);
let p = SWWMPuff.Setup(d.HitLocation,d.HitDir,invoker,self,d.HitActor);
dmg = d.HitActor.DamageMobj(p,self,dmg,'Candy',DMG_THRUSTLESS|DMG_FOILINVUL|DMG_INFLICTOR_IS_PUFF);
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;
}
else if ( dmg > 0 )
{
d.HitActor.TraceBleed(dmg,self);
d.HitActor.SpawnBlood(d.HitLocation,atan2(d.HitDir.y,d.HitDir.x)+180,dmg);
}
let b = Spawn("CandyBulletImpact",d.HitLocation-d.HitDir*4.);
b.angle = atan2(d.HitDir.y,d.HitDir.x)+180;
b.pitch = asin(d.HitDir.z);
b.target = self;
}
else if ( d.HitType != TRACE_HitNone )
{
Vector3 hitnormal = SWWMUtility.GetLineTraceHitNormal(d);
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.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation);
let b = Spawn("CandyBulletImpact",d.HitLocation+hitnormal*4.);
b.angle = atan2(hitnormal.y,hitnormal.x);
b.pitch = asin(-hitnormal.z);
b.target = self;
if ( swwm_omnibust ) BusterWall.BustLinetrace(d,1700,self,d.HitDir,d.HitLocation.z);
}
for ( int i=0; i<6; i++ )
{
let s = Spawn("SWWMSmoke",origin);
s.scale *= .15;
s.alpha *= .5;
s.speed *= .2;
s.vel += vel*.5+x*FRandom[Explodium](.2,.5);
}
}
action void A_ThrowMag()
{
let weap = Weapon(invoker);
if ( !weap ) return;
Vector3 x2, y2, z2;
Vector3 origin = SWWMUtility.GetFireOffset(self,10,-2,-3);
double a = FRandom[Spread](0,360), s = FRandom[Spread](0,.01);
[x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self);
Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s);
let p = Spawn("CandyMagProj",origin);
p.special1 = invoker.special1;
p.target = self;
p.angle = atan2(dir.y,dir.x);
p.pitch = asin(-dir.z);
p.vel = dir*p.speed;
if ( p.waterlevel <= 0 ) p.vel.z += 5.;
p.vel += vel*.5;
}
action void A_ThrowGun()
{
let weap = Weapon(invoker);
if ( !weap ) return;
invoker.bNODEATHDESELECT = true; // prevent any glitching that could happen if the sequence is interrupted
if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) )
{
if ( weap.Ammo2.Amount <= 0 ) weap.Amount = 0;
weap.Ammo2.Amount = max(0,weap.Ammo2.Amount-1);
}
Vector3 x2, y2, z2;
Vector3 origin = SWWMUtility.GetFireOffset(self,10,-2,-3);
double a = FRandom[Spread](0,360), s = FRandom[Spread](0,.015);
[x2, y2, z2] = SWWMUtility.GetPlayerAxesAutoAimed(self);
Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s);
let p = Spawn("CandyGunProj",origin);
p.special1 = invoker.clipcount+invoker.chambered;
invoker.clipcount = 0;
invoker.chambered = false;
p.target = self;
p.angle = atan2(dir.y,dir.x);
p.pitch = asin(-dir.z);
p.vel = dir*p.speed;
if ( p.waterlevel <= 0 ) p.vel.z += 5.;
p.vel += vel*.5;
}
action void A_DropMag()
{
if ( swwm_nomagdrop ) return;
Vector3 x, y, z;
[x, y, z] = SWWMUtility.GetPlayerAxes(self);
Vector3 origin = SWWMUtility.GetFireOffset(self,10,-2,-10);
let c = Spawn("CandyMag",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;
}
action void A_EmptyMag()
{
MagAmmo ma = MagAmmo(FindInventory("CandyGunBullets"));
if ( !ma )
{
ma = MagAmmo(Spawn("CandyGunBullets"));
ma.Amount = 0;
ma.AttachToOwner(self);
}
int maxgiveamt = min(ma.MaxAmount-ma.Amount,invoker.clipcount);
int dropamt = invoker.clipcount-maxgiveamt;
if ( dropamt > 0 ) invoker.BufferMagAmmo("CandyGunBullets",dropamt);
ma.Amount = min(ma.MaxAmount,ma.Amount+invoker.clipcount);
ma.MagFill();
invoker.clipcount = 0;
}
action void A_LoadMag()
{
MagAmmo sb = MagAmmo(FindInventory("CandyGunBullets"));
if ( sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true) )
invoker.clipcount = invoker.default.clipcount;
else if ( (invoker.Ammo1.Amount <= 0) || (sb.Amount >= sb.ClipSize) )
{
int takeamt = min(sb.Amount,sb.ClipSize);
invoker.clipcount = takeamt;
sb.Amount -= takeamt;
int req = invoker.default.ClipCount-invoker.clipcount;
if ( req > 0 ) invoker.clipcount += invoker.FetchBufferedMagAmmo("CandyGunBullets",req);
}
else if ( invoker.FetchBufferedMagAmmo("CandyGunBullets",sb.ClipSize,true) )
invoker.clipcount = invoker.default.clipcount;
else
{
invoker.Ammo1.Amount = max(0,invoker.Ammo1.Amount-1);
invoker.clipcount = invoker.default.clipcount;
}
invoker.ClearBufferedAmmo();
}
action void A_DropCasing()
{
Vector3 x, y, z;
[x, y, z] = SWWMUtility.GetPlayerAxes(self);
Vector3 origin = SWWMUtility.GetFireOffset(self,10,8,-10);
let c = Spawn("CandyCasing",origin);
c.special1 = special1;
c.angle = angle;
c.pitch = pitch;
c.vel = x*FRandom[Junk](-.5,.5)+y*FRandom[Junk](2,4)-(0,0,FRandom[Junk](2,3));
c.vel += vel*.5;
}
override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount )
{
if ( sv_infiniteammo || Owner.FindInventory('PowerInfiniteAmmo',true) ) return true;
if ( Amount <= 0 ) return false;
if ( fireMode == PrimaryFire ) return (chambered || (clipcount > 0) || (Ammo1.Amount > 0) || (Owner.CountInv("CandyGunBullets") > 0));
if ( fireMode == AltFire ) return ((Ammo1.Amount > 0) || (Owner.CountInv("CandyGunBullets") > 0));
return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount);
}
override bool ReportHUDAmmo()
{
if ( Amount <= 0 ) return false;
if ( chambered || (clipcount > 0) || (Owner.CountInv("CandyGunBullets") > 0) ) return true;
if ( Ammo1.Amount <= 0 ) return false;
return Super.ReportHUDAmmo();
}
override Inventory CreateTossable( int amt )
{
if ( (Ammo2.Amount > 0) && !swapdrop )
{
// drop an empty spare
let spare = Inventory(Spawn('CandyGun',Owner.Pos,NO_REPLACE));
if ( !spare ) return null;
// spare with empty mag
CandyGun(spare).AmmoGive1 = 0;
CandyGun(spare).clipcount = 0;
CandyGun(spare).chambered = false;
spare.SetState(spare.SpawnState+1);
spare.DropTime = 30;
spare.bSpecial = spare.bSolid = false;
Ammo2.Amount--;
return spare;
}
swapdrop = false;
let drop = Super.CreateTossable(amt);
if ( (drop == self) && (clipcount <= 0) && !chambered )
SetState(SpawnState+2);
return drop;
}
override void MarkPrecacheSounds()
{
Super.MarkPrecacheSounds();
MarkSound("candygun/fire1");
MarkSound("candygun/fire2");
MarkSound("candygun/fire3");
MarkSound("candygun/hit1");
MarkSound("candygun/hit2");
MarkSound("candygun/hit3");
MarkSound("candygun/maghit1");
MarkSound("candygun/maghit2");
MarkSound("candygun/gunhit1");
MarkSound("candygun/gunhit2");
}
Default
{
Tag "$T_CANDYGUN";
Inventory.PickupMessage "$I_CANDYGUN";
Obituary "$O_CANDYGUN";
SWWMWeapon.Tooltip "$TT_CANDYGUN";
SWWMWeapon.GetLine "getcandygun";
Weapon.UpSound "explodium/select";
Weapon.SlotNumber 9;
Weapon.SelectionOrder 900;
Stamina 1000000;
Weapon.AmmoType1 "CandyGunAmmo";
Weapon.AmmoType2 "CandyGunSpares";
Weapon.AmmoGive1 1;
Weapon.AmmoGive2 0;
Weapon.AmmoUse2 0;
SWWMWeapon.DropAmmoType "SWWMCellAmmoBig";
CandyGun.ClipCount 7;
+SWWMWEAPON.NOFIRSTGIVE;
+WEAPON.EXPLOSIVE;
+WEAPON.BFG;
}
States
{
Spawn:
XZW1 ABC -1;
Stop;
Select:
XZW2 B 2
{
A_FullRaise();
return A_JumpIf((invoker.clipcount<=0)&&!invoker.chambered,"SelectLast");
}
XZW2 CDEFGH 2;
Goto Ready;
SelectLast:
XZWE UVWXYZ 2;
XZWF A 2;
Goto ReadyLast;
Ready:
XZW2 A 1
{
if ( (invoker.clipcount > 0) && !invoker.chambered ) player.SetPSprite(PSP_WEAPON,ResolveState("Slide"));
else
{
int flg = WRF_ALLOWZOOM|WRF_ALLOWUSER1;
if ( sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true) || (invoker.Ammo1.Amount > 0) || invoker.chambered ) flg |= WRF_ALLOWRELOAD;
if ( (invoker.Ammo1.Amount <= 0) && (CountInv("CandyGunBullets") <= 0) && !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) flg |= WRF_NOSECONDARY;
if ( (flg&WRF_NOSECONDARY) && (player.cmd.buttons&BT_ATTACK) && (player.cmd.buttons&BT_ALTATTACK) )
player.SetPSprite(PSP_WEAPON,ResolveState("SpecialFirePre"));
else
{
A_WeaponReady(flg);
if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) )
invoker.CheckAmmo(EitherFire,true);
}
}
}
Wait;
ReadyLast:
XZW9 X 1
{
if ( (invoker.Ammo1.Amount > 0) || (CountInv("CandyGunBullets") > 0) || sv_infiniteammo || FindInventory('PowerInfiniteAmmo',true) ) player.SetPSprite(PSP_WEAPON,ResolveState("ReloadLast"));
else
{
A_WeaponReady(WRF_NOPRIMARY|WRF_NOSECONDARY);
if ( player.cmd.buttons&(BT_ATTACK|BT_ALTATTACK) )
invoker.CheckAmmo(EitherFire,true);
}
}
Wait;
Fire:
XZW2 A 1
{
A_Schutt();
return A_JumpIf((invoker.clipcount<=0)&&!invoker.chambered,"FireLast");
}
XZW2 I 1;
XZW2 J 1
{
int layer = PSP_WEAPON+1;
while ( player.FindPSprite(layer) ) layer++;
A_Overlay(layer,"Casing");
}
XZW2 KLMNOP 1;
XZW2 Q 2;
Goto Ready;
FireLast:
XZW2 A 1;
XZWC K 1;
XZWC L 1
{
int layer = PSP_WEAPON+1;
while ( player.FindPSprite(layer) ) layer++;
A_Overlay(layer,"Casing");
}
XZWC M 1;
XZWC N 1 A_StartSound("explodium/slidelock",CHAN_WEAPON,CHANF_OVERLAP);
XZWC OPQR 1;
XZWC S 2;
Goto ReadyLast;
ReloadLast:
XZW9 X 1 A_PlayerReload();
XZW9 Z 1;
XZWC XYZ 1;
XZWD ABCD 1;
XZWD E 1 { invoker.clipcount = 0; }
XZWD F 1;
XZWD G 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP);
XZWD HIJK 1;
XZWD L 1 A_DropMag();
XZWD MNOPQR 1;
XZWD S 1 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP);
XZWD TUVWXYZ 1;
XZWE ABCD 1;
XZWE E 1
{
A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP);
A_LoadMag();
}
XZWE FGHI 1;
XZWE J 1
{
A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP);
invoker.clipcount--;
invoker.chambered = true;
}
XZWE K 1;
XZWE L 3;
XZWE MNOP 1;
Goto Ready;
Casing:
XZWC A 1
{
A_OverlayOffset(OverlayID(),0,0);
invoker.casex = FRandom[Explodium](-1.,5.);
invoker.casey = FRandom[Explodium](-2.,1.);
}
XZWC BCDEFGHIJ 1 A_OverlayOffset(OverlayID(),invoker.casex,invoker.casey,WOF_ADD|WOF_INTERPOLATE);
TNT1 A 1 A_DropCasing();
Stop;
AltFire:
XZW2 A 2
{
A_PlayerReload();
return A_JumpIf(invoker.clipcount<=0,"Reload");
}
XZW5 NO 2;
XZW5 P 1 A_StartSound("explodium/magpin",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 Q 1;
XZW5 R 1
{
if ( player.cmd.buttons&BT_ATTACK )
player.SetPSprite(PSP_WEAPON,ResolveState("SpecialFire"));
}
XZW5 STUVWXYZ 1;
XZW6 AB 1;
XZW6 C 1
{
A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP);
invoker.special1 = invoker.clipcount;
invoker.clipcount = 0;
}
XZW6 D 1
{
A_PlayerMelee();
A_StartSound("explodium/throwmag",CHAN_WEAPON,CHANF_OVERLAP);
}
XZW6 EFGHIJKLMNOPRS 1;
XZW6 T 1 A_ThrowMag();
XZW6 UV 2;
XZW6 W 2
{
A_PlayerReload();
A_StartSound("explodium/magget",CHAN_WEAPON,CHANF_OVERLAP);
}
XZW6 XY 2;
XZW6 Z 4;
Goto ReloadEnd;
SpecialFirePre:
XZW2 A 2 A_PlayerReload();
XZW5 NO 2;
XZW5 P 1 A_StartSound("explodium/magpin",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 QR 1;
Goto SpecialFire+1;
SpecialFire:
#### # 1;
XZWA Z 1;
XZWB ABC 1;
XZWB D 1
{
A_PlayerMelee();
A_StartSound("explodium/throwmag",CHAN_WEAPON,CHANF_OVERLAP);
}
XZWB EFGHIJKLMNOPQR 1;
XZWB S 1 A_ThrowGun();
XZWB TUVWXYZ 2;
XZW1 B -1
{
invoker.bNODEATHDESELECT = false;
if ( (invoker.Amount > 0) && (invoker.Ammo2.Amount >= 0) ) A_LoadMag();
if ( invoker.clipcount > 0 )
{
invoker.PlayUpSound(self);
return ResolveState("Select");
}
let nw = player.mo.PickPrevWeapon();
if ( nw != invoker ) player.PendingWeapon = nw;
if ( invoker.Amount <= 0 )
{
RemoveInventory(invoker);
invoker.Destroy();
}
else A_FullLower(); // this works
return ResolveState(null);
}
Stop;
Reload:
XZW2 A 1
{
if ( ((invoker.Ammo1.Amount <= 0) && (CountInv("CandyGunBullets") <= 0)) || (invoker.clipcount >= invoker.default.clipcount) ) return ResolveState("CheckBullet");
A_PlayerReload();
if ( invoker.clipcount <= 0 ) return ResolveState("ReloadEmpty");
return ResolveState(null);
}
XZW2 TUVWXYZ 1;
XZW3 A 1;
XZW3 B 1 A_EmptyMag();
XZW3 C 1;
XZW3 D 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP);
XZW3 EFGH 1;
XZW3 I 1 A_DropMag();
Goto ReloadEnd;
ReloadEmpty:
XZW2 A 1;
XZW3 JKLMNOPQRS 1;
XZW3 T 1 A_StartSound("explodium/magout",CHAN_WEAPON,CHANF_OVERLAP);
XZW3 UVWX 1;
XZW3 Y 1 A_DropMag();
Goto ReloadEnd;
ReloadEnd:
XZW3 Z 1;
XZW4 ABCDE 1;
XZW4 F 1 A_StartSound("explodium/magin",CHAN_WEAPON,CHANF_OVERLAP);
XZW4 GHIJKLMNOPQ 1;
XZW4 R 1
{
A_StartSound("explodium/jamitin",CHAN_WEAPON,CHANF_OVERLAP);
A_LoadMag();
}
XZW4 STUV 1;
XZW2 A 1 A_JumpIf(!invoker.chambered,"Slide");
Goto Ready;
Slide:
XZW2 A 1;
XZW4 WXY 1;
XZW5 A 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 BC 1;
XZW5 D 1 { invoker.chambered = true; invoker.clipcount--; }
XZW5 EFG 1;
XZW5 H 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP);
XZW5 IJKLM 1;
Goto Ready;
Zoom:
XZW2 A 1
{
A_PlayerCheckGun();
return A_Jump(256,"Zoom1","Zoom2","Zoom2");
}
Goto Ready;
CheckBullet:
XZW2 A 1;
XZW7 ABCDE 1;
XZW7 F 1 A_StartSound("explodium/slideback",CHAN_WEAPON,CHANF_OVERLAP);
XZW7 GHIJKLMNOP 1;
XZW7 Q 1 A_StartSound("explodium/slideforward",CHAN_WEAPON,CHANF_OVERLAP);
XZW7 RS 1;
Goto Ready;
User1:
XZW2 A 1;
XZW7 TU 1;
User1Hold:
XZW7 V 1
{
A_PlayerMelee(true);
A_StartSound("demolitionist/swing",CHAN_WEAPON,CHANF_OVERLAP);
A_Parry(9);
}
XZW7 WX 1;
XZW7 Y 1 A_Melee();
XZW7 Z 2;
XZW8 ABCDE 2;
XZW8 F 1 A_JumpIf(player.cmd.buttons&BT_USER1,"User1Hold");
XZW2 B 0 { invoker.PlayUpSound(self); }
Goto Select;
Zoom1:
XZW2 A 2 A_StartSound("explodium/checkout",CHAN_WEAPON,CHANF_OVERLAP);
XZW8 GHIJKLMNOPQRSTUVWXYZ 2;
Goto Ready;
Zoom2:
XZW2 A 1 A_StartSound("explodium/speen",CHAN_WEAPON,CHANF_OVERLAP);
XZW9 ABCDEFGHIJKLMNOPQRSTUVW 1;
Goto Ready;
Deselect:
XZW2 A 2
{
A_StartSound("explodium/deselect",CHAN_WEAPON,CHANF_OVERLAP);
return A_JumpIf((invoker.clipcount<=0)&&!invoker.chambered,"DeselectLast");
}
XZWA TUVW 2;
XZW2 B 2;
XZW2 B -1 A_FullLower();
Stop;
DeselectLast:
XZW9 X 2;
XZWE QRST 2;
XZWE U 2;
XZWE U -1 A_FullLower();
Stop;
Flash:
XZWZ A 2 Bright
{
let psp = player.GetPSprite(PSP_FLASH);
psp.frame = Random[GunFlash](0,9);
let l = Spawn("CandyWeaponLight",pos);
l.target = self;
}
Stop;
}
}