|
|
|
@ -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 |
|
|
|
|