--'******************************************************
--'*	Объект группировки.
--'******************************************************

-- В дневное время старается держаться своего логова
-- В ночное время нападает на отряды сталкеров

class "faction_brain_mutant"
function faction_brain_mutant:__init(faction)
	self.faction = faction

	self.human = false	
	self.use_issue_order = false
	self.use_cover_attack = false
	
	if self.faction.player_name == "monster" then
		self.use_delay_attack = true
		self.use_prepare_phase = false		
	else
		self.use_delay_attack = false
		self.use_prepare_phase = true
	end
	
	self.use_counter_attack = false
end

function faction_brain_mutant:calculate_current_expansion()
	local faction = self.faction
	--callstack()
	--printf("faction [%s] brain update %s", faction.player_name, relative_power)
	for k, expansion in pairs(faction.expansion_level) do
		--printf("check %s, current %s", k, faction.current_expansion_level)
		if faction.current_expansion_level > k then
			-- Если проверяемый уровень экспансии ниже, чем текущий
			local cond_valid = xr_logic.pick_section_from_condlist(db.actor, self, expansion.precondition_cond) == "true"
			
			-- Проверяем все ли условия выполняются
			if not cond_valid then
				faction.current_expansion_level = k
				break
			end

		elseif faction.current_expansion_level == k then
			-- Если проверяемый уровень равен текущему.
			-- Проверяем, все ли условия выполняются.
			local cond_valid = xr_logic.pick_section_from_condlist(db.actor, self, expansion.precondition_cond) == "true"
			
			if not cond_valid then
				-- Если не выполняются - прекращаем работу цикла.
				break
			end
		else
			-- Если проверяемый уровень выше текущего.
			faction.current_expansion_level = k
			break
		end
	end
	
	self:calculate_expansion_targets()
end
--' Просчет мозгов.
function faction_brain_mutant:calculate_expansion_targets()
	local faction = self.faction
	faction.target_smart_value = {}

	printf("faction [%s] brain update", faction.player_name)
	if faction.current_expansion_level == 0 then
		return
	end


--	if level.name() ~= nil then
--		if (level.get_time_hours() >= 5 and level.get_time_hours() < 21) then
--			self:register_day_point()
--		else
			self:register_night_point()		
--		end
--	end
	
	--' Считаем максимальный потолок отрядов.
	faction:calculate_total_squads()
	-- Раздаем цели
	faction:calculate_squad_tasks()
end
-- Ночной выбор работ. Охотимся на сталкеров
function faction_brain_mutant:register_night_point()
	--printf("NIGHT")
	-- Итерируемся по смартам, где есть отряды - человеки.
	for k,v in pairs(self.faction.board.smarts) do
		if v.smrt.player_name ~= "none" and self.faction.board.players[v.smrt.player_name].brain.human == true then
			-- По каждой точке создаем задание.
			self:register_target_point(v.smrt)
		end	
	end	
end
-- Дневной выбор работ. Тяготеем к логову.
function faction_brain_mutant:register_day_point()
	--printf("DAY")
	for k,v in pairs(self.faction.board.mutant_lair) do
		self:register_target_point(self.faction.board.smarts[k].smrt)	
	end
end

-- Регистрит таргет смарт. При этом может изменить его капасити
function faction_brain_mutant:register_target_point(smart_obj)
	if not sim_board.is_point_avail(smart_obj, self.faction.player_name) then
		return
	end
				
	local point_capacity = smart_obj.squad_capacity
	
	if smart_obj.player_name == self.faction.player_name or smart_obj.player_name == "none" then
		-- Если точка - место появления отряда, то оставляем окошко в 1, чтобы мог появиться новый отряд.
		if smart_obj.respawn_sector ~= nil then
			point_capacity = point_capacity - 1
		end
	end
	-- Специально увеличиваем капасити, чтобы даже если в логове нет мест - монстры тяготели к логову.
	self.faction.target_smart_value[smart_obj.id] = {smart = smart_obj, cap = 2*point_capacity, num = 0, smart_name = smart_obj:name(), smart_id = smart_obj.id}
	
	--printf("register target point %s", smart_obj:name())
end
