création du squelette des region modifier, amélioration du tutoriel et mise en place de la run complète avec cinématique d'outro

This commit is contained in:
2026-02-21 20:44:41 +01:00
parent eb48a095de
commit e767e776f2
80 changed files with 415 additions and 201 deletions

View File

@@ -20,6 +20,7 @@ unique_name_in_owner = true
layer = 2
[node name="Tutorial" parent="RegionGui" unique_id=762436685 node_paths=PackedStringArray("player", "region") instance=ExtResource("2_2f6js")]
unique_name_in_owner = true
player = NodePath("../../Entities/Player")
region = NodePath("../..")
@@ -31,8 +32,9 @@ y_sort_enabled = true
[node name="Player" parent="Entities" unique_id=75851644 instance=ExtResource("5_ovqi1")]
z_index = 1
[node name="TruckRecharge" parent="Entities" unique_id=2068738444 instance=ExtResource("7_6d8m3")]
position = Vector2(-1, -169)
[node name="RechargeStation" parent="Entities" unique_id=2068738444 instance=ExtResource("7_6d8m3")]
unique_name_in_owner = true
position = Vector2(-405, -151)
[node name="AstraDoor" parent="Entities" unique_id=2053096538 instance=ExtResource("8_2f6js")]
unique_name_in_owner = true
@@ -45,15 +47,17 @@ default_info_desc = "ASTRA_FACTORY_TEXT"
[node name="BoreaDoor" parent="Entities" unique_id=135926916 instance=ExtResource("8_2f6js")]
unique_name_in_owner = true
visible = false
position = Vector2(91, -177)
to_scene_id = "BOREA"
default_interact_text = "ENTER"
default_info_title = "BOREA_BASE"
default_info_desc = "ASTRA_FACTORY_TEXT"
default_info_desc = "BOREA_BASE_DESC_TEXT"
[node name="ShipGarageDoor" parent="Entities" unique_id=1073871193 instance=ExtResource("8_2f6js")]
unique_name_in_owner = true
visible = false
modulate = Color(1, 0, 0, 1)
position = Vector2(91, -177)
to_scene_id = "GARAGE"
default_interact_text = "ENTER"
available = false

View File

@@ -6,9 +6,6 @@ signal generated
var region : Region
var region_seed : int
var wall_threshold = 0.3
var decontamination_threshold = 0.
var cristal_threshold = 0.08
var rock_noise_image : Noise = null
var decontamination_noise_image : Noise = null
@@ -23,6 +20,8 @@ const GENERATION_NUMBER = 4
const NOISE_IMAGE_SIZE := 150
const MAX_DECONTAMINATION_DISTANCE=2
const ROCK_NOISE_FREQUENCY := 0.01
const DECONTAMINATION_NOISE_FREQUENCY := 0.01
@@ -34,9 +33,9 @@ var data : ChunkData
func _init(
_data : ChunkData,
_planet : Region = null,
_region : Region = null,
):
region = _planet
region = _region
if region:
region_seed = region.data.region_seed
data = _data
@@ -129,10 +128,10 @@ func get_generated_rock_type(coord : Vector2i) -> RockLayer.TileType:
var saved_diff := data.get_rock_tile_diff(coord)
if (
(saved_diff == ChunkData.TileDiff.PRESENT or tile_value < wall_threshold)
(saved_diff == ChunkData.TileDiff.PRESENT or tile_value < region.data.rock_threshold)
and saved_diff != ChunkData.TileDiff.ABSENT
):
return RockLayer.TileType.CRISTAL if tile_value < cristal_threshold else RockLayer.TileType.ROCK
return RockLayer.TileType.CRISTAL if tile_value < region.data.cristal_threshold else RockLayer.TileType.ROCK
return RockLayer.TileType.EMPTY
func generate_ground():
@@ -148,10 +147,16 @@ func generate_decontamination():
for x in range(Region.CHUNK_TILE_SIZE):
for y in range(Region.CHUNK_TILE_SIZE):
var coord = Vector2i(x,y)
var tile_value : float = get_tile_value_from_noise(coord, decontamination_noise_image)
var tile_value : float = (
1. if data.chunk_coord.distance_to(Vector2i.ZERO) > MAX_DECONTAMINATION_DISTANCE
else get_tile_value_from_noise(coord, decontamination_noise_image)
)
var saved_diff := data.get_decontamination_tile_diff(coord)
if (
(saved_diff == ChunkData.TileDiff.PRESENT or tile_value < decontamination_threshold)
(
saved_diff == ChunkData.TileDiff.PRESENT
or (tile_value < region.data.decontamination_threshold)
)
and saved_diff != ChunkData.TileDiff.ABSENT
):
decontamination_tiles.append(Vector2i(x,y) + Region.CHUNK_TILE_SIZE * data.chunk_coord)

