::CONST <- getconsttable()
::ROOT <- getroottable()

// Classes Folding
foreach( _class in [ "NetProps", "Entities", "EntityOutputs", "NavMesh", "Convars" ] )
{
	foreach( k, v in ROOT[_class].getclass() )
	{
		if ( !( k in ROOT ) && k != "IsValid" )
		{
			ROOT[k] <- ROOT[_class][k].bindenv( ROOT[_class] )
		}
	}
}

// Constants Folding
if (!("ConstantNamingConvention" in ROOT)) // make sure folding is only done once
{
	foreach (enum_table in Constants)
	{
		foreach (name, value in enum_table)
		{
			if (value == null)
				value = 0

			CONST[name] <- value
			ROOT[name] <- value
		}
	}
}

const MAX_WEAPONS = 8

::SummonerScript <-
{
	//// CLEANUP FUNCTIONS ////

	function CleanUp()
	{
		delete ::SummonerScript
	}

	OnGameEvent_recalculate_holidays = function(_) { if (GetRoundState() == 3) CleanUp() }

	//// MISC. FUNCTIONS ////

	function GivePlayerWeapon(Player, ClassName, ItemID)
	{
		local Weapon = CreateByClassname(ClassName)
		SetPropInt(Weapon, "m_AttributeManager.m_Item.m_iItemDefinitionIndex", ItemID)
		SetPropBool(Weapon, "m_AttributeManager.m_Item.m_bInitialized", true)
		SetPropBool(Weapon, "m_bValidatedAttachedEntity", true)
		Weapon.SetTeam(Player.GetTeam())
		Weapon.DispatchSpawn()

		for (local i = 0; i < MAX_WEAPONS; i++)
		{
			local HeldWeapon = GetPropEntityArray(Player, "m_hMyWeapons", i)
			if (HeldWeapon == null)
				continue
			if (HeldWeapon.GetSlot() != Weapon.GetSlot())
				continue
			HeldWeapon.Destroy()
			SetPropEntityArray(Player, "m_hMyWeapons", null, i)
			break
		}

		Player.Weapon_Equip(Weapon)
		Player.Weapon_Switch(Weapon)

		return Weapon
	}

	//// SUMMONER FUNCTIONS ////

	function SummonerMinionTrace(Target)
	{
		for(local Child = Target.FirstMoveChild(); Child != null; Child = Child.NextMovePeer())
		{
			if (Child.GetClassname() == "bot_generator")
			{
				local TraceParams = 
				{
					start = Target.GetOrigin()
					end = Child.GetOrigin()
					ignore = Target
				}

				TraceLineEx(TraceParams)

				if(TraceParams.hit)
				{
					Child.ValidateScriptScope()
					Child.GetScriptScope().OriginalPosition <- Child.GetLocalOrigin()

					Child.SetLocalOrigin(Vector())

					EntFireByHandle(Child, "RunScriptCode", "self.SetLocalOrigin(OriginalPosition)", 0.5, null, null)
				}
			}
		}
	}

	function SummonerDemomanMinionInit(Target)
	{
		Target.RemoveWeaponRestriction(7)
		Target.ClearAllBotAttributes()
		Target.ClearAllBotTags()
		Target.SetCustomModelWithClassAnimations(null)
		Target.SetDifficulty(3)
		Target.SetMaxVisionRangeOverride(9999)

		SetFakeClientConVarValue(Target, "name", "Resurrected Demoman")
		Target.SetCustomModelWithClassAnimations("models/bots/demo/bot_demo_gibby.mdl")
		SetPropString(Target, "m_PlayerClass.m_iszClassIcon", "demo_summoner")

		Target.AddWeaponRestriction(2)
		Target.AddBotAttribute(16)
		Target.AddBotAttribute(32)
		Target.AddBotAttribute(2048)

		Target.AddCustomAttribute("cannot pick up intelligence", 1, 0)
		Target.AddCustomAttribute("max health additive bonus", 125, 0)

		Target.SetHealth(300)
		Target.SetModelScale(1.3, 0.0)
	}
	function SummonerSoldierMinionInit(Target)
	{
		Target.RemoveWeaponRestriction(7)
		Target.ClearAllBotAttributes()
		Target.ClearAllBotTags()
		Target.SetCustomModelWithClassAnimations(null)
		Target.SetDifficulty(3)
		Target.SetMaxVisionRangeOverride(9999)

		SetFakeClientConVarValue(Target, "name", "Resurrected Soldier")
		Target.SetCustomModelWithClassAnimations("models/bots/soldier/bot_soldier_gibby.mdl")
		SetPropString(Target, "m_PlayerClass.m_iszClassIcon", "soldier_summoner")

		Target.AddWeaponRestriction(2)
		Target.AddBotAttribute(16)
		Target.AddBotAttribute(32)
		Target.AddBotAttribute(2048)

		Target.AddCustomAttribute("cannot pick up intelligence", 1, 0)
		Target.AddCustomAttribute("max health additive bonus", 125, 0)

		Target.SetHealth(300)
		Target.SetModelScale(1.3, 0.0)
	}
	function SummonerHeavyMinionInit(Target)
	{
		Target.RemoveWeaponRestriction(7)
		Target.ClearAllBotAttributes()
		Target.ClearAllBotTags()
		Target.SetCustomModelWithClassAnimations(null)
		Target.SetDifficulty(1)
		Target.SetMaxVisionRangeOverride(9999)

		SetFakeClientConVarValue(Target, "name", "Resurrected Heavy")
		Target.SetCustomModelWithClassAnimations("models/bots/heavy/bot_heavy_gibby.mdl")
		SetPropString(Target, "m_PlayerClass.m_iszClassIcon", "heavy_summoner")

		Target.AddWeaponRestriction(2)
		Target.AddBotAttribute(16)
		Target.AddBotAttribute(32)
		Target.AddBotAttribute(2048)

		Target.AddCustomAttribute("cannot pick up intelligence", 1, 0)
		Target.AddCustomAttribute("max health additive bonus", 150, 0)

		Target.SetHealth(450)
		Target.SetModelScale(1.3, 0.0)
	}

	function SummonerRapidFireSoldierMinionInit(Target)
	{
		Target.RemoveWeaponRestriction(7)
		Target.ClearAllBotAttributes()
		Target.ClearAllBotTags()
		Target.SetCustomModelWithClassAnimations(null)
		Target.SetDifficulty(3)
		Target.SetMaxVisionRangeOverride(9999)

		SetFakeClientConVarValue(Target, "name", "Resurrected Rapid Fire Soldier")
		Target.SetCustomModelWithClassAnimations("models/bots/soldier/bot_soldier_gibby.mdl")
		SetPropString(Target, "m_PlayerClass.m_iszClassIcon", "soldier_spammer")

		Target.AddWeaponRestriction(2)
		Target.AddBotAttribute(16)
		Target.AddBotAttribute(32)
		Target.AddBotAttribute(2048)

		Target.AddCustomAttribute("cannot pick up intelligence", 1, 0)
		Target.AddCustomAttribute("max health additive bonus", 400, 0)

		Target.SetHealth(600)
		Target.SetModelScale(1.4, 0.0)

		local Primary = Target.GetActiveWeapon()
		Primary.AddAttribute("fire rate bonus", 0.5, 0)
		Primary.AddAttribute("faster reload rate", 0.001, 0)
		Primary.AddAttribute("projectile speed decreased", 0.65, 0)
	}
	function SummonerBrassBeastHeavyMinionInit(Target)
	{
		Target.RemoveWeaponRestriction(7)
		Target.ClearAllBotAttributes()
		Target.ClearAllBotTags()
		Target.SetCustomModelWithClassAnimations(null)
		Target.SetDifficulty(1)
		Target.SetMaxVisionRangeOverride(9999)

		SetFakeClientConVarValue(Target, "name", "Resurrected Brass Beast Heavy")
		Target.SetCustomModelWithClassAnimations("models/bots/heavy/bot_heavy_gibby.mdl")
		SetPropString(Target, "m_PlayerClass.m_iszClassIcon", "heavy_brass_beast_summoner")

		Target.AddWeaponRestriction(2)
		Target.AddBotAttribute(16)
		Target.AddBotAttribute(32)
		Target.AddBotAttribute(2048)

		Target.AddCustomAttribute("cannot pick up intelligence", 1, 0)
		Target.AddCustomAttribute("max health additive bonus", 600, 0)

		Target.SetHealth(900)
		Target.SetModelScale(1.5, 0.0)

		GivePlayerWeapon(Target, "tf_weapon_minigun", 312)
	}
}

__CollectGameEventCallbacks(SummonerScript)