diff --git a/ui/map/map.gd b/ui/map/map.gd index ecc47f9..bddf3f7 100644 --- a/ui/map/map.gd +++ b/ui/map/map.gd @@ -22,7 +22,9 @@ func heightmap(): if edge.get_data("coast"): coastline.append(edge.line()[0]) coastline.append(edge.line()[1]) - draw_multiline(coastline, Color.black, 5.0) + if edge.get_data("river"): + draw_line(edge.line()[0], edge.line()[1], Color.blue, 5.0) + draw_multiline(coastline, Color.black) diff --git a/world/game.gd b/world/game.gd index fe4cf6a..5124aaa 100644 --- a/world/game.gd +++ b/world/game.gd @@ -10,8 +10,8 @@ export(int, 1, 30) var wavelength = 8 export(int) var border_width = 200 export(int) var terraces = 24 export(int) var terrace_height = 5 -export(int) var mountain_height = 6 -export(int) var river_proba = 200 +export(float) var mountain_height = 6.0 / 24.0 +export(int) var river_proba = 50 var rng = RandomNumberGenerator.new() var noise = OpenSimplexNoise.new() @@ -24,7 +24,6 @@ func _ready(): noise.octaves = octaves terrain = Terrain.new(width,height,spacing,true) init_data() - print(terrain) emit_signal("world_loaded", terrain) func init_data(): @@ -32,6 +31,8 @@ func init_data(): point.set_elevation(point_find_elevation(point.point2d())) point.set_data("water", point_is_water(point)) point.set_data("mountain", point_is_mountain(point)) + point.set_data("river", point_is_river(point)) + # points_data.append({ # "elevation": 0, # "used": false, @@ -45,6 +46,8 @@ func init_data(): for point in terrain.get_points(): point.set_data("coast", point_is_coast(point)) + if point.get_data("river"): + set_river_path(point) for triangle in terrain.get_triangles(): triangle.set_data("elevation", triangle_find_elevation(triangle)) triangle.set_data("water", triangle_is_water(triangle)) @@ -55,6 +58,8 @@ func init_data(): triangle.set_data("ocean", true) for edge in terrain.get_edges(): edge.set_data("coast", edge_is_coast(edge)) + edge.set_data("river", edge_is_river(edge)) + func fill_oceans(): var stack = [] for point in terrain.get_points(): @@ -68,6 +73,41 @@ func fill_oceans(): stack.append(neighbour.get_index()) break +func set_river_path(point): + var start_elevation = point.get_elevation() + var waypoints = [] + var stack = [] + var end + stack.append(point.get_index()) + var came_from = {} + + while stack.size(): + var current_point_id = stack.pop_front() + if terrain.get_point(current_point_id).get_elevation() < start_elevation: + waypoints.append(current_point_id) + start_elevation = terrain.get_point(current_point_id).get_elevation() + stack = [] + end = current_point_id + if terrain.get_point(current_point_id).get_data("ocean"): + break + for neighbour in terrain.get_point(current_point_id).points_around(): +# if points_data[neighbour].elevation <= start_elevation: + if not came_from.has(neighbour.get_index()): + stack.append(neighbour.get_index()) + came_from[neighbour.get_index()] = current_point_id + + var path = [] + for waypoint in waypoints: + var current = waypoint + while current != point.get_index(): + if not path.has(current): + path.append(current) + current = came_from[current] + + path.append(point.get_index()) + for index in path: + terrain.get_point(index).set_data("river", true) + # Point func point_find_elevation(point): @@ -110,6 +150,12 @@ func point_is_coast(point): return true return false +func point_is_river(point): + if point.get_data("mountain") and not point.get_data("river"): + var random = rng.randi_range(1, river_proba) + if random == 1: + return true + return false # Triangle func triangle_find_elevation(triangle): @@ -130,3 +176,8 @@ func edge_is_coast(edge): if edge.start().get_data("coast") and edge.end().get_data("coast") and edge.triangle().get_data("ocean"): return true return false + +func edge_is_river(edge): + if edge.start().get_data("river") and edge.end().get_data("river"): + return true + return false