View File

@@ -0,0 +1,14 @@
extends RegionModifier
class_name AridModifier
func get_modifier_name() -> String:
return tr("ARID")
func get_description() -> String:
return tr("ARID_MODIFIER_DESC_TEXT")
func modify_decontamination_threshold(decontamination_threshold : float) -> float:
return decontamination_threshold
func modify_start_decontamination_zone_radius(start_decontamination_zone_radius : int) -> int:
return start_decontamination_zone_radius

View File

@@ -0,0 +1 @@
uid://3o33x8mesgrn

View File

@@ -0,0 +1,35 @@
@abstract
extends Resource
class_name RegionModifier
var level : int = 1
var modifier_name : String : get = get_modifier_name
var description : String : get = get_description
func _init(_level : int = 1):
level = _level
@abstract func get_modifier_name() -> String
@abstract func get_description() -> String
func get_difficulty_score() -> float:
return float(level)
func modify_charge(charge : int) -> int:
return charge
func modify_objective(objective : int) -> int:
return objective
func modify_rock_threshold(rock_threshold : float) -> float:
return rock_threshold
func modify_decontamination_threshold(decontamination_threshold : float) -> float:
return decontamination_threshold
func modify_cristal_threshold(cristal_threshold : float) -> float:
return cristal_threshold
func modify_start_decontamination_zone_radius(start_decontamination_zone_radius : int) -> int:
return start_decontamination_zone_radius

View File

@@ -0,0 +1 @@
uid://ccb06rayqowp3

View File

@@ -10,7 +10,8 @@ const TILE_SCALE = 1
const TILE_SIZE : int = roundi(TILE_SET.tile_size.x * TILE_SCALE)
const START_ROCK_HOLE_RADIUS = 5
const PLAYER_ROCK_HOLE_RADIUS = 5
const START_DECONTAMINATION_HOLE_RADIUS = 3
const SPAWN_OBJECT_RANDOM_MOVEMENT = 200
const CHUNK_TILE_SIZE : int = 20
const CHUNK_SIZE = CHUNK_TILE_SIZE * TILE_SIZE
const CHUNK_LOAD_DISTANCE : int = 1
@@ -46,6 +47,7 @@ func _input(_e):
and Input.is_action_pressed("move_left")
and Input.is_action_just_pressed("action")
):
%Tutorial.finish_tutorial()
data.succeded.emit()
data.state = RegionData.State.SUCCEEDED
data.update()
@@ -89,6 +91,10 @@ func _ready():
edit_map_origin()
spawn_object_random_move(%RechargeStation)
spawn_object_random_move(%BoreaDoor)
spawn_object_random_move(%ShipGarageDoor)
func _process(_d):
if player:
generate_near_chunks(player)
@@ -144,17 +150,17 @@ func edit_map_origin():
var coord = Vector2i(x,y)
if coord.distance_to(chunk_center) < START_ROCK_HOLE_RADIUS:
hole_tiles.append(coord)
if coord.distance_to(chunk_center) < START_DECONTAMINATION_HOLE_RADIUS:
if coord.distance_to(chunk_center) < data.start_decontamination_hole_radius:
decontamination_tiles.append(coord)
rock_layer.remove_rocks(hole_tiles, true)
decontamination_layer.place_decontaminations(decontamination_tiles, true)
# Dig a hole in player position
# Dig a hole in player spawn
var player_hole_tiles : Array[Vector2i] = []
var player_tile_position := Vector2i(
roundi(data.player_position.x/float(TILE_SIZE)),
roundi(data.player_position.y/float(TILE_SIZE))
roundi(data.player_spawn.x/float(TILE_SIZE)),
roundi(data.player_spawn.y/float(TILE_SIZE))
)
for x in range(-PLAYER_ROCK_HOLE_RADIUS, PLAYER_ROCK_HOLE_RADIUS):
for y in range(-PLAYER_ROCK_HOLE_RADIUS, PLAYER_ROCK_HOLE_RADIUS):
@@ -192,6 +198,15 @@ func save():
data.player_position = player.global_position
GameInfo.save_game_data()
func spawn_object_random_move(object : Node2D):
var rng := RandomNumberGenerator.new()
rng.seed = data.region_seed + object.name.hash()
object.position = Vector2(
rng.randf_range(-SPAWN_OBJECT_RANDOM_MOVEMENT,+SPAWN_OBJECT_RANDOM_MOVEMENT),
rng.randf_range(-SPAWN_OBJECT_RANDOM_MOVEMENT,SPAWN_OBJECT_RANDOM_MOVEMENT)
)
func setup_flagged_properties():
%AstraDoor.visible = false
@@ -205,12 +220,13 @@ func setup_flagged_properties():
%ShipGarageDoor.visible = true
%AstraDoor.available = false
%ShipGarageDoor.available = data.state == RegionData.State.SUCCEEDED
data.succeded.connect(
%Tutorial.succeded.connect(
func ():
%ShipGarageDoor.available = true
)
"borea":
%BoreaDoor.visible = true
%RechargeStation.visible = false
#endregion

View File

@@ -18,10 +18,15 @@ const MAX_RANDOM_SPAWN_DISTANCE = 3000
@export var region_seed : int
@export var region_name : String
@export var region_level : int = 0
@export var rock_threshold : float
@export var decontamination_threshold : float
@export var cristal_threshold : float
@export var start_decontamination_hole_radius = 3
@export var day : int = 1
@export var entities_saved_data : Array[EntityData] = []
@export var generated_chunk_entities : Array[Vector2i]
@export var tutorial_step : int = 0
@export var flags : Array[String] = []
@export var plants : Array[PlantData]
@@ -50,13 +55,17 @@ var in_passing_day_animation := false
func _init(
parameter : RegionParameter = RegionParameter.new()
):
charges = parameter.charges
objective = parameter.objective
region_name = parameter.name
region_level = parameter.level
region_seed = parameter.region_seed
charges = parameter.get_charge()
objective = parameter.get_objective()
region_name = parameter.get_region_name()
region_level = parameter.get_region_level()
region_seed = parameter.get_region_seed()
rock_threshold = parameter.get_rock_threshold()
decontamination_threshold = parameter.get_decontamination_threshold()
cristal_threshold = parameter.get_cristal_threshold()
start_decontamination_hole_radius = parameter.get_start_decontamination_zone_radius()
flags = parameter.get_region_flags()
flags = parameter.flags
player_spawn = get_random_spawn_position()
player_position = player_spawn
@@ -137,7 +146,6 @@ func add_plant_data(plant_data : PlantData, with_update = true):
update()
func _on_plant_disappeared(plant_data : PlantData):
print("disappeared")
plants = plants.filter(func (p) : return p.random_seed != plant_data.random_seed)
update()
@@ -151,3 +159,5 @@ func get_random_spawn_position():
) + Region.CHUNK_SIZE/2. * Vector2.ONE
return rand_pos
#endregion

