diff --git a/ui/map/map.gd b/ui/map/map.gd index 0712a66..7153735 100644 --- a/ui/map/map.gd +++ b/ui/map/map.gd @@ -47,13 +47,27 @@ func draw_triangles(): colors.add_point(0.999, Color("#9e0142")) # red colors.add_point(0.5, Color("#dc865d")) # orange colors.add_point(0.25, Color("#fbf8b0")) # yellow - colors.add_point(0, Color("#89cfa5")) # green + colors.add_point(0, Color.green) # green colors.add_point(-0.999, Color("#5e4fa2")) # blue - var color = Color(randf(), randf(), randf(), 1) - color = colors.interpolate(min(triangle.get_data("elevation"), 0.999)) + var color = colors.interpolate(min(triangle.get_data("elevation"), 0.999)) + if triangle.get_data("ocean"): + color = Color.red if triangle.polygon().size() > 2: draw_polygon(triangle.polygon(), PoolColorArray([color])) - + + + + + + + + + + + + + + func draw_triangles_edges(color=Color("#000000")): for line in terrain.get_edges_as_line(): draw_line(line[0], line[1], color) @@ -121,4 +135,4 @@ func _draw(): func _on_Game_world_loaded(game_terrain): terrain = game_terrain - create_map() + update() diff --git a/utils/terrain/Terrain.gd b/utils/terrain/Terrain.gd index 717c8fe..5726c3e 100644 --- a/utils/terrain/Terrain.gd +++ b/utils/terrain/Terrain.gd @@ -166,11 +166,11 @@ class Point: func points_around(): var list_points = [] var incoming = _terrain._points_to_halfedges.get(_idx) - var incoming_edge = Point.new(incoming, _terrain) + var incoming_edge = Edge.new(incoming, _terrain) var outgoing_edge while true: list_points.append(Point.new(_terrain._triangles[incoming_edge._idx], _terrain)); - outgoing_edge = incoming_edge.next_half() + outgoing_edge = incoming_edge.opposite() incoming_edge = Edge.new(_terrain._halfedges[outgoing_edge._idx], _terrain); if not (incoming_edge._idx != -1 and incoming_edge._idx != incoming): break diff --git a/world/game.gd b/world/game.gd index 118f253..c4bc5a0 100644 --- a/world/game.gd +++ b/world/game.gd @@ -23,13 +23,14 @@ func _ready(): noise.seed = rng.randi() noise.octaves = octaves terrain = Terrain.new(width,height,spacing,true) - init_points_data() + init_data() print(terrain) emit_signal("world_loaded", terrain) -func init_points_data(): +func init_data(): for point in terrain.get_points(): - point.set_elevation(find_point_elevation(point.point2d())) + point.set_elevation(point_find_elevation(point.point2d())) + point.set_data("water", point_is_water(point)) # points_data.append({ # "elevation": 0, # "used": false, @@ -39,10 +40,19 @@ func init_points_data(): # "mountain": false, # "river": false # }) + fill_oceans() + for triangle in terrain.get_triangles(): - triangle.set_data("elevation", find_triangle_elevation(triangle)) + triangle.set_data("elevation", triangle_find_elevation(triangle)) + triangle.set_data("water", triangle_is_water(triangle)) + triangle.set_data("ocean", false) + for point in triangle.points(): + if point.get_data("ocean"): + triangle.set_data("ocean", true) + +# Point -func find_point_elevation(point): +func point_find_elevation(point): var border = border_width + rng.randf_range(-20.0, 20.0) var elevation = noise.get_noise_2d(point.x / wavelength, point.y / wavelength) @@ -64,10 +74,35 @@ func find_point_elevation(point): # elevation = elevation * terraces return elevation + +func point_is_water(point): + if (point.get_elevation() <= 0): + return true + return false + +# Triangle -func find_triangle_elevation(triangle): +func triangle_find_elevation(triangle): var elevation = 0 for point in triangle.points(): elevation += point.get_elevation() - elevation /= 3 + elevation /= 3.0 return elevation + +func triangle_is_water(triangle): + if triangle.get_data("elevation") <= 0: + return true + return false + +func fill_oceans(): + var stack = [] + for point in terrain.get_points(): + if point.point2d().x < 10 and point.get_data("water") and not point.get_data("ocean"): + stack.append(point.get_index()) + while stack.size(): + var current_point_id = stack.pop_back() + terrain.get_point(current_point_id).set_data("ocean", true) + for neighbour in terrain.get_point(current_point_id).points_around(): + if neighbour.get_data("water") and not neighbour.get_data("ocean"): + stack.append(neighbour.get_index()) + break diff --git a/world/game.tscn b/world/game.tscn index 04f54ff..3c60c82 100644 --- a/world/game.tscn +++ b/world/game.tscn @@ -8,6 +8,9 @@ script = ExtResource( 2 ) [node name="UI" parent="." instance=ExtResource( 1 )] +[node name="Map" parent="UI" index="0"] +scale = Vector2( 0.5, 0.5 ) + [connection signal="world_loaded" from="." to="UI/Map" method="_on_Game_world_loaded"] [editable path="UI"]