feat: add lane management + improve tower access

This commit is contained in:
Varylios 2025-09-01 17:32:21 +02:00
parent 634eafad62
commit 2497befa7c
22 changed files with 140 additions and 125 deletions

View 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

View file

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

View file

@ -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"

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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")
} }

View file

@ -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

View file

@ -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()

View file

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

View 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()

View file

@ -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

View file

@ -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

View file

@ -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="."]

View file

@ -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")])

View file

@ -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)

View file

@ -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 filePaths : Array[String] = EnhancedResource.getFileFromDir(path, regexPattern, pathRegexPattern)
var regex : RegEx = RegEx.create_from_string(regexPattern) var regex : RegEx = RegEx.create_from_string(regexPattern)
var dir : DirAccess = DirAccess.open(path)
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

View file

@ -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"