ajout d'une bordure aléatoire entre chunks

This commit is contained in:
2026-03-06 10:13:18 +01:00
parent e970b912b0
commit 86e2162c6f
5 changed files with 133 additions and 75 deletions

View File

@@ -1,4 +1,3 @@
@tool
extends Node2D
class_name Chunk
@@ -6,16 +5,20 @@ const GENERATION_NUMBER = 4
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 DECONTAMINATION_NOISE_FREQUENCY := 0.01
const CHUNK_RANDOM_PADDING := 2
@export var region_data : RegionData
@export var chunk_coord : Vector2i
var is_generated : bool = false
var random_padding_noise : Noise = null
var rock_noise_image : Noise = null
var cristal_noise_image : Noise = null
var decontamination_noise_image : Noise = null
@@ -28,13 +31,21 @@ var generation_thread : Thread
var generation_semaphore : Semaphore
@export_tool_button("Update", "Callable") var update_action = func():
generation_semaphore.post()
for c in get_children():
c.queue_free()
var all_tiles : Array[Vector2i]
var all_global_tiles : Array[Vector2i]
setup_position()
generate()
# @export_tool_button("Update", "Callable") var update_action = func():
# 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(
_chunk_coord : Vector2i = Vector2i.ZERO,
@@ -60,7 +71,10 @@ func generate():
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)
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)
ground_layer = GroundLayer.new(region_data)
decontamination_layer = DecontaminationLayer.new(region_data)
@@ -81,13 +95,49 @@ func generate():
is_generated = true
# func unload():
# for x in range(Region.CHUNK_TILE_SIZE):
# for y in range(Region.CHUNK_TILE_SIZE):
# var global_coord = Vector2i(x, y) + Region.CHUNK_TILE_SIZE * chunk_coord
# region.rock_layer.erase_cell(global_coord)
# region.ground_layer.erase_cell(global_coord)
# region.decontamination_layer.erase_cell(global_coord)
func calculate_all_tiles() -> Array[Vector2i]:
var coords : Array[Vector2i] = []
for x in range(-CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING):
for y in range(-CHUNK_RANDOM_PADDING, Region.CHUNK_TILE_SIZE + CHUNK_RANDOM_PADDING):
var coord := Vector2i(x,y)
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
# func _draw():
@@ -98,17 +148,17 @@ func generate():
# 3
# )
# for x in range(NOISE_IMAGE_SIZE):
# for y in range(NOISE_IMAGE_SIZE):
# var noise_value = rock_noise_image.get_noise_2d(
# x,
# y
# )
# draw_rect(
# Rect2(Vector2i(x,y) * Region.CHUNK_SIZE / NOISE_IMAGE_SIZE, Vector2i.ONE * Region.CHUNK_SIZE / NOISE_IMAGE_SIZE),
# Color.WHITE * ((noise_value+1)/2),
# true,
# )
# for x in range(NOISE_IMAGE_SIZE):
# for y in range(NOISE_IMAGE_SIZE):
# var noise_value = random_padding_noise.get_noise_2d(
# x,
# y
# )
# draw_rect(
# Rect2(Vector2i(x,y) * Region.CHUNK_SIZE / NOISE_IMAGE_SIZE, Vector2i.ONE * Region.CHUNK_SIZE / NOISE_IMAGE_SIZE),
# Color.WHITE * ((noise_value+1)/2),
# true,
# )
func generate_noise(
noise_seed : int,
@@ -139,14 +189,12 @@ func get_tile_value_from_noise(tile_position : Vector2i, noise : Noise) -> float
func generate_rocks(layer : RockLayer):
var cristals : Array[Vector2i] = []
var rocks : Array[Vector2i] = []
for x in range(0, Region.CHUNK_TILE_SIZE):
for y in range(0, Region.CHUNK_TILE_SIZE):
var tile_type := get_generated_rock_type(Vector2i(x, y))
var coord = Vector2i(x, y)
if tile_type == RockLayer.TileType.CRISTAL:
cristals.append(coord)
elif tile_type == RockLayer.TileType.ROCK:
rocks.append(coord)
for coord in all_tiles:
var tile_type := get_generated_rock_type(coord)
if tile_type == RockLayer.TileType.CRISTAL:
cristals.append(coord)
elif tile_type == RockLayer.TileType.ROCK:
rocks.append(coord)
layer.place_rocks(cristals, RockLayer.TileType.CRISTAL)
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):
var coords : Array[Vector2i] = []
for x in range(0, Region.CHUNK_TILE_SIZE):
for y in range(0,Region.CHUNK_TILE_SIZE):
coords.append(Vector2i(x,y))
for coord in all_tiles:
coords.append(coord)
layer.place_ground(coords)
func generate_decontamination(layer : DecontaminationLayer):
var decontamination_tiles : Array[Vector2i] = []
for x in range(0, Region.CHUNK_TILE_SIZE):
for y in range(0, Region.CHUNK_TILE_SIZE):
var coord = Vector2i(x,y)
var tile_value : float = (
1. if chunk_coord.distance_to(Vector2i.ZERO) > MAX_DECONTAMINATION_DISTANCE
else get_tile_value_from_noise(coord, decontamination_noise_image)
for coord in all_tiles:
var tile_value : float = (
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)
if (
(
(tile_value < region_data.decontamination_threshold)
or saved_diff == TilesDiffData.TileDiff.PRESENT
)
and saved_diff != TilesDiffData.TileDiff.ABSENT
):
decontamination_tiles.append(Vector2i(x,y))
and saved_diff != TilesDiffData.TileDiff.ABSENT
):
decontamination_tiles.append(coord)
layer.place_decontaminations(
decontamination_tiles,

View File

@@ -225,19 +225,14 @@ func pass_day():
data.end_pass_day()
save()
func get_chunk_for_coord(tiles_coord : Vector2i) -> Chunk:
var chunk_coord = Vector2i(
floori(float(tiles_coord.x)/Region.CHUNK_TILE_SIZE),
floori(float(tiles_coord.y)/Region.CHUNK_TILE_SIZE),
)
var id = generated_chunks.find_custom(
func (c: Chunk): return c.chunk_coord.x == chunk_coord.x and c.chunk_coord.y == chunk_coord.y
)
if id == -1 or not generated_chunks[id].is_generated:
return null
return generated_chunks[id]
func get_chunk_for_coord(tile_coord : Vector2i) -> Chunk:
for chunk in generated_chunks:
if chunk.is_generated:
var local_coord = TilesDiffData.get_local_coord(tile_coord, chunk.chunk_coord)
if chunk.is_tile_in_chunk(local_coord):
print(chunk.chunk_coord)
return chunk
return null
func is_coords_decontaminated(tiles_coords : Array[Vector2i]):
for coord in tiles_coords:

View File

@@ -42,17 +42,8 @@ func place_terrain_cells(
tile_terrain_set : int = 0,
tile_terrain : int = 0
):
var valid_coords : Array[Vector2i] = coords.filter(is_coord_valid)
set_cells_terrain_connect(
valid_coords,
coords,
tile_terrain_set,
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
)

View File

@@ -1,3 +1,4 @@
@tool
extends Resource
class_name TilesDiffData

View File

@@ -1,14 +1,26 @@
[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://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://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"]
[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"]
script = ExtResource("4_0rtv3")
region_seed = 2
rock_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"
[node name="TestChunk" type="Node2D" unique_id=990498648]
@@ -24,3 +36,17 @@ script = ExtResource("1_mhr83")
region_data = SubResource("Resource_tiw8g")
chunk_coord = Vector2i(1, 0)
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"