Actor ThreadcutterHit
{
	Alpha 0.99
	Renderstyle Add
	+NOGRAVITY
	+NOINTERACTION
	+NOTIMEFREEZE
	+NOTONAUTOMAP
	+FORCEXYBILLBOARD
	Scale 0.05
	States
	{
		Spawn:
			SHCK B 1 A_FadeOut(0.2)
			SHCK B 0 A_SetScale(ScaleX+0.02, ScaleX)
			Loop
	}
}

Actor ThreadcutterTrail1
{
	Alpha 0.99
	Renderstyle Translucent
	+NOGRAVITY
	+NOINTERACTION
	+NOTONAUTOMAP
	+NOTIMEFREEZE
	States
	{
		Spawn:
			KNF1 A 1 A_FadeOut(0.25)
			Loop
	}
}

Actor ThreadcutterWall1
{
	Alpha 0.99
	+NOGRAVITY
	+NOINTERACTION
	+NOTONAUTOMAP
	+NOTIMEFREEZE
	Renderstyle Translucent
	States
	{
		Spawn:
			KNF1 A 35 A_CheckSight("Fadying")
			Loop
		Fadying:
			KNF1 A 1 A_FadeOut(0.05)
			Loop
	}
}

Actor ThreadcutterKnife1
{
  Radius 6
  Height 10
  Speed 90
  Damage 3
  Projectile
  ProjectileKickback 200
  Gravity 0.8
  -NOGRAVITY
  //+THRUGHOST
  +NOTIMEFREEZE
  //+DONTSPLASH
  //+EXPLODEONWATER
  DamageType "Manuel"
  SeeSound "Threadcutter/Fly"
  //Renderstyle Add
  Obituary "%o was nailed to the wheel by %k's Manuel'ing skills."
  
  /*For one's curiousity: Manuel was a brand of butter in Poland during
  iron-curtain period. One of the only ones aviable back then, to be honest.
  It's long gone today, but it was still pretty livid in the memory of polish
  people, so a move in a rather crappy to dance to rather crappy music that is
  Disco-Polo (google it if you dare) was named after it, as it was resembling
  putting butter on some bread. So yeah, long story short - very distant
  reference to a butter, or something. THE MORE YOU KNOW!*/
  States
  {
  Spawn:
    TNT1 A 0 NoDelay ThrustThingZ(0,14,0,1)
    TNT1 A 0 A_ScaleVelocity(frandom(0.8,1.2))
  Looplet:
    KNF1 A 1 A_SpawnItemEx("ThreadcutterTrail1",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
    Loop
  Death:
    TNT1 A 0 A_SpawnItemEx("ThreadcutterWall1",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
    TNT1 A 0 A_SpawnItemEx("ThreadcutterHit",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
    TNT1 A 0 A_PlaySound("Threadcutter/Hit",5,0.8)
	Stop
  Crash:
    TNT1 A 0 A_PlaySound("Threadcutter/Hit",5,0.8)
    TNT1 A 0 A_SpawnItemEx("ThreadcutterHit",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	Stop
  XDeath:
	TNT1 A 0 A_SpawnItemEx("Blood")
    TNT1 A 0 A_PlaySound("Threadcutter/Hit",5,0.8)
    Stop
  }
}


Actor ThreadcutterCleaver1 : ThreadcutterKnife1
{
  Radius 9
  Height 15
  Damage 5
  Gravity 1.0
  States
  {
  Spawn:
    TNT1 A 0 NoDelay ThrustThingZ(0,14,0,1)
    TNT1 A 0 A_ScaleVelocity(frandom(0.8,1.2))
    TNT1 A 0 A_PlaySound("Threadcutter/Cleaver",5,0.7,1)
  Looplet:
    CLVR A 0 A_Jump(256,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) //Let's randomize it a bit.
    CLVR AABBCCDDEEFFGGHH 1 A_SpawnItemEx("ThreadcutterCleaverTrail",0,0,0,0,0,0,0,SXF_CLIENTSIDE|SXF_TRANSFERSPRITEFRAME)
    Loop
  Death:
    TNT1 A 0 A_PlaySound("Threadcutter/Hit",5,0.8)
    TNT1 A 0 A_SpawnItemEx("ThreadcutterHit",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
    TNT1 A 0 A_JumpIf(z > ceilingz-16, "DeathCeiling") //Shamelessly stolen from Psychic HAHA.
    TNT1 A 0 A_JumpIf(z == floorz, "DeathFloor")
    TNT1 A 0 A_SpawnItemEx("CleaverWall",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	Stop
  DeathCeiling:
    TNT1 A 0 A_SpawnItemEx("CleaverCeiling",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	Stop
  DeathFloor:
    TNT1 A 0 A_SpawnItemEx("CleaverFloor",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	Stop
  Crash:
    TNT1 A 0 A_PlaySound("Threadcutter/Hit",5,0.8)
    TNT1 A 0 A_SpawnItemEx("ThreadcutterHit",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	Stop
  XDeath:
	TNT1 AA 0 A_SpawnItemEx("Blood")
    TNT1 A 0 A_PlaySound("Threadcutter/Hit",5,0.8)
    Stop
  }
}

Actor ThreadcutterCleaverTrail : ThreadcutterTrail1
{
	+NOTIMEFREEZE
	States
	{
		Spawn:
			"####" "#" 1 A_FadeOut(0.2)
			Loop
	}
}

Actor CleaverWall : ThreadcutterWall1
{
	States
	{
		Spawn:
			CLVR H 35 A_CheckSight("Fadying")
			Loop
		Fadying:
			CLVR H 1 A_FadeOut(0.05)
			Loop
	}
}

Actor CleaverCeiling : ThreadcutterWall1
{
	States
	{
		Spawn:
			CLVR F 35 A_CheckSight("Fadying")
			Loop
		Fadying:
			CLVR F 1 A_FadeOut(0.05)
			Loop
	}
}

Actor CleaverFloor : ThreadcutterWall1
{
	States
	{
		Spawn:
			CLVR B 35 A_CheckSight("Fadying")
			Loop
		Fadying:
			CLVR B 1 A_FadeOut(0.05)
			Loop
	}
}


//Powered mode

Actor ThreadcutterTrail2 : ThreadcutterTrail1
{
	States
	{
		Spawn:
			KNF2 A 1 A_FadeOut(0.2)
			Loop
	}
}

Actor ThreadcutterWall2 : ThreadcutterWall1
{
	States
	{
		Spawn:
			KNF2 A 35 A_CheckSight("Fadying")
			Loop
		Fadying:
			KNF2 A 1 A_FadeOut(0.05)
			Loop
	}
}

Actor ThreadcutterKnife2 : ThreadcutterKnife1
{
  Damage 2
  Speed 70
  +NOGRAVITY
  +SEEKERMISSILE
  +BOUNCEONWALLS
  +BOUNCEONCEILINGS
  +BOUNCEONFLOORS
  +RIPPER
  +BLOODLESSIMPACT
  BounceFactor 1.0
  WallBounceFactor 1.0
  BounceSound "Threadcutter/Hit"
  BounceCount 6
  Obituary "%o was nailed to the wheel and everything else by %k's supreme Manuel'ing skills."
  //Var Int User_Counter;
  States
  {
  Spawn:
    TNT1 A 0 NoDelay A_ScaleVelocity(frandom(0.8,1.2))
	//TNT1 A 0 ThrustThingZ(0,14,0,1)
    //TNT1 AA 0 A_SetUserVar("User_Counter",3)
  Looplet1:
    //KNF2 A 0 A_SetUserVar("User_Counter",User_Counter - 1)
    //KNF2 A 0 A_JumpIf(User_Counter > 0, 2)
	KNF2 A 0 A_JumpIfInTargetInventory("PowerZaWarudo",1,"DecreaseSpeed")
	KNF2 A 0 A_SeekerMissile(6,10,SMF_PRECISE|SMF_LOOK|SMF_CURSPEED,50,5)
    KNF2 A 1 A_SpawnItemEx("ThreadcutterTrail2",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
    Loop
  DecreaseSpeed:
	KNF2 A 0 A_ScaleVelocity(0.25)
	Goto Looplet2
  IncreaseSpeed:
	KNF2 A 0 A_ScaleVelocity(4.0)
	Goto Looplet1
   Looplet2:
	KNF2 A 0 A_SeekerMissile(2,4,SMF_PRECISE|SMF_LOOK|SMF_CURSPEED,50,5)
    KNF2 A 3 A_SpawnItemEx("ThreadcutterTrail2",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
	KNF2 A 0 A_JumpIfInTargetInventory("PowerZaWarudo",1,"Looplet2")
	Goto IncreaseSpeed
  Death:
    TNT1 A 0 A_PlaySound("Threadcutter/Hit",5,0.8)
    TNT1 A 0 A_SpawnItemEx("ThreadcutterHit",0,0,0,0,0,0,0,SXF_CLIENTSIDE)
    TNT1 A 0 A_SpawnItemEx("ThreadcutterWall2",0,0,0,0,0,0,0,SXF_CLIENTSIDE,128)
	Stop
  }
}

Actor ThreadcutterCleaver2 : ThreadcutterCleaver1
{
  Radius 9
  Height 15
  Damage 3
  Speed 70
  +NOGRAVITY
  +SEEKERMISSILE
  +BOUNCEONWALLS
  +BOUNCEONCEILINGS
  +BOUNCEONFLOORS
  +RIPPER
  +BLOODLESSIMPACT
  BounceFactor 1.0
  WallBounceFactor 1.0
  BounceSound "Threadcutter/Hit"
  BounceCount 6
  var int User_Frame;
  States
  {
  Spawn:
    "####" "#" 0 NoDelay A_ScaleVelocity(frandom(0.8,1.2))
	//"####" "#" 0 ThrustThingZ(0,14,0,1)
    "####" "#" 0 A_PlaySound("Threadcutter/Cleaver",5,0.7,1)
    "####" "#" 0 A_SetUserVar("User_Frame",random(0,14))
  FrameCheck:
	"####" "#" 0 A_JumpIf(User_Frame <= 2, "FrameA")
	"####" "#" 0 A_JumpIf(User_Frame <= 4, "FrameB")
	"####" "#" 0 A_JumpIf(User_Frame <= 6, "FrameC")
	"####" "#" 0 A_JumpIf(User_Frame <= 8, "FrameD")
	"####" "#" 0 A_JumpIf(User_Frame <= 10, "FrameE")
	"####" "#" 0 A_JumpIf(User_Frame <= 12, "FrameF")
	"####" "#" 0 A_JumpIf(User_Frame <= 14, "FrameG")
	"####" "#" 0 A_JumpIf(User_Frame <= 16, "FrameH")
  FrameA:
    CLVR A 0
	Goto Tempo
  FrameB:
    CLVR B 0
	Goto Tempo
  FrameC:
    CLVR C 0
	Goto Tempo
  FrameD:
    CLVR D 0
	Goto Tempo
  FrameE:
    CLVR E 0
	Goto Tempo
  FrameF:
    CLVR F 0
	Goto Tempo
  FrameG:
    CLVR G 0
	Goto Tempo
  FrameH:
    CLVR H 0 A_JumpIf(User_Frame >= 8, 1)
	Goto Tempo
	CLVR A 0 A_SetUserVar("User_Frame",1)
	Goto Tempo
  Tempo:
	"####" "#" 0 A_JumpIfInTargetInventory("PowerZaWarudo",1,"DecreaseSpeed")
  Looplet:
    "####" "#" 0 A_SetUserVar("User_Frame", User_Frame + 1)
	"####" "#" 0 A_SeekerMissile(6,10,SMF_PRECISE|SMF_LOOK|SMF_CURSPEED,50,5)
    "####" "#" 1 A_SpawnItemEx("ThreadcutterCleaverTrail",0,0,0,0,0,0,0,SXF_CLIENTSIDE|SXF_TRANSFERSPRITEFRAME)
    Goto FrameCheck
  DecreaseSpeed:
	"####" "#" 0 A_ScaleVelocity(0.25)
  Looplet2:
    "####" "#" 0 A_SetUserVar("User_Frame", User_Frame + 1)
	"####" "#" 0 A_SeekerMissile(2,4,SMF_PRECISE|SMF_LOOK|SMF_CURSPEED,50,5)
    "####" "###" 1 A_SpawnItemEx("ThreadcutterCleaverTrail",0,0,0,0,0,0,0,SXF_CLIENTSIDE|SXF_TRANSFERSPRITEFRAME)
	"####" "#" 0 A_JumpIfInTargetInventory("PowerZaWarudo",1,"FrameCheck2")
	Goto IncreaseSpeed
  FrameCheck2:
	"####" "#" 0 A_JumpIf(User_Frame <= 2, "Frame2A")
	"####" "#" 0 A_JumpIf(User_Frame <= 4, "Frame2B")
	"####" "#" 0 A_JumpIf(User_Frame <= 6, "Frame2C")
	"####" "#" 0 A_JumpIf(User_Frame <= 8, "Frame2D")
	"####" "#" 0 A_JumpIf(User_Frame <= 10, "Frame2E")
	"####" "#" 0 A_JumpIf(User_Frame <= 12, "Frame2F")
	"####" "#" 0 A_JumpIf(User_Frame <= 14, "Frame2G")
	"####" "#" 0 A_JumpIf(User_Frame <= 16, "Frame2H")
  Frame2A:
    CLVR A 0
	Goto Looplet2
  Frame2B:
    CLVR B 0
	Goto Looplet2
  Frame2C:
    CLVR C 0
	Goto Looplet2
  Frame2D:
    CLVR D 0
	Goto Looplet2
  Frame2E:
    CLVR E 0
	Goto Looplet2
  Frame2F:
    CLVR F 0
	Goto Looplet2
  Frame2G:
    CLVR G 0
	Goto Looplet2
  Frame2H:
    CLVR H 0 A_JumpIf(User_Frame >= 8, 1)
	Goto Looplet2
	CLVR A 0 A_SetUserVar("User_Frame",1)
	Goto Looplet2
  IncreaseSpeed:
	"####" "#" 0 A_ScaleVelocity(4.0)
	Goto FrameCheck
  }
}

actor PowerZaWarudo : PowerTimeFreezer
{
	//Inventory.icon "TNT1A0
}

//"Dio has rocked... for a loong, loong time... now it's time for him to pass the tooorch!"
actor Dio : PowerupGiver 
{
	inventory.maxamount 0
	+INVENTORY.AUTOACTIVATE
	powerup.type "ZaWarudo"
	Powerup.Color Cyan, 0.05
	powerup.duration 0x7FFFFFFF
	states
	{
	Spawn:
		TNT1 A -1
		Stop
	}
}