EggMonsterEntryPoints = { MonsterWaypoint }
EggSpawnPoints = { Waypoint, Waypoint1, Waypoint2, Waypoint3 }

if Map.LobbyOption("difficulty") == "easy" then
	M = { "pvice", "pvice" }
	A = { "bspi", "bspi" }
	R = { "reve", "reve" }
	I = { "imp", "imp" }
	D = { "pinky", "pinky" }
	Ma = { "manc", "manc" }
elseif Map.LobbyOption("difficulty") == "normal" then
	M = { "pvice", "pvice", "pvice", "pvice", "pvice" }
	A = { "bspi", "bspi", "bspi", "bspi", "bspi" }
	R = { "reve", "reve", "reve", "reve", "reve" }
	I = { "imp", "imp", "imp", "imp", "imp" }
	D = { "pinky", "pinky", "pinky", "pinky", "pinky" }
	Ma = { "manc", "manc", "manc", "manc", "manc" }
elseif Map.LobbyOption("difficulty") == "hard" then
	M = { "pvice", "pvice", "pvice", "pvice", "pvice", "pvice", "pvice", "pvice", "pvice" }
	A = { "bspi", "bspi", "bspi", "bspi", "bspi", "bspi", "bspi", "bspi", "bspi" }
	R = { "reve", "reve", "reve", "reve", "reve", "reve", "reve", "reve", "reve" }
	I = { "imp", "imp", "imp", "imp", "imp", "imp", "imp", "imp", "imp"  }
	D = { "pinky", "pinky", "pinky", "pinky", "pinky", "pinky", "pinky", "pinky" }
	Ma = { "manc", "manc", "manc", "manc", "manc", "manc", "manc", "manc" }
end


EggWave = 0
EggWaves =
{
	{ delay = 1, units = {  } },--00
	{ delay = 1, units = {  } },--12
	{ delay = 1, units = {  } },--24
	{ delay = 1, units = {  } },--36
	{ delay = 1, units = { M, M } },--48
	{ delay = 1, units = { M, M, M, M, M } },--60
	{ delay = 1, units = { } },--112
	{ delay = 1, units = { M } },--124
	{ delay = 1, units = { A, M, M } },--136
	{ delay = 1, units = {  } },--148
	{ delay = 1, units = { A, A, M, M, M } },--200
	{ delay = 1, units = { } },--212
	{ delay = 1, units = { M, M } },--224
	{ delay = 1, units = { M, M, M, M } },--236
	{ delay = 1, units = { A } },--248
	{ delay = 1, units = { A, R, M, M, M, M, M } },--300
	{ delay = 1, units = { } },--312
	{ delay = 1, units = { A, R, M } },--324
	{ delay = 1, units = { } },--336
	{ delay = 1, units = {  } },--348
	{ delay = 1, units = { A, R, M, M } },--400
	{ delay = 1, units = { } },--412
	{ delay = 1, units = { M, M, M } },--424
	{ delay = 1, units = { M, M, R, R, A, A } },--436
	{ delay = 1, units = {  } },--448
	{ delay = 1, units = { A, R, M, I } },--500
	{ delay = 1, units = { M } },--512
	{ delay = 1, units = { A, M, M, M, R } },--524
	{ delay = 1, units = { A, M, I } },--536
	{ delay = 1, units = { } },--548
	{ delay = 1, units = { M, M, R, I, A } },--600
	{ delay = 1, units = { } },--612
	{ delay = 1, units = { I, M, A } },--624
	{ delay = 1, units = { R } },--636
	{ delay = 1, units = { M } },--648
	{ delay = 1, units = { A, D } },--700
	{ delay = 1, units = { M, M, R  } },--712
	{ delay = 1, units = { M, M,  } },--724
	{ delay = 1, units = { D, I, A, M, M } },--736
	{ delay = 1, units = { M } },--748
	{ delay = 1, units = { M, A, R, I } },--800
	{ delay = 1, units = { M, M } },--812
	{ delay = 1, units = { M, M } },--824
	{ delay = 1, units = { M, R, I, I, D } },--836
	{ delay = 1, units = { M, M, A } },--848
	{ delay = 1, units = { Ma, } },--900
	{ delay = 1, units = { M } },--912
	{ delay = 1, units = { M, R } },--924
	{ delay = 1, units = { M } },--936
	{ delay = 1, units = { M, A } },--948
	{ delay = 1, units = { Ma, M } },--1000
	{ delay = 1, units = { D } },--1012
	{ delay = 1, units = { M, M } },--1024
	{ delay = 1, units = { M, M, M, M } },--1036
	{ delay = 1, units = { M } },--1048
	{ delay = 1, units = { A, M, M, M, M, M } },--1100
	{ delay = 1, units = { M } },--1112
	{ delay = 1, units = { A, M, M, M, } },--1124
	{ delay = 1, units = { R, A, I, D } },--1136
	{ delay = 1, units = { M } },--1148
	{ delay = 1, units = { Ma, M, R, R, I, I, D } },--1200
	{ delay = 1, units = { M } },--1212
	{ delay = 1, units = { A } },--1224
	{ delay = 1, units = { I } },--1236
	{ delay = 1, units = { D } },--1248
	{ delay = 1, units = { M } }--1300
}

