const int NBEAM_RANGE = 132;

actor NovaBeamWep_NormalBar : NormalBar{args 215, 227}
actor NovaBeamWep : BaseMM8BDMWep
{
Weapon.AmmoUse 48
Weapon.AmmoGive 120
Weapon.SlotNumber 2
tag "$TAG_NOVABEAM"
Obituary "$OB_NOVABEAM"
Inventory.Pickupmessage "$PU_NOVABEAM"
weapon.ammotype "NovaBeamAmmo"
inventory.icon "NVBMICON"
States
{
SpawnLoop:
NVBM Z -1
loop
Ready:
NVBM A 0 ACS_NamedExecuteWithResult("core_weaponcolor",CLR_NOVABEAM)
ReadyC:
NVBM A 1 A_WeaponReady
Goto Ready+1
Deselect:
NVBM A 0 
goto DeselectSwap
Select:
NVBM A 0 
goto SelectSwap
NoAmmo:
NVBM A 1 ACS_NamedExecuteAlways("core_noammo",0)
Goto Ready+1
Fire:
NVBM A 1 A_JumpIfNoAmmo("NoAmmo")
NVBM B 0 A_ChangeVelocity(0, 0, 0, CVF_RELATIVE|CVF_REPLACE)
NVBM B 0 ACS_NamedExecuteAlways("core_freezeplayer",0,0,1)
NVBM B 0 ACS_NamedExecuteAlways("core_flyplayer",0,0,1)
NVBM B 4 A_PlaySoundEx("weapon/ultrabeamcharge","Weapon")
NVBM B 0 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM B 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
NVBM B 0 A_FireCustomMissile("NovaBeamSparkerFXStart",0,0,0)
NVBM B 3 ACS_NamedExecuteAlways("Vile_StateChange",0,2)
NVBM B 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM B 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
NVBM C 3 ACS_NamedExecuteAlways("Vile_StateChange",0,2)
NVBM C 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
NVBM C 0 A_FireCustomMissile("NovaBeamSparkerFXStart",0,0,0)
NVBM C 3 ACS_NamedExecuteAlways("Vile_stateChange",0,2)
NVBM C 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
NVBM C 3 ACS_NamedExecuteAlways("Vile_stateChange",0,2)
NVBM C 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
/*
NVBM C 0 A_FireCustomMissile("NovaBeamSparkerFXStart",0,0,0)
NVBM C 3 ACS_NamedExecuteAlways("Vile_stateChange",0,2)
NVBM C 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
NVBM C 3 ACS_NamedExecuteAlways("Vile_stateChange",0,2)
NVBM C 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
NVBM C 0 A_FireCustomMissile("NovaBeamSparkerFXStart",0,0,0)
NVBM C 3 ACS_NamedExecuteAlways("Vile_stateChange",0,2)
NVBM C 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
NVBM C 3 ACS_NamedExecuteAlways("Vile_stateChange",0,2)
NVBM C 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
NVBM C 0 A_FireCustomMissile("NovaBeamSparkerFXStart",0,0,0)
NVBM C 3 ACS_NamedExecuteAlways("Vile_stateChange",0,2)
NVBM C 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
NVBM C 3 ACS_NamedExecuteAlways("Vile_stateChange",0,2)
NVBM C 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
NVBM C 0 A_FireCustomMissile("NovaBeamSparkerFXStart",0,0,0)
NVBM C 3 ACS_NamedExecuteAlways("Vile_stateChange",0,2)
NVBM C 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
NVBM C 3 ACS_NamedExecuteAlways("Vile_stateChange",0,2)
NVBM C 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
*/
NVBM C 0 A_FireCustomMissile("NovaBeamSparkerFXStart",0,0,0)
NVBM C 3 ACS_NamedExecuteAlways("Vile_stateChange",0,2)
NVBM C 2 A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 1 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEnd")
goto FireLoop
FireLoop:
NVBM D 0 A_JumpIfInventory("NovaBeamAmmo",1,1)
goto FireEndOfLoop
NVBM D 0 ACS_NamedExecuteAlways("Vile_StateChange",0,2)
NVBM D 0 A_Stop
NVBM D 0 A_PlaySoundEx("weapon/sunstarbeamloop","Weapon")
NVBM D 0 A_FireCustomMissile("NovaBeamDamager",0,0,0,0)
NVBM D 0 A_GiveInventory("TakeNovaBeamAmmo1",1)
NVBM D 1 Offset(3,0)A_FireCustomMissile("NovaBeamStart",0,0,0)
NVBM C 1 Offset(-3,0)A_GiveInventory("Enc_ButtonCheckSync_P")
NVBM C 0 A_JumpIf((CallACS("Enc_ButtonCheck",ENC_BT_ATTACK,0,192)==0),"FireEndOfLoop")
NVBM C 1
goto FireLoop
FireEnd:
NVBM C 0 A_StopSoundEx("Weapon")
NVBM D 0 ACS_NamedExecuteAlways("core_freezeplayer",0,0,0)
NVBM D 0 ACS_NamedExecuteAlways("core_flyplayer",0,0,0)
NVBM D 0 A_GiveInventory("TakeNovaBeamAmmo2",1)
NVBM B 8
NVBM A 28
Goto Ready+1
FireEndOfLoop:
NVBM C 0 A_StopSoundEx("Weapon")
NVBM D 0 A_PlaySoundEx("weapon/ultrabeam","Weapon")
NVBM D 0 ACS_NamedExecuteAlways("core_freezeplayer",0,0,0)
NVBM D 0 ACS_NamedExecuteAlways("core_flyplayer",0,0,0)
NVBM D 0 A_FireCustomMissile("NovaBeamSparkerFXStart",0,0,0)
NVBM D 0 A_GiveInventory("TakeNovaBeamAmmo2",1)
NVBM DDDDDD 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
NVBM C 2
NVBM DCB 3
NVBM A 18
goto Ready+1
}
}

