feat: add lane management + improve tower access
This commit is contained in:
parent
634eafad62
commit
2497befa7c
22 changed files with 140 additions and 125 deletions
36
Globals/EnhancedResource.gd
Normal file
36
Globals/EnhancedResource.gd
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
extends Resource
|
||||||
|
class_name EnhancedResource
|
||||||
|
|
||||||
|
func arrayValueChanged(value : Array[Variant], resourceToCreate : Callable) -> Array[Variant]:
|
||||||
|
if Engine.is_editor_hint():
|
||||||
|
for i in value.size():
|
||||||
|
if !value[i]:
|
||||||
|
value[i] = resourceToCreate.call()
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
static func getFileFromDir(path : String, regexPattern : String, pathRegexPattern : String = "") -> Array[String]:
|
||||||
|
var files : Array[String]
|
||||||
|
var regex : RegEx = RegEx.create_from_string(regexPattern)
|
||||||
|
var pathRegex : RegEx = RegEx.create_from_string(pathRegexPattern)
|
||||||
|
var dir : DirAccess = DirAccess.open(path)
|
||||||
|
|
||||||
|
if pathRegexPattern:
|
||||||
|
for subDir in dir.get_directories():
|
||||||
|
subDir = path + subDir + "/"
|
||||||
|
if pathRegex.search(subDir):
|
||||||
|
files.append_array(getFileFromDir(subDir, regexPattern, pathRegexPattern))
|
||||||
|
|
||||||
|
for file in dir.get_files():
|
||||||
|
if regex.search(file) && pathRegex.search(path):
|
||||||
|
files.append(path + file)
|
||||||
|
|
||||||
|
return files
|
||||||
|
|
||||||
|
|
||||||
|
static func getPackedSceneProperty(scene : PackedScene, propertyName : String) -> Variant:
|
||||||
|
var idx : int = scene._bundled.names.find(propertyName)
|
||||||
|
if idx != -1:
|
||||||
|
return scene._bundled.variants[idx]
|
||||||
|
return null
|
||||||
1
Globals/EnhancedResource.gd.uid
Normal file
1
Globals/EnhancedResource.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid://mxjxhkb122j6
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
[gd_resource type="Resource" script_class="Level" load_steps=10 format=3 uid="uid://ob41fnhkjr3o"]
|
[gd_resource type="Resource" script_class="Level" load_steps=9 format=3 uid="uid://ob41fnhkjr3o"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://cuhq6u67cbbqm" path="res://Levels/Scripts/Resource/Level.gd" id="1_ftl6b"]
|
[ext_resource type="Script" uid="uid://cuhq6u67cbbqm" path="res://Levels/Scripts/Resource/Level.gd" id="1_ftl6b"]
|
||||||
[ext_resource type="Script" uid="uid://chu8s12rtdeqx" path="res://Levels/Scripts/Resource/Wave.gd" id="2_457yt"]
|
[ext_resource type="Script" uid="uid://chu8s12rtdeqx" path="res://Levels/Scripts/Resource/Wave.gd" id="2_457yt"]
|
||||||
[ext_resource type="Script" uid="uid://blxx3vs2wnfet" path="res://Levels/Scripts/Resource/Troop.gd" id="3_ub8wd"]
|
[ext_resource type="Script" uid="uid://blxx3vs2wnfet" path="res://Levels/Scripts/Resource/Troop.gd" id="3_ub8wd"]
|
||||||
[ext_resource type="PackedScene" uid="uid://dknt1oiyei5e5" path="res://enemies/enemy-a.tscn" id="4_ujs1b"]
|
|
||||||
|
|
||||||
[sub_resource type="Resource" id="Resource_87wss"]
|
[sub_resource type="Resource" id="Resource_87wss"]
|
||||||
script = ExtResource("3_ub8wd")
|
script = ExtResource("3_ub8wd")
|
||||||
enemy = ExtResource("4_ujs1b")
|
enemy = "res://enemies/enemy-a.tscn"
|
||||||
number_to_spawn = 1
|
number_to_spawn = 1
|
||||||
|
lane_to_spawn = 0
|
||||||
spawn_delay = 5.0
|
spawn_delay = 5.0
|
||||||
metadata/_custom_type_script = "uid://blxx3vs2wnfet"
|
metadata/_custom_type_script = "uid://blxx3vs2wnfet"
|
||||||
|
|
||||||
|
|
@ -19,14 +19,16 @@ metadata/_custom_type_script = "uid://chu8s12rtdeqx"
|
||||||
|
|
||||||
[sub_resource type="Resource" id="Resource_qfjse"]
|
[sub_resource type="Resource" id="Resource_qfjse"]
|
||||||
script = ExtResource("3_ub8wd")
|
script = ExtResource("3_ub8wd")
|
||||||
enemy = ExtResource("4_ujs1b")
|
enemy = "res://enemies/enemy-a.tscn"
|
||||||
number_to_spawn = 3
|
number_to_spawn = 3
|
||||||
|
lane_to_spawn = 0
|
||||||
spawn_delay = 5.0
|
spawn_delay = 5.0
|
||||||
|
|
||||||
[sub_resource type="Resource" id="Resource_ftl6b"]
|
[sub_resource type="Resource" id="Resource_ftl6b"]
|
||||||
script = ExtResource("3_ub8wd")
|
script = ExtResource("3_ub8wd")
|
||||||
enemy = ExtResource("4_ujs1b")
|
enemy = "res://enemies/enemy-a.tscn"
|
||||||
number_to_spawn = 6
|
number_to_spawn = 6
|
||||||
|
lane_to_spawn = 0
|
||||||
spawn_delay = 1.0
|
spawn_delay = 1.0
|
||||||
|
|
||||||
[sub_resource type="Resource" id="Resource_qeljc"]
|
[sub_resource type="Resource" id="Resource_qeljc"]
|
||||||
|
|
@ -38,4 +40,5 @@ script = ExtResource("1_ftl6b")
|
||||||
waves = Array[ExtResource("2_457yt")]([SubResource("Resource_457yt"), SubResource("Resource_qeljc")])
|
waves = Array[ExtResource("2_457yt")]([SubResource("Resource_457yt"), SubResource("Resource_qeljc")])
|
||||||
auto_start = false
|
auto_start = false
|
||||||
allowedTowers = Array[int]([1, 2])
|
allowedTowers = Array[int]([1, 2])
|
||||||
|
laneCount = 1
|
||||||
metadata/_custom_type_script = "uid://cuhq6u67cbbqm"
|
metadata/_custom_type_script = "uid://cuhq6u67cbbqm"
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,30 @@
|
||||||
[gd_resource type="Resource" script_class="Level" load_steps=3 format=3 uid="uid://hlv6kd67wipi"]
|
[gd_resource type="Resource" script_class="Level" load_steps=7 format=3 uid="uid://hlv6kd67wipi"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://cuhq6u67cbbqm" path="res://Levels/Scripts/Resource/Level.gd" id="1_e3k30"]
|
[ext_resource type="Script" uid="uid://cuhq6u67cbbqm" path="res://Levels/Scripts/Resource/Level.gd" id="1_e3k30"]
|
||||||
[ext_resource type="Script" uid="uid://chu8s12rtdeqx" path="res://Levels/Scripts/Resource/Wave.gd" id="2_8ao5l"]
|
[ext_resource type="Script" uid="uid://chu8s12rtdeqx" path="res://Levels/Scripts/Resource/Wave.gd" id="2_8ao5l"]
|
||||||
|
[ext_resource type="Script" uid="uid://blxx3vs2wnfet" path="res://Levels/Scripts/Resource/Troop.gd" id="3_7ih4a"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_7ih4a"]
|
||||||
|
script = ExtResource("3_7ih4a")
|
||||||
|
enemy = "uid://dknt1oiyei5e5"
|
||||||
|
number_to_spawn = 1
|
||||||
|
lane_to_spawn = 0
|
||||||
|
spawn_delay = 1.0
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_m8w28"]
|
||||||
|
script = ExtResource("3_7ih4a")
|
||||||
|
enemy = "uid://cyvhv1ih2s762"
|
||||||
|
number_to_spawn = 1
|
||||||
|
lane_to_spawn = 1
|
||||||
|
spawn_delay = 1.0
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_t4hlm"]
|
||||||
|
script = ExtResource("2_8ao5l")
|
||||||
|
troops = Array[ExtResource("3_7ih4a")]([SubResource("Resource_7ih4a"), SubResource("Resource_m8w28")])
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
script = ExtResource("1_e3k30")
|
script = ExtResource("1_e3k30")
|
||||||
waves = Array[ExtResource("2_8ao5l")]([])
|
waves = Array[ExtResource("2_8ao5l")]([SubResource("Resource_t4hlm")])
|
||||||
auto_start = false
|
auto_start = false
|
||||||
allowedTowers = Array[int]([])
|
allowedTowers = Array[int]([])
|
||||||
|
laneCount = 2
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
[ext_resource type="PackedScene" uid="uid://dpjfo15otkfru" path="res://Tiles/cube.tscn" id="1_6idm4"]
|
[ext_resource type="PackedScene" uid="uid://dpjfo15otkfru" path="res://Tiles/cube.tscn" id="1_6idm4"]
|
||||||
[ext_resource type="Script" uid="uid://baa0j457hhoeh" path="res://Levels/Scripts/Map.gd" id="1_y62db"]
|
[ext_resource type="Script" uid="uid://baa0j457hhoeh" path="res://Levels/Scripts/Map.gd" id="1_y62db"]
|
||||||
[ext_resource type="PackedScene" uid="uid://d1f6m15niwgt" path="res://Tiles/tile.tscn" id="2_4yqtu"]
|
[ext_resource type="PackedScene" uid="uid://d1f6m15niwgt" path="res://Tiles/tile.tscn" id="2_4yqtu"]
|
||||||
[ext_resource type="Resource" uid="uid://ob41fnhkjr3o" path="res://Levels/Map 1/level_1.tres" id="2_scukt"]
|
[ext_resource type="Resource" uid="uid://hlv6kd67wipi" path="res://Levels/Map 2/level_2.tres" id="2_y62db"]
|
||||||
[ext_resource type="PackedScene" uid="uid://do7gm1gjhu1t5" path="res://Tiles/road.tscn" id="3_y62db"]
|
[ext_resource type="PackedScene" uid="uid://do7gm1gjhu1t5" path="res://Tiles/road.tscn" id="3_y62db"]
|
||||||
[ext_resource type="PackedScene" uid="uid://n0jw4n4qh502" path="res://Tiles/road_corner.tscn" id="4_scukt"]
|
[ext_resource type="PackedScene" uid="uid://n0jw4n4qh502" path="res://Tiles/road_corner.tscn" id="4_scukt"]
|
||||||
[ext_resource type="PackedScene" uid="uid://do60hy3251c0m" path="res://Assets/Meshes/SM_TNP.glb" id="5_o5cso"]
|
[ext_resource type="PackedScene" uid="uid://do60hy3251c0m" path="res://Assets/Meshes/SM_TNP.glb" id="5_o5cso"]
|
||||||
|
|
@ -28,7 +28,7 @@ point_count = 3
|
||||||
|
|
||||||
[node name="Map" type="Node3D"]
|
[node name="Map" type="Node3D"]
|
||||||
script = ExtResource("1_y62db")
|
script = ExtResource("1_y62db")
|
||||||
level = ExtResource("2_scukt")
|
level = ExtResource("2_y62db")
|
||||||
|
|
||||||
[node name="TheCube" parent="." instance=ExtResource("1_6idm4")]
|
[node name="TheCube" parent="." instance=ExtResource("1_6idm4")]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,10 @@
|
||||||
@tool
|
@tool
|
||||||
extends Resource
|
extends EnhancedResource
|
||||||
class_name Level
|
class_name Level
|
||||||
|
|
||||||
@export var waves : Array[Wave]
|
@export var waves : Array[Wave] :
|
||||||
|
set(value):
|
||||||
|
waves = arrayValueChanged(value, Wave.new)
|
||||||
@export var auto_start : bool = false
|
@export var auto_start : bool = false
|
||||||
@export var allowedTowers : Array[Tower.TYPE] : set = allowedTowersHasChanged
|
@export var allowedTowers : Array[Tower.TYPE]
|
||||||
|
@export var laneCount : int = 1
|
||||||
|
|
||||||
func allowedTowersHasChanged(value) -> void:
|
|
||||||
allowedTowers = value
|
|
||||||
if Engine.is_editor_hint():
|
|
||||||
EventBus.allowedTowerHasChange.emit(allowedTowers)
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
extends Resource
|
extends Resource
|
||||||
class_name Troop
|
class_name Troop
|
||||||
|
|
||||||
@export var enemy : PackedScene
|
@export_file("*.tscn") var enemy : String = "res://enemies/"
|
||||||
@export var number_to_spawn : int = 1
|
@export var number_to_spawn : int = 1
|
||||||
|
@export var lane_to_spawn : int = 0
|
||||||
@export var spawn_delay : float = 1
|
@export var spawn_delay : float = 1
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
extends Resource
|
@tool
|
||||||
|
extends EnhancedResource
|
||||||
class_name Wave
|
class_name Wave
|
||||||
|
|
||||||
@export var troops : Array[Troop]
|
@export var troops : Array[Troop] :
|
||||||
|
set(value):
|
||||||
|
troops = arrayValueChanged(value, Troop.new)
|
||||||
|
|
|
||||||
|
|
@ -56,18 +56,18 @@ func spawnEnemy(delay : float) -> void:
|
||||||
var enemyTimer : Timer = createTimer(delay)
|
var enemyTimer : Timer = createTimer(delay)
|
||||||
enemyTimer.timeout.connect(
|
enemyTimer.timeout.connect(
|
||||||
func():
|
func():
|
||||||
paths[0].add_child(enemy)
|
paths[current_troop.lane_to_spawn].add_child(enemy)
|
||||||
enemyTimer.queue_free()
|
enemyTimer.queue_free()
|
||||||
)
|
)
|
||||||
paths[0].add_child(enemyTimer)
|
paths[current_troop.lane_to_spawn].add_child(enemyTimer)
|
||||||
else:
|
else:
|
||||||
paths[0].add_child(enemy)
|
paths[current_troop.lane_to_spawn].add_child(enemy)
|
||||||
|
|
||||||
enemies_alive += 1
|
enemies_alive += 1
|
||||||
|
|
||||||
|
|
||||||
func createEnemy() -> PathFollow3D :
|
func createEnemy() -> PathFollow3D :
|
||||||
var PF3D : PathFollow3D = current_troop.enemy.instantiate()
|
var PF3D : PathFollow3D = load(current_troop.enemy).instantiate()
|
||||||
var enemy : Enemy = PF3D.find_children("*", "Enemy")[0]
|
var enemy : Enemy = PF3D.find_children("*", "Enemy")[0]
|
||||||
enemy.died.connect(func(): enemies_alive -= 1)
|
enemy.died.connect(func(): enemies_alive -= 1)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,11 +62,11 @@ script = ExtResource("1_tk0a6")
|
||||||
[node name="Camera3D" type="Camera3D" parent="."]
|
[node name="Camera3D" type="Camera3D" parent="."]
|
||||||
transform = Transform3D(0.944699, 0.159007, -0.28681, -0.00234758, 0.877843, 0.478943, 0.327929, -0.451784, 0.829671, 1.77767, 3.73465, 4.71854)
|
transform = Transform3D(0.944699, 0.159007, -0.28681, -0.00234758, 0.877843, 0.478943, 0.327929, -0.451784, 0.829671, 1.77767, 3.73465, 4.71854)
|
||||||
|
|
||||||
[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_7pixp")
|
script = ExtResource("2_7pixp")
|
||||||
|
|
||||||
[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
|
||||||
|
|
@ -78,7 +78,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")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
@tool
|
|
||||||
extends Resource
|
|
||||||
class_name TowerListResource
|
|
||||||
|
|
||||||
@export var towers : Array[TowerResource] : set = towersHasChanged
|
|
||||||
|
|
||||||
func getTowerSceneById(towerType : Tower.TYPE) -> PackedScene :
|
|
||||||
var towerIndex : int = towers.find_custom(func(towerResource): return towerResource.towerType == towerType)
|
|
||||||
return towers[towerIndex].towerScene
|
|
||||||
|
|
||||||
|
|
||||||
func towersHasChanged(value : Array) -> void:
|
|
||||||
if Engine.is_editor_hint():
|
|
||||||
if value.back() == null:
|
|
||||||
value.pop_back()
|
|
||||||
value.append(TowerResource.new())
|
|
||||||
for towerResource in towers:
|
|
||||||
if not towerResource.changed.is_connected(emit_changed):
|
|
||||||
towerResource.changed.connect(emit_changed)
|
|
||||||
emit_changed()
|
|
||||||
towers = value
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
@tool
|
|
||||||
extends Resource
|
|
||||||
class_name TowerResource
|
|
||||||
|
|
||||||
@export var towerScene : PackedScene : set = towerSceneHasChanged
|
|
||||||
var towerType : Tower.TYPE
|
|
||||||
|
|
||||||
func towerSceneHasChanged(value) -> void :
|
|
||||||
towerScene = value
|
|
||||||
if value:
|
|
||||||
var tower : Tower = towerScene.instantiate()
|
|
||||||
towerType = tower.tower_type
|
|
||||||
tower.queue_free()
|
|
||||||
emit_changed()
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
uid://lvkeejppvv2c
|
|
||||||
17
Towers/Scripts/TowerListResource.gd
Normal file
17
Towers/Scripts/TowerListResource.gd
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
@tool
|
||||||
|
extends EnhancedResource
|
||||||
|
class_name TowerListResource
|
||||||
|
|
||||||
|
const TOWER_DIR : String = "res://Towers/"
|
||||||
|
const TOWER_DIR_PATTERN : String = "res://Towers/\\w+/$"
|
||||||
|
const TOWER_NAME_PATTERN : String = "([^/]*)\\.tscn$"
|
||||||
|
|
||||||
|
static var towers : Dictionary
|
||||||
|
|
||||||
|
static func _static_init() -> void:
|
||||||
|
var towerResources : Array[String] = getFileFromDir(TOWER_DIR, TOWER_NAME_PATTERN, TOWER_DIR_PATTERN)
|
||||||
|
|
||||||
|
for towerRes in towerResources:
|
||||||
|
towers.set(getPackedSceneProperty(load(towerRes), "tower_type"), towerRes)
|
||||||
|
|
||||||
|
towers.sort()
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
extends Node3D
|
extends Node3D
|
||||||
class_name TowerManager
|
class_name TowerManager
|
||||||
|
|
||||||
const towerListResource : TowerListResource = preload("res://Towers/towers.tres")
|
|
||||||
|
|
||||||
enum STATE { IDLE, PLACING }
|
enum STATE { IDLE, PLACING }
|
||||||
var _state : int = STATE.IDLE
|
var _state : int = STATE.IDLE
|
||||||
|
|
@ -76,7 +75,7 @@ func handle_player_controls() -> void:
|
||||||
func place_tower() -> void:
|
func place_tower() -> void:
|
||||||
_state = STATE.PLACING
|
_state = STATE.PLACING
|
||||||
|
|
||||||
selected_tower = towerListResource.getTowerSceneById(selected_tower_type).instantiate()
|
selected_tower = load(TowerListResource.towers.get(selected_tower_type)).instantiate()
|
||||||
towers.set(selected_tower_type, selected_tower)
|
towers.set(selected_tower_type, selected_tower)
|
||||||
add_child(selected_tower)
|
add_child(selected_tower)
|
||||||
selected_tower.can_shoot = false
|
selected_tower.can_shoot = false
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,11 @@
|
||||||
[node name="Victoria" instance=ExtResource("1_ki73m")]
|
[node name="Victoria" instance=ExtResource("1_ki73m")]
|
||||||
script = ExtResource("2_vl5h5")
|
script = ExtResource("2_vl5h5")
|
||||||
tower_name = "Victoria"
|
tower_name = "Victoria"
|
||||||
|
tower_type = 4
|
||||||
icone = ExtResource("3_tmg5m")
|
icone = ExtResource("3_tmg5m")
|
||||||
bio = ""
|
bio = ""
|
||||||
bullet_damage = 1
|
|
||||||
tower_shop = Array[ExtResource("4_uso5g")]([])
|
tower_shop = Array[ExtResource("4_uso5g")]([])
|
||||||
|
|
||||||
[node name="Sprite3D" parent="." index="6"]
|
[node name="Sprite3D" parent="." index="5"]
|
||||||
texture = ExtResource("5_2rqsg")
|
texture = ExtResource("5_2rqsg")
|
||||||
frame = 59
|
frame = 59
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ collision_mask = 4
|
||||||
script = ExtResource("1_egfuc")
|
script = ExtResource("1_egfuc")
|
||||||
icone = ExtResource("2_mnaic")
|
icone = ExtResource("2_mnaic")
|
||||||
bio = "Aime se promener dans l'herbe et manger des framboises. Sa petite bouille la rend trop mignonne."
|
bio = "Aime se promener dans l'herbe et manger des framboises. Sa petite bouille la rend trop mignonne."
|
||||||
projectile_damage = 5
|
|
||||||
tower_shop = Array[ExtResource("3_5dr1v")]([ExtResource("3_jv31o"), ExtResource("4_5dr1v")])
|
tower_shop = Array[ExtResource("3_5dr1v")]([ExtResource("3_jv31o"), ExtResource("4_5dr1v")])
|
||||||
|
|
||||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||||
|
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
[gd_resource type="Resource" script_class="TowerListResource" load_steps=7 format=3 uid="uid://jd8bdhpyl0pw"]
|
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://clm4xbebbeqgj" path="res://Towers/Scripts/Resource/TowerListResource.gd" id="1_yjmnm"]
|
|
||||||
[ext_resource type="Script" uid="uid://lvkeejppvv2c" path="res://Towers/Scripts/Resource/TowerResource.gd" id="2_mwakf"]
|
|
||||||
[ext_resource type="PackedScene" uid="uid://bj6srer7ghf7p" path="res://Towers/Pierre/pierre.tscn" id="3_mwakf"]
|
|
||||||
[ext_resource type="PackedScene" uid="uid://ck1qryleu80s" path="res://Towers/Aline/aline.tscn" id="4_mwakf"]
|
|
||||||
|
|
||||||
[sub_resource type="Resource" id="Resource_mwakf"]
|
|
||||||
script = ExtResource("2_mwakf")
|
|
||||||
towerScene = ExtResource("3_mwakf")
|
|
||||||
metadata/_custom_type_script = "uid://lvkeejppvv2c"
|
|
||||||
|
|
||||||
[sub_resource type="Resource" id="Resource_dlgx8"]
|
|
||||||
script = ExtResource("2_mwakf")
|
|
||||||
towerScene = ExtResource("4_mwakf")
|
|
||||||
metadata/_custom_type_script = "uid://lvkeejppvv2c"
|
|
||||||
|
|
||||||
[resource]
|
|
||||||
script = ExtResource("1_yjmnm")
|
|
||||||
towers = Array[ExtResource("2_mwakf")]([SubResource("Resource_mwakf"), SubResource("Resource_dlgx8")])
|
|
||||||
31
UI/gui.gd
31
UI/gui.gd
|
|
@ -4,7 +4,6 @@ extends Control
|
||||||
const BUTTON_QTY = 12
|
const BUTTON_QTY = 12
|
||||||
|
|
||||||
const towerButton : PackedScene = preload("res://UI/tower_button.tscn")
|
const towerButton : PackedScene = preload("res://UI/tower_button.tscn")
|
||||||
var towerListResource : TowerListResource = preload("res://Towers/towers.tres")
|
|
||||||
|
|
||||||
@onready var buttonContainer = $HBoxContainer/ControlPanelBase/MarginContainer/GridContainer
|
@onready var buttonContainer = $HBoxContainer/ControlPanelBase/MarginContainer/GridContainer
|
||||||
|
|
||||||
|
|
@ -14,8 +13,6 @@ var allowedTowers : Array[Tower.TYPE]
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
addTowerButtonNodes()
|
addTowerButtonNodes()
|
||||||
EventBus.allowedTowerHasChange.connect(allowedTowerHasChange)
|
EventBus.allowedTowerHasChange.connect(allowedTowerHasChange)
|
||||||
if Engine.is_editor_hint():
|
|
||||||
towerListResource.changed.connect(addTowerButtonNodes)
|
|
||||||
|
|
||||||
|
|
||||||
func _on_button_cube_pressed() -> void:
|
func _on_button_cube_pressed() -> void:
|
||||||
|
|
@ -42,22 +39,24 @@ func addTowerButtonNodes() -> void:
|
||||||
node.queue_free()
|
node.queue_free()
|
||||||
|
|
||||||
var additionalPlaceholder : int = 0
|
var additionalPlaceholder : int = 0
|
||||||
for towerResource in towerListResource.towers:
|
for towerType in TowerListResource.towers:
|
||||||
if !towerResource || not allowedTowers.has(towerResource.towerType):
|
if not Engine.is_editor_hint() && not allowedTowers.has(towerType):
|
||||||
additionalPlaceholder += 1
|
additionalPlaceholder += 1
|
||||||
continue
|
else:
|
||||||
|
createTowerButton(towerType)
|
||||||
|
|
||||||
var towerBtn : TowerButton = towerButton.instantiate()
|
for i in BUTTON_QTY - TowerListResource.towers.size() + additionalPlaceholder:
|
||||||
var tower : Tower = towerResource.towerScene.instantiate()
|
|
||||||
towerBtn.towerType = tower.tower_type
|
|
||||||
towerBtn.tooltip_text = tower.name
|
|
||||||
towerBtn.setButtonTexture(tower.icone)
|
|
||||||
towerBtn.set_meta("dynamicButton", true)
|
|
||||||
tower.queue_free()
|
|
||||||
buttonContainer.add_child(towerBtn)
|
|
||||||
|
|
||||||
for i in BUTTON_QTY - towerListResource.towers.size() + additionalPlaceholder:
|
|
||||||
var placeholderBtn : Button = 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)
|
||||||
|
|
||||||
|
|
||||||
|
func createTowerButton(towerType : Tower.TYPE) -> void:
|
||||||
|
var towerBtn : TowerButton = towerButton.instantiate()
|
||||||
|
var tower : PackedScene = load(TowerListResource.towers.get(towerType))
|
||||||
|
towerBtn.towerType = towerType
|
||||||
|
towerBtn.tooltip_text = str(EnhancedResource.getPackedSceneProperty(tower, "name"))
|
||||||
|
towerBtn.setButtonTexture(EnhancedResource.getPackedSceneProperty(tower, "icone"))
|
||||||
|
towerBtn.set_meta("dynamicButton", true)
|
||||||
|
buttonContainer.add_child(towerBtn)
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,12 @@
|
||||||
@tool
|
@tool
|
||||||
extends Control
|
extends Control
|
||||||
|
|
||||||
const LEVEL_PATH : String = "res://Levels"
|
const LEVEL_PATH : String = "res://Levels/"
|
||||||
const LEVEL_REGEX_PATERN : String = "(level_.*)\\.tres"
|
const LEVEL_REGEX_PATERN : String = "(level_.*)\\.tres$"
|
||||||
|
const LEVEL_PATH_REGEX_PATERN : String = "res://Levels/[^/]*/$"
|
||||||
|
|
||||||
const ENEMY_PATH : String = "res://enemies"
|
const ENEMY_PATH : String = "res://enemies/"
|
||||||
const ENEMY_REGEX_PATERN : String = "(enemy.*)\\.tscn"
|
const ENEMY_REGEX_PATERN : String = "(enemy.*)\\.tscn$"
|
||||||
|
|
||||||
const BASE_LABEL_SETTINGS = preload("res://addons/LevelEditor/UI/baseLabel.tres")
|
const BASE_LABEL_SETTINGS = preload("res://addons/LevelEditor/UI/baseLabel.tres")
|
||||||
const WAVE_LABEL_SETTINGS = preload("res://addons/LevelEditor/UI/waveLabel.tres")
|
const WAVE_LABEL_SETTINGS = preload("res://addons/LevelEditor/UI/waveLabel.tres")
|
||||||
|
|
@ -133,9 +134,8 @@ func buildTroop(troop : Troop, ennemyContainer : VBoxContainer) -> void:
|
||||||
)
|
)
|
||||||
|
|
||||||
var enemySelector : CustomOptionButton = CustomOptionButton.new()
|
var enemySelector : CustomOptionButton = CustomOptionButton.new()
|
||||||
enemySelector.onValueChanged.connect(func(resourcePath): troop.enemy = load(resourcePath))
|
enemySelector.onValueChanged.connect(func(resourcePath): troop.enemy = resourcePath)
|
||||||
var enemy : String = troop.enemy.resource_path if troop.enemy else ""
|
enemySelector.setOptions(enemies, troop.enemy)
|
||||||
enemySelector.setOptions(enemies, enemy)
|
|
||||||
|
|
||||||
qtyEdit.add_child(enemySelector)
|
qtyEdit.add_child(enemySelector)
|
||||||
ennemyContainer.add_child(qtyEdit)
|
ennemyContainer.add_child(qtyEdit)
|
||||||
|
|
@ -199,7 +199,7 @@ func refreshWaveNode(wave : Wave, waveIdx : int) -> void:
|
||||||
var waveNode : VBoxContainer = 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 : VBoxContainer = buildWave(wave)
|
||||||
waveTabContainer.add_child(waveUI)
|
waveTabContainer.add_child(waveUI)
|
||||||
waveTabContainer.move_child(waveUI, waveIdx)
|
waveTabContainer.move_child(waveUI, waveIdx)
|
||||||
recreateTabBar()
|
recreateTabBar()
|
||||||
|
|
@ -213,7 +213,7 @@ func cleanAndBuildMenu() -> void:
|
||||||
|
|
||||||
func resetApp() -> void:
|
func resetApp() -> void:
|
||||||
enemies = getOptionsFromFile(ENEMY_PATH, ENEMY_REGEX_PATERN)
|
enemies = getOptionsFromFile(ENEMY_PATH, ENEMY_REGEX_PATERN)
|
||||||
levelSelect.setOptions(getOptionsFromFile(LEVEL_PATH, LEVEL_REGEX_PATERN))
|
levelSelect.setOptions(getOptionsFromFile(LEVEL_PATH, LEVEL_REGEX_PATERN, LEVEL_PATH_REGEX_PATERN))
|
||||||
cleanAndBuildMenu()
|
cleanAndBuildMenu()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -280,14 +280,14 @@ func onSelectedTowerChange(index: int, selected: int) -> void:
|
||||||
level.allowedTowers.erase(index)
|
level.allowedTowers.erase(index)
|
||||||
|
|
||||||
|
|
||||||
func getOptionsFromFile(path : String, regexPattern : String) -> Dictionary :
|
func getOptionsFromFile(path : String, regexPattern : String, pathRegexPattern : String = "") -> Dictionary :
|
||||||
var files = {}
|
var files : Dictionary
|
||||||
var regex : RegEx = RegEx.create_from_string(regexPattern)
|
var filePaths : Array[String] = EnhancedResource.getFileFromDir(path, regexPattern, pathRegexPattern)
|
||||||
var dir : DirAccess = DirAccess.open(path)
|
var regex : RegEx = RegEx.create_from_string(regexPattern)
|
||||||
for file in dir.get_files():
|
|
||||||
|
for file in filePaths:
|
||||||
var fileMatch : RegExMatch = regex.search(file)
|
var fileMatch : RegExMatch = regex.search(file)
|
||||||
if fileMatch:
|
files.set(fileMatch.strings[1], file)
|
||||||
files.set(fileMatch.strings[1], path + "/" + file)
|
|
||||||
|
|
||||||
return files
|
return files
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,11 +28,7 @@ layout_mode = 2
|
||||||
|
|
||||||
[node name="LevelSelect" type="OptionButton" parent="VBoxContainer2/HBoxContainer"]
|
[node name="LevelSelect" type="OptionButton" parent="VBoxContainer2/HBoxContainer"]
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
selected = 0
|
|
||||||
allow_reselect = true
|
allow_reselect = true
|
||||||
item_count = 1
|
|
||||||
popup/item_0/text = "level_1"
|
|
||||||
popup/item_0/id = 0
|
|
||||||
script = ExtResource("2_xjxpq")
|
script = ExtResource("2_xjxpq")
|
||||||
metadata/_custom_type_script = "uid://b47p2u458hsn0"
|
metadata/_custom_type_script = "uid://b47p2u458hsn0"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue