//Mobility recoded
const int WEPC_VBD_RADIUS = 24;
const int WEPC_VBD_HALFHEIGHT = 10;

actor BreakDashWep_ScriptBar : ScriptBar {}

actor BreakDashWep : BaseMM8BDMWep 10109
{
    //$Category MM8BDM-Weapons/Close
    //$Title Break Dash
    //$Sprite BDASA0
    Weapon.AmmoUse 3
    Weapon.AmmoGive 28
    Weapon.SlotNumber 4
    Inventory.Pickupmessage "$PU_BREAKDASH"
    Obituary "$OB_BREAKDASH"
    Tag "$TAG_BREAKDASH"
    weapon.ammotype "BreakDashAmmo"
    inventory.icon "BDASWI"
    States
    {
    SpawnLoop:
        BDAS A -1
        loop
		
    Ready:
		TNT1 A 0 ACS_NamedExecuteWithResult("core_weaponcolor",CLR_BREAKDASH)
		TNT1 A 0 A_JumpIfInventory("IsMegaMan",1,"ReadyMega")
		TNT1 A 0 A_JumpIfInventory("IsProtoMan",1,"ReadyProto")
		TNT1 A 0 A_JumpIfInventory("IsBass",1,"ReadyBass")
		TNT1 A 0 A_JumpIfInventory("IsDuo",1,"ReadyDuo")
		TNT1 A 1
		Goto Ready+1
		
	ReadyMega:
		S8ME A 0 A_JumpIfInventory("UltAttackFlag",1,"UltimateAttackCheck")
		S8ME A 1 A_WeaponReady
		Goto ReadyMega
	ReadyProto:
		S8PR A 0 A_JumpIfInventory("UltAttackFlag",1,"UltimateAttackCheck")
		S8PR A 1 A_WeaponReady
		Goto ReadyProto
	ReadyBass:
		S8BA A 0 A_JumpIfInventory("UltAttackFlag",1,"UltimateAttackCheck")
		S8BA A 1 A_WeaponReady
		Goto ReadyBass
	ReadyDuo:
		S8DU A 0 A_JumpIfInventory("UltAttackFlag",1,"UltimateAttackCheck")
		S8DU A 1 A_WeaponReady
		Goto ReadyDuo
		
    Deselect:
        "####" A 0 A_JumpIfInventory("WeaponCharge",1,1)
        goto DeselectSwap
        "####" A 2 A_TakeInventory("WeaponCharge",999)
        goto DeselectSwap
    Select:
        "####" A 0
        goto SelectSwap
		
	Fire:
        "####" A 0 A_JumpIfInventory("WeaponCharge", 23, "Hold3")
        "####" A 0 A_JumpIfNoAmmo("Fire1")
		"####" A 0 A_JumpIfInventory("PowerGearPowerup",1,"GearCheck")
	Fire.Resume:
        "####" A 1
        goto Hold
		
	Hold:
        "####" A 0 A_JumpIfInventory("WeaponCharge",4,"Hold2")
        "####" A 0 A_JumpIfInventory("WeaponCharge",3,"HoldStart")
        "####" A 2 A_GiveInventory("WeaponCharge",1)
        "####" A 0 A_Refire
        goto Fire1
		
    HoldStart:
        "####" A 0 ACS_NamedExecuteWithResult("core_wepcharge_rage",1,0)
        "####" A 0 A_PlaySoundEx("weapons/mmv/breakdashcharge", "Weapon")
        goto Hold2
		
	Hold2:
        "####" A 0 A_JumpIfInventory("WeaponCharge",23,"Hold3")
        "####" A 0 A_JumpIfInventory("WeaponCharge",22,"HoldStart2")
        "####" B 1 ACS_NamedExecuteWithResult("core_chargecolor",CLR_BREAKDASHCHARGE1,TCLR_CHARGE1)
        "####" A 0 A_Refire("Hold2.a")
        goto Fire1
		
    Hold2.a:
        "####" A 1 ACS_NamedExecuteWithResult("core_chargecolor",CLR_BREAKDASH,TCLR_NONE)
        "####" A 0 A_GiveInventory("WeaponCharge", 1 + CallACS("core_checkrune", RUNE_RAGE))
        "####" A 0 A_Refire("Hold2")
        goto Fire1
		
    HoldStart2:
        "####" A 0 A_GunFlash("Sound.BusterCharge", GFF_NOEXTCHANGE)
        "####" A 0 A_GiveInventory("WeaponCharge", 1 + CallACS("core_checkrune", RUNE_RAGE))
        goto Hold3
		
	Hold3:
        "####" C 1 ACS_NamedExecuteWithResult("core_chargecolor",CLR_BREAKDASHCHARGE2,TCLR_CHARGE2)
        "####" A 0 A_Refire("Hold3.a")
        goto Fire2
		
    Hold3.a:
        "####" D 1 ACS_NamedExecuteWithResult("core_chargecolor",CLR_BREAKDASHCHARGE3,TCLR_CHARGE3)
        "####" A 0 A_Refire("Hold3.b")
        goto Fire2
		
    Hold3.b:
        "####" A 1 ACS_NamedExecuteWithResult("core_chargecolor",CLR_BREAKDASH,TCLR_NONE)
        "####" A 0 A_JumpIfInventory("IsBot", 1, "BotFire")
        "####" A 0 A_Refire("Hold3")
        goto Fire2
		
    BotFire:
        "####" A 0 A_Jump(64, "Fire2")
        "####" A 0 A_Refire("Hold3")
        goto Fire2
		
	Hold3Ready:
        "####" A 0 A_JumpIfNoAmmo("NoAmmo")
        "####" A 0 A_GunFlash("Sound.BusterCharge", GFF_NOEXTCHANGE)
        "####" A 0 A_GiveInventory("WeaponCharge",23)
        "####" A 0 A_TakeInventory("BreakDashHit", 1)
        "####" A 0 ACS_ExecuteAlways(998,0,215,1)
        "####" C 1 A_WeaponReady
        "####" A 0 ACS_ExecuteAlways(998,0,216,1)
        "####" D 1 A_WeaponReady
        "####" A 0 ACS_ExecuteAlways(998,0,213,1)
        "####" A 1 A_WeaponReady
        goto Hold3Ready+3
		
	Fire1:
        "####" A 0 ACS_NamedExecuteWithResult("core_chargecolor",CLR_BREAKDASH,TCLR_NONE)
        "####" A 0 A_StopSoundEx ("SoundSlot5") 
        "####" A 0 A_TakeInventory("WeaponCharge",500)
        "####" A 0 A_ClearRefire
        "####" A 0 A_PlaySoundEx("weapons/mmv/breakdashbuster", "Weapon")
        "####" A 0 A_FireCustomMissile("MegaVShotBreakDash", 0, 0, 8, 0)
        "####" EF 3
        "####" A 2
        goto Ready+1
		
	Fire2:
        "####" A 0 A_TakeInventory("WeaponCharge",500)
        "####" A 0 A_ClearRefire
        "####" A 0 A_JumpIfNoAmmo("Fire1")
    DashBegin:
        "####" A 0 ACS_NamedExecuteAlways("core_flyplayer",0,0,2)
        "####" A 0 ACS_NamedExecuteAlways("core_freezeplayer",0,0,1)
        "####" A 0 A_TakeInventory("BreakDashAmmo",3,TIF_NOTAKEINFINITE)
        "####" G 1
        "####" A 0 ACS_NamedExecuteWithResult("core_chargecolor",CLR_BREAKDASH,TCLR_NONE)
        "####" H 1 ACS_NamedExecute("VC_SetState",0,43)
		"####" IJ 1 ACS_NamedExecute("VC_SetState",0,44)
        "####" A 0 A_SpawnItemEx("BreakDashPuff")
        "####" A 0 A_GiveInventory("BreakDashCharge", 3)
    DashLoop:
        "####" A 0 A_PlaySoundEx("weapons/mmv/breakdashfire", "Weapon")
        "####" A 0 A_GiveInventory("BreakDashSpeed", 1)
        "####" A 0 A_SpawnItemEx("BreakDashFX", cos(pitch)*16+sin(-pitch)*12, 8, sin(-pitch)*16+32, momx, momy, momz, 0, SXF_ABSOLUTEMOMENTUM)
        "####" A 0 A_SpawnItemEx("BreakDashSparkFX", 0, 0, 0, momx, momy, -2, 0, SXF_ABSOLUTEMOMENTUM)
        "####" J 1 A_SpawnItemEx("BreakDashCheck", 0.75*WEPC_VBD_RADIUS*cos(pitch), 0, 0.75*WEPC_VBD_RADIUS*sin(-pitch)+(CallACS("core_getactorproperty", 0, APROP_Height, DATATYPE_INT)-WEPC_VBD_HALFHEIGHT*2)/2, cos(pitch), 0, sin(-pitch), 0, SXF_MULTIPLYSPEED)
        "####" A 0 A_JumpIfInventory("BreakDashRecoil", 1, "Recoil") "####" A 0 ACS_NamedExecute("VC_SetState",0,43)
        "####" A 0 A_SpawnItemEx("BreakDashFX", cos(pitch)*16+sin(-pitch)*12, 8, sin(-pitch)*16+32, momx, momy, momz, 0, SXF_ABSOLUTEMOMENTUM)
        "####" A 0 A_SpawnItemEx("BreakDashSparkFX", 0, 0, 0, momx, momy, -2, 0, SXF_ABSOLUTEMOMENTUM)
        "####" J 1 A_SpawnItemEx("BreakDashCheck", 0.75*WEPC_VBD_RADIUS*cos(pitch), 0, 0.75*WEPC_VBD_RADIUS*sin(-pitch)+(CallACS("core_getactorproperty", 0, APROP_Height, DATATYPE_INT)-WEPC_VBD_HALFHEIGHT*2)/2, cos(pitch), 0, sin(-pitch), 0, SXF_MULTIPLYSPEED)
        "####" A 0 A_JumpIfInventory("BreakDashRecoil", 1, "Recoil") "####" A 0 ACS_NamedExecute("VC_SetState",0,43)
        "####" A 0 A_SpawnItemEx("BreakDashFX", cos(pitch)*16+sin(-pitch)*12, 8, sin(-pitch)*16+32, momx, momy, momz, 0, SXF_ABSOLUTEMOMENTUM)
        "####" A 0 A_SpawnItemEx("BreakDashSparkFX", 0, 0, 0, momx, momy, -2, 0, SXF_ABSOLUTEMOMENTUM)
        "####" J 1 A_SpawnItemEx("BreakDashCheck", 0.75*WEPC_VBD_RADIUS*cos(pitch), 0, 0.75*WEPC_VBD_RADIUS*sin(-pitch)+(CallACS("core_getactorproperty", 0, APROP_Height, DATATYPE_INT)-WEPC_VBD_HALFHEIGHT*2)/2, cos(pitch), 0, sin(-pitch), 0, SXF_MULTIPLYSPEED)
        "####" A 0 A_JumpIfInventory("BreakDashRecoil", 1, "Recoil") "####" A 0 ACS_NamedExecute("VC_SetState",0,43)
        "####" A 0 A_SpawnItemEx("BreakDashFX", cos(pitch)*16+sin(-pitch)*12, 8, sin(-pitch)*16+32, momx, momy, momz, 0, SXF_ABSOLUTEMOMENTUM)
        "####" A 0 A_SpawnItemEx("BreakDashSparkFX", 0, 0, 0, momx, momy, -2, 0, SXF_ABSOLUTEMOMENTUM)
        "####" J 1 A_SpawnItemEx("BreakDashCheck", 0.75*WEPC_VBD_RADIUS*cos(pitch), 0, 0.75*WEPC_VBD_RADIUS*sin(-pitch)+(CallACS("core_getactorproperty", 0, APROP_Height, DATATYPE_INT)-WEPC_VBD_HALFHEIGHT*2)/2, cos(pitch), 0, sin(-pitch), 0, SXF_MULTIPLYSPEED)
        "####" A 0 A_JumpIfInventory("BreakDashRecoil", 1, "Recoil") "####" A 0 ACS_NamedExecute("VC_SetState",0,43)
        "####" A 0 A_TakeInventory("BreakDashCharge", 1)
        "####" A 0 A_JumpIfInventory("BreakDashCharge", 1, "DashLoop")
        "####" A 0 ACS_NamedExecuteAlways("core_flyplayer",0,0,0)
        "####" A 0 ACS_NamedExecuteAlways("core_freezeplayer",0,0,0)
        "####" A 0 A_ChangeVelocity(CallACS("VC_XYMob",momx * 0.5), momy * 0.5, momz, CVF_REPLACE)
		"####" JIHGA 2
        goto Ready+1
		
	Recoil:
        "####" J 1 ACS_NamedExecute("VC_SetState",0,30)
        "####" A 0 A_PlaySoundEx("weapons/mmv/breakdashimpact", "weapon")
        "####" A 0 A_ChangeVelocity(CallACS("VC_XYMob",-15*cos(pitch)), 0, -8*sin(-pitch)+5, CVF_RELATIVE|CVF_REPLACE)
        "####" A 0 A_TakeInventory("BreakDashCharge", 100)
        "####" A 0 ACS_NamedExecuteAlways("core_flyplayer",0,0,0)
        "####" A 0 ACS_NamedExecuteAlways("core_freezeplayer",0,0,0)
        "####" ZZZHGA 4
        "####" A 0 A_JumpIfInventory("BreakDashHit", 1, "Hold3Ready")
        goto Ready+1
		
		GearCheck:
		"####" A 0 A_JumpIfInventory("BreakDashAmmo",1,"Fire.Gear")
		Goto Fire.Resume
		
		Fire.Gear:
		"####" G 1 ACS_NamedExecute("VC_SetState",0,30)
        "####" A 0 ACS_ExecuteAlways(971,0,213)
        "####" GHI 1
		"####" A 0 A_TakeInventory("UnSolid",1)
		"####" A 0 ACS_NamedExecuteAlways("core_flyplayer",0,0,2)
        "####" A 0 ACS_NamedExecuteAlways("core_freezeplayer",0,0,1)
		Fire.GearLoop:
		"####" A 0 A_ChangeFlag("SOLID",False)
		"####" A 0 A_JumpIfInventory("BreakDashAmmo",1,1)
		Goto Fire.GearEnd
		"####" A 0 A_JumpIfInventory("PowerGearPowerup",1,1)
		Goto Fire.GearEnd
		"####" A 0 ACS_NamedExecute("VC_SetState",0,43)
		"####" A 0 A_PlaySoundEx("weapon/breakdash", "Weapon")
        "####" A 0 A_GiveInventory("BreakDashSpeed2", 1)
		"####" A 0 A_TakeInventory("BreakDashAmmo", 1)
        "####" A 0 A_SpawnItemEx("BreakDashFX", cos(pitch)*16+sin(-pitch)*12, 8, sin(-pitch)*16+32, momx, momy, momz, 0, SXF_ABSOLUTEMOMENTUM)
        "####" A 0 A_SpawnItemEx("BreakDashSparkFX", 0, 0, 0, 0, 0, -2)
        "####" A 0 A_FireCustomMissile("BreakDashDamagerCopyWep", 0, 0, 0, 0)
		"####" J 1
		"####" A 0 ACS_NamedExecute("VC_SetState",0,43)
        "####" A 0 A_GiveInventory("BreakDashSpeed2", 1)
        "####" A 0 A_SpawnItemEx("BreakDashFX", cos(pitch)*16+sin(-pitch)*12, 8, sin(-pitch)*16+32, momx, momy, momz, 0, SXF_ABSOLUTEMOMENTUM)
        "####" A 0 A_SpawnItemEx("BreakDashSparkFX", 0, 0, 0, 0, 0, -2)
        "####" A 0 A_FireCustomMissile("BreakDashDamagerCopyWep", 0, 0, 0, 0)
		"####" J 1
		"####" JJJ 1 A_JumpIf(ACS_NamedExecuteWithResult("VC_CheckBtn",4)==3,"Fire.GearLoop2")
		Goto Fire.GearEnd
		
		Fire.GearLoop2:
		"####" A 0 ACS_NamedExecute("VC_SetState",0,44)
		"####" A 0 A_PlaySoundEx("weapon/breakdash", "Weapon")
        "####" A 0 A_GiveInventory("BreakDashSpeed2", 1)
		"####" A 0 A_TakeInventory("BreakDashAmmo", 1)
        "####" A 0 A_SpawnItemEx("BreakDashFX", cos(pitch)*16+sin(-pitch)*12, 8, sin(-pitch)*16+32, momx, momy, momz, 0, SXF_ABSOLUTEMOMENTUM)
        "####" A 0 A_SpawnItemEx("BreakDashSparkFX", 0, 0, 0, 0, 0, -2)
        "####" A 0 A_FireCustomMissile("BreakDashDamagerCopyWep", 0, 0, 0, 0)
		"####" J 1
		"####" A 0 ACS_NamedExecute("VC_SetState",0,44)
        "####" A 0 A_GiveInventory("BreakDashSpeed2", 1)
        "####" A 0 A_SpawnItemEx("BreakDashFX", cos(pitch)*16+sin(-pitch)*12, 8, sin(-pitch)*16+32, momx, momy, momz, 0, SXF_ABSOLUTEMOMENTUM)
        "####" A 0 A_SpawnItemEx("BreakDashSparkFX", 0, 0, 0, 0, 0, -2)
        "####" A 0 A_FireCustomMissile("BreakDashDamagerCopyWep", 0, 0, 0, 0)
		"####" J 1
		"####" JJJ 1 A_JumpIf(ACS_NamedExecuteWithResult("VC_CheckBtn",4)==3,"Fire.GearLoop")
		Fire.GearEnd:
		"####" A 0 ACS_NamedExecute("VC_SetState",0,30)
		"####" A 0 A_ChangeFlag("SOLID",True)
		"####" A 0 A_SpawnItemEx("Resolidifier")
		"####" A 0 ACS_NamedExecuteAlways("core_flyplayer",0,0,0)
        "####" A 0 ACS_NamedExecuteAlways("core_freezeplayer",0,0,0)
		"####" JJIIHHGGAAAAAAAAAA 1 A_GiveInventory("BreakDashMovementPickUp",1)
		Goto Ready+1
	
	NoAmmo:
        "####" A 1 ACS_NamedExecuteAlways("core_noammo",0)
        "####" A 0
        goto Ready+1
    }
}

