const int ZANGETSUTO_SPAWNEX = SXF_TRANSFERPITCH|SXF_TRANSFERTRANSLATION;
const int ZANGETSUTO_SPAWNEX_HITBOX = SXF_TRANSFERPOINTERS|SXF_NOCHECKPOSITION;

actor ZangetsutoWep_MugshotColor : MugshotColor { args 225, 94 }
actor ZangetsutoWep_ScriptBar : ScriptBar {}

actor ZangetsutoUpgrade : BaseMM8BDMBusterUpgrade
{
    //$Category Inspired BURST!-Weapons/Buster
    //$Title ZangetsutoUpgrade
    //Inventory.RespawnTics 350
    //$Sprite ZTSLZ0
    inventory.amount 1
    inventory.maxamount 1
    inventory.pickupmessage "$PU_ZANGETSUTO"
    Tag "$TAG_ZANGETSUTOUPGRADE"
    inventory.icon "ZTICO"
    Inventory.PickupSound "weapons/bloodstained/zangetsutopickup"
    Inventory.RespawnTics 350
    scale 2.0
    +COUNTITEM
    +INVBAR
    States
    {
    SpawnLoop:
        ZTSL Z 1
        loop
    Use:
        TNT1 A 0 A_PlaySoundEx("item/refill","Voice")
        TNT1 A 0 A_GiveInventory("BusterGiven",1)
        TNT1 A 0 A_JumpIfInventory("ZangetsutoWep", 1, "BusterOnly")
        TNT1 A 0 A_GiveInventory("ZangetsutoFirstSelect", 1)
    BusterOnly:
        TNT1 A 0 A_GiveInventory("ZangetsutoWep",1)
        TNT1 A 0 A_SelectWeapon("ZangetsutoWep")
        stop
    }
}

actor ZangetsutoFirstSelect : Once {}

actor ZangetsutoUpgrade_Respawn : 8BDMItemRespawn
{
	translation "192:192=225:225", "198:198=94:94", "0:5=45:45"
	mass 350
}
actor ZangetsutoUpgrade_RespawnShadow : 8BDMItemRespawnShadow
{
	mass 350
	States
	{
	Spawn:
        ZTSL Z 0
		goto Super::Spawn
	}
}

