actor ShieldSpiralWep_NormalBar : NormalBar {args 4,93}
actor ShieldSpiralWep_ScriptBar : ScriptBar {}
actor ShieldSpiralWep : BaseMM8BDMWep
{
    Weapon.AmmoUse 4
    Weapon.AmmoGive 28
    Weapon.SlotNumber 7
    Inventory.Pickupmessage "$PU_SHIELDSPIRAL"
	Obituary "$OB_SHIELDSPIRAL"
    Tag "$TAG_SHIELDSPIRAL"
    weapon.ammotype "ShieldSpiralAmmo"
    inventory.icon "SSPIICON"
    States
    {
    SpawnLoop:
		SSPI Z -1
		loop
    Ready:
		SSPI I 0 ACS_NamedExecuteWithResult("core_weaponcolor",COLOR_SHIELDSPIRAL)
		SSPI I 1 A_WeaponReady
		Goto Ready+1
		ReadyC: Goto Ready+1
	Deselect:
		SSPI I 0 
		SSPI I 0 A_JumpIfInventory("ShieldSpiralFlag", 1, "DetonateSwap")
		goto DeselectSwap
	DetonateSwap:
		SSPI I 0 A_PlaySoundEx("weapon/blackholestart","Weapon")
		SSPI I 0 A_GiveInventory("ShieldSpiralTrigger", 1)
		SSPI I 0 A_TakeInventory("ShieldCheck", 1)
		SSPI I 0 
		SSPI I 0 A_TakeInventory("ShieldSpiralAmmo", 4,TIF_NOTAKEINFINITE)
		SSPI QR 1
		SSPI S 5
		SSPI RQ 1
		SSPI I 0 A_TakeInventory("ShieldSpiralTrigger",1)
		SSPI I 5 A_TakeInventory("ShieldSpiralFlag", 1)
		goto DeselectSwap
	Select:
		SSPI I 0
		goto SelectSwap
    Fire:
		SSPI I 0 A_JumpIfInventory("IsBot", 1, "BotCheck")
		SSPI I 0 A_JumpIfInventory("ShieldSpiralFlag", 1, "Detonate")
		SSPI I 0 A_JumpIfNoAmmo("NoAmmo")
		SSPI I 0 A_JumpIfInventory("ShieldSpiralTrigger", 1, "NoAmmo")
		TNT1 A 2
		SSPI LM 1
		SSPI I 0 A_PlaySoundEx("weapon/blackholestart","Weapon")
		SSPI I 0 A_GiveInventory("ShieldCheck", 1)
		SSPI I 0 A_GiveInventory("ShieldSpiralFlag", 1)
		SSPI A 0 A_GiveInventory("SpawnShieldSpiral",1)
		SSPI NOP 1
		TNT1 A 2
		SSPI JK 2
		goto Ready+1
	Altfire:
		SSPI I 0 A_JumpIfInventory("ShieldCheck",1,"Detonate")
		goto Super::Altfire
    Detonate:
		SSPI I 0 A_PlaySoundEx("weapon/blackholestart","Weapon")
		SSPI I 0 A_GiveInventory("ShieldSpiralTrigger", 1)
		SSPI I 0 A_TakeInventory("ShieldCheck", 1)
		SSPI I 0 
		SSPI I 0 A_TakeInventory("ShieldSpiralAmmo", 4,TIF_NOTAKEINFINITE)
		SSPI QR 1
		SSPI S 10 
		SSPI RQ 1
		SSPI I 0 A_TakeInventory("ShieldSpiralTrigger",1)
		SSPI I 10 A_TakeInventory("ShieldSpiralFlag", 1)
		SSPI I 0 A_ClearRefire
		goto Ready+1
    NoAmmo:
		SSPI I 1 ACS_NamedExecuteAlways("core_noammo",0)
		Goto Ready+1
	BotCheck:
	SCLA A 0 A_JumpIfInventory("ShieldCheck",1,1)
	goto Fire+1
	SCLA A 0 A_JumpIf(ACS_ExecuteWithResult(247, 0, 115, 0)>0, 2)
	SCLA A 0 A_ChangeVelocity(10,0,momz,CVF_RELATIVE|CVF_REPLACE)
	Goto Ready+1
	SCLA A 1
	goto Ready+1
    }
}

actor SpawnShieldSpiral : Custominventory
{
    States
    {
    Pickup:
        TNT1 A 0 A_JumpIfInventory("PowerSpreadRune", 1, "PickupSpread")
        TNT1 A 0 A_SpawnItemEx("ShieldSpiralSpawner", 0, 0, 32, 0, 0, 0, 0)
        stop
    PickupSpread:
		TNT1 A 0 A_SpawnItemEx("ShieldSpiralSpawner", 0, 0, 32, 0, 0, 0, 0)
        TNT1 A 0 A_SpawnItemEx("ShieldSpiralSpawner_S", 0, 0, 32, 0, 0, 0, 45)
        stop
    }
}