Actor MegaVShotBreakDash
{
	PROJECTILE
	+LOOKALLAROUND
	+SKYEXPLODE
	+DONTBLAST
	Obituary "%o was bombarbed by %o Break Dash Shot"
	DamageType "Megabuster"
	Speed 32
	Damage (10)
	radius 5
	height 5
	scale 2.5
	States
	{
		Spawn:
		TNT1 A 2
		TNT1 A 0 A_GiveInventory("ProjectileCode",1)
		BUST A 2
		goto Spawn+2
		XDeath:
		Death:
		BUST A 1
		stop
	}
}

actor BreakDashHit : Once {}

actor BreakDashCharge : WeaponCharge
{
    inventory.amount 1
    inventory.maxamount 35
}

actor BreakDashRecoil : Powerup
{
    powerup.duration 10
}

actor BreakDashAmmo : Ammo
{
    inventory.amount 1
    inventory.maxamount 27
    +INVENTORY.IGNORESKILL
}

const int WEPC_VBD_HSPEED = 45;
const int WEPC_VBD_VSPEED = WEPC_VBD_HSPEED/2;

const int WEPC_VBD_HSPEED2 = 35;
const int WEPC_VBD_VSPEED2 = WEPC_VBD_HSPEED2/2;

actor BreakDashSpeed : CustomInventory
{
    States
    {
    Pickup:
        TNT1 A 0 A_CheckFloor("Floor")
        TNT1 A 0 A_JumpIf(pitch < 180, "Down")
        TNT1 A 0 A_ChangeVelocity(CallACS("VC_XYMob",WEPC_VBD_HSPEED*cos(pitch)), 0, WEPC_VBD_VSPEED*sin(-pitch), CVF_RELATIVE|CVF_REPLACE)
        stop
    Down:
        TNT1 A 0 A_ChangeVelocity(CallACS("VC_XYMob",WEPC_VBD_HSPEED*cos(pitch)), 0, WEPC_VBD_HSPEED*sin(-pitch), CVF_RELATIVE|CVF_REPLACE)
        stop
    Floor:
        TNT1 A 0 A_ChangeVelocity(CallACS("VC_XYMob",WEPC_VBD_HSPEED*cos(pitch)), 0, (WEPC_VBD_VSPEED*sin(-pitch) > 0) * WEPC_VBD_VSPEED*sin(-pitch), CVF_RELATIVE|CVF_REPLACE)
        stop
    }
}

