actor IsAIMarine : Inventory {}
Actor MBase : PlayerPawn	//Basic unarmed marine.
{

	Speed 0					//ThrustThing and A_Recoil instead.
	MaxDropOffHeight 63		//Gives the marines a smaller chance of falling into pits. 63, not 64.
	PainSound "*pain"
	MaxStepHeight 56		//This is not too much?

//-----------------------------------------------------------------------

	obituary "%o was killed by a \cadebug marine's\c- nothing."
	Health 115
	Radius 16
	Height 56
	Mass 100
	Painchance 200
//	MaxTargetRange 128		//For close quarter weapons.
	+CANPASS
	+CANPUSHWALLS
	+CANUSEWALLS
	+FLOORCLIP
	+WINDTHRUST
	+NOBLOCKMONST
	+SOLID
	+SHOOTABLE
	+QUICKTORETALIATE
	+NODROPOFF				//In conjunction with MaxDropOffHeight.
	+ISMONSTER				//Needed for the marines to take any projectile damage in invasion mode.
	-COUNTKILL				//In conjunction with +ISMONSTER.
	+NEVERFAST				//Same as above.
	//+NOTIMEFREEZE
	+LOOKALLAROUND
	-TELESTOMP
	deathsound "generic/death"

	//	Translation "112:127=[0,68,181]:[0,0,0]"	//Blue
	//	Translation "112:127=[160,0,0]:[0,0,0]"		//Red

//AOW Base DamageFactoring-----------------------------------------------------------------------

//	DesignatedTeam x (0 Blue 1 Red)
	damagefactor "Fist", 1.0
	damagefactor "Bullet", 1.0
	damagefactor "Rifle", 1.0
	damagefactor "Explosion", 0.3
	damagefactor "Suicide", 1.0
	damagefactor "Fire", 1.0
	damagefactor "Chemical", 2.0
	damagefactor "ChemicalSpecial", 0.0
	damagefactor "Energy", 1.0
	damagefactor "AntiArmor", 0.1
	damagefactor "Time", 1.0
	damagefactor "Disarm", 0.0
	damagefactor "Deconstruction", 0.0
	damagefactor "MassDriver", 0.3	
	damagefactor "Mechstomp", 0.0
	damagefactor "Monster", 1.0

//-----------------------------------------------------------------------

	States //Sorry about the ridiculously long state names.
	{

//-----------------------------------------------------------------------
//
//					Spawn and idle states.
//
//-----------------------------------------------------------------------

	Spawn:
		TNT1 A 0 //Dummy frame needed.
		TNT1 A 0 A_ChangeFlag("Friendly", 0)//Execute ACS script(s) here.
		TNT1 A 0 A_Jump (256, "EnablePushablePreIdle")
		Stop

	EnablePushablePreIdle: //Allows you to push marines if they are in your way while idling.
		TNT1 A 0 A_ChangeFlag ("PUSHABLE", 1)
		TNT1 A 0 A_Jump (256, "Idle")
		Stop

	Idle: //Check if pushed, then look for enemies. If player out of sight, begin to wander. If underwater, sink down. 
		TNT1 A 0 A_JumpIf (momx != 0 || momy != 0, "MomentumCheck")

		PLAY A 1 A_LookEx (0, 0, 0, 1200, 360, "DisablePushablePreAlternateChase")
		TNT1 A 0 A_CheckSight ("DisablePushablePreAlternateWander")

		TNT1 A 0 A_JumpIf (z - floorz == 0, 4) //If non-deep water or at bottom, don't sink.
		TNT1 A 0 A_JumpIf (waterlevel == 1, "SinkDown1")
		TNT1 A 0 A_JumpIf (waterlevel == 2, "SinkDown2")
		TNT1 A 0 A_JumpIf (waterlevel == 3, "SinkDown3")
		TNT1 A 0
		TNT1 A 0 A_Jump (256, "Idle")
		Stop

//-----------------------------------------------------------------------

	MomentumCheck:
		TNT1 A 0 A_JumpIf (momx == 0 && momy == 0, "Idle")
		PLAY A 4
		TNT1 A 0 A_JumpIf (momx == 0 && momy == 0, "Idle")
		PLAY B 4
		TNT1 A 0 A_JumpIf (momx == 0 && momy == 0, "Idle")
		PLAY C 4
		TNT1 A 0 A_JumpIf (momx == 0 && momy == 0, "Idle")
		PLAY D 4
		TNT1 A 0 A_Jump (256, "CheckIfAnyTargetsWhilePushed")
		Stop


	CheckIfAnyTargetsWhilePushed: //Look for potential targets while being pushed.
		TNT1 A 0 A_LookEx (0, 0, 0, 1200, 0, "DisablePushablePreAlternateChase")
		TNT1 A 0 A_Jump (256, "Idle")
		Stop

//-----------------------------------------------------------------------

	SinkDown1: //Ankle deep.
		TNT1 A 0 ThrustThingZ (0, 2, 1, 1)
		TNT1 A 0 A_Jump (256, "Idle")
		Stop

	SinkDown2: //Waist deep.
		TNT1 A 0 ThrustThingZ (0, 1, 1, 1)
		TNT1 A 0 A_Jump (256, "Idle")
		Stop
	
	SinkDown3: //Cmpletely underwater. Slower sinking.
		TNT1 A 0 ThrustThingZ (0, 2, 1, 0)
		TNT1 A 0 A_Jump (256, "Idle")
		Stop


//-----------------------------------------------------------------------
//
//	Chase, check target, check if stuck/underwater and back off states.
//
//-----------------------------------------------------------------------

	See: //Simply for A_SpidRefire. Goes to "ResetTimers".
		TNT1 A 0 //Dummy frame needed.
		TNT1 A 0 A_Jump (256, "ResetTimers")
		Stop

	DisablePushablePreAlternateChase:
		TNT1 A 0 A_ChangeFlag ("PUSHABLE", 0)
		TNT1 A 0 A_Jump (256, "AlternateChase")
		Stop

	AlternateChase:
		TNT1 A 0 A_Jump (85, "ChaseForwardAndLeft", "ChaseForwardAndRight") //1/3 chance of straferunning.
		TNT1 A 0 A_Jump (256, "ChaseForward")
		Stop

	ChaseForward:
		PLAY A 4 A_Recoil (-6.125)
		PLAY B 4 A_Recoil (-6.125)
		PLAY C 4 A_Recoil (-6.125)
		PLAY D 4 A_Recoil (-6.125)
		TNT1 A 0 A_Jump (256, "TurnAndAcquireTargetWhileChase")
		Stop

	ChaseForwardAndLeft: //Straferunning 28% faster.
		TNT1 A 0 ThrustThing (angle*256/360-38.7, 7, 0, 0)
		PLAY A 4 A_Recoil (-0.84)
		TNT1 A 0 ThrustThing (angle*256/360-38.7, 7, 0, 0)
		PLAY B 4 A_Recoil (-0.84)
		TNT1 A 0 ThrustThing (angle*256/360-38.7, 7, 0, 0)
		PLAY C 4 A_Recoil (-0.84)
		TNT1 A 0 ThrustThing (angle*256/360-38.7, 7, 0, 0)
		PLAY D 4 A_Recoil (-0.84)
		TNT1 A 0 A_Jump (256, "TurnAndAcquireTargetWhileChase")
		Stop

	ChaseForwardAndRight:
		TNT1 A 0 ThrustThing (angle*256/360+38.7, 7, 0, 0)
		PLAY A 4 A_Recoil (-0.84)
		TNT1 A 0 ThrustThing (angle*256/360+38.7, 7, 0, 0)
		PLAY B 4 A_Recoil (-0.84)
		TNT1 A 0 ThrustThing (angle*256/360+38.7, 7, 0, 0)
		PLAY C 4 A_Recoil (-0.84)
		TNT1 A 0 ThrustThing (angle*256/360+38.7, 7, 0, 0)
		PLAY D 4 A_Recoil (-0.84)
		TNT1 A 0 A_Jump (256, "TurnAndAcquireTargetWhileChase")
		Stop

	TurnAndAcquireTargetWhileChase: //Allows for marines to turn and acquire targets.
		TNT1 AAAAAAAAAAAAAAAA 0 A_Chase ("", "")
		TNT1 A 0 A_Jump (256, "CheckIfTargetInLOS")
		Stop

	CheckIfTargetInLOS: //Every PLAY A frames allows for attack or backing off. This is to make the marines animate properly.
		TNT1 A 0 A_JumpIfTargetInLOS ("TargetInLOS")
		TNT1 A 0 A_Jump (256, "CheckIfStuck")
		Stop

	TargetInLOS:
		TNT1 A 0 A_JumpIf (health <= 39, 3) //If 39 health or lower, get more aggressive.
		TNT1 A 0 A_JumpIfCloser (256, "AlternateBackOff") //The threshold of when to back off.
		TNT1 A 0 A_Jump (random(0, 256), "CheckIfStuck") //Makes the marines less inhuman.
		TNT1 A 0 A_JumpIfCloser (4096, "Missile") //Max target range.
		TNT1 A 0 A_Jump (256, "CheckIfStuck")
		Stop

//-----------------------------------------------------------------------

	CheckIfStuck: //This state act as a "dynamic threshold timer". Checks if there is any momentum along the x- and y- axis. If false, add to the threshold timer. If true, clear the threshold timer and check if underwater instead.
		TNT1 A 0 A_JumpIf (momx != 0 || momy != 0, "NotStuck")
		TNT1 A 0 A_Jump (256, "Stuck")
		Stop

	NotStuck:
		TNT1 A 0 A_JumpIfInventory ("MoveBackwardsThreshold", 0, "CheckIfUnderwater")
		TNT1 A 0 A_TakeInventory ("MoveBackwardsThreshold", 1)
		TNT1 A 0 A_Jump (256, "CheckIfUnderwater")
		Stop

	Stuck:
		TNT1 A 0 A_JumpIf (momx == 0 && momy == 0, "AddToMoveBackWardsThresholdTimer")
		TNT1 A 0 A_Jump (256, "CheckIfUnderwater")
		Stop


//-----------------------------------------------------------------------


	CheckIfUnderWater:
		TNT1 A 0 A_JumpIf (waterlevel == 1, "Swim1")
		TNT1 A 0 A_JumpIf (waterlevel == 2, "Swim2")
		TNT1 A 0 A_JumpIf (waterlevel == 3, "Swim3")
		TNT1 A 0 A_Jump (256, "AddToTimers") //If not underwater, add to the regular timers instead.
		Stop


	Swim1:
		TNT1 A 0 A_JumpIf (z - floorz == 0, 2) //If non-deep water, don't swim.
		TNT1 A 0 ThrustThingZ (0, 8, 0, 1) //Simulates jumping/swimming in water.
		TNT1 A 0
		TNT1 A 0 A_Jump (256, "AddToTimers")
		Stop

	Swim2:
		TNT1 A 0 ThrustThingZ (0, 16, 0, 1)
		TNT1 A 0 A_Jump (256, "AddToTimers")
		Stop

	Swim3:
		TNT1 A 0 ThrustThingZ (0, 32, 0, 1)
		TNT1 A 0 A_Jump (256, "AddToTimers")
		Stop


//-----------------------------------------------------------------------


	AddToMoveBackWardsThresholdTimer:
		TNT1 A 0 A_GiveInventory ("MoveBackwardsThreshold", 1)
		TNT1 A 0 A_Jump (256, "CheckMoveBackWardsThresholdTimer")
		Stop

	CheckMoveBackWardsThresholdTimer:
		TNT1 A 0 A_JumpIfInventory ("MoveBackwardsThreshold", 1, "ClearMoveBackWardsThresholdTimer")
		TNT1 A 0 A_Jump (256, "CheckIfUnderwater")
		Stop

	ClearMoveBackWardsThresholdTimer:
		TNT1 A 0 A_TakeInventory ("MoveBackwardsThreshold", 1)
		TNT1 A 0 A_Jump (256, "MoveBackwardsAlternate")
		Stop


//-----------------------------------------------------------------------


	MoveBackwardsAlternate: //Same "A_Recoil" and "ThrustThing" values as in "BackOff" states, but with jumps to a different state.
		TNT1 A 0 A_Jump (256, "MoveBackwards", "MoveBackwardsAndLeft", "MoveBackwardsAndRight")
		Stop


	MoveBackwards:
		PLAY A 4 A_Recoil (6.125)
		PLAY B 4 A_Recoil (6.125)
		PLAY C 4 A_Recoil (6.125)
		PLAY D 4 A_Recoil (6.125)
		TNT1 A 0 A_Jump (random(128, 256), 2)
		TNT1 A 0 A_Jump (256, "MoveBackwards")
		Stop
		TNT1 A 0
		TNT1 A 0 A_Jump (256, "AddToTimers")
		Stop

	MoveBackwardsAndLeft:
		PLAY A 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		PLAY B 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		PLAY C 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		PLAY D 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		TNT1 A 0 A_Jump (random(128, 256), 2)
		TNT1 A 0 A_Jump (256, "MoveBackwardsAndLeft")
		Stop
		TNT1 A 0
		TNT1 A 0 A_Jump (256, "AddToTimers")
		Stop

	MoveBackwardsAndRight:
		PLAY A 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		PLAY B 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		PLAY C 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		PLAY D 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		TNT1 A 0 A_Jump (random(128, 256), 2)
		TNT1 A 0 A_Jump (256, "MoveBackwardsAndRight")
		Stop
		TNT1 A 0
		TNT1 A 0 A_Jump (256, "AddToTimers")
		Stop








//-----------------------------------------------------------------------
//
//	Wander, check target, check if stuck/underwater and back off states.
//
//-----------------------------------------------------------------------


	DisablePushablePreAlternateWander: //Nearly identical to chase states.
		TNT1 A 0 A_ChangeFlag ("PUSHABLE", 0)
		TNT1 A 0 A_Jump (256, "AlternateWander")
		Stop

	AlternateWander:
		TNT1 A 0 A_Jump (85, "WanderForwardAndLeft", "WanderForwardAndRight")
		TNT1 A 0 A_Jump (256, "WanderForward")
		Stop

	WanderForward:
		PLAY A 4 A_Recoil (-6.125)
		PLAY B 4 A_Recoil (-6.125)
		PLAY C 4 A_Recoil (-6.125)
		PLAY D 4 A_Recoil (-6.125)
		TNT1 A 0 A_Jump (256, "TurnAndAcquireTargetWhileWander")
		Stop

	WanderForwardAndLeft:
		TNT1 A 0 ThrustThing (angle*256/360-38.7, 7, 0, 0)
		PLAY A 4 A_Recoil (-0.84)
		TNT1 A 0 ThrustThing (angle*256/360-38.7, 7, 0, 0)
		PLAY B 4 A_Recoil (-0.84)
		TNT1 A 0 ThrustThing (angle*256/360-38.7, 7, 0, 0)
		PLAY C 4 A_Recoil (-0.84)
		TNT1 A 0 ThrustThing (angle*256/360-38.7, 7, 0, 0)
		PLAY D 4 A_Recoil (-0.84)
		TNT1 A 0 A_Jump (256, "TurnAndAcquireTargetWhileWander")
		Stop

	WanderForwardAndRight:
		TNT1 A 0 ThrustThing (angle*256/360+38.7, 7, 0, 0)
		PLAY A 4 A_Recoil (-0.84)
		TNT1 A 0 ThrustThing (angle*256/360+38.7, 7, 0, 0)
		PLAY B 4 A_Recoil (-0.84)
		TNT1 A 0 ThrustThing (angle*256/360+38.7, 7, 0, 0)
		PLAY C 4 A_Recoil (-0.84)
		TNT1 A 0 ThrustThing (angle*256/360+38.7, 7, 0, 0)
		PLAY D 4 A_Recoil (-0.84)
		TNT1 A 0 A_Jump (256, "TurnAndAcquireTargetWhileWander")
		Stop


	TurnAndAcquireTargetWhileWander:
		TNT1 AAAAAAAAAAAAAAAA 0 A_Wander
		TNT1 A 0 A_LookEx (0, 0, 0, 1200, 0, "CheckIfTargetInLOS")
		TNT1 A 0 A_Jump (256, "CheckIfStuckWhileWander")
		Stop


//-----------------------------------------------------------------------


	CheckIfStuckWhileWander:
		TNT1 A 0 A_JumpIf (momx != 0 || momy != 0, "NotStuckWhileWander")
		TNT1 A 0 A_Jump (256, "StuckWhileWander")
		Stop

	NotStuckWhileWander:
		TNT1 A 0 A_JumpIfInventory ("MoveBackwardsThreshold", 0, "CheckIfUnderwaterWhileWander")
		TNT1 A 0 A_TakeInventory ("MoveBackwardsThreshold", 1)
		TNT1 A 0 A_Jump (256, "CheckIfUnderwaterWhileWander")
		Stop

	StuckWhileWander:
		TNT1 A 0 A_JumpIf (momx == 0 && momy == 0, "AddToMoveBackWardsThresholdTimerWhileWander")
		TNT1 A 0 A_Jump (256, "CheckIfUnderwaterWhileWander")
		Stop


//-----------------------------------------------------------------------


	CheckIfUnderwaterWhileWander:
		TNT1 A 0 A_JumpIf (waterlevel == 1, "SwimWhileWander1")
		TNT1 A 0 A_JumpIf (waterlevel == 2, "SwimWhileWander2")
		TNT1 A 0 A_JumpIf (waterlevel == 3, "SwimWhileWander3")
		TNT1 A 0 A_Jump (256, "AlternateWander")
		Stop


	SwimWhileWander1:
		TNT1 A 0 A_JumpIf (z - floorz == 0, 2)
		TNT1 A 0 ThrustThingZ (0, 8, 0, 1)
		TNT1 A 0
		TNT1 A 0 A_Jump (256, "AlternateWander")
		Stop

	SwimWhileWander2:
		TNT1 A 0 ThrustThingZ (0, 16, 0, 1)
		TNT1 A 0 A_Jump (256, "AlternateWander")
		Stop

	SwimWhileWander3:
		TNT1 A 0 ThrustThingZ (0, 32, 0, 1)
		TNT1 A 0 A_Jump (256, "AlternateWander")
		Stop


//-----------------------------------------------------------------------


	AddToMoveBackWardsThresholdTimerWhileWander:
		TNT1 A 0 A_GiveInventory ("MoveBackwardsThreshold", 1)
		TNT1 A 0 A_Jump (256, "CheckMoveBackWardsThresholdTimerWhileWander")
		Stop

	CheckMoveBackWardsThresholdTimerWhileWander:
		TNT1 A 0 A_JumpIfInventory ("MoveBackwardsThreshold", 1, "ClearMoveBackWardsThresholdTimerWhileWander")
		TNT1 A 0 A_Jump (256, "CheckIfUnderwaterWhileWander")
		Stop

	ClearMoveBackWardsThresholdTimerWhileWander:
		TNT1 A 0 A_TakeInventory ("MoveBackwardsThreshold", 1)
		TNT1 A 0 A_Jump (256, "MoveBackwardsAlternateWhileWander")
		Stop


//-----------------------------------------------------------------------


	MoveBackwardsAlternateWhileWander:
		TNT1 A 0 A_Jump (256, "MoveBackwardsWhileWander", "MoveBackwardsAndLeftWhileWander", "MoveBackwardsAndRightWhileWander")
		Stop


	MoveBackwardsWhileWander:
		PLAY A 4 A_Recoil (6.125)
		PLAY B 4 A_Recoil (6.125)
		PLAY C 4 A_Recoil (6.125)
		PLAY D 4 A_Recoil (6.125)
		TNT1 A 0 A_Jump (random(128, 256), 2)
		TNT1 A 0 A_Jump (256, "MoveBackwardsWhileWander")
		Stop
		TNT1 A 0
		TNT1 A 0 A_Jump (256, "AlternateWander")
		Stop

	MoveBackwardsAndLeftWhileWander:
		PLAY A 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		PLAY B 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		PLAY C 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		PLAY D 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		TNT1 A 0 A_Jump (random(128, 256), 2)
		TNT1 A 0 A_Jump (256, "MoveBackwardsAndLeftWhileWander")
		Stop
		TNT1 A 0
		TNT1 A 0 A_Jump (256, "AlternateWander")
		Stop

	MoveBackwardsAndRightWhileWander:
		PLAY A 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		PLAY B 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		PLAY C 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		PLAY D 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		TNT1 A 0 A_Jump (random(128, 256), 2)
		TNT1 A 0 A_Jump (256, "MoveBackwardsAndRightWhileWander")
		Stop
		TNT1 A 0
		TNT1 A 0 A_Jump (256, "AlternateWander")
		Stop








//-----------------------------------------------------------------------
//
//			Back off from target and missile states.
//
//-----------------------------------------------------------------------


	AlternateBackOff: //Same formula as in the chase states, but only backwards movement and different jumps.
		TNT1 A 0 A_Jump (256, "BackOffBackwards", "BackOffBackwardsAndLeft", "BackOffBackwardsAndRight")
		Stop


	BackOffBackwards:
		TNT1 A 0 A_FaceTarget
		PLAY A 4 A_Recoil (6.125)
		PLAY B 4 A_Recoil (6.125)
		PLAY C 4 A_Recoil (6.125)
		PLAY D 4 A_Recoil (6.125)
		TNT1 A 0 A_JumpIf (health <= 50, "Missile") //A bit desperate.
		TNT1 A 0 A_Jump (random(128, 256), 2)
		TNT1 A 0 A_Jump (256, "BackOffBackwards")
		Stop
		TNT1 A 0 A_SpidRefire
		TNT1 A 0 A_Jump (256, "Missile")
		Stop

	BackOffBackwardsAndLeft:
		TNT1 A 0 A_FaceTarget
		PLAY A 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		PLAY B 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		PLAY C 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		PLAY D 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		TNT1 A 0 A_JumpIf (health <= 50, "Missile")
		TNT1 A 0 A_Jump (random(128, 256), 2)
		TNT1 A 0 A_Jump (256, "BackOffBackwardsAndLeft")
		Stop
		TNT1 A 0 A_SpidRefire
		TNT1 A 0 A_Jump (256, "Missile")
		Stop

	BackOffBackwardsAndRight:
		TNT1 A 0 A_FaceTarget
		PLAY A 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		PLAY B 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		PLAY C 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		PLAY D 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		TNT1 A 0 A_JumpIf (health <= 50, "Missile")
		TNT1 A 0 A_Jump (random(128, 256), 2)
		TNT1 A 0 A_Jump (256, "BackOffBackwardsAndRight")
		Stop
		TNT1 A 0 A_SpidRefire
		TNT1 A 0 A_Jump (256, "Missile")
		Stop


	Missile:
		TNT1 A 0 //Dummy frame needed.
		TNT1 A 0 A_Jump (256, "ResetTimers")
		Stop








//-----------------------------------------------------------------------
//
//				Pain, death and respawn states.
//
//-----------------------------------------------------------------------


	Pain.FireSpecial:
		TNT1 A 0 A_Jump (256, "DisablePushablePreAlternatePainBackOff")
	Pain.Fire:
        TNT1 A 0 ACS_ExecuteAlways (SC_DAMAGEOVERTIME, 0, OVERTIME_FIRE)
        TNT1 A 0 A_Jump (256, "DisablePushablePreAlternatePainBackOff")
	Pain.ChemicalSpecial:
		TNT1 A 0 A_Jump (256, "DisablePushablePreAlternatePainBackOff")
	Pain.Chemical:
        TNT1 A 0 ACS_ExecuteAlways (SC_DAMAGEOVERTIME, 0, OVERTIME_CHEM)
		TNT1 A 0 A_Jump (256, "DisablePushablePreAlternatePainBackOff")

	Pain:
		TNT1 A 0
		TNT1 A 0 A_Jump (256, "DisablePushablePreAlternatePainBackOff")
		Stop
		
	DisablePushablePreAlternatePainBackOff: //If woken up by getting hurt, clear the +PUSHABLE flag.
		TNT1 A 0 A_ChangeFlag ("PUSHABLE", 0)
		TNT1 A 0 A_Jump (256, "AlternatePainBackOff")
		Stop	


//-----------------------------------------------------------------------


	AlternatePainBackOff:
		TNT1 A 0 A_Jump (256, "PainBackOffBackwards", "PainBackOffBackwardsAndLeft", "PainBackOffBackwardsAndRight")
		Stop


	PainBackOffBackwards:
		TNT1 A 0 A_FaceTarget
		PLAY G 4 A_Recoil (6.125)
		TNT1 A 0 A_Pain
		PLAY G 4 A_Recoil (6.125)
		TNT1 A 0 A_Jump (256, "CheckIfTargetInLOS") //Try to attack right back if possible.
		Stop

	PainBackOffBackwardsAndLeft:
		TNT1 A 0 A_FaceTarget
		PLAY G 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		TNT1 A 0 A_Pain
		PLAY G 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360+166.7, 7, 0, 0)
		TNT1 A 0 A_Jump (256, "CheckIfTargetInLOS")
		Stop

	PainBackOffBackwardsAndRight:
		TNT1 A 0 A_FaceTarget
		PLAY G 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		TNT1 A 0 A_Pain
		PLAY G 4 A_Recoil (0.84)
		TNT1 A 0 ThrustThing (angle*256/360-166.7, 7, 0, 0)
		TNT1 A 0 A_Jump (256, "CheckIfTargetInLOS")
		Stop


//-----------------------------------------------------------------------


	Death:
		PLAY H 10
		PLAY I 10 A_PlayerScream
		PLAY J 10 A_NoBlocking
		PLAY KLM 10
		PLAY N -1
		Stop

	XDeath:
		PLAY O 4
		PLAY P 0 A_NoBlocking
		PLAY PPP 0 A_SpawnItemEx("Credits1",random(-4,4),random(-4,4),random(32,48),random(-4,4),random(-4,4),random(4,8),0,0,128)
		PLAY P 0 A_SpawnItemEx("PowerupCrate",random(-4,4),random(-4,4),random(32,48),random(2,4),random(-2,2),random(2,4),0,0,230)
		PLAY P 0 A_Scream
		PLAY P 0 A_PlaySound ("misc/gib", 7)
		PLAY P 0 A_PlaySound ("misc/gib", 6)
		PLAY P 4 A_SpawnItemEx ("MarineGoreExplosion")
		PLAY Q 4 A_SpawnItemEx ("MarineGoreExplosion2")
		PLAY R 4 A_SpawnItemEx ("MarineGoreExplosion3")
		PLAY STU 4
		PLAY V -1
		stop

	Death.Explosion:
		PLAY H 1
		PLAY H 0 A_Jump(128,"Death")
		goto XDeath

	Death.FireSpecial:
	Death.Fire:
		// stop all sound channels
		TNT1 A 0 A_StopSound (0) TNT1 A 0 A_StopSound (4)
		TNT1 A 0 A_StopSound (1) TNT1 A 0 A_StopSound (5)
		TNT1 A 0 A_StopSound (2) TNT1 A 0 A_StopSound (6)
		TNT1 A 0 A_StopSound (3) TNT1 A 0 A_StopSound (7)
		DISR K 0 A_SpawnItemEx("BurningCorpse",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
		DISR K 0 A_NoBlocking
		PLAY N -1 A_SetTranslucent(0.0,0)
		stop

	Death.ChemicalSpecial:
	Death.Chemical:
		// stop all sound channels
		TNT1 A 0 A_StopSound (0) TNT1 A 0 A_StopSound (4)
		TNT1 A 0 A_StopSound (1) TNT1 A 0 A_StopSound (5)
		TNT1 A 0 A_StopSound (2) TNT1 A 0 A_StopSound (6)
		TNT1 A 0 A_StopSound (3) TNT1 A 0 A_StopSound (7)
		DISR K 0 A_SpawnItemEx("ChemicalCorpse",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
		DISR K 0 A_NoBlocking
		PLAY N -1 A_SetTranslucent(0.0,0)
		stop

	DeathWaitPreTryToRespawn:
		PLAY N 12
		TNT1 A 0 A_Jump (random(0, 256), "TryToRespawn")
		TNT1 A 0 A_Jump (256, "DeathWaitPreTryToRespawn")
		Stop

	XDeathWaitPreTryToRespawn:
		PLAY W 12
		TNT1 A 0 A_Jump (random(0, 256), "TryToRespawn")
		TNT1 A 0 A_Jump (256, "XDeathWaitPreTryToRespawn")
		Stop


	TryToRespawn: //Try to to respawn every 2 seconds.
		TNT1 A 0 A_Respawn (1 | 4)
		TNT1 A 70
		TNT1 A 0 A_Jump (256, "TryToRespawn")
		Stop








//-----------------------------------------------------------------------
//
//						Timer states.
//
//-----------------------------------------------------------------------


	AddToTimers:
		TNT1 A 0 A_GiveInventory ("ClearTarget", 1)
		TNT1 A 0 A_CheckSight ("AddToNoPlayerInSightTimer") //No point in adding a counter if the player has been out of sight for only a few frames.
		
		TNT1 A 0 A_JumpIfInventory ("NoPlayerInSight", 0, "CheckTimers")
		TNT1 A 0 A_TakeInventory ("NoPlayerInSight", 128) //If player in sight, clear this timer. Otherwise, the marine will sometimes suddenly stop and start idling when you go around a corner.
		TNT1 A 0 A_Jump (256, "CheckTimers")
		Stop
	//These two act as one state.
	AddToNoPlayerInSightTimer:
		TNT1 A 0 A_GiveInventory ("NoPlayerInSight", 1)
		TNT1 A 0 A_Jump (256, "CheckTimers")
		Stop

	CheckTimers:
		TNT1 A 0 A_JumpIfInventory ("ClearTarget", 1, "ClearTarget")
		TNT1 A 0 A_JumpIfInventory ("NoPlayerInSight", 128, "CheckIfPlayerInSight")
		TNT1 A 0 A_Jump (256, "AlternateChase")
		Stop


	ClearTarget:
		TNT1 A 0 A_TakeInventory ("ClearTarget", 1)
		TNT1 A 0 A_ClearTarget
		TNT1 A 0 A_Jump (256, "CheckTimers") //In case both of the timers have been reached, check again so that the other one will reset as well.
		Stop

	CheckIfPlayerInSight:
		TNT1 A 0 A_TakeInventory ("NoPlayerInSight", 128)
		TNT1 A 0 A_CheckSight ("EnablePushablePreIdle")
		TNT1 A 0 A_Jump (256, "CheckTimers")
		Stop


//-----------------------------------------------------------------------


	ResetTimers: //This is ONLY connected to "See", "Missile" and "Pain" states. Reset timers so that the marines don't all of sudden decide to idle in the middle of a battle.
		TNT1 A 0 A_JumpIfInventory ("ClearTarget", 0, 4)
		TNT1 A 0 A_TakeInventory ("ClearTarget", 2)
		TNT1 A 0 A_JumpIfInventory ("NoPlayerInSight", 0, 2)
		TNT1 A 0 A_TakeInventory ("NoPlayerInSight", 128)
		TNT1 A 0
		TNT1 A 0 A_Jump (256, "AlternateChase")
		Stop
	ClearTargetBlue:
		TNT1 A 0 A_ClearTarget
		Goto See
	}
}