actor ZangetsutoWep : BaseMM8BDMWep
{
    Weapon.AmmoUse 2
    Weapon.AmmoGive 28
    Weapon.SlotNumber 1
    Inventory.Pickupmessage "$PU_ZANGETSUTO"
    Obituary "$OB_ZANGETSUTO"
    Tag "$TAG_ZANGETSUTO"
    weapon.ammotype "BusterAmmo"
    inventory.icon "NULLICON"
    States
    {
        SpawnLoop:
            WEA3 O -1
            loop
        Ready:
            ZTSW A 0 A_JumpIfInventory("BusterGiven",1,"TakeBusters")
            Goto ReadyUp
        TakeBusters:
            TNT1 Q 0 A_GiveInventory("TakeBuster", 1)
            Goto ReadyUp
        ReadyUp:
            ZTSW A 0 ACS_NamedExecuteWithResult("core_weaponcolor",CLR_ZANGETSUTO,CLRF_SILENT)
            ZTSW A 0 A_JumpIfInventory("ZangetsutoFirstSelect", 1, "FullDraw")
            goto Draw
        FullDraw:
            ZTSW V 0 A_TakeInventory("ZangetsutoFirstSelect", 1)
            ZTSW V 0 A_JumpIfInventory("IsBot", 1, "BotFullDraw")
            ZTSW WWWWWXXXXXYYYYYYYYYYYYYYY 1 A_WeaponReady
            ZTSW Z 0 A_PlaySoundEx("weapons/bloodstained/zangetsutoflourish", "weapon")
            ZTSW Z 0 A_SpawnItemEx("ZangetsutoFlourish")
            ZTSW Z 0 A_SpawnItemEx("ZangetsutoFlourishDamage")
            ZTSW Z 1 A_WeaponReady
            TNT1 AA 1 A_WeaponReady
            ZTSW "[" 1 A_WeaponReady
            TNT1 AA 1 A_WeaponReady
        Draw:
            ZTSW "]]]]]]]]]]" 1 A_WeaponReady
            ZTSW Z 0 A_PlaySoundEx("weapons/bloodstained/zangetsutoscabbard", "weapon")
            ZTSW "\\" 1 A_WeaponReady
        ReadyTrue:
            ZTSW A 1 A_WeaponReady
            loop
        
        BotFullDraw:
            ZTSW WWWWWXXXXXYYYYYYYYYYYYYYY 1
            ZTSW Z 0 A_PlaySoundEx("weapons/bloodstained/zangetsutoflourish", "weapon")
            ZTSW Z 0 A_SpawnItemEx("ZangetsutoFlourish")
            ZTSW Z 0 A_SpawnItemEx("ZangetsutoFlourishDamage")
            ZTSW Z 1
            TNT1 AA 1
            ZTSW "[" 1
            TNT1 AA 1
            ZTSW "]]]]]]]]]]" 1
            ZTSW Z 0 A_PlaySoundEx("weapons/bloodstained/zangetsutoscabbard", "weapon")
            ZTSW "\\" 1
            goto ReadyTrue
        
        Deselect:
            ZTSW A 0 A_GiveInventory("ZangetsutoMoveOff_CI", 1)
            goto DeselectSwap
        Select:
            ZTSW A 0 A_GiveInventory("ZangetsutoMoveOn_CI", 1)
            goto SelectSwap
        Fire:
        Tap1:
            TNT1 A 0 A_GiveInventory("ZangetsutoActive_P", 1)
            TNT1 A 1 A_GunFlash("Fire1")
        Tap1Hold:
            TNT1 A 0 A_JumpIfInventory("ZangetsutoActive_P", 1, "Tap1Refire")
            goto TapWait
        Tap1Refire:
            TNT1 A 1
            TNT1 A 0 A_Refire("Tap1Hold")
        Tap1Release:
            TNT1 A 1
            TNT1 A 0 A_Refire("Tap2")
            TNT1 A 0 A_JumpIfInventory("ZangetsutoActive_P", 1, "Tap1Release")
            goto TapEnd
        
        Tap2:
            TNT1 A 0 A_GiveInventory("ZangetsutoRefire_F", 1)
        Tap2Hold:
            TNT1 A 0 A_JumpIfInventory("ZangetsutoActive_P", 1, "Tap2Refire")
            goto TapWait
        Tap2Refire:
            TNT1 A 1
            TNT1 A 0 A_Refire("Tap2Hold")
        Tap2Release:
            TNT1 A 1
            TNT1 A 0 A_Refire("Tap3")
            TNT1 A 0 A_JumpIfInventory("ZangetsutoActive_P", 1, "Tap2Release")
            goto TapEnd

        Tap3:
            TNT1 A 0 A_GiveInventory("ZangetsutoRefire_F", 1)
        TapWait:
            TNT1 A 1
            TNT1 A 0 A_JumpIfInventory("ZangetsutoActive_P", 1, "TapWait")
            goto TapEnd
        TapEnd:
            ZTSW UTS 2
            Goto ReadyTrue

        Fire1:
            ZTSW A 0 A_PlaySoundEx("weapons/bloodstained/zangetsutoslash1","Weapon")
            ZTSW A 0 A_GiveInventory("ZangetsutoSlash1_CI", 1)
            ZTSW BCDDDEENN 1
            ZTSW A 0 A_JumpIfInventory("ZangetsutoRefire_F", 1, "Fire2")
            TNT1 AA 3
            TNT1 A 0 A_JumpIf(true, "FireEnd")
            TNT1 A 10
            goto FireEnd
        Fire2:
            ZTSW A 0 A_PlaySoundEx("weapons/bloodstained/zangetsutoslash2","Weapon")
            ZTSW A 0 A_TakeInventory("ZangetsutoRefire_F", 1)
            ZTSW A 0 A_GiveInventory("ZangetsutoSlash2_CI", 1)
            ZTSW FFFGHHH 1
            ZTSW A 0 A_JumpIfInventory("ZangetsutoRefire_F", 1, "Fire3")
            ZTSW QR 3
            TNT1 A 0 A_JumpIf(true, "FireEnd")
            TNT1 A 10
            goto FireEnd
        Fire3:
            ZTSW IJ 1
            ZTSW A 0 A_PlaySoundEx("weapons/bloodstained/zangetsutoslash3","Weapon")
            ZTSW A 0 A_GiveInventory("ZangetsutoSlash3_CI", 1)
            ZTSW KLMM 1
            ZTSW MMM 1
            ZTSW OP 3
            goto FireEnd
        FireEnd:
            ZTSW A 0 A_TakeInventory("ZangetsutoActive_P", 1)
            ZTSW A 0 A_TakeInventory("ZangetsutoRefire_F", 999)
            stop
    }
}

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

