actor RocketGrabWep_NormalBar : NormalBar { args 230, 234 }
actor RocketGrabWep_ScriptBar : ScriptBar {}

actor RocketGrabWep : BaseMM8BDMWep
{
	Weapon.AmmoUse 7
	Weapon.AmmoGive 28
	weapon.ammotype "RocketGrabAmmo"

	Weapon.SlotNumber 2

	Inventory.Pickupmessage "$PU_ROCKETGRAB"
	Obituary "$OB_ROCKETGRAB_FIST"
	Tag "$TAG_ROCKETGRAB"

	inventory.icon "HEXTCHIC"

	States
	{
		SpawnLoop:
			HXTH M 1
			loop

		Ready:
			HXTH C 0 ACS_NamedExecuteWithResult("core_weaponcolor", CLR_ROCKETGRAB)
			HXTH C 0 A_JumpIfInventory("RocketGrabCooldownFlag", 1, "ReadyCooldown")
			HXTH C 1 A_WeaponReady
			goto Ready+1
		ReadyCooldown:
			HXTH C 1 A_WeaponReady(WRF_NOFIRE)
			goto Ready+1

		Select:
			HXTH C 0
			goto SelectSwap
		Deselect:
			HXTH C 0
			goto DeselectSwap

		Fire:
			HXTH C 0 A_JumpIfNoAmmo("NoAmmo")
			HXTH EF 1
			HXTH C 0 A_PlaySoundEx("weapons/mm2/crashbombfire","Weapon")
			HXTH C 0 A_FireCustomMissile("RocketGrabHook", 0, 1, 8, 0)
		FireWait:
			HXTH G 1
			HXTH G 0 A_JumpIfInventory("RocketGrabDelay", 1, "FireWait")
			HXTH G 1 A_JumpIf(true, "FireExit")
			wait
		FireExit:
			HXTH D 0 A_PlaySoundEx("weapons/busters/duofistreturn","Weapon")
			HXTH DCC 4
			HXTH C 0 A_GiveInventory("RocketGrabCooldownFlag", 1)
			HXTH C 0 A_SpawnItemEx("RocketGrabCooldowner")
			goto Ready+1
			
		Flash:
			HXTH H 0 A_GiveInventory("PowerFistCharge", 1)
			HXTH H 1 A_JumpIfInventory("PowerFistCharge", 18, "FlashCharged")
			HXTH H 0 A_JumpIfInventory("RocketGrabDelay", 1, "Flash")
			HXTH H 1 A_JumpIf(true, "FlashEnd")
			wait
		FlashCharged:
			HXTH H 0 A_PlaySoundEx("weapons/mmv/electricshockfire", "SoundSlot7")
		FlashChargedLoop:
			HXTH I 0 A_GiveInventory("PowerFistCharge", 1)
			HXTH I 1 ACS_NamedExecuteWithResult("core_chargecolor", CLR_ROCKETGRAB_CHARGED, TCLR_CHARGE1)
			HXTH I 0 A_JumpIfInventory("RocketGrabDelay", 1, 2)
			HXTH I 1 A_JumpIf(true, "FlashEndStrong1")
			wait
			HXTH H 0 A_GiveInventory("PowerFistCharge", 1)
			HXTH H 1 ACS_NamedExecuteWithResult("core_chargecolor", CLR_ROCKETGRAB)
			HXTH H 0 A_JumpIfInventory("RocketGrabDelay", 1, "FlashChargedLoop")
			HXTH H 1 A_JumpIf(true, "FlashEndStrong2")
			wait
		FlashEnd:
			HXTH JJK 1
			HXTH L 0 ACS_NamedExecuteWithResult("core_chargecolor", CLR_ROCKETGRAB)
			HXTH L 0 A_TakeInventory("PowerFistCharge", 999)
			HXTH L 0 A_FireCustomMissile("PowerFistPunchWeak", 0, 0, -8, 0)
			HXTH L 0 A_Quake(2, 14, 0, 128, "none")
			HXTH L 0 A_PlaySoundEx("weapons/mm5/napalmbombexplode", "SoundSlot7")
			HXTH L 35
			HXTH KJH 4
			stop
		FlashEndStrong1:
			HXTH J 1 ACS_NamedExecuteWithResult("core_chargecolor", CLR_ROCKETGRAB)
			HXTH J 1 ACS_NamedExecuteWithResult("core_chargecolor", CLR_ROCKETGRAB_CHARGED, TCLR_CHARGE1)
			HXTH K 1 ACS_NamedExecuteWithResult("core_chargecolor", CLR_ROCKETGRAB)
			goto FlashEndStrong
		FlashEndStrong2:
			HXTH J 1 ACS_NamedExecuteWithResult("core_chargecolor", CLR_ROCKETGRAB_CHARGED, TCLR_CHARGE1)
			HXTH J 1 ACS_NamedExecuteWithResult("core_chargecolor", CLR_ROCKETGRAB)
			HXTH K 1 ACS_NamedExecuteWithResult("core_chargecolor", CLR_ROCKETGRAB_CHARGED, TCLR_CHARGE1)
			goto FlashEndStrong
		FlashEndStrong:
			HXTH L 0 ACS_NamedExecuteWithResult("core_chargecolor", CLR_ROCKETGRAB)
			HXTH L 0 A_TakeInventory("PowerFistCharge", 999)
			HXTH L 0 A_FireCustomMissile("PowerFistPunch", 0, 0, -8, 0)
			HXTH L 0 A_Quake(4, 14, 0, 128, "none")
			HXTH L 0 A_PlaySoundEx("weapons/mm7/thunderboltfire","Weapon")
			HXTH L 0 A_PlaySoundEx("weapons/mm5/napalmbombexplode", "SoundSlot7")
			HXTH L 35
			HXTH KJH 4
			stop

		NoAmmo:
			HXTH C 1 ACS_NamedExecuteWithResult("core_noammo")
			goto Ready+1
	}
}

