Class Tier4Ammo : RandomSpawner2 replaces ClipBox { Default { DropItem "PulseAmmo", 255, 1; DropItem "RipperAmmo", 255, 1; } } Class Tier4Weapon : RandomSpawner2 replaces Chaingun { Default { DropItem "PulseGun", 255, 1; DropItem "Ripper2", 255, 1; } } Class PulseAmmo : Ammo { Default { Tag "Pulse Cell"; Inventory.PickupMessage "You picked up a Pulse Cell."; Inventory.Amount 25; Inventory.MaxAmount 199; Ammo.BackpackAmount 50; Ammo.BackpackMaxAmount 199; Ammo.DropAmount 10; } States { Spawn: PAMO A -1; Stop; } } Class PulseBallLight : DynamicLight { double pulseofs; Default { DynamicLight.Type "Point"; Args 64,255,0,10; } override void PostBeginPlay() { Super.PostBeginPlay(); pulseofs = FRandom[Pulse](0,360); } override void Tick() { Super.Tick(); if ( !target || target.InStateSequence(target.CurState,target.ResolveState("Death")) ) { Destroy(); return; } SetOrigin(target.pos,true); args[LIGHT_INTENSITY] = 10+sin(gametic*80+pulseofs)*5; } } Class PulseExplLight : DynamicLight { double lifetime; Default { DynamicLight.Type "Point"; ReactionTime 20; Args 64,255,0,30; } override void PostBeginPlay() { Super.PostBeginPlay(); lifetime = 1.0; } override void Tick() { Super.Tick(); if ( globalfreeze || level.frozen ) return; args[LIGHT_RED] = 64*lifetime; args[LIGHT_GREEN] = 255*lifetime; lifetime -= 1./ReactionTime; if ( lifetime <= 0 ) Destroy(); } } Class PulseBall : Actor { Default { Obituary "%o ate %k's burning plasma death."; DamageType 'Pulsed'; RenderStyle "Add"; DamageFunction Random[Pulse](15,25); PROJECTILE; Scale 0.2; Speed 30; Radius 2; Height 2; } override void PostBeginPlay() { A_PlaySound("pulse/fly",CHAN_BODY,0.8,true,8.0); let l = Spawn("PulseBallLight",pos); l.target = self; } action void A_BallExp() { A_SetScale(0.45); A_PlaySound("pulse/hit",CHAN_BODY); A_SprayDecal("BoltScorch"); Spawn("PulseExplLight",pos); int numpt = Random[Pulse](20,40); for ( int i=0; i 0.22 ) { t.Results.HitActor.DamageMobj(self,target,Random[Pulse](65,75)*accdamage,'zapped'); accdamage = 0; } } Vector3 origin = Level.Vec3Diff(pos,t.Results.HitPos); int numpt = Random[Pulse](10,20)*!Random[Pulse](0,2); for ( int i=0; i= 19 ) { int numpt = Random[Pulse](5,10)*!Random[Pulse](0,5); for ( int i=0; i 4 ) frame = 0; CheckBeam(x); } } Class PulseGun : UTWeapon { int clipcount; double sangle; Actor beam; Property ClipCount : clipcount; override void PostRender( double lbottom ) { if ( !CVar.GetCVar('flak_pulsereload').GetBool() ) return; Screen.DrawText(confont,Font.CR_GREEN,Screen.GetWidth()*0.01,lbottom-Screen.GetHeight()*0.01-confont.GetHeight(),String.Format("Clip: %2d / 50",clipcount)); } action void A_Reloading() { Weapon weap = Weapon(invoker); if ( !weap ) return; invoker.clipcount = Min(50,weap.Ammo1.Amount); A_PlaySound("pulse/reload",CHAN_WEAPON); } action void A_DrainAmmo() { Weapon weap = Weapon(invoker); if ( !weap ) return; if ( weap.Ammo1.Amount <= 0 ) return; if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return; invoker.clipcount--; if ( !CVar.GetCVar('flak_pulsereload').GetBool() && (invoker.clipcount <= 0) ) invoker.clipcount = Min(50,weap.Ammo1.Amount); invoker.FireEffect(); UTMainHandler.DoFlash(self,Color(32,128,255,128),1); A_AlertMonsters(); Vector3 x, y, z; [x, y, z] = Matrix4.GetAxes(pitch,angle,roll); Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+4.5*y-1.9*z; int numpt = Random[Pulse](2,5); for ( int i=0; i 0) ) return A_Jump(255,"Reload"); A_WeaponReady(WRF_ALLOWRELOAD); } else A_WeaponReady(); return A_JumpIf(!Random[Pulse](0,300),1); } Wait; PGNI ABCDEFGHIJKLMNOPQRSTUVWXYZ 1 { A_CheckReload(); A_WeaponReady(WRF_ALLOWRELOAD); } Goto Idle; Fire: PGNI A 0 A_PlaySound("pulse/fire",CHAN_WEAPON,1.0,true); Hold: PGNF A 1 A_PulseFire(); PGNF BCDEF 1; PNGF G 0 A_PulseRefire(1); Goto Release; PGNF G 1 A_PulseFire(); PGNF HIJKL 1; PNGF M 0 A_PulseRefire(1); Goto Release; PGNF N 1 A_PulseFire(); PGNF OPQRS 1; PNGF T 0 A_PulseRefire(1); Goto Release; PGNF U 1 A_PulseFire(); PGNF VWXYZ 1; PGF2 A 0 A_PulseRefire(1); Goto Release; PGF2 A 1 A_PulseFire(); PGF2 BCDEF 1; PGF2 G 0 A_PulseRefire(1); Goto Release; PGF2 H 1 A_PulseFire(); PGF2 IJKLM 1; PGF2 N 0 A_PulseRefire(); Goto Release; Release: PGNC A 0 A_PlaySound("pulse/down",CHAN_WEAPON); PGNC ABCDEFGHIJKLMNOPQRSTUVWXY 1; PGNC Y 0; Goto Idle; AltFire: PGBS ABCDE 1; PGBL A 0 A_StartBeam(); AltHold: PGBL A 1 A_DrainAmmo(); PGBL B 0 A_PulseRefire(1); Goto AltRelease; PGBL B 1; PGBL C 0 A_PulseRefire(1); Goto AltRelease; PGBL C 1; PGBL D 0 A_PulseRefire(1); Goto AltRelease; PGBL D 1; PGBL E 0 A_PulseRefire(1); Goto AltRelease; PGBL E 1; PGBL F 0 A_PulseRefire(1); Goto AltRelease; PGBL F 1; PGBL G 0 A_PulseRefire(1); Goto AltRelease; PGBL G 1; PGBL H 0 A_PulseRefire(1); Goto AltRelease; PGBL H 1; PGBL I 0 A_PulseRefire(1); Goto AltRelease; PGBL I 1; PGBL J 0 A_PulseRefire(1); Goto AltRelease; PGBL J 1; PGBL A 0 A_PulseRefire(); AltRelease: PGBE A 0 A_StopBeam(); PGBE ABCDE 1; Goto Idle; Reload: PGNI A 1; PGNI A 0 A_JumpIf(invoker.clipcount >= Min(50,invoker.Ammo1.Amount),"Idle"); PGNR A 1 A_Reloading(); PGNR BCDEFGHIJKLMNOPQRSTUVWXYZ 1; PGR2 ABCDEFGHIJKLMNOPQRSTUVWX 1; Goto Idle; Deselect: PGNS W 1 A_StopSound(CHAN_WEAPON); PGNS VTSQPNMKJHGEDBA 1; PGNS A 1 A_Lower(int.max); Wait; Select: PGNS A 1 A_Raise(int.max); Wait; MuzzleFlash: PMUZ A 2 Bright; Stop; } }