--'****************************************************** --'* Объект группировки. --'****************************************************** -- В дневное время старается держаться своего логова -- В ночное время нападает на отряды сталкеров 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