actor NovaBeamAmmo : Ammo
{
inventory.amount 1
inventory.maxamount 120
+INVENTORY.IGNORESKILL
}

//
// Beam
//
actor NovaBeamDamager
{
PROJECTILE
Obituary "$OB_NOVABEAM"
DamageType "NovaBeam"
+THRUACTORS//+NOINTERACTION
+DONTBLAST
+DONTREFLECT
+SERVERSIDEONLY
renderstyle none
damage (0)
Radius 8
Height 8
speed 34
states
{
Spawn:
TNT1 A 0
TNT1 A 0 A_SetPitch(pitch+1)
TNT1 A 0 A_JumpIf(pitch>NBEAM_RANGE,"Death")
TNT1 A 0 A_SpawnItemEx("NovaBeamDamager",0,0,0,momx,momy,momz,0,552)
TNT1 A 0 A_Stop
TNT1 A 1 A_Explode(CallACS("vile_cbm_damage",8),48,0,0,48)
stop
Death:
TNT1 A 0 A_Quake(3,5,0,125)
TNT1 A 0 A_SpawnItemEx("ExplosionEffect1",random(-32,32),random(-64,64),random(-50,50),0,0,0,0,1)
TNT1 A 3 A_PlaySoundEx("weapon/coilexplode","Voice")
stop
}
}