actor ShieldSpiralAmmo : Ammo
{
    inventory.amount 1
    inventory.maxamount 28
    +INVENTORY.IGNORESKILL
}

actor ShieldSpiralFlag : Once {}

actor ShieldSpiralTrigger : Powerup
{
    powerup.duration 17
}
const int SHIELDSPIRAL_PARTMAX = 4;
const int SHIELDSPIRAL_SPREADMAX = 12;

actor ShieldSpiralSpawner
{
    radius 1
    height 1
    +MISSILE
    +NOINTERACTION
    var int user_part;
    var int user_InFloor;
    States
    {
    Spawn:
		TNT1 A 0
		TNT1 A 0 A_RearrangePointers(AAPTR_DEFAULT, AAPTR_DEFAULT, AAPTR_TARGET)
		TNT1 A 0 A_SetUserVar(user_InFloor, (z-floorz < 32))
		TNT1 A 0 A_SpawnItemEx("ShieldSpiralCore", 0, 0, !user_InFloor * -32 + user_InFloor * -(z-floorz), 0, 0, 0, 0, SXF_TRANSFERPOINTERS)
		TNT1 A 0 A_SetUserVar(user_part, SHIELDSPIRAL_PARTMAX)
		goto SpawnWait
    SpawnWait:
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 32, 1, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("core_targetexists")==0,"End")
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralAmmo", 1, "SpawnWait")
		
    Detonate:
		TNT1 A 0 A_PlaySoundEx("weapon/blackholestart","auto")
		TNT1 I 0 A_GiveToTarget("ShieldSpiralTrigger", 1)
		TNT1 I 0 A_TakeFromTarget("ShieldCheck", 1)
		TNT1 I 0 A_TakeFromTarget("ShieldSpiralFlag", 1)
		TNT1 A 15
		TNT1 A 1
		End:
		TNT1 A 0
		stop
    }
}

actor ShieldSpiralCore
{
    +NOGRAVITY
    +ISMONSTER
    +NOTARGETSWITCH
    +THRUACTORS
    +FORCEXYBILLBOARD
    +MOVEWITHSECTOR
    +BRIGHT
    height 1
    radius 1
    maxstepheight 0
    renderstyle none
    Scale 2.5
	damagetype "Buster"
    Obituary "$OB_SHIELDSPIRAL"
    var int user_part;
    var int user_partmax;
    States
    {
    Spawn:
		TNT1 B 0
		TNT1 G 0 A_RearrangePointers(AAPTR_TRACER, AAPTR_DEFAULT, AAPTR_DEFAULT)
		TNT1 B 0 A_SetUserVar(user_partmax, 4)
		TNT1 B 0 A_SetUserVar(user_part, user_partmax)
		goto SpawnParts
    SpawnParts:
		TNT1 B 0 A_SpawnItemEx("ShieldSpiralPart", 0, 0, 0, 0, 0, 0, user_part*(360/4), SXF_SETMASTER|SXF_TRANSFERPOINTERS)
		TNT1 B 0 A_SetUserVar(user_part, user_part-1)
		TNT1 B 0 A_JumpIf(user_part<=0, "Active")
		TNT1 B 1 A_JumpIf(true, "SpawnParts")
		wait
    Active:
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION )
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_TakeFromTarget("ShieldSpiralAmmo",1)
		TNT1 A 0 A_JumpIfInTargetInventory("ShieldSpiralAmmo",1,"Active")
		//loop
    Detonate:
		TNT1 A 0 A_KillChildren
		TNT1 A 1
		stop
    End:
		TNT1 A 0
		stop
    }
}

actor ShieldSpiralSpawner_S : ShieldSpiralSpawner
{
    States
    {
    Spawn:
		TNT1 A 0
		TNT1 A 0 A_RearrangePointers(AAPTR_DEFAULT, AAPTR_DEFAULT, AAPTR_TARGET)
		TNT1 A 0 A_SetUserVar(user_InFloor, (z-floorz < 32))
		TNT1 A 0 A_SpawnItemEx("ShieldSpiralCore_S", 0, 0, !user_InFloor * -32 + user_InFloor * -(z-floorz), 0, 0, 0, 0, SXF_TRANSFERPOINTERS)
		TNT1 A 0 A_SetUserVar(user_part, SHIELDSPIRAL_SPREADMAX)
		goto SpawnWait
    }
}

actor ShieldSpiralCore_S : ShieldSpiralCore
{
    States
    {
    Active:
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 48, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		TNT1 A 1 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		TNT1 A 0 A_JumpIfInTargetInventory("ShieldSpiralAmmo",1,"Active")
		goto Detonate
    }
}

