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)); } } }