chore: UX + many minor fixes

This commit is contained in:
Varylios 2025-09-06 17:32:46 +02:00
parent 4643f1de55
commit fffb13a27f
9 changed files with 82 additions and 47 deletions

View file

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

View file

@ -62,7 +62,7 @@ func win():
func spendMoney(amount : int) -> bool:
if money > amount:
if money >= amount:
money -= amount
return true
return false

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -39,7 +39,7 @@ func upgradeUpgrade() -> void:
func canUpgrade():
return not isLevelMax && Game.money > cost
return not isLevelMax && Game.money >= cost
func getNextValue(oldValue):