| function Unit:RoamHyenaLead(group_range) | |
| group_range = group_range or 10 * guim | |
| self:SetBehavior("RoamHyenaLead") | |
| local groups_map = self:GetGroupsMap() | |
| local animals = MapGet(self, group_range, "Unit", function(unit) | |
| return unit.species == self.species and not unit:IsDead() and self:GroupsMatch(unit, groups_map) | |
| end) | |
| table.shuffle(animals, InteractionRand(nil, "HyenaRoam")) | |
| local avail_pos = self.routine_spawner:GetAreaPositions("ignore occupied") | |
| if #avail_pos == 0 then | |
| self:IdleRoutine_StandStill() | |
| return | |
| end | |
| local packed_pos = avail_pos[1 + self:Random(#avail_pos)] | |
| local pos = point(point_unpack(packed_pos)) | |
| local dests = GetUnitsDestinations(animals, pos) | |
| for idx, animal in ipairs(animals) do | |
| dests[animal] = dests[idx] or packed_pos | |
| end | |
| table.remove_entry(animals, self) | |
| for _, animal in ipairs(animals) do | |
| animal:SetCommand("RoamHyenaFollow", GetPassSlab(point(point_unpack(dests[animal]))) or pos, self) | |
| end | |
| self:GotoSlab(GetPassSlab(point(point_unpack(dests[self]))) or pos) | |
| self:IdleRoutine_StandStill(2000, "don't halt") | |
| local animals_finished = {} | |
| while #animals_finished < #animals do | |
| for _, animal in ipairs(animals) do | |
| local finished = (animal.command == "RoamHyenaWait") or (not IsValid(animal) or animal:IsDead()) | |
| if finished and not animals_finished[animal] then | |
| table.insert(animals_finished, animal) | |
| animals_finished[animal] = true | |
| end | |
| end | |
| WaitMsg("UnitGoTo", 300) | |
| end | |
| for _, animal in ipairs(animals_finished) do | |
| animal:SetCommand("Idle") | |
| end | |
| end | |
| function Unit:RoamHyenaFollow(pos, leader) | |
| self:PushDestructor(function() self:SetBehavior() end) | |
| self:SetBehavior("RoamHyenaFollow") | |
| Sleep(self:Random(200)) | |
| self:GotoSlab(pos) | |
| if IsValid(leader) and not leader:IsDead() then | |
| self:SetCommand("RoamHyenaWait", leader) | |
| end | |
| self:PopAndCallDestructor() | |
| end | |
| function Unit:RoamHyenaWait() | |
| self:PushDestructor(function() self:SetBehavior() end) | |
| self:SetBehavior("RoamHyenaWait") | |
| self:IdleRoutine_StandStill(2000, "don't halt") | |
| self:PopAndCallDestructor() | |
| end |