public ushort AssignTarget(ushort hearseID)
        {
            Vehicle hearse = Singleton<VehicleManager>.instance.m_vehicles.m_buffer[hearseID];
            ushort target = 0;

            if (hearse.m_sourceBuilding != _id)
                return target;

            ushort current = hearse.m_targetBuilding;

            if (!SkylinesOverwatch.Data.Instance.IsBuildingWithDead(current))
            {
                _master.Remove(current);
                _primary.Remove(current);
                _secondary.Remove(current);

                current = 0;
            }
            else if (_master.ContainsKey(current))
            {
                if (_master[current].IsValid && _master[current].Hearse != hearseID)
                    current = 0;
            }

            bool immediateOnly = _primary.Contains(current) || _secondary.Contains(current);
            SearchDirection immediateDirection = GetImmediateSearchDirection(hearseID);

            if (immediateOnly && immediateDirection == SearchDirection.None)
                target = current;
            else
            {
                target = GetClosestTarget(hearseID, ref _primary, immediateOnly, immediateDirection);

                if (target == 0)
                    target = GetClosestTarget(hearseID, ref _secondary, immediateOnly, immediateDirection);
            }

            if (target == 0)
            {
                if ((current != 0 && !SkylinesOverwatch.Data.Instance.IsBuildingWithDead(current) && WithinPrimaryRange(current)) || _checkups.Count == 0)
                    target = current;
                else
                {
                    target = _checkups[0];
                    _checkups.RemoveAt(0);
                }
            }
            else if (_master.ContainsKey(target))
            {
                if (_master[target].Hearse != hearseID)
                    _master[target] = new Claimant(hearseID, target);
            }
            else
                _master.Add(target, new Claimant(hearseID, target));

            return target;
        }
        public ushort AssignTarget(ushort hearseID)
        {
            Vehicle hearse = Singleton <VehicleManager> .instance.m_vehicles.m_buffer[hearseID];
            ushort  target = 0;

            if (hearse.m_sourceBuilding != _id)
            {
                return(target);
            }

            ushort current = hearse.m_targetBuilding;

            if (!SkylinesOverwatch.Data.Instance.IsBuildingWithDead(current))
            {
                _master.Remove(current);
                _primary.Remove(current);
                _secondary.Remove(current);

                current = 0;
            }
            else if (_master.ContainsKey(current))
            {
                if (_master[current].IsValid && _master[current].Hearse != hearseID)
                {
                    current = 0;
                }
            }

            bool            immediateOnly      = _primary.Contains(current) || _secondary.Contains(current);
            SearchDirection immediateDirection = GetImmediateSearchDirection(hearseID);

            if (immediateOnly && immediateDirection == SearchDirection.None)
            {
                target = current;
            }
            else
            {
                target = GetClosestTarget(hearseID, ref _primary, immediateOnly, immediateDirection);

                if (target == 0)
                {
                    target = GetClosestTarget(hearseID, ref _secondary, immediateOnly, immediateDirection);
                }
            }

            if (target == 0)
            {
                if ((current != 0 && !SkylinesOverwatch.Data.Instance.IsBuildingWithDead(current) && WithinPrimaryRange(current)) || _checkups.Count == 0)
                {
                    target = current;
                }
                else
                {
                    target = _checkups[0];
                    _checkups.RemoveAt(0);
                }
            }
            else if (_master.ContainsKey(target))
            {
                if (_master[target].Hearse != hearseID)
                {
                    _master[target] = new Claimant(hearseID, target);
                }
            }
            else
            {
                _master.Add(target, new Claimant(hearseID, target));
            }

            return(target);
        }