--Wave Commands
EggIncreaseDifficulty = function()
	local additions = { A }
	Utils.Do(EggWaves, function(wave)
		wave.units[#wave.units + 1] = Utils.Random(additions)
	end)
end

EggSendWave = function()
	if Egg.IsDead then
		return
	end
	EggWave = EggWave + 1
	local wave = EggWaves[EggWave]
	Trigger.AfterDelay(wave.delay, function()
		Utils.Do(wave.units, function(units)
			local entry = Utils.Random(EggMonsterEntryPoints).Location
			local target = Utils.Random(EggSpawnPoints).Location
			SendUnits(entry, units, target)
		end)
		if (EggWave < #EggWaves) then
			delayFirstTeam = 12
			local delay = delayFirstTeam
			Trigger.AfterDelay(DateTime.Seconds(delay), function()
				EggSendWave()
				--Trigger.AfterDelay(DateTime.Minutes(13), EggIncreaseDifficulty)
			end)
		end
	end)
end

-----------Egg1
Egg1MonsterEntryPoints = { MonsterWaypoint1 }
Egg1SpawnPoints = { Waypoint1, Waypoint3, Waypoint1, Waypoint }

--Arachnotron
Egg1Wave = 0
Egg1Waves =
{
	{ delay = 1, units = { } },--00
	{ delay = 1, units = {  } },--24
	{ delay = 1, units = { M } },--48
	{ delay = 1, units = { M } },--112
	{ delay = 1, units = { M, M, M, M } },--136
	{ delay = 1, units = { A, M } },--200
	{ delay = 1, units = { M, M,  } },--224
	{ delay = 1, units = { A } },--248
	{ delay = 1, units = { M, M,  } },--312
	{ delay = 1, units = { R } },--336
	{ delay = 1, units = { M, M, R } },--400
	{ delay = 1, units = { A } },--424
	{ delay = 1, units = { A } },--448
	{ delay = 1, units = { M, R, M, A } },--512
	{ delay = 1, units = { M, M, A } },--536
	{ delay = 1, units = { I, M } },--600
	{ delay = 1, units = { I, M, R, A, M } },--624
	{ delay = 1, units = { M, M, A, I, M } },--648
	{ delay = 1, units = { I, M, M, R } },--712
	{ delay = 1, units = { M, M, A } },--736
	{ delay = 1, units = { R, A, M } },--800
	{ delay = 1, units = { M, I, A, R, M } },--824
	{ delay = 1, units = { M, M, A, I, D } },--848
	{ delay = 1, units = { D, I, M, M, I, R } },--912
	{ delay = 1, units = { R, I, A, M } },--936
	{ delay = 1, units = { R, A, I, D } },--1000
	{ delay = 1, units = { M, A, I } },--1024
	{ delay = 1, units = {  } },--1048
	{ delay = 1, units = { R, A, I, D } },--1112
	{ delay = 1, units = { I } },--1136
	{ delay = 1, units = { Ma, R, A, M } },--1200
	{ delay = 1, units = { I } },--1224
	{ delay = 1, units = {  } },--1248
	{ delay = 1, units = { D, I } }--1212
}

Egg1IncreaseDifficulty = function()
	local additions = { R }
	Utils.Do(Egg1Waves, function(wave)
		wave.units[#wave.units + 1] = Utils.Random(additions)
	end)
end

Egg1SendWave = function()
	if Egg1.IsDead then
		return
	end
	Egg1Wave = Egg1Wave + 1
	local wave = Egg1Waves[Egg1Wave]
	Trigger.AfterDelay(wave.delay, function()
		Utils.Do(wave.units, function(units)
			local entry = Utils.Random(Egg1MonsterEntryPoints).Location
			local target = Utils.Random(Egg1SpawnPoints).Location
			SendUnits(entry, units, target)
		end)
		if (Egg1Wave < #Egg1Waves) then
			delayFirstTeam = 24
			local delay = delayFirstTeam
			Trigger.AfterDelay(DateTime.Seconds(delay), function()
				Egg1SendWave()
				--Trigger.AfterDelay(DateTime.Minutes(13), Egg1IncreaseDifficulty)
			end)
		end
	end)
end


-----------Egg3
Egg3MonsterEntryPoints = { MonsterWaypoint3 }
Egg3SpawnPoints = { Waypoint2, Waypoint1, Waypoint3, Waypoint0 }

Egg3Wave = 0
Egg3Waves =
{
	{ delay = 1, units = { } },--00
	{ delay = 1, units = { M } },--36
	{ delay = 1, units = {  } },--112
	{ delay = 1, units = { M, M } },--148
	{ delay = 1, units = { A, A } },--224
	{ delay = 1, units = { M, M, A } },--300
	{ delay = 1, units = { M, A } },--336
	{ delay = 1, units = { A, A, A } },--412
	{ delay = 1, units = { R, A, M } },--448
	{ delay = 1, units = { R, A, I, M } },--524
	{ delay = 1, units = { I, M } },--600
	{ delay = 1, units = { M, A, I, D } },--636
	{ delay = 1, units = { M, A, I, R, M } },--712
	{ delay = 1, units = { R, A, M, M, A } },--748
	{ delay = 1, units = { M, A, M, M, R, A, M } },--824
	{ delay = 1, units = { M, A, R, I, M } },--900
	{ delay = 1, units = { D, A, I, R, A, M } },--936
	{ delay = 1, units = { M, A, I, D, A, R } },--1012
	{ delay = 1, units = { M, I, R, M } },--1048
	{ delay = 1, units = { R, A, M } },--1124
	{ delay = 1, units = { I, M } },--1200
	{ delay = 1, units = { R, A, M } },--1236
	{ delay = 1, units = { M, A, I, R } }--1312
}

Egg3IncreaseDifficulty = function()
	local additions = { I }
	Utils.Do(Egg3Waves, function(wave)
		wave.units[#wave.units + 1] = Utils.Random(additions)
	end)
end

Egg3SendWave = function()
	if Egg3.IsDead then
		return
	end
	Egg3Wave = Egg3Wave + 1
	local wave = Egg3Waves[Egg3Wave]
	Trigger.AfterDelay(wave.delay, function()
		Utils.Do(wave.units, function(units)
			local entry = Utils.Random(Egg3MonsterEntryPoints).Location
			local target = Utils.Random(Egg3SpawnPoints).Location
			SendUnits(entry, units, target)
		end)
		if (Egg3Wave < #Egg3Waves) then
			delayFirstTeam = 45
			local delay = delayFirstTeam
			Trigger.AfterDelay(DateTime.Seconds(delay), function()
				Egg3SendWave()
				--Trigger.AfterDelay(DateTime.Minutes(13), Egg3IncreaseDifficulty)
			end)
		end
	end)
end



-----------Egg5
Egg5MonsterEntryPoints = { MonsterWaypoint5 }
Egg5SpawnPoints = { Waypoint3, Waypoint2, Waypoint1, Waypoint }

Egg5Wave = 0
Egg5Waves =
{
	{ delay = 1, units = { } },--00
	{ delay = 1, units = { M } },--48
	{ delay = 1, units = { M, M, M } },--136
	{ delay = 1, units = { A } },--224
	{ delay = 1, units = { R, A, M } },--312
	{ delay = 1, units = { R } },--400
	{ delay = 1, units = { A, M,  } },--448
	{ delay = 1, units = { A, I, M } },--536
	{ delay = 1, units = { I, R, M, A } },--624
	{ delay = 1, units = { R, A, M } },--712
	{ delay = 1, units = { I, D } },--800
	{ delay = 1, units = { A, R, M } },--848
	{ delay = 1, units = { M } },--936
	{ delay = 1, units = { I, R } },--1024
	{ delay = 1, units = { R, A } },--1112
	{ delay = 1, units = { I, D } },--1200
	{ delay = 1, units = { A, R, M } },--1248
	{ delay = 1, units = { Ma, D, M } }--1336
}


Egg5IncreaseDifficulty = function()
	local additions = { D }
	Utils.Do(Egg5Waves, function(wave)
		wave.units[#wave.units + 1] = Utils.Random(additions)
	end)
end

Egg5SendWave = function()
	if Egg5.IsDead then
		return
	end
	Egg5Wave = Egg5Wave + 1
	local wave = Egg5Waves[Egg5Wave]
	Trigger.AfterDelay(wave.delay, function()
		Utils.Do(wave.units, function(units)
			local entry = Utils.Random(Egg5MonsterEntryPoints).Location
			local target = Utils.Random(Egg5SpawnPoints).Location
			SendUnits(entry, units, target)
		end)
		if (Egg5Wave < #Egg5Waves) then
			delayFirstTeam = 60
			local delay = delayFirstTeam
			Trigger.AfterDelay(DateTime.Seconds(delay), function()
				Egg5SendWave()
				--Trigger.AfterDelay(DateTime.Minutes(13), Egg5IncreaseDifficulty)
			end)
		end
	end)
end

-----------Egg7
Egg7MonsterEntryPoints = { MonsterWaypoint7 }
Egg7SpawnPoints = { Waypoint1, Waypoint2, Waypoint, Waypoint3 }

Egg7Wave = 0
Egg7Waves =
{
	{ delay = 1, units = { } },--00
	{ delay = 1, units = { M } },--100
	{ delay = 1, units = { A } },--200
	{ delay = 1, units = { R } },--300
	{ delay = 1, units = { R, A, M } },--400
	{ delay = 1, units = { I } },--500
	{ delay = 1, units = { I, M, A, R } },--600
	{ delay = 1, units = { I } },--700
	{ delay = 1, units = { A, M, I, M, M } },--800
	{ delay = 1, units = { A, M, M, M } },--900
	{ delay = 1, units = { A, I, M, R, D } },--1000
	{ delay = 1, units = { D, A, M, M, M } },--1100
	{ delay = 1, units = { Ma, I, M } },--1200
	{ delay = 1, units = { D, A, M, M, M } },--1300

}

Egg7IncreaseDifficulty = function()
	local additions = { Ma }
	Utils.Do(Egg7Waves, function(wave)
		wave.units[#wave.units + 20] = Utils.Random(additions)
	end)
end

Egg7SendWave = function()
	if Egg7.IsDead then
		return
	end
	Egg7Wave = Egg7Wave + 1
	local wave = Egg7Waves[Egg7Wave]
	Trigger.AfterDelay(wave.delay, function()
		Utils.Do(wave.units, function(units)
			local entry = Utils.Random(Egg7MonsterEntryPoints).Location
			local target = Utils.Random(Egg7SpawnPoints).Location
			SendUnits(entry, units, target)
		end)
		if (Egg7Wave < #Egg7Waves) then
			delayFirstTeam = 90
			local delay = delayFirstTeam
			Trigger.AfterDelay(DateTime.Seconds(delay), function()
				Egg7SendWave()
				--Trigger.AfterDelay(DateTime.Minutes(13), Egg7IncreaseDifficulty)
			end)
		end
	end)
end

-----------AlienSpawns
AlienMonsterEntryPoints = { MotherShipWaypoint }
AlienSpawnPoints = { Waypoint2, Waypoint, Waypoint2, Waypoint3 }

if Map.LobbyOption("difficulty") == "hard" then
	Mechwarrior = { "mechwarrior", "mechwarrior", "mechwarrior", "mechwarrior" }
	Exciter = { "exciter", "exciter", "exciter" }
	Tripod = { "tripod", "tripod", "tripod", "tripod" }
end

AlienWave = 0
AlienWaves =
{
	{ delay = 1, units = { Tripod } },
	{ delay = 1, units = { Mechwarrior } },
	{ delay = 1, units = { Exciter, Exciter } },
	{ delay = 1, units = { Mechwarrior, Mechwarrior } },
	{ delay = 1, units = { Exciter, Exciter, Exciter, Exciter } },
	{ delay = 1, units = { Tripod, Tripod } },
	{ delay = 1, units = { Tripod } },
	{ delay = 1, units = { Mechwarrior } },
	{ delay = 1, units = { Exciter, Exciter } },
	{ delay = 1, units = { Mechwarrior, Mechwarrior } },
	{ delay = 1, units = { Exciter, Exciter, Exciter, Exciter } },
	{ delay = 1, units = { Tripod, Tripod } }
}

SendAlienUnits = function(entryCell, unitTypes, targetCell)
	Reinforcements.Reinforce(Aliens, unitTypes, { entryCell }, 40, function(a)
		if not a.HasProperty("AttackMove") then
			Trigger.OnIdle(a, function(a)
				a.Move(targetCell)
			end)
			return
		end

		a.AttackMove(targetCell)
		Trigger.OnIdle(a, function(a)
			a.Hunt()
		end)
	end)
end

AlienIncreaseDifficulty = function()
	local additions = { ExoMech, Exciter, ExoMech, Exciter, Tripod, Tripod }
	Utils.Do(AlienWaves, function(wave)
		wave.units[#wave.units + 1] = Utils.Random(additions)
	end)
end

AlienSendWave = function()
	if AlienMothership.IsDead then
		return
	end
	AlienWave = AlienWave + 1
	local wave = AlienWaves[AlienWave]
	Trigger.AfterDelay(wave.delay, function()
		Utils.Do(wave.units, function(units)
			local entry = Utils.Random(AlienMonsterEntryPoints).Location
			local target = Utils.Random(AlienSpawnPoints).Location
			SendAlienUnits(entry, units, target)
		end)
		if (AlienWave < #AlienWaves) then
			delayFirstTeam = 40
			local delay = delayFirstTeam
			Trigger.AfterDelay(DateTime.Seconds(delay), function()
				AlienSendWave()
				Trigger.AfterDelay(DateTime.Minutes(7), AlienIncreaseDifficulty)
			end)
		end
	end)
end
--hard difficulty check
MothershipChrono = function()
	if Map.LobbyOption("difficulty") == "easy" then
		EggsDestroyed()
		MothershipDestroyed()
		--CratePickup()
	elseif Map.LobbyOption("difficulty") == "normal" then
		EggsDestroyed()
		MothershipDestroyed()
	elseif Map.LobbyOption("difficulty") == "hard" then
		EggsDestroyed()
		Media.DisplayMessage("Incomming mothership detected...")
		Trigger.AfterDelay(DateTime.Seconds(7), function()
			Media.PlaySound("mothershipdeployed.aud")
			Trigger.AfterDelay(DateTime.Seconds(3), function()
				Media.PlaySound("Chrono.aud")
				Trigger.AfterDelay(DateTime.Seconds(4), function()
					Lightning()
					local delay = Utils.RandomInteger(20, 10)
					Lighting.Flash("LightningStrike", delay)
					Lighting.Flash("LightningStrike", delay)
					ChronoShift = Actor.Create(Mothership, true, { Owner = Aliens, Location = MotherShipWaypoint.Location })
					Trigger.AfterDelay(DateTime.Seconds(0.5), function()
						ChronoShift.Kill()
						AlienMothership = Actor.Create(Mothership, true, { Owner = Aliens, Location = MotherShipWaypoint.Location })
						--Smoke1 = Actor.Create(Smoke, true, { Owner = Neutral, Location = MotherShipWaypoint.Location })
						--Smoke2 = Actor.Create(Smoke, true, { Owner = Neutral, Location = WaypointMiddle.Location })
						Trigger.AfterDelay(DateTime.Seconds(5), function()
							AlienSendWave()
							Trigger.OnKilled(AlienMothership, MothershipDestroyed) 
						end)
					end)
				end)
			end)
		end)
	end
end

--Game Over check
MissionOverCheckMonster = { MonsterMissionAccomplished }
MissionOverCheckAlien = { AlienMissionAccomplished }

EggsDestroyed = function()
	Utils.Do(MissionOverCheckMonster, function(a)
		if not a.IsDead and a.Owner == Monsters then
			a.Destroy()
		end
	end)
end

MothershipDestroyed = function()
	if Map.LobbyOption("difficulty") == "hard" then
		Actor.Create(Weapons, true, { Owner = Aliens, Location = WaypointMiddle.Location })
	end
	Utils.Do(MissionOverCheckAlien, function(a)
		if not a.IsDead and a.Owner == Aliens then
			a.Destroy()
		end
	end)
end

--AI Behavior
SendUnits = function(entryCell, unitTypes, targetCell)
	Reinforcements.Reinforce(Monsters, unitTypes, { entryCell }, 40, function(a)
		if not a.HasProperty("AttackMove") then
			Trigger.OnIdle(a, function(a)
				a.Move(targetCell)
			end)
			return
		end

		a.AttackMove(targetCell)
		Trigger.OnIdle(a, function(a)
			a.Hunt()
		end)
	end)
end

--eggs
Eggs = { Egg, Egg1, Egg3, Egg5, Egg7 }
Fire = "boxes01"
Mothership = "mothership"
Smoke = "flare"
TechCrate = "techcrate"
Weapons = "weaponscrate"
WorldLoaded = function()
--factions
	Neutral = Player.GetPlayer("Neutral")
	Monsters = Player.GetPlayer("Monsters")
	Aliens = Player.GetPlayer("Aliens")
	Media.DisplayMessage("Destroy the Egg spawns in the middle!")
	Trigger.OnAllRemovedFromWorld(Eggs, function()
		MothershipChrono()
	end)
--egg spawn commands
	EggSendWave()
	Egg1SendWave()
	Egg3SendWave()
	Egg5SendWave()
	Egg7SendWave()

--endless spawn trigger
	Trigger.AfterDelay(DateTime.Minutes(14), function()
		EggIncreaseDifficulty()
		Egg1IncreaseDifficulty()
		Egg3IncreaseDifficulty()
		Egg5IncreaseDifficulty()
		Egg7IncreaseDifficulty()
	end)

--weather and effects
	local delay = Utils.RandomInteger(20, 10)
	Lighting.Flash("LightningStrike", delay)
	Lighting.Flash("LightningStrike", delay)
	Media.PlaySound("thunder3.aud")
end
Lightning = function() 
	local delay = Utils.RandomInteger(20, 10)
	Lighting.Flash("LightningStrike", delay)
	Lighting.Flash("LightningStrike", delay)
	Tick = function()
		if (Utils.RandomInteger(1, 200) == 10) then
			local delay = Utils.RandomInteger(1, 10)
			Lighting.Flash("LightningStrike", delay)
			Trigger.AfterDelay(delay, function()
				Media.PlaySound("thunder" .. Utils.RandomInteger(1,6) .. ".aud")
			end)
		end
		if (Utils.RandomInteger(1, 200) == 10) then
			Media.PlaySound("thunder-ambient.aud")
		end
	end
end

