From 5cb64ff8655e7d913defc2ae02b0478515a39f82 Mon Sep 17 00:00:00 2001 From: The Bard Who Codes Date: Wed, 25 Jun 2025 16:51:56 -0400 Subject: [PATCH 1/8] Removed "hard-coded" TileMapLayers from Room Generator --- scenes/room_generator.tscn | 30 ++---------------------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/scenes/room_generator.tscn b/scenes/room_generator.tscn index f8fc81f..4d48e53 100644 --- a/scenes/room_generator.tscn +++ b/scenes/room_generator.tscn @@ -1,29 +1,3 @@ -[gd_scene load_steps=7 format=3 uid="uid://dmfohcgyw6m8y"] +[gd_scene format=3 uid="uid://dmfohcgyw6m8y"] -[ext_resource type="TileSet" uid="uid://bsusnci8cuc5k" path="res://resources/terrain_procgen_tileset.tres" id="1_dy51p"] -[ext_resource type="Script" uid="uid://b0olx5d38bq7u" path="res://scripts/room_generator.gd" id="1_mhcj8"] -[ext_resource type="PackedScene" uid="uid://dkkdcx534ran6" path="res://scenes/player/player.tscn" id="4_nayog"] -[ext_resource type="PackedScene" uid="uid://didh1mtde07hl" path="res://scenes/door.tscn" id="5_t8u47"] - -[sub_resource type="TileSetScenesCollectionSource" id="TileSetScenesCollectionSource_4ctu1"] -scenes/1/scene = ExtResource("4_nayog") -scenes/2/scene = ExtResource("5_t8u47") - -[sub_resource type="TileSet" id="TileSet_gjms6"] -tile_size = Vector2i(64, 64) -custom_data_layer_0/name = "Col" -custom_data_layer_0/type = 2 -sources/1 = SubResource("TileSetScenesCollectionSource_4ctu1") - -[node name="RoomGenerator" type="Node"] - -[node name="Floor" type="TileMapLayer" parent="." node_paths=PackedStringArray("object_layer")] -tile_set = ExtResource("1_dy51p") -script = ExtResource("1_mhcj8") -object_layer = NodePath("../Objects") -room_height = 20 -room_width = 20 -walker_steps = 110 - -[node name="Objects" type="TileMapLayer" parent="."] -tile_set = SubResource("TileSet_gjms6") +[node name="RoomGenerator" type="Node2D"] From 58230603b7bf3ba1cb6707a70a56dfa78383fa68 Mon Sep 17 00:00:00 2001 From: The Bard Who Codes Date: Thu, 26 Jun 2025 09:24:46 -0400 Subject: [PATCH 2/8] Removed unused terrains --- resources/test1_terrain_procgen_tileset.tres | 261 ---------------- resources/test2_terrain_procgen_tileset.tres | 306 ------------------- 2 files changed, 567 deletions(-) delete mode 100644 resources/test1_terrain_procgen_tileset.tres delete mode 100644 resources/test2_terrain_procgen_tileset.tres diff --git a/resources/test1_terrain_procgen_tileset.tres b/resources/test1_terrain_procgen_tileset.tres deleted file mode 100644 index 82f9137..0000000 --- a/resources/test1_terrain_procgen_tileset.tres +++ /dev/null @@ -1,261 +0,0 @@ -[gd_resource type="TileSet" load_steps=3 format=3 uid="uid://v6fy4vtv8aou"] - -[ext_resource type="Texture2D" uid="uid://crefoa48rduqs" path="res://assets/tilemaps/ss-terrain-tileset.png" id="1_he40j"] - -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_pwo4d"] -texture = ExtResource("1_he40j") -texture_region_size = Vector2i(64, 64) -0:0/0 = 0 -0:0/0/terrain_set = 0 -0:0/0/terrain = 1 -0:0/0/terrains_peering_bit/right_side = 1 -0:0/0/terrains_peering_bit/bottom_side = 1 -0:0/0/terrains_peering_bit/left_side = 0 -0:0/0/terrains_peering_bit/top_side = 0 -1:0/0 = 0 -1:0/0/terrain_set = 0 -1:0/0/terrain = 1 -1:0/0/terrains_peering_bit/right_side = 1 -1:0/0/terrains_peering_bit/bottom_side = 0 -1:0/0/terrains_peering_bit/left_side = 1 -1:0/0/terrains_peering_bit/top_side = 0 -2:0/0 = 0 -2:0/0/terrain_set = 0 -2:0/0/terrain = 1 -2:0/0/terrains_peering_bit/right_side = 0 -2:0/0/terrains_peering_bit/bottom_side = 1 -2:0/0/terrains_peering_bit/left_side = 1 -2:0/0/terrains_peering_bit/top_side = 0 -3:0/0 = 0 -3:0/0/terrain_set = 0 -3:0/0/terrain = 1 -3:0/0/terrains_peering_bit/right_side = 1 -3:0/0/terrains_peering_bit/bottom_right_corner = 1 -3:0/0/terrains_peering_bit/bottom_side = 1 -3:0/0/terrains_peering_bit/top_side = 0 -4:0/0 = 0 -4:0/0/terrain_set = 0 -4:0/0/terrain = 1 -4:0/0/terrains_peering_bit/right_side = 1 -4:0/0/terrains_peering_bit/bottom_right_corner = 1 -4:0/0/terrains_peering_bit/bottom_side = 1 -4:0/0/terrains_peering_bit/bottom_left_corner = 1 -4:0/0/terrains_peering_bit/left_side = 1 -4:0/0/terrains_peering_bit/top_side = 0 -5:0/0 = 0 -5:0/0/terrain_set = 0 -5:0/0/terrain = 1 -5:0/0/terrains_peering_bit/bottom_side = 1 -5:0/0/terrains_peering_bit/bottom_left_corner = 1 -5:0/0/terrains_peering_bit/left_side = 1 -5:0/0/terrains_peering_bit/top_side = 0 -6:0/0 = 0 -7:0/0 = 0 -8:0/0 = 0 -9:0/0 = 0 -10:0/0 = 0 -11:0/0 = 0 -0:1/0 = 0 -0:1/0/terrain_set = 0 -0:1/0/terrain = 1 -0:1/0/terrains_peering_bit/bottom_side = 1 -0:1/0/terrains_peering_bit/left_side = 0 -0:1/0/terrains_peering_bit/top_side = 1 -1:1/0 = 0 -1:1/0/terrain_set = 0 -1:1/0/terrain = 1 -1:1/0/terrains_peering_bit/right_side = 1 -1:1/0/terrains_peering_bit/bottom_side = 1 -1:1/0/terrains_peering_bit/left_side = 1 -1:1/0/terrains_peering_bit/top_side = 1 -2:1/0 = 0 -2:1/0/terrain_set = 0 -2:1/0/terrain = 1 -2:1/0/terrains_peering_bit/right_side = 0 -2:1/0/terrains_peering_bit/bottom_side = 0 -2:1/0/terrains_peering_bit/left_side = 1 -2:1/0/terrains_peering_bit/top_side = 1 -3:1/0 = 0 -3:1/0/terrain_set = 0 -3:1/0/terrain = 1 -3:1/0/terrains_peering_bit/right_side = 1 -3:1/0/terrains_peering_bit/bottom_right_corner = 1 -3:1/0/terrains_peering_bit/bottom_side = 1 -3:1/0/terrains_peering_bit/left_side = 0 -3:1/0/terrains_peering_bit/top_side = 1 -3:1/0/terrains_peering_bit/top_right_corner = 1 -4:1/0 = 0 -4:1/0/terrain_set = 0 -4:1/0/terrain = 1 -4:1/0/terrains_peering_bit/right_side = 1 -4:1/0/terrains_peering_bit/bottom_right_corner = 1 -4:1/0/terrains_peering_bit/bottom_side = 1 -4:1/0/terrains_peering_bit/bottom_left_corner = 1 -4:1/0/terrains_peering_bit/left_side = 1 -4:1/0/terrains_peering_bit/top_left_corner = 1 -4:1/0/terrains_peering_bit/top_side = 1 -4:1/0/terrains_peering_bit/top_right_corner = 1 -5:1/0 = 0 -5:1/0/terrain_set = 0 -5:1/0/terrain = 1 -5:1/0/terrains_peering_bit/right_side = 0 -5:1/0/terrains_peering_bit/bottom_side = 1 -5:1/0/terrains_peering_bit/bottom_left_corner = 1 -5:1/0/terrains_peering_bit/left_side = 1 -5:1/0/terrains_peering_bit/top_left_corner = 1 -5:1/0/terrains_peering_bit/top_side = 1 -6:1/0 = 0 -7:1/0 = 0 -8:1/0 = 0 -9:1/0 = 0 -10:1/0 = 0 -11:1/0 = 0 -0:2/0 = 0 -0:2/0/terrain_set = 0 -0:2/0/terrain = 1 -0:2/0/terrains_peering_bit/right_side = 1 -0:2/0/terrains_peering_bit/bottom_side = 0 -0:2/0/terrains_peering_bit/left_side = 0 -0:2/0/terrains_peering_bit/top_side = 1 -1:2/0 = 0 -1:2/0/terrain_set = 0 -1:2/0/terrain = 1 -1:2/0/terrains_peering_bit/right_side = 1 -1:2/0/terrains_peering_bit/bottom_side = 1 -1:2/0/terrains_peering_bit/left_side = 1 -2:2/0 = 0 -2:2/0/terrain_set = 0 -2:2/0/terrain = 1 -2:2/0/terrains_peering_bit/bottom_side = 1 -2:2/0/terrains_peering_bit/left_side = 1 -2:2/0/terrains_peering_bit/top_side = 1 -3:2/0 = 0 -3:2/0/terrain_set = 0 -3:2/0/terrain = 1 -3:2/0/terrains_peering_bit/right_side = 1 -3:2/0/terrains_peering_bit/bottom_side = 0 -3:2/0/terrains_peering_bit/left_side = 0 -3:2/0/terrains_peering_bit/top_side = 1 -3:2/0/terrains_peering_bit/top_right_corner = 1 -4:2/0 = 0 -4:2/0/terrain_set = 0 -4:2/0/terrain = 1 -4:2/0/terrains_peering_bit/right_side = 1 -4:2/0/terrains_peering_bit/bottom_side = 0 -4:2/0/terrains_peering_bit/left_side = 1 -4:2/0/terrains_peering_bit/top_left_corner = 1 -4:2/0/terrains_peering_bit/top_side = 1 -4:2/0/terrains_peering_bit/top_right_corner = 1 -5:2/0 = 0 -5:2/0/terrain_set = 0 -5:2/0/terrain = 1 -5:2/0/terrains_peering_bit/right_side = 0 -5:2/0/terrains_peering_bit/bottom_side = 0 -5:2/0/terrains_peering_bit/left_side = 1 -5:2/0/terrains_peering_bit/top_left_corner = 1 -5:2/0/terrains_peering_bit/top_side = 1 -6:2/0 = 0 -7:2/0 = 0 -8:2/0 = 0 -9:2/0 = 0 -10:2/0 = 0 -11:2/0 = 0 -0:3/0 = 0 -0:3/0/terrain_set = 0 -0:3/0/terrain = 1 -0:3/0/terrains_peering_bit/bottom_side = 0 -0:3/0/terrains_peering_bit/top_side = 1 -1:3/0 = 0 -1:3/0/terrain_set = 0 -1:3/0/terrain = 1 -1:3/0/terrains_peering_bit/right_side = 1 -1:3/0/terrains_peering_bit/bottom_side = 1 -1:3/0/terrains_peering_bit/top_side = 1 -2:3/0 = 0 -2:3/0/terrain_set = 0 -2:3/0/terrain = 1 -2:3/0/terrains_peering_bit/right_side = 1 -2:3/0/terrains_peering_bit/left_side = 1 -2:3/0/terrains_peering_bit/top_side = 1 -3:3/0 = 0 -4:3/0 = 0 -5:3/0 = 0 -6:3/0 = 0 -7:3/0 = 0 -8:3/0 = 0 -9:3/0 = 0 -10:3/0 = 0 -11:3/0 = 0 -0:4/0 = 0 -1:4/0 = 0 -2:4/0 = 0 -3:4/0 = 0 -4:4/0 = 0 -5:4/0 = 0 -6:4/0 = 0 -7:4/0 = 0 -8:4/0 = 0 -9:4/0 = 0 -10:4/0 = 0 -11:4/0 = 0 -0:5/0 = 0 -0:5/0/terrain_set = 0 -0:5/0/terrain = 0 -0:5/0/terrains_peering_bit/right_side = 0 -0:5/0/terrains_peering_bit/left_side = 0 -1:5/0 = 0 -1:5/0/terrain_set = 0 -1:5/0/terrain = 0 -1:5/0/terrains_peering_bit/bottom_side = 0 -1:5/0/terrains_peering_bit/top_side = 0 -2:5/0 = 0 -2:5/0/terrain_set = 0 -2:5/0/terrain = 0 -2:5/0/terrains_peering_bit/right_side = 0 -2:5/0/terrains_peering_bit/bottom_right_corner = 1 -2:5/0/terrains_peering_bit/bottom_side = 0 -2:5/0/terrains_peering_bit/bottom_left_corner = 1 -2:5/0/terrains_peering_bit/left_side = 0 -2:5/0/terrains_peering_bit/top_left_corner = 1 -2:5/0/terrains_peering_bit/top_side = 0 -2:5/0/terrains_peering_bit/top_right_corner = 1 -3:5/0 = 0 -4:5/0 = 0 -5:5/0 = 0 -5:5/0/terrain_set = 0 -5:5/0/terrain = 0 -5:5/0/terrains_peering_bit/right_side = 0 -5:5/0/terrains_peering_bit/bottom_right_corner = 0 -5:5/0/terrains_peering_bit/bottom_side = 0 -5:5/0/terrains_peering_bit/bottom_left_corner = 0 -5:5/0/terrains_peering_bit/left_side = 0 -5:5/0/terrains_peering_bit/top_left_corner = 0 -5:5/0/terrains_peering_bit/top_side = 0 -5:5/0/terrains_peering_bit/top_right_corner = 0 -6:5/0 = 0 -7:5/0 = 0 -8:5/0 = 0 -9:5/0 = 0 -10:5/0 = 0 -11:5/0 = 0 -0:6/0 = 0 -1:6/0 = 0 -2:6/0 = 0 -3:6/0 = 0 -4:6/0 = 0 -5:6/0 = 0 -6:6/0 = 0 -7:6/0 = 0 -8:6/0 = 0 -9:6/0 = 0 -10:6/0 = 0 -11:6/0 = 0 - -[resource] -tile_size = Vector2i(64, 64) -terrain_set_0/mode = 0 -terrain_set_0/terrain_0/name = "FLOOR" -terrain_set_0/terrain_0/color = Color(0.716466, 0, 0.257344, 1) -terrain_set_0/terrain_1/name = "WALL" -terrain_set_0/terrain_1/color = Color(0.242581, 0.332068, 1, 1) -sources/0 = SubResource("TileSetAtlasSource_pwo4d") diff --git a/resources/test2_terrain_procgen_tileset.tres b/resources/test2_terrain_procgen_tileset.tres deleted file mode 100644 index 17bd6b7..0000000 --- a/resources/test2_terrain_procgen_tileset.tres +++ /dev/null @@ -1,306 +0,0 @@ -[gd_resource type="TileSet" load_steps=3 format=3 uid="uid://bsxyvnp83jqxa"] - -[ext_resource type="Texture2D" uid="uid://dwbgfnntqqseb" path="res://assets/tilemaps/ss-terrain-tileset-2.png" id="1_dxum0"] - -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_l8nrd"] -texture = ExtResource("1_dxum0") -texture_region_size = Vector2i(64, 64) -0:0/0 = 0 -0:0/0/terrain_set = 0 -0:0/0/terrain = 1 -0:0/0/terrains_peering_bit/bottom_side = 1 -1:0/0 = 0 -1:0/0/terrain_set = 0 -1:0/0/terrain = 1 -1:0/0/terrains_peering_bit/right_side = 1 -1:0/0/terrains_peering_bit/bottom_side = 1 -2:0/0 = 0 -2:0/0/terrain_set = 0 -2:0/0/terrain = 1 -2:0/0/terrains_peering_bit/right_side = 1 -2:0/0/terrains_peering_bit/bottom_side = 1 -2:0/0/terrains_peering_bit/left_side = 1 -3:0/0 = 0 -3:0/0/terrain_set = 0 -3:0/0/terrain = 1 -3:0/0/terrains_peering_bit/bottom_side = 1 -3:0/0/terrains_peering_bit/left_side = 1 -4:0/0 = 0 -5:0/0 = 0 -5:0/0/terrain_set = 0 -5:0/0/terrain = 1 -5:0/0/terrains_peering_bit/right_side = 1 -5:0/0/terrains_peering_bit/bottom_right_corner = 1 -5:0/0/terrains_peering_bit/bottom_side = 1 -5:0/0/terrains_peering_bit/left_side = 1 -6:0/0 = 0 -6:0/0/terrain_set = 0 -6:0/0/terrain = 1 -6:0/0/terrains_peering_bit/right_side = 1 -6:0/0/terrains_peering_bit/bottom_side = 1 -6:0/0/terrains_peering_bit/bottom_left_corner = 1 -6:0/0/terrains_peering_bit/left_side = 1 -7:0/0 = 0 -8:0/0 = 0 -9:0/0 = 0 -10:0/0 = 0 -10:0/0/terrain_set = 0 -10:0/0/terrain = 1 -10:0/0/terrains_peering_bit/right_side = 1 -10:0/0/terrains_peering_bit/bottom_right_corner = 1 -10:0/0/terrains_peering_bit/bottom_side = 1 -10:0/0/terrains_peering_bit/bottom_left_corner = 1 -10:0/0/terrains_peering_bit/left_side = 1 -11:0/0 = 0 -12:0/0 = 0 -13:0/0 = 0 -13:0/0/terrain_set = 0 -13:0/0/terrain = 1 -13:0/0/terrains_peering_bit/right_side = 1 -13:0/0/terrains_peering_bit/bottom_right_corner = 1 -13:0/0/terrains_peering_bit/bottom_side = 1 -13:0/0/terrains_peering_bit/top_side = 1 -13:0/0/terrains_peering_bit/top_right_corner = 1 -14:0/0 = 0 -14:0/0/terrain_set = 0 -14:0/0/terrain = 1 -14:0/0/terrains_peering_bit/bottom_side = 1 -14:0/0/terrains_peering_bit/bottom_left_corner = 1 -14:0/0/terrains_peering_bit/left_side = 1 -14:0/0/terrains_peering_bit/top_left_corner = 1 -14:0/0/terrains_peering_bit/top_side = 1 -0:1/0 = 0 -0:1/0/terrain_set = 0 -0:1/0/terrain = 1 -0:1/0/terrains_peering_bit/bottom_side = 1 -0:1/0/terrains_peering_bit/top_side = 1 -1:1/0 = 0 -1:1/0/terrain_set = 0 -1:1/0/terrain = 1 -1:1/0/terrains_peering_bit/right_side = 1 -1:1/0/terrains_peering_bit/bottom_side = 1 -1:1/0/terrains_peering_bit/top_side = 1 -2:1/0 = 0 -2:1/0/terrain_set = 0 -2:1/0/terrain = 1 -2:1/0/terrains_peering_bit/right_side = 1 -2:1/0/terrains_peering_bit/bottom_side = 1 -2:1/0/terrains_peering_bit/left_side = 1 -2:1/0/terrains_peering_bit/top_side = 1 -3:1/0 = 0 -3:1/0/terrain_set = 0 -3:1/0/terrain = 1 -3:1/0/terrains_peering_bit/bottom_side = 1 -3:1/0/terrains_peering_bit/left_side = 1 -3:1/0/terrains_peering_bit/top_side = 1 -4:1/0 = 0 -4:1/0/terrain_set = 0 -4:1/0/terrain = 1 -4:1/0/terrains_peering_bit/right_side = 1 -4:1/0/terrains_peering_bit/bottom_right_corner = 1 -4:1/0/terrains_peering_bit/bottom_side = 1 -4:1/0/terrains_peering_bit/top_side = 1 -5:1/0 = 0 -5:1/0/terrain_set = 0 -5:1/0/terrain = 1 -5:1/0/terrains_peering_bit/right_side = 1 -5:1/0/terrains_peering_bit/bottom_right_corner = 1 -5:1/0/terrains_peering_bit/bottom_side = 1 -5:1/0/terrains_peering_bit/bottom_left_corner = 1 -5:1/0/terrains_peering_bit/left_side = 1 -5:1/0/terrains_peering_bit/top_side = 1 -5:1/0/terrains_peering_bit/top_right_corner = 1 -6:1/0 = 0 -6:1/0/terrain_set = 0 -6:1/0/terrain = 1 -6:1/0/terrains_peering_bit/right_side = 1 -6:1/0/terrains_peering_bit/bottom_right_corner = 1 -6:1/0/terrains_peering_bit/bottom_side = 1 -6:1/0/terrains_peering_bit/bottom_left_corner = 1 -6:1/0/terrains_peering_bit/left_side = 1 -6:1/0/terrains_peering_bit/top_left_corner = 1 -6:1/0/terrains_peering_bit/top_side = 1 -7:1/0 = 0 -7:1/0/terrain_set = 0 -7:1/0/terrain = 1 -7:1/0/terrains_peering_bit/bottom_side = 1 -7:1/0/terrains_peering_bit/bottom_left_corner = 1 -7:1/0/terrains_peering_bit/left_side = 1 -7:1/0/terrains_peering_bit/top_side = 1 -8:1/0 = 0 -9:1/0 = 0 -10:1/0 = 0 -10:1/0/terrain_set = 0 -10:1/0/terrain = 1 -10:1/0/terrains_peering_bit/right_side = 1 -10:1/0/terrains_peering_bit/bottom_right_corner = 1 -10:1/0/terrains_peering_bit/bottom_side = 1 -10:1/0/terrains_peering_bit/bottom_left_corner = 1 -10:1/0/terrains_peering_bit/left_side = 1 -10:1/0/terrains_peering_bit/top_left_corner = 1 -10:1/0/terrains_peering_bit/top_side = 1 -10:1/0/terrains_peering_bit/top_right_corner = 1 -11:1/0 = 0 -12:1/0 = 0 -13:1/0 = 0 -14:1/0 = 0 -0:2/0 = 0 -0:2/0/terrain_set = 0 -0:2/0/terrain = 1 -0:2/0/terrains_peering_bit/top_side = 1 -1:2/0 = 0 -1:2/0/terrain_set = 0 -1:2/0/terrain = 1 -1:2/0/terrains_peering_bit/right_side = 1 -1:2/0/terrains_peering_bit/top_side = 1 -2:2/0 = 0 -2:2/0/terrain_set = 0 -2:2/0/terrain = 1 -2:2/0/terrains_peering_bit/right_side = 1 -2:2/0/terrains_peering_bit/left_side = 1 -2:2/0/terrains_peering_bit/top_side = 1 -3:2/0 = 0 -3:2/0/terrain_set = 0 -3:2/0/terrain = 1 -3:2/0/terrains_peering_bit/left_side = 1 -3:2/0/terrains_peering_bit/top_side = 1 -4:2/0 = 0 -4:2/0/terrain_set = 0 -4:2/0/terrain = 1 -4:2/0/terrains_peering_bit/right_side = 1 -4:2/0/terrains_peering_bit/bottom_side = 1 -4:2/0/terrains_peering_bit/top_side = 1 -4:2/0/terrains_peering_bit/top_right_corner = 1 -5:2/0 = 0 -5:2/0/terrain_set = 0 -5:2/0/terrain = 1 -5:2/0/terrains_peering_bit/right_side = 1 -5:2/0/terrains_peering_bit/bottom_right_corner = 1 -5:2/0/terrains_peering_bit/bottom_side = 1 -5:2/0/terrains_peering_bit/left_side = 1 -5:2/0/terrains_peering_bit/top_left_corner = 1 -5:2/0/terrains_peering_bit/top_side = 1 -5:2/0/terrains_peering_bit/top_right_corner = 1 -6:2/0 = 0 -6:2/0/terrain_set = 0 -6:2/0/terrain = 1 -6:2/0/terrains_peering_bit/right_side = 1 -6:2/0/terrains_peering_bit/bottom_side = 1 -6:2/0/terrains_peering_bit/bottom_left_corner = 1 -6:2/0/terrains_peering_bit/left_side = 1 -6:2/0/terrains_peering_bit/top_left_corner = 1 -6:2/0/terrains_peering_bit/top_side = 1 -6:2/0/terrains_peering_bit/top_right_corner = 1 -7:2/0 = 0 -7:2/0/terrain_set = 0 -7:2/0/terrain = 1 -7:2/0/terrains_peering_bit/bottom_side = 1 -7:2/0/terrains_peering_bit/left_side = 1 -7:2/0/terrains_peering_bit/top_left_corner = 1 -7:2/0/terrains_peering_bit/top_side = 1 -8:2/0 = 0 -9:2/0 = 0 -10:2/0 = 0 -11:2/0 = 0 -12:2/0 = 0 -13:2/0 = 0 -14:2/0 = 0 -0:3/0 = 0 -0:3/0/terrain_set = 0 -0:3/0/terrain = 1 -1:3/0 = 0 -1:3/0/terrain_set = 0 -1:3/0/terrain = 1 -1:3/0/terrains_peering_bit/right_side = 1 -2:3/0 = 0 -2:3/0/terrain_set = 0 -2:3/0/terrain = 1 -2:3/0/terrains_peering_bit/right_side = 1 -2:3/0/terrains_peering_bit/left_side = 1 -3:3/0 = 0 -3:3/0/terrain_set = 0 -3:3/0/terrain = 1 -3:3/0/terrains_peering_bit/left_side = 1 -4:3/0 = 0 -5:3/0 = 0 -5:3/0/terrain_set = 0 -5:3/0/terrain = 1 -5:3/0/terrains_peering_bit/right_side = 1 -5:3/0/terrains_peering_bit/left_side = 1 -5:3/0/terrains_peering_bit/top_side = 1 -5:3/0/terrains_peering_bit/top_right_corner = 1 -6:3/0 = 0 -6:3/0/terrain_set = 0 -6:3/0/terrain = 1 -6:3/0/terrains_peering_bit/right_side = 1 -6:3/0/terrains_peering_bit/left_side = 1 -6:3/0/terrains_peering_bit/top_left_corner = 1 -6:3/0/terrains_peering_bit/top_side = 1 -7:3/0 = 0 -8:3/0 = 0 -9:3/0 = 0 -10:3/0 = 0 -11:3/0 = 0 -12:3/0 = 0 -13:3/0 = 0 -14:3/0 = 0 -0:4/0 = 0 -1:4/0 = 0 -1:4/0/terrain_set = 0 -2:4/0 = 0 -3:4/0 = 0 -4:4/0 = 0 -5:4/0 = 0 -6:4/0 = 0 -7:4/0 = 0 -8:4/0 = 0 -9:4/0 = 0 -10:4/0 = 0 -11:4/0 = 0 -12:4/0 = 0 -13:4/0 = 0 -14:4/0 = 0 -0:5/0 = 0 -1:5/0 = 0 -2:5/0 = 0 -3:5/0 = 0 -4:5/0 = 0 -5:5/0 = 0 -6:5/0 = 0 -6:5/0/terrain_set = 0 -6:5/0/terrain = 0 -6:5/0/custom_data_0 = 1 -7:5/0 = 0 -8:5/0 = 0 -9:5/0 = 0 -10:5/0 = 0 -11:5/0 = 0 -12:5/0 = 0 -13:5/0 = 0 -14:5/0 = 0 -0:6/0 = 0 -1:6/0 = 0 -2:6/0 = 0 -3:6/0 = 0 -4:6/0 = 0 -5:6/0 = 0 -6:6/0 = 0 -7:6/0 = 0 -8:6/0 = 0 -9:6/0 = 0 -10:6/0 = 0 -11:6/0 = 0 -12:6/0 = 0 -13:6/0 = 0 -14:6/0 = 0 - -[resource] -tile_size = Vector2i(64, 64) -terrain_set_0/mode = 0 -terrain_set_0/terrain_0/name = "FLOOR" -terrain_set_0/terrain_0/color = Color(0.706839, 0, 0.330287, 1) -terrain_set_0/terrain_1/name = "WALL" -terrain_set_0/terrain_1/color = Color(0.265675, 0.325084, 1, 1) -custom_data_layer_0/name = "Col" -custom_data_layer_0/type = 2 -sources/0 = SubResource("TileSetAtlasSource_l8nrd") From 244a088e3ad77eaec75d4994a4f330ebbf5d58fa Mon Sep 17 00:00:00 2001 From: The Bard Who Codes Date: Thu, 26 Jun 2025 09:25:02 -0400 Subject: [PATCH 3/8] Renamed Proc Gen Terrain --- .../{terrain_procgen_tileset.tres => space_station_terrain.tres} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename resources/{terrain_procgen_tileset.tres => space_station_terrain.tres} (100%) diff --git a/resources/terrain_procgen_tileset.tres b/resources/space_station_terrain.tres similarity index 100% rename from resources/terrain_procgen_tileset.tres rename to resources/space_station_terrain.tres From 62ebb01223f358af70be905700f45cc3824fe6d7 Mon Sep 17 00:00:00 2001 From: The Bard Who Codes Date: Thu, 26 Jun 2025 09:25:19 -0400 Subject: [PATCH 4/8] Added Scene Collection TileSet for space station --- resources/space_station_objects.tres | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 resources/space_station_objects.tres diff --git a/resources/space_station_objects.tres b/resources/space_station_objects.tres new file mode 100644 index 0000000..1c5a17e --- /dev/null +++ b/resources/space_station_objects.tres @@ -0,0 +1,12 @@ +[gd_resource type="TileSet" load_steps=4 format=3 uid="uid://b7oyh106ko6lk"] + +[ext_resource type="PackedScene" uid="uid://dkkdcx534ran6" path="res://scenes/player/player.tscn" id="1_a03rc"] +[ext_resource type="PackedScene" uid="uid://didh1mtde07hl" path="res://scenes/door.tscn" id="2_wcvqh"] + +[sub_resource type="TileSetScenesCollectionSource" id="TileSetScenesCollectionSource_sudsc"] +resource_name = "SceneCollection" +scenes/1/scene = ExtResource("1_a03rc") +scenes/2/scene = ExtResource("2_wcvqh") + +[resource] +sources/1 = SubResource("TileSetScenesCollectionSource_sudsc") From fdd80b601abbb3f11bee17dc41ba5baa710f695f Mon Sep 17 00:00:00 2001 From: The Bard Who Codes Date: Thu, 26 Jun 2025 09:25:39 -0400 Subject: [PATCH 5/8] Updated Room Generator code to be more flexible --- scenes/room_generator.tscn | 14 ++++++- scripts/map_generator.gd | 3 ++ scripts/room_generator.gd | 83 ++++++++++++++++++++++++++++---------- 3 files changed, 77 insertions(+), 23 deletions(-) diff --git a/scenes/room_generator.tscn b/scenes/room_generator.tscn index 4d48e53..13d6f8b 100644 --- a/scenes/room_generator.tscn +++ b/scenes/room_generator.tscn @@ -1,3 +1,15 @@ -[gd_scene format=3 uid="uid://dmfohcgyw6m8y"] +[gd_scene load_steps=4 format=3 uid="uid://dmfohcgyw6m8y"] + +[ext_resource type="Script" uid="uid://b0olx5d38bq7u" path="res://scripts/room_generator.gd" id="1_mhcj8"] +[ext_resource type="TileSet" uid="uid://bsusnci8cuc5k" path="res://resources/space_station_terrain.tres" id="2_fs8vn"] +[ext_resource type="TileSet" uid="uid://b7oyh106ko6lk" path="res://resources/space_station_objects.tres" id="3_mhcj8"] [node name="RoomGenerator" type="Node2D"] +script = ExtResource("1_mhcj8") +room_height = 20 +room_width = 20 +floor_tileset = ExtResource("2_fs8vn") +wall_tile = 1 +object_tileset = ExtResource("3_mhcj8") +door_id = 2 +player_id = 1 diff --git a/scripts/map_generator.gd b/scripts/map_generator.gd index 528d65f..82a69ba 100644 --- a/scripts/map_generator.gd +++ b/scripts/map_generator.gd @@ -3,6 +3,9 @@ class_name map_generator ## builds pathfinder for tilemap # --- Exported Properties --- func _ready() -> void: + init_pathfinding() + +func init_pathfinding() -> void: WorldTurnBase.state.actors = [] WorldPathfinder.map = self WorldPathfinder.pathfinder = AStarGrid2D.new() diff --git a/scripts/room_generator.gd b/scripts/room_generator.gd index 4fb8e63..75a25f7 100644 --- a/scripts/room_generator.gd +++ b/scripts/room_generator.gd @@ -1,29 +1,42 @@ ## A procedural room generator that creates rooms using random walkers. ## The generator ensures there is always a valid path between entrance and exit. class_name RoomGenerator -extends map_generator - -## The tilemap layer used for objects (doors and player) -@export var object_layer: TileMapLayer +extends Node2D +@export_category("Room Size") ## The height of the generated room in tiles @export var room_height: int = 10 ## The width of the generated room in tiles @export var room_width: int = 10 +@export_category("Floors & Walls") +## The Tileset that will be used for Floors & Walls +@export var floor_tileset: TileSet + +## Terrain ID for the floor tiles +@export var floor_tile: int + +## Terrain ID for the wall tiles +@export var wall_tile: int + +@export_category("Objects") +## The TileSet that will be used for Objects +@export var object_tileset: TileSet + +## The ID of the door in the Scene Collection +@export var door_id: int + +## The ID of the player in the Scene Collection +@export var player_id: int + +@export_category("Randomization") ## Seed used for random generation. Changing this will create different room layouts @export var _seed: String = "Game dev is difficult" ## Number of steps the walker should take @export var walker_steps: int = 100 -## Terrain ID for floor tiles -var _floor: int = 0 - -## Terrain ID for wall tiles -var wall: int = 1 - ## Random number generator for procedural generation var rng: RandomNumberGenerator @@ -45,11 +58,32 @@ var player_start_position: Vector2i ## Array of exit tile positions var exit_positions: Array[Vector2i] +var floor_layer: map_generator +var object_layer: TileMapLayer + func _ready() -> void: rng = RandomNumberGenerator.new() rng.seed = _seed.hash() + create_layers() generate_room() - super() + floor_layer.init_pathfinding() + +## Creates the neccessary TileMapLayers +func create_layers() -> void: + create_floor_layer() + create_object_layer() + +## Creates the floor layer +func create_floor_layer() -> void: + floor_layer = map_generator.new() + floor_layer.tile_set = floor_tileset + add_child(floor_layer) + +## Creates the object layer +func create_object_layer() -> void: + object_layer = TileMapLayer.new() + object_layer.tile_set = object_tileset + add_child(object_layer) ## Generates a new room layout func generate_room() -> void: @@ -61,7 +95,7 @@ func generate_room() -> void: apply_terrain_changes() func clear_the_previous_room() -> void: - clear() + floor_layer.clear() object_layer.clear() floor_positions.clear() wall_positions.clear() @@ -280,32 +314,37 @@ func apply_terrain_changes() -> void: func apply_floors() -> void: for pos in floor_positions: wall_positions.erase(pos) - set_cells_terrain_connect(floor_positions, 0, _floor, true) + floor_layer.set_cells_terrain_connect(floor_positions, 0, floor_tile, true) ### Apply walls func apply_walls() -> void: - set_cells_terrain_connect(wall_positions, 0, wall, true) + floor_layer.set_cells_terrain_connect(wall_positions, 0, wall_tile, true) ### Apply entrance func apply_entrance() -> void: + print("Entrance Positions:") + print(entrance_positions) + print("------------------") for pos in entrance_positions: wall_positions.erase(pos) - set_cells_terrain_connect(entrance_positions, 0, _floor, true) - object_layer.set_cell(entrance_positions[0], 1, Vector2i.ZERO, 2) - object_layer.set_cell(entrance_positions[1], 1, Vector2i.ZERO, 2) + floor_layer.set_cells_terrain_connect(entrance_positions, 0, floor_tile, true) + object_layer.set_cell(entrance_positions[0], 1, Vector2i.ZERO, door_id) + object_layer.set_cell(entrance_positions[1], 1, Vector2i.ZERO, door_id) ### Apply exit func apply_exit() -> void: + print("Exit Positions:") + print(exit_positions) + print("__________________") for pos in exit_positions: wall_positions.erase(pos) - set_cells_terrain_connect(exit_positions, 0, _floor, true) - object_layer.set_cell(exit_positions[0], 1, Vector2i.ZERO, 2) - object_layer.set_cell(exit_positions[1], 1, Vector2i.ZERO, 2) - + floor_layer.set_cells_terrain_connect(exit_positions, 0, floor_tile, true) + object_layer.set_cell(exit_positions[0], 1, Vector2i.ZERO, door_id) + object_layer.set_cell(exit_positions[1], 1, Vector2i.ZERO, door_id) ### Apply player func apply_player() -> void: - object_layer.set_cell(player_start_position, 1, Vector2i.ZERO, 1) + object_layer.set_cell(player_start_position, 1, Vector2i.ZERO, player_id) ## Checks if a position is in the bounds of the room func is_in_bounds(pos: Vector2i) -> bool: From 9deecc676f5af369c47c6a737c995ebb3e39d67f Mon Sep 17 00:00:00 2001 From: The Bard Who Codes Date: Thu, 26 Jun 2025 09:57:16 -0400 Subject: [PATCH 6/8] Fixed tilesize for the objects tileset --- resources/space_station_objects.tres | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/space_station_objects.tres b/resources/space_station_objects.tres index 1c5a17e..1632ac9 100644 --- a/resources/space_station_objects.tres +++ b/resources/space_station_objects.tres @@ -9,4 +9,5 @@ scenes/1/scene = ExtResource("1_a03rc") scenes/2/scene = ExtResource("2_wcvqh") [resource] +tile_size = Vector2i(64, 64) sources/1 = SubResource("TileSetScenesCollectionSource_sudsc") From 0233cedbeca03ce5380e7de4093ba8adb920549e Mon Sep 17 00:00:00 2001 From: The Bard Who Codes Date: Thu, 26 Jun 2025 14:21:56 -0400 Subject: [PATCH 7/8] Prepare for different types of procedural generators --- scenes/player/world.tscn | 14 +- scenes/room_generator.tscn | 2 - scripts/procedural_generator.gd | 23 +++ scripts/procedural_generator.gd.uid | 1 + scripts/room_generator.gd | 280 ++-------------------------- scripts/walker.gd | 2 +- scripts/walker_generator.gd | 229 +++++++++++++++++++++++ scripts/walker_generator.gd.uid | 1 + 8 files changed, 287 insertions(+), 265 deletions(-) create mode 100644 scripts/procedural_generator.gd create mode 100644 scripts/procedural_generator.gd.uid create mode 100644 scripts/walker_generator.gd create mode 100644 scripts/walker_generator.gd.uid diff --git a/scenes/player/world.tscn b/scenes/player/world.tscn index 24af01c..4f1f6b4 100644 --- a/scenes/player/world.tscn +++ b/scenes/player/world.tscn @@ -1,18 +1,30 @@ -[gd_scene load_steps=8 format=3 uid="uid://cjxiwvvqhuh0q"] +[gd_scene load_steps=10 format=3 uid="uid://cjxiwvvqhuh0q"] [ext_resource type="Script" uid="uid://eb3vs5x8edfb" path="res://scripts/world.gd" id="1_71hdg"] +[ext_resource type="Script" uid="uid://bbvlq556chi7s" path="res://scripts/walker_generator.gd" id="3_yh6o4"] [ext_resource type="Script" uid="uid://bm0r4bkr3dki2" path="res://scripts/game_menu_system.gd" id="7_kej52"] [ext_resource type="PackedScene" uid="uid://2nq4ts7s3ojx" path="res://scenes/menus/in_game_menu.tscn" id="8_71hdg"] [ext_resource type="PackedScene" uid="uid://bo4uld1h02n47" path="res://scenes/menus/pause_menu.tscn" id="9_onws2"] [ext_resource type="PackedScene" uid="uid://vcaloblp0bi6" path="res://scenes/menus/settings_menu.tscn" id="10_36eim"] [ext_resource type="PackedScene" uid="uid://dmfohcgyw6m8y" path="res://scenes/room_generator.tscn" id="10_kej52"] +[sub_resource type="Resource" id="Resource_efs36"] +script = ExtResource("3_yh6o4") +number_of_walkers = 5 +walker_steps = 500 +minimum_room_width = 20 +maximum_room_width = 100 +minimum_room_height = 20 +maximum_room_height = 100 +metadata/_custom_type_script = "uid://bbvlq556chi7s" + [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_b1qyj"] [node name="Node2D" type="Node2D"] script = ExtResource("1_71hdg") [node name="RoomGenerator" parent="." instance=ExtResource("10_kej52")] +procedural_generator = SubResource("Resource_efs36") [node name="CanvasLayer" type="CanvasLayer" parent="."] diff --git a/scenes/room_generator.tscn b/scenes/room_generator.tscn index 13d6f8b..e5eca32 100644 --- a/scenes/room_generator.tscn +++ b/scenes/room_generator.tscn @@ -6,8 +6,6 @@ [node name="RoomGenerator" type="Node2D"] script = ExtResource("1_mhcj8") -room_height = 20 -room_width = 20 floor_tileset = ExtResource("2_fs8vn") wall_tile = 1 object_tileset = ExtResource("3_mhcj8") diff --git a/scripts/procedural_generator.gd b/scripts/procedural_generator.gd new file mode 100644 index 0000000..a8790a6 --- /dev/null +++ b/scripts/procedural_generator.gd @@ -0,0 +1,23 @@ +extends Resource +class_name ProceduralGenerator + +var floor_positions: Array[Vector2i] = [] +var wall_positions: Array[Vector2i] = [] +var entrance_positions: Array[Vector2i] = [] +var exit_positions: Array[Vector2i] = [] +var player_start_position: Vector2i = Vector2i.ZERO +var seed: String + +func _init(): + if self.get_script() == ProceduralGenerator: + push_error("ProceduralGenerator is abstract and cannot be instantiated directly.") + assert(false) + +func generate(rng: RandomNumberGenerator) -> void: + assert(false, "generate() must be implemented by a subclass.") + +func clear() -> void: + floor_positions.clear() + wall_positions.clear() + entrance_positions.clear() + exit_positions.clear() diff --git a/scripts/procedural_generator.gd.uid b/scripts/procedural_generator.gd.uid new file mode 100644 index 0000000..531fa0f --- /dev/null +++ b/scripts/procedural_generator.gd.uid @@ -0,0 +1 @@ +uid://q6u66xkq7tcg diff --git a/scripts/room_generator.gd b/scripts/room_generator.gd index 75a25f7..c787b9b 100644 --- a/scripts/room_generator.gd +++ b/scripts/room_generator.gd @@ -3,13 +3,6 @@ class_name RoomGenerator extends Node2D -@export_category("Room Size") -## The height of the generated room in tiles -@export var room_height: int = 10 - -## The width of the generated room in tiles -@export var room_width: int = 10 - @export_category("Floors & Walls") ## The Tileset that will be used for Floors & Walls @export var floor_tileset: TileSet @@ -34,33 +27,14 @@ extends Node2D ## Seed used for random generation. Changing this will create different room layouts @export var _seed: String = "Game dev is difficult" -## Number of steps the walker should take -@export var walker_steps: int = 100 - ## Random number generator for procedural generation var rng: RandomNumberGenerator -## Array of floor tile positions to be placed -var floor_positions: Array[Vector2i] - -## Array of wall tile positions to be placed -var wall_positions: Array[Vector2i] - -## The active walker -var walker: Walker - -## Array of entrance tile positions -var entrance_positions: Array[Vector2i] - -### Player's starting position near the entrance -var player_start_position: Vector2i - -## Array of exit tile positions -var exit_positions: Array[Vector2i] - var floor_layer: map_generator var object_layer: TileMapLayer +@export var procedural_generator: ProceduralGenerator + func _ready() -> void: rng = RandomNumberGenerator.new() rng.seed = _seed.hash() @@ -88,219 +62,13 @@ func create_object_layer() -> void: ## Generates a new room layout func generate_room() -> void: clear_the_previous_room() - fill_the_room_with_walls() - run_walker() - place_entrance() - place_exit() + procedural_generator.generate(rng) apply_terrain_changes() func clear_the_previous_room() -> void: floor_layer.clear() object_layer.clear() - floor_positions.clear() - wall_positions.clear() - entrance_positions.clear() - exit_positions.clear() - -### Fills in the wall positions to make up the whole room -func fill_the_room_with_walls() -> void: - for x in range(room_width): - for y in range(room_height): - wall_positions.append(Vector2i(x, y)) - -### Starts a new walker at the center of the room -func run_walker() -> void: - # Create walker at center of room - var start_pos = Vector2i(room_width / 2, room_height / 2) - walker = Walker.new(start_pos, room_width, room_height, rng.randi()) - - # Run walker - for step in range(walker_steps): - walker.update() - # Add walker's floor positions to our floor positions - for pos in walker.floor_positions: - if not floor_positions.has(pos): - floor_positions.append(pos) - -## Places the entrance on the edge of the map -func place_entrance() -> void: - var max_attempts = 100 # Prevent infinite loops - var attempts = 0 - - while attempts < max_attempts: - # Choose a random edge (0: top, 1: right, 2: bottom, 3: left) - var edge = rng.randi() % 4 - - # Choose a random position on that edge (avoiding corners) - var entrance_pos: Vector2i - match edge: - 0: # Top edge - entrance_pos = Vector2i(int(rng.randi_range(1, room_width - 3)), 0) - 1: # Right edge - entrance_pos = Vector2i(room_width - 1, int(rng.randi_range(1, room_height - 3))) - 2: # Bottom edge - entrance_pos = Vector2i(int(rng.randi_range(1, room_width - 3)), room_height - 1) - 3: # Left edge - entrance_pos = Vector2i(0, int(rng.randi_range(1, room_height - 3))) - - # Calculate second entrance position - var entrance_pos2: Vector2i - match edge: - 0: # Top edge - place tile to the right - entrance_pos2 = entrance_pos + Vector2i(1, 0) - 1: # Right edge - place tile below - entrance_pos2 = entrance_pos + Vector2i(0, 1) - 2: # Bottom edge - place tile to the right - entrance_pos2 = entrance_pos + Vector2i(1, 0) - 3: # Left edge - place tile below - entrance_pos2 = entrance_pos + Vector2i(0, 1) - - # Calculate floor positions based on edge - var floor_pos1: Vector2i - var floor_pos2: Vector2i - match edge: - 0: # Top edge - floor_pos1 = entrance_pos + Vector2i(0, 1) - floor_pos2 = entrance_pos2 + Vector2i(0, 1) - 1: # Right edge - floor_pos1 = entrance_pos + Vector2i(-1, 0) - floor_pos2 = entrance_pos2 + Vector2i(-1, 0) - 2: # Bottom edge - floor_pos1 = entrance_pos + Vector2i(0, -1) - floor_pos2 = entrance_pos2 + Vector2i(0, -1) - 3: # Left edge - floor_pos1 = entrance_pos + Vector2i(1, 0) - floor_pos2 = entrance_pos2 + Vector2i(1, 0) - - # Check if floor positions are valid - if not is_in_bounds(floor_pos1) or not is_in_bounds(floor_pos2): - attempts += 1 - continue - - # Check if floor positions connect to existing floor tiles - var has_floor_connection = false - var adjacent_positions = [ - floor_pos1 + Vector2i(0, 1), # Below - floor_pos1 + Vector2i(0, -1), # Above - floor_pos1 + Vector2i(1, 0), # Right - floor_pos1 + Vector2i(-1, 0), # Left - floor_pos2 + Vector2i(0, 1), # Below - floor_pos2 + Vector2i(0, -1), # Above - floor_pos2 + Vector2i(1, 0), # Right - floor_pos2 + Vector2i(-1, 0) # Left - ] - - for pos in adjacent_positions: - if floor_positions.has(pos): - has_floor_connection = true - break - - if not has_floor_connection: - attempts += 1 - continue - - # If we get here, we found valid positions - entrance_positions.append(entrance_pos) - entrance_positions.append(entrance_pos2) - floor_positions.append(floor_pos1) - floor_positions.append(floor_pos2) - player_start_position = floor_pos1 - return - - # If we get here, we couldn't find valid positions - push_error("Failed to place entrance after " + str(max_attempts) + " attempts") - -## Places the exit on the edge of the map -func place_exit() -> void: - var max_attempts = 100 # Prevent infinite loops - var attempts = 0 - - while attempts < max_attempts: - # Choose a random edge (0: top, 1: right, 2: bottom, 3: left) - var edge = rng.randi() % 4 - - # Choose a random position on that edge (avoiding corners) - var exit_pos: Vector2i - match edge: - 0: # Top edge - exit_pos = Vector2i(int(rng.randi_range(1, room_width - 3)), 0) - 1: # Right edge - exit_pos = Vector2i(room_width - 1, int(rng.randi_range(1, room_height - 3))) - 2: # Bottom edge - exit_pos = Vector2i(int(rng.randi_range(1, room_width - 3)), room_height - 1) - 3: # Left edge - exit_pos = Vector2i(0, int(rng.randi_range(1, room_height - 3))) - - # Calculate second exit position - var exit_pos2: Vector2i - match edge: - 0: # Top edge - place tile to the right - exit_pos2 = exit_pos + Vector2i(1, 0) - 1: # Right edge - place tile below - exit_pos2 = exit_pos + Vector2i(0, 1) - 2: # Bottom edge - place tile to the right - exit_pos2 = exit_pos + Vector2i(1, 0) - 3: # Left edge - place tile below - exit_pos2 = exit_pos + Vector2i(0, 1) - - # Check if positions overlap with entrance - if entrance_positions.has(exit_pos) or entrance_positions.has(exit_pos2): - attempts += 1 - continue - - # Calculate floor positions based on edge - var floor_pos1: Vector2i - var floor_pos2: Vector2i - match edge: - 0: # Top edge - floor_pos1 = exit_pos + Vector2i(0, 1) - floor_pos2 = exit_pos2 + Vector2i(0, 1) - 1: # Right edge - floor_pos1 = exit_pos + Vector2i(-1, 0) - floor_pos2 = exit_pos2 + Vector2i(-1, 0) - 2: # Bottom edge - floor_pos1 = exit_pos + Vector2i(0, -1) - floor_pos2 = exit_pos2 + Vector2i(0, -1) - 3: # Left edge - floor_pos1 = exit_pos + Vector2i(1, 0) - floor_pos2 = exit_pos2 + Vector2i(1, 0) - - # Check if floor positions are valid - if not is_in_bounds(floor_pos1) or not is_in_bounds(floor_pos2): - attempts += 1 - continue - - # Check if floor positions connect to existing floor tiles - var has_floor_connection = false - var adjacent_positions = [ - floor_pos1 + Vector2i(0, 1), # Below - floor_pos1 + Vector2i(0, -1), # Above - floor_pos1 + Vector2i(1, 0), # Right - floor_pos1 + Vector2i(-1, 0), # Left - floor_pos2 + Vector2i(0, 1), # Below - floor_pos2 + Vector2i(0, -1), # Above - floor_pos2 + Vector2i(1, 0), # Right - floor_pos2 + Vector2i(-1, 0) # Left - ] - - for pos in adjacent_positions: - if floor_positions.has(pos): - has_floor_connection = true - break - - if not has_floor_connection: - attempts += 1 - continue - - # If we get here, we found valid positions - exit_positions.append(exit_pos) - exit_positions.append(exit_pos2) - floor_positions.append(floor_pos1) - floor_positions.append(floor_pos2) - return - - # If we get here, we couldn't find valid positions - push_error("Failed to place exit after " + str(max_attempts) + " attempts") + procedural_generator.clear() ## Applies all terrain changes at once func apply_terrain_changes() -> void: @@ -312,40 +80,30 @@ func apply_terrain_changes() -> void: ### Apply floors func apply_floors() -> void: - for pos in floor_positions: - wall_positions.erase(pos) - floor_layer.set_cells_terrain_connect(floor_positions, 0, floor_tile, true) + for pos in procedural_generator.floor_positions: + procedural_generator.wall_positions.erase(pos) + floor_layer.set_cells_terrain_connect(procedural_generator.floor_positions, 0, floor_tile, true) ### Apply walls func apply_walls() -> void: - floor_layer.set_cells_terrain_connect(wall_positions, 0, wall_tile, true) + floor_layer.set_cells_terrain_connect(procedural_generator.wall_positions, 0, wall_tile, true) ### Apply entrance func apply_entrance() -> void: - print("Entrance Positions:") - print(entrance_positions) - print("------------------") - for pos in entrance_positions: - wall_positions.erase(pos) - floor_layer.set_cells_terrain_connect(entrance_positions, 0, floor_tile, true) - object_layer.set_cell(entrance_positions[0], 1, Vector2i.ZERO, door_id) - object_layer.set_cell(entrance_positions[1], 1, Vector2i.ZERO, door_id) + for pos in procedural_generator.entrance_positions: + procedural_generator.wall_positions.erase(pos) + floor_layer.set_cells_terrain_connect(procedural_generator.entrance_positions, 0, floor_tile, true) + object_layer.set_cell(procedural_generator.entrance_positions[0], 1, Vector2i.ZERO, door_id) + object_layer.set_cell(procedural_generator.entrance_positions[1], 1, Vector2i.ZERO, door_id) ### Apply exit func apply_exit() -> void: - print("Exit Positions:") - print(exit_positions) - print("__________________") - for pos in exit_positions: - wall_positions.erase(pos) - floor_layer.set_cells_terrain_connect(exit_positions, 0, floor_tile, true) - object_layer.set_cell(exit_positions[0], 1, Vector2i.ZERO, door_id) - object_layer.set_cell(exit_positions[1], 1, Vector2i.ZERO, door_id) + for pos in procedural_generator.exit_positions: + procedural_generator.wall_positions.erase(pos) + floor_layer.set_cells_terrain_connect(procedural_generator.exit_positions, 0, floor_tile, true) + object_layer.set_cell(procedural_generator.exit_positions[0], 1, Vector2i.ZERO, door_id) + object_layer.set_cell(procedural_generator.exit_positions[1], 1, Vector2i.ZERO, door_id) ### Apply player func apply_player() -> void: - object_layer.set_cell(player_start_position, 1, Vector2i.ZERO, player_id) - -## Checks if a position is in the bounds of the room -func is_in_bounds(pos: Vector2i) -> bool: - return pos.x >= 0 and pos.x < room_width and pos.y >= 0 and pos.y < room_height + object_layer.set_cell(procedural_generator.player_start_position, 1, Vector2i.ZERO, player_id) diff --git a/scripts/walker.gd b/scripts/walker.gd index 0c8d717..6d9b9c9 100644 --- a/scripts/walker.gd +++ b/scripts/walker.gd @@ -90,4 +90,4 @@ func get_random_direction() -> Vector2i: ## @param pos The position to check ## @return true if the position is in bounds, false otherwise func is_in_bounds(pos: Vector2i) -> bool: - return pos.x > 0 and pos.x < _room_width - 1 and pos.y > 0 and pos.y < _room_height - 1 \ No newline at end of file + return pos.x > 0 and pos.x < _room_width - 1 and pos.y > 0 and pos.y < _room_height - 1 diff --git a/scripts/walker_generator.gd b/scripts/walker_generator.gd new file mode 100644 index 0000000..cdc696e --- /dev/null +++ b/scripts/walker_generator.gd @@ -0,0 +1,229 @@ +extends ProceduralGenerator +class_name WalkerGenerator + +@export var number_of_walkers: int = 1 +@export var walker_steps: int = 100 + +@export var minimum_room_width: int = 20 +@export var maximum_room_width: int = 100 +@export var minimum_room_height: int = 20 +@export var maximum_room_height: int = 100 + +var room_width: int +var room_height: int +var rng: RandomNumberGenerator + +func generate(_rng: RandomNumberGenerator) -> void: + rng = _rng + room_height = rng.randi_range(minimum_room_height, maximum_room_height) + room_width = rng.randi_range(minimum_room_width, maximum_room_width) + clear() + fill_the_room_with_walls() + for n in number_of_walkers: + run_walker() + place_entrance() + place_exit() + +### Fills in the wall positions to make up the whole room +func fill_the_room_with_walls() -> void: + for x in range(room_width): + for y in range(room_height): + wall_positions.append(Vector2i(x, y)) + +### Starts a new walker at the center of the room +func run_walker() -> void: + # Create walker at center of room + var start_pos = Vector2i(room_width / 2, room_height / 2) + var walker = Walker.new(start_pos, room_width, room_height, rng.randi()) + + # Run walker + for step in range(walker_steps): + walker.update() + # Add walker's floor positions to our floor positions + for pos in walker.floor_positions: + if not floor_positions.has(pos): + floor_positions.append(pos) + +## Places the entrance on the edge of the map +func place_entrance() -> void: + var max_attempts = 1000 # Prevent infinite loops + var attempts = 0 + + while attempts < max_attempts: + # Choose a random edge (0: top, 1: right, 2: bottom, 3: left) + var edge = rng.randi() % 4 + + # Choose a random position on that edge (avoiding corners) + var entrance_pos: Vector2i + match edge: + 0: # Top edge + entrance_pos = Vector2i(int(rng.randi_range(1, room_width - 3)), 0) + 1: # Right edge + entrance_pos = Vector2i(room_width - 1, int(rng.randi_range(1, room_height - 3))) + 2: # Bottom edge + entrance_pos = Vector2i(int(rng.randi_range(1, room_width - 3)), room_height - 1) + 3: # Left edge + entrance_pos = Vector2i(0, int(rng.randi_range(1, room_height - 3))) + + # Calculate second entrance position + var entrance_pos2: Vector2i + match edge: + 0: # Top edge - place tile to the right + entrance_pos2 = entrance_pos + Vector2i(1, 0) + 1: # Right edge - place tile below + entrance_pos2 = entrance_pos + Vector2i(0, 1) + 2: # Bottom edge - place tile to the right + entrance_pos2 = entrance_pos + Vector2i(1, 0) + 3: # Left edge - place tile below + entrance_pos2 = entrance_pos + Vector2i(0, 1) + + # Calculate floor positions based on edge + var floor_pos1: Vector2i + var floor_pos2: Vector2i + match edge: + 0: # Top edge + floor_pos1 = entrance_pos + Vector2i(0, 1) + floor_pos2 = entrance_pos2 + Vector2i(0, 1) + 1: # Right edge + floor_pos1 = entrance_pos + Vector2i(-1, 0) + floor_pos2 = entrance_pos2 + Vector2i(-1, 0) + 2: # Bottom edge + floor_pos1 = entrance_pos + Vector2i(0, -1) + floor_pos2 = entrance_pos2 + Vector2i(0, -1) + 3: # Left edge + floor_pos1 = entrance_pos + Vector2i(1, 0) + floor_pos2 = entrance_pos2 + Vector2i(1, 0) + + # Check if floor positions are valid + if not is_in_bounds(floor_pos1) or not is_in_bounds(floor_pos2): + attempts += 1 + continue + + # Check if floor positions connect to existing floor tiles + var has_floor_connection = false + var adjacent_positions = [ + floor_pos1 + Vector2i(0, 1), # Below + floor_pos1 + Vector2i(0, -1), # Above + floor_pos1 + Vector2i(1, 0), # Right + floor_pos1 + Vector2i(-1, 0), # Left + floor_pos2 + Vector2i(0, 1), # Below + floor_pos2 + Vector2i(0, -1), # Above + floor_pos2 + Vector2i(1, 0), # Right + floor_pos2 + Vector2i(-1, 0) # Left + ] + + for pos in adjacent_positions: + if floor_positions.has(pos): + has_floor_connection = true + break + + if not has_floor_connection: + attempts += 1 + continue + + # If we get here, we found valid positions + entrance_positions.append(entrance_pos) + entrance_positions.append(entrance_pos2) + floor_positions.append(floor_pos1) + floor_positions.append(floor_pos2) + player_start_position = floor_pos1 + return + + # If we get here, we couldn't find valid positions + push_error("Failed to place entrance after " + str(max_attempts) + " attempts") + +## Places the exit on the edge of the map +func place_exit() -> void: + var max_attempts = 1000 # Prevent infinite loops + var attempts = 0 + + while attempts < max_attempts: + # Choose a random edge (0: top, 1: right, 2: bottom, 3: left) + var edge = rng.randi() % 4 + + # Choose a random position on that edge (avoiding corners) + var exit_pos: Vector2i + match edge: + 0: # Top edge + exit_pos = Vector2i(int(rng.randi_range(1, room_width - 3)), 0) + 1: # Right edge + exit_pos = Vector2i(room_width - 1, int(rng.randi_range(1, room_height - 3))) + 2: # Bottom edge + exit_pos = Vector2i(int(rng.randi_range(1, room_width - 3)), room_height - 1) + 3: # Left edge + exit_pos = Vector2i(0, int(rng.randi_range(1, room_height - 3))) + + # Calculate second exit position + var exit_pos2: Vector2i + match edge: + 0: # Top edge - place tile to the right + exit_pos2 = exit_pos + Vector2i(1, 0) + 1: # Right edge - place tile below + exit_pos2 = exit_pos + Vector2i(0, 1) + 2: # Bottom edge - place tile to the right + exit_pos2 = exit_pos + Vector2i(1, 0) + 3: # Left edge - place tile below + exit_pos2 = exit_pos + Vector2i(0, 1) + + # Check if positions overlap with entrance + if entrance_positions.has(exit_pos) or entrance_positions.has(exit_pos2): + attempts += 1 + continue + + # Calculate floor positions based on edge + var floor_pos1: Vector2i + var floor_pos2: Vector2i + match edge: + 0: # Top edge + floor_pos1 = exit_pos + Vector2i(0, 1) + floor_pos2 = exit_pos2 + Vector2i(0, 1) + 1: # Right edge + floor_pos1 = exit_pos + Vector2i(-1, 0) + floor_pos2 = exit_pos2 + Vector2i(-1, 0) + 2: # Bottom edge + floor_pos1 = exit_pos + Vector2i(0, -1) + floor_pos2 = exit_pos2 + Vector2i(0, -1) + 3: # Left edge + floor_pos1 = exit_pos + Vector2i(1, 0) + floor_pos2 = exit_pos2 + Vector2i(1, 0) + + # Check if floor positions are valid + if not is_in_bounds(floor_pos1) or not is_in_bounds(floor_pos2): + attempts += 1 + continue + + # Check if floor positions connect to existing floor tiles + var has_floor_connection = false + var adjacent_positions = [ + floor_pos1 + Vector2i(0, 1), # Below + floor_pos1 + Vector2i(0, -1), # Above + floor_pos1 + Vector2i(1, 0), # Right + floor_pos1 + Vector2i(-1, 0), # Left + floor_pos2 + Vector2i(0, 1), # Below + floor_pos2 + Vector2i(0, -1), # Above + floor_pos2 + Vector2i(1, 0), # Right + floor_pos2 + Vector2i(-1, 0) # Left + ] + + for pos in adjacent_positions: + if floor_positions.has(pos): + has_floor_connection = true + break + + if not has_floor_connection: + attempts += 1 + continue + + # If we get here, we found valid positions + exit_positions.append(exit_pos) + exit_positions.append(exit_pos2) + floor_positions.append(floor_pos1) + floor_positions.append(floor_pos2) + return + + # If we get here, we couldn't find valid positions + push_error("Failed to place exit after " + str(max_attempts) + " attempts") + +## Checks if a position is in the bounds of the room +func is_in_bounds(pos: Vector2i) -> bool: + return pos.x >= 0 and pos.x < room_width and pos.y >= 0 and pos.y < room_height diff --git a/scripts/walker_generator.gd.uid b/scripts/walker_generator.gd.uid new file mode 100644 index 0000000..30ca371 --- /dev/null +++ b/scripts/walker_generator.gd.uid @@ -0,0 +1 @@ +uid://bbvlq556chi7s From edb66b666c4e063fe451633899397ac661b1f9d5 Mon Sep 17 00:00:00 2001 From: The Bard Who Codes Date: Thu, 26 Jun 2025 14:29:42 -0400 Subject: [PATCH 8/8] Use multithreading to improve the performance of walker generation --- scripts/walker_generator.gd | 43 +++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/scripts/walker_generator.gd b/scripts/walker_generator.gd index cdc696e..dca4820 100644 --- a/scripts/walker_generator.gd +++ b/scripts/walker_generator.gd @@ -19,8 +19,35 @@ func generate(_rng: RandomNumberGenerator) -> void: room_width = rng.randi_range(minimum_room_width, maximum_room_width) clear() fill_the_room_with_walls() - for n in number_of_walkers: - run_walker() + + var threads = [] + var results = [] + var start_pos = Vector2i(room_width / 2, room_height / 2) + + # Start threads + for n in range(number_of_walkers): + var thread = Thread.new() + var args = { + "start_pos": start_pos, + "room_width": room_width, + "room_height": room_height, + "steps": walker_steps, + "seed": rng.randi() + } + thread.start(walker_thread_func.bind(args)) + threads.append(thread) + + # Wait for threads and collect results + for thread in threads: + var floor_positions_result = thread.wait_to_finish() + results.append(floor_positions_result) + + # Merge all floor positions + for floor_positions_result in results: + for pos in floor_positions_result: + if not floor_positions.has(pos): + floor_positions.append(pos) + place_entrance() place_exit() @@ -227,3 +254,15 @@ func place_exit() -> void: ## Checks if a position is in the bounds of the room func is_in_bounds(pos: Vector2i) -> bool: return pos.x >= 0 and pos.x < room_width and pos.y >= 0 and pos.y < room_height + +func walker_thread_func(args): + var start_pos = args["start_pos"] + var room_width = args["room_width"] + var room_height = args["room_height"] + var steps = args["steps"] + var seed = args["seed"] + + var walker = Walker.new(start_pos, room_width, room_height, seed) + for i in range(steps): + walker.update() + return walker.floor_positions