diff --git a/Modules/GameManagers/Scripts/TilesManager.cs b/Modules/GameManagers/Scripts/TilesManager.cs new file mode 100644 index 0000000..a108975 --- /dev/null +++ b/Modules/GameManagers/Scripts/TilesManager.cs @@ -0,0 +1,66 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; +using DungeonRoyale.Modules.Tiles.Scripts; +using DungeonRoyale.Shared.Scripts.Constants; + +namespace DungeonRoyale.Modules.GameManagers.Scripts; + +public partial class TilesManager : Node2D +{ + public static TilesManager? Instance { get; private set; } + + public DRTileData[,] Tiles { get; private set; } = new DRTileData[0, 0]; + + private int _width; + private int _height; + + public override void _Ready() + { + if (Instance is null) + { + Instance = this; + } + else + { + GD.PrintErr("There is already an instance of TilesManager in the scene."); + } + } + + public void SetUpTiles(int width, int height) + { + if (width <= 0 || height <= 0) + { + throw new ArgumentException("Width and height must be greater than 0."); + } + + _width = width; + _height = height; + + Tiles = new DRTileData[_width, _height]; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private bool IsOutOfMapBounds(int x, int y) => + x < 0 || x >= _width || y < 0 || y >= _height; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public DRTileData? GetTileAt(int x, int y) => + IsOutOfMapBounds(x, y) ? null : Tiles[x, y]; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryGetTileAt(int x, int y, [NotNullWhen(returnValue: true)] out DRTileData? tileData) => + (tileData = GetTileAt(x, y)) is not null; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryGetTileAt((int x, int y) position, [NotNullWhen(returnValue: true)] out DRTileData? tileData) => + TryGetTileAt(position.x, position.y, out tileData); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryGetTileAt(Vector2I position, [NotNullWhen(returnValue: true)] out DRTileData? tileData) => + TryGetTileAt(position.X, position.Y, out tileData); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryGetTileAtGlobalCoords(Vector2 position, [NotNullWhen(returnValue: true)] out DRTileData? tileData) => + (tileData = GetTileAt((int) position.X / TileConstants.TILE_SIZE, (int) position.Y / TileConstants.TILE_SIZE)) is not null; +} diff --git a/Modules/GameManagers/Scripts/TilesManager.cs.uid b/Modules/GameManagers/Scripts/TilesManager.cs.uid new file mode 100644 index 0000000..527df15 --- /dev/null +++ b/Modules/GameManagers/Scripts/TilesManager.cs.uid @@ -0,0 +1 @@ +uid://bmr66sr26pdab diff --git a/Modules/Player/Scenes/player.tscn b/Modules/Player/Scenes/player.tscn index f9de617..267cdc6 100644 --- a/Modules/Player/Scenes/player.tscn +++ b/Modules/Player/Scenes/player.tscn @@ -2,10 +2,10 @@ [ext_resource type="Script" uid="uid://de61d5m60vonw" path="res://Modules/Player/Scripts/Player.cs" id="1_d6hpj"] [ext_resource type="Texture2D" uid="uid://brmg31ce6noqj" path="res://Modules/Player/Textures/d_idle.png" id="2_4itp8"] -[ext_resource type="Texture2D" uid="uid://du7cgbk1wqk0g" path="res://Modules/Player/Textures/Idle.png" id="2_eeunm"] +[ext_resource type="Texture2D" uid="uid://jf1knh77qpy2" path="res://Modules/Player/Textures/u_idle.png" id="2_eeunm"] [ext_resource type="Texture2D" uid="uid://bu3wecbmouixt" path="res://Modules/Player/Textures/d_walk.png" id="2_i873j"] [ext_resource type="Texture2D" uid="uid://c31cs04ddln8k" path="res://Modules/Player/Textures/s_walk.png" id="3_bxhrv"] -[ext_resource type="Texture2D" uid="uid://dpu3tffj8in05" path="res://Modules/Player/Textures/walk.png" id="3_umw3d"] +[ext_resource type="Texture2D" uid="uid://bu8810dpn686q" path="res://Modules/Player/Textures/u_walk.png" id="3_umw3d"] [ext_resource type="Texture2D" uid="uid://dyoql8jmirecv" path="res://Modules/Player/Textures/s_idle.png" id="4_5c0ey"] [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_d6hpj"] diff --git a/Modules/Player/Scripts/Player.cs b/Modules/Player/Scripts/Player.cs index 7f334a7..c32d717 100644 --- a/Modules/Player/Scripts/Player.cs +++ b/Modules/Player/Scripts/Player.cs @@ -1,3 +1,5 @@ +using DungeonRoyale.Shared.Scripts.Constants; + namespace DungeonRoyale.Modules.Player.Scripts; public partial class Player : CharacterBody2D diff --git a/Modules/Tiles/Scripts/DRTileData.cs b/Modules/Tiles/Scripts/DRTileData.cs new file mode 100644 index 0000000..59f950f --- /dev/null +++ b/Modules/Tiles/Scripts/DRTileData.cs @@ -0,0 +1,21 @@ +namespace DungeonRoyale.Modules.Tiles.Scripts; + +public partial class DRTileData +{ + public int X { get; private set; } + public int Y { get; private set; } + + public bool IsWalkable { get; private set; } + + public bool IsSpawnPoint { get; private set; } + + public DRTileData() + { + } + + public DRTileData(int x, int y) + { + X = x; + Y = y; + } +} diff --git a/Modules/Tiles/Scripts/DRTileData.cs.uid b/Modules/Tiles/Scripts/DRTileData.cs.uid new file mode 100644 index 0000000..9f6e9d4 --- /dev/null +++ b/Modules/Tiles/Scripts/DRTileData.cs.uid @@ -0,0 +1 @@ +uid://d0s8c7afp4vgy diff --git a/Shared/Scripts/MappedInputs.cs b/Shared/Scripts/Constants/MappedInputs.cs similarity index 79% rename from Shared/Scripts/MappedInputs.cs rename to Shared/Scripts/Constants/MappedInputs.cs index bc0cfc6..4ab32f0 100644 --- a/Shared/Scripts/MappedInputs.cs +++ b/Shared/Scripts/Constants/MappedInputs.cs @@ -1,4 +1,4 @@ -namespace DungeonRoyale.Shared.Scripts; +namespace DungeonRoyale.Shared.Scripts.Constants; public static class MappedInputs { diff --git a/Shared/Scripts/MappedInputs.cs.uid b/Shared/Scripts/Constants/MappedInputs.cs.uid similarity index 100% rename from Shared/Scripts/MappedInputs.cs.uid rename to Shared/Scripts/Constants/MappedInputs.cs.uid diff --git a/Shared/Scripts/Constants/TilesConstants.cs b/Shared/Scripts/Constants/TilesConstants.cs new file mode 100644 index 0000000..bafa12e --- /dev/null +++ b/Shared/Scripts/Constants/TilesConstants.cs @@ -0,0 +1,6 @@ +namespace DungeonRoyale.Shared.Scripts.Constants; + +public static class TileConstants +{ + public const int TILE_SIZE = 16; +} \ No newline at end of file diff --git a/Shared/Scripts/Constants/TilesConstants.cs.uid b/Shared/Scripts/Constants/TilesConstants.cs.uid new file mode 100644 index 0000000..e5bb904 --- /dev/null +++ b/Shared/Scripts/Constants/TilesConstants.cs.uid @@ -0,0 +1 @@ +uid://1v5312025i62 diff --git a/project.godot b/project.godot index 04c2472..0625996 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,10 @@ run/main_scene="res://Modules/Game/Scenes/Game.tscn" config/features=PackedStringArray("4.4", "C#", "GL Compatibility") config/icon="res://icon.svg" +[autoload] + +TilesManager="*res://Modules/GameManagers/Scripts/TilesManager.cs" + [dotnet] project/assembly_name="DungeonRoyale"