mirror of
https://github.com/D4M13N-D3V/godot_grid_inventory.git
synced 2025-03-14 08:14:55 +00:00
chore: fleshed out more of the inventory grid classes
This commit is contained in:
parent
fcefa8fd71
commit
79472fa58e
@ -3,12 +3,13 @@ using GodotGridInventory.Code.Grid.Enums;
|
|||||||
|
|
||||||
namespace GodotGridInventory.Code.Grid;
|
namespace GodotGridInventory.Code.Grid;
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
public class InventoryCell
|
public class InventoryCell
|
||||||
{
|
{
|
||||||
private readonly InventoryGrid _parentGrid;
|
private readonly InventoryGrid _parentGrid;
|
||||||
public Vector2 Position { get; set; }
|
public Vector2 Position { get; set; }
|
||||||
public EnumInventoryGridCellState State { get; set; }
|
public EnumInventoryGridCellState State { get; set; }
|
||||||
public ItemConfiguration? Item { get; set; } = null;
|
public Item? Item { get; set; } = null;
|
||||||
|
|
||||||
|
|
||||||
public InventoryCell(Vector2 position, InventoryGrid parentGrid)
|
public InventoryCell(Vector2 position, InventoryGrid parentGrid)
|
||||||
@ -17,5 +18,6 @@ public class InventoryCell
|
|||||||
State = EnumInventoryGridCellState.Available;
|
State = EnumInventoryGridCellState.Available;
|
||||||
Item = null;
|
Item = null;
|
||||||
Position = position;
|
Position = position;
|
||||||
|
GD.Print($"Inventory cell created at position {position.X}, {position.Y}");
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -5,29 +5,36 @@ using GodotGridInventory.Code.Grid.Enums;
|
|||||||
|
|
||||||
namespace GodotGridInventory.Code.Grid;
|
namespace GodotGridInventory.Code.Grid;
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
public class InventoryGrid
|
public class InventoryGrid
|
||||||
{
|
{
|
||||||
private readonly int _gridWidth;
|
private readonly InventoryController _inventoryController;
|
||||||
private readonly int _gridHeight;
|
public readonly Vector2 GridSize;
|
||||||
|
|
||||||
private readonly List<InventoryCell> _gridCells = new();
|
public List<InventoryCell> GridCells = new();
|
||||||
|
|
||||||
public InventoryGrid(int width, int height)
|
public InventoryGrid(InventoryController inventoryController, Vector2 size)
|
||||||
{
|
{
|
||||||
_gridWidth = width;
|
_inventoryController = inventoryController;
|
||||||
_gridHeight = height;
|
GridSize = size;
|
||||||
InitializeGrid();
|
InitializeGrid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public InventoryGrid(InventoryController inventoryController, List<InventoryCell> gridCells)
|
||||||
|
{
|
||||||
|
_inventoryController = inventoryController;
|
||||||
|
GridCells = gridCells;
|
||||||
|
}
|
||||||
|
|
||||||
private void InitializeGrid()
|
private void InitializeGrid()
|
||||||
{
|
{
|
||||||
for(var x = 0; x < _gridWidth; x++)
|
for(var x = 0; x < GridSize.X; x++)
|
||||||
{
|
{
|
||||||
for(var y = 0; y < _gridHeight; y++)
|
for(var y = 0; y < GridSize.Y; y++)
|
||||||
{
|
{
|
||||||
var cellPosition = new Vector2(x, y);
|
var cellPosition = new Vector2(x, y);
|
||||||
var cell = new InventoryCell(cellPosition, this);
|
var cell = new InventoryCell(cellPosition, this);
|
||||||
_gridCells.Add(cell);
|
GridCells.Add(cell);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -38,9 +45,9 @@ public class InventoryGrid
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="position">The position of the cell to update.</param>
|
/// <param name="position">The position of the cell to update.</param>
|
||||||
/// <param name="item">The item to set the cell to.</param>
|
/// <param name="item">The item to set the cell to.</param>
|
||||||
private void SetCellItem(Vector2 position, ItemConfiguration item)
|
private void SetCellItem(Vector2 position, Item item)
|
||||||
{
|
{
|
||||||
var cell = _gridCells.FirstOrDefault(cell => cell.Position == position);
|
var cell = GridCells.FirstOrDefault(cell => cell.Position == position);
|
||||||
if(cell != null)
|
if(cell != null)
|
||||||
{
|
{
|
||||||
cell.Item = item;
|
cell.Item = item;
|
||||||
@ -53,7 +60,7 @@ public class InventoryGrid
|
|||||||
/// <param name="position">The position of the cell to update.</param>
|
/// <param name="position">The position of the cell to update.</param>
|
||||||
private void ClearCellItem(Vector2 position)
|
private void ClearCellItem(Vector2 position)
|
||||||
{
|
{
|
||||||
var cell = _gridCells.FirstOrDefault(cell => cell.Position == position);
|
var cell = GridCells.FirstOrDefault(cell => cell.Position == position);
|
||||||
if(cell != null)
|
if(cell != null)
|
||||||
{
|
{
|
||||||
cell.Item = null;
|
cell.Item = null;
|
||||||
@ -67,7 +74,7 @@ public class InventoryGrid
|
|||||||
/// <param name="state">The state to set the cell</param>
|
/// <param name="state">The state to set the cell</param>
|
||||||
private void SetCellState(Vector2 position, EnumInventoryGridCellState state)
|
private void SetCellState(Vector2 position, EnumInventoryGridCellState state)
|
||||||
{
|
{
|
||||||
var cell = _gridCells.FirstOrDefault(cell => cell.Position == position);
|
var cell = GridCells.FirstOrDefault(cell => cell.Position == position);
|
||||||
if(cell != null)
|
if(cell != null)
|
||||||
{
|
{
|
||||||
cell.State = state;
|
cell.State = state;
|
||||||
@ -82,7 +89,7 @@ public class InventoryGrid
|
|||||||
/// <param name="state">The state to set the cells</param>
|
/// <param name="state">The state to set the cells</param>
|
||||||
private void SetCellAreaState(Vector2 position, Vector2 size, EnumInventoryGridCellState state)
|
private void SetCellAreaState(Vector2 position, Vector2 size, EnumInventoryGridCellState state)
|
||||||
{
|
{
|
||||||
foreach (var cell in _gridCells.Where(cell => cell.Position.X >= position.X && cell.Position.X < position.X + size.X && cell.Position.Y >= position.Y && cell.Position.Y < position.Y + size.Y))
|
foreach (var cell in GridCells.Where(cell => cell.Position.X >= position.X && cell.Position.X < position.X + size.X && cell.Position.Y >= position.Y && cell.Position.Y < position.Y + size.Y))
|
||||||
{
|
{
|
||||||
cell.State = state;
|
cell.State = state;
|
||||||
}
|
}
|
||||||
@ -95,16 +102,16 @@ public class InventoryGrid
|
|||||||
/// <returns>The first coordinates available for something of the given size, or null if no space available.</returns>
|
/// <returns>The first coordinates available for something of the given size, or null if no space available.</returns>
|
||||||
private Vector2? GetAvailableCellPosition(Vector2 size)
|
private Vector2? GetAvailableCellPosition(Vector2 size)
|
||||||
{
|
{
|
||||||
var availableCells = _gridCells.Where(cell => cell.State == EnumInventoryGridCellState.Available);
|
var availableCells = GridCells.Where(cell => cell.State == EnumInventoryGridCellState.Available);
|
||||||
var cell = availableCells.FirstOrDefault();
|
var cell = availableCells.FirstOrDefault();
|
||||||
if(cell != null)
|
if(cell != null)
|
||||||
{
|
{
|
||||||
return cell.Position;
|
return cell.Position;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int x = 0; x <= _gridWidth - size.X; x++)
|
for (int x = 0; x <= GridSize.X - size.X; x++)
|
||||||
{
|
{
|
||||||
for (int y = 0; y <= _gridHeight - size.Y; y++)
|
for (int y = 0; y <= GridSize.Y - size.Y; y++)
|
||||||
{
|
{
|
||||||
// Check if the area is available
|
// Check if the area is available
|
||||||
if (IsSpaceAvailable(new Vector2(x, y), size))
|
if (IsSpaceAvailable(new Vector2(x, y), size))
|
||||||
@ -125,7 +132,7 @@ public class InventoryGrid
|
|||||||
/// <returns>A List of cells that are available for the item to be placed in.</returns>
|
/// <returns>A List of cells that are available for the item to be placed in.</returns>
|
||||||
private bool IsSpaceAvailable(Vector2 position, Vector2 size)
|
private bool IsSpaceAvailable(Vector2 position, Vector2 size)
|
||||||
{
|
{
|
||||||
var cells = _gridCells.Where( cell => cell.Position.X >= position.X && cell.Position.X < position.X + size.X && cell.Position.Y >= position.Y && cell.Position.Y < position.Y + size.Y);
|
var cells = GridCells.Where( cell => cell.Position.X >= position.X && cell.Position.X < position.X + size.X && cell.Position.Y >= position.Y && cell.Position.Y < position.Y + size.Y);
|
||||||
return cells.All(cell => cell.State == EnumInventoryGridCellState.Available);
|
return cells.All(cell => cell.State == EnumInventoryGridCellState.Available);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@ -138,7 +145,7 @@ public class InventoryGrid
|
|||||||
/// <param name="itemId">The ID of the item to add.</param>
|
/// <param name="itemId">The ID of the item to add.</param>
|
||||||
/// <param name="position">The position to add the item at in inventory grid space. If null then will insert at first available place.</param>
|
/// <param name="position">The position to add the item at in inventory grid space. If null then will insert at first available place.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool AddItem(string itemId, Vector2? position)
|
public bool AddItem(string itemId, Vector2? position = null)
|
||||||
{
|
{
|
||||||
var item = ItemDatabase.Instance.GetItemConfiguration(itemId);
|
var item = ItemDatabase.Instance.GetItemConfiguration(itemId);
|
||||||
if(item == null)
|
if(item == null)
|
||||||
@ -166,10 +173,10 @@ public class InventoryGrid
|
|||||||
/// Gets the cell at the given location in inventory grid space.
|
/// Gets the cell at the given location in inventory grid space.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="position">The position you want to get the cell of.</param>
|
/// <param name="position">The position you want to get the cell of.</param>
|
||||||
/// <returns>The inventory cell.</returns>
|
/// <returns>The inventory cell at the given location in inventory grid space.</returns>
|
||||||
public InventoryCell? GetCell(Vector2 position)
|
public InventoryCell? GetCell(Vector2 position)
|
||||||
{
|
{
|
||||||
return _gridCells.FirstOrDefault(cell => cell.Position == position);
|
return GridCells.FirstOrDefault(cell => cell.Position == position);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
18
Code/Grid/InventoryModel.cs
Normal file
18
Code/Grid/InventoryModel.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Godot;
|
||||||
|
|
||||||
|
namespace GodotGridInventory.Code.Grid;
|
||||||
|
public class InventoryModel
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public string Name { get; set; }
|
||||||
|
public int GridWidth { get; set; }
|
||||||
|
public int GridHeight { get; set; }
|
||||||
|
|
||||||
|
public List<Item> Items { get; set; }
|
||||||
|
|
||||||
|
public List<InventoryCell> Cells { get; set; } = new List<InventoryCell>();
|
||||||
|
public InventoryGrid? Grid { get; set; }
|
||||||
|
public bool Open { get; set; } = false;
|
||||||
|
}
|
@ -1,8 +1,127 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Godot;
|
using Godot;
|
||||||
|
using GodotGridInventory.Code.Grid;
|
||||||
|
|
||||||
namespace GodotGridInventory.Code;
|
namespace GodotGridInventory.Code;
|
||||||
|
|
||||||
public class InventoryController : Node
|
public partial class InventoryController : Node
|
||||||
{
|
{
|
||||||
|
private int _inventoryIdCounter = 0;
|
||||||
|
private readonly ItemDatabase _itemDatabase = ItemDatabase.Instance;
|
||||||
|
[Export] public float CellSize { get; set; } = 32;
|
||||||
|
private Dictionary<int,InventoryModel> _inventories { get; set; } = new Dictionary<int,InventoryModel>();
|
||||||
|
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
base._Ready();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool UpdateInventory(int id, InventoryModel inventoryModel)
|
||||||
|
{
|
||||||
|
var inventory = _inventories[id];
|
||||||
|
if(inventory == null)
|
||||||
|
{
|
||||||
|
GD.PrintErr($"Inventory not found with id {id}.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_inventories[id] = inventoryModel;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InventoryModel GetInventory(int id)
|
||||||
|
{
|
||||||
|
var inventory = _inventories[id];
|
||||||
|
if(inventory == null)
|
||||||
|
{
|
||||||
|
GD.PrintErr($"Inventory not found with id {id}.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = _inventories[id];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddInventory(string name, Vector2 size, string[] items)
|
||||||
|
{
|
||||||
|
var inventoryGrid = new InventoryGrid(this, size);
|
||||||
|
|
||||||
|
foreach (var item in items)
|
||||||
|
{
|
||||||
|
inventoryGrid.AddItem(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
_inventories.Add(_inventoryIdCounter, new InventoryModel()
|
||||||
|
{
|
||||||
|
Id = _inventoryIdCounter,
|
||||||
|
Name = name,
|
||||||
|
Items = items.Select( item=> _itemDatabase.GetItemConfiguration(item)).ToList(),
|
||||||
|
Cells = inventoryGrid.GridCells,
|
||||||
|
Open = false
|
||||||
|
});
|
||||||
|
|
||||||
|
_inventoryIdCounter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool RemoveInventory(int Id)
|
||||||
|
{
|
||||||
|
var inventory = _inventories[Id];
|
||||||
|
if(inventory == null)
|
||||||
|
{
|
||||||
|
GD.PrintErr($"Inventory not found with id {Id}.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_inventories.Remove(Id);
|
||||||
|
GD.Print($"Inventory {inventory.Name} with id {inventory.Id} removed.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool OpenInventory(int Id)
|
||||||
|
{
|
||||||
|
var inventory = _inventories[Id];
|
||||||
|
if(inventory == null)
|
||||||
|
{
|
||||||
|
GD.PrintErr($"Inventory not found with id {Id}.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inventory.Open == true)
|
||||||
|
{
|
||||||
|
GD.PrintErr($"Inventory with {Id} is already open.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
_inventories[Id].Open = true;
|
||||||
|
GD.Print($"Opened inventory {inventory.Name} with id {inventory.Id}.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool CloseInventory(int Id)
|
||||||
|
{
|
||||||
|
if(!_inventories.ContainsKey(Id))
|
||||||
|
{
|
||||||
|
GD.PrintErr("Inventory not found with id " + Id + ".");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var inventory = _inventories[Id];
|
||||||
|
if (inventory.Open == false)
|
||||||
|
{
|
||||||
|
GD.PrintErr($"Inventory with {Id} is already closed.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_inventories[Id].Open = false;
|
||||||
|
_inventories.Remove(Id);
|
||||||
|
GD.Print("Closed inventory " + inventory.Name + " with id " + inventory.Id + ".");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<InventoryModel> GetInventoriesLoaded()
|
||||||
|
{
|
||||||
|
var result = _inventories.Values.ToList();
|
||||||
|
GD.Print($"Getting list of all _inventoriesLoaded loaded into memory ({result.Count}).");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
@ -7,11 +7,14 @@ namespace GodotGridInventory.Code;
|
|||||||
public class ItemDatabase
|
public class ItemDatabase
|
||||||
{
|
{
|
||||||
public static ItemDatabase Instance { get; } = new();
|
public static ItemDatabase Instance { get; } = new();
|
||||||
private readonly Dictionary<string, ItemConfiguration> _itemDatabase = new();
|
private readonly Dictionary<string, Item> _itemDatabase = new();
|
||||||
|
|
||||||
|
public ItemDatabase()
|
||||||
|
{
|
||||||
|
InitializeItemDatabase();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Item GetItemConfiguration(string id)
|
||||||
public ItemConfiguration GetItemConfiguration(string id)
|
|
||||||
{
|
{
|
||||||
return _itemDatabase[id];
|
return _itemDatabase[id];
|
||||||
}
|
}
|
||||||
@ -22,7 +25,7 @@ public class ItemDatabase
|
|||||||
var items = DirAccess.GetFilesAt(ItemDatabaseConstants.ITEMS_PATH).Where(filePath => filePath.EndsWith(ItemDatabaseConstants.ITEM_EXTENSION));
|
var items = DirAccess.GetFilesAt(ItemDatabaseConstants.ITEMS_PATH).Where(filePath => filePath.EndsWith(ItemDatabaseConstants.ITEM_EXTENSION));
|
||||||
foreach (var item in items)
|
foreach (var item in items)
|
||||||
{
|
{
|
||||||
var itemResource = GD.Load<ItemConfiguration>(item);
|
var itemResource = GD.Load<Item>(item);
|
||||||
if (itemResource != null)
|
if (itemResource != null)
|
||||||
{
|
{
|
||||||
_itemDatabase.Add(itemResource.Id, itemResource);
|
_itemDatabase.Add(itemResource.Id, itemResource);
|
||||||
|
@ -3,7 +3,7 @@ using System;
|
|||||||
using GodotGridInventory.Code.Items.Enums;
|
using GodotGridInventory.Code.Items.Enums;
|
||||||
|
|
||||||
[GlobalClass, Icon("res://icon.svg")]
|
[GlobalClass, Icon("res://icon.svg")]
|
||||||
public partial class ItemConfiguration : Resource
|
public partial class Item : Resource
|
||||||
{
|
{
|
||||||
[Export] public string Id { get; set; }
|
[Export] public string Id { get; set; }
|
||||||
[Export] public string Name { get; set; }
|
[Export] public string Name { get; set; }
|
38
Code/UI/InventoryGridInterface.cs
Normal file
38
Code/UI/InventoryGridInterface.cs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
using Godot;
|
||||||
|
using GodotGridInventory.Code.Grid;
|
||||||
|
|
||||||
|
namespace GodotGridInventory.Code.UI;
|
||||||
|
|
||||||
|
public partial class InventoryGridInterface:Control
|
||||||
|
{
|
||||||
|
[Export] public Control GridContainer { get; set; }
|
||||||
|
[Export] public string GridSlotPath { get; set; }
|
||||||
|
|
||||||
|
private PackedScene _gridSlotResource;
|
||||||
|
private InventoryGrid _inventoryGrid;
|
||||||
|
private InventoryController _inventoryController;
|
||||||
|
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
_gridSlotResource = GD.Load<PackedScene>(GridSlotPath);
|
||||||
|
base._Ready();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InitializeInventoryGrid(InventoryGrid inventoryGrid, InventoryController inventoryController)
|
||||||
|
{
|
||||||
|
_inventoryGrid = inventoryGrid;
|
||||||
|
_inventoryController = inventoryController;
|
||||||
|
|
||||||
|
for (var x = 0; x < _inventoryGrid.GridSize.X; x++)
|
||||||
|
{
|
||||||
|
for (var y = 0; y < _inventoryGrid.GridSize.Y; y++)
|
||||||
|
{
|
||||||
|
var cellPosition = new Vector2(x, y);
|
||||||
|
var cell = _inventoryGrid.GetCell(cellPosition);
|
||||||
|
var gridSlot = _gridSlotResource.Instantiate() as InventoryGridSlot;
|
||||||
|
gridSlot.Position = new Vector2(x * _inventoryController.CellSize, y * _inventoryController.CellSize);
|
||||||
|
GridContainer.AddChild(gridSlot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
8
Code/UI/InventoryGridSlot.cs
Normal file
8
Code/UI/InventoryGridSlot.cs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
using Godot;
|
||||||
|
|
||||||
|
namespace GodotGridInventory.Code.UI;
|
||||||
|
|
||||||
|
public partial class InventoryGridSlot : Control
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
7
debug.cs
Normal file
7
debug.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
public partial class debug : Node
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
13
main.tscn
13
main.tscn
@ -1,3 +1,12 @@
|
|||||||
[gd_scene format=3 uid="uid://cc8f5p1w5xdyx"]
|
[gd_scene load_steps=3 format=3 uid="uid://cc8f5p1w5xdyx"]
|
||||||
|
|
||||||
[node name="Node" type="Node"]
|
[ext_resource type="Script" path="res://debug.cs" id="1_al802"]
|
||||||
|
[ext_resource type="Script" path="res://Code/InventoryController.cs" id="2_0yu34"]
|
||||||
|
|
||||||
|
[node name="UI" type="CanvasLayer"]
|
||||||
|
|
||||||
|
[node name="Debug" type="Node" parent="."]
|
||||||
|
script = ExtResource("1_al802")
|
||||||
|
|
||||||
|
[node name="Inventory Controller" type="Node" parent="."]
|
||||||
|
script = ExtResource("2_0yu34")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user