You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
Gridmap/scripts/World.gd

135 lines
3.8 KiB

extends Node
class_name World
var _data: Dictionary
var _heightmap: Array
func _init(width, height):
_data["width"] = width
_data["height"] = height
for x in range(_data["width"]):
_heightmap.append([])
for y in range(_data["height"]):
_heightmap[x].append(0)
func generate_world():
randomize()
var noise = FastNoiseLite.new()
noise.seed = randi()
for x in _data["width"]:
for y in _data["width"]:
var wavelength = 3
var width = 2048
var height = 2048
var terraces = 20
# var border = border_width + rng.randf_range(-20.0, 20.0)
var elevation = noise.get_noise_2d(x / wavelength, y / wavelength)
var nx = 2 * x / width - 1
var ny = 2 * y / height - 1
var radius = remap(elevation, -1, 1, 0.8, 0.9)
var distance = 1 - (1-pow(nx, 2)) * (1-pow(ny,2))
distance = sqrt(pow(nx, 2) + pow(ny, 2))
# if distance > radius:
# elevation = (elevation - remap(distance, radius, 1.0, 0.0, 1.0))
elevation = max(elevation, -1)
if elevation > 0.1:
elevation = max(pow((elevation) * 1.2, 1.5), 0.1)
elevation = min(elevation, 1)
elevation = (elevation * terraces)
# print(elevation)
_heightmap[x][y] = floor(elevation)
#func blocs_generate():
# for x in _data["width"] - 1:
# for y in _data["width"] - 1:
# var corners = bloc_get_corners(Vector2(x, y))
# _blocs[x][y]["height"] = corners.max()
# _blocs[x][y]["shape"] = blocs_get_configuration_by_corners(corners)
#
#func blocs_get_bloc(point: Vector2):
# return _blocs[point.x][point.y]
#
#func bloc_get_corners(bloc: Vector2):
# return [
# corners_get_corner(Vector2(bloc.x, bloc.y)),
# corners_get_corner(Vector2(bloc.x + 1, bloc.y)),
# corners_get_corner(Vector2(bloc.x + 1, bloc.y + 1)),
# corners_get_corner(Vector2(bloc.x, bloc.y + 1))
# ]
#
#func blocs_get_configuration_by_corners(corners: Array):
# var max = corners.max()
# var result: int = 0
# if corners[0] == max:
# result += 8
# if corners[1] == max:
# result += 4
# if corners[2] == max:
# result += 2
# if corners[3] == max:
# result += 1
# if result == 8 and corners[0] - corners[2] >= 2:
# result = 16
# if result == 4 and corners[1] - corners[3] >= 2:
# result = 17
# if result == 2 and corners[2] - corners[0] >= 2:
# result = 18
# if result == 1 and corners[3] - corners[1] >= 2:
# result = 19
#
# return result
func get_neighbours_8_at_same_height(point: Vector2):
var neighbours = 0
var current_bloc = _heightmap[point.x][point.y]
if _heightmap[point.x-1][point.y-1] == current_bloc:
neighbours += Global.directions_8.TOP_LEFT
if _heightmap[point.x][point.y-1] == current_bloc:
neighbours += Global.directions_8.TOP
if _heightmap[point.x+1][point.y-1] == current_bloc:
neighbours += Global.directions_8.TOP_RIGHT
if _heightmap[point.x+1][point.y] == current_bloc:
neighbours += Global.directions_8.RIGHT
if _heightmap[point.x+1][point.y+1] == current_bloc:
neighbours += Global.directions_8.BOTTOM_RIGHT
if _heightmap[point.x][point.y+1] == current_bloc:
neighbours += Global.directions_8.BOTTOM
if _heightmap[point.x-1][point.y+1] == current_bloc:
neighbours += Global.directions_8.BOTTOM_LEFT
if _heightmap[point.x-1][point.y] == current_bloc:
neighbours += Global.directions_8.LEFT
return neighbours
func get_neighbours_4_at_same_height(point: Vector2):
var neighbours = 0
var current_bloc = _heightmap[point.x][point.y]
if _heightmap[point.x][point.y-1] == current_bloc:
neighbours += Global.directions_4.TOP
if _heightmap[point.x+1][point.y] == current_bloc:
neighbours += Global.directions_4.RIGHT
if _heightmap[point.x][point.y+1] == current_bloc:
neighbours += Global.directions_4.BOTTOM
if _heightmap[point.x-1][point.y] == current_bloc:
neighbours += Global.directions_4.LEFT
return neighbours
func find_elevation(point: Vector2):
return _heightmap[point.x][point.y]