Ejemplo n.º 1
0
        // get positions //
        public Point GetNearbyBlockClosestToTargetForMovement(Point target, MapTile map)
        {
            List <Point> nearbyPoints   = new List <Point>();
            List <Point> walkablePoints = new List <Point>();

            Point closestPoint         = new Point();
            Point nextClosestPoint     = new Point();
            Point closestWalkablePoint = new Point();

            nearbyPoints.Add(new Point(Position.X, Position.Y + 1));
            nearbyPoints.Add(new Point(Position.X, Position.Y - 1));
            nearbyPoints.Add(new Point(Position.X + 1, Position.Y));
            nearbyPoints.Add(new Point(Position.X - 1, Position.Y));
            nearbyPoints.Add(new Point(Position.X - 1, Position.Y + 1));
            nearbyPoints.Add(new Point(Position.X + 1, Position.Y - 1));
            nearbyPoints.Add(new Point(Position.X + 1, Position.Y + 1));
            nearbyPoints.Add(new Point(Position.X - 1, Position.Y - 1));

            foreach (Point point in nearbyPoints)
            {
                if (map.PointWithinBounds(point) && map[point.X, point.Y].Solid == false)
                {
                    walkablePoints.Add(point);
                }

                if (point.DistFrom(target) < closestPoint.DistFrom(target))
                {
                    nextClosestPoint = closestPoint;
                    closestPoint     = point;
                }
            }

            if (map[closestPoint.X, closestPoint.Y].Solid == true && map[target.X, target.Y].Solid == false)
            {
                closestPoint = nextClosestPoint;
            }

            foreach (Point point in walkablePoints)
            {
                int deltaX        = point.X - target.X;
                int deltaY        = point.Y - target.Y;
                int closestDeltaX = closestPoint.X - target.X;
                int closestDeltaY = closestPoint.Y - target.Y;

                if (Math.Sqrt(deltaX * deltaX + deltaY * deltaY) <= Math.Sqrt(closestDeltaX * closestDeltaX + closestDeltaY * closestDeltaY))
                {
                    closestWalkablePoint = point;
                }
            }

            return(closestWalkablePoint);
        }
Ejemplo n.º 2
0
        public void TrySeed(MapTile map, Point position, Random rng)
        {
            if (!map.PointWithinBounds(position))
            {
                return;
            }
            bool explored = map.Blocks[position.X * map.Width + position.Y].Explored;

            if (map.Floor[position.X * map.Width + position.Y] is DirtFloor)
            {
                if ((map.Blocks[position.X * map.Width + position.Y] is Plant && rng.Next(0, 50) <= 1) || map.Blocks[position.X * map.Width + position.Y] is Air)
                {
                    map[position.X, position.Y] = new Plant(growthStages[0], Name, growthInterval, seedRadius, growthStages, requirement, edible, ForeColor, explored);
                }
            }
        }