List <SugarscapePatch> GetPatchesInRange()
    {
        Collider[] colsInRange = Physics.OverlapSphere(this.transform.position,
                                                       visionRange,
                                                       patchesLm);

        int maxSugar = -1;
        List <SugarscapePatch> allPatchesInRange = new List <SugarscapePatch>();

        foreach (Collider c in colsInRange)
        {
            SugarscapePatch sp = c.GetComponent <SugarscapePatch>();

            if (!sp.IsOccupied())
            {
                allPatchesInRange.Add(sp);

                if (sp.pSugar > maxSugar)
                {
                    maxSugar = sp.pSugar;
                }
            }
        }

        return(allPatchesInRange.FindAll(p => p.pSugar == maxSugar));
    }
    void RelocateToPatch(SugarscapePatch sp)
    {
        Vector3 newPos = sp.transform.position;

        newPos.y = this.transform.localScale.y / 2f;
        this.transform.position = newPos;

        if (currentPatch)
        {
            currentPatch.Occupy(null);
        }
        currentPatch = sp;
        currentPatch.Occupy(this);
    }
    public void InitAtPatch(SugarscapePatch patchToSpawnAt)
    {
        base.Init();

        sCont = GameObject.FindObjectOfType <SugarscapeController>();

        RelocateToPatch(patchToSpawnAt);

        sugar       = currentPatch.HarvestSugar();
        metabolism  = Random.Range(1, 4);
        maxAge      = Random.Range(60, 100);
        visionRange = Random.Range(1, 6);

        CreateStepper(Move, 1, 105);
        CreateStepper(Eat, 1, 106);
        CreateStepper(Age, 1, 107);
    }
    void Move()
    {
        List <SugarscapePatch> validPatches = GetPatchesInRange();

        validPatches.Shuffle();
        SugarscapePatch spToMoveTo = currentPatch;

        float minDist = float.MaxValue;

        foreach (var sp in validPatches)
        {
            float dist = Vector3.Distance(this.transform.position, sp.transform.position);

            if (dist <= minDist)
            {
                spToMoveTo = sp;
                minDist    = dist;
            }
        }

        RelocateToPatch(spToMoveTo);
    }