Class ZKingScape : SActor { 
	Default {
		//$Category Monsters
		Health 2500;
		Radius 48;
		Height 64;
		Mass 500;
		Speed 15;
		PainChance 20;
		Monster;
		+BOSSDEATH;
		+BOSS;
		
		+FLOAT;
		+NOGRAVITY;
		
		+MISSILEMORE;
		+MISSILEEVENMORE;
		+FLOORCLIP;
		+NEVERRESPAWN;
		-NODROPOFF;
		
		SeeSound "fatso/sight";
		PainSound "fatso/pain";
		DeathSound "fatso/death";
		ActiveSound "fatso/active";
		Obituary "%o faced the wrath of his king.";
		Tag "King Scape The Fatso";
	}
	
	Bool Hiding;
	Bool IsInPain;
	
	States
	{
		Spawn:
			FATT AABB 5 A_Look();
			Loop;
			
		See:
			FATT A 0 A_SetRenderStyle(1.0, STYLE_Translucent);
			//FATT A 0 A_PrintBold(String.Format("%i", (2500-health)/100));
			FATT A 1 A_Jump((2500-health)/100, "Relocate"); // Initial Health - Current Health / 100 makes the max chance 25
			FATT AABB 2 A_Search();
			Loop;
			
		Missile:
			FATT G 0 {
				self.speed = 15;
			}
			FATT G 2 A_FatRaise();
			
			// Found out there's no reason to add FaceTarget() to these since the Attack functions call it themselfs
			FATT AB 1 ThrustThing(angle, 8, 0, 0);
			FATT A 0 BRIGHT {
				A_FatAttack1();
				if (Random(0, 2) == 2) A_ZScapeMissileAtk();
			}
			FATT H 1 BRIGHT A_FatAttack2();
			FATT H 8 BRIGHT A_FatAttack1();
			
			FATT AB 0 ThrustThing(angle, 8, 0, 0);
			FATT H 2 BRIGHT A_FatAttack2();
			FATT H 1 BRIGHT A_FatAttack3();
			FATT H 8 BRIGHT A_FatAttack2();
			
			FATT AB 0 ThrustThing(angle, 8, 0, 0);
			FATT H 1 BRIGHT A_FatAttack3();
			FATT H 1 BRIGHT A_FatAttack1();
			FATT H 8 BRIGHT A_FatAttack3();

			Goto See;
			
		Pain:
			FATT J 1 {
				If(Hiding) A_Jump(256, "Relocate");
			}
			FATT J 1 A_SpawnItemEx("BloodSplatter");
			FATT J 1 A_SpawnItemEx("BloodSplatter");
			FATT J 1 A_SpawnItemEx("BloodSplatter");
			FATT J 0 {
				IsInPain = false;
			}
			FATT J 3 A_Pain();
			
			Goto See;
			
		Death:
			FATT K 0 {
				self.speed = 15;
				If (Hiding) A_Jump(256, "AppearDeath");
			}
			FATT K 10 A_SetRenderStyle(1.0, STYLE_Translucent);
			FATT L 10 A_Scream();
			FATT M 10 A_NoBlocking();
			FATT N 10;
			FATT OPQRS 10;
			FATT T 1 A_BossDeath();
			FATT T 350 {
				LevelLocals.ExitLevel(0, false);
			}
			Stop;
			
		AppearDeath:
			FATT K 10 A_SetRenderStyle(0.2, STYLE_Translucent);
			FATT L 10 {
				A_Scream();
				A_SetRenderStyle(0.4, STYLE_Translucent);
			}
			FATT M 10 {
				A_NoBlocking();
				A_SetRenderStyle(0.6, STYLE_Translucent);
			}
			FATT N 10 A_SetRenderStyle(0.8, STYLE_Translucent);
			FATT OPQRS 10 A_SetRenderStyle(1.0, STYLE_Translucent);
			FATT T 1 A_BossDeath();
			FATT T 350 {
				LevelLocals.ExitLevel(0, false);
			}
			Stop;
		
		Relocate:
			FATT A 0 {
				If(Hiding) {
					A_Jump(256, 6);
					IsInPain = true;
				}
			}
			FATT A 1 A_SetRenderStyle(0.8, STYLE_Translucent);
			FATT A 1 A_SetRenderStyle(0.6, STYLE_Translucent);
			FATT A 1 A_SetRenderStyle(0.4, STYLE_Translucent);
			FATT A 1 A_SetRenderStyle(0.2, STYLE_Translucent);
			
			TNT1 A 0 {
				bSolid = false;
				bFloat = false;
				//bNoPain = true;
				Hiding = true;
				self.Speed = 200;
				self.PainChance = 100;
			}
			
			TNT1 A 35*10 A_Wander;
			
			TNT1 A 0 {
				bSolid = true;
				bFloat = true;
				//bNoPain = false;
				Hiding = false;
			}
			
			FATT A 1 A_SetRenderStyle(0.2, STYLE_Translucent);
			FATT A 1 A_SetRenderStyle(0.4, STYLE_Translucent);
			FATT A 1 A_SetRenderStyle(0.6, STYLE_Translucent);
			FATT A 1 A_SetRenderStyle(0.8, STYLE_Translucent);
			FATT A 1 A_SetRenderStyle(1.0, STYLE_Translucent);
			FATT A 0 {
				IsInPain = false;
				self.speed = 15;
				self.PainChance = 20;
				If(IsInPain) A_Jump(256, "Pain");
			}
			FATT A 1 A_StartSound("fatso/sight", CHAN_BODY);
			Goto See;
	}
}

Extend Class ZKingScape {
	Override Void BeginPlay() {
		Super.BeginPlay();
		ZScapeRoomDimensions ZSRD = ZScapeRoomDimensions(Actor.Spawn("ZScapeRoomDimensions"));
		ZSRD.SetOrigin(self.pos, false);
	}

	Override Void Tick() {
		Super.Tick();
		if( self.pos.z > 512 ) {
			self.SetZ(511.0);
			ThrustThingZ(0, 8, 1, 0);
		}
	}
	
	Void A_Search() { // You cannot hide from the funny
		if (Target == null) return;
		if (CheckSight(target)== true) A_Chase();
		
		else A_Wander();
	}
	
	Void A_ZScapeMissileAtk() {
		For(int i = 0; i < 4; i++) {
			ZScapeMissileMarker Marker = ZScapeMissileMarker(Actor.Spawn("ZScapeMissileMarker"));
			Marker.SetOrigin(self.pos, true);
			Marker.ToFollow = target;
		}
	}
}