actor ShieldSpiralPart : ProjSpawnFuncActor
{
	+MISSILE
	+SHOOTABLE
	+NODAMAGETHRUST
	+NOBLOOD
	+MOVEWITHSECTOR
	+CANBOUNCEWATER
	+DONTSPLASH
	+STEPMISSILE
	+DONTREFLECT
	+NOTAUTOAIMED
	+HEXENBOUNCE
	+DONTDRAIN
	+EXPLODEONDEATH
	+NOTARGETSWITCH
	+NOGRAVITY
	+RIPPER
	+THRUSPECIES +CANTSEEK //no foolery allowed.

    +BRIGHT
    painchance 255
    maxstepheight 0
    Scale 2.5
    height 56
    radius 38
	damagetype "ShieldSpiral"
    Obituary "$OB_SHIELDSPIRAL"
    var int user_radius;
    var int user_angle;
    var int user_angleadd;
    var int user_expandtime;

    States
    {
    Spawn:
		SSPI A 0
		SSPI A 0 A_GiveInventory("MM8BDMProjSpawnFunc",1)
		SSPI A 0 A_SetUserVar(user_radius, 16)
		SSPI A 0 A_SetUserVar(user_angleadd, 0)
		SSPI A 0 A_SetUserVar(user_expandtime, 10)
		SSPI A 0 A_SetUserVar(user_angle, angle)
		goto Expand
    SpawnLoop:
		SSPI A 0 A_JumpIf(ACS_NamedExecuteWithResult("core_targetexists")==0,"End")
		SSPI A 0 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		SSPI A 0 A_Explode(CallACS("vile_cbm_damage",4),16,0,0,16)
		SSPI A 0 A_SetUserVar(user_angle, user_angle-user_angleadd)
		SSPI A 1 A_Warp(AAPTR_TARGET, cos(-user_angle)*user_radius, sin(-user_angle)*user_radius, 20, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION) 
		SSPI A 0 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		SSPI B 0 A_Explode(CallACS("vile_cbm_damage",4),16,0,0,16)
		SSPI A 0 A_SetUserVar(user_angle, user_angle-user_angleadd)
		SSPI B 1 A_Warp(AAPTR_TARGET, cos(-user_angle)*user_radius, sin(-user_angle)*user_radius, 20, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION) 
		SSPI B 0 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		SSPI C 0 A_Explode(CallACS("vile_cbm_damage",4),16,0,0,16)
		SSPI A 0 A_SetUserVar(user_angle, user_angle-user_angleadd)
		SSPI C 1 A_Warp(AAPTR_TARGET, cos(-user_angle)*user_radius, sin(-user_angle)*user_radius, 20, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION) 
		SSPI C 0 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		loop
    Expand:
		SSPI A 0 A_SetUserVar(user_angleadd, user_angleadd+1)
		SSPI A 0 A_SetUserVar(user_radius, user_radius+4)
		SSPI A 0 A_SetUserVar(user_expandtime, user_expandtime-1)
		SSPI A 1 A_Explode(CallACS("vile_cbm_damage",4),16,0,0,16)
		SSPI B 0 A_SetUserVar(user_angle, user_angle-user_angleadd)
		SSPI B 0 A_Warp(AAPTR_TARGET, cos(-user_angle)*user_radius, sin(-user_angle)*user_radius, 20, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		SSPI B 0 A_SetUserVar(user_radius, user_radius+4)
		SSPI B 1 A_Explode(CallACS("vile_cbm_damage",4),16,0,0,16)
		SSPI C 0 A_SetUserVar(user_angle, user_angle-user_angleadd)
		SSPI C 0 A_Warp(AAPTR_TARGET, cos(-user_angle)*user_radius, sin(-user_angle)*user_radius, 20, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		SSPI C 0 A_SetUserVar(user_radius, user_radius+4)
		SSPI C 1 A_Explode(CallACS("vile_cbm_damage",4),16,0,0,16)
		SSPI C 0 A_SetUserVar(user_angle, user_angle-user_angleadd)
		SSPI C 0 A_Warp(AAPTR_TARGET, cos(-user_angle)*user_radius, sin(-user_angle)*user_radius, 20, 0, WARPF_ABSOLUTEANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
		SSPI C 0 A_JumpIf(user_expandtime <= 0, "SpawnLoop")
		SSPI C 0 A_JumpIfInTargetInventory("ShieldSpiralTrigger", 1, "Detonate")
		loop
    Death:
    Detonate:
		SSPI A 0
		MMFX BCDE 2
		stop
    End:
		SSPI H 0
		stop
    }
}
