diff --git a/Globals/EventBus.gd b/Globals/EventBus.gd index 7789707..5790ded 100644 --- a/Globals/EventBus.gd +++ b/Globals/EventBus.gd @@ -1,3 +1,4 @@ +@tool extends Node @@ -33,11 +34,11 @@ signal tower_count_changed(_value : int) #Emitter : PlayerManager.gd #Subscriber : label_team.gd, label_tower_on_terrain.gd -signal team_in_action_changed(_value : Array) +signal team_in_action_changed(_value : int) #Emitter : PlayerManager.gd #Subscriber : label_tower_in_cube.gd -signal team_in_rest_changed(_value : Array) +signal team_in_rest_changed(_value : int) @@ -59,7 +60,7 @@ signal money_spent(_value : int) #Subscriber : cube.gd signal player_has_won() -#Emitter : WaveManger.gd +#Emitter : WaveManager.gd #Subscriber : cube.gd signal player_defeated() @@ -74,3 +75,7 @@ signal close_shop() #Emitter : tower.gd #Subscriber : tower button.gd signal energy_has_changed(tower : Tower) + +#Emitter : WaveManager.gd +#Subscriber : gui.gd +signal allowedTowerHasChange(allowedTowers : Array[Tower.TYPES]) diff --git a/Levels/level_1.tres b/Levels/level_1.tres index fee81cb..59cf29a 100644 --- a/Levels/level_1.tres +++ b/Levels/level_1.tres @@ -79,4 +79,5 @@ metadata/_custom_type_script = "uid://chu8s12rtdeqx" script = ExtResource("1_ftl6b") waves = Array[ExtResource("2_457yt")]([SubResource("Resource_m6gub"), SubResource("Resource_457yt"), SubResource("Resource_ujs1b")]) auto_start = false +allowedTowers = Array[int]([1, 2]) metadata/_custom_type_script = "uid://cuhq6u67cbbqm" diff --git a/Levels/level_2.tres b/Levels/level_2.tres index 6f1ca2e..4d9da03 100644 --- a/Levels/level_2.tres +++ b/Levels/level_2.tres @@ -79,4 +79,5 @@ wait_for_enemy_kills = true script = ExtResource("1_c4t4w") waves = Array[ExtResource("2_2ji0m")]([SubResource("Resource_cm6sg"), SubResource("Resource_c4t4w"), SubResource("Resource_s83h5"), SubResource("Resource_xgtww")]) auto_start = false +allowedTowers = Array[int]([1, 2]) metadata/_custom_type_script = "uid://cuhq6u67cbbqm" diff --git a/Scripts/Level.gd b/Scripts/Level.gd index c92d219..c043374 100644 --- a/Scripts/Level.gd +++ b/Scripts/Level.gd @@ -1,5 +1,13 @@ +@tool extends Resource class_name Level @export var waves : Array[Wave] @export var auto_start : bool = false +@export var allowedTowers : Array[Tower.TYPES] : set = allowedTowersHasChanged + + +func allowedTowersHasChanged(value) -> void: + allowedTowers = value + if Engine.is_editor_hint(): + EventBus.allowedTowerHasChange.emit(allowedTowers) diff --git a/Scripts/PlayerManager.gd b/Scripts/PlayerManager.gd index 958453a..af51b0d 100644 --- a/Scripts/PlayerManager.gd +++ b/Scripts/PlayerManager.gd @@ -109,7 +109,6 @@ func build_tower() -> void: quit_placing() selected_tower.is_rest = false - print(selected_tower.tower_type) move_tower() emitTeamChanges() diff --git a/Scripts/WaveManager.gd b/Scripts/WaveManager.gd index 1f2e0f0..2338aaa 100644 --- a/Scripts/WaveManager.gd +++ b/Scripts/WaveManager.gd @@ -15,6 +15,7 @@ var wave_on_going : bool = false func _ready() -> void: troopTimer.timeout.connect(spawn_troop) EventBus.player_defeated.connect(clearLevel) + EventBus.allowedTowerHasChange.emit.call_deferred(level.allowedTowers) func _process(delta: float) -> void: diff --git a/Towers/tower.gd b/Towers/tower.gd index 0cca62a..670b235 100644 --- a/Towers/tower.gd +++ b/Towers/tower.gd @@ -1,6 +1,7 @@ extends StaticBody3D class_name Tower +# DANGER NONE Should always be first enum TYPES { NONE, PIERRE, ALINE, MAXENCE, VICTORIA, EVAN, ALEX } var bullet : PackedScene = preload("res://Bullets/bullet.tscn") diff --git a/UI/gui.gd b/UI/gui.gd index dda1809..9020e92 100644 --- a/UI/gui.gd +++ b/UI/gui.gd @@ -8,8 +8,12 @@ var towerListResource := preload("res://Towers/towers.tres") @onready var buttonContainer = $HBoxContainer/ControlPanelBase/MarginContainer/GridContainer +var allowedTowers : Array[Tower.TYPES] + + func _ready() -> void: addTowerButtonNodes() + EventBus.allowedTowerHasChange.connect(allowedTowerHasChange) if Engine.is_editor_hint(): towerListResource.changed.connect(addTowerButtonNodes) @@ -25,13 +29,22 @@ func _on_button_quit_level_pressed() -> void: func _on_button_quit_game_pressed() -> void: get_tree().quit() + +func allowedTowerHasChange(allowedTowers : Array[Tower.TYPES]) -> void: + self.allowedTowers = allowedTowers + if is_node_ready(): + addTowerButtonNodes() + + func addTowerButtonNodes() -> void: for node in buttonContainer.get_children(): if node.has_meta("dynamicButton"): node.queue_free() + var additionalPlaceholder : int = 0 for towerResource in towerListResource.towers: - if !towerResource || towerResource.towerType == Tower.TYPES.NONE: + if !towerResource || not allowedTowers.has(towerResource.towerType): + additionalPlaceholder += 1 continue var towerBtn := towerButton.instantiate() @@ -43,7 +56,7 @@ func addTowerButtonNodes() -> void: tower.queue_free() buttonContainer.add_child(towerBtn) - for i in BUTTON_QTY - towerListResource.towers.size(): + for i in BUTTON_QTY - towerListResource.towers.size() + additionalPlaceholder: var placeholderBtn := Button.new() placeholderBtn.set_meta("dynamicButton", true) placeholderBtn.custom_minimum_size = Vector2(80, 80) diff --git a/UI/label_team.gd b/UI/label_team.gd index 79812d4..1bf0c64 100644 --- a/UI/label_team.gd +++ b/UI/label_team.gd @@ -10,7 +10,7 @@ func _on_EventBus_tower_count_changed(_value : int) -> void: _text[1] = str(_value) text = _text[0] + "/" + _text[1] -func _on_EventBus_team_in_action_changed(_value : Array) -> void: +func _on_EventBus_team_in_action_changed(_value : int) -> void: var _text = text.rsplit("/") - _text[0] = str(_value.size()) + _text[0] = str(_value) text = _text[0] + "/" + _text[1] diff --git a/UI/label_tower_in_cube.gd b/UI/label_tower_in_cube.gd index 4400da7..067d600 100644 --- a/UI/label_tower_in_cube.gd +++ b/UI/label_tower_in_cube.gd @@ -3,5 +3,5 @@ extends Label func _ready() -> void: EventBus.team_in_rest_changed.connect(_on_EventBus_team_in_rest_changed) -func _on_EventBus_team_in_rest_changed(_value : Array) -> void: - text = str(_value.size()) +func _on_EventBus_team_in_rest_changed(_value : int) -> void: + text = str(_value) diff --git a/UI/label_tower_on_terrain.gd b/UI/label_tower_on_terrain.gd index 9e6c627..066530f 100644 --- a/UI/label_tower_on_terrain.gd +++ b/UI/label_tower_on_terrain.gd @@ -3,5 +3,5 @@ extends Label func _ready() -> void: EventBus.team_in_action_changed.connect(_on_EventBus_team_in_action_changed) -func _on_EventBus_team_in_action_changed(_value : Array) -> void: - text = str(_value.size()) +func _on_EventBus_team_in_action_changed(_value : int) -> void: + text = str(_value) diff --git a/addons/LevelEditor/WaveMaker.gd b/addons/LevelEditor/WaveMaker.gd index e051793..c7354ec 100644 --- a/addons/LevelEditor/WaveMaker.gd +++ b/addons/LevelEditor/WaveMaker.gd @@ -21,10 +21,10 @@ enum DIRECTION { UP, DOWN, TOP, LEFT, VERTICAL, HORIZONTAL} @onready var levelSelect := $VBoxContainer2/HBoxContainer/LevelSelect @onready var waveTabContainer := $VBoxContainer2/ScrollContainer/WaveContainer @onready var waveTimerInput := $VBoxContainer2/ButtonContainer3/WaveTimer +@onready var towerSelector := $VBoxContainer2/ButtonContainer5/TowerSelector var level : Level var currentWave : int = -1 - func _input(event: InputEvent) -> void: if !has_focus() || event is not InputEventKey || !event.pressed: return @@ -34,11 +34,17 @@ func _input(event: InputEvent) -> void: elif event.keycode == KEY_LEFT && waveTabContainer.current_tab > 0: waveTabContainer.current_tab -= 1 +func _ready() -> void: + towerSelector.clear() + for towerType : String in Tower.TYPES: + if Tower.TYPES.NONE != Tower.TYPES.get(towerType): + towerSelector.add_item(towerType) func buildTree() -> void: if !level: return + manageAllowedTowers() autoLaunchLevel.button_pressed = level.auto_start for i in level.waves.size(): var troopContainer := VBoxContainer.new() @@ -48,12 +54,19 @@ func buildTree() -> void: waveTabContainer.set_tab_title(i, "Vague N°" + str(i + 1)) +func manageAllowedTowers() -> void: + towerSelector.deselect_all() + for towerAllowed in level.allowedTowers: + # NOTE minus one is for remove none value + towerSelector.select(towerAllowed - 1, false) + + func buildWave(wave : Wave, troopContainer : VBoxContainer) -> void: for i in wave.troops.size(): var troop : Troop = wave.troops[i] - if i > 0 && !troopContainer.get_child(troopContainer.get_child_count() - 1).has_meta("troop_group") \ - || troop.spawn_delay > 0: + if troop.spawn_delay > 0 || i > 0 \ + && !troopContainer.get_child(troopContainer.get_child_count() - 1).has_meta("troop_group"): troopContainer.add_child(HSeparator.new()) if troop.spawn_delay: @@ -241,3 +254,12 @@ func _on_new_level_pressed() -> void: func _on_save_pressed() -> void: ResourceSaver.save(level, LEVEL_PATH + "/" + levelSelect.selectedValue, ResourceSaver.FLAG_BUNDLE_RESOURCES) + + +func onSelectedTowerChange(index: int, selected: int) -> void: + # NOTE Adding one for taking NONE value in account + index += 1 + if selected: + level.allowedTowers.append(index) + else: + level.allowedTowers.erase(index) diff --git a/addons/LevelEditor/wave_maker.tscn b/addons/LevelEditor/wave_maker.tscn index d2dcebd..82e81c4 100644 --- a/addons/LevelEditor/wave_maker.tscn +++ b/addons/LevelEditor/wave_maker.tscn @@ -18,6 +18,7 @@ layout_mode = 2 [node name="VBoxContainer2" type="VBoxContainer" parent="."] layout_mode = 2 size_flags_horizontal = 3 +size_flags_vertical = 3 [node name="MarginContainer" type="MarginContainer" parent="VBoxContainer2"] custom_minimum_size = Vector2(0, 20) @@ -120,6 +121,29 @@ text = "Timer avant lancement de la vague" custom_minimum_size = Vector2(0, 30) layout_mode = 2 +[node name="ButtonContainer5" type="HBoxContainer" parent="VBoxContainer2"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 + +[node name="TowerSelector" type="ItemList" parent="VBoxContainer2/ButtonContainer5"] +layout_mode = 2 +size_flags_horizontal = 3 +select_mode = 2 +allow_search = false +auto_width = true +auto_height = true +item_count = 6 +item_0/text = "PIERRE" +item_1/text = "ALINE" +item_2/text = "MAXENCE" +item_3/text = "VICTORIA" +item_4/text = "EVAN" +item_5/text = "ALEX" + +[node name="MarginContainer4" type="MarginContainer" parent="VBoxContainer2"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 + [node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer2"] layout_mode = 2 size_flags_vertical = 3 @@ -140,5 +164,6 @@ drag_to_rearrange_enabled = true [connection signal="pressed" from="VBoxContainer2/ButtonContainer2/RemoveWave" to="." method="removeWave"] [connection signal="toggled" from="VBoxContainer2/ButtonContainer4/WaitForKill" to="." method="_on_wait_for_kill_toggled"] [connection signal="valueHasChanged" from="VBoxContainer2/ButtonContainer3/WaveTimer" to="." method="changeWaveCooldown"] +[connection signal="multi_selected" from="VBoxContainer2/ButtonContainer5/TowerSelector" to="." method="onSelectedTowerChange"] [connection signal="active_tab_rearranged" from="VBoxContainer2/ScrollContainer/WaveContainer" to="." method="changeWaveOrder"] [connection signal="tab_changed" from="VBoxContainer2/ScrollContainer/WaveContainer" to="." method="tabFocusHaschanged"]