diff --git a/game/world/generators/area_generator.gd b/game/world/generators/area_generator.gd index c62c1d2..4065560 100644 --- a/game/world/generators/area_generator.gd +++ b/game/world/generators/area_generator.gd @@ -2,6 +2,13 @@ class_name AreaGenerator extends Node +@onready var stage_generator : StageGenerator = $StageGenerator +@onready var passage_generator : PassageGenerator = $PassageGenerator + + +const INNER_STAGE_COUNT = 3 + + func generate(seed_value: int) -> AreaData: var rng := RandomNumberGenerator.new() rng.seed = seed_value @@ -10,9 +17,77 @@ func generate(seed_value: int) -> AreaData: data.seed_value = seed_value _fill_stages(rng, data) + _fill_passages(rng, data) return data func _fill_stages(rng: RandomNumberGenerator, data : AreaData) -> void: - pass + _fill_first_stage(rng, data) + _fill_last_stage(rng, data) + _fill_inner_stages(rng, data) + + +func _fill_first_stage(rng: RandomNumberGenerator, data : AreaData) -> void: + var stage := _get_stage(rng, true) + data.first_stage = stage + + +func _fill_last_stage(rng: RandomNumberGenerator, data : AreaData) -> void: + var stage := _get_stage(rng, true) + data.last_stage = stage + + +func _fill_inner_stages(rng: RandomNumberGenerator, data : AreaData) -> void: + for i in INNER_STAGE_COUNT: + var stage := _get_stage(rng) + data.inner_stages.append(stage) + + +func _fill_passages(rng: RandomNumberGenerator, data : AreaData) -> void: + var all_stages : Array[StageData] = [data.first_stage] + data.inner_stages + [data.last_stage] + + for i in range(all_stages.size() - 1): + var first_stage := all_stages[i] + var second_stage := all_stages[i + 1] + _fill_passages_for_pair(rng, data, first_stage, second_stage) + + +func _fill_passages_for_pair( + rng: RandomNumberGenerator, + data : AreaData, + first_stage: StageData, + second_stage: StageData +) -> void: + var first_size := first_stage.sectors.size() + var second_size := second_stage.sectors.size() + + if first_size == second_size: + match first_size: + 1: + pass + 2: + pass + 3: + pass + else: + var lesser_stage := first_stage if first_size < second_size else second_stage + var greater_stage := first_stage if first_size > second_size else second_stage + var lesser_size := lesser_stage.sectors.size() + var greater_size := greater_stage.sectors.size() + + match lesser_size: + 1: + match greater_size: + 2: + pass + 3: + pass + 2: + pass + + +func _get_stage(rng: RandomNumberGenerator, is_endpoint: bool = false) -> StageData: + var seed_value := rng.randi() + var stage := stage_generator.generate(seed_value, is_endpoint) + return stage diff --git a/game/world/generators/area_generator.tscn b/game/world/generators/area_generator.tscn index a5b9fc6..ed43870 100644 --- a/game/world/generators/area_generator.tscn +++ b/game/world/generators/area_generator.tscn @@ -1,6 +1,12 @@ -[gd_scene load_steps=2 format=3 uid="uid://c4l1cv3o25lhv"] +[gd_scene load_steps=4 format=3 uid="uid://c4l1cv3o25lhv"] [ext_resource type="Script" uid="uid://bcq74qwnbylg2" path="res://game/world/generators/area_generator.gd" id="1_hahgo"] +[ext_resource type="PackedScene" uid="uid://bn4r4f3str55v" path="res://game/world/generators/stage_generator.tscn" id="2_b1pkv"] +[ext_resource type="PackedScene" uid="uid://cfcpr07j58cvx" path="res://game/world/generators/passage_generator.tscn" id="3_q2vfj"] [node name="AreaGenerator" type="Node"] script = ExtResource("1_hahgo") + +[node name="StageGenerator" parent="." instance=ExtResource("2_b1pkv")] + +[node name="PassageGenerator" parent="." instance=ExtResource("3_q2vfj")] diff --git a/game/world/generators/world_generator.gd b/game/world/generators/world_generator.gd index 786914b..59e6e19 100644 --- a/game/world/generators/world_generator.gd +++ b/game/world/generators/world_generator.gd @@ -5,7 +5,7 @@ extends Node @onready var area_generator : AreaGenerator = $AreaGenerator -const MAX_AREA_COUNT = 3 +const AREA_COUNT = 3 func generate(seed_value: int) -> WorldData: @@ -21,7 +21,7 @@ func generate(seed_value: int) -> WorldData: func _fill_areas(rng: RandomNumberGenerator, data : WorldData) -> void: - for i in MAX_AREA_COUNT: + for i in AREA_COUNT: var seed_value := rng.randi() var area := area_generator.generate(seed_value) data.areas.append(area)