diff --git a/Resources/Items/Generic_Keycard.tres b/Resources/Items/Generic_Keycard.tres new file mode 100644 index 00000000..a54d6b9c --- /dev/null +++ b/Resources/Items/Generic_Keycard.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="LootItem" load_steps=4 format=3 uid="uid://oa8s6xydriib"] + +[ext_resource type="Texture2D" uid="uid://liwkh6rv1m41" path="res://Sprites/Items/GrayKeycard_Small.png" id="1_2nnia"] +[ext_resource type="Script" uid="uid://epnwjptvks3t" path="res://Scripts/Resources/LootItem.cs" id="2_munhl"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_munhl"] +atlas = ExtResource("1_2nnia") +region = Rect2(0, 0, 16, 16) + +[resource] +script = ExtResource("2_munhl") +ItemName = &"Generic Keycard" +ShortName = null +ItemDescription = &"Activates Gray KeyPads" +ItemKey = &"GRAY_KEY" +Item = 1 +Amount = 1 +Max = 99 +PickupIfMaxed = false +ConsumeOnUse = true +UiType = 1 +Selectable = false +AutoPickup = false +InventorySprite = SubResource("AtlasTexture_munhl") +DropScenePath = &"res://Scenes/Items/Blue_Keycard.tscn" diff --git a/Resources/RogueliteMaps/Factory_Theme.tres b/Resources/RogueliteMaps/Factory_Theme.tres new file mode 100644 index 00000000..22931e5d --- /dev/null +++ b/Resources/RogueliteMaps/Factory_Theme.tres @@ -0,0 +1,39 @@ +[gd_resource type="Resource" script_class="RogueliteMapTheme" load_steps=27 format=3 uid="uid://cw6868vuvuynh"] + +[ext_resource type="Script" uid="uid://bwtif3if3ea0u" path="res://Scripts/Resources/RogueliteMapTheme.cs" id="1_2rtdw"] +[ext_resource type="PackedScene" uid="uid://db5dwj6nqo8fn" path="res://Scenes/Interactable/control_pad_gray_keycard.tscn" id="1_w43eq"] +[ext_resource type="PackedScene" uid="uid://l84on3kv2s52" path="res://Scenes/Door_Horizontal.tscn" id="2_y7x1u"] +[ext_resource type="PackedScene" uid="uid://bs6o3htusgyjl" path="res://Scenes/Door_Horizontal_Hidden.tscn" id="3_sdu6a"] +[ext_resource type="PackedScene" uid="uid://mtn26qwp4yqy" path="res://Scenes/Items/Gray_Keycard.tscn" id="4_qjf5s"] +[ext_resource type="PackedScene" uid="uid://bc64lr3vlwchq" path="res://Scenes/Door_Vertical.tscn" id="5_mt0fe"] +[ext_resource type="Resource" uid="uid://b5x83li01qrav" path="res://Resources/RogueliteMaps/TestRGMap.tres" id="5_sludw"] +[ext_resource type="Resource" uid="uid://ly8l7asedjpx" path="res://Resources/RogueliteMaps/TestRGMap2.tres" id="6_b3pjl"] +[ext_resource type="Resource" uid="uid://dn3ai56rrxfnk" path="res://Resources/RogueliteMaps/Beginner1.tres" id="7_nil27"] +[ext_resource type="Resource" uid="uid://cgac12krx7vbf" path="res://Resources/RogueliteMaps/Boss1.tres" id="8_pmfuo"] +[ext_resource type="Resource" uid="uid://bv0mr43vcfrdh" path="res://Resources/RogueliteMaps/BigMap.tres" id="9_0lwa1"] +[ext_resource type="Resource" uid="uid://ryfk7g1wqypk" path="res://Resources/RogueliteMaps/TestRGMapLong.tres" id="10_03ih2"] +[ext_resource type="Resource" uid="uid://cjtcksew0qy6d" path="res://Resources/RogueliteMaps/TestRGMapLarge.tres" id="11_modrh"] +[ext_resource type="Resource" uid="uid://cmgiqsmujujss" path="res://Resources/RogueliteMaps/TestMapLongX3.tres" id="12_exyjy"] +[ext_resource type="Resource" uid="uid://n6nb5yco60gi" path="res://Resources/RogueliteMaps/BigLarge.tres" id="13_2j670"] +[ext_resource type="Resource" uid="uid://do11fodskgasi" path="res://Resources/RogueliteMaps/RGTestRoom1.tres" id="14_rjphh"] +[ext_resource type="Resource" uid="uid://cur433g6oevmd" path="res://Resources/RogueliteMaps/RGLongAcidWalk.tres" id="15_2gg5d"] +[ext_resource type="Resource" uid="uid://cc53bb6th33hi" path="res://Resources/RogueliteMaps/RGHorizontal1x1.tres" id="16_402ix"] +[ext_resource type="Resource" uid="uid://bew4cuec4pbms" path="res://Resources/RogueliteMaps/KeyRoom1.tres" id="17_52l5g"] +[ext_resource type="Resource" uid="uid://cwtma7mxged8a" path="res://Resources/RogueliteMaps/ShopRoom1.tres" id="18_gh41q"] +[ext_resource type="Resource" uid="uid://crqgvauqarfaq" path="res://Resources/RogueliteMaps/TreasureRoom1.tres" id="19_bn1n6"] +[ext_resource type="Resource" uid="uid://bo4efv7rwowuh" path="res://Resources/RogueliteMaps/SecretRoom1.tres" id="20_0on7r"] +[ext_resource type="Resource" uid="uid://cb7gk278lmicd" path="res://Resources/RogueliteMaps/Lab2x1_1.tres" id="21_m2nxl"] +[ext_resource type="Resource" uid="uid://char0yv78vtty" path="res://Resources/RogueliteMaps/BigTest2.tres" id="22_ae3bb"] +[ext_resource type="Resource" uid="uid://bxvv82vno8ub1" path="res://Resources/RogueliteMaps/1x1_1.tres" id="23_p3lfl"] +[ext_resource type="Resource" uid="uid://d01146n5uo0gd" path="res://Resources/RogueliteMaps/1x2_1.tres" id="24_tsgja"] + +[resource] +script = ExtResource("1_2rtdw") +HorizontalDoorPrefab = ExtResource("2_y7x1u") +HorizontalWallPrefab = ExtResource("3_sdu6a") +VerticalDoorPrefab = ExtResource("5_mt0fe") +VerticalWallPrefab = ExtResource("5_mt0fe") +DoorLockPrefab = ExtResource("1_w43eq") +KeyCardPrefab = ExtResource("4_qjf5s") +Rooms = Array[Object]([ExtResource("5_sludw"), ExtResource("6_b3pjl"), ExtResource("7_nil27"), ExtResource("8_pmfuo"), ExtResource("9_0lwa1"), ExtResource("10_03ih2"), ExtResource("11_modrh"), ExtResource("12_exyjy"), ExtResource("13_2j670"), ExtResource("14_rjphh"), ExtResource("15_2gg5d"), ExtResource("16_402ix"), ExtResource("17_52l5g"), ExtResource("18_gh41q"), ExtResource("19_bn1n6"), ExtResource("20_0on7r"), ExtResource("23_p3lfl"), ExtResource("24_tsgja"), ExtResource("21_m2nxl"), ExtResource("22_ae3bb")]) +metadata/_custom_type_script = "uid://bwtif3if3ea0u" diff --git a/Scenes/Interactable/control_pad_gray_keycard.tscn b/Scenes/Interactable/control_pad_gray_keycard.tscn new file mode 100644 index 00000000..3ef61e06 --- /dev/null +++ b/Scenes/Interactable/control_pad_gray_keycard.tscn @@ -0,0 +1,52 @@ +[gd_scene load_steps=10 format=3 uid="uid://db5dwj6nqo8fn"] + +[ext_resource type="Script" uid="uid://6n7duf35c52l" path="res://Scripts/Interactables/RogueliteDoorLock.cs" id="1_jm4yx"] +[ext_resource type="Resource" uid="uid://oa8s6xydriib" path="res://Resources/Items/Generic_Keycard.tres" id="3_q2yjn"] +[ext_resource type="Texture2D" uid="uid://c1hcyxn2og2kq" path="res://Sprites/Actors/Key_Reader.png" id="4_bkia3"] +[ext_resource type="Texture2D" uid="uid://dsf7jj36mk0xp" path="res://Sprites/Actors/KeyReaderOverlay.png" id="5_smh4i"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_vvpve"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_1r0vh"] +atlas = ExtResource("4_bkia3") +region = Rect2(0, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vnkqd"] +atlas = ExtResource("4_bkia3") +region = Rect2(16, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_330vc"] +atlas = ExtResource("4_bkia3") +region = Rect2(32, 0, 16, 16) + +[sub_resource type="SpriteFrames" id="SpriteFrames_ck7ns"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_1r0vh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vnkqd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_330vc") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[node name="KeycardReaderBlue" type="Area2D" groups=["Interactable"]] +collision_layer = 4 +collision_mask = 2 +script = ExtResource("1_jm4yx") +Requirements = [ExtResource("3_q2yjn")] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_vvpve") + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] +sprite_frames = SubResource("SpriteFrames_ck7ns") + +[node name="Sprite2D" type="Sprite2D" parent="AnimatedSprite2D"] +texture = ExtResource("5_smh4i") diff --git a/Scenes/Items/Blue_Keycard.tscn b/Scenes/Items/Blue_Keycard.tscn index f529a0b0..9353e629 100644 --- a/Scenes/Items/Blue_Keycard.tscn +++ b/Scenes/Items/Blue_Keycard.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=8 format=3 uid="uid://d0yes7huiyisw"] +[gd_scene load_steps=7 format=3 uid="uid://d0yes7huiyisw"] [ext_resource type="PackedScene" uid="uid://dxs3ks2ucaxl4" path="res://Scenes/Items/Red_Keycard.tscn" id="1_8f4hq"] -[ext_resource type="Script" uid="uid://epnwjptvks3t" path="res://Scripts/Resources/LootItem.cs" id="2_as2n7"] [ext_resource type="Resource" uid="uid://cj5aa7btaw6q0" path="res://Resources/Items/Blue_Keycard.tres" id="2_woclw"] [ext_resource type="Texture2D" uid="uid://bvybqletsvqgk" path="res://Sprites/Items/BlueKeycard_Small.png" id="3_k20dr"] @@ -28,7 +27,7 @@ animations = [{ }] [node name="BlueKeycard" instance=ExtResource("1_8f4hq")] -LootTable = Array[ExtResource("2_as2n7")]([ExtResource("2_woclw")]) +LootTable = [ExtResource("2_woclw")] [node name="AnimatedSprite2D" parent="." index="1"] sprite_frames = SubResource("SpriteFrames_gbw5v") diff --git a/Scenes/Items/Gray_Keycard.tscn b/Scenes/Items/Gray_Keycard.tscn new file mode 100644 index 00000000..2f90f2e8 --- /dev/null +++ b/Scenes/Items/Gray_Keycard.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=7 format=3 uid="uid://mtn26qwp4yqy"] + +[ext_resource type="PackedScene" uid="uid://dxs3ks2ucaxl4" path="res://Scenes/Items/Red_Keycard.tscn" id="1_0bwjc"] +[ext_resource type="Resource" uid="uid://oa8s6xydriib" path="res://Resources/Items/Generic_Keycard.tres" id="3_0bwjc"] +[ext_resource type="Texture2D" uid="uid://bvybqletsvqgk" path="res://Sprites/Items/BlueKeycard_Small.png" id="4_7ohj7"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_kprwo"] +atlas = ExtResource("4_7ohj7") +region = Rect2(0, 0, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kems3"] +atlas = ExtResource("4_7ohj7") +region = Rect2(16, 0, 16, 16) + +[sub_resource type="SpriteFrames" id="SpriteFrames_gbw5v"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_kprwo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kems3") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[node name="GrayKeycard" instance=ExtResource("1_0bwjc")] +LootTable = [ExtResource("3_0bwjc")] + +[node name="AnimatedSprite2D" parent="." index="1"] +sprite_frames = SubResource("SpriteFrames_gbw5v") +frame = 0 +frame_progress = 0.0 diff --git a/Scenes/Maps/Roguelike.tscn b/Scenes/Maps/Roguelike.tscn index 2428a86c..bed87af1 100644 --- a/Scenes/Maps/Roguelike.tscn +++ b/Scenes/Maps/Roguelike.tscn @@ -1,36 +1,17 @@ -[gd_scene load_steps=32 format=3 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="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="Resource" uid="uid://ryfk7g1wqypk" path="res://Resources/RogueliteMaps/TestRGMapLong.tres" id="5_pfafs"] -[ext_resource type="Resource" uid="uid://ly8l7asedjpx" path="res://Resources/RogueliteMaps/TestRGMap2.tres" id="6_gwtv6"] -[ext_resource type="Resource" uid="uid://dn3ai56rrxfnk" path="res://Resources/RogueliteMaps/Beginner1.tres" id="7_wbqvu"] -[ext_resource type="Resource" uid="uid://cgac12krx7vbf" path="res://Resources/RogueliteMaps/Boss1.tres" id="8_3fyis"] [ext_resource type="Script" uid="uid://cfya7sndh7vy2" path="res://Scenes/CameraController.gd" id="8_y651a"] -[ext_resource type="Resource" uid="uid://bv0mr43vcfrdh" path="res://Resources/RogueliteMaps/BigMap.tres" id="9_go1yg"] [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"] [ext_resource type="Script" uid="uid://bdshph801ac2i" path="res://Scenes/CameraTarget.gd" id="11_4gy5m"] -[ext_resource type="Resource" uid="uid://cjtcksew0qy6d" path="res://Resources/RogueliteMaps/TestRGMapLarge.tres" id="11_68lig"] -[ext_resource type="Resource" uid="uid://cmgiqsmujujss" path="res://Resources/RogueliteMaps/TestMapLongX3.tres" id="12_83bvc"] [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"] -[ext_resource type="Resource" uid="uid://n6nb5yco60gi" path="res://Resources/RogueliteMaps/BigLarge.tres" id="13_y651a"] -[ext_resource type="Resource" uid="uid://do11fodskgasi" path="res://Resources/RogueliteMaps/RGTestRoom1.tres" id="14_vhvs2"] -[ext_resource type="Resource" uid="uid://cur433g6oevmd" path="res://Resources/RogueliteMaps/RGLongAcidWalk.tres" id="15_6gk3e"] -[ext_resource type="Resource" uid="uid://cc53bb6th33hi" path="res://Resources/RogueliteMaps/RGHorizontal1x1.tres" id="16_4gy5m"] [ext_resource type="Script" uid="uid://3v6q0p5krqn7" path="res://Scripts/UI/Minimap.cs" id="16_pfafs"] -[ext_resource type="Resource" uid="uid://bew4cuec4pbms" path="res://Resources/RogueliteMaps/KeyRoom1.tres" id="17_td7hx"] -[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"] -[ext_resource type="Resource" uid="uid://bxvv82vno8ub1" path="res://Resources/RogueliteMaps/1x1_1.tres" id="23_xrp0h"] -[ext_resource type="Resource" uid="uid://d01146n5uo0gd" path="res://Resources/RogueliteMaps/1x2_1.tres" id="24_e0fjr"] +[ext_resource type="Resource" uid="uid://cw6868vuvuynh" path="res://Resources/RogueliteMaps/Factory_Theme.tres" id="25_7gtqx"] [node name="GameScene" type="Node2D"] process_mode = 3 @@ -45,7 +26,7 @@ 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"), ExtResource("21_2lxq3"), ExtResource("22_6ahuq"), ExtResource("23_xrp0h"), ExtResource("24_e0fjr")]) +MapTheme = ExtResource("25_7gtqx") DungeonLength = 3 MaxBranchLength = 2 MaxKeys = 2 diff --git a/Scenes/Maps/RogueliteMaps/KeyRoom1.tscn b/Scenes/Maps/RogueliteMaps/KeyRoom1.tscn index a69e69f4..363d04f1 100644 --- a/Scenes/Maps/RogueliteMaps/KeyRoom1.tscn +++ b/Scenes/Maps/RogueliteMaps/KeyRoom1.tscn @@ -1,11 +1,9 @@ -[gd_scene load_steps=10 format=4 uid="uid://cadjkf73yep12"] +[gd_scene load_steps=8 format=4 uid="uid://cadjkf73yep12"] [ext_resource type="Script" uid="uid://b2j00riayxkit" path="res://Scripts/Controllers/RogueliteRoom.cs" id="1_3j8r8"] [ext_resource type="Resource" uid="uid://bew4cuec4pbms" path="res://Resources/RogueliteMaps/KeyRoom1.tres" id="2_3j8r8"] -[ext_resource type="PackedScene" uid="uid://l84on3kv2s52" path="res://Scenes/Door_Horizontal.tscn" id="3_t6hxp"] -[ext_resource type="PackedScene" uid="uid://bc64lr3vlwchq" path="res://Scenes/Door_Vertical.tscn" id="4_3j8r8"] -[ext_resource type="PackedScene" uid="uid://b0k2grrc8xp1l" path="res://Scenes/Props/BigTank.tscn" id="4_hfso4"] [ext_resource type="TileSet" uid="uid://6k28roiljylj" path="res://Tilesets/factory_tileset.tres" id="5_3o7os"] +[ext_resource type="PackedScene" uid="uid://mtn26qwp4yqy" path="res://Scenes/Items/Gray_Keycard.tscn" id="5_7qdwd"] [ext_resource type="Script" uid="uid://krean0uywtms" path="res://Scripts/TilemapAvoidance.cs" id="6_sn1r1"] [sub_resource type="NavigationPolygon" id="NavigationPolygon_rlq0q"] @@ -22,9 +20,6 @@ size = Vector2(272, 85) process_mode = 1 script = ExtResource("1_3j8r8") RoomResource = ExtResource("2_3j8r8") -DoorPrefab = ExtResource("3_t6hxp") -VerticalDoorPrefab = ExtResource("4_3j8r8") -WallPrefab = ExtResource("4_hfso4") [node name="Tilemaps" type="Node2D" parent="." groups=["navigation_polygon_source_geometry_group"]] @@ -50,6 +45,9 @@ metadata/_edit_lock_ = true [node name="Actors" type="Node2D" parent="Tilemaps"] metadata/_edit_lock_ = true +[node name="GrayKeycard" parent="Tilemaps/Actors" instance=ExtResource("5_7qdwd")] +position = Vector2(159, 93) + [node name="EnemySpawners" type="Node2D" parent="."] [node name="NavigationRegion2D" type="NavigationRegion2D" parent="."] diff --git a/Scripts/Components/Actors/ActivationProvider.cs b/Scripts/Components/Actors/ActivationProvider.cs index 6609c362..3ba087e0 100644 --- a/Scripts/Components/Actors/ActivationProvider.cs +++ b/Scripts/Components/Actors/ActivationProvider.cs @@ -64,7 +64,7 @@ public partial class ActivationProvider : Area2D _errorSound?.Play(); return true; }; - bool success = selected.Activate(); + bool success = selected.Activate(ActivationType.Use); if (success) { diff --git a/Scripts/Controllers/RogueliteRoom.cs b/Scripts/Controllers/RogueliteRoom.cs index edadc6ed..fc1dde4f 100644 --- a/Scripts/Controllers/RogueliteRoom.cs +++ b/Scripts/Controllers/RogueliteRoom.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using Cirno.Scripts.Components.FSM.Enemy; using Cirno.Scripts.Enums; +using Cirno.Scripts.Interactables; using Cirno.Scripts.Resources; using Cirno.Scripts.Resources.Roguelite; using Godot; @@ -14,6 +15,8 @@ namespace Cirno.Scripts.Controllers; public partial class RogueliteRoom : Node2D { [Export] public RogueliteRoomResource RoomResource { get; set; } + + public RogueliteMapTheme MapTheme { get; set; } public Vector2I GridPosition { get; set; } // Set by dungeon manager @@ -39,11 +42,6 @@ public partial class RogueliteRoom : Node2D }; } - [Export] public PackedScene DoorPrefab { get; private set; } - - [Export] public PackedScene VerticalDoorPrefab { get; private set; } - [Export] public PackedScene WallPrefab { get; private set; } - private static readonly Godot.Collections.Dictionary DirectionMap = new() { { "North", new Vector2I(0, -1) }, @@ -157,14 +155,16 @@ public partial class RogueliteRoom : Node2D var door = this.CreateChildOf(marker, marker.Direction switch { - DoorDirections.North => DoorPrefab, - DoorDirections.South => DoorPrefab, - DoorDirections.East => VerticalDoorPrefab, - DoorDirections.West => VerticalDoorPrefab, + DoorDirections.North => MapTheme.HorizontalDoorPrefab, + DoorDirections.South => MapTheme.HorizontalDoorPrefab, + DoorDirections.East => MapTheme.VerticalDoorPrefab, + DoorDirections.West => MapTheme.VerticalDoorPrefab, _ => throw new ArgumentOutOfRangeException() }, marker.GlobalPosition); - door.State = DoorState.Closed; + door.Close(); + + // door.State = DoorState.Closed; if (connected) { _doors.Add(door); @@ -172,6 +172,21 @@ public partial class RogueliteRoom : Node2D if (doorEdge == connection.From) { connection.FromDoor = door; + + // Spawn lock if locked + if (connection.IsLocked) + { + var doorLock = door.CreateChild(MapTheme.DoorLockPrefab); + + doorLock.Connection = connection; + + doorLock.ZIndex += 2; + + //doorLock.Targets.Add(door); + //doorLock.Targets.Add(connection.ToDoor); + doorLock.ActivationType = ActivationType.Open; + } + } else if (doorEdge == connection.To) { @@ -184,6 +199,9 @@ public partial class RogueliteRoom : Node2D } _connections.Add(connection); + + + } else { @@ -229,8 +247,14 @@ public partial class RogueliteRoom : Node2D { foreach (var connection in _connections) { - connection.FromDoor?.Open(); - connection.ToDoor?.Open(); + if(!connection.IsLocked) + { + connection.FromDoor?.Open(); + } + if(!connection.IsLocked) + { + connection.ToDoor?.Open(); + } } } @@ -238,8 +262,14 @@ public partial class RogueliteRoom : Node2D { foreach (var connection in _connections) { - connection.FromDoor?.Close(); - connection.ToDoor?.Close(); + if(!connection.IsLocked) + { + connection.FromDoor?.Close(); + } + if(!connection.IsLocked) + { + connection.ToDoor?.Close(); + } } } diff --git a/Scripts/Controllers/RogueliteRoomManager.cs b/Scripts/Controllers/RogueliteRoomManager.cs index 2c7b3ede..b1fa18d7 100644 --- a/Scripts/Controllers/RogueliteRoomManager.cs +++ b/Scripts/Controllers/RogueliteRoomManager.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using Cirno.Scripts.Enums; +using Cirno.Scripts.Resources; using Cirno.Scripts.Resources.Roguelite; using Cirno.Scripts.Utils; using Godot; @@ -12,9 +13,9 @@ namespace Cirno.Scripts.Controllers; public partial class RogueliteRoomManager : Node2D { - [Export] public Array Rooms { get; set; } - - [Export] public Node2D SceneContainer { get; set; } + //[Export] public Array Rooms { get; set; } + + [Export] public RogueliteMapTheme MapTheme { get; set; } //private Godot.Collections.Dictionary _grid = new(); private Godot.Collections.Dictionary _roomGrid = new(); @@ -69,8 +70,8 @@ public partial class RogueliteRoomManager : Node2D { for (int j = 0; j < 10; j++) { - var roomIndex = GD.RandRange(0, Rooms.Count - 1); - var room = Rooms[roomIndex]; + var roomIndex = GD.RandRange(0, MapTheme.Rooms.Count - 1); + var room = MapTheme.Rooms[roomIndex]; //SpawnRoom(room, origin + (room.Size * new Vector2(i, j) * tileSize)); } } @@ -78,15 +79,15 @@ public partial class RogueliteRoomManager : Node2D //CallDeferred(MethodName.RebakeNavigationDeferred); } - private IEnumerable StarterRooms => Rooms.Where(x => x.Type is RoomType.Starter); + private IEnumerable StarterRooms => MapTheme.Rooms.Where(x => x.Type is RoomType.Starter); - private IEnumerable RegularRooms => Rooms.Where(x => + private IEnumerable RegularRooms => MapTheme.Rooms.Where(x => x.Type is RoomType.Regular && x.HasDoors(DoorDirections.North | DoorDirections.South)); - private IEnumerable OffshootRooms => Rooms.Where(x => + private IEnumerable OffshootRooms => MapTheme.Rooms.Where(x => x.Type is RoomType.Regular && x.HasDoors(DoorDirections.East | DoorDirections.West)); - private IEnumerable BossRooms => Rooms.Where(x => x.Type is RoomType.Boss); + private IEnumerable BossRooms => MapTheme.Rooms.Where(x => x.Type is RoomType.Boss); private List _connections = new(); @@ -100,7 +101,7 @@ public partial class RogueliteRoomManager : Node2D } Vector2I origin = Vector2I.Zero; - var starterRoom = Rooms.Where(r => r.Type == RoomType.Starter).PickRandom(); + var starterRoom = MapTheme.Rooms.Where(r => r.Type == RoomType.Starter).PickRandom(); SpawnRoom(starterRoom, origin, out var spawnedBeginRoom); var randomRoomsList = RegularRooms.Shuffle(MaxRooms * 4).ToList(); @@ -372,7 +373,7 @@ public partial class RogueliteRoomManager : Node2D // Spawn final room // var finalRoomToSpawn = Rooms.Where(x => x.Type == offshootTypeToSpawn).PickRandom(); - var spawnedFinalRoom = TrySpawnRoom(Rooms.Where(x => x.Type == offshootTypeToSpawn).ToList(), + var spawnedFinalRoom = TrySpawnRoom(MapTheme.Rooms.Where(x => x.Type == offshootTypeToSpawn).ToList(), lastSpawnedOffshootRoom, direction); if (spawnedFinalRoom is null) @@ -406,6 +407,7 @@ public partial class RogueliteRoomManager : Node2D var roomScene = GD.Load(room.ScenePath); var spawnedScene = this.CreateChild(roomScene, position); + spawnedScene.MapTheme = MapTheme; spawnedScene.GridPosition = gridPos; spawnedScene.Name = room.RoomName.ToString().Replace(" ", "_"); diff --git a/Scripts/Door.cs b/Scripts/Door.cs index 180a563f..c26baf88 100644 --- a/Scripts/Door.cs +++ b/Scripts/Door.cs @@ -44,6 +44,7 @@ public partial class Door : Activable public virtual void Open() { + if (State == DoorState.Open) return; // _animatedSprite.Play("Opening"); State = DoorState.Open; CallDeferred(MethodName.DeferredDisableCollision, true); @@ -55,6 +56,7 @@ public partial class Door : Activable public virtual void Close() { + if (State == DoorState.Closed) return; // _animatedSprite.Play("Closing"); State = DoorState.Closed; CallDeferred(MethodName.DeferredDisableCollision, false); diff --git a/Scripts/Interactables/RogueliteDoorLock.cs b/Scripts/Interactables/RogueliteDoorLock.cs new file mode 100644 index 00000000..8f5710c7 --- /dev/null +++ b/Scripts/Interactables/RogueliteDoorLock.cs @@ -0,0 +1,24 @@ +using Cirno.Scripts.Controllers; + +namespace Cirno.Scripts.Interactables; + +public partial class RogueliteDoorLock : Switch +{ + public RoomConnection Connection { get; set; } + + public override bool Activate(ActivationType activationType = ActivationType.Toggle) + { + base.Activate(activationType); + + if (!MeetsRequirements()) return false; + + Connection.FromDoor.Activate(activationType); + Connection.ToDoor.Activate(activationType); + + InventoryManager.Instance.RemoveItem("GRAY_KEY", 1); + + this.QueueFree(); + + return true; + } +} \ No newline at end of file diff --git a/Scripts/Interactables/RogueliteDoorLock.cs.uid b/Scripts/Interactables/RogueliteDoorLock.cs.uid new file mode 100644 index 00000000..3b59ef8e --- /dev/null +++ b/Scripts/Interactables/RogueliteDoorLock.cs.uid @@ -0,0 +1 @@ +uid://6n7duf35c52l diff --git a/Scripts/Interactables/Switch.cs b/Scripts/Interactables/Switch.cs index 377c8f27..ca1ce164 100644 --- a/Scripts/Interactables/Switch.cs +++ b/Scripts/Interactables/Switch.cs @@ -25,15 +25,25 @@ public partial class Switch : Interactable public override bool Activate(ActivationType activationType = ActivationType.Toggle) { + ActivationType activationTypeToUse; + if (activationType is ActivationType.Use) + { + activationTypeToUse = ActivationType; + } + else + { + activationTypeToUse = activationType; + } + if (!MeetsRequirements()) return false; _activationSound?.Play(); - EmitSignal(SignalName.OnActivated, (int)activationType); + EmitSignal(SignalName.OnActivated, (int)activationTypeToUse); // Compatibility for old single system - bool success = ActivateTarget(Target, activationType); + bool success = ActivateTarget(Target, activationTypeToUse); - return Targets.Aggregate(success, (current, target) => ActivateTarget(target, activationType) | success); + return Targets.Aggregate(success, (current, target) => ActivateTarget(target, activationTypeToUse) | success); } private bool ActivateTarget(Node2D target, ActivationType activationType = ActivationType.Toggle) diff --git a/Scripts/Resources/RogueliteMapTheme.cs b/Scripts/Resources/RogueliteMapTheme.cs new file mode 100644 index 00000000..33b0d909 --- /dev/null +++ b/Scripts/Resources/RogueliteMapTheme.cs @@ -0,0 +1,18 @@ +using Cirno.Scripts.Resources.Roguelite; +using Godot; +using Godot.Collections; + +namespace Cirno.Scripts.Resources; + +[GlobalClass] +public partial class RogueliteMapTheme : Resource +{ + [Export] public PackedScene HorizontalDoorPrefab { get; set; } + [Export] public PackedScene HorizontalWallPrefab { get; set; } + [Export] public PackedScene VerticalDoorPrefab { get; set; } + [Export] public PackedScene VerticalWallPrefab { get; set; } + [Export] public PackedScene DoorLockPrefab { get; set; } + [Export] public PackedScene KeyCardPrefab { get; set; } + + [Export] public Array Rooms { get; set; } +} \ No newline at end of file diff --git a/Scripts/Resources/RogueliteMapTheme.cs.uid b/Scripts/Resources/RogueliteMapTheme.cs.uid new file mode 100644 index 00000000..b193f68c --- /dev/null +++ b/Scripts/Resources/RogueliteMapTheme.cs.uid @@ -0,0 +1 @@ +uid://bwtif3if3ea0u diff --git a/Sprites/Items/GrayKeycard_Small.aseprite b/Sprites/Items/GrayKeycard_Small.aseprite new file mode 100644 index 00000000..5b821ac5 --- /dev/null +++ b/Sprites/Items/GrayKeycard_Small.aseprite @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb4cb3c34b01bc476ec17ed270332d52e19cc576f9d8de0e62f187222acb45d9 +size 1033 diff --git a/Sprites/Items/GrayKeycard_Small.gif b/Sprites/Items/GrayKeycard_Small.gif new file mode 100644 index 00000000..63c61082 Binary files /dev/null and b/Sprites/Items/GrayKeycard_Small.gif differ diff --git a/Sprites/Items/GrayKeycard_Small.png b/Sprites/Items/GrayKeycard_Small.png new file mode 100644 index 00000000..e013e69b --- /dev/null +++ b/Sprites/Items/GrayKeycard_Small.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33f80545284c7bb8070200c64318ef56a4e08c9b9f16f802d58ec70cda3b400b +size 251 diff --git a/Sprites/Items/GrayKeycard_Small.png.import b/Sprites/Items/GrayKeycard_Small.png.import new file mode 100644 index 00000000..501d1e0b --- /dev/null +++ b/Sprites/Items/GrayKeycard_Small.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://liwkh6rv1m41" +path="res://.godot/imported/GrayKeycard_Small.png-78c37a83db89e8ab4ee0abe72365176d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Sprites/Items/GrayKeycard_Small.png" +dest_files=["res://.godot/imported/GrayKeycard_Small.png-78c37a83db89e8ab4ee0abe72365176d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1