|
|
|
@@ -4,7 +4,33 @@ extends Node
|
|
|
|
|
|
|
|
|
|
const STAGE_COUNT = 9
|
|
|
|
|
|
|
|
|
|
const EXTRA_PASSAGE_CHANCE = 20
|
|
|
|
|
const EXTRA_PASSAGE_CHANCE = 33
|
|
|
|
|
|
|
|
|
|
const PASSAGE_TYPES = {
|
|
|
|
|
"1 1 0": PassageData.PassageType.ZeroGrad,
|
|
|
|
|
"1 2 0": PassageData.PassageType.Minus26Grad,
|
|
|
|
|
"1 2 -1": PassageData.PassageType.Plus26Grad,
|
|
|
|
|
"1 3 0": PassageData.PassageType.Plus45Grad,
|
|
|
|
|
"1 3 -1": PassageData.PassageType.ZeroGrad,
|
|
|
|
|
"1 3 -2": PassageData.PassageType.Minus45Grad,
|
|
|
|
|
|
|
|
|
|
"2 1 1": PassageData.PassageType.Minus26Grad,
|
|
|
|
|
"2 1 0": PassageData.PassageType.Plus26Grad,
|
|
|
|
|
"2 2 1": PassageData.PassageType.Minus45Grad,
|
|
|
|
|
"2 2 0": PassageData.PassageType.ZeroGrad,
|
|
|
|
|
"2 2 -1": PassageData.PassageType.Plus45Grad,
|
|
|
|
|
"2 3 0": PassageData.PassageType.Minus26Grad,
|
|
|
|
|
"2 3 -1": PassageData.PassageType.Plus26Grad,
|
|
|
|
|
|
|
|
|
|
"3 1 2": PassageData.PassageType.Minus45Grad,
|
|
|
|
|
"3 1 1": PassageData.PassageType.ZeroGrad,
|
|
|
|
|
"3 1 0": PassageData.PassageType.Plus45Grad,
|
|
|
|
|
"3 2 1": PassageData.PassageType.Minus26Grad,
|
|
|
|
|
"3 2 0": PassageData.PassageType.Plus26Grad,
|
|
|
|
|
"3 3 1": PassageData.PassageType.Minus45Grad,
|
|
|
|
|
"3 3 0": PassageData.PassageType.ZeroGrad,
|
|
|
|
|
"3 3 -1": PassageData.PassageType.Plus45Grad,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var local_seed_rng : RandomNumberGenerator = RandomNumberGenerator.new()
|
|
|
|
@@ -18,7 +44,7 @@ var passage_direction_rng : RandomNumberGenerator = RandomNumberGenerator.new()
|
|
|
|
|
@onready var passage_generator : PassageGenerator = $PassageGenerator
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func generate(seed_value: int) -> AreaData:
|
|
|
|
|
func generate(seed_value: int) -> AreaData:
|
|
|
|
|
local_seed_rng.seed = seed_value
|
|
|
|
|
stage_seed_rng.seed = local_seed_rng.randi()
|
|
|
|
|
passage_seed_rng.seed = local_seed_rng.randi()
|
|
|
|
@@ -68,11 +94,13 @@ func _fill_passages_for_pair(
|
|
|
|
|
var second_size := second_stage.sectors.size()
|
|
|
|
|
|
|
|
|
|
if first_size < second_size:
|
|
|
|
|
var is_flipped := false
|
|
|
|
|
_fill_passages_for_unequal_pair(data, first_stage.sectors, second_stage.sectors, is_flipped)
|
|
|
|
|
_fill_passages_for_unequal_pair(
|
|
|
|
|
data, first_stage.sectors, second_stage.sectors, _connect_sectors
|
|
|
|
|
)
|
|
|
|
|
elif first_size > second_size:
|
|
|
|
|
var is_flipped := true
|
|
|
|
|
_fill_passages_for_unequal_pair(data, second_stage.sectors, first_stage.sectors, is_flipped)
|
|
|
|
|
_fill_passages_for_unequal_pair(
|
|
|
|
|
data, second_stage.sectors, first_stage.sectors, _connect_sectors_flipped
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
_fill_passages_for_equal_pair(data, first_stage.sectors, second_stage.sectors)
|
|
|
|
|
|
|
|
|
@@ -85,32 +113,32 @@ func _fill_passages_for_equal_pair(
|
|
|
|
|
var size := first_sectors.size()
|
|
|
|
|
|
|
|
|
|
for i in range(size):
|
|
|
|
|
_connect_sectors(data, first_sectors[i], second_sectors[i])
|
|
|
|
|
_connect_sectors(data, first_sectors, i, second_sectors, i)
|
|
|
|
|
|
|
|
|
|
for i in range(size - 1):
|
|
|
|
|
if _extra_passage_needed():
|
|
|
|
|
var is_passage_fliped := _is_extra_passage_flipped()
|
|
|
|
|
var from := i if is_passage_fliped else i + 1
|
|
|
|
|
var to := i + 1 if is_passage_fliped else i
|
|
|
|
|
_connect_sectors(data, first_sectors[from], second_sectors[to])
|
|
|
|
|
_connect_sectors(data, first_sectors, from, second_sectors, to)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _fill_passages_for_unequal_pair(
|
|
|
|
|
data : AreaData,
|
|
|
|
|
lesser_sectors: Array[SectorData],
|
|
|
|
|
greater_sectors: Array[SectorData],
|
|
|
|
|
is_sectors_flipped: bool
|
|
|
|
|
connect_method: Callable
|
|
|
|
|
) -> void:
|
|
|
|
|
var lesser_size := lesser_sectors.size()
|
|
|
|
|
|
|
|
|
|
match lesser_size:
|
|
|
|
|
1:
|
|
|
|
|
_fill_passages_for_unequal_pair_1_to_2_3(
|
|
|
|
|
data, lesser_sectors, greater_sectors, is_sectors_flipped
|
|
|
|
|
data, lesser_sectors, greater_sectors, connect_method
|
|
|
|
|
)
|
|
|
|
|
2:
|
|
|
|
|
_fill_passages_for_unequal_pair_2_to_3(
|
|
|
|
|
data, lesser_sectors, greater_sectors, is_sectors_flipped
|
|
|
|
|
data, lesser_sectors, greater_sectors, connect_method
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -118,27 +146,30 @@ func _fill_passages_for_unequal_pair_1_to_2_3(
|
|
|
|
|
data : AreaData,
|
|
|
|
|
lesser_sectors: Array[SectorData],
|
|
|
|
|
greater_sectors: Array[SectorData],
|
|
|
|
|
is_sectors_flipped: bool
|
|
|
|
|
connect_method: Callable
|
|
|
|
|
) -> void:
|
|
|
|
|
var greater_size := greater_sectors.size()
|
|
|
|
|
for i in range(greater_size):
|
|
|
|
|
_connect_sectors(data, lesser_sectors[0], greater_sectors[i], is_sectors_flipped)
|
|
|
|
|
connect_method.call(data, lesser_sectors, 0, greater_sectors, i)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _fill_passages_for_unequal_pair_2_to_3(
|
|
|
|
|
data : AreaData,
|
|
|
|
|
lesser_sectors: Array[SectorData],
|
|
|
|
|
greater_sectors: Array[SectorData],
|
|
|
|
|
is_sectors_flipped: bool
|
|
|
|
|
connect_method: Callable
|
|
|
|
|
) -> void:
|
|
|
|
|
_connect_sectors(data, lesser_sectors[0], greater_sectors[0], is_sectors_flipped)
|
|
|
|
|
_connect_sectors(data, lesser_sectors[1], greater_sectors[2], is_sectors_flipped)
|
|
|
|
|
|
|
|
|
|
connect_method.call(data, lesser_sectors, 0, greater_sectors, 0)
|
|
|
|
|
connect_method.call(data, lesser_sectors, 1, greater_sectors, 2)
|
|
|
|
|
|
|
|
|
|
if _extra_passage_needed():
|
|
|
|
|
_connect_sectors(data, lesser_sectors[0], greater_sectors[1], is_sectors_flipped)
|
|
|
|
|
_connect_sectors(data, lesser_sectors[1], greater_sectors[1], is_sectors_flipped)
|
|
|
|
|
connect_method.call(data, lesser_sectors, 0, greater_sectors, 1)
|
|
|
|
|
connect_method.call(data, lesser_sectors, 1, greater_sectors, 1)
|
|
|
|
|
else:
|
|
|
|
|
var from := 0 if _is_extra_passage_flipped() else 1
|
|
|
|
|
_connect_sectors(data, lesser_sectors[from], greater_sectors[1], is_sectors_flipped)
|
|
|
|
|
connect_method.call(data, lesser_sectors, from, greater_sectors, 1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _extra_passage_needed() -> bool:
|
|
|
|
@@ -151,20 +182,45 @@ func _is_extra_passage_flipped() -> bool:
|
|
|
|
|
|
|
|
|
|
func _connect_sectors(
|
|
|
|
|
data : AreaData,
|
|
|
|
|
first_sector: SectorData,
|
|
|
|
|
second_sector: SectorData,
|
|
|
|
|
is_flipped: bool = false
|
|
|
|
|
first_sectors: Array[SectorData],
|
|
|
|
|
first_index: int,
|
|
|
|
|
second_sectors: Array[SectorData],
|
|
|
|
|
second_index: int
|
|
|
|
|
) -> void:
|
|
|
|
|
var seed_value := passage_seed_rng.randi()
|
|
|
|
|
var passage := passage_generator.generate(seed_value)
|
|
|
|
|
|
|
|
|
|
var previous_sector := second_sector if is_flipped else first_sector
|
|
|
|
|
var next_sector := first_sector if is_flipped else second_sector
|
|
|
|
|
passage.type = _get_passage_type(
|
|
|
|
|
first_sectors.size(), first_index,
|
|
|
|
|
second_sectors.size(), second_index,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
passage.previous_sector = previous_sector
|
|
|
|
|
passage.next_sector = next_sector
|
|
|
|
|
var first_sector := first_sectors[first_index]
|
|
|
|
|
var second_sector := second_sectors[second_index]
|
|
|
|
|
|
|
|
|
|
previous_sector.next_passages.append(passage)
|
|
|
|
|
next_sector.previous_passages.append(passage)
|
|
|
|
|
passage.previous_sector = first_sector
|
|
|
|
|
passage.next_sector = second_sector
|
|
|
|
|
|
|
|
|
|
first_sector.next_passages.append(passage)
|
|
|
|
|
second_sector.previous_passages.append(passage)
|
|
|
|
|
|
|
|
|
|
data.passages.append(passage)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _connect_sectors_flipped(
|
|
|
|
|
data : AreaData,
|
|
|
|
|
first_sectors: Array[SectorData],
|
|
|
|
|
first_index: int,
|
|
|
|
|
second_sectors: Array[SectorData],
|
|
|
|
|
second_index: int
|
|
|
|
|
) -> void:
|
|
|
|
|
_connect_sectors(data, second_sectors, second_index, first_sectors, first_index)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _get_passage_type(
|
|
|
|
|
from_size: int, from_index: int, to_size: int, to_index: int
|
|
|
|
|
) -> PassageData.PassageType:
|
|
|
|
|
var diff := from_index - to_index
|
|
|
|
|
|
|
|
|
|
var key := "%d %d %d" % [from_size, to_size, diff]
|
|
|
|
|
return PASSAGE_TYPES.get(key, PassageData.PassageType.ZeroGrad)
|
|
|
|
|