actor BreakDashSpeed2 : CustomInventory
{
    States
    {
    Pickup:
        TNT1 A 0 A_CheckFloor("Floor")
        TNT1 A 0 A_JumpIf(pitch < 180, "Down")
        TNT1 A 0 A_ChangeVelocity(CallACS("VC_XYMob",WEPC_VBD_HSPEED2*cos(pitch)), 0, WEPC_VBD_VSPEED2*sin(-pitch), CVF_RELATIVE|CVF_REPLACE)
        stop
    Down:
        TNT1 A 0 A_ChangeVelocity(CallACS("VC_XYMob",WEPC_VBD_HSPEED2*cos(pitch)), 0, WEPC_VBD_HSPEED2*sin(-pitch), CVF_RELATIVE|CVF_REPLACE)
        stop
    Floor:
        TNT1 A 0 A_ChangeVelocity(CallACS("VC_XYMob",WEPC_VBD_HSPEED2*cos(pitch)), 0, (WEPC_VBD_VSPEED2*sin(-pitch) > 0) * WEPC_VBD_VSPEED2*sin(-pitch), CVF_RELATIVE|CVF_REPLACE)
        stop
    }
}

actor BreakDashCheck : BasicFastProjectile
{
    Obituary "$OB_BREAKDASH"
    Damagetype "BreakDash"
    height 20
    radius 24
    speed 64
    Damage (25)
    States
    {
    Spawn:
        TNT1 A 0
        stop
    XDeath:
        TNT1 A 0 A_GiveToTarget("BreakDashHit", 1)
    Death:
        TNT1 A 0 A_SpawnItemEx("PropBlowerEffect")
        TNT1 A 0 A_SpawnItemEx("BreakDashQuake")
        TNT1 A 0 A_GiveToTarget("BreakDashRecoil", 1)
        stop
    }
}

