diff --git a/Resources/Maps/Roguelite.tres b/Resources/Maps/Roguelite.tres new file mode 100644 index 00000000..c210673f --- /dev/null +++ b/Resources/Maps/Roguelite.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="MapResource" load_steps=3 format=3 uid="uid://6ek4lmtuij4t"] + +[ext_resource type="Resource" uid="uid://cn8tu4jct04rp" path="res://Resources/StartData/Pistol_Start.tres" id="1_e1otp"] +[ext_resource type="Script" uid="uid://quy4d4tgvqfy" path="res://Scripts/Resources/MapResource.cs" id="1_nap7o"] + +[resource] +script = ExtResource("1_nap7o") +LevelId = -2 +MapName = &"Roguelite" +MapDescription = null +ScenePath = &"uid://bf1kqr3o6r6d4" +WeaponsAllowed = true +StartData = ExtResource("1_e1otp") +metadata/_custom_type_script = "uid://quy4d4tgvqfy" diff --git a/Resources/RogueliteMaps/TestRGMap.tres b/Resources/RogueliteMaps/TestRGMap.tres new file mode 100644 index 00000000..88e63085 --- /dev/null +++ b/Resources/RogueliteMaps/TestRGMap.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="RogueliteRoomResource" load_steps=2 format=3 uid="uid://b5x83li01qrav"] + +[ext_resource type="Script" uid="uid://bl2ne8w12e3a" path="res://Scripts/Resources/Roguelite/RogueliteRoomResource.cs" id="1_keg4c"] + +[resource] +script = ExtResource("1_keg4c") +RoomName = &"Test" +ScenePath = &"uid://da7hmajaaiohm" +metadata/_custom_type_script = "uid://bl2ne8w12e3a" diff --git a/Scenes/MainMenu.tscn b/Scenes/MainMenu.tscn index e3856f92..60df194d 100644 --- a/Scenes/MainMenu.tscn +++ b/Scenes/MainMenu.tscn @@ -21,9 +21,9 @@ [ext_resource type="Resource" uid="uid://byo74ews118nl" path="res://Resources/Music/No_Reason.tres" id="13_fh7cp"] [ext_resource type="FontFile" uid="uid://cyk27h5aox1n7" path="res://fonts/sector_034.ttf" id="14_yxkem"] -[sub_resource type="AtlasTexture" id="AtlasTexture_ogjye"] +[sub_resource type="AtlasTexture" id="AtlasTexture_quqih"] atlas = ExtResource("9_riqfo") -region = Rect2(64, 0, 32, 16) +region = Rect2(576, 0, 32, 16) [sub_resource type="Theme" id="Theme_c7h4d"] @@ -69,7 +69,7 @@ offset_top = 40.995 offset_right = 186.42 offset_bottom = 56.995 rotation = 3.14159 -texture = SubResource("AtlasTexture_ogjye") +texture = SubResource("AtlasTexture_quqih") [node name="MarginContainer" type="MarginContainer" parent="."] anchors_preset = 15 diff --git a/Scenes/Maps/Roguelike.tscn b/Scenes/Maps/Roguelike.tscn index 177e2bd4..55d90cfd 100644 --- a/Scenes/Maps/Roguelike.tscn +++ b/Scenes/Maps/Roguelike.tscn @@ -1,13 +1,10 @@ -[gd_scene load_steps=17 format=4 uid="uid://bf1kqr3o6r6d4"] +[gd_scene load_steps=13 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"] -[ext_resource type="Script" uid="uid://epnwjptvks3t" path="res://Scripts/Resources/LootItem.cs" id="3_3fyis"] -[ext_resource type="Script" uid="uid://mja0rk7n2kln" path="res://Scripts/Resources/MapStartDataResource.cs" id="3_go1yg"] -[ext_resource type="TileSet" uid="uid://6k28roiljylj" path="res://Tilesets/factory_tileset.tres" id="4_pfafs"] -[ext_resource type="Script" uid="uid://krean0uywtms" path="res://Scripts/TilemapAvoidance.cs" id="5_ktre5"] -[ext_resource type="Script" uid="uid://v2f387aad33k" path="res://Scripts/Components/FSM/ActorStateMachine.cs" id="6_68lig"] -[ext_resource type="SpriteFrames" uid="uid://bcc5mlwwnkvri" path="res://Resources/Sprites/Fairy.tres" id="7_83bvc"] +[ext_resource type="Resource" uid="uid://6ek4lmtuij4t" path="res://Resources/Maps/Roguelite.tres" id="2_k5t51"] +[ext_resource type="Script" uid="uid://bt2qjgnf1wc2r" path="res://Scripts/Controllers/RogueliteRoomManager.cs" id="4_jtlua"] +[ext_resource type="Resource" uid="uid://b5x83li01qrav" path="res://Resources/RogueliteMaps/TestRGMap.tres" id="5_gwtv6"] [ext_resource type="Script" uid="uid://cfya7sndh7vy2" path="res://Scenes/CameraController.gd" id="8_y651a"] [ext_resource type="Script" uid="uid://c5nxsq3tyxcx6" path="res://Scripts/InventoryManager.cs" id="9_vhvs2"] [ext_resource type="PackedScene" uid="uid://dkwi1hu1bixoe" path="res://Scenes/HUD/HUD.tscn" id="10_6gk3e"] @@ -15,57 +12,27 @@ [ext_resource type="Script" uid="uid://cnkipcolyj61w" path="res://Scripts/AlarmManager.cs" id="12_eoca5"] [ext_resource type="PackedScene" uid="uid://b3tyacxxw88lx" path="res://Scenes/Utils/StreamPlayerWithName.tscn" id="13_4n7t6"] -[sub_resource type="Resource" id="Resource_6wo78"] -script = ExtResource("3_go1yg") -EggIndex = 0 -StartingEquipment = Array[ExtResource("3_3fyis")]([]) +[sub_resource type="NavigationPolygon" id="NavigationPolygon_jtlua"] +vertices = PackedVector2Array(-69.1094, 193.477, -146.813, 182.609, -132, 117.898, -69.8906, 117.117) +polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)]) +outlines = Array[PackedVector2Array]([PackedVector2Array(-159, 191, -140, 108, -60, 107, -59, 205)]) +parsed_collision_mask = 353 +source_geometry_mode = 1 -[sub_resource type="CircleShape2D" id="CircleShape2D_5xgmc"] - -[node name="GameScene" type="Node2D"] +[node name="GameScene" type="Node2D" node_paths=PackedStringArray("NavigationRegion")] process_mode = 3 script = ExtResource("1_wbqvu") +MapResource = ExtResource("2_k5t51") PlayerTemplate = ExtResource("2_3fyis") SpawnMarkers = Dictionary[int, NodePath]({ 0: NodePath("PlayerStartPosition") }) -MapStartData = SubResource("Resource_6wo78") +NavigationRegion = NodePath("NavigationRegion2D") -[node name="Tilemaps" type="Node2D" parent="."] +[node name="Maps" type="Node2D" parent="." groups=["navigation_polygon_source_geometry_group"]] process_mode = 1 - -[node name="Floor" type="TileMapLayer" parent="Tilemaps" node_paths=PackedStringArray("_solidLayers")] -tile_map_data = PackedByteArray("AAAEABAAAAAEAAIAAAAEABEAAAAEAAIAAAAEABIAAAAEAAIAAAAEABMAAAAEAAIAAAAEABQAAAAEAAIAAAAEABUAAAAEAAIAAAAEABYAAAAEAAIAAAAFABAAAAAEAAIAAAAFABEAAAAEAAIAAAAFABIAAAAEAAIAAAAFABMAAAAEAAIAAAAFABQAAAAEAAIAAAAFABUAAAAEAAIAAAAFABYAAAAEAAIAAAAGABAAAAAEAAIAAAAGABEAAAAEAAIAAAAGABIAAAAEAAIAAAAGABMAAAAEAAIAAAAGABQAAAAEAAIAAAAGABUAAAAEAAIAAAAGABYAAAAEAAIAAAAHABAAAAAEAAIAAAAHABEAAAAEAAIAAAAHABIAAAAEAAIAAAAHABMAAAAEAAIAAAAHABQAAAAEAAIAAAAHABUAAAAEAAIAAAAHABYAAAAEAAIAAAAIABAAAAAEAAIAAAAIABEAAAAEAAIAAAAIABIAAAAEAAIAAAAIABMAAAAEAAIAAAAIABQAAAAEAAIAAAAIABUAAAAEAAIAAAAIABYAAAAEAAIAAAAJABAAAAAEAAIAAAAJABEAAAAEAAIAAAAJABIAAAAEAAIAAAAJABMAAAAEAAIAAAAJABQAAAAEAAIAAAAJABUAAAAEAAIAAAAJABYAAAAEAAIAAAAKABAAAAAEAAIAAAAKABEAAAAEAAIAAAAKABIAAAAEAAIAAAAKABMAAAAEAAIAAAAKABQAAAAEAAIAAAAKABUAAAAEAAIAAAAKABYAAAAEAAIAAAADABAAAAAEAAIAAAADABEAAAAEAAIAAAADABIAAAAEAAIAAAADABMAAAAEAAIAAAADABQAAAAEAAIAAAADABUAAAAEAAIAAAADABYAAAAEAAIAAAADABcAAAAEAAIAAAADABgAAAAEAAIAAAAEABcAAAAEAAIAAAAEABgAAAAEAAIAAAAFABcAAAAEAAIAAAAFABgAAAAEAAIAAAAGABcAAAAEAAIAAAAGABgAAAAEAAIAAAAHABcAAAAEAAIAAAAHABgAAAAEAAIAAAAIABcAAAAEAAIAAAAIABgAAAAEAAIAAAAJABcAAAAEAAIAAAAJABgAAAAEAAIAAAAKABcAAAAEAAIAAAAKABgAAAAEAAIAAAALABAAAAAEAAIAAAALABEAAAAEAAIAAAALABIAAAAEAAIAAAALABMAAAAEAAIAAAALABQAAAAEAAIAAAALABUAAAAEAAIAAAALABYAAAAEAAIAAAALABcAAAAEAAIAAAALABgAAAAEAAIAAAA=") -tile_set = ExtResource("4_pfafs") -script = ExtResource("5_ktre5") -_solidLayers = [NodePath("../Solid"), NodePath("../Props")] -metadata/_edit_lock_ = true - -[node name="Solid" type="TileMapLayer" parent="Tilemaps" groups=["Solid"]] -tile_map_data = PackedByteArray("AAACAA0AAAAAAAsAAAADAA0AAAABAAQAAAAEAA0AAAABAAQAAAAFAA0AAAABAAQAAAAGAA0AAAABAAQAAAAHAA0AAAABAAQAAAAIAA0AAAABAAQAAAAJAA0AAAABAAQAAAAKAA0AAAABAAQAAAALAA0AAAABAAQAAAAMAA0AAAABAAsAAAAMAA4AAAAAAAQAAAAMAA8AAAAAAAQAAAAMABAAAAAAAAQAAAAMABEAAAAAAAQAAAAMABMAAAAAAAQAAAAMABIAAAAAAAQAAAAMABQAAAAAAAQAAAAMABUAAAAAAAQAAAAMABYAAAAAAAQAAAAMABcAAAAAAAQAAAAMABgAAAAAAAQAAAAMABkAAAABAAwAAAALABkAAAABAAQAAAAKABkAAAABAAQAAAAJABkAAAABAAQAAAAIABkAAAABAAQAAAAHABkAAAABAAQAAAAGABkAAAABAAQAAAAFABkAAAABAAQAAAAEABkAAAABAAQAAAADABkAAAABAAQAAAACABkAAAAAAAwAAAACABgAAAAAAAQAAAACABYAAAAAAAQAAAACABcAAAAAAAQAAAACABUAAAAAAAQAAAACABQAAAAAAAQAAAACABIAAAAAAAQAAAACABMAAAAAAAQAAAACABEAAAAAAAQAAAACABAAAAAAAAQAAAACAA8AAAAAAAQAAAACAA4AAAAAAAQAAAADAA4AAAABAAEAAAADAA8AAAABAAEAAAAEAA4AAAABAAEAAAAEAA8AAAABAAEAAAAFAA4AAAABAAEAAAAFAA8AAAABAAEAAAAGAA4AAAABAAEAAAAGAA8AAAABAAEAAAAHAA4AAAABAAEAAAAHAA8AAAABAAEAAAAIAA4AAAABAAEAAAAIAA8AAAABAAEAAAAJAA4AAAABAAEAAAAJAA8AAAABAAEAAAAKAA4AAAABAAEAAAAKAA8AAAABAAEAAAALAA4AAAABAAEAAAALAA8AAAABAAEAAAA=") -tile_set = ExtResource("4_pfafs") -metadata/_edit_lock_ = true - -[node name="Props" type="TileMapLayer" parent="Tilemaps"] -tile_set = ExtResource("4_pfafs") -metadata/_edit_lock_ = true - -[node name="Actors" type="Node2D" parent="Tilemaps"] -metadata/_edit_lock_ = true - -[node name="FSMEnemy" type="CharacterBody2D" parent="Tilemaps/Actors"] -position = Vector2(161.783, 298.229) -script = ExtResource("6_68lig") -metadata/_edit_group_ = true - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Tilemaps/Actors/FSMEnemy"] -shape = SubResource("CircleShape2D_5xgmc") - -[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Tilemaps/Actors/FSMEnemy"] -sprite_frames = ExtResource("7_83bvc") -animation = &"down" - -[node name="Idle" type="Node2D" parent="Tilemaps/Actors/FSMEnemy"] +script = ExtResource("4_jtlua") +Rooms = Array[Object]([ExtResource("5_gwtv6")]) [node name="CameraController" type="Camera2D" parent="."] process_mode = 1 @@ -86,11 +53,11 @@ script = ExtResource("9_vhvs2") [node name="HUD" parent="." instance=ExtResource("10_6gk3e")] [node name="CameraTarget" type="Node2D" parent="."] -position = Vector2(115, 328) +position = Vector2(154, 103) script = ExtResource("11_4gy5m") [node name="PlayerStartPosition" type="Marker2D" parent="."] -position = Vector2(111, 305) +position = Vector2(150, 80) [node name="AlarmManager" type="Node2D" parent="."] process_mode = 1 @@ -99,3 +66,8 @@ script = ExtResource("12_eoca5") [node name="AudioStreamPlayer2D" parent="." instance=ExtResource("13_4n7t6")] process_mode = 3 autoplay = true + +[node name="NavigationRegion2D" type="NavigationRegion2D" parent="."] +navigation_polygon = SubResource("NavigationPolygon_jtlua") + +[connection signal="ManagerReady" from="." to="Maps" method="SpawnRoomsGrid"] diff --git a/Scenes/Maps/RogueliteMaps/Rg1.tscn b/Scenes/Maps/RogueliteMaps/Rg1.tscn new file mode 100644 index 00000000..824ba42f --- /dev/null +++ b/Scenes/Maps/RogueliteMaps/Rg1.tscn @@ -0,0 +1,44 @@ +[gd_scene load_steps=7 format=4 uid="uid://da7hmajaaiohm"] + +[ext_resource type="Script" uid="uid://b2j00riayxkit" path="res://Scripts/Controllers/RogueliteRoom.cs" id="1_dm6kf"] +[ext_resource type="Resource" uid="uid://b5x83li01qrav" path="res://Resources/RogueliteMaps/TestRGMap.tres" id="2_5s4nm"] +[ext_resource type="PackedScene" uid="uid://clieeuln36a7a" path="res://Scenes/Actors/Fairy_FSM.tscn" id="5_b5lqw"] +[ext_resource type="TileSet" uid="uid://6k28roiljylj" path="res://Tilesets/factory_tileset.tres" id="5_q5p8k"] +[ext_resource type="Script" uid="uid://krean0uywtms" path="res://Scripts/TilemapAvoidance.cs" id="6_81nvh"] +[ext_resource type="PackedScene" uid="uid://bb32f4p5e671j" path="res://Scenes/Actors/Fairy_Guard_FSM.tscn" id="6_rlq0q"] + +[node name="Tilemaps" type="Node2D"] +process_mode = 1 +script = ExtResource("1_dm6kf") +RoomResource = ExtResource("2_5s4nm") + +[node name="Floor" type="TileMapLayer" parent="." node_paths=PackedStringArray("_solidLayers") groups=["Solid"]] +tile_map_data = PackedByteArray("AAAAAAIAAAAEAAIAAAAAAAMAAAAEAAIAAAAAAAQAAAAEAAIAAAAAAAUAAAAEAAIAAAAAAAYAAAAEAAIAAAAAAAcAAAAEAAIAAAAAAAgAAAAEAAIAAAAAAAkAAAAEAAIAAAABAAIAAAAEAAIAAAABAAMAAAAEAAIAAAABAAQAAAAEAAIAAAABAAUAAAAEAAIAAAABAAYAAAAEAAIAAAABAAcAAAAEAAIAAAABAAgAAAAEAAIAAAABAAkAAAAEAAIAAAACAAIAAAAEAAIAAAACAAMAAAAEAAIAAAACAAQAAAAEAAIAAAACAAUAAAAEAAIAAAACAAYAAAAEAAIAAAACAAcAAAAEAAIAAAACAAgAAAAEAAIAAAACAAkAAAAEAAIAAAADAAIAAAAEAAIAAAADAAMAAAAEAAIAAAADAAQAAAAEAAIAAAADAAUAAAAEAAIAAAADAAYAAAAEAAIAAAADAAcAAAAEAAIAAAADAAgAAAAEAAIAAAADAAkAAAAEAAIAAAAEAAIAAAAEAAIAAAAEAAMAAAAEAAIAAAAEAAQAAAAEAAIAAAAEAAUAAAAEAAIAAAAEAAYAAAAEAAIAAAAEAAcAAAAEAAIAAAAEAAgAAAAEAAIAAAAEAAkAAAAEAAIAAAAFAAIAAAAEAAIAAAAFAAMAAAAEAAIAAAAFAAQAAAAEAAIAAAAFAAUAAAAEAAIAAAAFAAYAAAAEAAIAAAAFAAcAAAAEAAIAAAAFAAgAAAAEAAIAAAAFAAkAAAAEAAIAAAAGAAIAAAAEAAIAAAAGAAMAAAAEAAIAAAAGAAQAAAAEAAIAAAAGAAUAAAAEAAIAAAAGAAYAAAAEAAIAAAAGAAcAAAAEAAIAAAAGAAgAAAAEAAIAAAAGAAkAAAAEAAIAAAAHAAIAAAAEAAIAAAAHAAMAAAAEAAIAAAAHAAQAAAAEAAIAAAAHAAUAAAAEAAIAAAAHAAYAAAAEAAIAAAAHAAcAAAAEAAIAAAAHAAgAAAAEAAIAAAAHAAkAAAAEAAIAAAAIAAIAAAAEAAIAAAAIAAMAAAAEAAIAAAAIAAQAAAAEAAIAAAAIAAUAAAAEAAIAAAAIAAYAAAAEAAIAAAAIAAcAAAAEAAIAAAAIAAgAAAAEAAIAAAAIAAkAAAAEAAIAAAAJAAIAAAAEAAIAAAAJAAMAAAAEAAIAAAAJAAQAAAAEAAIAAAAJAAUAAAAEAAIAAAAJAAYAAAAEAAIAAAAJAAcAAAAEAAIAAAAJAAgAAAAEAAIAAAAJAAkAAAAEAAIAAAAKAAIAAAAEAAIAAAAKAAMAAAAEAAIAAAAKAAQAAAAEAAIAAAAKAAUAAAAEAAIAAAAKAAYAAAAEAAIAAAAKAAcAAAAEAAIAAAAKAAgAAAAEAAIAAAAKAAkAAAAEAAIAAAALAAIAAAAEAAIAAAALAAUAAAAEAAIAAAALAAYAAAAEAAIAAAALAAcAAAAEAAIAAAALAAgAAAAEAAIAAAALAAkAAAAEAAIAAAAMAAIAAAAEAAIAAAAMAAUAAAAEAAIAAAAMAAYAAAAEAAIAAAAMAAcAAAAEAAIAAAAMAAgAAAAEAAIAAAAMAAkAAAAEAAIAAAANAAIAAAAEAAIAAAANAAMAAAAEAAIAAAANAAQAAAAEAAIAAAANAAUAAAAEAAIAAAANAAYAAAAEAAIAAAANAAcAAAAEAAIAAAANAAgAAAAEAAIAAAANAAkAAAAEAAIAAAAOAAIAAAAEAAIAAAAOAAMAAAAEAAIAAAAOAAQAAAAEAAIAAAAOAAUAAAAEAAIAAAAOAAYAAAAEAAIAAAAOAAcAAAAEAAIAAAAOAAgAAAAEAAIAAAAOAAkAAAAEAAIAAAAPAAIAAAAEAAIAAAAPAAMAAAAEAAIAAAAPAAQAAAAEAAIAAAAPAAUAAAAEAAIAAAAPAAYAAAAEAAIAAAAPAAcAAAAEAAIAAAAPAAgAAAAEAAIAAAAPAAkAAAAEAAIAAAAQAAIAAAAEAAIAAAAQAAMAAAAEAAIAAAAQAAQAAAAEAAIAAAAQAAUAAAAEAAIAAAAQAAYAAAAEAAIAAAAQAAcAAAAEAAIAAAAQAAgAAAAEAAIAAAAQAAkAAAAEAAIAAAARAAIAAAAEAAIAAAARAAMAAAAEAAIAAAARAAQAAAAEAAIAAAARAAUAAAAEAAIAAAARAAYAAAAEAAIAAAARAAcAAAAEAAIAAAARAAgAAAAEAAIAAAARAAkAAAAEAAIAAAASAAIAAAAEAAIAAAASAAMAAAAEAAIAAAASAAQAAAAEAAIAAAASAAUAAAAEAAIAAAASAAYAAAAEAAIAAAASAAcAAAAEAAIAAAASAAgAAAAEAAIAAAASAAkAAAAEAAIAAAATAAIAAAAEAAIAAAATAAMAAAAEAAIAAAATAAQAAAAEAAIAAAATAAUAAAAEAAIAAAATAAYAAAAEAAIAAAATAAcAAAAEAAIAAAATAAgAAAAEAAIAAAATAAkAAAAEAAIAAAAAAAAAAAAEAAIAAAAAAAEAAAAEAAIAAAABAAAAAAAEAAIAAAABAAEAAAAEAAIAAAACAAAAAAAEAAIAAAACAAEAAAAEAAIAAAADAAAAAAAEAAIAAAADAAEAAAAEAAIAAAAEAAAAAAAEAAIAAAAEAAEAAAAEAAIAAAAFAAAAAAAEAAIAAAAFAAEAAAAEAAIAAAAGAAAAAAAEAAIAAAAGAAEAAAAEAAIAAAAHAAAAAAAEAAIAAAAHAAEAAAAEAAIAAAAIAAAAAAAEAAIAAAAIAAEAAAAEAAIAAAAJAAAAAAAEAAIAAAAJAAEAAAAEAAIAAAAKAAAAAAAEAAIAAAAKAAEAAAAEAAIAAAALAAAAAAAEAAIAAAALAAEAAAAEAAIAAAALAAMAAAAEAAIAAAALAAQAAAAEAAIAAAAMAAAAAAAEAAIAAAAMAAEAAAAEAAIAAAAMAAMAAAAEAAIAAAAMAAQAAAAEAAIAAAANAAAAAAAEAAIAAAANAAEAAAAEAAIAAAAOAAAAAAAEAAIAAAAOAAEAAAAEAAIAAAAPAAAAAAAEAAIAAAAPAAEAAAAEAAIAAAAQAAAAAAAEAAIAAAAQAAEAAAAEAAIAAAARAAAAAAAEAAIAAAARAAEAAAAEAAIAAAASAAAAAAAEAAIAAAASAAEAAAAEAAIAAAATAAAAAAAEAAIAAAATAAEAAAAEAAIAAAA=") +tile_set = ExtResource("5_q5p8k") +navigation_enabled = false +script = ExtResource("6_81nvh") +_solidLayers = [NodePath("../Solid"), NodePath("../Props")] +metadata/_edit_lock_ = true + +[node name="Solid" type="TileMapLayer" parent="." groups=["Solid"]] +tile_map_data = PackedByteArray("AAATAAAAAAABAAsAAAASAAAAAAABAAQAAAARAAAAAAABAAQAAAAQAAAAAAABAAQAAAAPAAAAAAABAAQAAAAOAAAAAAABAAQAAAANAAAAAAABAAQAAAAMAAAAAAABAAQAAAALAAAAAAACAAQAAAAIAAAAAAADAAQAAAAHAAAAAAABAAQAAAAGAAAAAAABAAQAAAAFAAAAAAABAAQAAAAEAAAAAAABAAQAAAADAAAAAAABAAQAAAACAAAAAAABAAQAAAABAAAAAAABAAQAAAAAAAAAAAAAAAsAAAATAAIAAAAEAAQAAAATAAEAAAAAAAQAAAAAAAIAAAAEAAQAAAAAAAEAAAAAAAQAAAAAAAkAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAcAAAAAAAQAAAAAAAYAAAAFAAQAAAATAAkAAAABAAwAAAASAAkAAAABAAQAAAARAAkAAAABAAQAAAAQAAkAAAABAAQAAAAPAAkAAAABAAQAAAAOAAkAAAABAAQAAAANAAkAAAABAAQAAAAMAAkAAAABAAQAAAALAAkAAAACAAQAAAAIAAkAAAADAAQAAAAHAAkAAAABAAQAAAAGAAkAAAABAAQAAAAFAAkAAAABAAQAAAAEAAkAAAABAAQAAAADAAkAAAABAAQAAAACAAkAAAABAAQAAAABAAkAAAABAAQAAAATAAgAAAAAAAQAAAATAAcAAAAAAAQAAAATAAYAAAAFAAQAAAATAAMAAAAKAAgAAAATAAQAAAAKAAkAAAALAAEAAAAKAAgAAAALAAIAAAAKAAkAAAAMAAEAAAAKAAgAAAAMAAIAAAAKAAkAAAANAAEAAAAKAAgAAAANAAIAAAAKAAkAAAAOAAEAAAAKAAgAAAAOAAIAAAAKAAkAAAAPAAEAAAAKAAgAAAAPAAIAAAAKAAkAAAAQAAEAAAAKAAgAAAAQAAIAAAAKAAkAAAARAAEAAAAKAAgAAAARAAIAAAAKAAkAAAASAAEAAAAKAAgAAAASAAIAAAAKAAkAAAABAAEAAAAKAAgAAAABAAIAAAAKAAkAAAACAAEAAAAKAAgAAAACAAIAAAAKAAkAAAADAAEAAAAKAAgAAAADAAIAAAAKAAkAAAAEAAEAAAAKAAgAAAAEAAIAAAAKAAkAAAAFAAEAAAAKAAgAAAAFAAIAAAAKAAkAAAAGAAEAAAAKAAgAAAAGAAIAAAAKAAkAAAAHAAEAAAAKAAgAAAAHAAIAAAAKAAkAAAAIAAEAAAAKAAgAAAAIAAIAAAAKAAkAAAAAAAMAAAAKAAgAAAAAAAQAAAAKAAkAAAA=") +tile_set = ExtResource("5_q5p8k") +navigation_enabled = false +metadata/_edit_lock_ = true + +[node name="Props" type="TileMapLayer" parent="." groups=["Solid"]] +tile_set = ExtResource("5_q5p8k") +navigation_enabled = false +metadata/_edit_lock_ = true + +[node name="Actors" type="Node2D" parent="."] +metadata/_edit_lock_ = true + +[node name="FairyFsm" parent="." instance=ExtResource("5_b5lqw")] +position = Vector2(68, 74) + +[node name="FairyFsm2" parent="." instance=ExtResource("5_b5lqw")] +position = Vector2(245, 105) + +[node name="FairyGuardFsm" parent="." instance=ExtResource("6_rlq0q")] +position = Vector2(186, 65) diff --git a/Scripts/Controllers/RogueliteRoom.cs b/Scripts/Controllers/RogueliteRoom.cs new file mode 100644 index 00000000..18d39bb5 --- /dev/null +++ b/Scripts/Controllers/RogueliteRoom.cs @@ -0,0 +1,9 @@ +using Cirno.Scripts.Resources.Roguelite; +using Godot; + +namespace Cirno.Scripts.Controllers; + +public partial class RogueliteRoom : Node2D +{ + [Export] public RogueliteRoomResource RoomResource { get; set; } +} \ No newline at end of file diff --git a/Scripts/Controllers/RogueliteRoom.cs.uid b/Scripts/Controllers/RogueliteRoom.cs.uid new file mode 100644 index 00000000..7ec6d442 --- /dev/null +++ b/Scripts/Controllers/RogueliteRoom.cs.uid @@ -0,0 +1 @@ +uid://b2j00riayxkit diff --git a/Scripts/Controllers/RogueliteRoomManager.cs b/Scripts/Controllers/RogueliteRoomManager.cs new file mode 100644 index 00000000..82a59d5f --- /dev/null +++ b/Scripts/Controllers/RogueliteRoomManager.cs @@ -0,0 +1,50 @@ +using System.Linq; +using Cirno.Scripts.Resources.Roguelite; +using Godot; +using Godot.Collections; + +namespace Cirno.Scripts.Controllers; + +public partial class RogueliteRoomManager : Node2D +{ + [Export] public Array Rooms { get; set; } + + [Export] public Node2D SceneContainer { get; set; } + + public override void _Ready() + { + // Spawn first room + + } + + private void SpawnRoomsGrid() + { + var firstRoom = Rooms.FirstOrDefault(); + + var origin = Vector2.Zero; + var tileSize = new Vector2(16, 16); + + for (int i = 0; i < 10; i++) + { + for (int j = 0; j < 10; j++) + { + SpawnRoom(firstRoom, origin + (firstRoom.Size * new Vector2(i, j) * tileSize)); + } + } + + CallDeferred(MethodName.RebakeNavigationDeferred); + + } + + private void RebakeNavigationDeferred() + { + GameManager.Instance.RebakeNavigation(); + } + + private void SpawnRoom(RogueliteRoomResource room, Vector2 position) + { + var roomScene = GD.Load(room.ScenePath); + + var spawnedScene = this.CreateChild(roomScene, position); + } +} \ No newline at end of file diff --git a/Scripts/Controllers/RogueliteRoomManager.cs.uid b/Scripts/Controllers/RogueliteRoomManager.cs.uid new file mode 100644 index 00000000..4115e861 --- /dev/null +++ b/Scripts/Controllers/RogueliteRoomManager.cs.uid @@ -0,0 +1 @@ +uid://bt2qjgnf1wc2r diff --git a/Scripts/Enums/GameMode.cs b/Scripts/Enums/GameMode.cs new file mode 100644 index 00000000..553c6adb --- /dev/null +++ b/Scripts/Enums/GameMode.cs @@ -0,0 +1,9 @@ +namespace Cirno.Scripts.Enums; + +public enum GameMode +{ + Game, + Roguelite, + BossRush, + SpellCard +} \ No newline at end of file diff --git a/Scripts/GameManager.cs b/Scripts/GameManager.cs index 2087c82c..c0cf6db9 100644 --- a/Scripts/GameManager.cs +++ b/Scripts/GameManager.cs @@ -66,6 +66,8 @@ public partial class GameManager : Node2D [Export] public NavigationRegion2D NavigationRegion { get; private set; } + [Signal] public delegate void ManagerReadyEventHandler(); + // Called when the node enters the scene tree for the first time. public override void _Ready() { @@ -116,8 +118,15 @@ public partial class GameManager : Node2D //_ = DelayPlayerSpawn(); CallDeferred(MethodName.DelayPlayerSpawn); + + CallDeferred(MethodName.OnFinished); } + private void OnFinished() + { + EmitSignalManagerReady(); + } + private void OnPlayerRespawned() { this.ClearBullets(); diff --git a/Scripts/GlobalState.cs b/Scripts/GlobalState.cs index 91e88353..9882ed72 100644 --- a/Scripts/GlobalState.cs +++ b/Scripts/GlobalState.cs @@ -39,14 +39,14 @@ public partial class GlobalState : Node this.ProcessMode = ProcessModeEnum.Always; _mapsDatabase = ResourceLoader.Load(_mapsDatabaseResource); - + Viewport root = GetTree().Root; // Using a negative index counts from the end, so this gets the last child node of `root`. CurrentScene = root.GetChild(-1); _fader = CreateFader(); - - _menuMouseTexture =ResourceLoader.Load(_menuMouseTexturePath); + + _menuMouseTexture = ResourceLoader.Load(_menuMouseTexturePath); _menuMouseImage = _menuMouseTexture.GetImage(); GetTree().GetRoot().SizeChanged += OnSizeChanged; @@ -65,7 +65,7 @@ public partial class GlobalState : Node var root = GetTree().GetRoot(); var baseSize = root.ContentScaleSize; var newSize = root.Size; - + int scaleX = newSize.X / baseSize.X; int scaleY = newSize.Y / baseSize.Y; int scale = Math.Min(scaleX, scaleY); // Ensure pixel-perfect scaling @@ -83,31 +83,25 @@ public partial class GlobalState : Node // The solution is to defer the load to a later time, when // we can be sure that no code from the current scene is running: - + //CallDeferred(MethodName.DeferredGotoScene, path, new MapStartDataResource()); - + GoToScene(path, new MapStartDataResource()); } public void GoToScene(string path, MapStartDataResource startData) { GTweenSequenceBuilder.New() - .AppendCallback(() => - { - _loadingPlaque?.Show(); - }) + .AppendCallback(() => { _loadingPlaque?.Show(); }) //.Append(_fader.TweenModulateAlpha(0, 0f)) .Append(_fader.TweenModulateAlpha(1, 0.5f)) - .AppendCallback(() => - { - CallDeferred(MethodName.DeferredGotoScene, path, startData); - }) + .AppendCallback(() => { CallDeferred(MethodName.DeferredGotoScene, path, startData); }) .Build() .PlayUnpausable(); - + //CallDeferred(MethodName.DeferredGotoScene, path, startData); } - + public void GotoScene(MapResource map) { this.SessionSettings.LevelNumber = map.LevelId; @@ -122,22 +116,22 @@ public partial class GlobalState : Node //var sceneParent = CurrentScene.GetParent(); //sceneParent.RemoveChild(CurrentScene); //sceneParent.QueueFree(); - + // Load a new scene. var nextScene = GD.Load(path); - + // Instance the new scene. CurrentScene = nextScene.Instantiate(); // Add it to the active scene, as child of root. GetTree().Root.AddChild(CurrentScene); - + // Optionally, to make it compatible with the SceneTree.change_scene_to_file() API. GetTree().CurrentScene = CurrentScene; - + // // Update current scene here too // CurrentScene = GetTree().Root.GetChild(-1); - + if (startData is not null && GameManager.Instance is not null) { // Call deferred if it gives issues @@ -148,7 +142,7 @@ public partial class GlobalState : Node // if (GameManager.Instance is not null) { // GameManager.Instance.ApplySessionState(SessionSettings); // } - + FadeIn(); } @@ -162,9 +156,8 @@ public partial class GlobalState : Node _plaqueTemplate = GD.Load("res://Scenes/HUD/LoadingPlaque.tscn"); return _plaqueTemplate.Instantiate(); - } - + private ColorRect CreateFader() { var canvas = new CanvasLayer(); @@ -176,19 +169,19 @@ public partial class GlobalState : Node rect.SetAnchorsPreset(Control.LayoutPreset.FullRect); rect.Color = new Color(Colors.Black, 1f); rect.ProcessMode = ProcessModeEnum.Always; - - rect.Modulate = new Color(0,0,0,0); + + rect.Modulate = new Color(0, 0, 0, 0); rect.MouseFilter = Control.MouseFilterEnum.Ignore; canvas.CallDeferred("add_child", rect); - + this.CallDeferred("add_child", canvas); - + _loadingPlaque = LoadPlaque(); canvas.CallDeferred("add_child", _loadingPlaque); _loadingPlaque.Hide(); - + return rect; } @@ -205,18 +198,18 @@ public partial class GlobalState : Node } private readonly string SaveNameFile = "user://savegame.save"; - + public void SaveGame() { var items = InventoryManager.Instance.Save(); - + SessionSettings.Items = items; - + var serializedSavedata = new Godot.Collections.Dictionary() { { "Items", items }, { "Level", SessionSettings.LevelNumber }, - { "Difficulty", (int)SessionSettings.Difficulty} + { "Difficulty", (int)SessionSettings.Difficulty } }; var saveFile = FileAccess.Open(SaveNameFile, FileAccess.ModeFlags.Write); @@ -224,16 +217,17 @@ public partial class GlobalState : Node var jsonString = Json.Stringify(serializedSavedata); saveFile.StoreLine(jsonString); - + GD.Print("Saved data successfully"); } - + public bool LoadGame() { if (!FileAccess.FileExists(SaveNameFile)) { return false; // Error! We don't have a save to load. } + using var saveFile = FileAccess.Open(SaveNameFile, FileAccess.ModeFlags.Read); var jsonString = saveFile.GetLine(); @@ -245,13 +239,13 @@ public partial class GlobalState : Node GD.Print($"JSON Parse Error: {json.GetErrorMessage()} in {jsonString} at line {json.GetErrorLine()}"); return false; } - + var deserializedSaveData = new Dictionary((Dictionary)json.Data); Dictionary items = (Dictionary)deserializedSaveData["Items"]; DifficultyLevel difficulty = (DifficultyLevel)deserializedSaveData["Difficulty"].AsInt32(); - + int levelNumber = (int)deserializedSaveData["Level"]; var levelData = _mapsDatabase.Maps.FirstOrDefault(x => x.LevelId == levelNumber); @@ -259,25 +253,25 @@ public partial class GlobalState : Node { return false; } - + this.SessionSettings.NewSession(); SessionSettings.LevelNumber = levelNumber; SessionSettings.Items = items; SessionSettings.Difficulty = difficulty; - + this.GotoScene(levelData); - + return true; } - + public void ResizeCursor(float scale) { var scaled = (Image)_menuMouseImage.Duplicate(); var size = (Vector2I)(scale * _menuMouseTexture.GetSize()); - + scaled.Resize(size.X, size.Y, Image.Interpolation.Nearest); - + DisplayServer.CursorSetCustomImage(scaled); } @@ -285,6 +279,4 @@ public partial class GlobalState : Node { GotoScene(CurrentScene.GetSceneFilePath()); } - - } \ No newline at end of file diff --git a/Scripts/MainMenu.cs b/Scripts/MainMenu.cs index 68ac5822..668f97d7 100644 --- a/Scripts/MainMenu.cs +++ b/Scripts/MainMenu.cs @@ -1,5 +1,6 @@ using Godot; using System; +using Cirno.Scripts.Enums; using Cirno.Scripts.UI; using Godot.Collections; @@ -55,8 +56,6 @@ public partial class MainMenu : CanvasLayer private void _on_start_button_pressed() { SpawnMenu(DifficultyMenuTemplate, SubMenuHolder); - - return; //GetTree().ChangeSceneToFile(GameScene); } @@ -66,6 +65,7 @@ public partial class MainMenu : CanvasLayer if (GameScene == null) return; if (GlobalState.Instance.LoadGame()) { + GlobalState.Session.GameMode = GameMode.Game; GlobalState.Session.AllowSaving = true; } } diff --git a/Scripts/Resources/Roguelite/RogueliteRoom.cs.uid b/Scripts/Resources/Roguelite/RogueliteRoom.cs.uid new file mode 100644 index 00000000..d4177e29 --- /dev/null +++ b/Scripts/Resources/Roguelite/RogueliteRoom.cs.uid @@ -0,0 +1 @@ +uid://d1w6r3yfmw8ag diff --git a/Scripts/Resources/Roguelite/RogueliteRoomResource.cs b/Scripts/Resources/Roguelite/RogueliteRoomResource.cs new file mode 100644 index 00000000..c4fadd3f --- /dev/null +++ b/Scripts/Resources/Roguelite/RogueliteRoomResource.cs @@ -0,0 +1,11 @@ +using Godot; + +namespace Cirno.Scripts.Resources.Roguelite; + +[GlobalClass] +public partial class RogueliteRoomResource : Resource +{ + [Export] public StringName RoomName { get; set; } + [Export] public StringName ScenePath { get; set; } + [Export] public Vector2 Size { get; set; } = new(20, 10); +} \ No newline at end of file diff --git a/Scripts/Resources/Roguelite/RogueliteRoomResource.cs.uid b/Scripts/Resources/Roguelite/RogueliteRoomResource.cs.uid new file mode 100644 index 00000000..dd089d28 --- /dev/null +++ b/Scripts/Resources/Roguelite/RogueliteRoomResource.cs.uid @@ -0,0 +1 @@ +uid://bl2ne8w12e3a diff --git a/Scripts/UI/DifficultyMenu.cs b/Scripts/UI/DifficultyMenu.cs index d8f54668..33cb302c 100644 --- a/Scripts/UI/DifficultyMenu.cs +++ b/Scripts/UI/DifficultyMenu.cs @@ -34,6 +34,7 @@ public partial class DifficultyMenu : MenuBase GlobalState.Session.NewSession(); GlobalState.Session.AllowSaving = true; GlobalState.Session.Difficulty = difficultyLevel; + GlobalState.Session.GameMode = GameMode.Game; GlobalState.Instance.GotoScene(StartMap); } } \ No newline at end of file diff --git a/Scripts/Utils/SessionSettings.cs b/Scripts/Utils/SessionSettings.cs index 7786721c..585a50f5 100644 --- a/Scripts/Utils/SessionSettings.cs +++ b/Scripts/Utils/SessionSettings.cs @@ -6,6 +6,7 @@ namespace Cirno.Scripts.Utils; public class SessionSettings { + public GameMode GameMode { get; set; } = GameMode.Game; public bool SkipDialogues { get; set; } = false; public bool GodMode { get; set; } = false;