diff --git a/Levels/Scripts/WorldManager.gd b/Levels/Scripts/WorldManager.gd index 2a60393..e214dc2 100644 --- a/Levels/Scripts/WorldManager.gd +++ b/Levels/Scripts/WorldManager.gd @@ -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 diff --git a/Towers/Scenes/pierre.tscn b/Towers/Scenes/pierre.tscn index ee7a31a..c9f5e3b 100644 --- a/Towers/Scenes/pierre.tscn +++ b/Towers/Scenes/pierre.tscn @@ -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"] diff --git a/Towers/TowerManager.gd b/Towers/TowerManager.gd index 78bae67..a452707 100644 --- a/Towers/TowerManager.gd +++ b/Towers/TowerManager.gd @@ -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"): diff --git a/UI/TowerPanel.gd b/UI/TowerPanel.gd index 511b0e3..25a1564 100644 --- a/UI/TowerPanel.gd +++ b/UI/TowerPanel.gd @@ -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) diff --git a/UI/UpgradeButton.gd b/UI/UpgradeButton.gd new file mode 100644 index 0000000..fd36f90 --- /dev/null +++ b/UI/UpgradeButton.gd @@ -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() diff --git a/UI/UpgradeButton.gd.uid b/UI/UpgradeButton.gd.uid new file mode 100644 index 0000000..1dbb522 --- /dev/null +++ b/UI/UpgradeButton.gd.uid @@ -0,0 +1 @@ +uid://bjetiiimo62du diff --git a/UI/gui.tscn b/UI/gui.tscn index 82e9f23..b61b376 100644 --- a/UI/gui.tscn +++ b/UI/gui.tscn @@ -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"] diff --git a/UI/upgrade_button.gd b/UI/upgrade_button.gd deleted file mode 100644 index b29b41a..0000000 --- a/UI/upgrade_button.gd +++ /dev/null @@ -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() diff --git a/UI/upgrade_button.gd.uid b/UI/upgrade_button.gd.uid deleted file mode 100644 index 2ba1eaa..0000000 --- a/UI/upgrade_button.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://tn3qdhcyaxsg diff --git a/UI/upgrade_button.tscn b/UI/upgrade_button.tscn index 5a813f7..aeea310 100644 --- a/UI/upgrade_button.tscn +++ b/UI/upgrade_button.tscn @@ -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 +" diff --git a/Upgrades/TowerUpgrade.gd b/Upgrades/TowerUpgrade.gd index 4f92ade..bfe2c2d 100644 --- a/Upgrades/TowerUpgrade.gd +++ b/Upgrades/TowerUpgrade.gd @@ -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 diff --git a/Upgrades/Upgrade.gd b/Upgrades/Upgrade.gd index 5de7d17..ca8dfad 100644 --- a/Upgrades/Upgrade.gd +++ b/Upgrades/Upgrade.gd @@ -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) diff --git a/project.godot b/project.godot index 89b4c4a..0a07402 100644 --- a/project.godot +++ b/project.godot @@ -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]