View File

@@ -1,24 +1,92 @@
extends Resource
class_name RegionParameter
@export var charges : int
@export var objective : int
@export var name : String
@export var flags : Array[String]
const DEFAULT_ROCK_THRESHOLD = 0.3
const DEFAULT_DECONTAMINATION_THRESHOLD = 0.15
const DEFAULT_CRISTAL_THRESHOLD = 0.06
const DEFAULT_CHARGE = 10
const DEFAULT_START_DECONTAMINATION_ZONE_RADIUS = 3
@export var region_name : String
@export var region_flags : Array[String]
@export var level : int
@export var region_seed : int
@export var modifiers : Array[RegionModifier]
static func get_objective_by_level(l : int) -> int:
return 10 + 5 * l
func _init(
_charges : int = 10,
_objective : int = 10,
_level = 0,
_name = Random.generate_random_word(),
_flags : Array[String] = [],
_level = 0,
_modifiers : Array[RegionModifier] = [],
_region_seed = randi(),
):
charges = _charges
objective = _objective
name = _name
flags = _flags
region_name = _name
region_flags = _flags
level = _level
modifiers = _modifiers
region_seed = _region_seed
func get_region_name() -> String:
return region_name
func get_region_flags() -> Array[String]:
return region_flags
func get_region_level() -> int:
return level
func get_region_seed() -> int:
return region_seed
func get_objective() -> int:
if "tutorial" in region_flags:
return 1
var o = get_objective_by_level(get_region_level())
for m in modifiers:
o = m.modify_objective(o)
return o
func get_charge() -> int:
var c = DEFAULT_CHARGE
for m in modifiers:
c = m.modify_charge(c)
return c
func get_rock_threshold() -> float:
var threshold = DEFAULT_ROCK_THRESHOLD
for m in modifiers:
threshold = m.modify_rock_threshold(threshold)
return threshold
func get_decontamination_threshold() -> float:
var threshold = DEFAULT_DECONTAMINATION_THRESHOLD
for m in modifiers:
threshold = m.modify_decontamination_threshold(threshold)
return threshold
func get_cristal_threshold() -> float:
var threshold = DEFAULT_CRISTAL_THRESHOLD
for m in modifiers:
threshold = m.modify_cristal_threshold(threshold)
return threshold
func get_start_decontamination_zone_radius() -> int:
var zone_radius := DEFAULT_START_DECONTAMINATION_ZONE_RADIUS
for m in modifiers:
zone_radius = m.modify_start_decontamination_zone_radius(zone_radius)
return zone_radius