actor ZangetsutoFlourish : BasicGraphicEffect
{
    Speed 60
    States
    {
    SpawnFrame:
        TNT1 A 0
        ZTSL Y 1 A_Warp(AAPTR_TARGET)
        TNT1 A 1 A_Warp(AAPTR_TARGET)
        ZTSL X 1 A_Warp(AAPTR_TARGET)
        TNT1 AAAAA 1 A_Warp(AAPTR_TARGET)
        stop
    }
}

actor ZangetsutoFlourishDamage : BasicExplosion
{
    damagetype "Zangetsuto"
    obituary "$OB_ZANGETSUTO"
    States
    {
    Spawn:
        TNT1 A 0 nodelay A_Explode(CallACS("burst_cbm_damage",10), 48, 0, 0, 48)
        stop
    }
}

// PARENT ACTORS
actor ZangetsutoSlashFXMaster : BasicGraphicEffect
{
    reactiontime 0x7FFFFFFD
    args 32, 0, 32, 0
    renderstyle "Translucent"
    States
    {
    SpawnFrame:
        TNT1 A 0
        goto FX
    FX:
        "----" "#" 0 ACS_NamedExecuteWithResult("zangetsuto_renderslash", true)
    FXLoop:
        "----" "#" 0 A_Warp(AAPTR_TARGET, cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], angle+args[4], WARPF_INTERPOLATE|WARPF_ABSOLUTEANGLE)
        //"----" "#" 0 A_JumpIfInTargetInventory("killhitboxes", 1, "Death")
        "----" "#" 1 A_Countdown
        loop
    Death:
        TNT1 A 0
        stop
    }
}

actor ZangetsutoSlashHitbox : BasicProjectile
{
    bouncetype hexen
    -ALLOWBOUNCEONACTORS
    +RIPPER
    +FORCEXYBILLBOARD
    +DONTSPLASH
    +NOINTERACTION

    var int user_x;
    var int user_y;
    var int user_z;
    
    var int user_CompositeRipper;

    height 20
    radius 10
    damagetype "Zangetsuto"
    damage (CallACS("burst_cbm_damage",30))
    obituary "$OB_ZANGETSUTO"
    renderstyle "None"

    reactiontime 0x7FFFFFFD
    States
    {
    Spawn:
        TNT1 A 0 nodelay ACS_NamedExecuteWithResult("zangetsuto_swordhitboxoffset")
        TNT1 A 0 ACS_NamedExecuteWithResult("zangetsuto_renderslash", false)
        TNT1 A 0 A_ChangeFlag(NOINTERACTION, false)
    SpawnLoop:
        ZTSL R 0 A_Warp(AAPTR_TARGET,user_x,user_y,user_z,angle,WARPF_COPYINTERPOLATION|WARPF_ABSOLUTEOFFSET|WARPF_ABSOLUTEANGLE|WARPF_NOCHECKPOSITION)
        // ZTSL R 0 A_JumpIfInTargetInventory("killhitboxes", 1, "Death")
        ZTSL R 1 A_Countdown
        loop
    Death:
        TNT1 A 0
        stop
    }
}

