#include "scripts/common.txt"
#include "scripts/BP_common.txt"

class BP_PickupHealth : ScriptObject
{
    kActor @self;
	bool isSpawnedMP;
	int amount;
	bool mortalWound;
	kStr pickupSound;
	//------------------------------------------------------------------------------------------------------------------------
    BP_PickupHealth(kActor @actor)
	{
        @self = actor;
		isSpawnedMP = false;
		kDictMem@ def = self.Definition();
		if (def !is null)
		{
			def.GetInt("pickup.health.amount", amount);
			def.GetString("pickup.pickupSound", pickupSound);
			def.GetBool("pickup.health.mortalwound", mortalWound);
		}
    }
	//------------------------------------------------------------------------------------------------------------------------
	void SetSpawnedMP()
	{
		isSpawnedMP = true;
		self.Flags() |= AF_ALWAYSACTIVE;
	}
	//------------------------------------------------------------------------------------------------------------------------
    void OnTick()
	{
		if (isSpawnedMP)
		{
			for (uint i = 0; i < pickupActors.length(); i++)
			{
				if (!ActorExists(pickupActors[i]))
				{
					continue;
				}
				
				if (pickupActors[i].Health() > 0 && IsInActorRadius(self, pickupActors[i], 1.0f))
				{
					int health = pickupActors[i].Health();
					int initialHealth = pickupActors[i].SpawnParams(2);
					if (amount <= 0) //full life
					{
						if (health < initialHealth)
							pickupActors[i].Health() = initialHealth;
						else
							return;
					}
					else
					{
						if (mortalWound)
						{
							if (health < initialHealth)
								pickupActors[i].Health() = Math::Min(health + amount * 4, initialHealth);
							else
								return;
						}
						else
						{
							if (health < initialHealth * 2)
								pickupActors[i].Health() = Math::Min(health + amount * 4, initialHealth * 2);
							else
								return;
						}
					}
					//Sys.Print("Health: " + pickupActors[i].Health() + " Spawn Health: " + pickupActors[i].SpawnParams(2));
					//Sys.Print("HP Pickup by Actor Type " + pickupActors[i].Type() + " with Health " + pickupActors[i].Health() +
					//" pickupPos: " + self.Origin().ToString() + " actorPos: " + pickupActors[i].Origin().ToString());
					self.PlaySound(pickupSound);
					self.Remove();
					break;
				}
			}
		}
    }
	//------------------------------------------------------------------------------------------------------------------------
    void OnSpawn() {}
	//------------------------------------------------------------------------------------------------------------------------
}