actor NovaBeamFX : BasicGraphicEffect
{
PROJECTILE
+THRUACTORS
+DONTBLAST
+DONTREFLECT
+CLIENTSIDEONLY
-NOINTERACTION
+PAINLESS
+BRIGHT
damage (0)
Radius 11
Height 11
speed 30
scale 2.5
states
{
SpawnFrame:
TNT1 A 0
TNT1 A 0 A_SetPitch(pitch+1)
TNT1 A 0 A_JumpIf(pitch>NBEAM_RANGE,"EndOfTheLaser")
TNT1 A 0 A_SpawnItemEx("NovaBeamFX",0,0,0,momx,momy,momz,0,553)
TNT1 A 0 A_SpawnItemEx("NovaBeamFXSpawned",0,0,0,momx,momy,momz,0,553)
TNT1 A 1
stop
Death:
EndOfTheLaser:
TNT1 A 0 A_Quake(3,5,0,125)
TNT1 AAAAAA 0 A_SpawnItemEx("ExplosionEffect1",random(-64,64),random(-64,64),random(-50,50),0,0,0,0,1)
TNT1 A 1 A_PlaySoundEx("weapon/coilexplode","Voice")
stop

}
}


actor NovaBeamFXSpawned : NovaBeamFX
{
renderstyle normal
states
{
SpawnFrame:
TNT1 A 0 
TNT1 A 0 A_JumpIf(pitch>NBEAM_RANGE,"Death")
TNT1 A 0 A_JumpIf(pitch>2,"SpawnFrame2")
NVBM MNMN 1 A_Stop
SpawnFrame2:
NVBM OPOP 1 A_Stop
stop
Death:
TNT1 A 0 A_Quake(3,5,0,125)
TNT1 A 0 A_SpawnItemEx("ExplosionEffect1",random(-32,32),random(-64,64),random(-50,50),0,0,0,0,1)
TNT1 A 0 A_PlaySoundEx("weapon/coilexplode","Voice")
Death2:
TNT1 A 0
stop
}
}

actor NovaBeamStart : ProjSpawnFuncActor
{
PROJECTILE
+NOINTERACTION //STOP THAT.
+NOCLIP //STOP.
+THRUACTORS
Speed 17
states
{
Spawn:
TNT1 A 0
TNT1 A 2 A_SpawnItemEx("NovaBeamFX",0,0,0,momx*2,momy*2,momz*2,0,SXF_AbsoluteVelocity)
stop
}
}

//
// Sparks
//

actor NovaBeamSparkerFX : BasicGraphicEffect
{
PROJECTILE
+THRUACTORS
+DONTBLAST
+DONTREFLECT
+CLIENTSIDEONLY
+PAINLESS
-NOINTERACTION
+BRIGHT
damage (0)
Radius 11
Height 11
speed 30
scale 2.5
states
{
SpawnFrame:
TNT1 A 0
TNT1 A 0 A_SetPitch(pitch+1)
TNT1 A 0 A_JumpIf(pitch>NBEAM_RANGE,"Death")
TNT1 A 0 A_SpawnItemEx("NovaBeamSparkerFX",0,0,0,momx,momy,momz,0,553)
TNT1 A 0 A_SpawnItemEx("NovaBeamSparkFX",random(-16,16),random(-52,52),random(-38,38),momx/4,momy/4,momz/4,0,553)
TNT1 A 1
stop
Death:
TNT1 A 1
stop

}
}

actor NovaBeamSparkFX : BasicGraphicEffect
{
PROJECTILE
Renderstyle Add
Alpha 0.7
Scale 2.5
states
{
SpawnFrame:
S_UN J 0
S_UN JIHGFE 3
stop
}
}

actor NovaBeamSparkerFXStart : NovaBeamStart
{
states
{
Spawn:
TNT1 A 0
TNT1 A 2 A_SpawnItemEx("NovaBeamSparkerFX",0,0,0,momx,momy,momz,0,SXF_AbsoluteVelocity)
stop
}
}

actor TakeNovaBeamAmmo1 : CustomInventory
{
states
{
Pickup:
TNT1 A 0 A_TakeInventory("NovaBeamAmmo", 4, TIF_NOTAKEINFINITE)
stop
}
}

actor TakeNovaBeamAmmo2 : CustomInventory
{
states
{
Pickup:
TNT1 A 0 A_TakeInventory("NovaBeamAmmo", 48, TIF_NOTAKEINFINITE)
stop
}
}