add old rivers

pull/3/head
Valentin Stark 3 years ago
parent ff48aa1960
commit 22cc3a5463
  1. 4
      ui/map/map.gd
  2. 57
      world/game.gd

@ -22,7 +22,9 @@ func heightmap():
if edge.get_data("coast"): if edge.get_data("coast"):
coastline.append(edge.line()[0]) coastline.append(edge.line()[0])
coastline.append(edge.line()[1]) 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)

@ -10,8 +10,8 @@ export(int, 1, 30) var wavelength = 8
export(int) var border_width = 200 export(int) var border_width = 200
export(int) var terraces = 24 export(int) var terraces = 24
export(int) var terrace_height = 5 export(int) var terrace_height = 5
export(int) var mountain_height = 6 export(float) var mountain_height = 6.0 / 24.0
export(int) var river_proba = 200 export(int) var river_proba = 50
var rng = RandomNumberGenerator.new() var rng = RandomNumberGenerator.new()
var noise = OpenSimplexNoise.new() var noise = OpenSimplexNoise.new()
@ -24,7 +24,6 @@ func _ready():
noise.octaves = octaves noise.octaves = octaves
terrain = Terrain.new(width,height,spacing,true) terrain = Terrain.new(width,height,spacing,true)
init_data() init_data()
print(terrain)
emit_signal("world_loaded", terrain) emit_signal("world_loaded", terrain)
func init_data(): func init_data():
@ -32,6 +31,8 @@ func init_data():
point.set_elevation(point_find_elevation(point.point2d())) point.set_elevation(point_find_elevation(point.point2d()))
point.set_data("water", point_is_water(point)) point.set_data("water", point_is_water(point))
point.set_data("mountain", point_is_mountain(point)) point.set_data("mountain", point_is_mountain(point))
point.set_data("river", point_is_river(point))
# points_data.append({ # points_data.append({
# "elevation": 0, # "elevation": 0,
# "used": false, # "used": false,
@ -45,6 +46,8 @@ func init_data():
for point in terrain.get_points(): for point in terrain.get_points():
point.set_data("coast", point_is_coast(point)) point.set_data("coast", point_is_coast(point))
if point.get_data("river"):
set_river_path(point)
for triangle in terrain.get_triangles(): for triangle in terrain.get_triangles():
triangle.set_data("elevation", triangle_find_elevation(triangle)) triangle.set_data("elevation", triangle_find_elevation(triangle))
triangle.set_data("water", triangle_is_water(triangle)) triangle.set_data("water", triangle_is_water(triangle))
@ -55,6 +58,8 @@ func init_data():
triangle.set_data("ocean", true) triangle.set_data("ocean", true)
for edge in terrain.get_edges(): for edge in terrain.get_edges():
edge.set_data("coast", edge_is_coast(edge)) edge.set_data("coast", edge_is_coast(edge))
edge.set_data("river", edge_is_river(edge))
func fill_oceans(): func fill_oceans():
var stack = [] var stack = []
for point in terrain.get_points(): for point in terrain.get_points():
@ -68,6 +73,41 @@ func fill_oceans():
stack.append(neighbour.get_index()) stack.append(neighbour.get_index())
break 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 # Point
func point_find_elevation(point): func point_find_elevation(point):
@ -110,6 +150,12 @@ func point_is_coast(point):
return true return true
return false 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 # Triangle
func triangle_find_elevation(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"): if edge.start().get_data("coast") and edge.end().get_data("coast") and edge.triangle().get_data("ocean"):
return true return true
return false return false
func edge_is_river(edge):
if edge.start().get_data("river") and edge.end().get_data("river"):
return true
return false

Loading…
Cancel
Save