namespace ChickenGameTest; using Godot; using System; using System.Collections.Generic; using System.Linq; using SJK.Functional; public interface IVoxelGridRegistry { VoxelGuid Register(T voxelNode, params Vector3I[] positions) where T : class; void UnRegister(VoxelGuid id); IEnumerable Get(Vector3I voxelPos); IEnumerable Get(params Vector3I[] voxelPos); } public readonly record struct VoxelGuid(Guid Id); public sealed class VoxelRegistry : IVoxelGridRegistry { private readonly Dictionary _voxelPositions = new(); private readonly record struct VoxelEntry(object Item, Vector3I[] Entries); private Dictionary> _data; public VoxelRegistry() { _data = new(); } public IEnumerable Get(Vector3I voxelPos) { if (!_data.TryGetValue(voxelPos, out var entrys)) { yield break; } foreach (var item in entrys.OfType()) { yield return item; } } public IEnumerable Get(params Vector3I[] voxelPos) { foreach (var item in voxelPos) { foreach (var item2 in Get(item)) { yield return item2; } } } public VoxelGuid Register(T voxelNode, params Vector3I[] positions) where T : class { void register(Vector3I pos, T point) { if (!_data.TryGetValue(pos, out var entrys)) { entrys = []; _data[pos] = entrys; } entrys.Add(point); } foreach (var pos in positions) { register(pos, voxelNode);//TODO Acount For Rotation } var guid = new VoxelGuid(Guid.NewGuid()); _voxelPositions[guid.Id] = new(voxelNode, positions); return guid; } public void UnRegister(VoxelGuid id) => _voxelPositions.GetValue(id.Id).IfSome(e => { foreach (var item in e.Entries) { _data.GetValue(item).IfSome(i => i.Remove(e.Item)); } }); } public enum Direction { Up, Down, Left, Right, Front, Back } public static class DirectionExtession { public static Vector3I ToVector(this Direction direction) => direction switch { Direction.Up => Vector3I.Up, Direction.Down => Vector3I.Down, Direction.Left => Vector3I.Left, Direction.Right => Vector3I.Right, Direction.Front => Vector3I.Forward, Direction.Back => Vector3I.Back, _ => throw new NotSupportedException($"{nameof(direction)} does not support value {direction}") }; public static Direction Reverse(this Direction direction) => direction switch { Direction.Up => Direction.Down, Direction.Down => Direction.Up, Direction.Left => Direction.Right, Direction.Right => Direction.Left, Direction.Front => Direction.Back, Direction.Back => Direction.Front, _ => throw new NotSupportedException($"{nameof(direction)} does not support value {direction}") }; public static Direction RotateClockWise(this Direction direction) => direction switch { Direction.Up => Direction.Up, Direction.Down => Direction.Down, Direction.Left => Direction.Back, Direction.Right => Direction.Front, Direction.Front => Direction.Right, Direction.Back => Direction.Left, _ => throw new NotSupportedException($"{nameof(direction)} does not support value {direction}") }; public static Direction RotateCounterClockWise(this Direction direction) => direction switch { Direction.Up => Direction.Up, Direction.Down => Direction.Down, Direction.Right => Direction.Front, Direction.Left => Direction.Back, Direction.Back => Direction.Right, Direction.Front => Direction.Left, _ => throw new NotSupportedException($"{nameof(direction)} does not support value {direction}") }; } public interface IStorage where T : class { StorageDefinition Definition { get; } IEnumerable GetAllItems(); void Remove(T item); bool TryInsert(T item); record StorageDefinition(string Name, ItemType Type); } public record ItemType(string Name); public partial class ItemStoragePool : Node, IStorage { [Export] public int MaxAmount { get; set; } = 5; public IStorage.StorageDefinition Definition { get; set; } = default!; private readonly List _items = []; public IEnumerable GetAllItems() => _items; public bool TryInsert(IBeltItem item) { if (_items.Count >= MaxAmount) { return false; } _items.Add(item); return true; } public void Remove(IBeltItem item) => _items.Remove(item); }