ajout d'une bordure aléatoire entre chunks
This commit is contained in:
@@ -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,6 +71,9 @@ 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)
|
||||
@@ -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():
|
||||
@@ -100,7 +150,7 @@ func generate():
|
||||
|
||||
# for x 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,
|
||||
# y
|
||||
# )
|
||||
@@ -139,10 +189,8 @@ 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)
|
||||
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:
|
||||
@@ -169,17 +217,14 @@ 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)
|
||||
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)
|
||||
@@ -192,7 +237,7 @@ func generate_decontamination(layer : DecontaminationLayer):
|
||||
)
|
||||
and saved_diff != TilesDiffData.TileDiff.ABSENT
|
||||
):
|
||||
decontamination_tiles.append(Vector2i(x,y))
|
||||
decontamination_tiles.append(coord)
|
||||
|
||||
layer.place_decontaminations(
|
||||
decontamination_tiles,
|
||||
|
||||
@@ -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:
|
||||
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
|
||||
return generated_chunks[id]
|
||||
|
||||
func is_coords_decontaminated(tiles_coords : Array[Vector2i]):
|
||||
for coord in tiles_coords:
|
||||
|
||||
@@ -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
|
||||
)
|
||||
@@ -1,3 +1,4 @@
|
||||
@tool
|
||||
extends Resource
|
||||
class_name TilesDiffData
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user