add resource for projectile
This commit is contained in:
parent
26391cd7b2
commit
a8fd2a4229
24 changed files with 160 additions and 143 deletions
|
|
@ -3,11 +3,11 @@ extends Node
|
||||||
|
|
||||||
|
|
||||||
## [b]Emitter[/b] : [method TowerButton._ready][br]
|
## [b]Emitter[/b] : [method TowerButton._ready][br]
|
||||||
## [b]Subscriber[/b] : [method PlayerManager._init]
|
## [b]Subscriber[/b] : [method TowerManager._init]
|
||||||
signal tower_selected(towerType : Tower.TYPE)
|
signal tower_selected(towerType : Tower.TYPE)
|
||||||
|
|
||||||
|
|
||||||
## [b]Emitter[/b] : [PlayerManager][br]
|
## [b]Emitter[/b] : [TowerManager][br]
|
||||||
## [b]Subscriber[/b] hero_icon.gd:
|
## [b]Subscriber[/b] hero_icon.gd:
|
||||||
signal tower_builded(tower : Tower)
|
signal tower_builded(tower : Tower)
|
||||||
|
|
||||||
|
|
@ -27,16 +27,16 @@ signal cube_integrity_changed(_value : int, _max_value : int)
|
||||||
signal money_changed(_value : int)
|
signal money_changed(_value : int)
|
||||||
|
|
||||||
|
|
||||||
## [b]Emitter[/b] : [PlayerManager][br]
|
## [b]Emitter[/b] : [TowerManager][br]
|
||||||
## [b]Subscriber[/b] : label_team.gd
|
## [b]Subscriber[/b] : label_team.gd
|
||||||
signal tower_count_changed(_value : int)
|
signal tower_count_changed(_value : int)
|
||||||
|
|
||||||
|
|
||||||
## [b]Emitter[/b] : [PlayerManager][br]
|
## [b]Emitter[/b] : [TowerManager][br]
|
||||||
## [b]Subscriber[/b] : label_team.gd, label_tower_on_terrain.gd
|
## [b]Subscriber[/b] : label_team.gd, label_tower_on_terrain.gd
|
||||||
signal team_in_action_changed(_value : int)
|
signal team_in_action_changed(_value : int)
|
||||||
|
|
||||||
## [b]Emitter[/b] : [PlayerManager][br]
|
## [b]Emitter[/b] : [TowerManager][br]
|
||||||
## [b]Subscriber[/b] : label_tower_in_cube[TheCube]
|
## [b]Subscriber[/b] : label_tower_in_cube[TheCube]
|
||||||
signal team_in_rest_changed(_value : int)
|
signal team_in_rest_changed(_value : int)
|
||||||
|
|
||||||
|
|
@ -52,7 +52,7 @@ signal projectile_shooted(_value : Projectile)
|
||||||
signal money_received(_value : int)
|
signal money_received(_value : int)
|
||||||
|
|
||||||
|
|
||||||
## [b]Emitter[/b] : [PlayerManager][br]
|
## [b]Emitter[/b] : [TowerManager][br]
|
||||||
## [b]Subscriber[/b] : [TheCube]
|
## [b]Subscriber[/b] : [TheCube]
|
||||||
signal money_spent(_value : int)
|
signal money_spent(_value : int)
|
||||||
|
|
||||||
|
|
@ -64,11 +64,11 @@ signal player_has_won()
|
||||||
## [b]Subscriber[/b] : [WaveManager]
|
## [b]Subscriber[/b] : [WaveManager]
|
||||||
signal player_defeated()
|
signal player_defeated()
|
||||||
|
|
||||||
## [b]Emitter[/b] : [PlayerManager][br]
|
## [b]Emitter[/b] : [TowerManager][br]
|
||||||
## [b]Subscriber[/b] : [code]null[/code]
|
## [b]Subscriber[/b] : [code]null[/code]
|
||||||
signal open_shop()
|
signal open_shop()
|
||||||
|
|
||||||
## [b]Emitter[/b] : [PlayerManager][br]
|
## [b]Emitter[/b] : [TowerManager][br]
|
||||||
## [b]Subscriber[/b] : [code]null[/code]
|
## [b]Subscriber[/b] : [code]null[/code]
|
||||||
signal close_shop()
|
signal close_shop()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,30 +1,10 @@
|
||||||
[gd_resource type="Resource" script_class="Level" load_steps=3 format=3 uid="uid://hlv6kd67wipi"]
|
[gd_resource type="Resource" script_class="Level" load_steps=3 format=3 uid="uid://hlv6kd67wipi"]
|
||||||
|
|
||||||
[sub_resource type="GDScript" id="GDScript_5jnuq"]
|
[ext_resource type="Script" uid="uid://cuhq6u67cbbqm" path="res://Scripts/Level/Level.gd" id="1_e3k30"]
|
||||||
script/source = "@tool
|
[ext_resource type="Script" uid="uid://chu8s12rtdeqx" path="res://Scripts/Level/Wave.gd" id="2_8ao5l"]
|
||||||
extends Resource
|
|
||||||
class_name Level
|
|
||||||
|
|
||||||
@export var waves : Array[Wave]
|
|
||||||
@export var auto_start : bool = false
|
|
||||||
@export var allowedTowers : Array[Tower.TYPES] : set = allowedTowersHasChanged
|
|
||||||
|
|
||||||
|
|
||||||
func allowedTowersHasChanged(value) -> void:
|
|
||||||
allowedTowers = value
|
|
||||||
if Engine.is_editor_hint():
|
|
||||||
EventBus.allowedTowerHasChange.emit(allowedTowers)
|
|
||||||
"
|
|
||||||
|
|
||||||
[sub_resource type="GDScript" id="GDScript_h3rs5"]
|
|
||||||
script/source = "extends Resource
|
|
||||||
class_name Wave
|
|
||||||
|
|
||||||
@export var troops : Array[Troop]
|
|
||||||
"
|
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
script = SubResource("GDScript_5jnuq")
|
script = ExtResource("1_e3k30")
|
||||||
waves = Array[SubResource("GDScript_h3rs5")]([])
|
waves = Array[ExtResource("2_8ao5l")]([])
|
||||||
auto_start = false
|
auto_start = false
|
||||||
allowedTowers = Array[int]([])
|
allowedTowers = Array[int]([])
|
||||||
|
|
|
||||||
|
|
@ -4,3 +4,8 @@ var selected_collider : CollisionObject3D
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
$WaveManager.spawn_next_wave()
|
$WaveManager.spawn_next_wave()
|
||||||
|
EventBus.projectile_shooted.connect(onProjectileShooted)
|
||||||
|
|
||||||
|
|
||||||
|
func onProjectileShooted(projectile : Projectile) -> void:
|
||||||
|
add_child(projectile)
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,12 @@
|
||||||
[gd_scene load_steps=14 format=3 uid="uid://ky0uewndeuwv"]
|
[gd_scene load_steps=13 format=3 uid="uid://ky0uewndeuwv"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://Levels/world.gd" id="1_fj7yv"]
|
[ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://Levels/world.gd" id="1_fj7yv"]
|
||||||
[ext_resource type="Texture2D" uid="uid://o83munu8dibp" path="res://Assets/Icones/kenney_game_icons_vector.svg" id="3_ikoig"]
|
[ext_resource type="Texture2D" uid="uid://o83munu8dibp" path="res://Assets/Icones/kenney_game_icons_vector.svg" id="3_ikoig"]
|
||||||
[ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Scripts/PlayerManager.gd" id="3_ju8gl"]
|
[ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Scripts/TowerManager.gd" id="3_ju8gl"]
|
||||||
[ext_resource type="Script" uid="uid://tpon511km4al" path="res://Scripts/WaveManager.gd" id="5_036b0"]
|
[ext_resource type="Script" uid="uid://tpon511km4al" path="res://Scripts/WaveManager.gd" id="5_036b0"]
|
||||||
[ext_resource type="Resource" uid="uid://ob41fnhkjr3o" path="res://Levels/level_1.tres" id="8_44brb"]
|
[ext_resource type="Resource" uid="uid://ob41fnhkjr3o" path="res://Levels/level_1.tres" id="8_44brb"]
|
||||||
[ext_resource type="PackedScene" uid="uid://gp46cl8euhyf" path="res://Levels/map_1.tscn" id="8_rljl1"]
|
[ext_resource type="PackedScene" uid="uid://gp46cl8euhyf" path="res://Levels/map_1.tscn" id="8_rljl1"]
|
||||||
[ext_resource type="PackedScene" uid="uid://p6a6rb7sgeqd" path="res://UI/gui.tscn" id="12_ikoig"]
|
[ext_resource type="PackedScene" uid="uid://p6a6rb7sgeqd" path="res://UI/gui.tscn" id="12_ikoig"]
|
||||||
[ext_resource type="Script" uid="uid://xkk2pxkrwsq8" path="res://bullet_container.gd" id="12_k3n1d"]
|
|
||||||
|
|
||||||
[sub_resource type="Animation" id="Animation_oyb16"]
|
[sub_resource type="Animation" id="Animation_oyb16"]
|
||||||
length = 0.001
|
length = 0.001
|
||||||
|
|
@ -114,9 +113,6 @@ light_energy = 0.0
|
||||||
|
|
||||||
[node name="GUI" parent="CanvasLayer" instance=ExtResource("12_ikoig")]
|
[node name="GUI" parent="CanvasLayer" instance=ExtResource("12_ikoig")]
|
||||||
|
|
||||||
[node name="BulletContainer" type="Node3D" parent="."]
|
|
||||||
script = ExtResource("12_k3n1d")
|
|
||||||
|
|
||||||
[node name="Towers" type="Node3D" parent="."]
|
[node name="Towers" type="Node3D" parent="."]
|
||||||
|
|
||||||
[node name="Map1" parent="." instance=ExtResource("8_rljl1")]
|
[node name="Map1" parent="." instance=ExtResource("8_rljl1")]
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,12 @@
|
||||||
[gd_scene load_steps=14 format=3 uid="uid://iqbfpj8uwgfg"]
|
[gd_scene load_steps=13 format=3 uid="uid://iqbfpj8uwgfg"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://Levels/world.gd" id="1_2lxla"]
|
[ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://Levels/world.gd" id="1_2lxla"]
|
||||||
[ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Scripts/PlayerManager.gd" id="2_8rc3q"]
|
[ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Scripts/TowerManager.gd" id="2_8rc3q"]
|
||||||
[ext_resource type="PackedScene" uid="uid://gp46cl8euhyf" path="res://Levels/map_1.tscn" id="2_i3h8e"]
|
[ext_resource type="PackedScene" uid="uid://gp46cl8euhyf" path="res://Levels/map_1.tscn" id="2_i3h8e"]
|
||||||
[ext_resource type="Texture2D" uid="uid://o83munu8dibp" path="res://Assets/Icones/kenney_game_icons_vector.svg" id="3_i3h8e"]
|
[ext_resource type="Texture2D" uid="uid://o83munu8dibp" path="res://Assets/Icones/kenney_game_icons_vector.svg" id="3_i3h8e"]
|
||||||
[ext_resource type="Script" uid="uid://tpon511km4al" path="res://Scripts/WaveManager.gd" id="4_fonyy"]
|
[ext_resource type="Script" uid="uid://tpon511km4al" path="res://Scripts/WaveManager.gd" id="4_fonyy"]
|
||||||
[ext_resource type="Resource" uid="uid://ob41fnhkjr3o" path="res://Levels/level_1.tres" id="5_o5evx"]
|
[ext_resource type="Resource" uid="uid://ob41fnhkjr3o" path="res://Levels/level_1.tres" id="5_o5evx"]
|
||||||
[ext_resource type="PackedScene" uid="uid://p6a6rb7sgeqd" path="res://UI/gui.tscn" id="6_dinfn"]
|
[ext_resource type="PackedScene" uid="uid://p6a6rb7sgeqd" path="res://UI/gui.tscn" id="6_dinfn"]
|
||||||
[ext_resource type="Script" uid="uid://xkk2pxkrwsq8" path="res://bullet_container.gd" id="7_3rsx3"]
|
|
||||||
|
|
||||||
[sub_resource type="Animation" id="Animation_oyb16"]
|
[sub_resource type="Animation" id="Animation_oyb16"]
|
||||||
length = 0.001
|
length = 0.001
|
||||||
|
|
@ -75,11 +74,11 @@ transform = Transform3D(0.998593, -0.0233153, 0.0476287, -0.00234758, 0.877843,
|
||||||
|
|
||||||
[node name="Map1" parent="." instance=ExtResource("2_i3h8e")]
|
[node name="Map1" parent="." instance=ExtResource("2_i3h8e")]
|
||||||
|
|
||||||
[node name="PlayerManager" type="Node3D" parent="."]
|
[node name="TowerManager" type="Node3D" parent="."]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.73017, 0.728414, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.73017, 0.728414, 0)
|
||||||
script = ExtResource("2_8rc3q")
|
script = ExtResource("2_8rc3q")
|
||||||
|
|
||||||
[node name="Sprite3DSelection" type="Sprite3D" parent="PlayerManager"]
|
[node name="Sprite3DSelection" type="Sprite3D" parent="TowerManager"]
|
||||||
modulate = Color(0.966071, 0.695469, 0, 1)
|
modulate = Color(0.966071, 0.695469, 0, 1)
|
||||||
pixel_size = 0.03
|
pixel_size = 0.03
|
||||||
axis = 1
|
axis = 1
|
||||||
|
|
@ -91,7 +90,7 @@ vframes = 7
|
||||||
frame = 44
|
frame = 44
|
||||||
region_rect = Rect2(703, 96, 21, 30)
|
region_rect = Rect2(703, 96, 21, 30)
|
||||||
|
|
||||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="PlayerManager"]
|
[node name="AnimationPlayer" type="AnimationPlayer" parent="TowerManager"]
|
||||||
libraries = {
|
libraries = {
|
||||||
&"": SubResource("AnimationLibrary_43wwi")
|
&"": SubResource("AnimationLibrary_43wwi")
|
||||||
}
|
}
|
||||||
|
|
@ -116,7 +115,4 @@ light_energy = 0.0
|
||||||
|
|
||||||
[node name="GUI" parent="CanvasLayer" instance=ExtResource("6_dinfn")]
|
[node name="GUI" parent="CanvasLayer" instance=ExtResource("6_dinfn")]
|
||||||
|
|
||||||
[node name="BulletContainer" type="Node3D" parent="."]
|
|
||||||
script = ExtResource("7_3rsx3")
|
|
||||||
|
|
||||||
[node name="Towers" type="Node3D" parent="."]
|
[node name="Towers" type="Node3D" parent="."]
|
||||||
|
|
|
||||||
|
|
@ -1,32 +1,20 @@
|
||||||
extends CharacterBody3D
|
extends CharacterBody3D
|
||||||
class_name Projectile
|
class_name Projectile
|
||||||
|
|
||||||
const ENEMY : int = 1
|
const TARGET_ENEMY : int = 1 ## Flag to target enemy
|
||||||
const ALLY : int = 2
|
const TARGET_ALLY : int = 2 ## Flag to target ally
|
||||||
|
|
||||||
const MINIMUN_AREA : float = .1
|
const MINIMUN_AREA : float = .1
|
||||||
|
|
||||||
@export var speed : int = 20
|
var speed : int = 20
|
||||||
@export_range(MINIMUN_AREA, 1000) var radius : float = MINIMUN_AREA
|
var isAOE : bool = false
|
||||||
@export var isAOE := false
|
var allowedTargets : int = TARGET_ENEMY
|
||||||
@export_flags("Enemies", "Alliés") var allowedTargets : int = ENEMY
|
|
||||||
|
|
||||||
|
|
||||||
@onready var projectileArea : CollisionShape3D = $Impact/ProjectileArea
|
|
||||||
@onready var projectileSize : CollisionShape3D = $Impact/ProjectileSize
|
|
||||||
|
|
||||||
|
|
||||||
var target : PhysicsBody3D
|
var target : PhysicsBody3D
|
||||||
var damage : int = 1
|
var damage : int = 1
|
||||||
var bodiesInRange : Array[Node3D]
|
|
||||||
var enemiesInRange : Array[Enemy]
|
var enemiesInRange : Array[Enemy]
|
||||||
var allyInRange : Array[Tower]
|
var allyInRange : Array[Tower]
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
enemiesInRange.append(target)
|
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta: float) -> void:
|
||||||
if is_instance_valid(target):
|
if is_instance_valid(target):
|
||||||
velocity = global_position.direction_to(target.global_position) * speed
|
velocity = global_position.direction_to(target.global_position) * speed
|
||||||
|
|
@ -38,7 +26,6 @@ func _physics_process(delta: float) -> void:
|
||||||
|
|
||||||
|
|
||||||
func onBodyEnteredDamageArea(body: Node3D) -> void:
|
func onBodyEnteredDamageArea(body: Node3D) -> void:
|
||||||
print(body.get_class())
|
|
||||||
if isAOE && targetable(body):
|
if isAOE && targetable(body):
|
||||||
if body is Enemy:
|
if body is Enemy:
|
||||||
enemiesInRange.append(body)
|
enemiesInRange.append(body)
|
||||||
|
|
@ -46,7 +33,7 @@ func onBodyEnteredDamageArea(body: Node3D) -> void:
|
||||||
allyInRange.append(body)
|
allyInRange.append(body)
|
||||||
|
|
||||||
|
|
||||||
func OnBodyExitedDamageArea(body: Node3D) -> void:
|
func onBodyExitedDamageArea(body: Node3D) -> void:
|
||||||
if body is Enemy:
|
if body is Enemy:
|
||||||
enemiesInRange.erase(body)
|
enemiesInRange.erase(body)
|
||||||
if body is Tower:
|
if body is Tower:
|
||||||
|
|
@ -60,15 +47,26 @@ func onBodyCollideWithProjectile(body : Node3D) -> void:
|
||||||
|
|
||||||
func targetable(body: Node3D) -> bool:
|
func targetable(body: Node3D) -> bool:
|
||||||
if body is Enemy:
|
if body is Enemy:
|
||||||
return ENEMY & allowedTargets
|
return TARGET_ENEMY & allowedTargets
|
||||||
if body is Tower:
|
if body is Tower:
|
||||||
return ALLY & allowedTargets
|
return TARGET_ALLY & allowedTargets
|
||||||
|
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
|
||||||
func resolveDamages() -> void:
|
func resolveDamages() -> void:
|
||||||
print(enemiesInRange)
|
|
||||||
for enemy in enemiesInRange:
|
for enemy in enemiesInRange:
|
||||||
enemy.take_damage(damage)
|
enemy.take_damage(damage)
|
||||||
queue_free()
|
queue_free()
|
||||||
|
|
||||||
|
|
||||||
|
func loadProjectile(resource : ProjectileResource, startPosition: Vector3, _target: PhysicsBody3D) -> void:
|
||||||
|
target = _target
|
||||||
|
enemiesInRange.append(target)
|
||||||
|
global_position = startPosition
|
||||||
|
speed = resource.speed
|
||||||
|
isAOE = resource.isAOE
|
||||||
|
allowedTargets = resource.allowedTargets
|
||||||
|
$Sprite3D.texture = resource.sprite
|
||||||
|
if isAOE && resource.damageArea:
|
||||||
|
$DamageArea/ProjectileArea.shape = resource.damageArea
|
||||||
|
|
|
||||||
10
Projectiles/ProjectileResource.gd
Normal file
10
Projectiles/ProjectileResource.gd
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
extends Resource
|
||||||
|
class_name ProjectileResource
|
||||||
|
|
||||||
|
|
||||||
|
@export var speed : int = 20
|
||||||
|
@export var damage : int = 1
|
||||||
|
@export var isAOE : bool = false
|
||||||
|
@export_flags("Enemies", "Alliés") var allowedTargets : int = 1
|
||||||
|
@export var damageArea : Shape3D
|
||||||
|
@export var sprite : Texture2D
|
||||||
1
Projectiles/ProjectileResource.gd.uid
Normal file
1
Projectiles/ProjectileResource.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://ddgbr0n8kic3y
|
||||||
|
|
@ -7,11 +7,10 @@
|
||||||
radius = 0.1
|
radius = 0.1
|
||||||
|
|
||||||
[sub_resource type="SphereShape3D" id="SphereShape3D_dsts2"]
|
[sub_resource type="SphereShape3D" id="SphereShape3D_dsts2"]
|
||||||
radius = 1.5
|
radius = 0.1
|
||||||
|
|
||||||
[node name="Projectile" type="CharacterBody3D"]
|
[node name="Projectile" type="CharacterBody3D"]
|
||||||
script = ExtResource("1_ggq0q")
|
script = ExtResource("1_ggq0q")
|
||||||
speed = 10
|
|
||||||
|
|
||||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||||
shape = SubResource("SphereShape3D_r5o86")
|
shape = SubResource("SphereShape3D_r5o86")
|
||||||
|
|
@ -34,9 +33,8 @@ collision_layer = 4
|
||||||
collision_mask = 4
|
collision_mask = 4
|
||||||
|
|
||||||
[node name="ProjectileArea" type="CollisionShape3D" parent="DamageArea"]
|
[node name="ProjectileArea" type="CollisionShape3D" parent="DamageArea"]
|
||||||
shape = SubResource("SphereShape3D_dsts2")
|
|
||||||
debug_color = Color(0.926858, 0.237749, 0.335021, 0.42)
|
debug_color = Color(0.926858, 0.237749, 0.335021, 0.42)
|
||||||
|
|
||||||
[connection signal="body_entered" from="HitBox" to="." method="onBodyCollideWithProjectile" flags=3]
|
[connection signal="body_entered" from="HitBox" to="." method="onBodyCollideWithProjectile" flags=3]
|
||||||
[connection signal="body_entered" from="DamageArea" to="." method="onBodyEnteredDamageArea"]
|
[connection signal="body_entered" from="DamageArea" to="." method="onBodyEnteredDamageArea"]
|
||||||
[connection signal="body_exited" from="DamageArea" to="." method="OnBodyExitedDamageArea"]
|
[connection signal="body_exited" from="DamageArea" to="." method="onBodyExitedDamageArea"]
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
extends Node3D
|
extends Node3D
|
||||||
class_name PlayerManager
|
class_name TowerManager
|
||||||
|
|
||||||
const towerListResource := preload("res://Towers/towers.tres")
|
const towerListResource : TowerListResource = preload("res://Towers/towers.tres")
|
||||||
|
|
||||||
enum STATE { IDLE, PLACING }
|
enum STATE { IDLE, PLACING }
|
||||||
var _state := STATE.IDLE
|
var _state : int = STATE.IDLE
|
||||||
|
|
||||||
@onready var selected_tower : Tower = null
|
@onready var selected_tower : Tower = null
|
||||||
var selected_tower_type : Tower.TYPE = Tower.TYPE.NONE
|
var selected_tower_type : Tower.TYPE = Tower.TYPE.NONE
|
||||||
|
|
||||||
@onready var cam : Camera3D = $"../Camera3D"
|
@onready var cam : Camera3D = $"../Camera3D"
|
||||||
@onready var the_cube : TheCube = %TheCube
|
@onready var the_cube : TheCube = $"../Map1/TheCube"
|
||||||
@onready var selection_icon : Sprite3D = $Sprite3DSelection
|
@onready var selection_icon : Sprite3D = $Sprite3DSelection
|
||||||
|
|
||||||
var towers : Dictionary
|
var towers : Dictionary
|
||||||
|
|
@ -11,7 +11,7 @@ var enemies_to_spawn : int = 0
|
||||||
var wave : int = 0
|
var wave : int = 0
|
||||||
var enemies_alive : int = 0
|
var enemies_alive : int = 0
|
||||||
|
|
||||||
@onready var troopTimer := $TroopTimer
|
@onready var troopTimer : Timer = $TroopTimer
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
|
@ -42,10 +42,10 @@ func spawn_troop() -> void:
|
||||||
|
|
||||||
|
|
||||||
func spawnEnemy(delay : float) -> void:
|
func spawnEnemy(delay : float) -> void:
|
||||||
var enemy := createEnemy()
|
var enemy : PathFollow3D = createEnemy()
|
||||||
|
|
||||||
if delay > 0:
|
if delay > 0:
|
||||||
var enemyTimer := createTimer(delay)
|
var enemyTimer : Timer = createTimer(delay)
|
||||||
enemyTimer.timeout.connect(
|
enemyTimer.timeout.connect(
|
||||||
func():
|
func():
|
||||||
add_child(enemy)
|
add_child(enemy)
|
||||||
|
|
@ -91,7 +91,7 @@ func clearLevel() -> void:
|
||||||
|
|
||||||
|
|
||||||
func createTimer(delay : float, oneShot = true, autoStart = true) -> Timer :
|
func createTimer(delay : float, oneShot = true, autoStart = true) -> Timer :
|
||||||
var timer := Timer.new()
|
var timer : Timer = Timer.new()
|
||||||
timer.wait_time = delay
|
timer.wait_time = delay
|
||||||
timer.one_shot = oneShot
|
timer.one_shot = oneShot
|
||||||
timer.autostart = autoStart
|
timer.autostart = autoStart
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,25 @@
|
||||||
[gd_scene load_steps=6 format=3 uid="uid://ck1qryleu80s"]
|
[gd_scene load_steps=10 format=3 uid="uid://ck1qryleu80s"]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_gvvig"]
|
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_gvvig"]
|
||||||
[ext_resource type="Script" uid="uid://16hafh01iv" path="res://Towers/Aline/aline.gd" id="2_6sjqq"]
|
[ext_resource type="Script" uid="uid://16hafh01iv" path="res://Towers/Aline/aline.gd" id="2_6sjqq"]
|
||||||
[ext_resource type="Texture2D" uid="uid://cob1lydkirn20" path="res://Assets/Icones/raccoon-head.svg" id="3_6h033"]
|
[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://Scripts/Upgrades/TowerUpgrade.gd" id="3_p2nb1"]
|
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Scripts/Upgrades/TowerUpgrade.gd" id="3_p2nb1"]
|
||||||
|
[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://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://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"]
|
||||||
|
|
||||||
|
[sub_resource type="SphereShape3D" id="SphereShape3D_lhd8w"]
|
||||||
|
radius = 0.6
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_lhd8w"]
|
||||||
|
script = ExtResource("4_ck6a3")
|
||||||
|
speed = 20
|
||||||
|
damage = 10
|
||||||
|
isAOE = true
|
||||||
|
allowedTargets = 1
|
||||||
|
damageArea = SubResource("SphereShape3D_lhd8w")
|
||||||
|
sprite = ExtResource("5_lhd8w")
|
||||||
|
metadata/_custom_type_script = "uid://ddgbr0n8kic3y"
|
||||||
|
|
||||||
[node name="Aline" instance=ExtResource("1_gvvig")]
|
[node name="Aline" instance=ExtResource("1_gvvig")]
|
||||||
script = ExtResource("2_6sjqq")
|
script = ExtResource("2_6sjqq")
|
||||||
|
|
@ -13,10 +28,11 @@ tower_type = 2
|
||||||
icone = ExtResource("3_6h033")
|
icone = ExtResource("3_6h033")
|
||||||
bio = ""
|
bio = ""
|
||||||
price = 150
|
price = 150
|
||||||
bullet_damage = 10
|
projectileRessource = SubResource("Resource_lhd8w")
|
||||||
|
action_cooldown = 2.5
|
||||||
energy_cost = 25.0
|
energy_cost = 25.0
|
||||||
tower_shop = Array[ExtResource("3_p2nb1")]([])
|
tower_shop = Array[ExtResource("3_p2nb1")]([])
|
||||||
|
|
||||||
[node name="Sprite3D" parent="." index="6"]
|
[node name="Sprite3D" parent="." index="5"]
|
||||||
texture = ExtResource("5_l514g")
|
texture = ExtResource("5_l514g")
|
||||||
frame = 10
|
frame = 10
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,20 @@
|
||||||
[gd_scene load_steps=5 format=3 uid="uid://c4ta0aynybpis"]
|
[gd_scene load_steps=8 format=3 uid="uid://c4ta0aynybpis"]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_yctfx"]
|
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_yctfx"]
|
||||||
[ext_resource type="Script" uid="uid://cyxxauybvvfyj" path="res://Towers/Evan/evan.gd" id="2_fuecn"]
|
[ext_resource type="Script" uid="uid://cyxxauybvvfyj" path="res://Towers/Evan/evan.gd" id="2_fuecn"]
|
||||||
[ext_resource type="Texture2D" uid="uid://dwwgho6f8f4kj" path="res://Assets/Icones/penguin.svg" id="3_nvfjk"]
|
[ext_resource type="Texture2D" uid="uid://dwwgho6f8f4kj" path="res://Assets/Icones/penguin.svg" id="3_nvfjk"]
|
||||||
|
[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Projectiles/ProjectileResource.gd" id="4_el20i"]
|
||||||
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Scripts/Upgrades/TowerUpgrade.gd" id="4_v32j5"]
|
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Scripts/Upgrades/TowerUpgrade.gd" id="4_v32j5"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="5_el20i"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_ykufo"]
|
||||||
|
script = ExtResource("4_el20i")
|
||||||
|
speed = 20
|
||||||
|
damage = 1
|
||||||
|
isAOE = false
|
||||||
|
allowedTargets = 1
|
||||||
|
sprite = ExtResource("5_el20i")
|
||||||
|
metadata/_custom_type_script = "uid://ddgbr0n8kic3y"
|
||||||
|
|
||||||
[node name="Evan" instance=ExtResource("1_yctfx")]
|
[node name="Evan" instance=ExtResource("1_yctfx")]
|
||||||
script = ExtResource("2_fuecn")
|
script = ExtResource("2_fuecn")
|
||||||
|
|
@ -11,5 +22,5 @@ tower_name = "Evan"
|
||||||
tower_type = 5
|
tower_type = 5
|
||||||
icone = ExtResource("3_nvfjk")
|
icone = ExtResource("3_nvfjk")
|
||||||
bio = ""
|
bio = ""
|
||||||
bullet_damage = 1
|
projectileRessource = SubResource("Resource_ykufo")
|
||||||
tower_shop = Array[ExtResource("4_v32j5")]([])
|
tower_shop = Array[ExtResource("4_v32j5")]([])
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,19 @@
|
||||||
[gd_scene load_steps=4 format=3 uid="uid://bj6srer7ghf7p"]
|
[gd_scene load_steps=7 format=3 uid="uid://bj6srer7ghf7p"]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_7f7qx"]
|
[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_7f7qx"]
|
||||||
[ext_resource type="Script" uid="uid://q4o384wv3ijj" path="res://Towers/Pierre/pierre.gd" id="1_v16mf"]
|
[ext_resource type="Script" uid="uid://q4o384wv3ijj" path="res://Towers/Pierre/pierre.gd" id="1_v16mf"]
|
||||||
[ext_resource type="Texture2D" uid="uid://bb4wihq1n1wm7" path="res://Assets/Icones/labrador-head.svg" id="3_odfqx"]
|
[ext_resource type="Texture2D" uid="uid://bb4wihq1n1wm7" path="res://Assets/Icones/labrador-head.svg" id="3_odfqx"]
|
||||||
|
[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Projectiles/ProjectileResource.gd" id="4_3juah"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="5_p33h4"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_3ht5a"]
|
||||||
|
script = ExtResource("4_3juah")
|
||||||
|
speed = 20
|
||||||
|
damage = 5
|
||||||
|
isAOE = false
|
||||||
|
allowedTargets = 1
|
||||||
|
sprite = ExtResource("5_p33h4")
|
||||||
|
metadata/_custom_type_script = "uid://ddgbr0n8kic3y"
|
||||||
|
|
||||||
[node name="Pierre" instance=ExtResource("1_7f7qx")]
|
[node name="Pierre" instance=ExtResource("1_7f7qx")]
|
||||||
script = ExtResource("1_v16mf")
|
script = ExtResource("1_v16mf")
|
||||||
|
|
@ -10,6 +21,7 @@ tower_name = "Pierre"
|
||||||
tower_type = 1
|
tower_type = 1
|
||||||
icone = ExtResource("3_odfqx")
|
icone = ExtResource("3_odfqx")
|
||||||
bio = null
|
bio = null
|
||||||
|
projectileRessource = SubResource("Resource_3ht5a")
|
||||||
action_cooldown = 1.0
|
action_cooldown = 1.0
|
||||||
max_energy = 50.0
|
max_energy = 50.0
|
||||||
energy_regen = 5.0
|
energy_regen = 5.0
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ class_name TowerListResource
|
||||||
@export var towers : Array[TowerResource] : set = towersHasChanged
|
@export var towers : Array[TowerResource] : set = towersHasChanged
|
||||||
|
|
||||||
func getTowerSceneById(towerType : Tower.TYPE) -> PackedScene :
|
func getTowerSceneById(towerType : Tower.TYPE) -> PackedScene :
|
||||||
var towerIndex := towers.find_custom(func(towerResource): return towerResource.towerType == towerType)
|
var towerIndex : int = towers.find_custom(func(towerResource): return towerResource.towerType == towerType)
|
||||||
return towers[towerIndex].towerScene
|
return towers[towerIndex].towerScene
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,25 +5,23 @@ class_name Tower
|
||||||
# DANGER "NONE" Should always be first
|
# DANGER "NONE" Should always be first
|
||||||
enum TYPE { NONE, PIERRE, ALINE, MAXENCE, VICTORIA, EVAN, ALEX, GERALDINE }
|
enum TYPE { NONE, PIERRE, ALINE, MAXENCE, VICTORIA, EVAN, ALEX, GERALDINE }
|
||||||
|
|
||||||
var projectile : PackedScene = preload("res://Projectiles/projectile.tscn")
|
var projectileScene : PackedScene = preload("res://Projectiles/projectile.tscn")
|
||||||
|
|
||||||
@export var tower_name : String = "None"
|
@export var tower_name : String = "None"
|
||||||
@export var tower_type : TYPE
|
@export var tower_type : TYPE
|
||||||
@export var icone : Texture2D
|
@export var icone : Texture2D
|
||||||
@export var bio : String
|
@export var bio : String
|
||||||
|
|
||||||
@export var price : int = 100
|
@export var price : int = 100
|
||||||
|
|
||||||
@export_group("Attack")
|
@export_group("Attack")
|
||||||
@export var projectile_damage : int = 1
|
@export var projectileRessource : ProjectileResource
|
||||||
@export var action_cooldown : float = 1.5:
|
@export var action_cooldown : float = 1.5:
|
||||||
set(value):
|
set(value):
|
||||||
action_cooldown = clamp(value, 0.3, 999)
|
action_cooldown = clamp(value, 0.3, 999)
|
||||||
$Cooldown.wait_time = action_cooldown
|
$Cooldown.wait_time = action_cooldown
|
||||||
|
|
||||||
@export_group("Energy")
|
@export_group("Energy")
|
||||||
@export var max_energy : float = 100.0:
|
@export var max_energy : float = 100.0
|
||||||
set(value):
|
|
||||||
max_energy = value
|
|
||||||
@export var energy_regen : float = 10.0
|
@export var energy_regen : float = 10.0
|
||||||
@export var energy_cost : float = 50.0
|
@export var energy_cost : float = 50.0
|
||||||
|
|
||||||
|
|
@ -88,6 +86,7 @@ func _ready() -> void:
|
||||||
energy_bar.set_up(energy, max_energy)
|
energy_bar.set_up(energy, max_energy)
|
||||||
energy_bar.set_max_value(max_energy)
|
energy_bar.set_max_value(max_energy)
|
||||||
$Cooldown.wait_time = action_cooldown
|
$Cooldown.wait_time = action_cooldown
|
||||||
|
EventBus.energy_has_changed.emit(self)
|
||||||
|
|
||||||
func _process(delta: float) -> void:
|
func _process(delta: float) -> void:
|
||||||
if is_rest:
|
if is_rest:
|
||||||
|
|
@ -103,10 +102,8 @@ func _process(delta: float) -> void:
|
||||||
func shoot() -> void:
|
func shoot() -> void:
|
||||||
energy -= energy_cost
|
energy -= energy_cost
|
||||||
|
|
||||||
var projectile : Projectile = projectile.instantiate()
|
var projectile : Projectile = projectileScene.instantiate()
|
||||||
projectile.target = current
|
projectile.loadProjectile(projectileRessource, $Aim.global_position, current)
|
||||||
projectile.damage = projectile_damage
|
|
||||||
projectile.global_position = $Aim.global_position
|
|
||||||
EventBus.projectile_shooted.emit(projectile)
|
EventBus.projectile_shooted.emit(projectile)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[gd_scene load_steps=10 format=3 uid="uid://trg7ag3dqr2l"]
|
[gd_scene load_steps=10 format=3 uid="uid://trg7ag3dqr2l"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://8kpvuurr5h5n" path="res://Towers/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://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="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://Scripts/Upgrades/TowerUpgrade.gd" id="3_5dr1v"]
|
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Scripts/Upgrades/TowerUpgrade.gd" id="3_5dr1v"]
|
||||||
|
|
|
||||||
12
UI/gui.gd
12
UI/gui.gd
|
|
@ -3,8 +3,8 @@ extends Control
|
||||||
|
|
||||||
const BUTTON_QTY = 12
|
const BUTTON_QTY = 12
|
||||||
|
|
||||||
const towerButton := preload("res://UI/tower_button.tscn")
|
const towerButton : PackedScene = preload("res://UI/tower_button.tscn")
|
||||||
var towerListResource := preload("res://Towers/towers.tres")
|
var towerListResource : TowerListResource = preload("res://Towers/towers.tres")
|
||||||
|
|
||||||
@onready var buttonContainer = $HBoxContainer/ControlPanelBase/MarginContainer/GridContainer
|
@onready var buttonContainer = $HBoxContainer/ControlPanelBase/MarginContainer/GridContainer
|
||||||
|
|
||||||
|
|
@ -30,8 +30,8 @@ func _on_button_quit_game_pressed() -> void:
|
||||||
get_tree().quit()
|
get_tree().quit()
|
||||||
|
|
||||||
|
|
||||||
func allowedTowerHasChange(allowedTowers : Array[Tower.TYPE]) -> void:
|
func allowedTowerHasChange(_allowedTowers : Array[Tower.TYPE]) -> void:
|
||||||
self.allowedTowers = allowedTowers
|
allowedTowers = _allowedTowers
|
||||||
if is_node_ready():
|
if is_node_ready():
|
||||||
addTowerButtonNodes()
|
addTowerButtonNodes()
|
||||||
|
|
||||||
|
|
@ -47,7 +47,7 @@ func addTowerButtonNodes() -> void:
|
||||||
additionalPlaceholder += 1
|
additionalPlaceholder += 1
|
||||||
continue
|
continue
|
||||||
|
|
||||||
var towerBtn := towerButton.instantiate()
|
var towerBtn : TowerButton = towerButton.instantiate()
|
||||||
var tower : Tower = towerResource.towerScene.instantiate()
|
var tower : Tower = towerResource.towerScene.instantiate()
|
||||||
towerBtn.towerType = tower.tower_type
|
towerBtn.towerType = tower.tower_type
|
||||||
towerBtn.tooltip_text = tower.name
|
towerBtn.tooltip_text = tower.name
|
||||||
|
|
@ -57,7 +57,7 @@ func addTowerButtonNodes() -> void:
|
||||||
buttonContainer.add_child(towerBtn)
|
buttonContainer.add_child(towerBtn)
|
||||||
|
|
||||||
for i in BUTTON_QTY - towerListResource.towers.size() + additionalPlaceholder:
|
for i in BUTTON_QTY - towerListResource.towers.size() + additionalPlaceholder:
|
||||||
var placeholderBtn := Button.new()
|
var placeholderBtn : Button = Button.new()
|
||||||
placeholderBtn.set_meta("dynamicButton", true)
|
placeholderBtn.set_meta("dynamicButton", true)
|
||||||
placeholderBtn.custom_minimum_size = Vector2(80, 80)
|
placeholderBtn.custom_minimum_size = Vector2(80, 80)
|
||||||
buttonContainer.add_child(placeholderBtn)
|
buttonContainer.add_child(placeholderBtn)
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ func _ready() -> void:
|
||||||
if not Engine.is_editor_hint():
|
if not Engine.is_editor_hint():
|
||||||
pressed.connect(EventBus.tower_selected.emit.bind(towerType))
|
pressed.connect(EventBus.tower_selected.emit.bind(towerType))
|
||||||
EventBus.energy_has_changed.connect(changeEnergy)
|
EventBus.energy_has_changed.connect(changeEnergy)
|
||||||
|
EventBus.tower_builded.connect(towerBuilded)
|
||||||
|
|
||||||
|
|
||||||
func changeEnergy(tower : Tower) -> void:
|
func changeEnergy(tower : Tower) -> void:
|
||||||
|
|
@ -16,5 +17,10 @@ func changeEnergy(tower : Tower) -> void:
|
||||||
$ProgressBar.value = tower.energy
|
$ProgressBar.value = tower.energy
|
||||||
|
|
||||||
|
|
||||||
|
func towerBuilded(tower : Tower) -> void :
|
||||||
|
if tower.tower_type == towerType:
|
||||||
|
$ProgressBar.max_value = tower.max_energy
|
||||||
|
|
||||||
|
|
||||||
func setButtonTexture(texture : Texture2D) -> void:
|
func setButtonTexture(texture : Texture2D) -> void:
|
||||||
$TextureRect.texture = texture
|
$TextureRect.texture = texture
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ func setOptions(options : Dictionary, defaultSelectedValue : String = "") -> voi
|
||||||
selectItemByValue(defaultSelectedValue)
|
selectItemByValue(defaultSelectedValue)
|
||||||
|
|
||||||
|
|
||||||
func addOption(value : String, displayName : String, autoSelect := false) -> void:
|
func addOption(value : String, displayName : String, autoSelect : bool = false) -> void:
|
||||||
add_item(displayName)
|
add_item(displayName)
|
||||||
options.set(value, displayName)
|
options.set(value, displayName)
|
||||||
|
|
||||||
|
|
@ -30,14 +30,14 @@ func addOption(value : String, displayName : String, autoSelect := false) -> voi
|
||||||
|
|
||||||
|
|
||||||
func itemHasBeenSelected(index : int) -> void:
|
func itemHasBeenSelected(index : int) -> void:
|
||||||
var value := options.get(get_item_text(index))
|
var value = options.get(get_item_text(index))
|
||||||
if selectedValue != value:
|
if selectedValue != value:
|
||||||
selectedValue = value
|
selectedValue = value
|
||||||
onValueChanged.emit(selectedValue)
|
onValueChanged.emit(selectedValue)
|
||||||
|
|
||||||
|
|
||||||
func selectItemByValue(value : String) -> void:
|
func selectItemByValue(value : String) -> void:
|
||||||
var name := options.find_key(value)
|
var name = options.find_key(value)
|
||||||
for i in item_count:
|
for i in item_count:
|
||||||
if get_item_text(i) == name:
|
if get_item_text(i) == name:
|
||||||
selected = i
|
selected = i
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,10 @@ enum DIRECTION { UP, DOWN, TOP, LEFT, VERTICAL, HORIZONTAL}
|
||||||
|
|
||||||
var enemies : Dictionary
|
var enemies : Dictionary
|
||||||
|
|
||||||
@onready var autoLaunchLevel := $VBoxContainer2/ButtonContainer2/AutoLaunchLevel
|
@onready var autoLaunchLevel : CheckButton = $VBoxContainer2/ButtonContainer2/AutoLaunchLevel
|
||||||
@onready var levelSelect := $VBoxContainer2/HBoxContainer/LevelSelect
|
@onready var levelSelect : CustomOptionButton = $VBoxContainer2/HBoxContainer/LevelSelect
|
||||||
@onready var waveTabContainer : TabContainer = $VBoxContainer2/ScrollContainer/WaveContainer
|
@onready var waveTabContainer : TabContainer = $VBoxContainer2/ScrollContainer/WaveContainer
|
||||||
@onready var towerSelector := $VBoxContainer2/ButtonContainer5/TowerSelector
|
@onready var towerSelector : ItemList = $VBoxContainer2/ButtonContainer5/TowerSelector
|
||||||
|
|
||||||
var level : Level
|
var level : Level
|
||||||
var currentWave : int = -1
|
var currentWave : int = -1
|
||||||
|
|
@ -66,7 +66,7 @@ func manageAllowedTowers() -> void:
|
||||||
|
|
||||||
|
|
||||||
func buildWave(wave : Wave) -> VBoxContainer:
|
func buildWave(wave : Wave) -> VBoxContainer:
|
||||||
var troopContainer := VBoxContainer.new()
|
var troopContainer : VBoxContainer = VBoxContainer.new()
|
||||||
|
|
||||||
for i in wave.troops.size():
|
for i in wave.troops.size():
|
||||||
var troop : Troop = wave.troops[i]
|
var troop : Troop = wave.troops[i]
|
||||||
|
|
@ -76,7 +76,7 @@ func buildWave(wave : Wave) -> VBoxContainer:
|
||||||
troopContainer.add_child(HSeparator.new())
|
troopContainer.add_child(HSeparator.new())
|
||||||
|
|
||||||
if troop.spawn_delay:
|
if troop.spawn_delay:
|
||||||
var timeSeparator := buildInputLabel(
|
var timeSeparator : HBoxContainer = buildInputLabel(
|
||||||
func(newValue):
|
func(newValue):
|
||||||
troop.spawn_delay = newValue
|
troop.spawn_delay = newValue
|
||||||
if newValue == 0:
|
if newValue == 0:
|
||||||
|
|
@ -99,11 +99,11 @@ func buildWave(wave : Wave) -> VBoxContainer:
|
||||||
nodeToAppend = troopContainer.get_child(troopContainer.get_child_count() - 1)
|
nodeToAppend = troopContainer.get_child(troopContainer.get_child_count() - 1)
|
||||||
nodeToAppend.add_child(VSeparator.new())
|
nodeToAppend.add_child(VSeparator.new())
|
||||||
|
|
||||||
var ennemyContainer := VBoxContainer.new()
|
var ennemyContainer : VBoxContainer = VBoxContainer.new()
|
||||||
ennemyContainer.add_child(createSection("Troop N°" + str(i + 1), removeTroop.bind(troop, wave), TROOP_LABEL_SETTINGS))
|
ennemyContainer.add_child(createSection("Troop N°" + str(i + 1), removeTroop.bind(troop, wave), TROOP_LABEL_SETTINGS))
|
||||||
|
|
||||||
if troop.spawn_delay == 0:
|
if troop.spawn_delay == 0:
|
||||||
var button := Button.new()
|
var button : Button = Button.new()
|
||||||
button.text = "Séparer"
|
button.text = "Séparer"
|
||||||
button.pressed.connect(
|
button.pressed.connect(
|
||||||
func():
|
func():
|
||||||
|
|
@ -115,7 +115,7 @@ func buildWave(wave : Wave) -> VBoxContainer:
|
||||||
buildTroop(troop, ennemyContainer)
|
buildTroop(troop, ennemyContainer)
|
||||||
nodeToAppend.add_child(ennemyContainer)
|
nodeToAppend.add_child(ennemyContainer)
|
||||||
|
|
||||||
var addTroopBtn := Button.new()
|
var addTroopBtn : Button = Button.new()
|
||||||
addTroopBtn.text = "Ajouter une troupe"
|
addTroopBtn.text = "Ajouter une troupe"
|
||||||
addTroopBtn.pressed.connect(addTroop.bind(wave))
|
addTroopBtn.pressed.connect(addTroop.bind(wave))
|
||||||
troopContainer.add_child(addTroopBtn)
|
troopContainer.add_child(addTroopBtn)
|
||||||
|
|
@ -125,16 +125,16 @@ func buildWave(wave : Wave) -> VBoxContainer:
|
||||||
|
|
||||||
|
|
||||||
func buildTroop(troop : Troop, ennemyContainer : VBoxContainer) -> void:
|
func buildTroop(troop : Troop, ennemyContainer : VBoxContainer) -> void:
|
||||||
var qtyEdit := buildInputLabel(
|
var qtyEdit : HBoxContainer = buildInputLabel(
|
||||||
func(newValue): troop.number_to_spawn = newValue,
|
func(newValue): troop.number_to_spawn = newValue,
|
||||||
troop.number_to_spawn,
|
troop.number_to_spawn,
|
||||||
CustomLineEdit.TYPE.INT,
|
CustomLineEdit.TYPE.INT,
|
||||||
"x"
|
"x"
|
||||||
)
|
)
|
||||||
|
|
||||||
var enemySelector := CustomOptionButton.new()
|
var enemySelector : CustomOptionButton = CustomOptionButton.new()
|
||||||
enemySelector.onValueChanged.connect(func(resourcePath): troop.enemy = load(resourcePath))
|
enemySelector.onValueChanged.connect(func(resourcePath): troop.enemy = load(resourcePath))
|
||||||
var enemy := troop.enemy.resource_path if troop.enemy else ""
|
var enemy : String = troop.enemy.resource_path if troop.enemy else ""
|
||||||
enemySelector.setOptions(enemies, enemy)
|
enemySelector.setOptions(enemies, enemy)
|
||||||
|
|
||||||
qtyEdit.add_child(enemySelector)
|
qtyEdit.add_child(enemySelector)
|
||||||
|
|
@ -142,18 +142,18 @@ func buildTroop(troop : Troop, ennemyContainer : VBoxContainer) -> void:
|
||||||
|
|
||||||
|
|
||||||
func buildInputLabel(updateCallback : Callable, delay : float, type : CustomLineEdit.TYPE, text : String = "") -> HBoxContainer:
|
func buildInputLabel(updateCallback : Callable, delay : float, type : CustomLineEdit.TYPE, text : String = "") -> HBoxContainer:
|
||||||
var container := HBoxContainer.new()
|
var container : HBoxContainer = HBoxContainer.new()
|
||||||
container.size_flags_vertical = Control.SIZE_SHRINK_CENTER
|
container.size_flags_vertical = Control.SIZE_SHRINK_CENTER
|
||||||
container.alignment = BoxContainer.ALIGNMENT_CENTER
|
container.alignment = BoxContainer.ALIGNMENT_CENTER
|
||||||
|
|
||||||
var timeEdit := CustomLineEdit.new()
|
var timeEdit : CustomLineEdit = CustomLineEdit.new()
|
||||||
timeEdit.inputType = type
|
timeEdit.inputType = type
|
||||||
timeEdit.setValue(delay)
|
timeEdit.setValue(delay)
|
||||||
timeEdit.valueHasChanged.connect(updateCallback)
|
timeEdit.valueHasChanged.connect(updateCallback)
|
||||||
container.add_child(timeEdit)
|
container.add_child(timeEdit)
|
||||||
|
|
||||||
if text:
|
if text:
|
||||||
var label := Label.new()
|
var label : Label = Label.new()
|
||||||
label.text = text
|
label.text = text
|
||||||
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||||
label.label_settings = BASE_LABEL_SETTINGS
|
label.label_settings = BASE_LABEL_SETTINGS
|
||||||
|
|
@ -163,13 +163,13 @@ func buildInputLabel(updateCallback : Callable, delay : float, type : CustomLine
|
||||||
|
|
||||||
|
|
||||||
func createSection(sectionName : String, BtnCallback : Callable, settings : LabelSettings = BASE_LABEL_SETTINGS) -> HSplitContainer :
|
func createSection(sectionName : String, BtnCallback : Callable, settings : LabelSettings = BASE_LABEL_SETTINGS) -> HSplitContainer :
|
||||||
var container := HSplitContainer.new()
|
var container : HSplitContainer = HSplitContainer.new()
|
||||||
|
|
||||||
var label := Label.new()
|
var label : Label = Label.new()
|
||||||
label.text = sectionName
|
label.text = sectionName
|
||||||
label.label_settings = settings
|
label.label_settings = settings
|
||||||
|
|
||||||
var button := Button.new()
|
var button : Button = Button.new()
|
||||||
button.text = "Supprimer"
|
button.text = "Supprimer"
|
||||||
button.pressed.connect(BtnCallback)
|
button.pressed.connect(BtnCallback)
|
||||||
|
|
||||||
|
|
@ -196,7 +196,7 @@ func removeTroop(troop : Troop, fromWave : Wave) -> void:
|
||||||
|
|
||||||
|
|
||||||
func refreshWaveNode(wave : Wave, waveIdx : int) -> void:
|
func refreshWaveNode(wave : Wave, waveIdx : int) -> void:
|
||||||
var waveNode := waveTabContainer.get_child(waveIdx)
|
var waveNode : VBoxContainer = waveTabContainer.get_child(waveIdx)
|
||||||
waveTabContainer.remove_child(waveNode)
|
waveTabContainer.remove_child(waveNode)
|
||||||
waveNode.queue_free()
|
waveNode.queue_free()
|
||||||
var waveUI : = buildWave(wave)
|
var waveUI : = buildWave(wave)
|
||||||
|
|
@ -219,14 +219,14 @@ func resetApp() -> void:
|
||||||
|
|
||||||
func removeWave() -> void:
|
func removeWave() -> void:
|
||||||
level.waves.remove_at(currentWave)
|
level.waves.remove_at(currentWave)
|
||||||
var wave := waveTabContainer.get_child(currentWave)
|
var wave : VBoxContainer = waveTabContainer.get_child(currentWave)
|
||||||
waveTabContainer.remove_child(wave)
|
waveTabContainer.remove_child(wave)
|
||||||
wave.queue_free()
|
wave.queue_free()
|
||||||
recreateTabBar()
|
recreateTabBar()
|
||||||
|
|
||||||
|
|
||||||
func addWave() -> void:
|
func addWave() -> void:
|
||||||
var wave := Wave.new()
|
var wave : Wave = Wave.new()
|
||||||
level.waves.append(wave)
|
level.waves.append(wave)
|
||||||
waveTabContainer.add_child(buildWave(wave))
|
waveTabContainer.add_child(buildWave(wave))
|
||||||
recreateTabBar()
|
recreateTabBar()
|
||||||
|
|
@ -282,10 +282,10 @@ func onSelectedTowerChange(index: int, selected: int) -> void:
|
||||||
|
|
||||||
func getOptionsFromFile(path : String, regexPattern : String) -> Dictionary :
|
func getOptionsFromFile(path : String, regexPattern : String) -> Dictionary :
|
||||||
var files = {}
|
var files = {}
|
||||||
var regex := RegEx.create_from_string(regexPattern)
|
var regex : RegEx = RegEx.create_from_string(regexPattern)
|
||||||
var dir := DirAccess.open(path)
|
var dir : DirAccess = DirAccess.open(path)
|
||||||
for file in dir.get_files():
|
for file in dir.get_files():
|
||||||
var fileMatch := regex.search(file)
|
var fileMatch : RegExMatch = regex.search(file)
|
||||||
if fileMatch:
|
if fileMatch:
|
||||||
files.set(fileMatch.strings[1], path + "/" + file)
|
files.set(fileMatch.strings[1], path + "/" + file)
|
||||||
|
|
||||||
|
|
@ -293,7 +293,7 @@ func getOptionsFromFile(path : String, regexPattern : String) -> Dictionary :
|
||||||
|
|
||||||
|
|
||||||
func recreateTabBar() -> void:
|
func recreateTabBar() -> void:
|
||||||
var waveTabBar := waveTabContainer.get_tab_bar()
|
var waveTabBar : TabBar = waveTabContainer.get_tab_bar()
|
||||||
|
|
||||||
for i in waveTabBar.tab_count:
|
for i in waveTabBar.tab_count:
|
||||||
if i < waveTabContainer.get_child_count():
|
if i < waveTabContainer.get_child_count():
|
||||||
|
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
extends Node3D
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
EventBus.projectile_shooted.connect(_on_EventBus_projectile_shooted)
|
|
||||||
|
|
||||||
|
|
||||||
func _on_EventBus_projectile_shooted(projectile : Projectile) -> void:
|
|
||||||
add_child(projectile)
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
uid://xkk2pxkrwsq8
|
|
||||||
Loading…
Add table
Reference in a new issue