actor ZangetsutoSlashWatcher : BasicExplosion
{
    var int user_CompositeRipper;
}

// SLASH 1
actor ZangetsutoSlash1_CI : CustomInventory
{
    States
    {
    Pickup:
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlash1FXStart", 0, 0, 0, 0, 0, -pitch, 0, SXF_TRANSFERPITCH)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlash1HitboxWatcher", 0, 0, 0, 0, 0, 0, 0, SXF_TRANSFERPITCH)
        stop
    }
}

actor ZangetsutoSlashHitboxSlash1 : ZangetsutoSlashHitbox
{
    reactiontime 3
}

actor ZangetsutoSlash1HitboxWatcher : ZangetsutoSlashWatcher
{
    States
    {
    Spawn:
        TNT1 A 1
        TNT1 A 0 A_SetPitch(-pitch)
        TNT1 A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*48, 0, sin(pitch)*48+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*103, 0, sin(pitch)*103+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*85, 0, sin(pitch)*85+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*85, -20, sin(pitch)*85+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*103, -20, sin(pitch)*103+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*88, -41, sin(pitch)*88+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*68, -41, sin(pitch)*68+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*70, -61, sin(pitch)*70+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*81, 20, sin(pitch)*81+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*97, 20, sin(pitch)*97+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*71, 39, sin(pitch)*71+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*80, 39, sin(pitch)*80+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*56, 52, sin(pitch)*56+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*36, 60, sin(pitch)*36+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*16, 64, sin(pitch)*16+22, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 2
        TNT1 A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*49, -43, sin(pitch)*49+23, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash1", cos(pitch)*66, -61, sin(pitch)*66+23, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        stop
    }
}

