feat: Selectable tower on level

This commit is contained in:
Varylios 2025-08-30 00:46:34 +02:00
parent 1e3ab60051
commit adc1b9034c
13 changed files with 91 additions and 15 deletions

View file

@ -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])

View file

@ -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"

View file

@ -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"

View file

@ -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)

View file

@ -109,7 +109,6 @@ func build_tower() -> void:
quit_placing()
selected_tower.is_rest = false
print(selected_tower.tower_type)
move_tower()
emitTeamChanges()

View file

@ -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:

View file

@ -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")

View file

@ -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)

View file

@ -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]

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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"]