actor RocketGrabCooldownFlag : Once {}

actor RocketGrabCooldowner : BasicCooldowner
{
	reactiontime 53
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 1 A_GiveInventory("RocketGrabCooldownerFunc",1)
			loop
		Death:
			TNT1 A 0 A_TakeFromTarget("RocketGrabCooldownFlag",1)
			stop
	}
}

actor RocketGrabCooldownerFunc : BasicCooldownerFunc
{
	States
	{
		Pickup:
			TNT1 A 0 A_JumpIfInTargetInventory("RocketGrabCooldownFlag",1,"PickupBasic")
			goto PickupRemove
	}
}

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

actor RocketGrabHook : BasicProjectile
{
	+DONTBLAST
	+DONTREFLECT
	+HITTRACER
    //+SEEKERMISSILE
	
	obituary "$OB_ROCKETGRAB_GRAB"
	damagetype "RocketGrab"
	
	damage (CallACS("burst_cbm_damage",10))
	
	radius 20
	height 10
	
	speed 50
	
	reactiontime 18

	renderstyle translucent
	States
	{
		Spawn:
			HXTH A 0
			HXTH A 0 ACS_NamedExecuteWithResult("core_drawhookshot", ACS_NamedExecuteWithResult("core_gettarget"), 32, 8)
			goto Spawn2

		Spawn2:
			HXTH A 0 A_GiveToTarget("RocketGrabDelay", 1)
			HXTH A 1 A_JumpIf(!ACS_NamedExecuteWithResult("core_targetexists", false, true), "SuperDeath")
			HXTH A 0 A_CountDown
			loop

		Death:
			HXTH A 0 A_JumpIfCloser(64, "SuperDeath")
		XDeath:
		Crash:
			HXTH A 0 A_JumpIf(reactiontime == 0, "Retract")
			HXTH A 0 A_JumpIf(IsPointerEqual(AAPTR_TRACER, AAPTR_NULL), "Retract")
			HXTH A 0 A_GiveInventory("TracerAndTargetTeamsMatchCheck",1)
			HXTH A 0 A_JumpIfInventory("TracerAndTargetTeamsMatchFlag", 1, "Retract")
			HXTH A 0 A_CheckFlag("INVULNERABLE", "Retract", AAPTR_TRACER)
			HXTH A 0 A_JumpIfInventory("PlayerPropertyInvulnerable", 1, "Retract", AAPTR_TRACER)
			HXTH A 0 A_JumpIfInventory("NoPushFlag", 1, "Retract", AAPTR_TRACER)
			HXTH A 0 A_JumpIf(CallACS("core_gethealth", AAPTR_TRACER) <= 0, 3)
			HXTH A 0 A_JumpIfInventory("RocketGrabbed", 1, 2, AAPTR_TRACER)
			HXTH A 0 A_JumpIfInventory("MM8BDMPlayer", 1, "Yanking", AAPTR_TRACER)
			HXTH A 0
			goto Retract
		Yanking:
			HXTH A 0 A_JumpIf(!ACS_NamedExecuteWithResult("core_targetexists", false, true), "SuperDeath")
			HXTH A 0 A_GiveToTarget("PowerFistActivate", 1)
			HXTH A 0 A_GiveInventory("RocketGrabbed", 1, AAPTR_TRACER)
			HXTH A 0 ACS_NamedExecuteWithResult("core_freezeplayer", (CallACS("core_getptrtid", AAPTR_TRACER) - 1000) + 1, true) 
			HXTH A 0 ACS_NamedExecuteWithResult("burst_rocket_grab_camera_look", CallACS("core_getptrtid", AAPTR_TRACER))
			
			HXTH A 0 A_JumpIf(!ACS_NamedExecuteWithResult("core_targetexists", true, true), "SuperDeath")
			HXTH A 0 A_JumpIf(!ACS_NamedExecuteWithResult("core_targetexists", false, true), "YankEnd")
			HXTH A 0 A_JumpIfInTargetInventory("PowerFistCharge", 0, "YankEnd")
			HXTH A 0 A_JumpIfCloser(64, "YankEnd")
			HXTH A 0 A_Warp(AAPTR_TRACER, -12, 0, 32, 0, WARPF_USECALLERANGLE|WARPF_INTERPOLATE|WARPF_NOCHECKPOSITION)
			HXTH A 0 A_GiveInventory("RocketGrabbed", 1, AAPTR_TRACER)
			HXTH A 0 A_GiveToTarget("RocketGrabDelay", 1)
			HXTH A 1 A_JumpIf(!ACS_NamedExecuteWithResult("burst_rocket_grab_hookshot", AAPTR_TRACER, AAPTR_TARGET, 30), "YankEnd")
			goto Yanking+5
		YankEnd:
			HXTH A 0 ACS_NamedExecuteWithResult("core_freezeplayer", (CallACS("core_getptrtid", AAPTR_TRACER) - 1000) + 1, false) 
			HXTH A 0 A_TakeInventory("RocketGrabbed", 999, AAPTR_TRACER)
			HXTH A 0 A_GiveInventory("RocketGrabStop", 1, AAPTR_TRACER)
			HXTH A 0 A_JumpIfInTargetInventory("PowerFistCharge", 0, "Retract")
			goto SuperDeath
			
		Retract:
			HXTH B 0 A_ChangeFlag(SEEKERMISSILE, true)
			HXTH B 0 A_ChangeFlag(NOINTERACTION, true)
			HXTH B 0 A_ChangeFlag(NOCLIP, true)
			HXTH B 0 A_RearrangePointers(AAPTR_DEFAULT, AAPTR_DEFAULT, AAPTR_TARGET)
		Retracting:
			HXTH B 0 A_JumpIf(!ACS_NamedExecuteWithResult("core_targetexists", false, true), "SuperDeath")
			HXTH B 0 A_JumpIfCloser(64, "SuperDeath")
			HXTH BBBB 0 A_SeekerMissile(90, 90, SMF_PRECISE)
			HXTH B 1 A_GiveToTarget("RocketGrabDelay", 1)
			loop
			
		SuperDeath:
			HXTH B 0 A_TakeFromTarget("RocketGrabDelay", 999)
			stop
	}
}