actor ZangetsutoSlash1FXStart : ZangetsutoSlashFXMaster
{
    -CLIENTSIDEONLY
    States
    {
    SpawnFrame:
        ZTSL A 0 A_SetPitch(velz)
        ZTSL A 0 A_ChangeVelocity(0,0,0,CVF_REPLACE)
        ZTSL A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        ZTSL A 0 A_SpawnItemEx("ZangetsutoSlash1FXA", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        ZTSL A 2 A_SpawnItemEx("ZangetsutoSlash1FXA2", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        ZTSL A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        ZTSL A 0 A_SpawnItemEx("ZangetsutoSlash1FXB", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        ZTSL A 2 A_SpawnItemEx("ZangetsutoSlash1FXB2", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        stop
    }
}

actor ZangetsutoSlash1FXA : ZangetsutoSlashFXMaster
{
    reactiontime 3
    States
    {
    SpawnFrame:
        ZTSL A 0
        goto FX
    }
}
actor ZangetsutoSlash1FXA2 : ZangetsutoSlash1FXA {}

actor ZangetsutoSlash1FXB : ZangetsutoSlashFXMaster
{
    reactiontime 4
    States
    {
    SpawnFrame:
        ZTSL B 0
        goto FX
    }
}
actor ZangetsutoSlash1FXB2 : ZangetsutoSlash1FXB {}

// SLASH 2
actor ZangetsutoSlash2_CI : CustomInventory
{
    States
    {
    Pickup:
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlash2FXStart", 0, 0, 0, 0, 0, -pitch, 0, SXF_TRANSFERPITCH)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlash2HitboxWatcher", 0, 0, 0, 0, 0, 0, 0, SXF_TRANSFERPITCH)
        stop
    }
}

actor ZangetsutoSlashHitboxSlash2 : ZangetsutoSlashHitbox
{
    reactiontime 3
}

actor ZangetsutoSlash2HitboxWatcher : ZangetsutoSlashWatcher
{
    States
    {
    Spawn:
        TNT1 A 1
        TNT1 A 0 A_SetPitch(-pitch)
        TNT1 A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash2", cos(pitch)*69, 0, sin(pitch)*69+16, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash2", cos(pitch)* 66-sin(pitch)*(-20-16), -36, sin(pitch)* 66+cos(pitch)*(-20-16)+16, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash2", cos(pitch)* 16-sin(pitch)*(65-16),  44, sin(pitch)* 16+cos(pitch)*(65-16)+16, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash2", cos(pitch)* 39-sin(pitch)*(65-16),  44, sin(pitch)* 39+cos(pitch)*(65-16)+16, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash2", cos(pitch)* 63-sin(pitch)*(65-16),  44, sin(pitch)* 63+cos(pitch)*(65-16)+16, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash2", cos(pitch)* 83-sin(pitch)*(57-16),  34, sin(pitch)* 83+cos(pitch)*(57-16)+16, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash2", cos(pitch)* 98-sin(pitch)*(43-16),  21, sin(pitch)* 98+cos(pitch)*(43-16)+16, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash2", cos(pitch)*105-sin(pitch)*(27-16),   5, sin(pitch)*105+cos(pitch)*(27-16)+16, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash2", cos(pitch)* 98-sin(pitch)*(12-16), -12, sin(pitch)* 98+cos(pitch)*(12-16)+16, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash2", cos(pitch)* 90-sin(pitch)*(-4-16), -28, sin(pitch)* 90+cos(pitch)*(-4-16)+16, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        
        TNT1 A 3
        TNT1 A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash2", cos(pitch)* 16-sin(pitch)*(65-16),  44, sin(pitch)* 16+cos(pitch)*(65-16)+16, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash2", cos(pitch)* 39-sin(pitch)*(65-16),  44, sin(pitch)* 39+cos(pitch)*(65-16)+16, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        stop
    }
}

actor ZangetsutoSlash2FXStart : ZangetsutoSlashFXMaster
{
    -CLIENTSIDEONLY
    States
    {
    SpawnFrame:
        ZTSL A 0 A_SetPitch(velz)
        ZTSL A 0 A_ChangeVelocity(0,0,0,CVF_REPLACE)
        ZTSL A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        ZTSL A 0 A_SpawnItemEx("ZangetsutoSlash2FXC", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        ZTSL A 2 A_SpawnItemEx("ZangetsutoSlash2FXC2", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        ZTSL A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        ZTSL A 0 A_SpawnItemEx("ZangetsutoSlash2FXD", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        ZTSL A 2 A_SpawnItemEx("ZangetsutoSlash2FXD2", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        stop
    }
}

actor ZangetsutoSlash2FXC : ZangetsutoSlashFXMaster
{
    reactiontime 3
    States
    {
    SpawnFrame:
        ZTSL C 0
        goto FX
    }
}
actor ZangetsutoSlash2FXC2 : ZangetsutoSlash2FXC {}

actor ZangetsutoSlash2FXD : ZangetsutoSlashFXMaster
{
    reactiontime 4
    States
    {
    SpawnFrame:
        ZTSL D 0
        goto FX
    }
}
actor ZangetsutoSlash2FXD2 : ZangetsutoSlash2FXD {}

// SLASH 3
actor ZangetsutoSlash3_CI : CustomInventory
{
    States
    {
    Pickup:
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlash3FXStart", 0, 0, 0, 0, 0, -pitch, 0, SXF_TRANSFERPITCH)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlash3HitboxWatcher", 0, 0, 0, 0, 0, 0, 0, SXF_TRANSFERPITCH)
        stop
    }
}

actor ZangetsutoSlashHitboxSlash3 : ZangetsutoSlashHitbox
{
    reactiontime 3
}

actor ZangetsutoSlash3HitboxWatcher : ZangetsutoSlashWatcher
{
    States
    {
    Spawn:
        TNT1 A 1
        TNT1 A 0 A_SetPitch(-pitch)
        TNT1 A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*39, 0, sin(pitch)*39+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)* 3-sin(pitch)*( 93-40), 0, sin(pitch)*( 3)+cos(pitch)*( 93-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*25-sin(pitch)*( 93-40), 0, sin(pitch)*(25)+cos(pitch)*( 93-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*46-sin(pitch)*( 89-40), 0, sin(pitch)*(46)+cos(pitch)*( 89-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*64-sin(pitch)*( 81-40), 0, sin(pitch)*(64)+cos(pitch)*( 81-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*79-sin(pitch)*( 71-40), 0, sin(pitch)*(79)+cos(pitch)*( 71-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*66-sin(pitch)*( 63-40), 0, sin(pitch)*(66)+cos(pitch)*( 63-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*89-sin(pitch)*( 50-40), 0, sin(pitch)*(89)+cos(pitch)*( 50-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*73-sin(pitch)*( 43-40), 0, sin(pitch)*(73)+cos(pitch)*( 43-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*94-sin(pitch)*( 29-40), 0, sin(pitch)*(94)+cos(pitch)*( 29-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*74-sin(pitch)*( 22-40), 0, sin(pitch)*(74)+cos(pitch)*( 22-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*92-sin(pitch)*(  9-40), 0, sin(pitch)*(92)+cos(pitch)*(  9-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*69-sin(pitch)*(  3-40), 0, sin(pitch)*(69)+cos(pitch)*(  3-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*48-sin(pitch)*( -8-40), 0, sin(pitch)*(48)+cos(pitch)*( -8-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*48-sin(pitch)*(-22-40), 0, sin(pitch)*(48)+cos(pitch)*(-22-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*70-sin(pitch)*(-11-40), 0, sin(pitch)*(70)+cos(pitch)*(-11-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*78-sin(pitch)*( -3-40), 0, sin(pitch)*(78)+cos(pitch)*( -3-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 3
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*67-sin(pitch)*( -3-40), 0, sin(pitch)*(67)+cos(pitch)*( -3-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*78-sin(pitch)*( 19-40), 0, sin(pitch)*(78)+cos(pitch)*( 19-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*78-sin(pitch)*( 42-40), 0, sin(pitch)*(78)+cos(pitch)*( 42-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*45-sin(pitch)*(-14-40), 0, sin(pitch)*(45)+cos(pitch)*(-14-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*22-sin(pitch)*(-22-40), 0, sin(pitch)*(22)+cos(pitch)*(-22-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)* 4-sin(pitch)*( -9-40), 0, sin(pitch)*( 4)+cos(pitch)*( -9-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 3
        TNT1 A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)* 4-sin(pitch)*( -9-40), 0, sin(pitch)*( 4)+cos(pitch)*( -9-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSlashHitboxSlash3", cos(pitch)*25-sin(pitch)*(-22-40), 0, sin(pitch)*(25)+cos(pitch)*(-22-40)+40, 0, 0, 0, 0, ZANGETSUTO_SPAWNEX_HITBOX)
        stop
    }
}

actor ZangetsutoSlash3FXStart : ZangetsutoSlashFXMaster
{
    -CLIENTSIDEONLY
    args 32, 0, 48, 0
    States
    {
    SpawnFrame:
        ZTSL A 0 A_SetPitch(velz)
        ZTSL A 0 A_ChangeVelocity(0,0,0,CVF_REPLACE)
        ZTSL A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        ZTSL A 0 A_SpawnItemEx("ZangetsutoSlash3FXF", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        ZTSL A 2 A_SpawnItemEx("ZangetsutoSlash3FXF2", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        ZTSL A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        ZTSL A 0 A_SpawnItemEx("ZangetsutoSlash3FXG", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        ZTSL A 2 A_SpawnItemEx("ZangetsutoSlash3FXG2", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        ZTSL A 0 A_Warp(AAPTR_TARGET,0,0,0,angle,WARPF_ABSOLUTEANGLE)
        ZTSL A 0 A_SpawnItemEx("ZangetsutoSlash3FXH", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        ZTSL A 2 A_SpawnItemEx("ZangetsutoSlash3FXH2", cos(pitch)*args[0], args[1], sin(pitch)*args[0]+args[2], 0, 0, 0, args[4], ZANGETSUTO_SPAWNEX)
        stop
    }
}

actor ZangetsutoSlash3FXF : ZangetsutoSlashFXMaster
{
    args 32, 0, 48, 0
    reactiontime 3
    States
    {
    SpawnFrame:
        ZTSL F 0
        goto FX
    }
}
actor ZangetsutoSlash3FXF2 : ZangetsutoSlash3FXF {}

actor ZangetsutoSlash3FXG : ZangetsutoSlashFXMaster
{
    args 32, 0, 48, 0
    reactiontime 4
    States
    {
    SpawnFrame:
        ZTSL G 0
        goto FX
    }
}
actor ZangetsutoSlash3FXG2 : ZangetsutoSlash3FXG {}

actor ZangetsutoSlash3FXH : ZangetsutoSlashFXMaster
{
    args 32, 0, 48, 0
    reactiontime 4
    States
    {
    SpawnFrame:
        ZTSL H 0
        goto FX
    }
}
actor ZangetsutoSlash3FXH2 : ZangetsutoSlash3FXH {}

// REFIRE
actor ZangetsutoActive_P : Powerup { powerup.duration -1 }
actor ZangetsutoRefire_F : Once { Inventory.maxamount 2 }

// PASSIVE
actor ZangetsutoMoveOn_CI : CustomInventory
{
    States
    {
    Pickup:
        TNT1 A 0 A_GiveInventory("ZangetsutoSpeed_P", 1)
        TNT1 A 0 ACS_NamedExecuteWithResult("core_airjumpplayer", 0, 1, JUMPP_ADDSUB)
        TNT1 A 0 A_SpawnItemEx("ZangetsutoSpeedTrailWatcher")
        stop
    }
}

actor ZangetsutoMoveOff_CI : CustomInventory
{
    States
    {
    Pickup:
        TNT1 A 0 A_JumpIfInventory("ZangetsutoSpeed_P", 1, "Take")
        stop
    Take:
        TNT1 A 0 A_TakeInventory("ZangetsutoSpeed_P", 1)
        TNT1 A 0 ACS_NamedExecuteWithResult("core_airjumpplayer", 0, -1, JUMPP_ADDSUB)
        stop
    }
}

actor ZangetsutoSpeed_P : PowerSpeed
{
    +POWERSPEED.NOTRAIL
    powerup.duration 0x7FFFFFFD
    speed 1.25
}

actor ZangetsutoSpeedTrail_P : PowerSpeed { speed 1.0 powerup.duration -1 }

actor ZangetsutoSpeedTrailWatcher : BasicWatcher
{
    States
    {
    Spawn:
        TNT1 A 0
        TNT1 A 2 A_GiveToTarget("ZangetsutoSpeedTrail_P", 1)
        TNT1 A 6 A_TakeFromTarget("ZangetsutoSpeedTrail_P", 1)
        TNT1 A 0 A_JumpIfInTargetInventory("ZangetsutoSpeed_P", 1, "Spawn")
        stop
    }
}

// ON HIT
actor ZangetsutoHit : CustomInventory
{
    States
    {
    Pickup:
        TNT1 A 0 A_PlaySoundEx("weapons/bloodstained/zangetsutohit", "SoundSlot5")
        TNT1 A 0 A_SpawnItemEx("ZangetsutoImpact", frandom(-32, 32), frandom(-32, 32), 32+frandom(-32, 32))
        stop
    }
}

actor ZangetsutoImpact : BasicGraphicEffect
{
    Speed 60
    States
    {
    SpawnFrame:
        ZTSL UWV 2
        stop
    }
}
