122 lines
4 KiB
Text
122 lines
4 KiB
Text
--'******************************************************
|
|
--'* Îáúåêò ãðóïïèðîâêè.
|
|
--'******************************************************
|
|
|
|
-- Â äíåâíîå âðåìÿ ñòàðàåòñÿ äåðæàòüñÿ ñâîåãî ëîãîâà
|
|
--  íî÷íîå âðåìÿ íàïàäàåò íà îòðÿäû ñòàëêåðîâ
|
|
|
|
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
|