From d3e90b5f09155491d82b891c81f91f259f64f5dd Mon Sep 17 00:00:00 2001 From: Varylios Date: Mon, 1 Sep 2025 17:32:21 +0200 Subject: [PATCH] feat: add lane management + improve tower access --- Globals/EnhancedResource.gd | 38 +++++++++++++++++++ Globals/EnhancedResource.gd.uid | 1 + Levels/Map 1/level_1.tres | 13 ++++--- Levels/Map 2/level_2.tres | 24 +++++++++++- Levels/Map 2/map_2.tscn | 4 +- Levels/Scripts/Resource/Level.gd | 15 +++----- Levels/Scripts/Resource/Troop.gd | 3 +- Levels/Scripts/Resource/Wave.gd | 7 +++- Levels/Scripts/WorldManager.gd | 8 ++-- Levels/world_manager.tscn | 6 +-- Towers/Scripts/Resource/TowerListResource.gd | 21 ---------- Towers/Scripts/Resource/TowerResource.gd | 14 ------- Towers/Scripts/Resource/TowerResource.gd.uid | 1 - Towers/Scripts/TowerListResource.gd | 17 +++++++++ .../{Resource => }/TowerListResource.gd.uid | 0 Towers/Scripts/TowerManager.gd | 3 +- Towers/Victoria/victoria.tscn | 4 +- Towers/tower.tscn | 1 - Towers/towers.tres | 20 ---------- UI/gui.gd | 31 ++++++++------- addons/LevelEditor/WaveMaker.gd | 32 ++++++++-------- addons/LevelEditor/wave_maker.tscn | 4 -- 22 files changed, 142 insertions(+), 125 deletions(-) create mode 100644 Globals/EnhancedResource.gd create mode 100644 Globals/EnhancedResource.gd.uid delete mode 100644 Towers/Scripts/Resource/TowerListResource.gd delete mode 100644 Towers/Scripts/Resource/TowerResource.gd delete mode 100644 Towers/Scripts/Resource/TowerResource.gd.uid create mode 100644 Towers/Scripts/TowerListResource.gd rename Towers/Scripts/{Resource => }/TowerListResource.gd.uid (100%) delete mode 100644 Towers/towers.tres diff --git a/Globals/EnhancedResource.gd b/Globals/EnhancedResource.gd new file mode 100644 index 0000000..36b7631 --- /dev/null +++ b/Globals/EnhancedResource.gd @@ -0,0 +1,38 @@ +extends Resource +class_name EnhancedResource + +func arrayValueChanged(value : Array[Variant], resourceToCreate : Callable) -> Array[Variant]: + if Engine.is_editor_hint(): + for i in value.size(): + print(i) + 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) + + print(files) + 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 diff --git a/Globals/EnhancedResource.gd.uid b/Globals/EnhancedResource.gd.uid new file mode 100644 index 0000000..b6a3716 --- /dev/null +++ b/Globals/EnhancedResource.gd.uid @@ -0,0 +1 @@ +uid://mxjxhkb122j6 diff --git a/Levels/Map 1/level_1.tres b/Levels/Map 1/level_1.tres index b69cf27..d853f11 100644 --- a/Levels/Map 1/level_1.tres +++ b/Levels/Map 1/level_1.tres @@ -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://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="PackedScene" uid="uid://dknt1oiyei5e5" path="res://enemies/enemy-a.tscn" id="4_ujs1b"] [sub_resource type="Resource" id="Resource_87wss"] script = ExtResource("3_ub8wd") -enemy = ExtResource("4_ujs1b") +enemy = "res://enemies/enemy-a.tscn" number_to_spawn = 1 +lane_to_spawn = 0 spawn_delay = 5.0 metadata/_custom_type_script = "uid://blxx3vs2wnfet" @@ -19,14 +19,16 @@ metadata/_custom_type_script = "uid://chu8s12rtdeqx" [sub_resource type="Resource" id="Resource_qfjse"] script = ExtResource("3_ub8wd") -enemy = ExtResource("4_ujs1b") +enemy = "res://enemies/enemy-a.tscn" number_to_spawn = 3 +lane_to_spawn = 0 spawn_delay = 5.0 [sub_resource type="Resource" id="Resource_ftl6b"] script = ExtResource("3_ub8wd") -enemy = ExtResource("4_ujs1b") +enemy = "res://enemies/enemy-a.tscn" number_to_spawn = 6 +lane_to_spawn = 0 spawn_delay = 1.0 [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")]) auto_start = false allowedTowers = Array[int]([1, 2]) +laneCount = 1 metadata/_custom_type_script = "uid://cuhq6u67cbbqm" diff --git a/Levels/Map 2/level_2.tres b/Levels/Map 2/level_2.tres index a8928fd..e726623 100644 --- a/Levels/Map 2/level_2.tres +++ b/Levels/Map 2/level_2.tres @@ -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://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] script = ExtResource("1_e3k30") -waves = Array[ExtResource("2_8ao5l")]([]) +waves = Array[ExtResource("2_8ao5l")]([SubResource("Resource_t4hlm")]) auto_start = false allowedTowers = Array[int]([]) +laneCount = 2 diff --git a/Levels/Map 2/map_2.tscn b/Levels/Map 2/map_2.tscn index 9f1154c..d0d436b 100644 --- a/Levels/Map 2/map_2.tscn +++ b/Levels/Map 2/map_2.tscn @@ -3,7 +3,7 @@ [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="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://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"] @@ -28,7 +28,7 @@ point_count = 3 [node name="Map" type="Node3D"] script = ExtResource("1_y62db") -level = ExtResource("2_scukt") +level = ExtResource("2_y62db") [node name="TheCube" parent="." instance=ExtResource("1_6idm4")] unique_name_in_owner = true diff --git a/Levels/Scripts/Resource/Level.gd b/Levels/Scripts/Resource/Level.gd index 741f316..4dccf58 100644 --- a/Levels/Scripts/Resource/Level.gd +++ b/Levels/Scripts/Resource/Level.gd @@ -1,13 +1,10 @@ @tool -extends Resource +extends EnhancedResource 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 allowedTowers : Array[Tower.TYPE] : set = allowedTowersHasChanged - - -func allowedTowersHasChanged(value) -> void: - allowedTowers = value - if Engine.is_editor_hint(): - EventBus.allowedTowerHasChange.emit(allowedTowers) +@export var allowedTowers : Array[Tower.TYPE] +@export var laneCount : int = 1 diff --git a/Levels/Scripts/Resource/Troop.gd b/Levels/Scripts/Resource/Troop.gd index 1cdd957..f72abe1 100644 --- a/Levels/Scripts/Resource/Troop.gd +++ b/Levels/Scripts/Resource/Troop.gd @@ -1,6 +1,7 @@ extends Resource class_name Troop -@export var enemy : PackedScene +@export_file("*.tscn") var enemy : String = "res://enemies/" @export var number_to_spawn : int = 1 +@export var lane_to_spawn : int = 0 @export var spawn_delay : float = 1 diff --git a/Levels/Scripts/Resource/Wave.gd b/Levels/Scripts/Resource/Wave.gd index 83cb17f..40e0352 100644 --- a/Levels/Scripts/Resource/Wave.gd +++ b/Levels/Scripts/Resource/Wave.gd @@ -1,4 +1,7 @@ -extends Resource +@tool +extends EnhancedResource class_name Wave -@export var troops : Array[Troop] +@export var troops : Array[Troop] : + set(value): + troops = arrayValueChanged(value, Troop.new) diff --git a/Levels/Scripts/WorldManager.gd b/Levels/Scripts/WorldManager.gd index 668db44..284558c 100644 --- a/Levels/Scripts/WorldManager.gd +++ b/Levels/Scripts/WorldManager.gd @@ -56,18 +56,18 @@ func spawnEnemy(delay : float) -> void: var enemyTimer : Timer = createTimer(delay) enemyTimer.timeout.connect( func(): - paths[0].add_child(enemy) + paths[current_troop.lane_to_spawn].add_child(enemy) enemyTimer.queue_free() ) - paths[0].add_child(enemyTimer) + paths[current_troop.lane_to_spawn].add_child(enemyTimer) else: - paths[0].add_child(enemy) + paths[current_troop.lane_to_spawn].add_child(enemy) enemies_alive += 1 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] enemy.died.connect(func(): enemies_alive -= 1) diff --git a/Levels/world_manager.tscn b/Levels/world_manager.tscn index c26cdea..fb9bc6b 100644 --- a/Levels/world_manager.tscn +++ b/Levels/world_manager.tscn @@ -62,11 +62,11 @@ script = ExtResource("1_tk0a6") [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) -[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) 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) pixel_size = 0.03 axis = 1 @@ -78,7 +78,7 @@ vframes = 7 frame = 44 region_rect = Rect2(703, 96, 21, 30) -[node name="AnimationPlayer" type="AnimationPlayer" parent="PlayerManager"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="TowerManager"] libraries = { &"": SubResource("AnimationLibrary_43wwi") } diff --git a/Towers/Scripts/Resource/TowerListResource.gd b/Towers/Scripts/Resource/TowerListResource.gd deleted file mode 100644 index ddf29b8..0000000 --- a/Towers/Scripts/Resource/TowerListResource.gd +++ /dev/null @@ -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 diff --git a/Towers/Scripts/Resource/TowerResource.gd b/Towers/Scripts/Resource/TowerResource.gd deleted file mode 100644 index b5728dc..0000000 --- a/Towers/Scripts/Resource/TowerResource.gd +++ /dev/null @@ -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() diff --git a/Towers/Scripts/Resource/TowerResource.gd.uid b/Towers/Scripts/Resource/TowerResource.gd.uid deleted file mode 100644 index 165996a..0000000 --- a/Towers/Scripts/Resource/TowerResource.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://lvkeejppvv2c diff --git a/Towers/Scripts/TowerListResource.gd b/Towers/Scripts/TowerListResource.gd new file mode 100644 index 0000000..a202a20 --- /dev/null +++ b/Towers/Scripts/TowerListResource.gd @@ -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() diff --git a/Towers/Scripts/Resource/TowerListResource.gd.uid b/Towers/Scripts/TowerListResource.gd.uid similarity index 100% rename from Towers/Scripts/Resource/TowerListResource.gd.uid rename to Towers/Scripts/TowerListResource.gd.uid diff --git a/Towers/Scripts/TowerManager.gd b/Towers/Scripts/TowerManager.gd index c8ffe4c..3093962 100644 --- a/Towers/Scripts/TowerManager.gd +++ b/Towers/Scripts/TowerManager.gd @@ -1,7 +1,6 @@ extends Node3D class_name TowerManager -const towerListResource : TowerListResource = preload("res://Towers/towers.tres") enum STATE { IDLE, PLACING } var _state : int = STATE.IDLE @@ -76,7 +75,7 @@ func handle_player_controls() -> void: func place_tower() -> void: _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) add_child(selected_tower) selected_tower.can_shoot = false diff --git a/Towers/Victoria/victoria.tscn b/Towers/Victoria/victoria.tscn index e9e64d2..7cd37c2 100644 --- a/Towers/Victoria/victoria.tscn +++ b/Towers/Victoria/victoria.tscn @@ -9,11 +9,11 @@ [node name="Victoria" instance=ExtResource("1_ki73m")] script = ExtResource("2_vl5h5") tower_name = "Victoria" +tower_type = 4 icone = ExtResource("3_tmg5m") bio = "" -bullet_damage = 1 tower_shop = Array[ExtResource("4_uso5g")]([]) -[node name="Sprite3D" parent="." index="6"] +[node name="Sprite3D" parent="." index="5"] texture = ExtResource("5_2rqsg") frame = 59 diff --git a/Towers/tower.tscn b/Towers/tower.tscn index 13d8419..b2ea75b 100644 --- a/Towers/tower.tscn +++ b/Towers/tower.tscn @@ -20,7 +20,6 @@ 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." -projectile_damage = 5 tower_shop = Array[ExtResource("3_5dr1v")]([ExtResource("3_jv31o"), ExtResource("4_5dr1v")]) [node name="CollisionShape3D" type="CollisionShape3D" parent="."] diff --git a/Towers/towers.tres b/Towers/towers.tres deleted file mode 100644 index 832eb5f..0000000 --- a/Towers/towers.tres +++ /dev/null @@ -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")]) diff --git a/UI/gui.gd b/UI/gui.gd index bd764df..165f4a2 100644 --- a/UI/gui.gd +++ b/UI/gui.gd @@ -4,7 +4,6 @@ extends Control const BUTTON_QTY = 12 const towerButton : PackedScene = preload("res://UI/tower_button.tscn") -var towerListResource : TowerListResource = preload("res://Towers/towers.tres") @onready var buttonContainer = $HBoxContainer/ControlPanelBase/MarginContainer/GridContainer @@ -14,8 +13,6 @@ var allowedTowers : Array[Tower.TYPE] func _ready() -> void: addTowerButtonNodes() EventBus.allowedTowerHasChange.connect(allowedTowerHasChange) - if Engine.is_editor_hint(): - towerListResource.changed.connect(addTowerButtonNodes) func _on_button_cube_pressed() -> void: @@ -42,22 +39,24 @@ func addTowerButtonNodes() -> void: node.queue_free() var additionalPlaceholder : int = 0 - for towerResource in towerListResource.towers: - if !towerResource || not allowedTowers.has(towerResource.towerType): + for towerType in TowerListResource.towers: + if not Engine.is_editor_hint() && not allowedTowers.has(towerType): additionalPlaceholder += 1 - continue + else: + createTowerButton(towerType) - var towerBtn : TowerButton = towerButton.instantiate() - 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: + for i in BUTTON_QTY - TowerListResource.towers.size() + additionalPlaceholder: var placeholderBtn : Button = Button.new() placeholderBtn.set_meta("dynamicButton", true) placeholderBtn.custom_minimum_size = Vector2(80, 80) 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) diff --git a/addons/LevelEditor/WaveMaker.gd b/addons/LevelEditor/WaveMaker.gd index bf43fe2..0d761e3 100644 --- a/addons/LevelEditor/WaveMaker.gd +++ b/addons/LevelEditor/WaveMaker.gd @@ -1,11 +1,12 @@ @tool extends Control -const LEVEL_PATH : String = "res://Levels" -const LEVEL_REGEX_PATERN : String = "(level_.*)\\.tres" +const LEVEL_PATH : String = "res://Levels/" +const LEVEL_REGEX_PATERN : String = "(level_.*)\\.tres$" +const LEVEL_PATH_REGEX_PATERN : String = "res://Levels/[^/]*/$" -const ENEMY_PATH : String = "res://enemies" -const ENEMY_REGEX_PATERN : String = "(enemy.*)\\.tscn" +const ENEMY_PATH : String = "res://enemies/" +const ENEMY_REGEX_PATERN : String = "(enemy.*)\\.tscn$" const BASE_LABEL_SETTINGS = preload("res://addons/LevelEditor/UI/baseLabel.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() - enemySelector.onValueChanged.connect(func(resourcePath): troop.enemy = load(resourcePath)) - var enemy : String = troop.enemy.resource_path if troop.enemy else "" - enemySelector.setOptions(enemies, enemy) + enemySelector.onValueChanged.connect(func(resourcePath): troop.enemy = resourcePath) + enemySelector.setOptions(enemies, troop.enemy) qtyEdit.add_child(enemySelector) ennemyContainer.add_child(qtyEdit) @@ -199,7 +199,7 @@ func refreshWaveNode(wave : Wave, waveIdx : int) -> void: var waveNode : VBoxContainer = waveTabContainer.get_child(waveIdx) waveTabContainer.remove_child(waveNode) waveNode.queue_free() - var waveUI : = buildWave(wave) + var waveUI : VBoxContainer = buildWave(wave) waveTabContainer.add_child(waveUI) waveTabContainer.move_child(waveUI, waveIdx) recreateTabBar() @@ -213,7 +213,7 @@ func cleanAndBuildMenu() -> void: func resetApp() -> void: 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() @@ -280,14 +280,14 @@ func onSelectedTowerChange(index: int, selected: int) -> void: level.allowedTowers.erase(index) -func getOptionsFromFile(path : String, regexPattern : String) -> Dictionary : - var files = {} - var regex : RegEx = RegEx.create_from_string(regexPattern) - var dir : DirAccess = DirAccess.open(path) - for file in dir.get_files(): +func getOptionsFromFile(path : String, regexPattern : String, pathRegexPattern : String = "") -> Dictionary : + var files : Dictionary + var filePaths : Array[String] = EnhancedResource.getFileFromDir(path, regexPattern, pathRegexPattern) + var regex : RegEx = RegEx.create_from_string(regexPattern) + + for file in filePaths: var fileMatch : RegExMatch = regex.search(file) - if fileMatch: - files.set(fileMatch.strings[1], path + "/" + file) + files.set(fileMatch.strings[1], file) return files diff --git a/addons/LevelEditor/wave_maker.tscn b/addons/LevelEditor/wave_maker.tscn index 2fc7144..3cbe854 100644 --- a/addons/LevelEditor/wave_maker.tscn +++ b/addons/LevelEditor/wave_maker.tscn @@ -28,11 +28,7 @@ layout_mode = 2 [node name="LevelSelect" type="OptionButton" parent="VBoxContainer2/HBoxContainer"] layout_mode = 2 -selected = 0 allow_reselect = true -item_count = 1 -popup/item_0/text = "level_1" -popup/item_0/id = 0 script = ExtResource("2_xjxpq") metadata/_custom_type_script = "uid://b47p2u458hsn0"