
// Dirt clump (spawned by spike) --------------------------------------------

class DirtClump : Actor
{
	Default
	{
		+NOBLOCKMAP
		+NOTELEPORT
	}
	States
	{
	Spawn:
		TSPK C 20;
		Loop;
	}
}

// Spike (thrust floor) -----------------------------------------------------

class ThrustFloor : Actor native
{
	Default
	{
		Radius 20;
		Height 128;
	}

	native void A_ThrustImpale();

	States
	{
	ThrustRaising:
		TSPK A 2 A_ThrustRaise;
		Loop;
	BloodThrustRaising:
		TSPK B 2 A_ThrustRaise;
		Loop;
	ThrustLower:
		TSPK A 2 A_ThrustLower;
		Loop;
	BloodThrustLower:
		TSPK B 2 A_ThrustLower;
		Loop;
	ThrustInit1:
		TSPK A 3;
		TSPK A 4 A_ThrustInitDn;
		TSPK A -1;
		Loop;
	BloodThrustInit1:
		TSPK B 3;
		TSPK B 4 A_ThrustInitDn;
		TSPK B -1;
		Loop;
	ThrustInit2:
		TSPK A 3;
		TSPK A 4 A_ThrustInitUp;
		TSPK A 10;
		Loop;
	BloodThrustInit2:
		TSPK B 3;
		TSPK B 4 A_ThrustInitUp;
		TSPK B 10;
		Loop;
	ThrustRaise:
		TSPK A 8 A_ThrustRaise;
		TSPK A 6 A_ThrustRaise;
		TSPK A 4 A_ThrustRaise;
		TSPK A 3 A_SetSolid;
		TSPK A 2 A_ThrustImpale;
		Loop;
	BloodThrustRaise:
		TSPK B 8 A_ThrustRaise;
		TSPK B 6 A_ThrustRaise;
		TSPK B 4 A_ThrustRaise;
		TSPK B 3 A_SetSolid;
		TSPK B 2 A_ThrustImpale;
		Loop;
	}
	
	//===========================================================================
	//
	// Thrust floor stuff
	//
	// Thrust Spike Variables
	//		master		pointer to dirt clump actor
	//		special2	speed of raise
	//		args[0]		0 = lowered,  1 = raised
	//		args[1]		0 = normal,   1 = bloody
	//===========================================================================

	void A_ThrustInitUp()
	{
		special2 = 5;	// Raise speed
		args[0] = 1;		// Mark as up
		Floorclip = 0;
		bSolid = true;
		bNoTeleport = true;
		bFloorClip = true;
		special1 = 0;
	}

	void A_ThrustInitDn()
	{
		special2 = 5;	// Raise speed
		args[0] = 0;		// Mark as down
		Floorclip = Default.Height;
		bSolid = false;
		bNoTeleport = true;
		bFloorClip = true;
		bInvisible = true;
		master = Spawn("DirtClump", Pos, ALLOW_REPLACE);
	}


	void A_ThrustRaise()
	{
		if (RaiseMobj (special2))
		{	// Reached it's target height
			args[0] = 1;
			if (args[1])
				SetStateLabel ("BloodThrustInit2", true);
			else
				SetStateLabel ("ThrustInit2", true);
		}

		// Lose the dirt clump
		if ((Floorclip < Height) && master)
		{
			master.Destroy ();
			master = null;
		}

		// Spawn some dirt
		if (random[Thrustraise]()<40)
			SpawnDirt (radius);
		special2++;							// Increase raise speed
	}

	void A_ThrustLower()
	{
		if (SinkMobj (6))
		{
			args[0] = 0;
			if (args[1])
				SetStateLabel ("BloodThrustInit1", true);
			else
				SetStateLabel ("ThrustInit1", true);
		}
	}

	
}

// Spike up -----------------------------------------------------------------

class ThrustFloorUp : ThrustFloor
{
	Default
	{
		+SOLID
		+NOTELEPORT +FLOORCLIP
	}
	States
	{
	Spawn:
		Goto ThrustInit2;
	}
}

// Spike down ---------------------------------------------------------------

class ThrustFloorDown : ThrustFloor
{
	Default
	{
		+NOTELEPORT +FLOORCLIP
		+INVISIBLE
	}
	States
	{
	Spawn:
		Goto ThrustInit1;
	}
}
