private void add_all_natural_features(List<NaturalFeature.Feature_Type> features)
        {
            for (int i = 0; i < features.Count; i++)
            {
                if (features[i] == NaturalFeature.Feature_Type.River ||
                    features[i] == NaturalFeature.Feature_Type.Chasm)
                {
                    int feature_length_side1 = randGen.Next(15, 26);
                    int feature_length_side2 = randGen.Next(15, 26);

                    gridCoordinate feature_center = random_valid_position(current_floorsize);
                    gridCoordinate feature_start = new gridCoordinate(-1, -1);
                    gridCoordinate feature_end = new gridCoordinate(-1, -1);
                    bool valid_feature = false;

                    while (!valid_feature)
                    {
                        //Start with a random valid position
                        feature_center = random_valid_position(current_floorsize);
                        //Generate direction vectors for each side of the feature.
                        float side_xVector = (float)Math.Cos(randGen.NextDouble() * Math.PI * 2);
                        float side_yVector = (float)Math.Sin(randGen.NextDouble() * Math.PI * 2);
                        Vector2 side_directionVector = new Vector2(side_xVector, side_yVector);

                        //Adjust the endpoints.
                        feature_start = new gridCoordinate(feature_center);
                        feature_end = new gridCoordinate(feature_center);
                        feature_start.add_vector2(side_directionVector * feature_length_side1);
                        feature_end.add_vector2(side_directionVector * feature_length_side2 * -1);

                        //Force the values to be safe.
                        feature_start.force_safe_value(current_floorsize);
                        feature_end.force_safe_value(current_floorsize);

                        //Check to see whether the values are okay. All river values are accepted
                        //Chasm values are rerolled if they're too close to the edge.
                        if (features[i] == NaturalFeature.Feature_Type.River)
                            valid_feature = true;
                        else if (features[i] == NaturalFeature.Feature_Type.Chasm)
                        {
                            if (feature_start.x > 4 && feature_start.x < 47 &&
                               feature_start.y > 4 && feature_start.y < 47 &&
                               feature_end.x > 4 && feature_end.x < 47 &&
                               feature_end.y > 4 && feature_end.y < 47)
                                valid_feature = true;
                        }
                    }

                    if (features[i] == NaturalFeature.Feature_Type.River)
                    {
                        //Add the new river
                        int deepwater_thickness = randGen.Next(2);
                        int shallows_thickness = 1 + randGen.Next(3);
                        int banks_thickness = 1 + randGen.Next(2);
                        featurelayout.Add(new NaturalFeature(feature_start, feature_end, NaturalFeature.River_Type.Normal,
                                                                                         deepwater_thickness,
                                                                                         shallows_thickness,
                                                                                         banks_thickness));
                    }
                    else if (features[i] == NaturalFeature.Feature_Type.Chasm)
                    {
                        //Add the new chasm
                        int max_thickness = randGen.Next(6, 13);
                        featurelayout.Add(new NaturalFeature(feature_start, feature_end, max_thickness));
                    }
                }
                else if (features[i] == NaturalFeature.Feature_Type.Lake)
                {
                    gridCoordinate feature_center = random_valid_position(current_floorsize);

                    int xSize = randGen.Next(11, 18);
                    int ySize = randGen.Next(11, 18);
                    int room_thickness = 1 + randGen.Next(2);
                    int shore_thickness = 1 + randGen.Next(2);
                    int shallows_thickness = 1 + randGen.Next(2);

                    gridCoordinate feature_start = new gridCoordinate(feature_center.x - xSize / 2, feature_center.y - ySize / 2);
                    gridCoordinate feature_end = new gridCoordinate(feature_center.x + xSize / 2, feature_center.y + ySize / 2);
                    feature_start.force_safe_value(current_floorsize);
                    feature_end.force_safe_value(current_floorsize);

                    featurelayout.Add(new NaturalFeature(feature_start, feature_end, room_thickness, shore_thickness, shallows_thickness));
                }
            }
        }