class Harpoon : Actor
{
	Default
	{
		Height 8;
		Radius 16;
		Speed 30;
		Damage 1;
		Scale 0.85;
		Projectile;
		MaxStepHeight 8;
		ActiveSound "harpoon/swish";
		SeeSound "harpoon/chain";
	}

	States
	{
	Spawn:
		HPON A 1 A_HarpoonChain();
		Loop;
	Death:
		HPON A 3;
		Stop;
	}

	override int DoSpecialDamage (Actor victim, int damage, Name damagetype)
	{

		if (victim != NULL && target != NULL && !victim.bDontThrust)
		{
			Vector3 thrust = victim.Vec3To(target);
			victim.Vel += thrust.Unit() * (255. * 10 / max(victim.Mass, 1));
		}
		return damage;
	}

	void A_HarpoonChain ()
	{
		A_StartSound("harpoon/active", CHAN_ITEM);
		Spawn("Harpoon_TrailX", Pos, ALLOW_REPLACE);
		Spawn("Harpoon_TrailX", Vec3Offset(-Vel.x/2., -Vel.y/2., -Vel.z/2.), ALLOW_REPLACE);
		Spawn("Harpoon_TrailX", Vec3Offset(-Vel.x, -Vel.y, -Vel.z), ALLOW_REPLACE);
		Spawn("Harpoon_TrailY", Pos, ALLOW_REPLACE);
		Spawn("Harpoon_TrailY", Vec3Offset(-Vel.x/2., -Vel.y/2., -Vel.z/2.), ALLOW_REPLACE);
		Spawn("Harpoon_TrailY", Vec3Offset(-Vel.x, -Vel.y, -Vel.z), ALLOW_REPLACE);
	}
}

class Harpoon_TrailX : Actor
{
	Default
	{
		Scale 0.85;
		+FLATSPRITE
		+NOBLOCKMAP
		+NOGRAVITY
		+ROLLSPRITE
	}
	States
	{
	Spawn:
		HPON B 2 {A_SetRoll(roll + 50.0, SPF_INTERPOLATE); A_FadeOut(0.09);}
		Loop;
	}
}

class Harpoon_TrailY : Harpoon_TrailX
{
	Default
	{
		-FLATSPRITE
		+WALLSPRITE
	}
	States
	{
	Spawn:
		HPON B 2 {A_SetRoll(roll - 50.0, SPF_INTERPOLATE); A_FadeOut(0.09);}
		Loop;
	}
}