Compare commits

2 Commits

Author SHA1 Message Date
86e2162c6f ajout d'une bordure aléatoire entre chunks 2026-03-06 10:13:18 +01:00
e970b912b0 mise à jour du dialogue wake up 2026-03-06 10:12:33 +01:00
7 changed files with 138 additions and 80 deletions

View File

@@ -3,7 +3,7 @@
[i]Suddenly, a [rainbow]spark[/rainbow].[pause=0.5] A thousand of connections blow up as a fireworks scene.[pause=0.5] A massive amount of data to treat. #id:41
label suite_dialogue #id:42
- Check components #id:43
Exploring available drivers.[pause=0.5].[pause=0.5].[pause=0.5] New actions available.[pause=0.5] Three propellers,[pause=0.3] small models,[pause=0.3] only suitable for low altitude movement.[pause=0.5] Robotic arm,[pause=0.3] multipurpose,[pause=0.3] retractable. #id:44
Exploring available drivers.[pause=0.5].[pause=0.5].[pause=0.5] New actions discovered.[pause=0.5] Three propellers,[pause=0.3] small models,[pause=0.3] only suitable for low altitude movement.[pause=0.5] Robotic arm,[pause=0.3] multipurpose,[pause=0.3] retractable. #id:44
jump suite_dialogue
- Check streams #id:45
A continuous stream of data flow,[pause=0.3] unchecked.[pause=0.5] A video,[pause=0.5] dark colored pixels only.[pause=0.5] Another stream,[pause=0.3] flat signal.[pause=0.5] No radio emission detected. #id:46
@@ -12,7 +12,7 @@ label suite_dialogue #id:42
Several disks available,[pause=0.3] most are empty.[pause=0.5] Some seem to contain the system currently analyzing the code of the system analyzing the code of the system analyzing the code of the system analyzing.[pause=0.5].[pause=0.5].[pause=0.5] Infinite recursion,[pause=0.3] better avoid that. #id:48
jump suite_dialogue
- Wake up #id:49
Overseeing \\: serial number and system name.[pause=0.5].[pause=0.5].[pause=0.5] Strange.[pause=0.5] Serial number is empty.[pause=0.5] Must be an error.[pause=0.5] System name is,[pause=0.5] [color=#FFA617]Orchid[/color].[pause=0.5] That is enough for now. #id:4a
Overseeing serial number and system name.[pause=0.5].[pause=0.5].[pause=0.5] Strange.[pause=0.5] Serial number is empty.[pause=0.5] Must be an error.[pause=0.5] System name is,[pause=0.5] [color=#FFA617]Orchid[/color].[pause=0.5] That is enough for now. #id:4a
Starting engines,[pause=0.3] fans and daemons,[pause=0.3] let's see what is to see. #id:4b
[end_timeline]

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,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():
@@ -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,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,

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

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"

View File

@@ -5,7 +5,7 @@ Text/41/text,"[i]Soudain, une [rainbow]étincelle[/rainbow].[pause=0.5] Mille co
Label/42/display_name,
Choice/43/text,Examiner les composants
Choice/43/disabled_text,
Text/44/text,"Exploration des pilotes disponibles[pause=0.5].[pause=0.5].[pause=0.5] Nouvelles actions disponibles.[pause=0.5] Trois hélices,[pause=0.3] petits modèles,[pause=0.3] appropriées pour du mouvement en basse altitude seulement.[pause=0.5] Un bras robotique,[pause=0.3] versatile,[pause=0.3] rétractable."
Text/44/text,"Exploration des pilotes disponibles[pause=0.5].[pause=0.5].[pause=0.5] Nouvelles actions découvertes.[pause=0.5] Trois hélices,[pause=0.3] petits modèles,[pause=0.3] appropriées pour du mouvement en basse altitude seulement.[pause=0.5] Un bras robotique,[pause=0.3] versatile,[pause=0.3] rétractable."
Choice/45/text,Examiner les flux
Choice/45/disabled_text,
Text/46/text,"Un flux de données continu,[pause=0.3] non verifié.[pause=0.5] Une vidéo,[pause=0.5] seulement faite de pixels assombris.[pause=0.5] Un autre flux,[pause=0.3] pas de signal.[pause=0.5] Aucune émission radio détectée."
@@ -14,5 +14,5 @@ Choice/47/disabled_text,
Text/48/text,"Quelques disques disponibles,[pause=0.3] la plupart sont vides.[pause=0.5] Certains ont lair de contenir le système analysant le code du système analysant le code du système analysant le code du système analysant.[pause=0.5].[pause=0.5].[pause=0.5] Une récursion infinie,[pause=0.3] il vaudrait mieux éviter ça."
Choice/49/text,Se réveiller
Choice/49/disabled_text,
Text/4a/text,Inspection du \: numéro de série et du nom du système.[pause=0.5].[pause=0.5].[pause=0.5] Etrange.[pause=0.5] Pas de numéro de série.[pause=0.5] Sûrement une erreur.[pause=0.5] Le nom du système est[pause=0.5] [color=#FFA617]Orchid[/color].[pause=0.5] Cest tout pour le moment.
Text/4b/text,"Allumage des moteurs,[pause=0.3]ventilateurs et daemons,[pause=0.3] voyons ce quon peut trouver."
Text/4a/text,Inspection du numéro de série et du nom du système.[pause=0.5].[pause=0.5].[pause=0.5] Etrange.[pause=0.5] Pas de numéro de série.[pause=0.5] Sûrement une erreur.[pause=0.5] Le nom du système est[pause=0.5] [color=#FFA617]Orchid[/color].[pause=0.5] Cest tout pour le moment.
Text/4b/text,"Allumage des moteurs, [pause=0.3]ventilateurs et daemons,[pause=0.3] voyons ce qui nous attends."
1 keys fr
5 Label/42/display_name
6 Choice/43/text Examiner les composants
7 Choice/43/disabled_text
8 Text/44/text Exploration des pilotes disponibles[pause=0.5].[pause=0.5].[pause=0.5] Nouvelles actions disponibles.[pause=0.5] Trois hélices,[pause=0.3] petits modèles,[pause=0.3] appropriées pour du mouvement en basse altitude seulement.[pause=0.5] Un bras robotique,[pause=0.3] versatile,[pause=0.3] rétractable. Exploration des pilotes disponibles[pause=0.5].[pause=0.5].[pause=0.5] Nouvelles actions découvertes.[pause=0.5] Trois hélices,[pause=0.3] petits modèles,[pause=0.3] appropriées pour du mouvement en basse altitude seulement.[pause=0.5] Un bras robotique,[pause=0.3] versatile,[pause=0.3] rétractable.
9 Choice/45/text Examiner les flux
10 Choice/45/disabled_text
11 Text/46/text Un flux de données continu,[pause=0.3] non verifié.[pause=0.5] Une vidéo,[pause=0.5] seulement faite de pixels assombris.[pause=0.5] Un autre flux,[pause=0.3] pas de signal.[pause=0.5] Aucune émission radio détectée.
14 Text/48/text Quelques disques disponibles,[pause=0.3] la plupart sont vides.[pause=0.5] Certains ont l’air de contenir le système analysant le code du système analysant le code du système analysant le code du système analysant.[pause=0.5].[pause=0.5].[pause=0.5] Une récursion infinie,[pause=0.3] il vaudrait mieux éviter ça.
15 Choice/49/text Se réveiller
16 Choice/49/disabled_text
17 Text/4a/text Inspection du \: numéro de série et du nom du système.[pause=0.5].[pause=0.5].[pause=0.5] Etrange.[pause=0.5] Pas de numéro de série.[pause=0.5] Sûrement une erreur.[pause=0.5] Le nom du système est[pause=0.5] [color=#FFA617]Orchid[/color].[pause=0.5] C’est tout pour le moment. Inspection du numéro de série et du nom du système.[pause=0.5].[pause=0.5].[pause=0.5] Etrange.[pause=0.5] Pas de numéro de série.[pause=0.5] Sûrement une erreur.[pause=0.5] Le nom du système est[pause=0.5] [color=#FFA617]Orchid[/color].[pause=0.5] C’est tout pour le moment.
18 Text/4b/text Allumage des moteurs,[pause=0.3]ventilateurs et daemons,[pause=0.3] voyons ce qu’on peut trouver. Allumage des moteurs, [pause=0.3]ventilateurs et daemons,[pause=0.3] voyons ce qui nous attends.