feat: implement procedural arena generation system and support infrastructure

This commit is contained in:
DottsGit
2026-06-09 19:45:35 -04:00
parent 8c61318a16
commit 9c653cac48
20 changed files with 3816 additions and 13 deletions
+29 -13
View File
@@ -87,17 +87,7 @@ func _ready() -> void:
cards_hbox.size_flags_vertical = Control.SIZE_EXPAND_FILL
_level_selector_panel.add_child(cards_hbox)
# Level 1: Dust 2
var d2_gradient = Gradient.new()
d2_gradient.add_point(0.0, Color(0.9, 0.8, 0.6)) # Sand
d2_gradient.add_point(1.0, Color(0.6, 0.5, 0.3)) # Dark sand
_build_level_card(cards_hbox, "Dust 2", "res://scenes/dust2_level/dust2_level.tscn", d2_gradient)
# Level 2: Test Level
var tl_gradient = Gradient.new()
tl_gradient.add_point(0.0, Color(0.2, 0.2, 0.25)) # Dark grey
tl_gradient.add_point(1.0, Color(0.3, 0.5, 0.6)) # Steel blue
_build_level_card(cards_hbox, "Test Level", "res://scenes/test_level/test_level.tscn", tl_gradient)
_load_maps_modularly(cards_hbox, false, Vector2(300, 400))
var ls_spacer = Control.new()
ls_spacer.custom_minimum_size = Vector2(0, 20)
@@ -224,8 +214,7 @@ func _ready() -> void:
hl_cards.add_theme_constant_override("separation", 20)
hl_left.add_child(hl_cards)
_build_level_card(hl_cards, "Dust 2", "res://scenes/dust2_level/dust2_level.tscn", d2_gradient, true, Vector2(200, 250))
_build_level_card(hl_cards, "Test Level", "res://scenes/test_level/test_level.tscn", tl_gradient, true, Vector2(200, 250))
_load_maps_modularly(hl_cards, true, Vector2(200, 250))
var mode_label = Label.new()
mode_label.text = "Gamemode"
@@ -277,6 +266,33 @@ func _ready() -> void:
_host_lobby_players_list.add_theme_font_size_override("font_size", 24)
hl_right.add_child(_host_lobby_players_list)
func _load_maps_modularly(target_hbox: Container, is_multiplayer: bool, card_size: Vector2) -> void:
var maps_dir = "res://scenes/maps/"
var dir = DirAccess.open(maps_dir)
if not dir:
return
dir.list_dir_begin()
var folder_name = dir.get_next()
while folder_name != "":
if dir.current_is_dir() and not folder_name.begins_with("."):
var cfg_path = maps_dir + folder_name + "/map_meta.cfg"
if FileAccess.file_exists(cfg_path):
var cfg = ConfigFile.new()
if cfg.load(cfg_path) == OK:
var map_name = cfg.get_value("map", "name", "Unknown Map")
var scene_path = cfg.get_value("map", "scene_path", "")
var c1 = cfg.get_value("map", "color1", Color(0.5, 0.5, 0.5))
var c2 = cfg.get_value("map", "color2", Color(0.2, 0.2, 0.2))
if scene_path != "":
var grad = Gradient.new()
# A new Gradient has 2 points at 0.0 and 1.0 by default. Set their colors directly.
grad.set_color(0, c1)
grad.set_color(1, c2)
_build_level_card(target_hbox, map_name, scene_path, grad, is_multiplayer, card_size)
folder_name = dir.get_next()
func _build_level_card(parent: Container, title: String, scene_path: String, gradient: Gradient, is_multiplayer: bool = false, card_size: Vector2 = Vector2(300, 400)) -> void:
var btn = TextureButton.new()
btn.custom_minimum_size = card_size