Example #1
0
 public void Link(List <Townv2> towns)
 {
     foreach (Townv2 town in towns)
     {
         if (town == this)
         {
             continue;
         }
         if (Vector3.Distance(transform.position, town.transform.position) < generator.maxTownLinkDistance && !town.HasLinkTo(this))
         {
             TownLink lnk = new TownLink(this, town);
             if (lnk.ComputePath())                       // Link only if path found
             {
                 links.Add(lnk);
                 town.links.Add(lnk);
             }
         }
     }
     TrimLinks();
 }
Example #2
0
        private void TrimLinks()
        {
            if (links.Count < generator.maxTownLinkCount)
            {
                return;
            }
            float[] minDistances = new float[generator.maxTownLinkCount];
            for (int i = 0; i < minDistances.Length; i++)
            {
                minDistances[i] = 1000000f;
            }
            int[] indexes = new int[generator.maxTownLinkCount];
            for (int i = 0; i < indexes.Length; i++)
            {
                indexes[i] = -1;
            }
            for (int lnkIndex = 0; lnkIndex < links.Count; lnkIndex++)
            {
                TownLink lnk  = links[lnkIndex];
                float    dist = lnk.PathDistance;
                for (int i = 0; i < minDistances.Length; i++)
                {
                    if (dist < minDistances[i])                           // shorter
                    {
                        for (int j = minDistances.Length - 1; j > i; j--) // Offset
                        {
                            minDistances[j] = minDistances[j - 1];
                            indexes[j]      = indexes[j - 1];
                        }
                        minDistances[i] = dist;
                        indexes[i]      = lnkIndex;
                        break;
                    }
                }
            }
            for (int lnkIndex = 0; lnkIndex < links.Count; lnkIndex++)               // Unlink further away links
            {
                bool keep = false;
                for (int i = 0; i < indexes.Length; i++)
                {
                    if (indexes[i] == -1)
                    {
                        break;
                    }
                    if (lnkIndex == indexes[i])
                    {
                        keep = true;
                        break;
                    }
                }
                if (!keep)
                {
                    links[lnkIndex].Other(this).links.Remove(links[lnkIndex]);
                }
            }
            List <TownLink> nLinks = new List <TownLink>();

            foreach (int index in indexes)
            {
                if (index < 0)
                {
                    break;
                }
                nLinks.Add(links[index]);
            }
            links = nLinks;
        }