feat: add upgrade UI + connect it

This commit is contained in:
Varylios 2025-09-05 19:33:56 +02:00
parent 4303b430ac
commit c467282cfb
13 changed files with 177 additions and 82 deletions

View file

@ -25,15 +25,9 @@ func _ready() -> void:
troopTimer.timeout.connect(spawnTroop)
func onProjectileShooted(projectile: Projectile, startPosition: Vector3) -> void:
add_child(projectile)
projectile.global_position = startPosition
func changeState(newState: STATE) -> void:
match newState:
STATE.SPAWN when [STATE.IDLE, STATE.WAVE_END].has(state):
state = newState
func _input(event: InputEvent) -> void:
if event.is_action_pressed("spawn_next_wave"):
changeState(STATE.SPAWN)
func _process(_delta: float) -> void:
@ -55,6 +49,12 @@ func _process(_delta: float) -> void:
state = STATE.SPAWN
func changeState(newState: STATE) -> void:
match newState:
STATE.SPAWN when [STATE.IDLE, STATE.WAVE_END].has(state):
state = newState
func spawnNextWave() -> void:
currentTroopIdx = 0
wave += 1
@ -126,3 +126,8 @@ func addMap(mapScene : PackedScene) -> void:
Game.money = level.startingMoney
Game.allowedTowers = level.allowedTowers
state = STATE.SPAWN if level.auto_start else STATE.IDLE
func onProjectileShooted(projectile: Projectile, startPosition: Vector3) -> void:
add_child(projectile)
projectile.global_position = startPosition

View file

@ -24,54 +24,54 @@ radius = 5.0
script = ExtResource("5_wvh05")
type = 0
icon = ExtResource("6_wnw3f")
text = "Upgrade"
text = "Max energy"
baseCost = 50
value = 50.0
maxLevel = -1
upgradeDirection = 1
upgradeScaleType = 0
costScaleType = 0
costModificator = 0.0
costScaleType = 1
costModificator = 10.0
metadata/_custom_type_script = "uid://bg0x4egeu17qb"
[sub_resource type="Resource" id="Resource_556ww"]
script = ExtResource("5_wvh05")
type = 1
icon = ExtResource("6_wnw3f")
text = "Upgrade"
baseCost = 50
text = "Energy regen"
baseCost = 150
value = 10.0
maxLevel = 5
upgradeDirection = 1
upgradeScaleType = 0
costScaleType = 0
costModificator = 0.0
costScaleType = 1
costModificator = 150.0
metadata/_custom_type_script = "uid://bg0x4egeu17qb"
[sub_resource type="Resource" id="Resource_wvh05"]
script = ExtResource("5_wvh05")
type = 3
icon = ExtResource("6_wnw3f")
text = "Upgrade"
baseCost = 50
text = "Damage"
baseCost = 100
value = 1.0
maxLevel = -1
upgradeDirection = 1
upgradeScaleType = 0
costScaleType = 0
costModificator = 0.0
costScaleType = 1
costModificator = 50.0
[sub_resource type="Resource" id="Resource_wnw3f"]
script = ExtResource("5_wvh05")
type = 5
icon = ExtResource("6_wnw3f")
text = "Upgrade"
text = "Cooldown"
baseCost = 2000
value = 0.2
maxLevel = 2
upgradeDirection = 1
upgradeScaleType = 0
costScaleType = 0
costScaleType = 1
costModificator = 0.0
[sub_resource type="ViewportTexture" id="ViewportTexture_r52mr"]

View file

@ -30,7 +30,7 @@ func _process(_delta: float) -> void:
if isTileFree(collider):
placeTower()
elif tower && (not selected_tower || not selected_tower.builded):
elif tower && (not selected_tower || selected_tower.builded):
EventBus.tower_selected.emit(tower.type)
if Input.is_action_just_pressed("rest"):

View file

@ -1,12 +1,15 @@
extends HBoxContainer
const upgradeBtnScene : PackedScene = preload("res://UI/upgrade_button.tscn")
var tower : Tower
func _ready() -> void:
EventBus.tower_selected.connect(onTowerSelected)
EventBus.tower_changed.connect(onEnergyChanged)
EventBus.tower_changed.connect(onTowerChange)
func onTowerSelected(towerType : Tower.TYPE) -> void:
@ -16,16 +19,31 @@ func onTowerSelected(towerType : Tower.TYPE) -> void:
return
tower = Game.towers.get(towerType)
%TowerIcon.texture = tower.icone
%TowerName.text = tower.tower_name
%TowerDamage.text = "Dmg : %d" % tower.projectileRessource.damage
%TowerCooldown.text = "cooldown : %.1f" % tower.action_cooldown
# TODO Check for better UI to display it
#%TowerBio.text = tower.bio
onEnergyChanged(tower)
visible = true
onTowerChange(tower)
if not tower.builded:
%UpgradeContainer.visible = false
return
createTowerUpgradeButton()
func onEnergyChanged(_tower : Tower) -> void:
func onTowerChange(_tower : Tower) -> void:
if _tower == tower:
%TowerIcon.texture = tower.icone
%TowerName.text = tower.tower_name
%TowerDamage.text = "Dmg : %d" % tower.projectileRessource.damage
%TowerCooldown.text = "cooldown : %.1f" % tower.action_cooldown
# TODO Check for better UI to display it
#%TowerBio.text = tower.bio
%TowerEnergy.text = "%d/%d" % [ tower.energy, tower.max_energy ]
func createTowerUpgradeButton() -> void:
%UpgradeContainer.visible = true
%UpgradeContainer.get_children().map(func(btn): btn.queue_free())
for upgrade in tower.upgrades:
prints(upgrade.baseCost, upgrade.cost)
var btn : UpgradeButton = upgradeBtnScene.instantiate()
%UpgradeContainer.add_child(btn)
btn.setData(tower, upgrade)

