diff --git a/game/area_map/area_map.gd b/game/area_map/area_map.gd index c3221d4..06d6cc5 100644 --- a/game/area_map/area_map.gd +++ b/game/area_map/area_map.gd @@ -8,16 +8,18 @@ const SECTOR_XS = [ 64 * 7, 64 * 8, 64 * 9, ] +const SECTOR_Y_OFFSET = 24 + const SECTOR_YS_FOR_ONE = [ - 64 * 2 + SECTOR_Y_OFFSET + 64 * 1 ] const SECTOR_YS_FOR_TWO = [ - 64 * 1.5, 64 * 2.5, + SECTOR_Y_OFFSET + 64 * 0.5, SECTOR_Y_OFFSET + 64 * 1.5, ] const SECTOR_YS_FOR_THREE = [ - 64 * 1, 64 * 2, 64 * 3, + SECTOR_Y_OFFSET + 64 * 0, SECTOR_Y_OFFSET + 64 * 1, SECTOR_Y_OFFSET + 64 * 2, ] const CURRENT_SECTOR_INDICATOR_OFFSET = Vector2(0, 16) @@ -36,16 +38,16 @@ const SECTOR_SCENES : Dictionary[SectorData.SectorType, PackedScene] = { SectorData.SectorType.BossSector: preload("res://game/area_map/indicators/sectors/boss_sector_indicator.tscn"), } -const PASSAGE_SCENES : Dictionary[PassageData.PassageAngle, PackedScene] = { - PassageData.PassageAngle.Minus45Grad: +const PASSAGE_SCENES : Dictionary[PassageData.PassageType, PackedScene] = { + PassageData.PassageType.Minus45Grad: preload("res://game/area_map/indicators/passages/minus_45_grad_passage_indicator.tscn"), - PassageData.PassageAngle.Minus26Grad: + PassageData.PassageType.Minus26Grad: preload("res://game/area_map/indicators/passages/minus_26_grad_passage_indicator.tscn"), - PassageData.PassageAngle.ZeroGrad: + PassageData.PassageType.ZeroGrad: preload("res://game/area_map/indicators/passages/zero_grad_passage_indicator.tscn"), - PassageData.PassageAngle.Plus26Grad: + PassageData.PassageType.Plus26Grad: preload("res://game/area_map/indicators/passages/plus_26_grad_passage_indicator.tscn"), - PassageData.PassageAngle.Plus45Grad: + PassageData.PassageType.Plus45Grad: preload("res://game/area_map/indicators/passages/plus_45_grad_passage_indicator.tscn"), } @@ -67,6 +69,7 @@ var selected_sector: SectorData = null: var sector_positions : Dictionary[SectorData, Vector2] = {} var test_rng : RandomNumberGenerator = RandomNumberGenerator.new() +var test_seed := 0 @onready var passages_node : Node2D = $Passages @@ -79,7 +82,7 @@ var test_rng : RandomNumberGenerator = RandomNumberGenerator.new() func _ready() -> void: - area_data = test_area_generator.generate(4) + area_data = test_area_generator.generate(test_seed) test_rng.seed = 0 current_sector = _get_random_sector() selected_sector = _get_random_sector() @@ -148,16 +151,18 @@ func _fill_sectors(stage: StageData) -> void: var sector_instance : AbstractSectorIndicator = scene.instantiate() sector_instance.position = sector_position sectors_node.add_child(sector_instance) + sector.activity_changed.connect(sector_instance.set_active) func _fill_passages(passages: Array[PassageData], sector_position: Vector2) -> void: for passage in passages: - if not passage.angle in PASSAGE_SCENES: continue + if not passage.type in PASSAGE_SCENES: continue - var scene := PASSAGE_SCENES[passage.angle] + var scene := PASSAGE_SCENES[passage.type] var passage_instance : AbstractPassageIndicator = scene.instantiate() passage_instance.position = sector_position passages_node.add_child(passage_instance) + passage.activity_changed.connect(passage_instance.set_active) func _get_sector_position(stage_index: int, sector_index: int, sector_count: int) -> Vector2: @@ -205,3 +210,10 @@ func _set_selected_sector(sector: SectorData) -> void: selected_sector_indicator.position = sector_position selected_sector_indicator.show() + + +func _on_test_timer_timeout() -> void: + test_seed += 1 + area_data = test_area_generator.generate(test_seed) + current_sector = _get_random_sector() + selected_sector = _get_random_sector() diff --git a/game/area_map/area_map.tscn b/game/area_map/area_map.tscn index 40df8d9..ab718cc 100644 --- a/game/area_map/area_map.tscn +++ b/game/area_map/area_map.tscn @@ -17,3 +17,9 @@ 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/entities/ships/shield.gdshader b/game/entities/ships/shield.gdshader index 3aa49f7..d7ae33f 100644 --- a/game/entities/ships/shield.gdshader +++ b/game/entities/ships/shield.gdshader @@ -3,6 +3,7 @@ shader_type canvas_item; uniform float speed = 5.0; uniform float scale = 20.0; uniform float intensity = 1; +uniform sampler2D noise; float rand(vec2 coord) { return fract(sin(dot(coord, vec2(12.9898, 78.233))) * 43758.5453); diff --git a/game/world/data/passage_data.gd b/game/world/data/passage_data.gd index 951a280..8da5c9f 100644 --- a/game/world/data/passage_data.gd +++ b/game/world/data/passage_data.gd @@ -2,7 +2,10 @@ class_name PassageData extends Resource -enum PassageAngle { +signal activity_changed(is_active: bool) + + +enum PassageType { Minus45Grad, Minus26Grad, ZeroGrad, @@ -17,4 +20,11 @@ enum PassageAngle { @export var seed_value : int = 0 -@export var angle : PassageAngle = PassageAngle.ZeroGrad +@export var type : PassageType = PassageType.ZeroGrad + + +var is_active: bool = true: + set(value): + if is_active == value: return + is_active = value + activity_changed.emit(is_active) diff --git a/game/world/data/sector_data.gd b/game/world/data/sector_data.gd index 7e91d85..f85193f 100644 --- a/game/world/data/sector_data.gd +++ b/game/world/data/sector_data.gd @@ -2,6 +2,9 @@ class_name SectorData extends Resource +signal activity_changed(is_active: bool) + + enum SectorType { EmptySector, ShopSector, @@ -18,3 +21,10 @@ enum SectorType { @export var seed_value : int = 0 @export var type : SectorType = SectorType.EmptySector + + +var is_active: bool = true: + set(value): + if is_active == value: return + is_active = value + activity_changed.emit(is_active) diff --git a/game/world/generators/area_generator.gd b/game/world/generators/area_generator.gd index 258d5fd..d5a4c73 100644 --- a/game/world/generators/area_generator.gd +++ b/game/world/generators/area_generator.gd @@ -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) diff --git a/game/world/generators/stage_generator.gd b/game/world/generators/stage_generator.gd index 9da0fa9..9f4fb20 100644 --- a/game/world/generators/stage_generator.gd +++ b/game/world/generators/stage_generator.gd @@ -10,9 +10,9 @@ enum StageType { const CHANSES_BY_SECTOR_COUNT : Dictionary[int, int] = { - 1: 25, - 2: 60, - 3: 15 + 1: 20, + 2: 30, + 3: 50 }