ajout d'une bordure aléatoire entre chunks
This commit is contained in:
@@ -1,4 +1,3 @@
|
|||||||
@tool
|
|
||||||
extends Node2D
|
extends Node2D
|
||||||
class_name Chunk
|
class_name Chunk
|
||||||
|
|
||||||
@@ -6,16 +5,20 @@ const GENERATION_NUMBER = 4
|
|||||||
|
|
||||||
const NOISE_IMAGE_SIZE := 150
|
const NOISE_IMAGE_SIZE := 150
|
||||||
|
|
||||||
const MAX_DECONTAMINATION_DISTANCE=2
|
const MAX_DECONTAMINATION_DISTANCE=3
|
||||||
|
|
||||||
|
const RANDOM_PADDING_NOISE_FREQUENCY := 0.01
|
||||||
const ROCK_NOISE_FREQUENCY := 0.01
|
const ROCK_NOISE_FREQUENCY := 0.01
|
||||||
const DECONTAMINATION_NOISE_FREQUENCY := 0.01
|
const DECONTAMINATION_NOISE_FREQUENCY := 0.01
|
||||||
|
|
||||||
|
const CHUNK_RANDOM_PADDING := 2
|
||||||
|
|
||||||
@export var region_data : RegionData
|
@export var region_data : RegionData
|
||||||
@export var chunk_coord : Vector2i
|
@export var chunk_coord : Vector2i
|
||||||
|
|
||||||
var is_generated : bool = false
|
var is_generated : bool = false
|
||||||
|
|
||||||
|
var random_padding_noise : Noise = null
|
||||||
var rock_noise_image : Noise = null
|
var rock_noise_image : Noise = null
|
||||||
var cristal_noise_image : Noise = null
|
var cristal_noise_image : Noise = null
|
||||||
var decontamination_noise_image : Noise = null
|
var decontamination_noise_image : Noise = null
|
||||||
@@ -28,13 +31,21 @@ var generation_thread : Thread
|
|||||||
|
|
||||||
var generation_semaphore : Semaphore
|
var generation_semaphore : Semaphore
|
||||||
|
|
||||||
@export_tool_button("Update", "Callable") var update_action = func():
|
var all_tiles : Array[Vector2i]
|
||||||
generation_semaphore.post()
|
var all_global_tiles : Array[Vector2i]
|
||||||
for c in get_children():
|
|
||||||
c.queue_free()
|
|
||||||
|
|
||||||
setup_position()
|
# @export_tool_button("Update", "Callable") var update_action = func():
|
||||||
generate()
|
# generation_semaphore.post()
|
||||||
|
# for c in get_children():
|
||||||
|
# c.queue_free()
|
||||||
|
|
||||||
|
# setup_position()
|
||||||
|
# # queue_redraw()
|
||||||
|
# generate()
|
||||||
|
|
||||||
|
# @export_tool_button("Clear", "Callable") var clear_action = func():
|
||||||
|
# for c in get_children():
|
||||||
|
# c.queue_free()
|
||||||
|
|
||||||
func _init(
|
func _init(
|
||||||
_chunk_coord : Vector2i = Vector2i.ZERO,
|
_chunk_coord : Vector2i = Vector2i.ZERO,
|
||||||
@@ -60,6 +71,9 @@ func generate():
|
|||||||
rock_noise_image = generate_noise(region_data.region_seed + 1, ROCK_NOISE_FREQUENCY)
|
rock_noise_image = generate_noise(region_data.region_seed + 1, ROCK_NOISE_FREQUENCY)
|
||||||
decontamination_noise_image = generate_noise(region_data.region_seed + 2, DECONTAMINATION_NOISE_FREQUENCY)
|
decontamination_noise_image = generate_noise(region_data.region_seed + 2, DECONTAMINATION_NOISE_FREQUENCY)
|
||||||
cristal_noise_image = generate_noise(region_data.region_seed + 3, ROCK_NOISE_FREQUENCY)
|
cristal_noise_image = generate_noise(region_data.region_seed + 3, ROCK_NOISE_FREQUENCY)
|
||||||
|
random_padding_noise = generate_noise(region_data.region_seed + 10, RANDOM_PADDING_NOISE_FREQUENCY)
|
||||||
|
|
||||||
|
all_tiles = calculate_all_tiles()
|
||||||
|
|
||||||
rock_layer = RockLayer.new(region_data)
|
rock_layer = RockLayer.new(region_data)
|
||||||
ground_layer = GroundLayer.new(region_data)
|
ground_layer = GroundLayer.new(region_data)
|
||||||
@@ -81,13 +95,49 @@ func generate():
|
|||||||
|
|
||||||
is_generated = true
|
is_generated = true
|
||||||
|
|
||||||
# func unload():
|
func calculate_all_tiles() -> Array[Vector2i]:
|
||||||
# for x in range(Region.CHUNK_TILE_SIZE):
|
var coords : Array[Vector2i] = []
|
||||||
# for y in range(Region.CHUNK_TILE_SIZE):
|
|
||||||
# var global_coord = Vector2i(x, y) + Region.CHUNK_TILE_SIZE * chunk_coord
|
for x in range(-CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING):
|
||||||
# region.rock_layer.erase_cell(global_coord)
|
for y in range(-CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING):
|
||||||
# region.ground_layer.erase_cell(global_coord)
|
var coord := Vector2i(x,y)
|
||||||
# region.decontamination_layer.erase_cell(global_coord)
|
if is_tile_in_chunk(coord):
|
||||||
|
coords.append(coord)
|
||||||
|
return coords
|
||||||
|
|
||||||
|
func is_tile_in_chunk(coord : Vector2i) -> bool:
|
||||||
|
var check_select = (chunk_coord.x + chunk_coord.y%2)%2 == 0
|
||||||
|
var x := coord.x
|
||||||
|
var y := coord.y
|
||||||
|
|
||||||
|
if not (
|
||||||
|
x in range(-CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING)
|
||||||
|
and y in range(-CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING)
|
||||||
|
):
|
||||||
|
return false
|
||||||
|
|
||||||
|
if not (
|
||||||
|
(x < 0 or x >= Region.CHUNK_TILE_SIZE)
|
||||||
|
and (y < 0 or y >= Region.CHUNK_TILE_SIZE)
|
||||||
|
):
|
||||||
|
if (
|
||||||
|
x in range(-CHUNK_RANDOM_PADDING, CHUNK_RANDOM_PADDING)
|
||||||
|
or x in range(Region.CHUNK_TILE_SIZE - CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING)
|
||||||
|
or y in range(-CHUNK_RANDOM_PADDING, CHUNK_RANDOM_PADDING)
|
||||||
|
or y in range(Region.CHUNK_TILE_SIZE - CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING)
|
||||||
|
):
|
||||||
|
var tile_value = get_tile_value_from_noise(Vector2i(x,y), random_padding_noise)
|
||||||
|
if check_select:
|
||||||
|
if tile_value >= 0.5:
|
||||||
|
return true
|
||||||
|
else :
|
||||||
|
if tile_value < 0.5:
|
||||||
|
return true
|
||||||
|
else:
|
||||||
|
return true
|
||||||
|
|
||||||
|
return false
|
||||||
|
|
||||||
|
|
||||||
# Debug
|
# Debug
|
||||||
# func _draw():
|
# func _draw():
|
||||||
@@ -98,17 +148,17 @@ func generate():
|
|||||||
# 3
|
# 3
|
||||||
# )
|
# )
|
||||||
|
|
||||||
# for x in range(NOISE_IMAGE_SIZE):
|
# for x in range(NOISE_IMAGE_SIZE):
|
||||||
# for y in range(NOISE_IMAGE_SIZE):
|
# for y in range(NOISE_IMAGE_SIZE):
|
||||||
# var noise_value = rock_noise_image.get_noise_2d(
|
# var noise_value = random_padding_noise.get_noise_2d(
|
||||||
# x,
|
# x,
|
||||||
# y
|
# y
|
||||||
# )
|
# )
|
||||||
# draw_rect(
|
# draw_rect(
|
||||||
# Rect2(Vector2i(x,y) * Region.CHUNK_SIZE / NOISE_IMAGE_SIZE, Vector2i.ONE * Region.CHUNK_SIZE / NOISE_IMAGE_SIZE),
|
# Rect2(Vector2i(x,y) * Region.CHUNK_SIZE / NOISE_IMAGE_SIZE, Vector2i.ONE * Region.CHUNK_SIZE / NOISE_IMAGE_SIZE),
|
||||||
# Color.WHITE * ((noise_value+1)/2),
|
# Color.WHITE * ((noise_value+1)/2),
|
||||||
# true,
|
# true,
|
||||||
# )
|
# )
|
||||||
|
|
||||||
func generate_noise(
|
func generate_noise(
|
||||||
noise_seed : int,
|
noise_seed : int,
|
||||||
@@ -139,14 +189,12 @@ func get_tile_value_from_noise(tile_position : Vector2i, noise : Noise) -> float
|
|||||||
func generate_rocks(layer : RockLayer):
|
func generate_rocks(layer : RockLayer):
|
||||||
var cristals : Array[Vector2i] = []
|
var cristals : Array[Vector2i] = []
|
||||||
var rocks : Array[Vector2i] = []
|
var rocks : Array[Vector2i] = []
|
||||||
for x in range(0, Region.CHUNK_TILE_SIZE):
|
for coord in all_tiles:
|
||||||
for y in range(0, Region.CHUNK_TILE_SIZE):
|
var tile_type := get_generated_rock_type(coord)
|
||||||
var tile_type := get_generated_rock_type(Vector2i(x, y))
|
if tile_type == RockLayer.TileType.CRISTAL:
|
||||||
var coord = Vector2i(x, y)
|
cristals.append(coord)
|
||||||
if tile_type == RockLayer.TileType.CRISTAL:
|
elif tile_type == RockLayer.TileType.ROCK:
|
||||||
cristals.append(coord)
|
rocks.append(coord)
|
||||||
elif tile_type == RockLayer.TileType.ROCK:
|
|
||||||
rocks.append(coord)
|
|
||||||
|
|
||||||
layer.place_rocks(cristals, RockLayer.TileType.CRISTAL)
|
layer.place_rocks(cristals, RockLayer.TileType.CRISTAL)
|
||||||
layer.place_rocks(rocks, RockLayer.TileType.ROCK)
|
layer.place_rocks(rocks, RockLayer.TileType.ROCK)
|
||||||
@@ -169,30 +217,27 @@ func get_generated_rock_type(coord : Vector2i) -> RockLayer.TileType:
|
|||||||
|
|
||||||
func generate_ground(layer : GroundLayer):
|
func generate_ground(layer : GroundLayer):
|
||||||
var coords : Array[Vector2i] = []
|
var coords : Array[Vector2i] = []
|
||||||
for x in range(0, Region.CHUNK_TILE_SIZE):
|
for coord in all_tiles:
|
||||||
for y in range(0,Region.CHUNK_TILE_SIZE):
|
coords.append(coord)
|
||||||
coords.append(Vector2i(x,y))
|
|
||||||
|
|
||||||
layer.place_ground(coords)
|
layer.place_ground(coords)
|
||||||
|
|
||||||
func generate_decontamination(layer : DecontaminationLayer):
|
func generate_decontamination(layer : DecontaminationLayer):
|
||||||
var decontamination_tiles : Array[Vector2i] = []
|
var decontamination_tiles : Array[Vector2i] = []
|
||||||
for x in range(0, Region.CHUNK_TILE_SIZE):
|
for coord in all_tiles:
|
||||||
for y in range(0, Region.CHUNK_TILE_SIZE):
|
var tile_value : float = (
|
||||||
var coord = Vector2i(x,y)
|
1. if chunk_coord.distance_to(Vector2i.ZERO) > MAX_DECONTAMINATION_DISTANCE
|
||||||
var tile_value : float = (
|
else get_tile_value_from_noise(coord, decontamination_noise_image)
|
||||||
1. if chunk_coord.distance_to(Vector2i.ZERO) > MAX_DECONTAMINATION_DISTANCE
|
)
|
||||||
else get_tile_value_from_noise(coord, decontamination_noise_image)
|
var saved_diff : TilesDiffData.TileDiff = region_data.decontamination_tiles_data.get_tile_diff_for_local_coord(coord, chunk_coord)
|
||||||
|
if (
|
||||||
|
(
|
||||||
|
(tile_value < region_data.decontamination_threshold)
|
||||||
|
or saved_diff == TilesDiffData.TileDiff.PRESENT
|
||||||
)
|
)
|
||||||
var saved_diff : TilesDiffData.TileDiff = region_data.decontamination_tiles_data.get_tile_diff_for_local_coord(coord, chunk_coord)
|
and saved_diff != TilesDiffData.TileDiff.ABSENT
|
||||||
if (
|
):
|
||||||
(
|
decontamination_tiles.append(coord)
|
||||||
(tile_value < region_data.decontamination_threshold)
|
|
||||||
or saved_diff == TilesDiffData.TileDiff.PRESENT
|
|
||||||
)
|
|
||||||
and saved_diff != TilesDiffData.TileDiff.ABSENT
|
|
||||||
):
|
|
||||||
decontamination_tiles.append(Vector2i(x,y))
|
|
||||||
|
|
||||||
layer.place_decontaminations(
|
layer.place_decontaminations(
|
||||||
decontamination_tiles,
|
decontamination_tiles,
|
||||||
|
|||||||
@@ -225,19 +225,14 @@ func pass_day():
|
|||||||
data.end_pass_day()
|
data.end_pass_day()
|
||||||
save()
|
save()
|
||||||
|
|
||||||
func get_chunk_for_coord(tiles_coord : Vector2i) -> Chunk:
|
func get_chunk_for_coord(tile_coord : Vector2i) -> Chunk:
|
||||||
var chunk_coord = Vector2i(
|
for chunk in generated_chunks:
|
||||||
floori(float(tiles_coord.x)/Region.CHUNK_TILE_SIZE),
|
if chunk.is_generated:
|
||||||
floori(float(tiles_coord.y)/Region.CHUNK_TILE_SIZE),
|
var local_coord = TilesDiffData.get_local_coord(tile_coord, chunk.chunk_coord)
|
||||||
)
|
if chunk.is_tile_in_chunk(local_coord):
|
||||||
|
print(chunk.chunk_coord)
|
||||||
var id = generated_chunks.find_custom(
|
return chunk
|
||||||
func (c: Chunk): return c.chunk_coord.x == chunk_coord.x and c.chunk_coord.y == chunk_coord.y
|
return null
|
||||||
)
|
|
||||||
|
|
||||||
if id == -1 or not generated_chunks[id].is_generated:
|
|
||||||
return null
|
|
||||||
return generated_chunks[id]
|
|
||||||
|
|
||||||
func is_coords_decontaminated(tiles_coords : Array[Vector2i]):
|
func is_coords_decontaminated(tiles_coords : Array[Vector2i]):
|
||||||
for coord in tiles_coords:
|
for coord in tiles_coords:
|
||||||
|
|||||||
@@ -42,17 +42,8 @@ func place_terrain_cells(
|
|||||||
tile_terrain_set : int = 0,
|
tile_terrain_set : int = 0,
|
||||||
tile_terrain : int = 0
|
tile_terrain : int = 0
|
||||||
):
|
):
|
||||||
var valid_coords : Array[Vector2i] = coords.filter(is_coord_valid)
|
|
||||||
set_cells_terrain_connect(
|
set_cells_terrain_connect(
|
||||||
valid_coords,
|
coords,
|
||||||
tile_terrain_set,
|
tile_terrain_set,
|
||||||
tile_terrain
|
tile_terrain
|
||||||
)
|
)
|
||||||
|
|
||||||
func is_coord_valid(coord : Vector2i) -> bool:
|
|
||||||
return (
|
|
||||||
coord.x >= 0
|
|
||||||
and coord.y >= 0
|
|
||||||
and coord.x < Region.CHUNK_TILE_SIZE
|
|
||||||
and coord.y < Region.CHUNK_TILE_SIZE
|
|
||||||
)
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
@tool
|
||||||
extends Resource
|
extends Resource
|
||||||
class_name TilesDiffData
|
class_name TilesDiffData
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,26 @@
|
|||||||
[gd_scene format=3 uid="uid://dtfuxosn6s0cr"]
|
[gd_scene format=3 uid="uid://dtfuxosn6s0cr"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://d2ixbaa2uqlv4" path="res://stages/terrain/region/scripts/chunk.gd" id="1_mhr83"]
|
[ext_resource type="Script" uid="uid://d2ixbaa2uqlv4" path="res://stages/terrain/region/scripts/chunk.gd" id="1_mhr83"]
|
||||||
|
[ext_resource type="Script" uid="uid://dy6d4rmdu6gh0" path="res://stages/terrain/region/scripts/tiles_diff_data.gd" id="2_ct7cr"]
|
||||||
[ext_resource type="Script" uid="uid://bgbbce45hjv3d" path="res://entities/scripts/entity_data.gd" id="2_tiw8g"]
|
[ext_resource type="Script" uid="uid://bgbbce45hjv3d" path="res://entities/scripts/entity_data.gd" id="2_tiw8g"]
|
||||||
[ext_resource type="Script" uid="uid://da6j333qs7wse" path="res://entities/plants/scripts/plant_data.gd" id="3_ct7cr"]
|
[ext_resource type="Script" uid="uid://da6j333qs7wse" path="res://entities/plants/scripts/plant_data.gd" id="3_ct7cr"]
|
||||||
[ext_resource type="Script" uid="uid://cx30nvq8b34lj" path="res://stages/terrain/region/scripts/region_data.gd" id="4_0rtv3"]
|
[ext_resource type="Script" uid="uid://cx30nvq8b34lj" path="res://stages/terrain/region/scripts/region_data.gd" id="4_0rtv3"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_0rtv3"]
|
||||||
|
script = ExtResource("2_ct7cr")
|
||||||
|
metadata/_custom_type_script = "uid://dy6d4rmdu6gh0"
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_ame7t"]
|
||||||
|
script = ExtResource("2_ct7cr")
|
||||||
|
metadata/_custom_type_script = "uid://dy6d4rmdu6gh0"
|
||||||
|
|
||||||
[sub_resource type="Resource" id="Resource_tiw8g"]
|
[sub_resource type="Resource" id="Resource_tiw8g"]
|
||||||
script = ExtResource("4_0rtv3")
|
script = ExtResource("4_0rtv3")
|
||||||
|
region_seed = 2
|
||||||
rock_threshold = 0.5
|
rock_threshold = 0.5
|
||||||
decontamination_threshold = 0.5
|
decontamination_threshold = 0.5
|
||||||
|
rock_tiles_data = SubResource("Resource_ame7t")
|
||||||
|
decontamination_tiles_data = SubResource("Resource_0rtv3")
|
||||||
metadata/_custom_type_script = "uid://cx30nvq8b34lj"
|
metadata/_custom_type_script = "uid://cx30nvq8b34lj"
|
||||||
|
|
||||||
[node name="TestChunk" type="Node2D" unique_id=990498648]
|
[node name="TestChunk" type="Node2D" unique_id=990498648]
|
||||||
@@ -24,3 +36,17 @@ script = ExtResource("1_mhr83")
|
|||||||
region_data = SubResource("Resource_tiw8g")
|
region_data = SubResource("Resource_tiw8g")
|
||||||
chunk_coord = Vector2i(1, 0)
|
chunk_coord = Vector2i(1, 0)
|
||||||
metadata/_custom_type_script = "uid://d2ixbaa2uqlv4"
|
metadata/_custom_type_script = "uid://d2ixbaa2uqlv4"
|
||||||
|
|
||||||
|
[node name="Chunk3" type="Node2D" parent="." unique_id=1505202284]
|
||||||
|
position = Vector2(0, 1280)
|
||||||
|
script = ExtResource("1_mhr83")
|
||||||
|
region_data = SubResource("Resource_tiw8g")
|
||||||
|
chunk_coord = Vector2i(0, 1)
|
||||||
|
metadata/_custom_type_script = "uid://d2ixbaa2uqlv4"
|
||||||
|
|
||||||
|
[node name="Chunk4" type="Node2D" parent="." unique_id=774217732]
|
||||||
|
position = Vector2(1280, 1280)
|
||||||
|
script = ExtResource("1_mhr83")
|
||||||
|
region_data = SubResource("Resource_tiw8g")
|
||||||
|
chunk_coord = Vector2i(1, 1)
|
||||||
|
metadata/_custom_type_script = "uid://d2ixbaa2uqlv4"
|
||||||
|
|||||||
Reference in New Issue
Block a user