wormDelay = nil
testCondition = true
botPlayers = {}
IsAnyBotsHere = false
currentConyards = {}
CheckPlayerTechtree = false
PlayersThatNotchoosedyet = 0
FactionsMode = 0
SubfactionPrerequisitesList = {}
SubfactionPrerequisitesList["atreides"] = "subfaction.atreides"
SubfactionPrerequisitesList["fremen"] = "subfaction.fremen"
SubfactionPrerequisitesList["harkonnen"] = "subfaction.harkonnen"
SubfactionPrerequisitesList["corrino"] = "subfaction.corrino"
SubfactionPrerequisitesList["ordos"] = "subfaction.ordos"
SubfactionPrerequisitesList["smuggler"] = "subfaction.smuggler"
SubfactionPrerequisitesList["mercenary"] = "subfaction.mercenary"
Mergedsubfactions = { "merged.fremen","merged.corrino","merged.smuggler", "merged.mercenary"}
WorldLoaded = function()
	--get players
	mp0=Player.GetPlayer("Multi0")
	mp1=Player.GetPlayer("Multi1")
	mp2=Player.GetPlayer("Multi2")
	mp3=Player.GetPlayer("Multi3")
	mp4=Player.GetPlayer("Multi4")
	mp5=Player.GetPlayer("Multi5")
	mp6=Player.GetPlayer("Multi6")
	mp7=Player.GetPlayer("Multi7")
	mp8=Player.GetPlayer("Multi8")
	mp9=Player.GetPlayer("Multi9")
	mp10=Player.GetPlayer("Multi10")
	mp11=Player.GetPlayer("Multi11")
	mp12=Player.GetPlayer("Multi12")
	mp13=Player.GetPlayer("Multi13")
	mp14=Player.GetPlayer("Multi14")
	mp15=Player.GetPlayer("Multi15")
	mp16=Player.GetPlayer("Multi16")
	mp17=Player.GetPlayer("Multi17")
	mp18=Player.GetPlayer("Multi18")
	mp19=Player.GetPlayer("Multi19")
	mp20=Player.GetPlayer("Multi20")
	mp21=Player.GetPlayer("Multi21")
	mp22=Player.GetPlayer("Multi22")
	mp23=Player.GetPlayer("Multi23")
	mp24=Player.GetPlayer("Multi24")
	mp25=Player.GetPlayer("Multi25")
	mp26=Player.GetPlayer("Multi26")
	mp27=Player.GetPlayer("Multi27")
	Players = {mp0, mp1, mp2, mp3, mp4, mp5, mp6, mp7, mp8, mp9, mp10, mp11, mp12, mp13, mp14, mp15, mp16, mp17, mp18, mp19, mp20, mp21, mp22, mp23, mp24, mp25, mp26, mp27}
	FactionsMode  = tonumber(Map.LobbyOption("fation_mode"))
	if (FactionsMode == 0) then
		--Media.DisplayMessage("you play with standart d2k mode", "Mentat", HSLColor.DarkRed)
	end
	if (FactionsMode == 1) then
		Media.DisplayMessage("Sub-faction Mode - Choose between Major faction or one of its sub-factions", "Mentat",  HSLColor.DarkRed)
	end
	if (FactionsMode == 2) then
		Media.DisplayMessage("Merged Faction mode - chosen will be merged to your Major faction","Mentat", HSLColor.DarkRed)
	end
	for i, player in pairs(Players)
		do
		-- freecarryall section
		if player.HasPrerequisites({"FreeCarry"})
		then
			addCarryToPlayer(player)
		end
		-- factions  options check
		if (FactionsMode == 0)
		then
			player.GrantCondition("vanilla_factions_Only")
			addmcv(player)
		elseif (FactionsMode == 1) then
			CheckPlayerTechtree = true
			player.GrantCondition("subfactions")
			botsubfaction(player)
		elseif (FactionsMode == 2) then
			player.GrantCondition("mergedsubfactions")
			botsubfaction(player)
			CheckPlayerTechtree = true
		end
		--adding bots to talbe
		if player.IsBot
		then
			table.insert(botPlayers, player)
		end
	end
	-- worm delay section
	wormDelay = Map.LobbyOption("WormsSpawnDelay")
	if tonumber(wormDelay) > 0
	then
		delay = tonumber(Map.LobbyOption("WormsSpawnDelay"))
		Trigger.AfterDelay(DateTime.Minutes(delay), function()
		wormSpawnFunction()
	end)
	else
		wormSpawnFunction()
	end
-- testing bots locations:
	for i, bot in pairs(botPlayers)
	do
		IsAnyBotsHere = true
	end
end

Tick = function()
-- check if player already choose subfaction
if(CheckPlayerTechtree == true and PlayersThatNotchoosedyet > 0) then
--	Media.DisplayMessage("cheking")
	techtreecheck()
end


	-- Bot capture protection scripts: executed every 2 sec,testing new Bots Conyards executed every 5 sec
  if IsAnyBotsHere then
    if DateTime.GameTime % DateTime.Seconds(5) == 0
    then
      findConyards()
    end
    if DateTime.GameTime % DateTime.Seconds(2) == 0 then
      engiProtection()
    end
  end
