Beispiel #1
0
        private void CreateHousingWaypoint(int housingID, GameObject objRoot, Vector3 areaSize)
        {
            if (Object.op_Equality((Object)objRoot, (Object)null) || !Singleton <Resources> .IsInstance())
            {
                return;
            }
            LocomotionProfile locomotionProfile = Singleton <Resources> .Instance.LocomotionProfile;

            if (Object.op_Equality((Object)locomotionProfile, (Object)null))
            {
                return;
            }
            List <ValueTuple <Vector3, Waypoint> > waypointList;

            if (!this._housingWaypointCacheTable.TryGetValue(housingID, out waypointList) || waypointList == null)
            {
                this._housingWaypointCacheTable[housingID] = waypointList = new List <ValueTuple <Vector3, Waypoint> >();
                Transform transform = objRoot.get_transform();
                if (Object.op_Equality((Object)transform, (Object)null))
                {
                    return;
                }
                float       installationDistance = locomotionProfile.HousingWaypointSetting.InstallationDistance;
                float       installationHeight   = locomotionProfile.HousingWaypointSetting.InstallationHeight;
                SpiralPoint spiralPoint          = new SpiralPoint(999);
                for (int index = 0; (double)installationHeight * (double)index < areaSize.y; ++index)
                {
                    float num = installationHeight * (float)index;
                    spiralPoint.Clear();
                    spiralPoint.Limit = 999;
                    while (!spiralPoint.End)
                    {
                        Vector3 vector3 = Vector3.op_Multiply(new Vector3((float)((Vector2Int) ref spiralPoint.Current).get_x(), 0.0f, (float)((Vector2Int) ref spiralPoint.Current).get_y()), installationDistance);
                        vector3.y = (__Null)(double)num;
                        if (areaSize.y > vector3.y && vector3.x > -areaSize.x / 2.0 && (areaSize.x / 2.0 > vector3.x && vector3.z > -areaSize.z / 2.0) && areaSize.z / 2.0 > vector3.z)
                        {
                            vector3 = Vector3.op_Addition(transform.get_position(), Quaternion.op_Multiply(transform.get_rotation(), vector3));
                            waypointList.Add(new ValueTuple <Vector3, Waypoint>(vector3, (Waypoint)null));
                            spiralPoint.Next();
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
            this.RefreshWaypoints(housingID, waypointList);
        }
Beispiel #2
0
 public static int ManhattanDistance(this SpiralPoint point)
 {
     return(Math.Abs(point.X) + Math.Abs(point.Y));
 }
Beispiel #3
0
        public static IEnumerable <SpiralPoint> AdjacentSpiral()
        {
            var cache = new Dictionary <(int, int), SpiralPoint>();

            IEnumerable <SpiralPoint> GetNeighbors(int xAxis, int yAxis)
            {
                var neighbors = new List <SpiralPoint>();

                for (var i = -1; i <= 1; i++)
                {
                    for (var j = -1; j <= 1; j++)
                    {
                        if (cache.TryGetValue((xAxis + i, yAxis + j), out var neighbor))
                        {
                            neighbors.Add(neighbor);
                        }
                    }
                }

                return(neighbors);
            }

            var value     = 0;
            var x         = 0;
            var y         = 0;
            var direction = Directions().GetEnumerator();

            while (direction.Current != Direction.East)
            {
                direction.MoveNext();
            }
            var armNumber = ArmDistance().GetEnumerator();

            armNumber.MoveNext();
            var distanceTraveled = 0;


            for (; ;)
            {
                value = Math.Max(GetNeighbors(x, y).Sum(n => n.Value), 1);
                var point = new SpiralPoint(value, x, y);
                cache.Add((x, y), point);
                yield return(point);

                if (distanceTraveled == armNumber.Current)
                {
                    distanceTraveled = 0;
                    armNumber.MoveNext();
                    direction.MoveNext();
                }
                distanceTraveled++;

                switch (direction.Current)
                {
                case Direction.East:
                    x++;
                    break;

                case Direction.North:
                    y++;
                    break;

                case Direction.West:
                    x--;
                    break;

                case Direction.South:
                    y--;
                    break;
                }
            }
        }
Beispiel #4
0
        public SpiralPoint FindNext(int numberToSeek)
        {
            var spiral = new SpiralPoint()
            {
                Value = 1
            };

            var spiralPoints = new List <SpiralPoint>();

            Func <int, int, int> getPointValue = (x, y) =>
            {
                return(spiralPoints.SingleOrDefault(p => p.X == x && p.Y == y)?.Value ?? 0);
            };

            Func <SpiralPoint, SpiralPoint> next = thisPoint =>
            {
                spiralPoints.Add(thisPoint);

                var xValues = spiralPoints.Select(p => p.X).ToList();
                var yValues = spiralPoints.Select(p => p.Y).ToList();
                var maxX    = xValues.Max();
                var maxY    = yValues.Max();
                var minX    = xValues.Min();
                var minY    = yValues.Min();

                var goingUp = maxX.AbsGreaterThan(maxY, minY, minX);

                var goingLeft = maxY.AbsGreaterThan(minY, minX) && maxY == maxX;

                var goingDown = Day3Helpers.AbsEqual(minX, maxX) && !Day3Helpers.AbsEqual(minX, minY);

                var goingRight = Day3Helpers.AbsEqual(minY, minX) && Math.Abs(minY) == Math.Abs(maxX);

                var nextPoint = new SpiralPoint()
                {
                    X = thisPoint.X,
                    Y = thisPoint.Y
                };

                if (goingDown)
                {
                    nextPoint.Y--;
                }
                if (goingUp)
                {
                    nextPoint.Y++;
                }
                if (goingRight)
                {
                    nextPoint.X++;
                }
                if (goingLeft)
                {
                    nextPoint.X--;
                }

                thisPoint.Next     = nextPoint;
                nextPoint.Previous = thisPoint;

                var right       = getPointValue(nextPoint.X + 1, nextPoint.Y);
                var topRight    = getPointValue(nextPoint.X + 1, nextPoint.Y + 1);
                var top         = getPointValue(nextPoint.X, nextPoint.Y + 1);
                var topLeft     = getPointValue(nextPoint.X - 1, nextPoint.Y + 1);
                var left        = getPointValue(nextPoint.X - 1, nextPoint.Y);
                var bottomLeft  = getPointValue(nextPoint.X - 1, nextPoint.Y - 1);
                var bottom      = getPointValue(nextPoint.X, nextPoint.Y - 1);
                var bottomRight = getPointValue(nextPoint.X + 1, nextPoint.Y - 1);

                var nextValue = right + topRight + top + topLeft + left + bottomLeft + bottom + bottomRight;

                nextPoint.Value = nextValue;

                return(nextPoint);
            };

            var spiralPoint = spiral;

            while (spiralPoint.Value <= numberToSeek)
            {
                spiralPoint = next(spiralPoint);
            }

            return(spiralPoint);
        }