actor RocketGrabDelay : PowerSlow
{
	+POWERSPEED.NOTRAIL
	speed 0.25
	powerup.duration 3
}

actor RocketGrabbed : PowerUp
{
	powerup.duration 3
}

actor RocketGrabStop : CustomInventory
{
	States
	{
		Pickup:
			TNT1 A 0 A_Stop
			stop
	}
}

actor RocketGrabHookFX : BasicGraphicEffect
{
	+NOTIMEFREEZE
	States
	{
		SpawnFrame:
			GIGF B 1
			stop
	}
}

actor PowerFistActivate : CustomInventory
{
	States
	{
		Pickup:
			TNT1 A 0 A_GunFlash
			stop
	}
}

actor PowerFistCharge : Inventory
{
	inventory.amount 1
	inventory.maxamount 70
}

actor PowerFistPunch : BasicProjectile
{
	+DONTBLAST
	+DONTREFLECT
	
	damagetype "PowerFist"
	Obituary "$OB_ROCKETGRAB_FIST"
	damage (CallACS("burst_cbm_damage",65))
	
	Radius 20
	Height 20
	
	speed 60
	reactiontime 1
	
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 1 A_CountDown
			wait
		Death:
			MMFX B 0 A_Explode(CallACS("burst_cbm_damage",55),40,0,0,20)
		XDeath:
			MMFX B 0 A_Stop
			MMFX BCDE 2
			stop
	}
}

actor PowerFistShocked : PowerSpeed
{
	powerup.duration 35
	speed 0.0
}

actor PowerFistShockFX : BasicGraphicEffect
{
	+BRIGHT
    States
    {
		SpawnFrame:
			SPAS FFGGFFGGFFGGFFGGFFGGFFGGFFGG 1 A_Warp(AAPTR_TARGET, 6, 0, 32, 0, WARPF_INTERPOLATE)
			stop
    }
}

actor PowerFistPunchWeak : PowerFistPunch
{
	damagetype "PowerFistWeak"
	damage (CallACS("burst_cbm_damage",45))
	
	States
	{
		Death:
			MMFX B 0 A_Explode(CallACS("burst_cbm_damage",35),40,0,0,20)
		XDeath:
			MMFX B 0 A_Stop
			MMFX BCDE 2
			stop
	}
}