
class ZDamageObject : SwitchableDecoration
{
	Default
	{
		+BUMPSPECIAL
		Activation THINGSPEC_ThingActs | THINGSPEC_ThingTargets;
	}

	override void PostBeginPlay()
	{
		self.A_SetSpecial(130, 0);

		Super.PostBeginPlay();
	}

	override void Activate(Actor activator)
	{
		Actor a = self;
		if(a.health<1) return;
		if(activator==null || activator.target==null) return;
		let p = activator.target;
		p.A_DamageSelf(5);
	}

}

class ZBabeObject : SwitchableDecoration
{
	int shrinkcount;
	bool frozen;

	Default
	{
		+USESPECIAL
		Activation THINGSPEC_ThingActs | THINGSPEC_ThingTargets;
	}

	override void PostBeginPlay()
	{
		self.A_SetSpecial(130, 0);
		Super.PostBeginPlay();
		shrinkcount = -1;
		frozen = false;
	}

	override void Activate(Actor activator)
	{
		Actor a = self;
		if(activator==null || activator.target==null) return;
		if(a.health>0) {
			a.SetStateLabel("UseBabe");
		} else {
			a.A_GiveToTarget("BabeDamn",1);
		}
	}

	override bool CanCollideWith(Actor other, bool passive)
	{
		if(frozen || self.bIceCorpse) {
			if (other && other.bMISSILE && other.damagetype=="Ice")
    			{
				return false;
			}
		}
		return super.CanCollideWith(other, passive);
	}

	void A_AmbushEnemies(String smonster, int maxrandom, int maxradiuslimit)
	{
		int monsterlimit = random[RIDMAP](1,maxrandom);
		int monsterspawnsuccess = 0;
		int monsterspawnmaxtries = 100;
		int monsterspawntries = 0;
		Sector monstersector = Level.pointInSector((self.pos.x, self.pos.y));

		while (monsterspawnsuccess < monsterlimit && monsterspawntries < monsterspawnmaxtries)
		{
			int x = random[RIDMAP](50, maxradiuslimit)*random[RIDMAP](-1,1);
			int y = random[RIDMAP](50, maxradiuslimit)*random[RIDMAP](-1,1);
			if (Level.pointInSector((self.pos.x + x, self.pos.y + y)) == monstersector)
			{
				bool bsuccess;
				Actor asuccess;
				[bsuccess,asuccess] = self.A_SpawnItemEx(smonster,x,y,0,0,0,0,0);
				if (bsuccess && asuccess) {
					if( asuccess.TestMobjLocation() && asuccess.CheckSight(target) ) {
						asuccess.ClearCounters();
						asuccess.Destroy();
						self.A_SpawnItemEx("AlienTeleport",x,y,32);
						[bsuccess,asuccess] = self.A_SpawnItemEx(smonster,x,y,0,0,0,0,0);
						if (asuccess) {
							asuccess.A_FaceTarget();
							if(asuccess.target && asuccess.target.GetSpecies()!="Dukes") asuccess.A_ClearTarget();
							monsterspawnsuccess++;
						}
					} else {
						asuccess.ClearCounters();
						asuccess.Destroy();
					}
				}
			}

			monsterspawntries++;
		}
	}

	void A_SetSizeHeight()
	{
		self.A_SetSize(-1, self.default.height);
	}

	void A_JumpIfLowerScale(StateLabel label)
	{
		if ((self.Scale.X < self.default.scale.Y) && (self.Scale.Y < self.default.scale.Y)) {self.SetStateLabel(label); return;}
	}

	void A_ShrinkBabe(double sScale=0.2, double sHeight=16)
	{
		Actor a = self;

		a.A_SetScale(sScale);
		a.A_SetSize(-1, sHeight);
		a.health = max(a.health/5.0,1);
		a.bFORCEXYBILLBOARD=true;
		a.bSOLID=false;
		a.species="shrunkenemy";
		a.ChangeTid(3500);
		shrinkcount = 0;
	}

	void A_UnshrinkBabe()
	{
		Actor a = self;

		a.A_SetScale(a.default.scale.x,a.default.scale.y);
		a.health = a.health*5.0;
		a.bFORCEXYBILLBOARD=false;
		a.species="None";
		a.ChangeTid(3501);
	}

	void A_CheckFrozen(StateLabel label="Dummy")
	{
		if (frozen) {
			if(label=="Dummy") {
				self.A_Die();
				return;
			} else {
				self.SetStateLabel(label);
				return;
			}
		}
	}

	void A_FreezeBabe()
	{
		Actor a = self;

		a.bFORCEXYBILLBOARD=true;
		a.bNOBLOOD=true;
		a.A_SetTranslation("Ice");
		a.species="frozenenemy";
		a.ChangeTid(3500);
		frozen = true;
	}

	void A_UnFreezeBabe()
	{
		Actor a = self;

		a.bFORCEXYBILLBOARD=false;
		a.bNOBLOOD=false;
		a.translation = a.default.translation;
		a.species="None";
		a.ChangeTid(3501);
		frozen = false;
	}

	override void Tick()
	{
        	Super.Tick();

		if(shrinkcount>=0 && self.health>0) {
			shrinkcount++;
			if(shrinkcount>=960) {
				shrinkcount = -1;
				self.SetStateLabel("Unshrink");
			}
		}
	}

}