Class ImpalerAmmo : Ammo { Default { Tag "$T_IMPAMMO"; Inventory.Icon "I_Impale"; Inventory.PickupMessage "$T_IMPAMMO"; Inventory.Amount 3; Inventory.MaxAmount 15; Ammo.BackpackAmount 3; Ammo.BackpackMaxAmount 30; Ammo.DropAmount 3; +INVENTORY.IGNORESKILL; } States { Spawn: IAMO A -1; Stop; } } Class ImpalerAmmo2 : ImpalerAmmo { Default { Tag "$T_IMPAMMO2"; Inventory.PickupMessage "$T_IMPAMMO2"; Inventory.Amount 1; Ammo.DropAmount 1; +INVENTORY.IGNORESKILL; } } Class Impaler : UnrealWeapon { int ClipCount; bool HasGem; Actor beam; property ClipCount : ClipCount; override int, int, bool, bool GetClipAmount() { return ClipCount, -1, (ClipCount<10), false; } action void A_ImpalerFire() { A_Overlay(-9999,"Null"); A_Overlay(-3,"Null"); A_Overlay(-2,"Null"); A_PlaySound("impaler/fire",CHAN_WEAPON); invoker.HasGem = false; invoker.ClipCount = -1; } action void A_StartBeam() { } action void A_DrainAmmo() { } action void A_StopBeam() { } override void DoEffect() { Super.DoEffect(); if ( Owner.player.ReadyWeapon != self ) return; if ( (Owner.waterlevel > 2) && !(level.maptime%5) ) ClipCount = max(0,ClipCount-1); let psp = Owner.player.FindPSprite(-2); if ( psp ) psp.alpha = clamp(ClipCount/double(default.ClipCount),0.,1.); } override bool CheckAmmo( int fireMode, bool autoSwitch, bool requireAmmo, int ammocount ) { if ( ClipCount > 0 ) return true; return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount); } Default { Tag "$T_IMPALER"; Inventory.PickupMessage "$I_IMPALER"; Weapon.UpSound "impaler/select"; Weapon.SlotNumber 7; Weapon.SelectionOrder 0; Weapon.SlotPriority 0.9; Weapon.AmmoType "ImpalerAmmo"; Weapon.AmmoUse 1; Weapon.AmmoType2 "ImpalerAmmo"; Weapon.AmmoUse2 1; Weapon.AmmoGive 6; UTWeapon.DropAmmo 3; Impaler.ClipCount 30; } States { Spawn: IMPP A -1; Stop; IMPP B -1; Stop; Select: IMPS A 1 A_Raise(int.max); Wait; Ready: IMPS ABCDEF 3 A_WeaponReady(WRF_NOFIRE); IMPI A 0 { let weap = Weapon(invoker); invoker.HasGem = false; if ( (invoker.ClipCount>=0) || (weap.Ammo1.Amount > 0) ) return ResolveState("Reload"); return ResolveState("Idle"); } Goto Idle; Dummy: TNT1 A 1 { let weap = Weapon(invoker); int flags = 0; if ( weap.Ammo1.Amount > 0 ) flags |= WRF_ALLOWRELOAD; if ( invoker.HasGem && (invoker.ClipCount <= 0) ) flags |= WRF_NOSECONDARY; A_WeaponReady(flags); } Wait; Idle: IMPI A 0 A_Overlay(-9999,"Dummy"); IMPI ABCDEFGH 10; Goto Idle+1; Melee: IMPM A 0 A_Overlay(-9999,"Null"); IMPM ABCDEFGHIJ 2; Goto Idle; Fire: IMPF A 0 { if ( !invoker.HasGem ) return ResolveState("Melee"); A_ImpalerFire(); return ResolveState(null); } IMPF ABCDEFGHI 2; IMPI A 0 A_JumpIfNoAmmo("Idle"); Goto Reload; AltFire: IMPA A 0 { if ( !invoker.HasGem ) return ResolveState("Melee"); A_Overlay(-9999,"Null"); A_Overlay(-3,"GemAltFire"); A_Overlay(-2,"ZapAltFire"); A_PlaySound("impaler/altfire",CHAN_WEAPON,looping:true); return ResolveState(null); } IMPA ABCDEFGH 2; Goto AltHold; AltHold: IMPA IJKLMNOP 2; Goto AltRelease; AltRelease: IMPA Q 0 { A_Overlay(-3,"GemAltRelease"); A_Overlay(-2,"ZapAltRelease"); A_PlaySound("impaler/gem",CHAN_WEAPON,looping:true); } IMPA QRSTUVWX 2; Goto Idle; Reload: IMPG A 0 { A_Overlay(-9999,"Null"); invoker.HasGem = !invoker.HasGem; if ( invoker.HasGem ) { let weap = Weapon(invoker); if ( invoker.ClipCount < 0 ) { weap.DepleteAmmo(false,true,1); invoker.ClipCount = invoker.default.ClipCount; } A_Overlay(-3,"GemUp"); A_Overlay(-2,"ZapUp"); A_OverlayFlags(-2,PSPF_RenderStyle|PSPF_Alpha,true); A_OverlayRenderStyle(-2,STYLE_Add); A_PlaySound("impaler/gem",CHAN_WEAPON,looping:true); } else { A_Overlay(-3,"GemDown"); A_Overlay(-2,"ZapDown"); A_PlaySound("impaler/gemdown",CHAN_WEAPON); } if ( self is 'UTPlayer' ) UTPlayer(self).PlayReloading(); } IMPG ABCDE 2; Goto Idle; Deselect: IMPD A 0 A_Overlay(-9999,"Null"); IMPD A 0 A_JumpIf(!invoker.HasGem,"FullDeselect"); IMPG A 0 { invoker.HasGem = false; A_Overlay(-3,"GemDown"); A_Overlay(-2,"ZapDown"); A_PlaySound("impaler/gemdown",CHAN_WEAPON); } IMPG ABCDE 2; Goto FullDeselect; FullDeselect: IMPD ABCDEF 2; IMPD F 1 A_Lower(int.max); Wait; GemUp: IMGS ABCDE 2; Goto GemIdle; GemIdle: IMGI ABCDEFGH 10; Loop; GemDown: IMGD ABCDE 2; Stop; GemAltFire: IMGA ABCDEFGH 2; Goto GemAltHold; GemAltHold: IMGA IJKLMNOP 2; Loop; GemAltRelease: IMGA QRSTUVWX 2; Goto GemIdle; ZapUp: IMZS ABCDE 2 Bright; Goto ZapIdle; ZapIdle: IMZI ABCDEFGH 10 Bright; Loop; ZapDown: IMZD ABCDE 2 Bright; Stop; ZapAltFire: IMZA ABCDEFGH 2 Bright; Goto ZapAltHold; ZapAltHold: IMZA IJKLMNOP 2 Bright; Loop; ZapAltRelease: IMZA QRSTUVWX 2 Bright; Goto ZapIdle; } }