From b31b3699ba1029d01ab247b1b015d29d1b828abe Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Tue, 9 Dec 2025 18:03:55 +0300 Subject: [PATCH] Added sector selection movement --- game/area_map/area_map.gd | 21 ++++++++++- game/area_map/area_map.tscn | 6 --- game/world/data/sector_data.gd | 5 +++ game/world/generators/area_generator.gd | 48 ++++++++++++++++++++++++ game/world/generators/stage_generator.gd | 12 +++++- 5 files changed, 84 insertions(+), 8 deletions(-) diff --git a/game/area_map/area_map.gd b/game/area_map/area_map.gd index 86d778a..cd68848 100644 --- a/game/area_map/area_map.gd +++ b/game/area_map/area_map.gd @@ -86,6 +86,21 @@ func _ready() -> void: selected_sector = _get_random_sector() +func _input(event: InputEvent) -> void: + if selected_sector == null: return + + if event.is_action_pressed("ui_left"): + _set_selected_sector(selected_sector.sector_to_left) + if event.is_action_pressed("ui_right"): + _set_selected_sector(selected_sector.sector_to_right) + if event.is_action_pressed("ui_up"): + _set_selected_sector(selected_sector.sector_above) + if event.is_action_pressed("ui_down"): + _set_selected_sector(selected_sector.sector_below) + if event.is_action_pressed("ui_accept"): + _load_text_test() + + func _set_area_data(data: AreaData) -> void: area_data = data @@ -185,6 +200,8 @@ func _clear_node(node: Node) -> void: func _set_current_sector(sector: SectorData) -> void: + if sector == null: return + if not sector in sector_positions: current_sector_indicator.hide() return @@ -199,6 +216,8 @@ func _set_current_sector(sector: SectorData) -> void: func _set_selected_sector(sector: SectorData) -> void: + if sector == null: return + if not sector in sector_positions: selected_sector_indicator.hide() return @@ -229,7 +248,7 @@ func _is_sector_accessible(sector: SectorData) -> bool: return false -func _on_test_timer_timeout() -> void: +func _load_text_test() -> void: test_seed += 1 area_data = test_area_generator.generate(test_seed) current_sector = _get_random_sector() diff --git a/game/area_map/area_map.tscn b/game/area_map/area_map.tscn index ab718cc..40df8d9 100644 --- a/game/area_map/area_map.tscn +++ b/game/area_map/area_map.tscn @@ -17,9 +17,3 @@ script = ExtResource("1_hkcry") [node name="SelectedSectorIndicator" parent="." instance=ExtResource("3_oxnrh")] [node name="TestAreaGenerator" parent="." instance=ExtResource("2_0o0gd")] - -[node name="TestTimer" type="Timer" parent="."] -wait_time = 10.0 -autostart = true - -[connection signal="timeout" from="TestTimer" to="." method="_on_test_timer_timeout"] diff --git a/game/world/data/sector_data.gd b/game/world/data/sector_data.gd index 4882e4d..46b3525 100644 --- a/game/world/data/sector_data.gd +++ b/game/world/data/sector_data.gd @@ -21,6 +21,11 @@ enum SectorType { @export var type : SectorType = SectorType.DebrisSector +@export var sector_to_left: SectorData = null +@export var sector_to_right: SectorData = null +@export var sector_above: SectorData = null +@export var sector_below: SectorData = null + var is_active: bool = true: set(value): diff --git a/game/world/generators/area_generator.gd b/game/world/generators/area_generator.gd index 15c8d3b..e94997e 100644 --- a/game/world/generators/area_generator.gd +++ b/game/world/generators/area_generator.gd @@ -66,6 +66,8 @@ func _fill_stages(data : AreaData) -> void: var seed_value := stage_seed_rng.randi() var stage := stage_generator.generate(seed_value, stage_type) data.stages.append(stage) + + _update_neighbors(data) func _get_stage_type(stage_index: int) -> StageGenerator.StageType: @@ -224,3 +226,49 @@ func _get_passage_type( var key := "%d %d %d" % [from_size, to_size, diff] return PASSAGE_TYPES.get(key, PassageData.PassageType.ZeroGrad) + + +func _update_neighbors(data : AreaData) -> void: + for stage_index in range(data.stages.size()): + var stage := data.stages[stage_index] + for sector_index in range(stage.sectors.size()): + var sector := stage.sectors[sector_index] + sector.sector_to_left = _get_left_neighbor(data, stage_index, sector_index) + sector.sector_to_right = _get_right_neighbor(data, stage_index, sector_index) + + +func _get_left_neighbor(data : AreaData, stage_index: int, sector_index: int) -> SectorData: + if stage_index == 0: return null + + var current_stage := data.stages[stage_index] + var left_stage := data.stages[stage_index-1] + + return _get_side_neighbor(sector_index, current_stage, left_stage) + + +func _get_right_neighbor(data : AreaData, stage_index: int, sector_index: int) -> SectorData: + if stage_index == data.stages.size() - 1: return null + + var current_stage := data.stages[stage_index] + var right_stage := data.stages[stage_index+1] + + return _get_side_neighbor(sector_index, current_stage, right_stage) + + +func _get_side_neighbor( + sector_index: int, current_stage: StageData, side_stage: StageData +) -> SectorData: + var current_size := current_stage.sectors.size() + var side_size := side_stage.sectors.size() + + if side_size == 0: + return null + + if current_size == 1: + return side_stage.sectors[floori(side_size / 2.0)] + + var normalized_position := float(sector_index) / float(current_size - 1) + var side_index := floori(normalized_position * (side_size - 1)) + side_index = clampi(side_index, 0, side_size - 1) + + return side_stage.sectors[side_index] diff --git a/game/world/generators/stage_generator.gd b/game/world/generators/stage_generator.gd index 9f4fb20..9f49c40 100644 --- a/game/world/generators/stage_generator.gd +++ b/game/world/generators/stage_generator.gd @@ -12,7 +12,7 @@ enum StageType { const CHANSES_BY_SECTOR_COUNT : Dictionary[int, int] = { 1: 20, 2: 30, - 3: 50 + 3: 50, } @@ -48,6 +48,7 @@ func _fill_sectors(data : StageData, type: StageType = StageType.Inner) -> void: sector.type = SectorData.SectorType.StartSector StageType.Boss: sector.type = SectorData.SectorType.BossSector + _update_neighbors(data) func _get_sector_count() -> int: @@ -64,3 +65,12 @@ func _get_sector_count() -> int: return count return 1 + + +func _update_neighbors(data : StageData) -> void: + var size := data.sectors.size() + for i in range(size): + if i > 0: + data.sectors[i].sector_above = data.sectors[i-1] + if i < size - 1: + data.sectors[i].sector_below = data.sectors[i+1]