Files
ScrapFrontier/game/world/generators/area_generator.gd
T

94 lines
2.3 KiB
GDScript

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
var data : AreaData = AreaData.new()
data.seed_value = seed_value
_fill_stages(rng, data)
_fill_passages(rng, data)
return data
func _fill_stages(rng: RandomNumberGenerator, data : AreaData) -> void:
_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