From c3107fbce97fe61d92b626d51fbbf2606aec0e86 Mon Sep 17 00:00:00 2001 From: Marco Date: Tue, 22 Apr 2025 18:21:53 +0200 Subject: [PATCH] Dungeon generation --- Cirno.sln.DotSettings.user | 1 + Resources/RogueliteMaps/BigTest2.tres | 18 ++ Resources/RogueliteMaps/Lab2x1_1.tres | 18 ++ Scenes/Maps/Roguelike.tscn | 10 +- Scenes/Maps/RogueliteMaps/Rg2x1Lab.tscn | 110 +++++++ Scenes/Maps/RogueliteMaps/RgBig2.tscn | 150 ++++++++++ Scripts/Controllers/RogueliteRoom.cs | 14 + Scripts/Controllers/RogueliteRoomManager.cs | 273 ++++++++++-------- .../Roguelite/RogueliteRoomResource.cs | 32 +- 9 files changed, 495 insertions(+), 131 deletions(-) create mode 100644 Resources/RogueliteMaps/BigTest2.tres create mode 100644 Resources/RogueliteMaps/Lab2x1_1.tres create mode 100644 Scenes/Maps/RogueliteMaps/Rg2x1Lab.tscn create mode 100644 Scenes/Maps/RogueliteMaps/RgBig2.tscn diff --git a/Cirno.sln.DotSettings.user b/Cirno.sln.DotSettings.user index 962a2ec8..7a26e8fe 100644 --- a/Cirno.sln.DotSettings.user +++ b/Cirno.sln.DotSettings.user @@ -13,6 +13,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded diff --git a/Resources/RogueliteMaps/BigTest2.tres b/Resources/RogueliteMaps/BigTest2.tres new file mode 100644 index 00000000..34a94fd2 --- /dev/null +++ b/Resources/RogueliteMaps/BigTest2.tres @@ -0,0 +1,18 @@ +[gd_resource type="Resource" script_class="RogueliteRoomResource" load_steps=6 format=3 uid="uid://char0yv78vtty"] + +[ext_resource type="Resource" uid="uid://cocl3qontm3be" path="res://Resources/Enemies/Base_Fairy.tres" id="1_w1ns8"] +[ext_resource type="Resource" uid="uid://cqfyuurvqb8m6" path="res://Resources/Enemies/Base_Fairy_Special.tres" id="2_gohkc"] +[ext_resource type="Resource" uid="uid://qbo6avc7x64b" path="res://Resources/Enemies/Fairy_Guard.tres" id="3_x42ya"] +[ext_resource type="Resource" uid="uid://cfdvg162u65sr" path="res://Resources/Enemies/Thermathron.tres" id="4_qo81h"] +[ext_resource type="Script" uid="uid://bl2ne8w12e3a" path="res://Scripts/Resources/Roguelite/RogueliteRoomResource.cs" id="5_570h4"] + +[resource] +script = ExtResource("5_570h4") +RoomName = &"BigTest" +Type = 1 +ScenePath = &"uid://cglddtyl6o4fn" +Size = Vector2i(2, 2) +DoorGridPositions = Array[Vector2i]([Vector2i(0, -1), Vector2i(0, 1), Vector2i(1, 0), Vector2i(-1, 0)]) +SpawnableEnemies = Array[Object]([ExtResource("1_w1ns8"), ExtResource("2_gohkc"), ExtResource("3_x42ya"), ExtResource("4_qo81h")]) +DoorDirections = 30 +metadata/_custom_type_script = "uid://bl2ne8w12e3a" diff --git a/Resources/RogueliteMaps/Lab2x1_1.tres b/Resources/RogueliteMaps/Lab2x1_1.tres new file mode 100644 index 00000000..88da2e2a --- /dev/null +++ b/Resources/RogueliteMaps/Lab2x1_1.tres @@ -0,0 +1,18 @@ +[gd_resource type="Resource" script_class="RogueliteRoomResource" load_steps=6 format=3 uid="uid://cb7gk278lmicd"] + +[ext_resource type="Resource" uid="uid://cocl3qontm3be" path="res://Resources/Enemies/Base_Fairy.tres" id="1_85eyw"] +[ext_resource type="Resource" uid="uid://cqfyuurvqb8m6" path="res://Resources/Enemies/Base_Fairy_Special.tres" id="2_dduxp"] +[ext_resource type="Resource" uid="uid://qbo6avc7x64b" path="res://Resources/Enemies/Fairy_Guard.tres" id="3_7y8b1"] +[ext_resource type="Resource" uid="uid://cfdvg162u65sr" path="res://Resources/Enemies/Thermathron.tres" id="4_wwjbl"] +[ext_resource type="Script" uid="uid://bl2ne8w12e3a" path="res://Scripts/Resources/Roguelite/RogueliteRoomResource.cs" id="5_qpk7q"] + +[resource] +script = ExtResource("5_qpk7q") +RoomName = &"TestMapLab 2x1" +Type = 1 +ScenePath = &"uid://bon3ay27r54tw" +Size = Vector2i(2, 1) +DoorGridPositions = Array[Vector2i]([Vector2i(0, -1), Vector2i(0, 1), Vector2i(1, 0), Vector2i(-1, 0)]) +SpawnableEnemies = Array[Object]([ExtResource("1_85eyw"), ExtResource("2_dduxp"), ExtResource("3_7y8b1"), ExtResource("4_wwjbl")]) +DoorDirections = 30 +metadata/_custom_type_script = "uid://bl2ne8w12e3a" diff --git a/Scenes/Maps/Roguelike.tscn b/Scenes/Maps/Roguelike.tscn index 5d797332..965caa49 100644 --- a/Scenes/Maps/Roguelike.tscn +++ b/Scenes/Maps/Roguelike.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=28 format=3 uid="uid://bf1kqr3o6r6d4"] +[gd_scene load_steps=30 format=3 uid="uid://bf1kqr3o6r6d4"] [ext_resource type="Script" uid="uid://doxmbokehw8ci" path="res://Scripts/GameManager.cs" id="1_wbqvu"] [ext_resource type="PackedScene" uid="uid://c4pr2707hbeph" path="res://Scenes/Actors/fsm_player.tscn" id="2_3fyis"] @@ -27,6 +27,8 @@ [ext_resource type="Resource" uid="uid://cwtma7mxged8a" path="res://Resources/RogueliteMaps/ShopRoom1.tres" id="18_2lxq3"] [ext_resource type="Resource" uid="uid://crqgvauqarfaq" path="res://Resources/RogueliteMaps/TreasureRoom1.tres" id="19_6ahuq"] [ext_resource type="Resource" uid="uid://bo4efv7rwowuh" path="res://Resources/RogueliteMaps/SecretRoom1.tres" id="20_xrp0h"] +[ext_resource type="Resource" uid="uid://cb7gk278lmicd" path="res://Resources/RogueliteMaps/Lab2x1_1.tres" id="21_2lxq3"] +[ext_resource type="Resource" uid="uid://char0yv78vtty" path="res://Resources/RogueliteMaps/BigTest2.tres" id="22_6ahuq"] [node name="GameScene" type="Node2D"] process_mode = 3 @@ -41,10 +43,10 @@ SpawnMarkers = Dictionary[int, NodePath]({ process_mode = 1 y_sort_enabled = true script = ExtResource("4_jtlua") -Rooms = Array[Object]([ExtResource("5_gwtv6"), ExtResource("6_gwtv6"), ExtResource("7_wbqvu"), ExtResource("8_3fyis"), ExtResource("9_go1yg"), ExtResource("5_pfafs"), ExtResource("11_68lig"), ExtResource("12_83bvc"), ExtResource("13_y651a"), ExtResource("14_vhvs2"), ExtResource("15_6gk3e"), ExtResource("16_4gy5m"), ExtResource("17_td7hx"), ExtResource("18_2lxq3"), ExtResource("19_6ahuq"), ExtResource("20_xrp0h")]) -DungeonLength = 6 +Rooms = Array[Object]([ExtResource("5_gwtv6"), ExtResource("6_gwtv6"), ExtResource("7_wbqvu"), ExtResource("8_3fyis"), ExtResource("9_go1yg"), ExtResource("5_pfafs"), ExtResource("11_68lig"), ExtResource("12_83bvc"), ExtResource("13_y651a"), ExtResource("14_vhvs2"), ExtResource("15_6gk3e"), ExtResource("16_4gy5m"), ExtResource("17_td7hx"), ExtResource("18_2lxq3"), ExtResource("19_6ahuq"), ExtResource("20_xrp0h"), ExtResource("21_2lxq3"), ExtResource("22_6ahuq")]) +DungeonLength = 4 MaxBranchLength = 2 -Seed = 4 +Seed = 1 [node name="CameraController" type="Camera2D" parent="."] process_mode = 1 diff --git a/Scenes/Maps/RogueliteMaps/Rg2x1Lab.tscn b/Scenes/Maps/RogueliteMaps/Rg2x1Lab.tscn new file mode 100644 index 00000000..341acc4a --- /dev/null +++ b/Scenes/Maps/RogueliteMaps/Rg2x1Lab.tscn @@ -0,0 +1,110 @@ +[gd_scene load_steps=10 format=4 uid="uid://bon3ay27r54tw"] + +[ext_resource type="Script" uid="uid://b2j00riayxkit" path="res://Scripts/Controllers/RogueliteRoom.cs" id="1_0pyb7"] +[ext_resource type="Resource" uid="uid://cb7gk278lmicd" path="res://Resources/RogueliteMaps/Lab2x1_1.tres" id="2_0pyb7"] +[ext_resource type="PackedScene" uid="uid://l84on3kv2s52" path="res://Scenes/Door_Horizontal.tscn" id="3_8uhw6"] +[ext_resource type="PackedScene" uid="uid://b0k2grrc8xp1l" path="res://Scenes/Props/BigTank.tscn" id="4_gq82i"] +[ext_resource type="TileSet" uid="uid://6k28roiljylj" path="res://Tilesets/factory_tileset.tres" id="5_xmtgx"] +[ext_resource type="Script" uid="uid://krean0uywtms" path="res://Scripts/TilemapAvoidance.cs" id="6_k6m50"] +[ext_resource type="Script" uid="uid://ddry5kjj3fr6c" path="res://Scripts/Controllers/DoorMarker.cs" id="7_a4eus"] + +[sub_resource type="NavigationPolygon" id="NavigationPolygon_f7qjl"] +vertices = PackedVector2Array(186, 122, 186, 58, 294, 58, 294, 74, 319.922, 74, 319.922, 58, 454, 58, 454, 122, 506, 122, 506, 58, 614, 58, 614, 134, 486, 134, 486, 150, 474, 150, 474, 134, 166, 134, 134, 122, 154, 134, 166, 150, 154, 150, 26, 134, 26, 58, 134, 58, 166, 54, 154, 54, 154, 10, 166, 10, 486, 54, 474, 54, 474, 10, 486, 10) +polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3), PackedInt32Array(4, 5, 6, 7), PackedInt32Array(8, 9, 10, 11), PackedInt32Array(8, 11, 12, 7), PackedInt32Array(12, 13, 14, 15), PackedInt32Array(7, 12, 15), PackedInt32Array(3, 4, 7, 15, 16, 0), PackedInt32Array(17, 0, 16, 18), PackedInt32Array(16, 19, 20, 18), PackedInt32Array(17, 18, 21, 22), PackedInt32Array(23, 17, 22), PackedInt32Array(24, 25, 26, 27), PackedInt32Array(28, 29, 30, 31)]) +outlines = Array[PackedVector2Array]([PackedVector2Array(17, 36, 14, 12, 47, 15, 49, 34)]) +parsed_collision_mask = 353 +source_geometry_mode = 1 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_wtdf1"] +size = Vector2(591, 85) + +[node name="Map" type="Node2D"] +process_mode = 1 +script = ExtResource("1_0pyb7") +RoomResource = ExtResource("2_0pyb7") +DoorPrefab = ExtResource("3_8uhw6") +WallPrefab = ExtResource("4_gq82i") +metadata/test_scene = "res://Scenes/Maps/Roguelike.tscn" + +[node name="Tilemaps" type="Node2D" parent="." groups=["navigation_polygon_source_geometry_group"]] + +[node name="Floor" type="TileMapLayer" parent="Tilemaps" node_paths=PackedStringArray("_solidLayers") groups=["Solid"]] +tile_map_data = PackedByteArray("AAAAAAIAAAAFAAAAAAAAAAMAAAAFAAAAAAAAAAQAAAAFAAAAAAAAAAUAAAAFAAAAAAAAAAYAAAAFAAAAAAAAAAcAAAAFAAAAAAAAAAgAAAAFAAAAAAAAAAkAAAAFAAAAAAABAAIAAAAFAAAAAAABAAMAAAAFAAAAAAABAAQAAAAFAAAAAAABAAUAAAAFAAAAAAABAAYAAAAFAAAAAAABAAcAAAAFAAAAAAABAAgAAAAFAAAAAAABAAkAAAAFAAAAAAACAAIAAAAFAAAAAAACAAMAAAAFAAAAAAACAAQAAAAFAAAAAAACAAUAAAAFAAAAAAACAAYAAAAFAAAAAAACAAcAAAAFAAAAAAACAAgAAAAFAAAAAAACAAkAAAAFAAAAAAADAAIAAAAFAAAAAAADAAMAAAAFAAAAAAADAAQAAAAFAAAAAAADAAUAAAAFAAAAAAADAAYAAAAFAAAAAAADAAcAAAAFAAAAAAADAAgAAAAFAAAAAAADAAkAAAAFAAAAAAAEAAIAAAAFAAAAAAAEAAMAAAAFAAAAAAAEAAQAAAAFAAAAAAAEAAUAAAAFAAAAAAAEAAYAAAAFAAAAAAAEAAcAAAAFAAAAAAAEAAgAAAAFAAAAAAAEAAkAAAAFAAAAAAAFAAIAAAAFAAAAAAAFAAMAAAAFAAAAAAAFAAQAAAAFAAAAAAAFAAUAAAAFAAAAAAAFAAYAAAAFAAAAAAAFAAcAAAAFAAAAAAAFAAgAAAAFAAAAAAAFAAkAAAAFAAAAAAAGAAIAAAAFAAAAAAAGAAMAAAAFAAAAAAAGAAQAAAAFAAAAAAAGAAUAAAAFAAAAAAAGAAYAAAAFAAAAAAAGAAcAAAAFAAAAAAAGAAgAAAAFAAAAAAAGAAkAAAAFAAAAAAAHAAIAAAAFAAAAAAAHAAMAAAAFAAAAAAAHAAQAAAAFAAAAAAAHAAUAAAAFAAAAAAAHAAYAAAAFAAAAAAAHAAcAAAAFAAAAAAAHAAgAAAAFAAAAAAAHAAkAAAAFAAAAAAAIAAIAAAAFAAAAAAAIAAMAAAAFAAAAAAAIAAQAAAAFAAAAAAAIAAUAAAAFAAAAAAAIAAYAAAAFAAAAAAAIAAcAAAAFAAAAAAAIAAgAAAAFAAAAAAAIAAkAAAAFAAAAAAAJAAIAAAAFAAAAAAAJAAMAAAAFAAAAAAAJAAQAAAAFAAAAAAAJAAgAAAAFAAAAAAAJAAkAAAAFAAAAAAAKAAIAAAAFAAAAAAAKAAMAAAAFAAAAAAAKAAQAAAAFAAAAAAAKAAgAAAAFAAAAAAAKAAkAAAAFAAAAAAALAAIAAAAFAAAAAAALAAUAAAAFAAAAAAALAAYAAAAFAAAAAAALAAcAAAAFAAAAAAALAAgAAAAFAAAAAAALAAkAAAAFAAAAAAAMAAIAAAAFAAAAAAAMAAUAAAAFAAAAAAAMAAYAAAAFAAAAAAAMAAcAAAAFAAAAAAAMAAgAAAAFAAAAAAAMAAkAAAAFAAAAAAANAAIAAAAFAAAAAAANAAMAAAAFAAAAAAANAAQAAAAFAAAAAAANAAUAAAAFAAAAAAANAAYAAAAFAAAAAAANAAcAAAAFAAAAAAANAAgAAAAFAAAAAAANAAkAAAAFAAAAAAAOAAIAAAAFAAAAAAAOAAMAAAAFAAAAAAAOAAQAAAAFAAAAAAAOAAUAAAAFAAAAAAAOAAYAAAAFAAAAAAAOAAcAAAAFAAAAAAAOAAgAAAAFAAAAAAAOAAkAAAAFAAAAAAAPAAIAAAAFAAAAAAAPAAMAAAAFAAAAAAAPAAQAAAAFAAAAAAAPAAUAAAAFAAAAAAAPAAYAAAAFAAAAAAAPAAcAAAAFAAAAAAAPAAgAAAAFAAAAAAAPAAkAAAAFAAAAAAAQAAIAAAAFAAAAAAAQAAMAAAAFAAAAAAAQAAQAAAAFAAAAAAAQAAUAAAAFAAAAAAAQAAYAAAAFAAAAAAAQAAcAAAAFAAAAAAAQAAgAAAAFAAAAAAAQAAkAAAAFAAAAAAARAAIAAAAFAAAAAAARAAMAAAAFAAAAAAARAAQAAAAFAAAAAAARAAUAAAAFAAAAAAARAAYAAAAFAAAAAAARAAcAAAAFAAAAAAARAAgAAAAFAAAAAAARAAkAAAAFAAAAAAASAAIAAAAFAAAAAAASAAMAAAAFAAAAAAASAAQAAAAFAAAAAAASAAUAAAAFAAAAAAASAAYAAAAFAAAAAAASAAcAAAAFAAAAAAASAAgAAAAFAAAAAAASAAkAAAAFAAAAAAATAAIAAAAFAAAAAAATAAMAAAAFAAAAAAATAAQAAAAFAAAAAAATAAUAAAAFAAAAAAATAAYAAAAFAAAAAAATAAcAAAAFAAAAAAATAAgAAAAFAAAAAAATAAkAAAAFAAAAAAAAAAAAAAAFAAAAAAAAAAEAAAAFAAAAAAABAAAAAAAFAAAAAAABAAEAAAAFAAAAAAACAAAAAAAFAAAAAAACAAEAAAAFAAAAAAADAAAAAAAFAAAAAAADAAEAAAAFAAAAAAAEAAAAAAAFAAAAAAAEAAEAAAAFAAAAAAAFAAAAAAAFAAAAAAAFAAEAAAAFAAAAAAAGAAAAAAAFAAAAAAAGAAEAAAAFAAAAAAAHAAAAAAAFAAAAAAAHAAEAAAAFAAAAAAAIAAAAAAAFAAAAAAAIAAEAAAAFAAAAAAAJAAAAAAAFAAAAAAAJAAEAAAAFAAAAAAAKAAAAAAAFAAAAAAAKAAEAAAAFAAAAAAALAAAAAAAFAAAAAAALAAEAAAAFAAAAAAALAAMAAAAFAAAAAAALAAQAAAAFAAAAAAAMAAAAAAAFAAAAAAAMAAEAAAAFAAAAAAAMAAMAAAAFAAAAAAAMAAQAAAAFAAAAAAANAAAAAAAFAAAAAAANAAEAAAAFAAAAAAAOAAAAAAAFAAAAAAAOAAEAAAAFAAAAAAAPAAAAAAAFAAAAAAAPAAEAAAAFAAAAAAAQAAAAAAAFAAAAAAAQAAEAAAAFAAAAAAARAAAAAAAFAAAAAAARAAEAAAAFAAAAAAASAAAAAAAFAAAAAAASAAEAAAAFAAAAAAATAAAAAAAFAAAAAAATAAEAAAAFAAAAAAAJAAUAAAAFAAAAAAAJAAYAAAAFAAAAAAAJAAcAAAAFAAAAAAAKAAUAAAAFAAAAAAAKAAYAAAAFAAAAAAAKAAcAAAAFAAAAAAAUAAAAAAAFAAAAAAAUAAEAAAAFAAAAAAAUAAIAAAAFAAAAAAAUAAMAAAAFAAAAAAAUAAQAAAAFAAAAAAAUAAUAAAAFAAAAAAAUAAYAAAAFAAAAAAAUAAcAAAAFAAAAAAAUAAgAAAAFAAAAAAAUAAkAAAAFAAAAAAAVAAAAAAAFAAAAAAAVAAEAAAAFAAAAAAAVAAIAAAAFAAAAAAAVAAMAAAAFAAAAAAAVAAQAAAAFAAAAAAAVAAUAAAAFAAAAAAAVAAYAAAAFAAAAAAAVAAcAAAAFAAAAAAAVAAgAAAAFAAAAAAAVAAkAAAAFAAAAAAAWAAAAAAAFAAAAAAAWAAEAAAAFAAAAAAAWAAIAAAAFAAAAAAAWAAMAAAAFAAAAAAAWAAQAAAAFAAAAAAAWAAUAAAAFAAAAAAAWAAYAAAAFAAAAAAAWAAcAAAAFAAAAAAAWAAgAAAAFAAAAAAAWAAkAAAAFAAAAAAAXAAAAAAAFAAAAAAAXAAEAAAAFAAAAAAAXAAIAAAAFAAAAAAAXAAMAAAAFAAAAAAAXAAQAAAAFAAAAAAAXAAUAAAAFAAAAAAAXAAYAAAAFAAAAAAAXAAcAAAAFAAAAAAAXAAgAAAAFAAAAAAAXAAkAAAAFAAAAAAAYAAAAAAAFAAAAAAAYAAEAAAAFAAAAAAAYAAIAAAAFAAAAAAAYAAMAAAAFAAAAAAAYAAQAAAAFAAAAAAAYAAUAAAAFAAAAAAAYAAYAAAAFAAAAAAAYAAcAAAAFAAAAAAAYAAgAAAAFAAAAAAAYAAkAAAAFAAAAAAAZAAAAAAAFAAAAAAAZAAEAAAAFAAAAAAAZAAIAAAAFAAAAAAAZAAMAAAAFAAAAAAAZAAQAAAAFAAAAAAAZAAUAAAAFAAAAAAAZAAYAAAAFAAAAAAAZAAcAAAAFAAAAAAAZAAgAAAAFAAAAAAAZAAkAAAAFAAAAAAAaAAAAAAAFAAAAAAAaAAEAAAAFAAAAAAAaAAIAAAAFAAAAAAAaAAMAAAAFAAAAAAAaAAQAAAAFAAAAAAAaAAUAAAAFAAAAAAAaAAYAAAAFAAAAAAAaAAcAAAAFAAAAAAAaAAgAAAAFAAAAAAAaAAkAAAAFAAAAAAAbAAAAAAAFAAAAAAAbAAEAAAAFAAAAAAAbAAIAAAAFAAAAAAAbAAMAAAAFAAAAAAAbAAQAAAAFAAAAAAAbAAUAAAAFAAAAAAAbAAYAAAAFAAAAAAAbAAcAAAAFAAAAAAAbAAgAAAAFAAAAAAAbAAkAAAAFAAAAAAAcAAAAAAAFAAAAAAAcAAEAAAAFAAAAAAAcAAIAAAAFAAAAAAAcAAMAAAAFAAAAAAAcAAQAAAAFAAAAAAAcAAUAAAAFAAAAAAAcAAYAAAAFAAAAAAAcAAcAAAAFAAAAAAAcAAgAAAAFAAAAAAAcAAkAAAAFAAAAAAAdAAAAAAAFAAAAAAAdAAEAAAAFAAAAAAAdAAIAAAAFAAAAAAAdAAMAAAAFAAAAAAAdAAQAAAAFAAAAAAAdAAUAAAAFAAAAAAAdAAYAAAAFAAAAAAAdAAcAAAAFAAAAAAAdAAgAAAAFAAAAAAAdAAkAAAAFAAAAAAAeAAAAAAAFAAAAAAAeAAEAAAAFAAAAAAAeAAIAAAAFAAAAAAAeAAMAAAAFAAAAAAAeAAQAAAAFAAAAAAAeAAUAAAAFAAAAAAAeAAYAAAAFAAAAAAAeAAcAAAAFAAAAAAAeAAgAAAAFAAAAAAAeAAkAAAAFAAAAAAAfAAAAAAAFAAAAAAAfAAEAAAAFAAAAAAAfAAIAAAAFAAAAAAAfAAMAAAAFAAAAAAAfAAQAAAAFAAAAAAAfAAUAAAAFAAAAAAAfAAYAAAAFAAAAAAAfAAcAAAAFAAAAAAAfAAgAAAAFAAAAAAAfAAkAAAAFAAAAAAAgAAAAAAAFAAAAAAAgAAEAAAAFAAAAAAAgAAIAAAAFAAAAAAAgAAMAAAAFAAAAAAAgAAQAAAAFAAAAAAAgAAUAAAAFAAAAAAAgAAYAAAAFAAAAAAAgAAcAAAAFAAAAAAAgAAgAAAAFAAAAAAAgAAkAAAAFAAAAAAAhAAAAAAAFAAAAAAAhAAEAAAAFAAAAAAAhAAIAAAAFAAAAAAAhAAMAAAAFAAAAAAAhAAQAAAAFAAAAAAAhAAUAAAAFAAAAAAAhAAYAAAAFAAAAAAAhAAcAAAAFAAAAAAAhAAgAAAAFAAAAAAAhAAkAAAAFAAAAAAAiAAAAAAAFAAAAAAAiAAEAAAAFAAAAAAAiAAIAAAAFAAAAAAAiAAMAAAAFAAAAAAAiAAQAAAAFAAAAAAAiAAUAAAAFAAAAAAAiAAYAAAAFAAAAAAAiAAcAAAAFAAAAAAAiAAgAAAAFAAAAAAAiAAkAAAAFAAAAAAAjAAAAAAAFAAAAAAAjAAEAAAAFAAAAAAAjAAIAAAAFAAAAAAAjAAMAAAAFAAAAAAAjAAQAAAAFAAAAAAAjAAUAAAAFAAAAAAAjAAYAAAAFAAAAAAAjAAcAAAAFAAAAAAAjAAgAAAAFAAAAAAAjAAkAAAAFAAAAAAAkAAAAAAAFAAAAAAAkAAEAAAAFAAAAAAAkAAIAAAAFAAAAAAAkAAMAAAAFAAAAAAAkAAQAAAAFAAAAAAAkAAUAAAAFAAAAAAAkAAYAAAAFAAAAAAAkAAcAAAAFAAAAAAAkAAgAAAAFAAAAAAAkAAkAAAAFAAAAAAAlAAAAAAAFAAAAAAAlAAEAAAAFAAAAAAAlAAIAAAAFAAAAAAAlAAMAAAAFAAAAAAAlAAQAAAAFAAAAAAAlAAUAAAAFAAAAAAAlAAYAAAAFAAAAAAAlAAcAAAAFAAAAAAAlAAgAAAAFAAAAAAAlAAkAAAAFAAAAAAAmAAAAAAAFAAAAAAAmAAEAAAAFAAAAAAAmAAIAAAAFAAAAAAAmAAMAAAAFAAAAAAAmAAQAAAAFAAAAAAAmAAUAAAAFAAAAAAAmAAYAAAAFAAAAAAAmAAcAAAAFAAAAAAAmAAgAAAAFAAAAAAAmAAkAAAAFAAAAAAAnAAAAAAAFAAAAAAAnAAEAAAAFAAAAAAAnAAIAAAAFAAAAAAAnAAMAAAAFAAAAAAAnAAQAAAAFAAAAAAAnAAUAAAAFAAAAAAAnAAYAAAAFAAAAAAAnAAcAAAAFAAAAAAAnAAgAAAAFAAAAAAAnAAkAAAAFAAAAAAA=") +tile_set = ExtResource("5_xmtgx") +navigation_enabled = false +script = ExtResource("6_k6m50") +_solidLayers = [NodePath("../Solid"), NodePath("../Props")] +metadata/_edit_lock_ = true + +[node name="Solid" type="TileMapLayer" parent="Tilemaps" groups=["Solid"]] +tile_map_data = PackedByteArray("AAATAAAAAAABAAsAAAASAAAAAAABAAQAAAARAAAAAAABAAQAAAAQAAAAAAABAAQAAAAPAAAAAAABAAQAAAAOAAAAAAABAAQAAAANAAAAAAABAAQAAAAMAAAAAAABAAQAAAALAAAAAAACAAQAAAAIAAAAAAADAAQAAAAHAAAAAAABAAQAAAAGAAAAAAABAAQAAAAFAAAAAAABAAQAAAAEAAAAAAABAAQAAAADAAAAAAABAAQAAAACAAAAAAABAAQAAAABAAAAAAABAAQAAAAAAAAAAAAAAAsAAAATAAIAAAAEAAQAAAATAAEAAAAAAAQAAAAAAAIAAAAEAAQAAAAAAAEAAAAAAAQAAAAAAAkAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAcAAAAAAAQAAAAAAAYAAAAFAAQAAAATAAkAAAABAAwAAAASAAkAAAABAAQAAAARAAkAAAABAAQAAAAQAAkAAAABAAQAAAAPAAkAAAABAAQAAAAOAAkAAAABAAQAAAANAAkAAAABAAQAAAAMAAkAAAABAAQAAAALAAkAAAACAAQAAAAIAAkAAAADAAQAAAAHAAkAAAABAAQAAAAGAAkAAAABAAQAAAAFAAkAAAABAAQAAAAEAAkAAAABAAQAAAADAAkAAAABAAQAAAACAAkAAAABAAQAAAABAAkAAAABAAQAAAALAAEAAAAMAAAAAAALAAIAAAAMAAEAAAAMAAEAAAAMAAAAAAAMAAIAAAAMAAEAAAANAAEAAAAMAAAAAAANAAIAAAAMAAEAAAAOAAEAAAAMAAAAAAAOAAIAAAAMAAEAAAAPAAEAAAAMAAAAAAAPAAIAAAAMAAEAAAAQAAEAAAAMAAAAAAAQAAIAAAAMAAEAAAARAAEAAAAMAAAAAAARAAIAAAAMAAEAAAASAAEAAAAMAAAAAAASAAIAAAAMAAEAAAABAAEAAAAMAAAAAAABAAIAAAAMAAEAAAACAAEAAAAMAAAAAAACAAIAAAAMAAEAAAADAAEAAAAMAAAAAAADAAIAAAAMAAEAAAAEAAEAAAAMAAAAAAAEAAIAAAAMAAEAAAAFAAEAAAAMAAAAAAAFAAIAAAAMAAEAAAAGAAEAAAAMAAAAAAAGAAIAAAAMAAEAAAAHAAEAAAAMAAAAAAAHAAIAAAAMAAEAAAAIAAEAAAAMAAAAAAAIAAIAAAAMAAEAAAAAAAMAAAAMAAAAAAAAAAQAAAAMAAEAAAAJAAUAAAAMAAAAAAAJAAYAAAAMAAEAAAAKAAUAAAAMAAAAAAAKAAYAAAAMAAEAAAAJAAQAAAACAAQAAAAKAAQAAAADAAQAAAAUAAAAAAAAAAsAAAAUAAEAAAAAAAQAAAAUAAIAAAAEAAQAAAAUAAkAAAAAAAwAAAAVAAAAAAABAAQAAAAVAAEAAAAMAAAAAAAVAAIAAAAMAAEAAAAVAAkAAAABAAQAAAAWAAAAAAABAAQAAAAWAAEAAAAMAAAAAAAWAAIAAAAMAAEAAAAWAAkAAAABAAQAAAAXAAAAAAABAAQAAAAXAAEAAAAMAAAAAAAXAAIAAAAMAAEAAAAXAAkAAAABAAQAAAAYAAAAAAABAAQAAAAYAAEAAAAMAAAAAAAYAAIAAAAMAAEAAAAYAAkAAAABAAQAAAAZAAAAAAABAAQAAAAZAAEAAAAMAAAAAAAZAAIAAAAMAAEAAAAZAAkAAAABAAQAAAAaAAAAAAABAAQAAAAaAAEAAAAMAAAAAAAaAAIAAAAMAAEAAAAaAAkAAAABAAQAAAAbAAAAAAABAAQAAAAbAAEAAAAMAAAAAAAbAAIAAAAMAAEAAAAbAAkAAAABAAQAAAAcAAAAAAADAAQAAAAcAAEAAAAMAAAAAAAcAAIAAAAMAAEAAAAcAAkAAAADAAQAAAAdAAQAAAACAAQAAAAdAAUAAAAMAAAAAAAdAAYAAAAMAAEAAAAeAAQAAAADAAQAAAAeAAUAAAAMAAAAAAAeAAYAAAAMAAEAAAAfAAAAAAACAAQAAAAfAAEAAAAMAAAAAAAfAAIAAAAMAAEAAAAfAAkAAAACAAQAAAAgAAAAAAABAAQAAAAgAAEAAAAMAAAAAAAgAAIAAAAMAAEAAAAgAAkAAAABAAQAAAAhAAAAAAABAAQAAAAhAAEAAAAMAAAAAAAhAAIAAAAMAAEAAAAhAAkAAAABAAQAAAAiAAAAAAABAAQAAAAiAAEAAAAMAAAAAAAiAAIAAAAMAAEAAAAiAAkAAAABAAQAAAAjAAAAAAABAAQAAAAjAAEAAAAMAAAAAAAjAAIAAAAMAAEAAAAjAAkAAAABAAQAAAAkAAAAAAABAAQAAAAkAAEAAAAMAAAAAAAkAAIAAAAMAAEAAAAkAAkAAAABAAQAAAAlAAAAAAABAAQAAAAlAAEAAAAMAAAAAAAlAAIAAAAMAAEAAAAlAAkAAAABAAQAAAAmAAAAAAABAAQAAAAmAAEAAAAMAAAAAAAmAAIAAAAMAAEAAAAmAAkAAAABAAQAAAAnAAAAAAABAAsAAAAnAAEAAAAAAAQAAAAnAAIAAAAEAAQAAAAnAAMAAAAMAAAAAAAnAAQAAAAMAAEAAAAnAAYAAAAFAAQAAAAnAAcAAAAAAAQAAAAnAAgAAAAAAAQAAAAnAAkAAAABAAwAAAA=") +tile_set = ExtResource("5_xmtgx") +navigation_enabled = false +metadata/_edit_lock_ = true + +[node name="Props" type="TileMapLayer" parent="Tilemaps" groups=["Solid"]] +tile_map_data = PackedByteArray("AAAJAAUAAAAJAAwAAAAJAAYAAAAJAA0AAAAKAAUAAAAKAAwAAAAKAAYAAAAKAA0AAAAAAAMAAAAKAAwAAAAAAAQAAAAKAA0AAAAIAAEAAAAKAAwAAAAIAAIAAAAKAA0AAAALAAEAAAAJAAwAAAALAAIAAAAJAA0AAAATAAMAAAAJAAwAAAATAAQAAAAJAA0AAAA=") +tile_set = ExtResource("5_xmtgx") +navigation_enabled = false +metadata/_edit_lock_ = true + +[node name="Actors" type="Node2D" parent="Tilemaps"] +metadata/_edit_lock_ = true + +[node name="EnemySpawners" type="Node2D" parent="."] + +[node name="RogueliteEnemySpawner" type="Marker2D" parent="EnemySpawners"] +position = Vector2(57, 67) + +[node name="RogueliteEnemySpawner2" type="Marker2D" parent="EnemySpawners"] +position = Vector2(306, 115) + +[node name="RogueliteEnemySpawner3" type="Marker2D" parent="EnemySpawners"] +position = Vector2(571, 91) + +[node name="Doors" type="Node2D" parent="."] + +[node name="North" type="Marker2D" parent="Doors"] +position = Vector2(159, 23) +script = ExtResource("7_a4eus") + +[node name="North2" type="Marker2D" parent="Doors"] +position = Vector2(479.755, 23.6396) +script = ExtResource("7_a4eus") +WallIndex = 1 + +[node name="South" type="Marker2D" parent="Doors"] +position = Vector2(159, 161) +script = ExtResource("7_a4eus") +Direction = 1 + +[node name="South2" type="Marker2D" parent="Doors"] +position = Vector2(479.365, 161.023) +script = ExtResource("7_a4eus") +Direction = 1 +WallIndex = 1 + +[node name="East" type="Marker2D" parent="Doors"] +position = Vector2(632, 86) +script = ExtResource("7_a4eus") +Direction = 2 + +[node name="West" type="Marker2D" parent="Doors"] +position = Vector2(8.1806, 87.7693) +script = ExtResource("7_a4eus") +Direction = 3 + +[node name="NavigationRegion2D" type="NavigationRegion2D" parent="."] +visible = false +navigation_polygon = SubResource("NavigationPolygon_f7qjl") + +[node name="PlayerEnterDetector" type="Area2D" parent="."] +visible = false +collision_layer = 0 +collision_mask = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="PlayerEnterDetector"] +position = Vector2(321.5, 94.5) +shape = SubResource("RectangleShape2D_wtdf1") + +[connection signal="area_entered" from="PlayerEnterDetector" to="." method="OnRoomEntered"] diff --git a/Scenes/Maps/RogueliteMaps/RgBig2.tscn b/Scenes/Maps/RogueliteMaps/RgBig2.tscn new file mode 100644 index 00000000..299c1bf6 --- /dev/null +++ b/Scenes/Maps/RogueliteMaps/RgBig2.tscn @@ -0,0 +1,150 @@ +[gd_scene load_steps=11 format=4 uid="uid://cglddtyl6o4fn"] + +[ext_resource type="Script" uid="uid://b2j00riayxkit" path="res://Scripts/Controllers/RogueliteRoom.cs" id="1_7v35i"] +[ext_resource type="Resource" uid="uid://char0yv78vtty" path="res://Resources/RogueliteMaps/BigTest2.tres" id="2_7v35i"] +[ext_resource type="PackedScene" uid="uid://l84on3kv2s52" path="res://Scenes/Door_Horizontal.tscn" id="3_iv5kp"] +[ext_resource type="PackedScene" uid="uid://b0k2grrc8xp1l" path="res://Scenes/Props/BigTank.tscn" id="4_fj3qi"] +[ext_resource type="TileSet" uid="uid://6k28roiljylj" path="res://Tilesets/factory_tileset.tres" id="5_0x325"] +[ext_resource type="Script" uid="uid://krean0uywtms" path="res://Scripts/TilemapAvoidance.cs" id="6_ed0jw"] +[ext_resource type="PackedScene" uid="uid://dcbcyp1qogcl0" path="res://Scenes/Props/BigTankHorizontal.tscn" id="7_3eg8q"] +[ext_resource type="Script" uid="uid://ddry5kjj3fr6c" path="res://Scripts/Controllers/DoorMarker.cs" id="8_gx7sl"] + +[sub_resource type="NavigationPolygon" id="NavigationPolygon_lrgk6"] +vertices = PackedVector2Array(486, 58, 614, 58, 614, 294, 486, 294, 378, 211, 378, 155, 166, 58, 179, 58, 179, 77, 254, 77, 254, 58, 474, 58, 376, 107, 324, 107, 474, 10, 486, 10, 376, 155, 324, 163, 326, 163, 326, 211, 314, 211, 314, 107, 262, 107, 486, 310, 474, 310, 474, 294, 246, 294, 246, 265, 262, 211, 200, 265, 200, 294, 166, 294, 154, 58, 166, 310, 154, 310, 154, 294, 26, 294, 26, 58, 154, 10, 166, 10) +polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3, 4, 5), PackedInt32Array(6, 7, 8), PackedInt32Array(9, 10, 11, 12, 13), PackedInt32Array(11, 14, 15, 0), PackedInt32Array(12, 11, 0, 5, 16), PackedInt32Array(17, 18, 19, 20), PackedInt32Array(17, 20, 21, 13), PackedInt32Array(9, 13, 21), PackedInt32Array(9, 21, 22), PackedInt32Array(3, 23, 24, 25), PackedInt32Array(4, 3, 25), PackedInt32Array(19, 4, 25, 26, 27), PackedInt32Array(20, 19, 27), PackedInt32Array(28, 20, 27, 29), PackedInt32Array(29, 30, 31, 32, 6, 8), PackedInt32Array(31, 33, 34, 35), PackedInt32Array(35, 36, 37, 32), PackedInt32Array(31, 35, 32), PackedInt32Array(32, 38, 39, 6), PackedInt32Array(29, 8, 9, 22, 28)]) +outlines = Array[PackedVector2Array]([PackedVector2Array(32, 42, 30, 31, 62, 27, 61, 38)]) +parsed_collision_mask = 353 +source_geometry_mode = 1 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_cgxuy"] +size = Vector2(588, 243) + +[node name="Map" type="Node2D"] +process_mode = 1 +script = ExtResource("1_7v35i") +RoomResource = ExtResource("2_7v35i") +DoorPrefab = ExtResource("3_iv5kp") +WallPrefab = ExtResource("4_fj3qi") +metadata/test_scene = "res://Scenes/Maps/Roguelike.tscn" + +[node name="Tilemaps" type="Node2D" parent="." groups=["navigation_polygon_source_geometry_group"]] + +[node name="Floor" type="TileMapLayer" parent="Tilemaps" node_paths=PackedStringArray("_solidLayers") groups=["Solid"]] +tile_map_data = PackedByteArray("AAAAAAIAAAALAAcAAAAAAAMAAAALAAcAAAAAAAQAAAALAAcAAAAAAAUAAAALAAcAAAAAAAYAAAALAAcAAAAAAAcAAAALAAcAAAAAAAgAAAALAAcAAAAAAAkAAAALAAcAAAABAAIAAAALAAcAAAABAAMAAAALAAcAAAABAAQAAAALAAcAAAABAAUAAAALAAcAAAABAAYAAAALAAcAAAABAAcAAAALAAcAAAABAAgAAAALAAcAAAABAAkAAAALAAcAAAACAAIAAAALAAcAAAACAAMAAAALAAcAAAACAAQAAAALAAcAAAACAAUAAAALAAcAAAACAAYAAAALAAcAAAACAAcAAAALAAcAAAACAAgAAAALAAcAAAACAAkAAAALAAcAAAADAAIAAAALAAcAAAADAAMAAAALAAcAAAADAAQAAAALAAcAAAADAAUAAAALAAcAAAADAAYAAAALAAcAAAADAAcAAAALAAcAAAADAAgAAAALAAcAAAADAAkAAAALAAcAAAAEAAIAAAALAAcAAAAEAAMAAAALAAcAAAAEAAQAAAALAAcAAAAEAAUAAAALAAcAAAAEAAYAAAALAAcAAAAEAAcAAAALAAcAAAAEAAgAAAALAAcAAAAEAAkAAAALAAcAAAAFAAIAAAALAAcAAAAFAAMAAAALAAcAAAAFAAQAAAALAAcAAAAFAAUAAAALAAcAAAAFAAYAAAALAAcAAAAFAAcAAAALAAcAAAAFAAgAAAALAAcAAAAFAAkAAAALAAcAAAAGAAIAAAALAAcAAAAGAAMAAAALAAcAAAAGAAQAAAALAAcAAAAGAAUAAAALAAcAAAAGAAYAAAALAAcAAAAGAAcAAAALAAcAAAAGAAgAAAALAAcAAAAGAAkAAAALAAcAAAAHAAIAAAALAAcAAAAHAAMAAAALAAcAAAAHAAQAAAALAAcAAAAHAAUAAAALAAcAAAAHAAYAAAALAAcAAAAHAAcAAAALAAcAAAAHAAgAAAALAAcAAAAHAAkAAAALAAcAAAAIAAIAAAALAAcAAAAIAAMAAAALAAcAAAAIAAQAAAALAAcAAAAIAAUAAAALAAcAAAAIAAYAAAALAAcAAAAIAAcAAAALAAcAAAAIAAgAAAALAAcAAAAIAAkAAAALAAcAAAAJAAIAAAALAAcAAAAJAAMAAAALAAcAAAAJAAQAAAALAAcAAAAJAAUAAAALAAcAAAAJAAYAAAALAAcAAAAJAAcAAAALAAcAAAAJAAgAAAALAAcAAAAJAAkAAAALAAcAAAAKAAIAAAALAAcAAAAKAAMAAAALAAcAAAAKAAQAAAALAAcAAAAKAAUAAAALAAcAAAAKAAYAAAALAAcAAAAKAAcAAAALAAcAAAAKAAgAAAALAAcAAAAKAAkAAAALAAcAAAALAAIAAAALAAcAAAALAAUAAAALAAcAAAALAAYAAAALAAcAAAALAAcAAAALAAcAAAALAAgAAAALAAcAAAALAAkAAAALAAcAAAAMAAIAAAALAAcAAAAMAAUAAAALAAcAAAAMAAYAAAALAAcAAAAMAAcAAAALAAcAAAAMAAgAAAALAAcAAAAMAAkAAAALAAcAAAANAAIAAAALAAcAAAANAAMAAAALAAcAAAANAAQAAAALAAcAAAANAAUAAAALAAcAAAANAAYAAAALAAcAAAANAAcAAAALAAcAAAANAAgAAAALAAcAAAANAAkAAAALAAcAAAAOAAIAAAALAAcAAAAOAAMAAAALAAcAAAAOAAQAAAALAAcAAAAOAAUAAAALAAcAAAAOAAYAAAALAAcAAAAOAAcAAAALAAcAAAAOAAgAAAALAAcAAAAOAAkAAAALAAcAAAAPAAIAAAALAAcAAAAPAAMAAAALAAcAAAAPAAQAAAALAAcAAAAPAAUAAAALAAcAAAAPAAYAAAALAAcAAAAPAAcAAAALAAcAAAAPAAgAAAALAAcAAAAPAAkAAAALAAcAAAAQAAIAAAALAAcAAAAQAAMAAAALAAcAAAAQAAQAAAALAAcAAAAQAAUAAAALAAcAAAAQAAYAAAALAAcAAAAQAAcAAAALAAcAAAAQAAgAAAALAAcAAAAQAAkAAAALAAcAAAARAAIAAAALAAcAAAARAAMAAAALAAcAAAARAAQAAAALAAcAAAARAAUAAAALAAcAAAARAAYAAAALAAcAAAARAAcAAAALAAcAAAARAAgAAAALAAcAAAARAAkAAAALAAcAAAASAAIAAAALAAcAAAASAAMAAAALAAcAAAASAAQAAAALAAcAAAASAAUAAAALAAcAAAASAAYAAAALAAcAAAASAAcAAAALAAcAAAASAAgAAAALAAcAAAASAAkAAAALAAcAAAATAAIAAAALAAcAAAATAAMAAAAEAAIAAAATAAQAAAAEAAIAAAATAAUAAAAEAAIAAAATAAYAAAAEAAIAAAATAAcAAAAEAAIAAAATAAgAAAAEAAIAAAATAAkAAAAEAAIAAAAAAAAAAAALAAcAAAAAAAEAAAALAAcAAAABAAAAAAALAAcAAAABAAEAAAALAAcAAAACAAAAAAALAAcAAAACAAEAAAALAAcAAAADAAAAAAALAAcAAAADAAEAAAALAAcAAAAEAAAAAAALAAcAAAAEAAEAAAALAAcAAAAFAAAAAAALAAcAAAAFAAEAAAALAAcAAAAGAAAAAAALAAcAAAAGAAEAAAALAAcAAAAHAAAAAAALAAcAAAAHAAEAAAALAAcAAAAIAAAAAAALAAcAAAAIAAEAAAALAAcAAAAJAAAAAAALAAcAAAAJAAEAAAALAAcAAAAKAAAAAAALAAcAAAAKAAEAAAALAAcAAAALAAAAAAALAAcAAAALAAEAAAALAAcAAAALAAMAAAALAAcAAAALAAQAAAALAAcAAAAMAAAAAAALAAcAAAAMAAEAAAALAAcAAAAMAAMAAAALAAcAAAAMAAQAAAALAAcAAAANAAAAAAALAAcAAAANAAEAAAALAAcAAAAOAAAAAAALAAcAAAAOAAEAAAALAAcAAAAPAAAAAAALAAcAAAAPAAEAAAALAAcAAAAQAAAAAAALAAcAAAAQAAEAAAALAAcAAAARAAAAAAALAAcAAAARAAEAAAALAAcAAAASAAAAAAALAAcAAAASAAEAAAALAAcAAAATAAAAAAALAAcAAAATAAEAAAALAAcAAAAAAAoAAAALAAcAAAAAAAsAAAALAAcAAAAAAAwAAAALAAcAAAAAAA0AAAALAAcAAAAAAA4AAAALAAcAAAAAAA8AAAALAAcAAAAAABAAAAALAAcAAAAAABEAAAALAAcAAAAAABIAAAALAAcAAAABAAoAAAAEAAIAAAABAAsAAAALAAcAAAABAAwAAAALAAcAAAABAA0AAAALAAcAAAABAA4AAAALAAcAAAABAA8AAAALAAcAAAABABAAAAALAAcAAAABABEAAAALAAcAAAABABIAAAALAAcAAAACAAoAAAAEAAIAAAACAAsAAAALAAcAAAACAAwAAAALAAcAAAACAA0AAAALAAcAAAACAA4AAAALAAcAAAACAA8AAAALAAcAAAACABAAAAALAAcAAAACABEAAAALAAcAAAACABIAAAALAAcAAAADAAoAAAAEAAIAAAADAAsAAAALAAcAAAADAAwAAAALAAcAAAADAA0AAAALAAcAAAADAA4AAAALAAcAAAADAA8AAAALAAcAAAADABAAAAALAAcAAAADABEAAAALAAcAAAADABIAAAALAAcAAAAEAAoAAAAEAAIAAAAEAAsAAAALAAcAAAAEAAwAAAALAAcAAAAEAA0AAAALAAcAAAAEAA4AAAALAAcAAAAEAA8AAAALAAcAAAAEABAAAAALAAcAAAAEABEAAAALAAcAAAAEABIAAAALAAcAAAAFAAoAAAAEAAIAAAAFAAsAAAALAAcAAAAFAAwAAAALAAcAAAAFAA0AAAALAAcAAAAFAA4AAAALAAcAAAAFAA8AAAALAAcAAAAFABAAAAALAAcAAAAFABEAAAALAAcAAAAFABIAAAALAAcAAAAGAAoAAAAEAAIAAAAGAAsAAAALAAcAAAAGAAwAAAALAAcAAAAGAA0AAAALAAcAAAAGAA4AAAALAAcAAAAGAA8AAAALAAcAAAAGABAAAAALAAcAAAAGABEAAAALAAcAAAAGABIAAAALAAcAAAAHAAoAAAAEAAIAAAAHAAsAAAALAAcAAAAHAAwAAAALAAcAAAAHAA0AAAALAAcAAAAHAA4AAAALAAcAAAAHAA8AAAALAAcAAAAHABAAAAALAAcAAAAHABEAAAALAAcAAAAHABIAAAALAAcAAAAIAAoAAAAEAAIAAAAIAAsAAAALAAcAAAAIAAwAAAALAAcAAAAIAA0AAAALAAcAAAAIAA4AAAALAAcAAAAIAA8AAAALAAcAAAAIABAAAAALAAcAAAAIABEAAAALAAcAAAAIABIAAAALAAcAAAAJAAoAAAAEAAIAAAAJAAsAAAALAAcAAAAJAAwAAAALAAcAAAAJAA0AAAALAAcAAAAJAA4AAAALAAcAAAAJAA8AAAALAAcAAAAJABAAAAALAAcAAAAJABEAAAALAAcAAAAJABIAAAALAAcAAAAKAAoAAAAEAAIAAAAKAAsAAAALAAcAAAAKAAwAAAALAAcAAAAKAA0AAAALAAcAAAAKAA4AAAALAAcAAAAKAA8AAAALAAcAAAAKABAAAAALAAcAAAAKABEAAAALAAcAAAAKABIAAAALAAcAAAALAAoAAAAEAAIAAAALAAsAAAALAAcAAAALAAwAAAALAAcAAAALAA0AAAALAAcAAAALAA4AAAALAAcAAAALAA8AAAALAAcAAAALABAAAAALAAcAAAALABEAAAALAAcAAAALABIAAAALAAcAAAAMAAoAAAAEAAIAAAAMAAsAAAALAAcAAAAMAAwAAAALAAcAAAAMAA0AAAALAAcAAAAMAA4AAAALAAcAAAAMAA8AAAALAAcAAAAMABAAAAALAAcAAAAMABEAAAALAAcAAAAMABIAAAALAAcAAAANAAoAAAAEAAIAAAANAAsAAAALAAcAAAANAAwAAAALAAcAAAANAA0AAAALAAcAAAANAA4AAAALAAcAAAANAA8AAAALAAcAAAANABAAAAALAAcAAAANABEAAAALAAcAAAANABIAAAALAAcAAAAOAAoAAAAEAAIAAAAOAAsAAAALAAcAAAAOAAwAAAALAAcAAAAOAA0AAAALAAcAAAAOAA4AAAALAAcAAAAOAA8AAAALAAcAAAAOABAAAAALAAcAAAAOABEAAAALAAcAAAAOABIAAAALAAcAAAAPAAoAAAAEAAIAAAAPAAsAAAALAAcAAAAPAAwAAAALAAcAAAAPAA0AAAALAAcAAAAPAA4AAAALAAcAAAAPAA8AAAALAAcAAAAPABAAAAALAAcAAAAPABEAAAALAAcAAAAPABIAAAALAAcAAAAQAAoAAAAEAAIAAAAQAAsAAAALAAcAAAAQAAwAAAALAAcAAAAQAA0AAAALAAcAAAAQAA4AAAALAAcAAAAQAA8AAAALAAcAAAAQABAAAAALAAcAAAAQABEAAAALAAcAAAAQABIAAAALAAcAAAARAAoAAAAEAAIAAAARAAsAAAALAAcAAAARAAwAAAALAAcAAAARAA0AAAALAAcAAAARAA4AAAALAAcAAAARAA8AAAALAAcAAAARABAAAAALAAcAAAARABEAAAALAAcAAAARABIAAAALAAcAAAASAAoAAAAEAAIAAAASAAsAAAALAAcAAAASAAwAAAALAAcAAAASAA0AAAALAAcAAAASAA4AAAALAAcAAAASAA8AAAALAAcAAAASABAAAAALAAcAAAASABEAAAALAAcAAAASABIAAAALAAcAAAATAAoAAAAEAAIAAAATAAsAAAAEAAIAAAATAAwAAAAEAAIAAAATAA0AAAAEAAIAAAATAA4AAAAEAAIAAAATAA8AAAAEAAIAAAATABAAAAAEAAIAAAATABEAAAAEAAIAAAATABIAAAAEAAIAAAAUAAAAAAALAAcAAAAUAAEAAAALAAcAAAAUAAIAAAALAAcAAAAUAAMAAAAEAAIAAAAUAAQAAAAEAAIAAAAUAAUAAAAEAAIAAAAUAAYAAAAEAAIAAAAUAAcAAAAEAAIAAAAUAAgAAAAEAAIAAAAUAAkAAAAEAAIAAAAUAAoAAAAEAAIAAAAUAAsAAAAEAAIAAAAUAAwAAAAEAAIAAAAUAA0AAAAEAAIAAAAUAA4AAAAEAAIAAAAUAA8AAAAEAAIAAAAUABAAAAAEAAIAAAAUABEAAAAEAAIAAAAUABIAAAAEAAIAAAAVAAAAAAALAAcAAAAVAAEAAAALAAcAAAAVAAIAAAALAAcAAAAVAAMAAAALAAcAAAAVAAQAAAALAAcAAAAVAAUAAAALAAcAAAAVAAYAAAALAAcAAAAVAAcAAAALAAcAAAAVAAgAAAALAAcAAAAVAAkAAAALAAcAAAAVAAoAAAAEAAIAAAAVAAsAAAALAAcAAAAVAAwAAAALAAcAAAAVAA0AAAALAAcAAAAVAA4AAAALAAcAAAAVAA8AAAALAAcAAAAVABAAAAALAAcAAAAVABEAAAALAAcAAAAVABIAAAALAAcAAAAWAAAAAAALAAcAAAAWAAEAAAALAAcAAAAWAAIAAAALAAcAAAAWAAMAAAALAAcAAAAWAAQAAAALAAcAAAAWAAUAAAALAAcAAAAWAAYAAAALAAcAAAAWAAcAAAALAAcAAAAWAAgAAAALAAcAAAAWAAkAAAALAAcAAAAWAAoAAAAEAAIAAAAWAAsAAAALAAcAAAAWAAwAAAALAAcAAAAWAA0AAAALAAcAAAAWAA4AAAALAAcAAAAWAA8AAAALAAcAAAAWABAAAAALAAcAAAAWABEAAAALAAcAAAAWABIAAAALAAcAAAAXAAAAAAALAAcAAAAXAAEAAAALAAcAAAAXAAIAAAALAAcAAAAXAAMAAAALAAcAAAAXAAQAAAALAAcAAAAXAAUAAAALAAcAAAAXAAYAAAALAAcAAAAXAAcAAAALAAcAAAAXAAgAAAALAAcAAAAXAAkAAAALAAcAAAAXAAoAAAAEAAIAAAAXAAsAAAALAAcAAAAXAAwAAAALAAcAAAAXAA0AAAALAAcAAAAXAA4AAAALAAcAAAAXAA8AAAALAAcAAAAXABAAAAALAAcAAAAXABEAAAALAAcAAAAXABIAAAALAAcAAAAYAAAAAAALAAcAAAAYAAEAAAALAAcAAAAYAAIAAAALAAcAAAAYAAMAAAALAAcAAAAYAAQAAAALAAcAAAAYAAUAAAALAAcAAAAYAAYAAAALAAcAAAAYAAcAAAALAAcAAAAYAAgAAAALAAcAAAAYAAkAAAALAAcAAAAYAAoAAAAEAAIAAAAYAAsAAAALAAcAAAAYAAwAAAALAAcAAAAYAA0AAAALAAcAAAAYAA4AAAALAAcAAAAYAA8AAAALAAcAAAAYABAAAAALAAcAAAAYABEAAAALAAcAAAAYABIAAAALAAcAAAAZAAAAAAALAAcAAAAZAAEAAAALAAcAAAAZAAIAAAALAAcAAAAZAAMAAAALAAcAAAAZAAQAAAALAAcAAAAZAAUAAAALAAcAAAAZAAYAAAALAAcAAAAZAAcAAAALAAcAAAAZAAgAAAALAAcAAAAZAAkAAAALAAcAAAAZAAoAAAAEAAIAAAAZAAsAAAALAAcAAAAZAAwAAAALAAcAAAAZAA0AAAALAAcAAAAZAA4AAAALAAcAAAAZAA8AAAALAAcAAAAZABAAAAALAAcAAAAZABEAAAALAAcAAAAZABIAAAALAAcAAAAaAAAAAAALAAcAAAAaAAEAAAALAAcAAAAaAAIAAAALAAcAAAAaAAMAAAALAAcAAAAaAAQAAAALAAcAAAAaAAUAAAALAAcAAAAaAAYAAAALAAcAAAAaAAcAAAALAAcAAAAaAAgAAAALAAcAAAAaAAkAAAALAAcAAAAaAAoAAAAEAAIAAAAaAAsAAAALAAcAAAAaAAwAAAALAAcAAAAaAA0AAAALAAcAAAAaAA4AAAALAAcAAAAaAA8AAAALAAcAAAAaABAAAAALAAcAAAAaABEAAAALAAcAAAAaABIAAAALAAcAAAAbAAAAAAALAAcAAAAbAAEAAAALAAcAAAAbAAIAAAALAAcAAAAbAAMAAAALAAcAAAAbAAQAAAALAAcAAAAbAAUAAAALAAcAAAAbAAYAAAAEAAAAAAAbAAcAAAAEAAAAAAAbAAgAAAALAAcAAAAbAAkAAAALAAcAAAAbAAoAAAAEAAIAAAAbAAsAAAAEAAAAAAAbAAwAAAAEAAAAAAAbAA0AAAALAAcAAAAbAA4AAAALAAcAAAAbAA8AAAALAAcAAAAbABAAAAALAAcAAAAbABEAAAALAAcAAAAbABIAAAALAAcAAAAcAAAAAAALAAcAAAAcAAEAAAALAAcAAAAcAAIAAAALAAcAAAAcAAMAAAALAAcAAAAcAAQAAAALAAcAAAAcAAUAAAALAAcAAAAcAAYAAAAEAAAAAAAcAAcAAAALAAcAAAAcAAgAAAALAAcAAAAcAAkAAAALAAcAAAAcAAoAAAAEAAAAAAAcAAsAAAAEAAAAAAAcAAwAAAAEAAAAAAAcAA0AAAALAAcAAAAcAA4AAAALAAcAAAAcAA8AAAALAAcAAAAcABAAAAALAAcAAAAcABEAAAALAAcAAAAcABIAAAALAAcAAAAdAAAAAAALAAcAAAAdAAEAAAALAAcAAAAdAAIAAAALAAcAAAAdAAMAAAALAAcAAAAdAAQAAAALAAcAAAAdAAUAAAAEAAAAAAAdAAYAAAALAAcAAAAdAAcAAAALAAcAAAAdAAgAAAALAAcAAAAdAAkAAAAEAAAAAAAdAAoAAAAEAAAAAAAdAAsAAAALAAcAAAAdAAwAAAAEAAAAAAAdAA0AAAALAAcAAAAdAA4AAAALAAcAAAAdAA8AAAALAAcAAAAdABAAAAALAAcAAAAdABEAAAALAAcAAAAdABIAAAALAAcAAAAeAAAAAAALAAcAAAAeAAEAAAALAAcAAAAeAAIAAAALAAcAAAAeAAMAAAALAAcAAAAeAAQAAAALAAcAAAAeAAUAAAAEAAAAAAAeAAYAAAAEAAAAAAAeAAcAAAAEAAAAAAAeAAgAAAAEAAAAAAAeAAkAAAAEAAAAAAAeAAoAAAAEAAIAAAAeAAsAAAALAAcAAAAeAAwAAAAEAAAAAAAeAA0AAAALAAcAAAAeAA4AAAALAAcAAAAeAA8AAAALAAcAAAAeABAAAAALAAcAAAAeABEAAAALAAcAAAAeABIAAAALAAcAAAAfAAAAAAALAAcAAAAfAAEAAAALAAcAAAAfAAIAAAALAAcAAAAfAAMAAAALAAcAAAAfAAQAAAALAAcAAAAfAAUAAAALAAcAAAAfAAYAAAALAAcAAAAfAAcAAAALAAcAAAAfAAgAAAALAAcAAAAfAAkAAAALAAcAAAAfAAoAAAAEAAIAAAAfAAsAAAALAAcAAAAfAAwAAAAEAAAAAAAfAA0AAAALAAcAAAAfAA4AAAALAAcAAAAfAA8AAAALAAcAAAAfABAAAAALAAcAAAAfABEAAAALAAcAAAAfABIAAAALAAcAAAAgAAAAAAALAAcAAAAgAAEAAAALAAcAAAAgAAIAAAALAAcAAAAgAAMAAAALAAcAAAAgAAQAAAALAAcAAAAgAAUAAAALAAcAAAAgAAYAAAALAAcAAAAgAAcAAAALAAcAAAAgAAgAAAALAAcAAAAgAAkAAAALAAcAAAAgAAoAAAAEAAIAAAAgAAsAAAALAAcAAAAgAAwAAAAEAAAAAAAgAA0AAAALAAcAAAAgAA4AAAALAAcAAAAgAA8AAAALAAcAAAAgABAAAAALAAcAAAAgABEAAAALAAcAAAAgABIAAAALAAcAAAAhAAAAAAALAAcAAAAhAAEAAAALAAcAAAAhAAIAAAALAAcAAAAhAAMAAAALAAcAAAAhAAQAAAALAAcAAAAhAAUAAAALAAcAAAAhAAYAAAALAAcAAAAhAAcAAAALAAcAAAAhAAgAAAALAAcAAAAhAAkAAAALAAcAAAAhAAoAAAAEAAIAAAAhAAsAAAALAAcAAAAhAAwAAAAEAAAAAAAhAA0AAAALAAcAAAAhAA4AAAALAAcAAAAhAA8AAAALAAcAAAAhABAAAAALAAcAAAAhABEAAAALAAcAAAAhABIAAAALAAcAAAAiAAAAAAALAAcAAAAiAAEAAAALAAcAAAAiAAIAAAALAAcAAAAiAAMAAAALAAcAAAAiAAQAAAALAAcAAAAiAAUAAAALAAcAAAAiAAYAAAALAAcAAAAiAAcAAAALAAcAAAAiAAgAAAALAAcAAAAiAAkAAAALAAcAAAAiAAoAAAAEAAIAAAAiAAsAAAALAAcAAAAiAAwAAAALAAcAAAAiAA0AAAALAAcAAAAiAA4AAAALAAcAAAAiAA8AAAALAAcAAAAiABAAAAALAAcAAAAiABEAAAALAAcAAAAiABIAAAALAAcAAAAjAAAAAAALAAcAAAAjAAEAAAALAAcAAAAjAAIAAAALAAcAAAAjAAMAAAALAAcAAAAjAAQAAAALAAcAAAAjAAUAAAALAAcAAAAjAAYAAAALAAcAAAAjAAcAAAALAAcAAAAjAAgAAAALAAcAAAAjAAkAAAALAAcAAAAjAAoAAAAEAAIAAAAjAAsAAAALAAcAAAAjAAwAAAALAAcAAAAjAA0AAAALAAcAAAAjAA4AAAALAAcAAAAjAA8AAAALAAcAAAAjABAAAAALAAcAAAAjABEAAAALAAcAAAAjABIAAAALAAcAAAAkAAAAAAALAAcAAAAkAAEAAAALAAcAAAAkAAIAAAALAAcAAAAkAAMAAAALAAcAAAAkAAQAAAALAAcAAAAkAAUAAAALAAcAAAAkAAYAAAALAAcAAAAkAAcAAAALAAcAAAAkAAgAAAALAAcAAAAkAAkAAAALAAcAAAAkAAoAAAAEAAIAAAAkAAsAAAALAAcAAAAkAAwAAAALAAcAAAAkAA0AAAALAAcAAAAkAA4AAAALAAcAAAAkAA8AAAALAAcAAAAkABAAAAALAAcAAAAkABEAAAALAAcAAAAkABIAAAALAAcAAAAlAAAAAAALAAcAAAAlAAEAAAALAAcAAAAlAAIAAAALAAcAAAAlAAMAAAALAAcAAAAlAAQAAAALAAcAAAAlAAUAAAALAAcAAAAlAAYAAAALAAcAAAAlAAcAAAALAAcAAAAlAAgAAAALAAcAAAAlAAkAAAALAAcAAAAlAAoAAAAEAAIAAAAlAAsAAAALAAcAAAAlAAwAAAALAAcAAAAlAA0AAAALAAcAAAAlAA4AAAALAAcAAAAlAA8AAAALAAcAAAAlABAAAAALAAcAAAAlABEAAAALAAcAAAAlABIAAAALAAcAAAAmAAAAAAALAAcAAAAmAAEAAAALAAcAAAAmAAIAAAALAAcAAAAmAAMAAAALAAcAAAAmAAQAAAALAAcAAAAmAAUAAAALAAcAAAAmAAYAAAALAAcAAAAmAAcAAAALAAcAAAAmAAgAAAALAAcAAAAmAAkAAAALAAcAAAAmAAoAAAAEAAIAAAAmAAsAAAALAAcAAAAmAAwAAAALAAcAAAAmAA0AAAALAAcAAAAmAA4AAAALAAcAAAAmAA8AAAALAAcAAAAmABAAAAALAAcAAAAmABEAAAALAAcAAAAmABIAAAALAAcAAAADABMAAAALAAcAAAAEABMAAAALAAcAAAAFABMAAAALAAcAAAAGABMAAAALAAcAAAAHABMAAAALAAcAAAAIABMAAAALAAcAAAAJABMAAAALAAcAAAAKABMAAAALAAcAAAALABMAAAALAAcAAAAMABMAAAALAAcAAAANABMAAAALAAcAAAAOABMAAAALAAcAAAAPABMAAAALAAcAAAAQABMAAAALAAcAAAARABMAAAALAAcAAAASABMAAAALAAcAAAATABMAAAALAAcAAAAUABMAAAALAAcAAAAVABMAAAALAAcAAAAWABMAAAALAAcAAAAXABMAAAALAAcAAAAYABMAAAALAAcAAAAZABMAAAALAAcAAAAaABMAAAALAAcAAAAbABMAAAALAAcAAAAcABMAAAALAAcAAAAdABMAAAALAAcAAAAeABMAAAALAAcAAAAfABMAAAALAAcAAAAgABMAAAALAAcAAAAhABMAAAALAAcAAAAiABMAAAALAAcAAAAjABMAAAALAAcAAAAkABMAAAALAAcAAAAlABMAAAALAAcAAAAmABMAAAALAAcAAAAnAAsAAAALAAcAAAAnAAwAAAALAAcAAAAnAA0AAAALAAcAAAAnAA4AAAALAAcAAAAnAA8AAAALAAcAAAAnABAAAAALAAcAAAAnABEAAAALAAcAAAAnABIAAAALAAcAAAAnABMAAAALAAcAAAAnAAUAAAALAAcAAAA=") +tile_set = ExtResource("5_0x325") +navigation_enabled = false +script = ExtResource("6_ed0jw") +_solidLayers = [NodePath("../Solid"), NodePath("../Props")] +metadata/_edit_lock_ = true + +[node name="Solid" type="TileMapLayer" parent="Tilemaps" groups=["Solid"]] +tile_map_data = PackedByteArray("AAATAAAAAAAAAAsAAAASAAAAAAABAAQAAAARAAAAAAABAAQAAAAQAAAAAAABAAQAAAAPAAAAAAABAAQAAAAOAAAAAAABAAQAAAANAAAAAAABAAQAAAAMAAAAAAABAAQAAAALAAAAAAACAAQAAAAIAAAAAAADAAQAAAAHAAAAAAAEAAsAAAAGAAAAAAAFAAsAAAAFAAAAAAABAAQAAAAEAAAAAAABAAQAAAADAAAAAAABAAQAAAACAAAAAAABAAQAAAABAAAAAAABAAQAAAAAAAAAAAAAAAsAAAATAAIAAAAEAAQAAAATAAEAAAAAAAQAAAAAAAIAAAAEAAQAAAAAAAEAAAAAAAQAAAAAAAkAAAAAAAQAAAAAAAgAAAACAAsAAAAAAAcAAAACAAwAAAAAAAYAAAAFAAQAAAALAAEAAAAKAAgAAAALAAIAAAAKAAkAAAAMAAEAAAAKAAgAAAAMAAIAAAAKAAkAAAANAAEAAAAKAAgAAAANAAIAAAAKAAkAAAAOAAEAAAAKAAgAAAAOAAIAAAAKAAkAAAAPAAEAAAAKAAgAAAAPAAIAAAAKAAkAAAAQAAEAAAAKAAgAAAAQAAIAAAAKAAkAAAARAAEAAAAKAAgAAAARAAIAAAAKAAkAAAASAAEAAAAKAAgAAAASAAIAAAAKAAkAAAABAAEAAAAKAAgAAAABAAIAAAAKAAkAAAACAAEAAAAKAAgAAAACAAIAAAAKAAkAAAADAAEAAAAKAAgAAAADAAIAAAAKAAkAAAAEAAEAAAAKAAgAAAAEAAIAAAAKAAkAAAAFAAEAAAAKAAgAAAAFAAIAAAAKAAkAAAAGAAEAAAAAAAYAAAAGAAIAAAAAAAYAAAAHAAEAAAACAAYAAAAHAAIAAAACAAYAAAAIAAEAAAAKAAgAAAAIAAIAAAAKAAkAAAAAAAMAAAAKAAgAAAAAAAQAAAAKAAkAAAAAAAoAAAAAAAQAAAAAAAsAAAAAAAQAAAAAAAwAAAAEAAQAAAAAAA0AAAAKAAgAAAAAABAAAAAFAAQAAAAAABEAAAAAAAQAAAAAABIAAAAAAAQAAAAUAAAAAAABAAQAAAAUAAEAAAAKAAgAAAAUAAIAAAAKAAkAAAAVAAAAAAABAAQAAAAVAAEAAAAKAAgAAAAVAAIAAAAKAAkAAAAWAAAAAAABAAQAAAAWAAEAAAAKAAgAAAAWAAIAAAAKAAkAAAAXAAAAAAABAAQAAAAXAAEAAAAKAAgAAAAXAAIAAAAKAAkAAAAYAAAAAAAFAAsAAAAYAAEAAAAAAAYAAAAYAAIAAAAAAAYAAAAZAAAAAAABAAUAAAAZAAEAAAACAAgAAAAZAAIAAAACAAgAAAAaAAAAAAAEAAsAAAAaAAEAAAACAAYAAAAaAAIAAAACAAYAAAAbAAAAAAABAAQAAAAbAAEAAAAKAAgAAAAbAAIAAAAKAAkAAAAfAAAAAAABAAQAAAAfAAEAAAAKAAgAAAAfAAIAAAAKAAkAAAAgAAAAAAABAAQAAAAgAAEAAAAKAAgAAAAgAAIAAAAKAAkAAAAhAAAAAAAFAAsAAAAhAAEAAAAAAAYAAAAhAAIAAAAAAAYAAAAiAAAAAAABAAUAAAAiAAEAAAACAAgAAAAiAAIAAAAAAAgAAAAjAAAAAAABAAUAAAAjAAEAAAACAAgAAAAjAAIAAAABAAcAAAAkAAAAAAABAAUAAAAkAAEAAAACAAgAAAAkAAIAAAABAAcAAAAlAAAAAAABAAUAAAAlAAEAAAACAAgAAAAlAAIAAAABAAcAAAAmAAAAAAABAAUAAAAAABMAAAAAAAwAAAABABMAAAABAAQAAAACABMAAAABAAQAAAADABMAAAABAAQAAAAEABMAAAABAAQAAAAFABMAAAABAAQAAAAGABMAAAABAAQAAAAHABMAAAABAAQAAAAIABMAAAADAAQAAAALABMAAAACAAQAAAAMABMAAAABAAQAAAANABMAAAABAAQAAAAaABMAAAABAAQAAAAbABMAAAABAAQAAAAZABMAAAAEAAwAAAAYABMAAAABAAcAAAAWABMAAAABAAQAAAAXABMAAAAFAAwAAAAVABMAAAABAAQAAAAUABMAAAABAAQAAAATABMAAAABAAQAAAASABMAAAABAAQAAAARABMAAAABAAQAAAAQABMAAAABAAQAAAAPABMAAAABAAQAAAAOABMAAAABAAQAAAAmABMAAAABAAcAAAAlABMAAAABAAcAAAAkABMAAAABAAcAAAAjABMAAAAFAAwAAAAiABMAAAABAAQAAAAhABMAAAABAAQAAAAgABMAAAABAAQAAAAfABMAAAACAAQAAAAnABMAAAACAAcAAAAnABIAAAACAAYAAAAnABEAAAADAAwAAAAnABAAAAAFAAQAAAAnAAIAAAACAAcAAAAnAAEAAAACAAYAAAAnAAAAAAACAAUAAAAnAAwAAAAEAAQAAAAnAAsAAAADAAsAAAAnAAoAAAACAAYAAAAnAAkAAAADAAwAAAAnAAgAAAAAAAQAAAAnAAcAAAAAAAQAAAAnAAYAAAAFAAQAAAAnAAMAAAAKAAgAAAAnAAQAAAAKAAkAAAAmAAEAAAACAAgAAAAmAAIAAAABAAcAAAAAAA4AAAAKAAkAAAAnAA0AAAAKAAgAAAAnAA4AAAAKAAkAAAAcAAAAAAADAAQAAAAcABMAAAADAAQAAAAcAAEAAAAKAAgAAAAcAAIAAAAKAAkAAAAaAAMAAAACAAYAAAAaAAQAAAACAAYAAAAaAAUAAAACAAcAAAAZAAUAAAABAAcAAAAYAAUAAAAAAAcAAAAYAAQAAAAAAAYAAAAYAAMAAAAAAAYAAAAZAAMAAAACAAgAAAAZAAQAAAACAAgAAAAiAAUAAAAKAAgAAAAiAAQAAAADAAsAAAAiAAMAAAACAAYAAAAhAAUAAAAKAAgAAAAhAAQAAAAAAAcAAAAhAAMAAAAAAAYAAAAmAAsAAAABAAcAAAAmAAoAAAACAAgAAAAmAAkAAAABAAUAAAAlAAsAAAABAAcAAAAlAAoAAAACAAgAAAAlAAkAAAABAAUAAAAkAAsAAAABAAcAAAAkAAoAAAACAAgAAAAkAAkAAAABAAUAAAAjAAsAAAABAAcAAAAjAAoAAAACAAgAAAAjAAkAAAABAAUAAAAiAAsAAAAAAAcAAAAiAAoAAAAAAAYAAAAiAAkAAAAAAAUAAAAlABIAAAACAAgAAAAlABEAAAABAAUAAAAkABIAAAACAAgAAAAkABEAAAABAAUAAAAjABIAAAAAAAYAAAAjABEAAAAAAAUAAAAmABIAAAACAAgAAAAmABEAAAABAAUAAAALAAsAAAACAAcAAAALAAoAAAACAAYAAAALAAkAAAACAAYAAAALAAgAAAACAAUAAAAKAAsAAAABAAcAAAAKAAoAAAACAAgAAAAKAAkAAAACAAgAAAAKAAgAAAABAAUAAAAJAAsAAAABAAcAAAAJAAoAAAACAAgAAAAJAAkAAAACAAgAAAAJAAgAAAABAAUAAAAIAAsAAAAAAAgAAAAIAAoAAAACAAgAAAAIAAkAAAACAAgAAAAIAAgAAAABAAUAAAAHAAsAAAABAAgAAAAHAAoAAAACAAgAAAAHAAkAAAACAAgAAAAHAAgAAAAAAAkAAAAGAAsAAAAAAAcAAAAGAAoAAAAAAAYAAAAGAAkAAAAAAAYAAAAGAAgAAAABAAgAAAAHAAcAAAACAAYAAAAHAAYAAAACAAYAAAAHAAUAAAACAAYAAAAHAAQAAAACAAYAAAAHAAMAAAACAAYAAAAGAAcAAAABAAkAAAAGAAYAAAAAAAYAAAAGAAUAAAAAAAYAAAAGAAQAAAAAAAYAAAAGAAMAAAAAAAYAAAAFAAgAAAABAAcAAAAFAAcAAAABAAUAAAAEAAgAAAAAAAcAAAAEAAcAAAAAAAUAAAABAAgAAAACAAcAAAABAAcAAAACAAUAAAAIAA4AAAACAAcAAAAIAA0AAAACAAYAAAAIAAwAAAACAAYAAAAHAA4AAAAAAAcAAAAHAA0AAAAAAAYAAAAHAAwAAAAAAAYAAAAZABIAAAACAAYAAAAZABEAAAACAAYAAAAZABAAAAACAAYAAAAZAA8AAAACAAUAAAAYABIAAAACAAgAAAAYABEAAAACAAgAAAAYABAAAAACAAgAAAAYAA8AAAABAAUAAAAXABIAAAAAAAYAAAAXABEAAAAAAAYAAAAXABAAAAAAAAYAAAAXAA8AAAAAAAUAAAAYAAYAAAAKAAgAAAAYAAcAAAAKAAkAAAAZAAYAAAAKAAgAAAAZAAcAAAAKAAkAAAAaAAYAAAAKAAgAAAAaAAcAAAAKAAkAAAAiAAwAAAAKAAgAAAAiAA0AAAAKAAkAAAAjAAwAAAAKAAgAAAAjAA0AAAAKAAkAAAAkAAwAAAAKAAgAAAAkAA0AAAAKAAkAAAAlAAwAAAAKAAgAAAAlAA0AAAAKAAkAAAAmAAwAAAAKAAgAAAAmAA0AAAAKAAkAAAAhAAYAAAAKAAkAAAAiAAYAAAAKAAkAAAAJAAwAAAAKAAgAAAAJAA0AAAAKAAkAAAAKAAwAAAAKAAgAAAAKAA0AAAAKAAkAAAALAAwAAAAKAAgAAAALAA0AAAAKAAkAAAAIAA8AAAAKAAgAAAAIABAAAAAKAAkAAAAHAA8AAAAKAAgAAAAHABAAAAAKAAkAAAAFAAkAAAAKAAgAAAAFAAoAAAAKAAkAAAAEAAkAAAAKAAgAAAAEAAoAAAAKAAkAAAABAAkAAAAKAAgAAAABAAoAAAAKAAkAAAATAAMAAAAKAAgAAAATAAQAAAAKAAkAAAAGAAwAAAAKAAgAAAAGAA0AAAAKAAkAAAAjAAMAAAAKAAgAAAAjAAQAAAAKAAkAAAAkAAMAAAAKAAgAAAAkAAQAAAAKAAkAAAAlAAMAAAAKAAgAAAAlAAQAAAAKAAkAAAAmAAMAAAAKAAgAAAAmAAQAAAAKAAkAAAA=") +tile_set = ExtResource("5_0x325") +navigation_enabled = false +metadata/_edit_lock_ = true + +[node name="Props" type="TileMapLayer" parent="Tilemaps" groups=["Solid"]] +tile_map_data = PackedByteArray("AAASAAMAAQAAAAAAAgARAAMAAQAAAAAAAgAQAAMAAQAAAAAAAgASAAQAAQAAAAAAAgAXAAMAAQAAAAAAAgAXAAQAAQAAAAAAAgAWAAQAAQAAAAAAAgAWAAMAAQAAAAAAAgAWABEAAQAAAAAAAgAVABEAAQAAAAAAAgAVABIAAQAAAAAAAgAWABIAAQAAAAAAAgARABIAAQAAAAAAEAASABIAAQAAAAAAEAATABIAAQAAAAAAEAAQABIAAQAAAAAAEAAJAA8AAQAAAAAAEAAJAA4AAQAAAAAAEAAKAA4AAQAAAAAAEAAGAA4AAQAAAAAAEAAGAA8AAQAAAAAAEAAOAAsAAQAAAAAAEAAOAAwAAQAAAAAAEAAeAA0AAQAAAAAAEAAeAA4AAQAAAAAAEAAfAA4AAQAAAAAAEAAfAA0AAQAAAAAAEAAUABIAAQAAAAAAAQAUABEAAQAAAAAAAQAdAA0AAQAAAAAAAQAdAAwAAQAAAAAAAQAeAAwAAQAAAAAAAQAVAAQAAQAAAAAAAQAVAAMAAQAAAAAAAQARAAQAAQAAAAAAAQAQAAQAAQAAAAAAAQAJAAcAAQAAAAAAAQAIAAcAAQAAAAAAAQAmAAgAAQAAAAAAAQAlAAgAAQAAAAAAAQACABEAAQAAAAAAAQACABIAAQAAAAAAAQABABIAAQAAAAAAAQABABEAAQAAAAAAAQAEAAQAAQAAAAAAAQALAAEAAAAJAAwAAAALAAIAAAAJAA0AAAAYAAYAAAAJAAwAAAAYAAcAAAAJAA0AAAAfAAEAAAAJAAwAAAAfAAIAAAAJAA0AAAAhAAUAAAAJAAwAAAAhAAYAAAAJAA0AAAAiAAwAAAAJAAwAAAAiAA0AAAAJAA0AAAAHAA8AAAAJAAwAAAAHABAAAAAJAA0AAAAGAAwAAAAJAAwAAAAGAA0AAAAJAA0AAAAEAAkAAAAJAAwAAAAEAAoAAAAJAA0AAAABAAkAAAAKAAwAAAABAAoAAAAKAA0AAAAIAA8AAAAKAAwAAAAIABAAAAAKAA0AAAALAAwAAAAKAAwAAAALAA0AAAAKAA0AAAAIAAEAAAAKAAwAAAAIAAIAAAAKAA0AAAAcAAEAAAAKAAwAAAAcAAIAAAAKAA0AAAAaAAYAAAAKAAwAAAAaAAcAAAAKAA0AAAAiAAUAAAAKAAwAAAAiAAYAAAAKAA0AAAATAAMAAAAKAA4AAAATAAQAAAAKAA8AAAAAAA0AAAAKAA4AAAAAAA4AAAAKAA8AAAAAAAMAAAAKAA4AAAAAAAQAAAAKAA8AAAAnAA0AAAAKAA4AAAAnAA4AAAAKAA8AAAAnAAMAAAAKAAwAAAAnAAQAAAAKAA0AAAA=") +tile_set = ExtResource("5_0x325") +navigation_enabled = false +metadata/_edit_lock_ = true + +[node name="Actors" type="Node2D" parent="Tilemaps"] +metadata/_edit_lock_ = true + +[node name="BigTankHorizontal" parent="Tilemaps/Actors" instance=ExtResource("7_3eg8q")] +position = Vector2(202, 54) + +[node name="BigTankHorizontal2" parent="Tilemaps/Actors" instance=ExtResource("7_3eg8q")] +position = Vector2(231, 54) + +[node name="BigTankHorizontal3" parent="Tilemaps/Actors" instance=ExtResource("7_3eg8q")] +position = Vector2(223, 289) + +[node name="BigTank" parent="Tilemaps/Actors" instance=ExtResource("4_fj3qi")] +position = Vector2(288, 136) + +[node name="BigTank2" parent="Tilemaps/Actors" instance=ExtResource("4_fj3qi")] +position = Vector2(350, 136) + +[node name="BigTank3" parent="Tilemaps/Actors" instance=ExtResource("4_fj3qi")] +position = Vector2(288, 184) + +[node name="BigTank4" parent="Tilemaps/Actors" instance=ExtResource("4_fj3qi")] +position = Vector2(352, 184) + +[node name="EnemySpawners" type="Node2D" parent="."] + +[node name="RogueliteEnemySpawner" type="Marker2D" parent="EnemySpawners"] +position = Vector2(214, 106) + +[node name="RogueliteEnemySpawner2" type="Marker2D" parent="EnemySpawners"] +position = Vector2(69, 238) + +[node name="RogueliteEnemySpawner3" type="Marker2D" parent="EnemySpawners"] +position = Vector2(485, 149) + +[node name="RogueliteEnemySpawner4" type="Marker2D" parent="EnemySpawners"] +position = Vector2(449, 268) + +[node name="RogueliteEnemySpawner5" type="Marker2D" parent="EnemySpawners"] +position = Vector2(290, 254) + +[node name="Doors" type="Node2D" parent="."] + +[node name="North" type="Marker2D" parent="Doors"] +position = Vector2(159, 34) +script = ExtResource("8_gx7sl") + +[node name="North2" type="Marker2D" parent="Doors"] +position = Vector2(480, 32) +script = ExtResource("8_gx7sl") +WallIndex = 1 + +[node name="South" type="Marker2D" parent="Doors"] +position = Vector2(160, 323) +script = ExtResource("8_gx7sl") +Direction = 1 + +[node name="South2" type="Marker2D" parent="Doors"] +position = Vector2(480, 323) +script = ExtResource("8_gx7sl") +Direction = 1 +WallIndex = 1 + +[node name="East" type="Marker2D" parent="Doors"] +position = Vector2(630, 88) +script = ExtResource("8_gx7sl") +Direction = 2 + +[node name="East2" type="Marker2D" parent="Doors"] +position = Vector2(629, 248) +script = ExtResource("8_gx7sl") +Direction = 2 +WallIndex = 1 + +[node name="West" type="Marker2D" parent="Doors"] +position = Vector2(8.1806, 87.7693) +script = ExtResource("8_gx7sl") +Direction = 3 + +[node name="West2" type="Marker2D" parent="Doors"] +position = Vector2(6, 247) +script = ExtResource("8_gx7sl") +Direction = 3 +WallIndex = 1 + +[node name="NavigationRegion2D" type="NavigationRegion2D" parent="."] +visible = false +navigation_polygon = SubResource("NavigationPolygon_lrgk6") + +[node name="PlayerEnterDetector" type="Area2D" parent="."] +visible = false +collision_layer = 0 +collision_mask = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="PlayerEnterDetector"] +position = Vector2(320, 173.5) +shape = SubResource("RectangleShape2D_cgxuy") + +[connection signal="area_entered" from="PlayerEnterDetector" to="." method="OnRoomEntered"] diff --git a/Scripts/Controllers/RogueliteRoom.cs b/Scripts/Controllers/RogueliteRoom.cs index 77217f8e..27d228b4 100644 --- a/Scripts/Controllers/RogueliteRoom.cs +++ b/Scripts/Controllers/RogueliteRoom.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using Cirno.Scripts.Components.FSM.Enemy; +using Cirno.Scripts.Enums; using Cirno.Scripts.Resources; using Cirno.Scripts.Resources.Roguelite; using Godot; @@ -22,6 +23,19 @@ public partial class RogueliteRoom : Node2D return BottomLeft + new Vector2I(GD.RandRange(0, RoomResource.Size.X - 1), 0); } + public Vector2I RandomExit(Direction direction) + { + return direction switch + { + Direction.Up => GridPosition + new Vector2I(GD.RandRange(0, RoomResource.Size.X - 1), 0), + Direction.Down => BottomLeft + new Vector2I(GD.RandRange(0, RoomResource.Size.X - 1), 0), + Direction.Left => GridPosition + new Vector2I(0, GD.RandRange(0, RoomResource.Size.Y - 1)), + Direction.Right => GridPosition + new Vector2I(RoomResource.Size.X - 1, 0) + + new Vector2I(0, GD.RandRange(0, RoomResource.Size.Y - 1)), + _ => throw new ArgumentOutOfRangeException(nameof(direction), direction, null) + }; + } + [Export] public PackedScene DoorPrefab { get; private set; } [Export] public PackedScene WallPrefab { get; private set; } diff --git a/Scripts/Controllers/RogueliteRoomManager.cs b/Scripts/Controllers/RogueliteRoomManager.cs index 4119547f..25759005 100644 --- a/Scripts/Controllers/RogueliteRoomManager.cs +++ b/Scripts/Controllers/RogueliteRoomManager.cs @@ -6,6 +6,7 @@ using Cirno.Scripts.Resources.Roguelite; using Cirno.Scripts.Utils; using Godot; using Godot.Collections; +using Range = System.Range; namespace Cirno.Scripts.Controllers; @@ -31,6 +32,14 @@ public partial class RogueliteRoomManager : Node2D [Export] public int DungeonWidth = 10; [Export] public int DungeonHeight = 10; [Export] public int MaxRooms = 12; + [Export] public int MinKeys = 0; + [Export] public int MaxKeys = 3; + [Export] public int MinSecrets = 1; + [Export] public int MaxSecrets = 2; + [Export] public int MinTreasures = 1; + [Export] public int MaxTreasures = 2; + [Export] public int MinShops = 1; + [Export] public int MaxShops = 1; [Export] public ulong Seed = 0; [Export] public Vector2I TileSize { get; set; } = new Vector2I(16, 16); @@ -78,7 +87,7 @@ public partial class RogueliteRoomManager : Node2D x.Type is RoomType.Regular && x.HasDoors(DoorDirections.East | DoorDirections.West)); private IEnumerable BossRooms => Rooms.Where(x => x.Type is RoomType.Boss); - + private List _connections = new(); public List Connections => _connections; @@ -94,83 +103,43 @@ public partial class RogueliteRoomManager : Node2D var starterRoom = Rooms.Where(r => r.Type == RoomType.Starter).PickRandom(); SpawnRoom(starterRoom, origin, out var spawnedBeginRoom); - var randomRoomsList = RegularRooms.Shuffle(DungeonLength).ToList(); + var randomRoomsList = RegularRooms.Shuffle(MaxRooms * 4).ToList(); - var randomOffshootRoomsList = OffshootRooms.Shuffle(MaxBranchLength).ToList(); + var randomOffshootRoomsList = OffshootRooms.Shuffle(DungeonLength * 4).ToList(); var currentPos = spawnedBeginRoom.RandomBottomExit(); _connections.Add(new RoomConnection(origin, currentPos + new Vector2I(0, 1))); Vector2I nextPos; - var offshoots = new List() - { - RoomType.Treasure, - RoomType.Secret, - RoomType.Shop, - RoomType.Key, - RoomType.Regular - }; + var offshoots = new List(); + + AddRandomOffshootType(offshoots, MinKeys, MaxKeys, RoomType.Key); + AddRandomOffshootType(offshoots, MinShops, MaxShops, RoomType.Shop); + AddRandomOffshootType(offshoots, MinSecrets, MaxSecrets, RoomType.Secret); + AddRandomOffshootType(offshoots, MinTreasures, MaxTreasures, RoomType.Treasure); + var shuffledOffshoots = offshoots.Shuffle().ToList(); int currentOffshoot = 0; - + + RogueliteRoom lastRoom = spawnedBeginRoom; + for (int i = 0; i < DungeonLength; i++) { GD.Print($"Dungeon room {i}"); - var spawnedRoom = TrySpawnRoom(randomRoomsList, currentPos); + var randRoomStartIndex = SpawnedRooms.Count(x => x.RoomResource.Type is RoomType.Regular && x.RoomResource.HasDoors(DoorDirections.North | DoorDirections.South)); + + var spawnedRoom = TrySpawnRoom(randomRoomsList.Take(new Range(randRoomStartIndex, randomRoomsList.Count - 1)).ToList(), + lastRoom, Direction.Down); if (spawnedRoom is null) { continue; } + + lastRoom = spawnedRoom; - // - // nextPos = currentPos + new Vector2I(0, 1); - // - // var roomToSpawn = randomRoomsList[randRoomIndex % randomRoomsList.Count]; - // - // var spawnedRoom = TrySpawnRoom(roomToSpawn, nextPos); - // if (spawnedRoom is null) - // { - // // Failed, try another room - // DungeonLength += 1; - // randRoomIndex++; - // continue; - // } - // - // - // var offset = 0; - // - // // Place it at a random X position - // if (roomToSpawn.Size.X > 1) - // { - // offset -= GD.RandRange(0, roomToSpawn.Size.X - 1); - // } - // - // nextPos += new Vector2I(offset, 0); - // - // //var posWithOffset = nextPos + new Vector2I(offset, 0); - // - // GD.Print($"Spawning room at {nextPos}"); - // if (!SpawnRoom(roomToSpawn, nextPos, out var spawnedRoom)) - // { - // GD.PrintErr($"Could not spawn room {roomToSpawn} at {nextPos}"); - // //DungeonLength += 1; - // continue; - // } - - - nextPos = spawnedRoom.RandomBottomExit(); - - GD.Print($"Next pos is now: {nextPos}"); - - // nextPos is now the end of the room at the current exit - - _connections.Add(new RoomConnection(nextPos, nextPos + new Vector2I(0, 1))); - - currentPos = nextPos; - // Spawn offshoot here var offshootTypeToSpawn = shuffledOffshoots[currentOffshoot % shuffledOffshoots.Count()]; @@ -181,78 +150,50 @@ public partial class RogueliteRoomManager : Node2D continue; } - int roomsInOffshot = GD.RandRange(0, MaxBranchLength); - - var leftPosition = spawnedRoom.GridPosition; - // Roll whether to go left or right, if direction is full go the other, if both are full do not spawn - for (int j = 0; j < roomsInOffshot; j++) + var directions = new List(); + + if (lastRoom.RoomResource.DoorDirections.HasFlag(DoorDirections.East)) directions.Add(Direction.Right); + if (lastRoom.RoomResource.DoorDirections.HasFlag(DoorDirections.West)) directions.Add(Direction.Left); + + directions = directions.Shuffle().ToList(); + + var randOffshootStartIndex = SpawnedRooms.Count(x => x.RoomResource.Type is RoomType.Regular && x.RoomResource.HasDoors(DoorDirections.West | DoorDirections.East)); + + foreach (var direction in directions) { - var shuffledOffshootRoomsList = randomOffshootRoomsList.Shuffle().ToList(); + int roomsInOffshot = offshootTypeToSpawn is RoomType.Secret or RoomType.Shop + ? 0 + : GD.RandRange(0, MaxBranchLength); - var directions = new List() { Vector2I.Left, Vector2I.Right }.Shuffle(); + var roomsForOffshoot = randomOffshootRoomsList + .Take(new Range(randOffshootStartIndex, randomOffshootRoomsList.Count - 1)).ToList(); - foreach (var shuffledOffshoot in shuffledOffshootRoomsList) + var res = SpawnOffshoot(lastRoom, direction, offshootTypeToSpawn, roomsInOffshot, roomsForOffshoot); + + if (res) { - var offshootCoord = leftPosition - new Vector2I(shuffledOffshoot.Size.X, 0); - - GD.Print("Spawning side room"); - var spawned = SpawnRoom(shuffledOffshoot, offshootCoord, out var spawnedOffshoot); - - if (!spawned) - { - GD.Print($"Could not place room {shuffledOffshoot} at {offshootCoord}"); - // Try next in list - continue; - } - - _connections.Add(new RoomConnection(leftPosition, - offshootCoord + new Vector2I(shuffledOffshoot.Size.X - 1, 0))); - - leftPosition = offshootCoord; - - // Stop because we spawned the room we needed to currentOffshoot++; break; } - } - // Offshoot over - - // Spawn final room - var finalRoomToSpawn = Rooms.Where(x => x.Type == offshootTypeToSpawn).PickRandom(); - - var finalRoomCoord = leftPosition - new Vector2I(finalRoomToSpawn.Size.X, 0); - - SpawnRoom(finalRoomToSpawn, finalRoomCoord, out var spawnedFinalRoom); - - _connections.Add(new RoomConnection(leftPosition, - finalRoomCoord + new Vector2I(finalRoomToSpawn.Size.X - 1, 0))); - - leftPosition = finalRoomCoord; - // Done with last offshoot room + // Add more dungeon if not enough rooms are generated + if (i == DungeonLength - 1 && DungeonLength < MaxRooms && currentOffshoot < DungeonLength) + { + DungeonLength++; + } } - nextPos = currentPos + new Vector2I(0, 1); - GD.Print($"Final nextpos is {nextPos}"); var bossRoom = BossRooms.PickRandom(); - if (SpawnRoom(bossRoom, nextPos, out var spawnedBossRoom)) - { + var spawnedBossRoom = TrySpawnRoom(BossRooms.ToList(), lastRoom, Direction.Down); - if (bossRoom.Size.Y > 1) - { - nextPos += new Vector2I(0, bossRoom.Size.Y - 1); - } - - _connections.Add(new RoomConnection(currentPos, nextPos)); - } - else + if (spawnedBossRoom is null) { - GD.PrintErr($"Could not spawn boss room {bossRoom} at {nextPos}"); + GD.PrintErr($"Could not spawn boss room {bossRoom}"); } foreach (var room in SpawnedRooms) @@ -271,30 +212,57 @@ public partial class RogueliteRoomManager : Node2D //CallDeferred(MethodName.OpenStartDoorsDeferred, spawnedBeginRoom); } - private RogueliteRoom TrySpawnRoom(List roomsList, Vector2I originPos) + private RogueliteRoom TrySpawnRoom(List roomsList, RogueliteRoom lastRoom, + Direction direction) { - var nextPos = originPos + new Vector2I(0, 1); - var rooms = roomsList.Shuffle().ToList(); + //var nextPos = originPos + new Vector2I(0, 1); + + Vector2I exitPosition = lastRoom.RandomExit(direction); + + Vector2I nextPos = direction switch + { + Direction.Up => exitPosition + Vector2I.Up, + Direction.Down => exitPosition + Vector2I.Down, + Direction.Left => exitPosition + Vector2I.Left, + Direction.Right => exitPosition + Vector2I.Right, + _ => exitPosition + }; + + var rooms = roomsList; //.Shuffle().ToList(); for (int i = 0; i < rooms.Count(); i++) { var roomToSpawn = rooms[i % rooms.Count()]; - var spawnedRoom = TrySpawnRoom(roomToSpawn, nextPos); + var spawnedRoom = TrySpawnRoom(roomToSpawn, nextPos, direction); if (spawnedRoom is null) { GD.PrintErr($"Could not spawn room {roomToSpawn} at {nextPos}"); continue; } + + _connections.Add(new RoomConnection(exitPosition, nextPos)); + return spawnedRoom; } + GD.PrintErr($"Could not spawn room at all at {nextPos}"); return null; } - - private RogueliteRoom TrySpawnRoom(RogueliteRoomResource roomToSpawn, Vector2I nextPos) + + private readonly System.Collections.Generic.Dictionary dirDict = new() { - var offsets = roomToSpawn.GetTopRoomOffsets(nextPos).Shuffle(); + { Direction.Up, Vector2I.Up }, + { Direction.Down, Vector2I.Down }, + { Direction.Left, Vector2I.Left }, + { Direction.Right, Vector2I.Right }, + }; + + private RogueliteRoom TrySpawnRoom(RogueliteRoomResource roomToSpawn, Vector2I nextPos, Direction direction) + { + List offsets = []; + + offsets.AddRange(roomToSpawn.GetRoomOffsets(nextPos, direction)); foreach (var offset in offsets) { @@ -346,6 +314,61 @@ public partial class RogueliteRoomManager : Node2D GameManager.Instance.RebakeNavigation(); } + private bool SpawnOffshoot(RogueliteRoom lastRoom, Direction direction, RoomType offshootTypeToSpawn, + int roomsInOffshot, List randomOffshootRoomsList) + { + RogueliteRoom lastSpawnedOffshootRoom = lastRoom; + for (int j = 0; j < roomsInOffshot; j++) + { + var shuffledOffshootRoomsList = randomOffshootRoomsList;//.Shuffle().ToList(); + + foreach (var shuffledOffshoot in shuffledOffshootRoomsList) + { + var spawnedRoom = TrySpawnRoom(shuffledOffshootRoomsList, lastSpawnedOffshootRoom, direction); + + if (spawnedRoom is null) + { + GD.Print($"Could not place offshoot {shuffledOffshoot}"); + // Try next in list + continue; + } + + lastSpawnedOffshootRoom = spawnedRoom; + break; + } + + // Nope no offshoot + if (lastSpawnedOffshootRoom is null) + { + return false; + } + } + + // Offshoot over + + // Spawn final room + // var finalRoomToSpawn = Rooms.Where(x => x.Type == offshootTypeToSpawn).PickRandom(); + + var spawnedFinalRoom = TrySpawnRoom(Rooms.Where(x => x.Type == offshootTypeToSpawn).ToList(), + lastSpawnedOffshootRoom, direction); + + if (spawnedFinalRoom is null) + { + GD.Print($"Could not place offshoot final room {lastSpawnedOffshootRoom}"); + // Try next in list + return false; + } + + // var finalRoomCoord = leftPosition - new Vector2I(finalRoomToSpawn.Size.X, 0); + // + // SpawnRoom(finalRoomToSpawn, finalRoomCoord, out var spawnedFinalRoom); + // + // _connections.Add(new RoomConnection(leftPosition, + // finalRoomCoord + new Vector2I(finalRoomToSpawn.Size.X - 1, 0))); + + return true; + } + private bool SpawnRoom(RogueliteRoomResource room, Vector2I gridPos, out RogueliteRoom spawnedRoom) { if (!CanPlaceRoom(gridPos, room.Size)) @@ -406,4 +429,14 @@ public partial class RogueliteRoomManager : Node2D } } } + + private void AddRandomOffshootType(List roomTypes, int minAmount, int maxAmount, RoomType type) + { + var itemsToAdd = GD.RandRange(minAmount, maxAmount); + GD.Print($"Adding {itemsToAdd} {type}"); + for (int k = 0; k < itemsToAdd; k++) + { + roomTypes.Add(type); + } + } } \ No newline at end of file diff --git a/Scripts/Resources/Roguelite/RogueliteRoomResource.cs b/Scripts/Resources/Roguelite/RogueliteRoomResource.cs index 7550bcf7..5bced7b3 100644 --- a/Scripts/Resources/Roguelite/RogueliteRoomResource.cs +++ b/Scripts/Resources/Roguelite/RogueliteRoomResource.cs @@ -14,11 +14,11 @@ public partial class RogueliteRoomResource : Resource [Export] public Vector2I Size { get; set; } = new(1, 1); [Export] public Array DoorGridPositions { get; set; } = []; - + [Export] public Array SpawnableEnemies { get; set; } - + [Export] public DoorDirections DoorDirections { get; set; } - + public bool HasDoors(DoorDirections required) => (DoorDirections & required) == required; public override string ToString() @@ -26,13 +26,31 @@ public partial class RogueliteRoomResource : Resource return $"{RoomName} {Type} {Size.X}x{Size.Y}"; } - public List GetTopRoomOffsets(Vector2I gridPosition) + public List GetRoomOffsets(Vector2I gridPosition, Direction side) { List offsets = []; - - for (int i = 0; i < Size.X; i++) + + switch (side) { - offsets.Add(new Vector2I(gridPosition.X - i, gridPosition.Y)); + case Direction.Down: + for (int i = 0; i < Size.X; i++) + offsets.Add(new Vector2I(gridPosition.X - i, gridPosition.Y)); + break; + + case Direction.Up: + for (int i = 0; i < Size.X; i++) + offsets.Add(new Vector2I(gridPosition.X - i, gridPosition.Y + Size.Y - 1)); + break; + + case Direction.Right: + for (int i = 0; i < Size.Y; i++) + offsets.Add(new Vector2I(gridPosition.X, gridPosition.Y - i)); + break; + + case Direction.Left: + for (int i = 0; i < Size.Y; i++) + offsets.Add(new Vector2I(gridPosition.X + Size.X - 1, gridPosition.Y - i)); + break; } return offsets;