end

function addmcv(player)
	local actors = player.GetActorsByType("choosefaction")
	for pom, actor in pairs(actors) do
		Actor.Create("mcv", true, { Owner = player, Facing = Angle.SouthWest, Location = actor.Location})
		actor.Kill();
	end
end

function techtreecheck()
	for i, player in pairs(Players) do
		local actors = player.GetActorsByType("choosefaction")
		if FactionsMode == 1 then
			for faction, prerequisite in pairs(SubfactionPrerequisitesList) do
				if player.HasPrerequisites({prerequisite}) then
					for pom, actor in pairs(actors) do
						Actor.Create("mcv", true, { Owner = player, Facing = Angle.North, Location = actor.Location, Faction = faction})
						actor.Kill();
						PlayersThatNotchoosedyet = PlayersThatNotchoosedyet - 1
						--Media.DisplayMessage("Subfaction choosed", tostring(PlayersThatNotchoosedyet))
					end
				end
			end
		elseif FactionsMode == 2 then
			for faction, prerequisite in pairs(Mergedsubfactions) do
				if player.HasPrerequisites({prerequisite}) then
					for pom, actor in pairs(actors) do
						Actor.Create("mcv", true, { Owner = player, Facing = Angle.North, Location = actor.Location, Faction = player.Faction})
						actor.Kill();
						PlayersThatNotchoosedyet = PlayersThatNotchoosedyet - 1
						--Media.DisplayMessage("Subfaction choosed Remaining"..tostring(PlayersThatNotchoosedyet))
					end
				end
			end
		end
	end
end

function botsubfaction(player)
	if(not player.IsBot)
	then
		PlayersThatNotchoosedyet = PlayersThatNotchoosedyet + 1
		--Media.DisplayMessage("got the player",tostring(PlayersThatNotchoosedyet) )
	else
		local bluefactions = {"atreides", "fremen"}
		local redfactions = {"harkonnen", "corrino"}
		local greenfactions = {"ordos", "smuggler", "mercenary"}
		local faction = {}
		local actors = player.GetActorsByType("choosefaction")
		if (FactionsMode == 1) then
			if player.Faction == "atreides" then
				faction = bluefactions
			end
			if player.Faction == "harkonnen" then
				faction = redfactions
			end
			if player.Faction == "ordos" then
				faction = greenfactions
			end
			--Media.DisplayMessage("got the bot")
			for pom, actor in pairs(actors) do
				Actor.Create("mcv", true, { Owner = player, Facing = Angle.North, Location = actor.Location, Faction = Utils.Random(faction)})
				actor.Kill();
			end
		else
			faction = player.Faction
			for pom, actor in pairs(actors) do
				Actor.Create("mcv", true, { Owner = player, Facing = Angle.North, Location = actor.Location, Faction = player.Faction})
				Actor.Create( Utils.Random(Mergedsubfactions), true, { Owner = player, Facing = Angle.North, Location = actor.Location, Faction = player.Faction})
				actor.Kill();
			end
		end
	end
end

function engiProtection()

  for i, conyard in pairs(currentConyards) do
    if conyard.IsDead then
        --Media.DisplayMessage("conyard dead")
    else
      actorsInRadius = Map.ActorsInCircle(conyard.CenterPosition, WDist.New(3036))
      --Media.DisplayMessage("testing")
      for _, actor in pairs(actorsInRadius) do
        if actor.Type == "engineer" then
          --Media.DisplayMessage(actor.Type)
          conyard.Sell()
          currentConyards[i] = nil
        end
      end
    end
  end
end

function addCarryToPlayer(player)
	local actors = player.GetActorsByTypes({"mcv", "construction_yard", "choosefaction"})
	local hasCarry = false
	for i, actor in pairs(actors)
	do
		if (actor.Type == "mcv") or (actor.Type == "construction_yard") or (actor.Type == "choosefaction")
		then
			--case then player have multiplye conyards from start
			if (not hasCarry )
			then
			Reinforcements.Reinforce(player, { "carryall" }, { actor.Location }, 10)
			hasCarry = true
			end
		end
	end
end

function wormSpawnFunction()
    creepPlayer = Player.GetPlayer("Creeps")
    actorsSpawner = creepPlayer.GetActorsByType("wormspawner")
  if actorsSpawner ~= nil
  then
    for i, spawner in pairs(actorsSpawner)
    do
      if spawner.AcceptsCondition("WormSpamDelayed")
      then
        spawner.GrantCondition("WormSpamDelayed")
      end
    end
  end
end

function findConyards()
  local newConyards = {}
  local newLocations = {}
 for i, bot in pairs(botPlayers)
  do
    conyards = bot.GetActorsByType("construction_yard")
    for _, conyard in pairs(conyards) do
      table.insert(newConyards, conyard)
      --Media.DisplayMessage("adding",conyard.Type)
      --table.insert(newLocations, conyard.Location)
    end
  end
  currentConyards = newConyards
end