43
UI/UpgradeButton.gd Normal file
View file

@ -0,0 +1,43 @@
extends HBoxContainer
class_name UpgradeButton
var tower: Tower
var upgrade: TowerUpgrade
@onready var upgradeBtn : Button = $UpgradeButton
func _ready() -> void:
Game.money_changed.connect(moneyChanged)
upgradeBtn.pressed.connect(upgradeTower)
func setData(_tower: Tower, _upgrade: TowerUpgrade) -> void:
tower = _tower
upgrade = _upgrade
updateVisuals()
func upgradeTower() -> void:
if upgrade.upgrade(tower):
updateVisuals()
func updateVisuals() -> void:
$UpgradeName.text = upgrade.text
if upgrade.isLevelMax:
upgradeBtn.visible = false
$UpgradeName.text += " Lvl. max"
return
if upgrade.level:
$UpgradeName.text += " Lvl. %d" % upgrade.level
upgradeBtn.text = "%d" % upgrade.cost
if not upgrade.canUpgrade():
upgradeBtn.disabled = true
func moneyChanged() -> void:
upgradeBtn.disabled = not upgrade.canUpgrade()

1
UI/UpgradeButton.gd.uid Normal file
View file

@ -0,0 +1 @@
uid://bjetiiimo62du

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=16 format=3 uid="uid://p6a6rb7sgeqd"]
[gd_scene load_steps=15 format=3 uid="uid://p6a6rb7sgeqd"]
[ext_resource type="Script" uid="uid://bhylcok1l6eke" path="res://UI/gui.gd" id="2_sac4j"]
[ext_resource type="Script" uid="uid://blnmjxmusrsa7" path="res://UI/GameStyleBoxFlat.gd" id="4_h4fn5"]
@ -10,7 +10,6 @@
[ext_resource type="Script" uid="uid://s4t3oa4v87xe" path="res://UI/TowerPanel.gd" id="9_3lugd"]
[ext_resource type="Texture2D" uid="uid://b4m5ejfdrm8s0" path="res://Assets/Icones/power-button.svg" id="9_reygo"]
[ext_resource type="Texture2D" uid="uid://uptdcefxlv4c" path="res://Assets/Icones/ppdf_bio_image_placeholder_2.png" id="10_parkk"]
[ext_resource type="Script" uid="uid://bjetiiimo62du" path="res://UI/UpgradeButton.gd" id="11_parkk"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_h4fn5"]
bg_color = Color(0.933333, 0.933333, 0.933333, 1)
@ -233,37 +232,31 @@ mouse_filter = 1
theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1)
horizontal_alignment = 2
[node name="UpgradeContainer" type="PanelContainer" parent="TowerInfoPanel"]
[node name="PanelContainer" type="PanelContainer" parent="TowerInfoPanel"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_3lugd")
[node name="MarginContainer" type="MarginContainer" parent="TowerInfoPanel/UpgradeContainer"]
[node name="MarginContainer" type="MarginContainer" parent="TowerInfoPanel/PanelContainer"]
layout_mode = 2
theme_override_constants/margin_left = 10
theme_override_constants/margin_top = 10
theme_override_constants/margin_right = 10
theme_override_constants/margin_bottom = 10
[node name="ButtonContainer" type="GridContainer" parent="TowerInfoPanel/UpgradeContainer/MarginContainer"]
[node name="UpgradeContainer" type="GridContainer" parent="TowerInfoPanel/PanelContainer/MarginContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 0
columns = 4
[node name="Button" type="Button" parent="TowerInfoPanel/UpgradeContainer/MarginContainer/ButtonContainer"]
layout_mode = 2
theme_override_font_sizes/font_size = 20
text = "Améliorer"
script = ExtResource("11_parkk")
[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/CubeBtn" to="." method="_on_button_cube_pressed"]
[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@71848" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71848" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71849" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71849" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71850" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71850" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71851" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71851" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71852" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71852" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71853" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71853" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71854" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@71854" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38055" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38055" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38056" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38056" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38057" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38057" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38058" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38058" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38059" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38059" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38060" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38060" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38061" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@38061" method="buttonToggled"]

View file

@ -1,10 +0,0 @@
extends Button
class_name UpgradeButton
@export var upgrade : Upgrade
@export var towerType : Tower.TYPE
func _on_pressed() -> void:
EventBus.tower_upgraded.emit(towerType, upgrade)
queue_free()

View file

@ -1 +0,0 @@
uid://tn3qdhcyaxsg

View file

@ -1,3 +1,23 @@
[gd_scene format=3 uid="uid://cpdr2a3xqscfa"]
[gd_scene load_steps=2 format=3 uid="uid://dfp5q5gek4ve7"]
[node name="UpgradeButton" type="Button"]
[ext_resource type="Script" uid="uid://bjetiiimo62du" path="res://UI/UpgradeButton.gd" id="1_xoo7y"]
[node name="HBoxContainer" type="HBoxContainer"]
offset_right = 58.0
offset_bottom = 34.0
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("1_xoo7y")
[node name="UpgradeName" type="Label" parent="."]
layout_mode = 2
size_flags_horizontal = 3
theme_override_colors/font_color = Color(0, 0, 0, 1)
theme_override_font_sizes/font_size = 24
text = "test"
[node name="UpgradeButton" type="Button" parent="."]
layout_mode = 2
theme_override_font_sizes/font_size = 18
text = "Lvl. 0
"

View file

@ -15,16 +15,19 @@ enum TYPE {
@export var type : TYPE
func upgrade(tower: Tower) -> void:
func upgrade(tower: Tower) -> bool:
if not canUpgrade():
return false
match type:
TYPE.MAX_ENERGY: upgradeTowerProperty(tower, "max_energy")
TYPE.ENERGY_REGEN: upgradeTowerProperty(tower, "energy_regen")
TYPE.ENERGY_COST: upgradeTowerProperty(tower, "energy_cost")
TYPE.DAMAGE: upgradeTowerProperty(tower.projectileRessource, "damage")
TYPE.AOE_INCREASE: upgradeTowerProperty(tower.projectileRessource.damageArea, "radius")
TYPE.COOLDOWN: upgradeTowerProperty(tower, "action_cooldown")
TYPE.MAX_ENERGY: upgradeProperty(tower, "max_energy")
TYPE.ENERGY_REGEN: upgradeProperty(tower, "energy_regen")
TYPE.ENERGY_COST: upgradeProperty(tower, "energy_cost")
TYPE.DAMAGE: upgradeProperty(tower.projectileRessource, "damage")
TYPE.AOE_INCREASE: upgradeProperty(tower.projectileRessource.damageArea, "radius")
TYPE.COOLDOWN: upgradeProperty(tower, "action_cooldown")
upgradeUpgrade()
func upgradeTowerProperty(tower: Variant, property: String) -> void:
tower.set(property, getNextValue(tower.get(property)))
EventBus.tower_changed.emit(tower)
return true

View file

@ -2,35 +2,40 @@ extends Resource
class_name Upgrade
enum SCALE_TYPE { LINEAR, EXP, LOG }
enum SCALE_TYPE { NONE, LINEAR, EXP, LOG }
enum UPGRADE_DIRECTION { INCREASE = 1, DECREASE = -1 }
@export var icon : Texture2D = preload("res://Assets/Icones/medal2.png")
@export var text : String = "Upgrade"
@export var baseCost : int = 50
@export var text : String
@export var baseCost : int :
set(value):
baseCost = value
cost = value
@export_range(0.001, 999, 0.001, "hide_slider") var value : float
@export_range(-1, 100, 1, "hide_slider") var maxLevel : int = -1 ##[param -1] for infinite leveling
@export_group("Upgrade Scaling")
@export var upgradeDirection : UPGRADE_DIRECTION = UPGRADE_DIRECTION.INCREASE
@export var upgradeScaleType : SCALE_TYPE = SCALE_TYPE.LINEAR
@export var upgradeScaleType : SCALE_TYPE = SCALE_TYPE.NONE
@export var costScaleType : SCALE_TYPE = SCALE_TYPE.LINEAR
@export var costModificator : float
var cost : int = baseCost
var cost : int
var level : int = 0
var isLevelMax : bool :
get(): return maxLevel == level
func upgrade(subject) -> void:
pass
func upgradeProperty(tower: Variant, property: String) -> void:
tower.set(property, getNextValue(tower.get(property)))
func upgradeUpgrade() -> void:
cost += baseCost
level += 1
Game.money -= cost
cost += costModificator
func canUpgrade():
@ -38,4 +43,6 @@ func canUpgrade():
func getNextValue(oldValue):
return oldValue + (value * upgradeDirection * level)
match upgradeScaleType:
SCALE_TYPE.NONE: return oldValue + value
SCALE_TYPE.LINEAR: return oldValue + (value * upgradeDirection * level)

View file

@ -52,6 +52,17 @@ folder_colors={
[input]
ui_accept={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
ui_select={
"deadzone": 0.5,
"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":3,"pressure":0.0,"pressed":false,"script":null)
]
}
build={
"deadzone": 0.2,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(344, 20),"global_position":Vector2(353, 68),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
@ -62,6 +73,11 @@ rest={
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(263, 18),"global_position":Vector2(272, 66),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null)
]
}
spawn_next_wave={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
]
}
[layer_names]