From fffb13a27fe9209553d4f991bfc4c92390e6e8c4 Mon Sep 17 00:00:00 2001 From: Varylios Date: Sat, 6 Sep 2025 17:32:46 +0200 Subject: [PATCH] chore: UX + many minor fixes --- Enemies/enemy.gd | 4 ++-- Globals/Game.gd | 2 +- Levels/Scripts/Camera.gd | 4 ++-- Towers/Tower.gd | 23 ++++++++++++++++++----- Towers/TowerManager.gd | 37 +++++++++++++++++++++++++++++++++---- UI/gui.gd | 1 + UI/gui.tscn | 17 ++++++++++------- UI/gui_button.gd | 39 ++++++++++++++------------------------- Upgrades/Upgrade.gd | 2 +- 9 files changed, 82 insertions(+), 47 deletions(-) diff --git a/Enemies/enemy.gd b/Enemies/enemy.gd index 34f7fcd..1d9f9b1 100644 --- a/Enemies/enemy.gd +++ b/Enemies/enemy.gd @@ -19,8 +19,6 @@ var health : int = 0 : @onready var path : PathFollow3D = get_parent() @onready var healthBar : ProgressBar = $HealthBar3D/SubViewport/HealthBar2D -@onready var progress : float : - get(): return $"..".progress var attack_target : Node3D var is_alive : bool = true @@ -51,6 +49,8 @@ func attack(): if $AttackCooldown.is_stopped(): $AttackCooldown.start() attack_target.take_damage(base_attack_damage) + attack_target = null + path.progress = 0 func death() -> void: diff --git a/Globals/Game.gd b/Globals/Game.gd index ec76a35..5711a8b 100644 --- a/Globals/Game.gd +++ b/Globals/Game.gd @@ -62,7 +62,7 @@ func win(): func spendMoney(amount : int) -> bool: - if money > amount: + if money >= amount: money -= amount return true return false diff --git a/Levels/Scripts/Camera.gd b/Levels/Scripts/Camera.gd index ef94f4b..7afad7e 100644 --- a/Levels/Scripts/Camera.gd +++ b/Levels/Scripts/Camera.gd @@ -31,9 +31,9 @@ func _input(event: InputEvent) -> void: var newPosition : float = position.y if event.button_index == MOUSE_BUTTON_WHEEL_UP: - newPosition = clampf(newPosition - .2, curve.min_value, curve.max_value) + newPosition = clampf(newPosition - .2, curve.min_domain, curve.max_domain) elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN: - newPosition = clampf(newPosition + .2, curve.min_value, curve.max_value) + newPosition = clampf(newPosition + .2, curve.min_domain, curve.max_domain) rotation.x = deg_to_rad(curve.sample(newPosition)) position.y = newPosition diff --git a/Towers/Tower.gd b/Towers/Tower.gd index 7730d37..1c9a4da 100644 --- a/Towers/Tower.gd +++ b/Towers/Tower.gd @@ -1,4 +1,3 @@ -@tool extends StaticBody3D class_name Tower @@ -39,7 +38,7 @@ var projectileScene : PackedScene = preload("res://Towers/Projectiles/projectile @onready var energyRecoveryCooldown : Timer = $EnergyRecoveryCooldown -var energy : float = max_energy: +var energy : float : set(value): energyBar.value = value energy = clampf(value, 0.0, max_energy) @@ -63,6 +62,7 @@ var builded : bool = false func _ready() -> void: EventBus.tower_upgraded.connect(apply_upgrade) energyRecoveryCooldown.timeout.connect(func(): energy += energy_regen) + energy = max_energy # WARNING : Prevent .tscn file to be modified by the load of the scene in editor if not Engine.is_editor_hint(): collision_layer = 0 @@ -99,6 +99,7 @@ func resting() -> void: collision_mask = 0 if builded: + toggleConnection(false) energyRecoveryCooldown.start() @@ -106,6 +107,7 @@ func in_action() -> void: visible = true if builded: + toggleConnection(true) collision_layer = 0b100 collision_mask = 0b100 energyRecoveryCooldown.stop() @@ -114,7 +116,7 @@ func in_action() -> void: func choose_target() -> void: target = null for enemy in availableTargets: - if not target || enemy.progress > target.progress: + if not target || enemy.path.progress > target.path.progress: target = enemy @@ -137,13 +139,24 @@ func towerChange() -> void: EventBus.tower_changed.emit(self) -func _on_range_body_entered(body: Node3D) -> void: +func onBodyEntered(body: Node3D) -> void: if body is Enemy: availableTargets.append(body) choose_target() -func _on_range_body_exited(body: Node3D) -> void: +func onBodyExited(body: Node3D) -> void: if body is Enemy: availableTargets.erase(body) choose_target() + + +func toggleConnection(activate : bool) -> void: + if activate: + $Range.body_entered.connect(onBodyEntered) + $Range.body_exited.connect(onBodyExited) + else: + $Range.body_entered.disconnect(onBodyEntered) + $Range.body_exited.disconnect(onBodyExited) + availableTargets.clear() + target = null diff --git a/Towers/TowerManager.gd b/Towers/TowerManager.gd index a452707..27ae4b5 100644 --- a/Towers/TowerManager.gd +++ b/Towers/TowerManager.gd @@ -13,7 +13,7 @@ var buildedTower : int = 0 func _ready() -> void: - EventBus.tower_selected.connect(selectTower) + EventBus.tower_selected.connect(onTowerSelect) #$AnimationPlayer.play("arrow_bobbing") @@ -30,8 +30,8 @@ func _process(_delta: float) -> void: if isTileFree(collider): placeTower() - elif tower && (not selected_tower || selected_tower.builded): - EventBus.tower_selected.emit(tower.type) + elif tower: + selectTower(tower.type) if Input.is_action_just_pressed("rest"): if tower: @@ -40,6 +40,11 @@ func _process(_delta: float) -> void: EventBus.tower_selected.emit(Tower.TYPE.NONE) +func _input(event: InputEvent) -> void: + if event is InputEventKey: + handleTowerShortCuts(event) + + func handle_player_controls() -> Node3D: var space_state : PhysicsDirectSpaceState3D = get_world_3d().direct_space_state var mouse_pos : Vector2 = get_viewport().get_mouse_position() @@ -104,7 +109,7 @@ func moveTower(tower: Tower, toPosition: Vector3) -> void: EventBus.team_in_rest_changed.emit(buildedTower - inAction) -func selectTower(towerType: Tower.TYPE): +func onTowerSelect(towerType: Tower.TYPE): # Hide current not builded tower if selected_tower && not selected_tower.builded: selected_tower.visible = false @@ -118,3 +123,27 @@ func selectTower(towerType: Tower.TYPE): else: selected_tower = Game.initTower(towerType) add_child(selected_tower) + + +func selectTower(towerType: Tower.TYPE, force : bool = false) -> void: + if towerType && (force || not selected_tower || selected_tower.builded): + EventBus.tower_selected.emit(towerType) + + +func handleTowerShortCuts(event: InputEventKey) -> void: + if event.pressed: + return + + var towerType : Tower.TYPE = Tower.TYPE.NONE + match event.physical_keycode: + KEY_Q: towerType = Tower.TYPE.PIERRE + KEY_W: towerType = Tower.TYPE.ALINE + KEY_E: towerType = Tower.TYPE.MAXENCE + KEY_R: towerType = Tower.TYPE.VICTORIA + KEY_A: towerType = Tower.TYPE.EVAN + KEY_S: towerType = Tower.TYPE.ALEX + KEY_D: towerType = Tower.TYPE.GERALDINE + #KEY_F: towerType = Tower.TYPE + + if Game.allowedTowers.has(towerType): + selectTower(towerType, true) diff --git a/UI/gui.gd b/UI/gui.gd index 9766e6c..ec95e7e 100644 --- a/UI/gui.gd +++ b/UI/gui.gd @@ -16,6 +16,7 @@ func _ready() -> void: Game.allowed_tower_has_change.connect(addTowerButtonNodes) Game.cube_integrity_changed.connect(func(): cubeIntegrity.value = Game.healthPercentage) Game.money_changed.connect(func(): %LabelMoney.text = "%d €" % Game.money) + EventBus.wave_has_change.connect(func(wave): %WaveNumber.text = "Wave N°%d" % wave) %NextWaveBtn.pressed.connect(EventBus.lauch_next_wave.emit) diff --git a/UI/gui.tscn b/UI/gui.tscn index f93da4c..073ae3a 100644 --- a/UI/gui.tscn +++ b/UI/gui.tscn @@ -95,6 +95,16 @@ theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1) text = "0" horizontal_alignment = 2 +[node name="WaveNumber" type="Label" parent="HBoxContainer/InfoPanel/MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1) + +[node name="WaveCooldown" type="Label" parent="HBoxContainer/InfoPanel/MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1) + [node name="CubeIntegrity" type="ProgressBar" parent="HBoxContainer"] unique_name_in_owner = true custom_minimum_size = Vector2(10, 5) @@ -253,10 +263,3 @@ size_flags_vertical = 0 [connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/QuitLevelBtn" to="." method="quitLevel"] [connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/QuitGameBtn" to="." method="quitGame"] [connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/TowerButton" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/TowerButton" method="buttonToggled"] -[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25818" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25818" method="buttonToggled"] -[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25819" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25819" method="buttonToggled"] -[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25820" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25820" method="buttonToggled"] -[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25821" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25821" method="buttonToggled"] -[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25822" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25822" method="buttonToggled"] -[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25823" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25823" method="buttonToggled"] -[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25824" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@25824" method="buttonToggled"] diff --git a/UI/gui_button.gd b/UI/gui_button.gd index d4b7ddb..dc8edf4 100644 --- a/UI/gui_button.gd +++ b/UI/gui_button.gd @@ -3,42 +3,31 @@ extends Button class_name GuiButton -enum TYPE { BASIC, TOWER, UPGRADE } - - -var type : TYPE = TYPE.BASIC - - -var towerType : Tower.TYPE : - set(value): - towerType = value - if towerType != Tower.TYPE.NONE: - type = TYPE.TOWER - toggle_mode = true - add_theme_stylebox_override("pressed", GameStyleBoxFlat.createWithColor(GameColor.COLOR.SELECTED)) - EventBus.tower_changed.connect(towerChanged) - EventBus.tower_selected.connect(func(_type): set_pressed_no_signal(_type == towerType)) - if type == TYPE.UPGRADE: - EventBus.tower_upgraded.connect(upgradeTower) - - -func upgradeTower(_towerType : Tower.TYPE, upgrade : TowerUpgrade) -> void: - pass - - +var towerPrice : int +var towerType : Tower.TYPE = Tower.TYPE.NONE @export var texture : Texture2D : set(value): texture = value $TextureRect.texture = texture +func _ready() -> void: + if towerType == Tower.TYPE.NONE: + return + + toggle_mode = true + add_theme_stylebox_override("pressed", GameStyleBoxFlat.createWithColor(GameColor.COLOR.SELECTED)) + EventBus.tower_changed.connect(towerChanged) + EventBus.tower_selected.connect(func(_type): set_pressed_no_signal(_type == towerType)) + + func buttonToggled(state : bool) -> void: - if type == TYPE.TOWER: + if towerType != Tower.TYPE.NONE: EventBus.tower_selected.emit(towerType if state else Tower.TYPE.NONE) func towerChanged(tower : Tower) -> void : - if tower.type == towerType: + if tower.type == towerType && tower.builded: $EnergyBar.value = tower.energy $EnergyBar.max_value = tower.max_energy $EnergyBar.visible = tower.builded diff --git a/Upgrades/Upgrade.gd b/Upgrades/Upgrade.gd index 267e145..20f517e 100644 --- a/Upgrades/Upgrade.gd +++ b/Upgrades/Upgrade.gd @@ -39,7 +39,7 @@ func upgradeUpgrade() -> void: func canUpgrade(): - return not isLevelMax && Game.money > cost + return not isLevelMax && Game.money >= cost func getNextValue(oldValue):