actor BreakDashQuake : BasicWatcher
{
	States
	{
	Spawn:
		TNT1 A 0
		TNT1 A 0 Radius_Quake(2, 4, 0, 2, 0)
		TNT1 A 1
		stop
	}
}

actor BreakDashProtect : PowerProtection
{
    powerup.duration 10
    damagefactor "BreakDash", 0.0
}

actor BreakDashFX : BasicGraphicEffect
{
    States
    {
    SpawnFrame:
        BDAS B 0
        BDAS B 1
        stop
    }
}

actor BreakDashSparkFX : BasicGraphicEffect
{
    -USESPAWNEVENTSCRIPT
    -NOINTERACTION
    States
    {
    Spawn:
        TNT1 A 0
        TNT1 A 1
        stop
    Death:
        TNT1 A 0 A_GiveInventory("MM8BDMProjSpawnFuncClient",1)
        TNT1 AAAAA 0 A_SpawnItemEx("BreakDashSpark", -momx*frandom(0, 1.0), momy*frandom(0, 1.0), 0, -frandom(8, 16), 0, frandom(4, 16), frandom(-20, 20), SXF_WEPFXCOLOR)
        stop
    }
}

actor BreakDashSpark : BreakDashFX
{
    States
    {
    SpawnFrame:
        BDAS EDCC 1
        stop
    }
}

actor BreakDashPuff : BreakDashFX
{
    -FORCEXYBILLBOARD
    States
    {
    SpawnFrame:
        BDAS P 0
        BDAS P 0 A_JumpIf(z-floorz > 0, "Air")
        stop
    Air:
        BDAS PQR 3
        stop
    }
}

actor BreakDashDamagerCopyWep
{
species "DustManType"
+THRUSPECIES
PROJECTILE
Obituary "$OB_BREAKDASH"
Damagetype "BreakDash"
+RIPPER
+NOINTERACTION
+DONTBLAST
damage (0)
radius 1
height 1
States
{
Spawn:
TNT1 A 0
TNT1 A 1 A_Explode(25,100,0,0,100)
stop
Crash:
Death:
XDeath:
TNT1 A 0
stop
}
}

actor BreakDashMovementPickUp : CustomInventory
{
States
{
Pickup:
BDAS B 0 ACS_NamedExecuteAlways("core_flyplayer",0,0,0)
BDAS B 0 ACS_NamedExecuteAlways("core_freezeplayer",0,0,0)
stop
}
}
