diff --git a/Globals/Game.gd b/Globals/Game.gd index 0ab9045..ec48873 100644 --- a/Globals/Game.gd +++ b/Globals/Game.gd @@ -37,6 +37,9 @@ func _ready() -> void: func _input(event: InputEvent) -> void: + if Engine.is_editor_hint(): + return + if event.is_action_pressed("pause_game"): get_tree().paused = not get_tree().paused diff --git a/Globals/Helper.gd b/Globals/Helper.gd index 908fb22..9fa04b8 100644 --- a/Globals/Helper.gd +++ b/Globals/Helper.gd @@ -1,6 +1,10 @@ @tool class_name Helper + +const confirmPopupScene : PackedScene = preload("res://UI/confirm_popup.tscn") + + const SCENE_DIR_PATTERN : String = "res://\\w+/(Scenes|Map \\d+)/$" const SCENE_FILE_PATTERN : String = "([^/]*)\\.tscn$" const RESOURCE_FILE_PATTERN : String = "([^/]*)\\.tres$" @@ -63,3 +67,16 @@ static func getFileFromDir(path : String, regexPattern : String, pathRegexPatter files.append(path + file) return files + + +static func showConfirmPopup( + text : String, + nodeToAppend : Node, + confirmCallback : Callable, + cancelCallback : Callable = func(): null +) -> void: + var confirmPopup : ConfirmPopup = confirmPopupScene.instantiate() + nodeToAppend.add_child(confirmPopup) + confirmPopup.label.text = text + confirmPopup.confirmed.connect(confirmCallback) + confirmPopup.canceled.connect(cancelCallback) diff --git a/Towers/Scenes/pierre.tscn b/Towers/Scenes/pierre.tscn index e89ea7a..6340f75 100644 --- a/Towers/Scenes/pierre.tscn +++ b/Towers/Scenes/pierre.tscn @@ -29,8 +29,8 @@ baseCost = 20 value = 10.0 maxLevel = 3 upgradeDirection = 1 -upgradeScaleType = 1 -costScaleType = 1 +upgradeScaleType = 0 +costScaleType = 0 costModificator = 30.0 metadata/_custom_type_script = "uid://bg0x4egeu17qb" @@ -43,8 +43,8 @@ baseCost = 50 value = 2.0 maxLevel = 3 upgradeDirection = 1 -upgradeScaleType = 1 -costScaleType = 1 +upgradeScaleType = 0 +costScaleType = 0 costModificator = 50.0 metadata/_custom_type_script = "uid://bg0x4egeu17qb" @@ -57,8 +57,8 @@ baseCost = 50 value = 2.0 maxLevel = 3 upgradeDirection = 1 -upgradeScaleType = 1 -costScaleType = 1 +upgradeScaleType = 0 +costScaleType = 0 costModificator = 50.0 [sub_resource type="Resource" id="Resource_wnw3f"] @@ -71,7 +71,7 @@ value = 0.2 maxLevel = 2 upgradeDirection = 1 upgradeScaleType = 0 -costScaleType = 1 +costScaleType = 0 costModificator = 0.0 [sub_resource type="ViewportTexture" id="ViewportTexture_r52mr"] @@ -94,3 +94,4 @@ texture = SubResource("ViewportTexture_r52mr") [node name="EnergyBar2D" parent="EnergyBar3D/SubViewport" index="0"] max_value = 25.0 +value = 25.0 diff --git a/Towers/Tower.gd b/Towers/Tower.gd index f3aed55..35ef0ae 100644 --- a/Towers/Tower.gd +++ b/Towers/Tower.gd @@ -146,11 +146,12 @@ func onBodyExited(body: Node3D) -> void: func toggleConnection(activate : bool) -> void: - if activate: + if activate && not $Range.body_entered.is_connected(onBodyEntered): $Range.body_entered.connect(onBodyEntered) $Range.body_exited.connect(onBodyExited) else: - $Range.body_entered.disconnect(onBodyEntered) - $Range.body_exited.disconnect(onBodyExited) + if $Range.body_entered.is_connected(onBodyEntered): + $Range.body_entered.disconnect(onBodyEntered) + $Range.body_exited.disconnect(onBodyExited) availableTargets.clear() target = null diff --git a/UI/ConfirmPopup.gd b/UI/ConfirmPopup.gd new file mode 100644 index 0000000..4a1cc99 --- /dev/null +++ b/UI/ConfirmPopup.gd @@ -0,0 +1,18 @@ +extends PanelContainer +class_name ConfirmPopup + + +signal confirmed +signal canceled + +@onready var label : Label = $MarginContainer/ConfirmPrompt/Label + + +func _ready() -> void: + %CancelBtn.pressed.connect(emitPressedButton.bind(canceled)) + %ConfirmBtn.pressed.connect(emitPressedButton.bind(confirmed)) + + +func emitPressedButton(state : Signal) -> void: + state.emit() + queue_free() diff --git a/UI/ConfirmPopup.gd.uid b/UI/ConfirmPopup.gd.uid new file mode 100644 index 0000000..fb573b4 --- /dev/null +++ b/UI/ConfirmPopup.gd.uid @@ -0,0 +1 @@ +uid://8c1ej1k0vbmn diff --git a/UI/confirm_popup.tscn b/UI/confirm_popup.tscn new file mode 100644 index 0000000..9d66c21 --- /dev/null +++ b/UI/confirm_popup.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=3 format=3 uid="uid://cxn3x8dq8vawa"] + +[ext_resource type="Script" uid="uid://8c1ej1k0vbmn" path="res://UI/ConfirmPopup.gd" id="1_8vkfp"] +[ext_resource type="Theme" uid="uid://bbp4qcbwkeg7x" path="res://default_theme.tres" id="1_x7bkm"] + +[node name="Panel" type="PanelContainer"] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -194.0 +offset_right = 194.0 +offset_bottom = 128.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme = ExtResource("1_x7bkm") +script = ExtResource("1_8vkfp") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 50 +theme_override_constants/margin_top = 50 +theme_override_constants/margin_right = 50 +theme_override_constants/margin_bottom = 25 + +[node name="ConfirmPrompt" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 50 + +[node name="Label" type="Label" parent="MarginContainer/ConfirmPrompt"] +layout_mode = 2 +size_flags_vertical = 6 +horizontal_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/ConfirmPrompt"] +layout_mode = 2 +theme_override_constants/separation = 50 + +[node name="ConfirmBtn" type="Button" parent="MarginContainer/ConfirmPrompt/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Confirm" + +[node name="CancelBtn" type="Button" parent="MarginContainer/ConfirmPrompt/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Cancel +" diff --git a/UI/gui.gd b/UI/gui.gd index 9ea6f37..a6024bb 100644 --- a/UI/gui.gd +++ b/UI/gui.gd @@ -21,8 +21,8 @@ func _ready() -> void: EventBus.wave_has_change.connect(onWaveChange) %NextWaveBtn.pressed.connect(EventBus.lauch_next_wave.emit) $WaveCooldown/Timer.timeout.connect(updateWaveCooldownLabel) - %QuitLevelBtn.pressed.connect(Game.quitLevel) - %QuitGameBtn.pressed.connect(Game.quitGame) + %QuitLevelBtn.pressed.connect(Helper.showConfirmPopup.bind("Quit level ?", self, Game.quitLevel)) + %QuitGameBtn.pressed.connect(Helper.showConfirmPopup.bind("Quit game ?", self, Game.quitGame)) $TowerInfoPanel.visible = false if Engine.is_editor_hint(): diff --git a/UI/gui_button.gd b/UI/gui_button.gd index 25dfbfa..f1419e6 100644 --- a/UI/gui_button.gd +++ b/UI/gui_button.gd @@ -18,17 +18,22 @@ func towerLinked(value) -> void: $LeFond/Label.text = "%d €" % tower.price toggle_mode = true add_theme_stylebox_override("pressed", GameStyleBoxFlat.createWithColor(GameColor.COLOR.SELECTED)) - tower.changed.connect(towerChanged) + tower.changed.connect(onTowerChanged) tower.energy_changed.connect(func(): $EnergyBar.value = tower.energy) + Game.money_changed.connect(onMoneyChanged) EventBus.tower_selected.connect(func(_type): set_pressed_no_signal(_type == tower.type)) toggled.connect(func(state): EventBus.tower_selected.emit(tower.type if state else Tower.TYPE.NONE)) tooltip_text = tower.name texture = tower.icone - towerChanged() + onTowerChanged() -func towerChanged() -> void : +func onTowerChanged() -> void : disabled = not tower.builded && Game.money < tower.price $EnergyBar.max_value = tower.max_energy $EnergyBar.visible = tower.builded $LeFond.visible = not tower.builded + + +func onMoneyChanged() -> void: + disabled = not tower.builded && Game.money < tower.price diff --git a/Upgrades/Upgrade.gd b/Upgrades/Upgrade.gd index 20f517e..5ff91a3 100644 --- a/Upgrades/Upgrade.gd +++ b/Upgrades/Upgrade.gd @@ -2,7 +2,7 @@ extends Resource class_name Upgrade -enum SCALE_TYPE { NONE, LINEAR, EXP, LOG } +enum SCALE_TYPE { LINEAR, EXP, LOG } enum UPGRADE_DIRECTION { INCREASE = 1, DECREASE = -1 } @@ -17,7 +17,7 @@ enum UPGRADE_DIRECTION { INCREASE = 1, DECREASE = -1 } @export_group("Upgrade Scaling") @export var upgradeDirection : UPGRADE_DIRECTION = UPGRADE_DIRECTION.INCREASE -@export var upgradeScaleType : SCALE_TYPE = SCALE_TYPE.NONE +@export var upgradeScaleType : SCALE_TYPE = SCALE_TYPE.LINEAR @export var costScaleType : SCALE_TYPE = SCALE_TYPE.LINEAR @export var costModificator : float @@ -29,20 +29,22 @@ var isLevelMax : bool : func upgradeProperty(subject: Variant, property: String) -> void: - subject.set(property, getNextValue(subject.get(property))) + subject.set(property, getNextValue(subject.get(property), value, upgradeScaleType)) func upgradeUpgrade() -> void: level += 1 Game.money -= cost - cost += costModificator + cost = getNextValue(cost, costModificator, costScaleType) func canUpgrade(): return not isLevelMax && Game.money >= cost -func getNextValue(oldValue): - match upgradeScaleType: - SCALE_TYPE.NONE: return oldValue + value - SCALE_TYPE.LINEAR: return oldValue + (value * upgradeDirection * level) +func getNextValue(oldValue, baseValue, scaleType : SCALE_TYPE): + match scaleType: + SCALE_TYPE.LINEAR: return oldValue + value + _: + push_warning("Upgrade scale type not defined !") + return oldValue