Exemple #1
0
        private int[] GetTarget(int[] source)
        {
            int[][]      neighbor = GetNeighbor(source);
            int          min      = GetMinDistance(distance, neighbor);
            List <int[]> targets  = new List <int[]>();

            foreach (int[] n in neighbor)
            {
                if (distance[n[0], n[1]] == min)
                {
                    targets.Add(n);
                }
            }

            SeedTag tag = GetComponent <IAutoExplore>().GetSeedTag();

            int[] target = (targets.Count > 1)
                ? targets[random.Next(tag, 0, targets.Count)]
                : targets[0];
            // The actor might dance around two grids of the same distance
            // repeatedly. We need to at least prevent PC from doing this.
            if (GetComponent <IAutoExplore>().IsValidDestination(target))
            {
                return(target);
            }
            return(null);
        }
Exemple #2
0
        private void ReplenishSeedIntQueue(SeedTag seed)
        {
            if (IsRoot(seed))
            {
                return;
            }

            // Random numbers from leaf seeds are pregenerated and stored in
            // seedIntQueue. Generate more numbers and a new leaf seed when the
            // queue is almost consumed.
            if (seedIntQueue.TryGetValue(seed, out Queue <int> intQueue))
            {
                if (intQueue.Count > minQueueLength)
                {
                    return;
                }
            }
            else
            {
                seedIntQueue.Add(seed, new Queue <int>());
            }

            System.Random rng = new System.Random(seedInt[seed]);
            for (int i = 0; i < maxQueueLength; i++)
            {
                seedIntQueue[seed].Enqueue(RandomInteger(false, rng));
            }
            seedInt[seed] = RandomInteger(false, rng);
        }
Exemple #3
0
        private int DequeInt(SeedTag tag, int min, int max)
        {
            int result;
            int delta = max - min;

            result = (int)(min + Math.Floor(delta * DequeDouble(tag)));

            return(result);
        }
Exemple #4
0
        public double Next(SeedTag tag)
        {
            if (IsRoot(tag))
            {
                return(rootRNG.NextDouble());
            }

            ReplenishSeedIntQueue(tag);
            return(DequeDouble(tag));
        }
Exemple #5
0
        public int Next(SeedTag tag, int min, int max)
        {
            CheckError(min, max);

            if (IsRoot(tag))
            {
                return(rootRNG.Next(min, max));
            }

            ReplenishSeedIntQueue(tag);
            return(DequeInt(tag, min, max));
        }
Exemple #6
0
        private int[][] FilterPosition(int[][] position)
        {
            SeedTag seed = GetComponent <DungeonProgressData>().GetDungeonSeed();

            int[][] randomized = position.OrderBy(
                p => GetComponent <RandomNumber>().Next(seed))
                                 .ToArray();
            Stack <int[]> result = new Stack <int[]>();

            for (int i = 0; i < maxBeetle; i++)
            {
                result.Push(randomized[i]);
            }
            return(result.ToArray());
        }
Exemple #7
0
 private bool IsRoot(SeedTag tag)
 {
     return(tag == SeedTag.Root);
 }
Exemple #8
0
        private double DequeDouble(SeedTag tag)
        {
            double result = seedIntQueue[tag].Dequeue() / Math.Pow(10, 9);

            return(result);
        }