Compare commits

...

2 commits

Author SHA1 Message Date
Varylios
6785e5ae87 wip: GUI for upgrade 2025-09-03 20:52:14 +02:00
Varylios
6cbd7c54dd feat: add upgrade logic 2025-09-03 18:42:28 +02:00
45 changed files with 352 additions and 226 deletions

View file

@ -14,12 +14,12 @@ signal tower_builded(tower : Tower)
## [b]Emitter[/b] : [UpgradeButton][br]
## [b]Subscriber[/b] : [Tower]
signal tower_upgraded(tower_to_upgrade : String, upgrade : TowerUpgrade)
signal tower_upgraded(towerType : Tower.TYPE, upgrade : TowerUpgrade)
## [b]Emitter[/b] : [TheCube][br]
## [b]Subscriber[/b] : cube_integrity.gd
signal cube_integrity_changed(_value : int, _max_value : int)
## [b]Subscriber[/b] : gui.gd
signal cube_integrity_changed(newHealth : int)
## [b]Emitter[/b] : [TheCube][br]
@ -41,10 +41,10 @@ signal tower_count_changed(count : int)
## [b]Subscriber[/b] : gui.gd
signal team_in_action_changed(count : int)
## [b]Emitter[/b] : [TowerManager][br]
## [b]Subscriber[/b] : gui.gd, [TheCube]
signal team_in_rest_changed(count : int)
## [b]Emitter[/b] : [TowerManager][br]
## [b]Subscriber[/b] : gui.gd
signal team_in_rest_changed(count : int)
## [b]Emitter[/b] : [Projectile][br]
@ -61,30 +61,27 @@ signal money_received(amount : int)
## [b]Subscriber[/b] : [TheCube]
signal money_spent(amount : int)
## [b]Emitter[/b] : [WorldManager][br]
## [b]Subscriber[/b] : [TheCube]
signal player_has_won()
## [b]Emitter[/b] : [TheCube][br]
## [b]Subscriber[/b] : [WorldManager]
signal player_defeated()
## [b]Emitter[/b] : [TowerManager][br]
## [b]Subscriber[/b] : [code]null[/code]
signal open_shop()
## [b]Emitter[/b] : [TowerManager][br]
## [b]Subscriber[/b] : [code]null[/code]
signal close_shop()
## [b]Emitter[/b] : [Tower][br]
## [b]Subscriber[/b] : [GuiButton]
signal energy_has_changed(tower : Tower)
## [b]Emitter[/b] : [WorldManager], [Level][br]
## [b]Subscriber[/b] : gui.gd
signal allowedTowerHasChange(allowedTowers : Array[Tower.TYPE])
## [b]Emitter[/b] : [WorldManager][br]
## [b]Subscriber[/b] : [code]null[/code]
signal waveHasChange(waveNumber : int)

View file

@ -1,16 +1,18 @@
@tool
class_name Game
## COLORS ##
enum COLOR { HEALTH, ENERGY, SELECTED, SECONDARY }
enum COLOR { HEALTH, ENERGY, SELECTED, SECONDARY, BACKGROUND_PANEL }
const COLOR_HEALTH : Color = Color(0.921569, 0.419608, 0.415686, 1)
const COLOR_ENERGY : Color = Color(0.921569, 0.890196, 0.415686, 1)
const COLOR_SELECTED : Color = Color(0.721569, 0.600196, 0.355686, 1)
const COLOR_SECONDARY : Color = Color(0.341, 0.082, 0.094, 0.0)
const COLOR_BACKGROUND_PANEL : Color = Color(0.933, 0.933, 0.933, 1)
const COLOR_FALLBACK : Color = Color(0.341176, 0.0823529, 0.0941176, 0)
@ -20,6 +22,7 @@ static func getColor(color : COLOR) -> Color :
COLOR.ENERGY : return COLOR_ENERGY
COLOR.SELECTED : return COLOR_SELECTED
COLOR.SECONDARY : return COLOR_SECONDARY
COLOR.BACKGROUND_PANEL : return COLOR_BACKGROUND_PANEL
_: return COLOR_FALLBACK
@ -42,13 +45,13 @@ static func _static_init() -> void:
preloadSceneInGlobal(towers, RESOURCE_TYPE.TOWER)
#preloadSceneInGlobal(enemies, ENEMY_DIR)
static func preloadSceneInGlobal(property: Dictionary, type: RESOURCE_TYPE):
var files : Array[String] = getPackedScenesPaths(type)
## [color=crimson][b]WARNING :[/b] Work only with the [enum RESOURCE_TYPE] [param TOWER][/color]
static func preloadSceneInGlobal(property: Dictionary, type: RESOURCE_TYPE) -> void:
if type != RESOURCE_TYPE.TOWER:
return
var files : Array[String] = getPackedScenesPaths(type)
for file in files:
var scene = load(file)
if scene:

View file

@ -1,7 +1,7 @@
[gd_scene load_steps=9 format=3 uid="uid://bph5gpic1arod"]
[ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://Levels/Scripts/WorldManager.gd" id="1_tk0a6"]
[ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Towers/Scripts/TowerManager.gd" id="2_7pixp"]
[ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Towers/TowerManager.gd" id="2_7pixp"]
[ext_resource type="Texture2D" uid="uid://o83munu8dibp" path="res://Assets/Icones/kenney_game_icons_vector.svg" id="3_6dp1o"]
[ext_resource type="PackedScene" uid="uid://p6a6rb7sgeqd" path="res://UI/gui.tscn" id="6_ebgat"]

View file

@ -6,7 +6,7 @@ class_name TheCube
var health : int = max_health :
set(value):
health = value
EventBus.cube_integrity_changed.emit(health, max_health)
EventBus.cube_integrity_changed.emit(health)
if health <= 0:
death()

View file

@ -2,7 +2,7 @@
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_lr28p"]
[ext_resource type="Texture2D" uid="uid://c4ir6y45pchpl" path="res://Assets/Icones/seahorse.svg" id="3_4yx0u"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Towers/Scripts/Upgrades/TowerUpgrade.gd" id="4_4yx0u"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/Tower/TowerUpgrade.gd" id="4_4yx0u"]
[node name="Alex" instance=ExtResource("1_lr28p")]
tower_name = "Alex"

View file

@ -2,7 +2,7 @@
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_gvvig"]
[ext_resource type="Texture2D" uid="uid://cob1lydkirn20" path="res://Assets/Icones/raccoon-head.svg" id="3_6h033"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Towers/Scripts/Upgrades/TowerUpgrade.gd" id="3_p2nb1"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/Tower/TowerUpgrade.gd" id="3_p2nb1"]
[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Towers/Projectiles/ProjectileResource.gd" id="4_ck6a3"]
[ext_resource type="Texture2D" uid="uid://315k07rsgf6t" path="res://Assets/Characters/Female1.png" id="5_l514g"]
[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="5_lhd8w"]

View file

@ -3,7 +3,7 @@
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_yctfx"]
[ext_resource type="Texture2D" uid="uid://dwwgho6f8f4kj" path="res://Assets/Icones/penguin.svg" id="2_5uh04"]
[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Towers/Projectiles/ProjectileResource.gd" id="3_gr7yf"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Towers/Scripts/Upgrades/TowerUpgrade.gd" id="4_v32j5"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/Tower/TowerUpgrade.gd" id="4_v32j5"]
[sub_resource type="Resource" id="Resource_mf185"]
script = ExtResource("3_gr7yf")

View file

@ -2,7 +2,7 @@
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_bw8ui"]
[ext_resource type="Texture2D" uid="uid://d4pdmbhhlphc" path="res://Assets/Icones/seated-mouse.svg" id="2_1pop4"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Towers/Scripts/Upgrades/TowerUpgrade.gd" id="4_nxn76"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/Tower/TowerUpgrade.gd" id="4_nxn76"]
[ext_resource type="Texture2D" uid="uid://315k07rsgf6t" path="res://Assets/Characters/Female1.png" id="5_kbhva"]
[node name="Geraldine" instance=ExtResource("1_bw8ui")]

View file

@ -3,7 +3,7 @@
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_laam8"]
[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Towers/Projectiles/ProjectileResource.gd" id="2_7fox5"]
[ext_resource type="Texture2D" uid="uid://boxdrq4nrq7hv" path="res://Assets/Icones/flamingo.svg" id="2_sciv6"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Towers/Scripts/Upgrades/TowerUpgrade.gd" id="4_l8w4i"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/Tower/TowerUpgrade.gd" id="4_l8w4i"]
[sub_resource type="SphereShape3D" id="SphereShape3D_sciv6"]
radius = 0.2

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=7 format=3 uid="uid://bj6srer7ghf7p"]
[gd_scene load_steps=8 format=3 uid="uid://bj6srer7ghf7p"]
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_s6dfo"]
[ext_resource type="Texture2D" uid="uid://bb4wihq1n1wm7" path="res://Assets/Icones/labrador-head.svg" id="2_lcjqw"]
@ -18,6 +18,9 @@ metadata/_custom_type_script = "uid://ddgbr0n8kic3y"
[sub_resource type="SphereShape3D" id="SphereShape3D_c55ds"]
radius = 5.0
[sub_resource type="ViewportTexture" id="ViewportTexture_r52mr"]
viewport_path = NodePath("EnergyBar3D/SubViewport")
[node name="Pierre" instance=ExtResource("1_s6dfo")]
tower_name = "Pierre"
tower_type = 1
@ -28,3 +31,6 @@ action_cooldown = 1.0
max_energy = 50.0
energy_regen = 5.0
energy_cost = 2.0
[node name="EnergyBar3D" parent="." index="6"]
texture = SubResource("ViewportTexture_r52mr")

View file

@ -3,7 +3,7 @@
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_ki73m"]
[ext_resource type="Texture2D" uid="uid://m6jwakrus50v" path="res://Assets/Icones/sea-star.svg" id="2_n34tq"]
[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Towers/Projectiles/ProjectileResource.gd" id="3_sf52i"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Towers/Scripts/Upgrades/TowerUpgrade.gd" id="4_uso5g"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/Tower/TowerUpgrade.gd" id="4_uso5g"]
[ext_resource type="Texture2D" uid="uid://315k07rsgf6t" path="res://Assets/Characters/Female1.png" id="5_2rqsg"]
[sub_resource type="SphereShape3D" id="SphereShape3D_rbuca"]

View file

@ -1,5 +0,0 @@
extends Upgrade
class_name TowerUpgrade
func apply_upgrade(tower : Tower):
pass

View file

@ -1,7 +0,0 @@
extends TowerUpgrade
class_name TowerUpgradeActionCooldown
@export var action_cooldown_decrease : float = 0.3
func apply_upgrade(tower : Tower):
tower.action_cooldown -= action_cooldown_decrease

View file

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

View file

@ -1,7 +0,0 @@
extends TowerUpgrade
class_name TowerUpgradeEnergyRegen
@export var energy_regen_increase : int = 5
func apply_upgrade(tower : Tower):
tower.energy_regen += energy_regen_increase

View file

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

View file

@ -1,7 +0,0 @@
extends TowerUpgrade
class_name TowerUpgradeMaxEnergy
@export var max_energy_increase : int = 5
func apply_upgrade(tower : Tower):
tower.max_energy += max_energy_increase

View file

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

View file

@ -1,7 +0,0 @@
extends Resource
class_name Upgrade
@export var icon : Texture2D = preload("res://Assets/Icones/medal2.png")
@export var text : String = "Upgrade"
var condition : Upgrade

View file

@ -55,13 +55,13 @@ var is_rest : bool = true:
else:
in_action()
@export_category("Upgrades")
var tower_upgrades : Array[TowerUpgrade]
@export var tower_shop : Array[TowerUpgrade]
@export var upgrades : Array[TowerUpgrade]
func _ready() -> void:
EventBus.tower_upgraded.connect(_on_EventBus_tower_upgraded)
EventBus.tower_upgraded.connect(apply_upgrade)
EventBus.energy_has_changed.emit(self)
# WARNING : Prevent .tscn file to be modified by the load of the scene in editor
if not Engine.is_editor_hint():
@ -85,27 +85,13 @@ func _process(_delta: float) -> void:
func get_available_upgrades() -> Array[TowerUpgrade]:
var available_upgrades : Array[TowerUpgrade]
#Check every upgrades in shop
for shop_upgrade in tower_shop:
#If they have no conditions, they are available
if shop_upgrade.condition == null:
available_upgrades.append(shop_upgrade)
continue
else:
# If they have a condition, check for the previously bought upgrades
for owned_upgrade in tower_upgrades: #Check
if shop_upgrade.condition == owned_upgrade:
available_upgrades.append(shop_upgrade)
return available_upgrades
return upgrades.filter(func(u: TowerUpgrade): u.isLevelMax)
func apply_upgrade(upgrade : TowerUpgrade):
upgrade.apply_upgrade(self)
if tower_shop.has(upgrade):
tower_shop.erase(upgrade)
tower_upgrades.append(upgrade)
else:
printerr("Upgrade already bought")
func apply_upgrade(towerType : Tower.TYPE, upgrade : TowerUpgrade):
## TODO DANGER connect cube money
if towerType == tower_type && upgrade.canUpgrade(100):
upgrade.upgrade(self)
func shoot() -> void:
@ -172,8 +158,3 @@ func _on_cooldown_timeout() -> void:
func _on_energy_cooldown_timeout() -> void:
resting()
func _on_EventBus_tower_upgraded(tower_to_upgrade : String, upgrade : TowerUpgrade) -> void:
if tower_to_upgrade == tower_name:
apply_upgrade(upgrade)

View file

@ -5,15 +5,16 @@ class_name TowerManager
enum STATE { IDLE, PLACING }
var _state : int = STATE.IDLE
var selected_tower : Tower = null
var selected_tower_type : Tower.TYPE = Tower.TYPE.NONE
var the_cube : TheCube
@onready var cam : Camera3D = $"../Camera3D"
@onready var selection_icon : Sprite3D = $Sprite3DSelection
var towers : Dictionary
var selected_collider : CollisionObject3D
var selected_tower : Tower = null
var the_cube : TheCube
func _ready() -> void:
EventBus.tower_selected.connect(selectTower)
@ -26,18 +27,15 @@ func _process(_delta: float) -> void:
if not selected_collider:
return
if selected_collider.collision_layer == 1:
if selected_collider is Tower && selected_collider != selected_tower:
EventBus.tower_selected.emit(selected_collider.tower_type)
elif selected_collider.collision_layer == 1:
build_tower()
if selected_collider is TheCube:
EventBus.open_shop.emit()
else:
EventBus.close_shop.emit()
if Input.is_action_just_pressed("rest"):
if _state == STATE.PLACING:
quit_placing()
EventBus.close_shop.emit()
if selected_collider is Tower:
selected_collider.is_rest = true
selected_collider.global_position = Vector3.ZERO
@ -72,14 +70,6 @@ func handle_player_controls() -> void:
selected_tower.sprite.modulate = "61ff45c8" #If the tower can be placed he is green
func place_tower() -> void:
_state = STATE.PLACING
selected_tower = Game.towers.get(selected_tower_type).instantiate()
towers.set(selected_tower_type, selected_tower)
selected_tower.collision_layer = 0
add_child(selected_tower)
func quit_placing() -> void:
_state = STATE.IDLE
@ -102,31 +92,27 @@ func build_tower() -> void:
quit_placing()
selected_tower.is_rest = false
move_tower()
selected_tower.global_position = global_position
emitTeamChanges()
func selectTower(towerType : Tower.TYPE):
func selectTower(towerType: Tower.TYPE):
# Hide current not builded tower
if selected_tower && not selected_tower.builded:
selected_tower.visible = false
if towerType == selected_tower_type || towerType == Tower.TYPE.NONE:
_state = STATE.IDLE
if selected_tower && selected_tower.tower_type == towerType || towerType == Tower.TYPE.NONE:
selected_tower = null
selected_tower_type = Tower.TYPE.NONE
_state = STATE.IDLE
return
selected_tower_type = towerType
if towers.has(towerType):
_state = STATE.IDLE
elif towers.has(towerType):
selected_tower = towers.get(towerType)
selected_tower.visible = true
else:
place_tower()
func move_tower():
selected_tower.global_position = global_position
_state = STATE.PLACING
selected_tower = Game.towers.get(towerType).instantiate()
towers.set(towerType, selected_tower)
selected_tower.collision_layer = 0
add_child(selected_tower)
func emitTeamChanges() -> void:

View file

@ -1,11 +1,10 @@
[gd_scene load_steps=12 format=3 uid="uid://trg7ag3dqr2l"]
[gd_scene load_steps=11 format=3 uid="uid://trg7ag3dqr2l"]
[ext_resource type="Script" uid="uid://8kpvuurr5h5n" path="res://Towers/Scripts/Tower.gd" id="1_egfuc"]
[ext_resource type="Script" uid="uid://8kpvuurr5h5n" path="res://Towers/Tower.gd" id="1_egfuc"]
[ext_resource type="Texture2D" uid="uid://bn6ikwol6x8r0" path="res://Assets/Characters/Male1.png" id="2_egfuc"]
[ext_resource type="Texture2D" uid="uid://uptdcefxlv4c" path="res://Assets/Icones/ppdf_bio_image_placeholder_2.png" id="2_mnaic"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Towers/Scripts/Upgrades/TowerUpgrade.gd" id="3_5dr1v"]
[ext_resource type="Resource" uid="uid://c6844q5o2gjhd" path="res://Upgrades/Tower/TowerUpgradeMaxEnergy1.tres" id="3_jv31o"]
[ext_resource type="Resource" uid="uid://bus11qw5jg8yo" path="res://Upgrades/Tower/TowerUpgradeMaxEnergy2.tres" id="4_5dr1v"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/Tower/TowerUpgrade.gd" id="3_5dr1v"]
[ext_resource type="Resource" uid="uid://c6844q5o2gjhd" path="res://Upgrades/Tower/Resources/TowerMaxEnergyUpgrade.tres" id="3_jv31o"]
[ext_resource type="Script" uid="uid://blnmjxmusrsa7" path="res://UI/GameStyleBoxFlat.gd" id="8_5dr1v"]
[sub_resource type="BoxShape3D" id="BoxShape3D_egfuc"]
@ -32,7 +31,7 @@ collision_mask = 4
script = ExtResource("1_egfuc")
icone = ExtResource("2_mnaic")
bio = "Aime se promener dans l'herbe et manger des framboises. Sa petite bouille la rend trop mignonne."
tower_shop = Array[ExtResource("3_5dr1v")]([ExtResource("3_jv31o"), ExtResource("4_5dr1v")])
tower_shop = Array[ExtResource("3_5dr1v")]([ExtResource("3_jv31o")])
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.00914001, 0)

View file

@ -7,3 +7,10 @@ class_name GameStyleBoxFlat
set(value):
color = value
bg_color = Game.getColor(color)
static func createWithColor(_color : Game.COLOR) -> GameStyleBoxFlat:
var instance : GameStyleBoxFlat = GameStyleBoxFlat.new()
instance.bg_color = Game.getColor(_color)
return instance

View file

@ -1,9 +0,0 @@
extends ProgressBar
func _ready() -> void:
EventBus.cube_integrity_changed.connect(_on_EventBus_cube_integrity_changed)
value = 100
func _on_EventBus_cube_integrity_changed(_value, _max_value) -> void:
set_value(float(_value)/float(_max_value) * 100.0)

View file

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

View file

@ -1,7 +1,7 @@
@tool
extends Control
const BUTTON_QTY = 12
const BUTTON_QTY = 8
const guiButton : PackedScene = preload("res://UI/gui_button.tscn")
@ -9,27 +9,41 @@ const guiButton : PackedScene = preload("res://UI/gui_button.tscn")
@onready var moneyLabel = %LabelMoney
@onready var towerInCubeLabel = %LabelTowerInCube
@onready var towerOnTerrainLabel = %LabelTowerOnTerrain
@onready var cubeIntegrity = %CubeIntegrity
var theCube : TheCube
var allowedTowers : Array[Tower.TYPE]
func _ready() -> void:
addTowerButtonNodes()
EventBus.cube_ready.connect(cubeReady)
EventBus.allowedTowerHasChange.connect(allowedTowerHasChange)
EventBus.money_changed.connect(func(amount): moneyLabel.text = str(amount) + "")
EventBus.team_in_rest_changed.connect(func(count): towerInCubeLabel.text = str(count) + " x Zzz")
EventBus.team_in_action_changed.connect(func(count): towerOnTerrainLabel.text = str(count) + " in action")
EventBus.cube_integrity_changed.connect(updateCubeLife)
func _on_button_cube_pressed() -> void:
pass # Replace with function body.
func _on_button_quit_level_pressed() -> void:
func cubeReady(cube: TheCube) -> void:
theCube = cube
cubeIntegrity.max_value = theCube.max_health
func updateCubeLife(newHealth : int) -> void:
cubeIntegrity.value = float(newHealth) / float(theCube.max_health) * 100.0
func quitLevel() -> void:
Transition.goto("res://UI/start_menu.tscn")
func _on_button_quit_game_pressed() -> void:
func quitGame() -> void:
get_tree().quit()
@ -62,8 +76,6 @@ func createTowerButton(towerType : Tower.TYPE) -> void:
var towerBtn : GuiButton = guiButton.instantiate()
var tower : PackedScene = Game.towers.get(towerType)
towerBtn.towerType = towerType
towerBtn.hasEnergyBar = true
towerBtn.toggle_mode = true
towerBtn.tooltip_text = str(EnhancedResource.getPackedSceneProperty(tower, "name"))
towerBtn.texture = EnhancedResource.getPackedSceneProperty(tower, "icone")
towerBtn.set_meta("dynamicButton", true)

View file

@ -1,12 +1,13 @@
[gd_scene load_steps=13 format=3 uid="uid://p6a6rb7sgeqd"]
[gd_scene load_steps=14 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://dmcgoepvytnn" path="res://UI/cube_integrity.gd" id="2_sj6ny"]
[ext_resource type="Script" uid="uid://blnmjxmusrsa7" path="res://UI/GameStyleBoxFlat.gd" id="4_h4fn5"]
[ext_resource type="Theme" uid="uid://bbp4qcbwkeg7x" path="res://default_theme.tres" id="5_wpcnu"]
[ext_resource type="Texture2D" uid="uid://csl43eb7qjhe4" path="res://Assets/Icones/dog-house.svg" id="7_fffne"]
[ext_resource type="PackedScene" uid="uid://dqb5o8w7u50hc" path="res://UI/gui_button.tscn" id="7_parkk"]
[ext_resource type="Texture2D" uid="uid://dfnf26suc8yb6" path="res://Assets/Icones/sideswipe.svg" id="8_ay13l"]
[ext_resource type="Texture2D" uid="uid://dootdihg7gkoj" path="res://Assets/Icones/exit-door.svg" id="8_decjp"]
[ext_resource type="Script" uid="uid://dyhtr6g7kd1g2" path="res://UI/gui_button.gd" id="9_h4fn5"]
[ext_resource type="Texture2D" uid="uid://b4m5ejfdrm8s0" path="res://Assets/Icones/power-button.svg" id="9_reygo"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_h4fn5"]
@ -20,7 +21,10 @@ border_color = Color(0.099986, 0.099986, 0.0999859, 1)
bg_color = Color(0.727498, 0.222072, 0.249347, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3lugd"]
bg_color = Color(0.933333, 0.933333, 0.933333, 1)
bg_color = Color(0.933, 0.933, 0.933, 1)
script = ExtResource("4_h4fn5")
color = 4
metadata/_custom_type_script = "uid://blnmjxmusrsa7"
[node name="GUI" type="Control"]
layout_mode = 3
@ -40,24 +44,19 @@ anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -357.0
offset_top = -352.0
offset_left = -562.0
offset_top = -268.0
grow_horizontal = 0
grow_vertical = 0
theme_override_constants/separation = 0
[node name="InfoPanel" type="Panel" parent="HBoxContainer"]
custom_minimum_size = Vector2(189, 0)
[node name="InfoPanel" type="PanelContainer" parent="HBoxContainer"]
custom_minimum_size = Vector2(200, 0)
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_h4fn5")
[node name="MarginContainer" type="MarginContainer" parent="HBoxContainer/InfoPanel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
layout_mode = 2
theme_override_constants/margin_left = 10
theme_override_constants/margin_top = 10
theme_override_constants/margin_right = 10
@ -96,6 +95,7 @@ text = "0"
horizontal_alignment = 2
[node name="CubeIntegrity" type="ProgressBar" parent="HBoxContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(10, 5)
layout_mode = 2
size_flags_vertical = 1
@ -105,25 +105,15 @@ theme_override_styles/fill = SubResource("StyleBoxFlat_epgl5")
value = 50.0
fill_mode = 3
show_percentage = false
script = ExtResource("2_sj6ny")
[node name="ControlPanelBase" type="Panel" parent="HBoxContainer"]
custom_minimum_size = Vector2(352, 352)
[node name="ControlPanelBase" type="PanelContainer" parent="HBoxContainer"]
layout_mode = 2
theme = ExtResource("5_wpcnu")
size_flags_horizontal = 3
size_flags_vertical = 8
theme_override_styles/panel = SubResource("StyleBoxFlat_3lugd")
[node name="MarginContainer" type="MarginContainer" parent="HBoxContainer/ControlPanelBase"]
layout_mode = 1
anchors_preset = 3
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -352.0
offset_top = -352.0
grow_horizontal = 0
grow_vertical = 0
layout_mode = 2
theme_override_constants/margin_left = 10
theme_override_constants/margin_top = 10
theme_override_constants/margin_right = 10
@ -132,6 +122,8 @@ theme_override_constants/margin_bottom = 10
[node name="ButtonContainer" type="GridContainer" parent="HBoxContainer/ControlPanelBase/MarginContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 0
columns = 4
[node name="CubeBtn" parent="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer" instance=ExtResource("7_parkk")]
@ -150,6 +142,91 @@ texture = ExtResource("9_reygo")
layout_mode = 2
texture = ExtResource("8_ay13l")
[node name="TowerInfoPanel" type="HBoxContainer" parent="."]
visible = false
layout_mode = 1
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_top = -268.0
offset_right = 552.0
grow_vertical = 0
theme_override_constants/separation = 0
[node name="InfoPanel" type="PanelContainer" parent="TowerInfoPanel"]
custom_minimum_size = Vector2(200, 0)
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_h4fn5")
[node name="MarginContainer" type="MarginContainer" parent="TowerInfoPanel/InfoPanel"]
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="VBoxContainer" type="VBoxContainer" parent="TowerInfoPanel/InfoPanel/MarginContainer"]
layout_mode = 2
[node name="LabelMoney" type="Label" parent="TowerInfoPanel/InfoPanel/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 1
tooltip_text = "La thune."
mouse_filter = 1
theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1)
text = "1'000'000 €"
horizontal_alignment = 2
vertical_alignment = 2
[node name="LabelTowerInCube" type="Label" parent="TowerInfoPanel/InfoPanel/MarginContainer/VBoxContainer"]
layout_mode = 2
tooltip_text = "Le nombre de héros disponible dans le cube !"
mouse_filter = 1
theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1)
text = "0"
horizontal_alignment = 2
[node name="LabelTowerOnTerrain" type="Label" parent="TowerInfoPanel/InfoPanel/MarginContainer/VBoxContainer"]
layout_mode = 2
tooltip_text = "Le nombre de héros en action sur le terrain !"
mouse_filter = 1
theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1)
text = "0"
horizontal_alignment = 2
[node name="TowerInfoPanel" type="PanelContainer" parent="TowerInfoPanel"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
theme_override_styles/panel = SubResource("StyleBoxFlat_3lugd")
[node name="MarginContainer" type="MarginContainer" parent="TowerInfoPanel/TowerInfoPanel"]
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/TowerInfoPanel/MarginContainer"]
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 0
columns = 4
[node name="Button" type="Button" parent="TowerInfoPanel/TowerInfoPanel/MarginContainer/ButtonContainer"]
layout_mode = 2
theme_override_font_sizes/font_size = 20
text = "Améliorer"
script = ExtResource("9_h4fn5")
metadata/_custom_type_script = "uid://dyhtr6g7kd1g2"
[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="_on_button_quit_level_pressed"]
[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/QuitGameBtn" to="." method="_on_button_quit_game_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@65726" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65726" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65727" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65727" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65728" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65728" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65729" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65729" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65730" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65730" method="buttonToggled"]
[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65731" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65731" method="buttonToggled"]

View file

@ -3,19 +3,25 @@ extends Button
class_name GuiButton
enum TYPE { BASIC, TOWER }
var type : TYPE = TYPE.BASIC
var towerType : Tower.TYPE :
set(value):
towerType = value
if towerType != Tower.TYPE.NONE:
type = TYPE.TOWER
toggle_mode = true
$EnergyBar.visible = true
add_theme_stylebox_override("pressed", GameStyleBoxFlat.createWithColor(Game.COLOR.SELECTED))
EventBus.energy_has_changed.connect(towerChanged)
EventBus.tower_builded.connect(towerChanged)
EventBus.tower_selected.connect(func(type): set_pressed_no_signal(type == towerType))
EventBus.tower_selected.connect(func(_type): set_pressed_no_signal(_type == towerType))
@export var hasEnergyBar : bool = false :
set(value):
hasEnergyBar = value
$EnergyBar.visible = hasEnergyBar
@export var texture : Texture2D :
set(value):
texture = value
@ -23,7 +29,7 @@ var towerType : Tower.TYPE :
func buttonToggled(state : bool) -> void:
if towerType != Tower.TYPE.NONE:
if type == TYPE.TOWER:
EventBus.tower_selected.emit(towerType if state else Tower.TYPE.NONE)

View file

@ -2,9 +2,9 @@ extends Button
class_name UpgradeButton
@export var upgrade : Upgrade
@export var tower_to_upgrade : String
@export var towerType : Tower.TYPE
func _on_pressed() -> void:
EventBus.tower_upgraded.emit(tower_to_upgrade, upgrade)
EventBus.tower_upgraded.emit(towerType, upgrade)
queue_free()

13
Upgrades/CubeUpgrade.gd Normal file
View file

@ -0,0 +1,13 @@
extends Node
class_name CubeUpgrade
enum TYPE {
HEALTH,
HEALTH_REGEN
}
@export var type : TYPE
func upgrade() -> void:
pass

View file

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

View file

@ -0,0 +1,21 @@
[gd_resource type="Resource" script_class="TowerUpgrade" load_steps=3 format=3 uid="uid://cfyahlbi4apsj"]
[ext_resource type="Texture2D" uid="uid://dqvou7t7o1t5d" path="res://Assets/Icones/medal2.png" id="1_b7fga"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/Tower/TowerUpgrade.gd" id="2_55ej0"]
[resource]
script = ExtResource("2_55ej0")
type = 6
max_energy_increase = 5
action_cooldown_decrease = 0.3
energy_regen_increase = 5
icon = ExtResource("1_b7fga")
text = "Upgrade Cooldown"
baseCost = 50
value = 0.3
maxLevel = 5
upgradeDirection = 0
upgradeScaleType = 0
costScaleType = 0
modificator = 0.0
metadata/_custom_type_script = "uid://c12qiuxn5uw2n"

View file

@ -0,0 +1,20 @@
[gd_resource type="Resource" script_class="TowerUpgrade" load_steps=3 format=3 uid="uid://b50h2sx6xhdb2"]
[ext_resource type="Texture2D" uid="uid://dqvou7t7o1t5d" path="res://Assets/Icones/medal2.png" id="1_gcuvb"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/Tower/TowerUpgrade.gd" id="2_pn0j6"]
[resource]
script = ExtResource("2_pn0j6")
type = 1
max_energy_increase = 5
action_cooldown_decrease = 0.3
energy_regen_increase = 5
icon = ExtResource("1_gcuvb")
text = "Upgrade energy regen"
baseCost = 50
value = 5.0
maxLevel = -1
upgradeDirection = 0
upgradeScaleType = 0
costScaleType = 0
modificator = 0.0

View file

@ -0,0 +1,17 @@
[gd_resource type="Resource" script_class="TowerUpgrade" load_steps=3 format=3 uid="uid://c6844q5o2gjhd"]
[ext_resource type="Texture2D" uid="uid://dqvou7t7o1t5d" path="res://Assets/Icones/medal2.png" id="1_7aeby"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/Tower/TowerUpgrade.gd" id="2_7dqep"]
[resource]
script = ExtResource("2_7dqep")
type = 0
icon = ExtResource("1_7aeby")
text = "Upgrade"
baseCost = 50
value = 5.0
maxLevel = -1
upgradeDirection = 0
upgradeScaleType = 0
costScaleType = 0
costModificator = 0.0

View file

@ -0,0 +1,30 @@
extends Upgrade
class_name TowerUpgrade
enum TYPE {
MAX_ENERGY,
ENERGY_REGEN,
ENERGY_COST,
DAMAGE,
AOE_INCREASE,
COOLDOWN,
}
@export var type : TYPE
func upgrade(tower: Tower) -> void:
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")
upgradeUpgrade()
func upgradeTowerProperty(tower: Variant, property: String) -> void:
tower.set(property, getNextValue(tower.get(property)))

View file

@ -1,11 +0,0 @@
[gd_resource type="Resource" script_class="TowerUpgradeActionCooldown" load_steps=3 format=3 uid="uid://cfyahlbi4apsj"]
[ext_resource type="Texture2D" uid="uid://dqvou7t7o1t5d" path="res://Assets/Icones/medal2.png" id="1_5165o"]
[ext_resource type="Script" uid="uid://c12qiuxn5uw2n" path="res://Towers/Scripts/Upgrades/TowerUpgradeActionCooldown.gd" id="2_lryxk"]
[resource]
script = ExtResource("2_lryxk")
action_cooldown_decrease = 0.3
icon = ExtResource("1_5165o")
text = "Upgrade"
metadata/_custom_type_script = "uid://c12qiuxn5uw2n"

View file

@ -1,11 +0,0 @@
[gd_resource type="Resource" script_class="TowerUpgradeEnergyRegen" load_steps=3 format=3 uid="uid://b50h2sx6xhdb2"]
[ext_resource type="Texture2D" uid="uid://dqvou7t7o1t5d" path="res://Assets/Icones/medal2.png" id="1_gcuvb"]
[ext_resource type="Script" uid="uid://qxrhvv2ohy7n" path="res://Towers/Scripts/Upgrades/TowerUpgradeEnergyRegen.gd" id="2_bp3h2"]
[resource]
script = ExtResource("2_bp3h2")
energy_regen_increase = 5
icon = ExtResource("1_gcuvb")
text = "Upgrade"
metadata/_custom_type_script = "uid://qxrhvv2ohy7n"

View file

@ -1,11 +0,0 @@
[gd_resource type="Resource" script_class="TowerUpgradeMaxEnergy" load_steps=3 format=3 uid="uid://c6844q5o2gjhd"]
[ext_resource type="Texture2D" uid="uid://dqvou7t7o1t5d" path="res://Assets/Icones/medal2.png" id="1_4dpim"]
[ext_resource type="Script" uid="uid://ce3cjsuia24yk" path="res://Towers/Scripts/Upgrades/TowerUpgradeMaxEnergy.gd" id="2_475q6"]
[resource]
script = ExtResource("2_475q6")
max_energy_increase = 50
icon = ExtResource("1_4dpim")
text = "Upgrade"
metadata/_custom_type_script = "uid://ce3cjsuia24yk"

View file

@ -1,11 +0,0 @@
[gd_resource type="Resource" script_class="TowerUpgradeMaxEnergy" load_steps=3 format=3 uid="uid://bus11qw5jg8yo"]
[ext_resource type="Texture2D" uid="uid://dqvou7t7o1t5d" path="res://Assets/Icones/medal2.png" id="1_dj0mb"]
[ext_resource type="Script" uid="uid://ce3cjsuia24yk" path="res://Towers/Scripts/Upgrades/TowerUpgradeMaxEnergy.gd" id="2_8yvhd"]
[resource]
script = ExtResource("2_8yvhd")
max_energy_increase = 100
icon = ExtResource("1_dj0mb")
text = "Upgrade"
metadata/_custom_type_script = "uid://ce3cjsuia24yk"

41
Upgrades/Upgrade.gd Normal file
View file

@ -0,0 +1,41 @@
extends Resource
class_name Upgrade
enum SCALE_TYPE { 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_range(1, INF, 1, "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 costScaleType : SCALE_TYPE = SCALE_TYPE.LINEAR
@export var costModificator : float
var cost : int = baseCost
var level : int = 0
var isLevelMax : bool :
get(): return maxLevel == level
func upgrade(subject) -> void:
pass
func upgradeUpgrade() -> void:
cost += baseCost
func canUpgrade(money : int):
return isLevelMax && money > cost
func getNextValue(oldValue):
return oldValue + (value * upgradeDirection * level)

View file

@ -44,7 +44,6 @@ folder_colors={
"res://Towers/Projectiles/": "orange",
"res://Towers/Scenes": "pink",
"res://Towers/Scenes/": "pink",
"res://Towers/Scripts/": "blue",
"res://UI/": "green",
"res://Upgrades/": "purple",
"res://Waves/": "pink"