feat: add extensible item inventory and world system

This commit is contained in:
2026-08-23 23:16:49 +02:00
parent 25e32f20d9
commit f4331f426c
48 changed files with 693 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
namespace Game.Features.Items.Contracts;
public enum Hand
{
Left,
Right
}
+1
View File
@@ -0,0 +1 @@
uid://c4n7h2w8m5q1p
@@ -0,0 +1,7 @@
namespace Game.Features.Items.Contracts;
public enum HandRequirement
{
One,
Both
}
@@ -0,0 +1 @@
uid://d8p3k6v1r9y4b
@@ -0,0 +1,10 @@
using Godot;
namespace Game.Features.Items.Contracts;
public interface IHeldItemPresenter
{
bool TryShowHeld(IItemInstance item, Hand hand);
bool TryShowDropped(IItemInstance item, Vector3 worldPosition);
void Refresh(IItemInstance item);
}
@@ -0,0 +1 @@
uid://c1q7y4d9m5x2v
@@ -0,0 +1,7 @@
namespace Game.Features.Items.Contracts;
public interface IItemInstance
{
ItemInfo Info { get; }
ItemActionResult Use(ItemUseRequest request);
}
@@ -0,0 +1 @@
uid://b5x9q3h7m2w8f
@@ -0,0 +1,12 @@
using Godot;
namespace Game.Features.Items.Contracts;
public interface IItemInteractionService
{
bool IsHandFree(Hand hand);
ItemInstanceId? GetHeldItem(Hand hand);
ItemActionResult TryPickup(ItemInstanceId itemId, Hand hand);
ItemActionResult TryUse(ItemUseRequest request);
ItemActionResult TryDrop(Hand hand, Vector3 worldPosition);
}
@@ -0,0 +1 @@
uid://f2k8q5b1w7m4n
@@ -0,0 +1,6 @@
namespace Game.Features.Items.Contracts;
public interface IItemRepository
{
bool TryGet(ItemInstanceId itemId, out IItemInstance item);
}
@@ -0,0 +1 @@
uid://e7n1m6v4k9r3q
@@ -0,0 +1,8 @@
using Godot;
namespace Game.Features.Items.Contracts;
public interface IItemSpawnPoint
{
Vector3 GetItemSpawnPosition();
}
@@ -0,0 +1 @@
uid://a2v6r8m3q7k5d
@@ -0,0 +1,10 @@
using System.Collections.Generic;
using Godot;
namespace Game.Features.Items.Contracts;
public interface IItemSpawner
{
IReadOnlyCollection<ItemDefinitionId> DefinitionIds { get; }
ItemActionResult TrySpawn(ItemDefinitionId definitionId, Vector3 worldPosition, out ItemInstanceId itemId);
}
@@ -0,0 +1 @@
uid://f4m9k2w6b8n1r
@@ -0,0 +1,6 @@
namespace Game.Features.Items.Contracts;
public interface IPickupTarget
{
ItemInfo ItemInfo { get; }
}
@@ -0,0 +1 @@
uid://c9v4g7p2m5x8d
@@ -0,0 +1,8 @@
namespace Game.Features.Items.Contracts;
public enum ItemActionPhase
{
Started,
Completed,
Cancelled
}
@@ -0,0 +1 @@
uid://c9w5d2n8q4m1h
@@ -0,0 +1,10 @@
namespace Game.Features.Items.Contracts;
public readonly record struct ItemActionResult(ItemActionStatus Status, string Message = "")
{
public bool Success => Status == ItemActionStatus.Success;
public static ItemActionResult Ok() => new(ItemActionStatus.Success);
public static ItemActionResult Fail(ItemActionStatus status, string message) => new(status, message);
}
@@ -0,0 +1 @@
uid://a8m4p1x7d3q6k
@@ -0,0 +1,12 @@
namespace Game.Features.Items.Contracts;
public enum ItemActionStatus
{
Success,
ItemNotFound,
HandOccupied,
HandEmpty,
UnsupportedAction,
PresentationFailed,
UnknownDefinition
}
@@ -0,0 +1 @@
uid://f1r6y3b9k5v2m
@@ -0,0 +1,7 @@
namespace Game.Features.Items.Contracts;
public readonly record struct ItemDefinition(
ItemDefinitionId Id,
string DisplayName,
HandRequirement HandRequirement
);
@@ -0,0 +1 @@
uid://e3v8k4r1m7x2p
@@ -0,0 +1,6 @@
namespace Game.Features.Items.Contracts;
public readonly record struct ItemDefinitionId(string Value)
{
public override string ToString() => Value;
}
@@ -0,0 +1 @@
uid://b7q2n9c5w1m6y
+8
View File
@@ -0,0 +1,8 @@
namespace Game.Features.Items.Contracts;
public readonly record struct ItemInfo(
ItemInstanceId Id,
ItemDefinitionId DefinitionId,
string DisplayName,
HandRequirement HandRequirement
);
@@ -0,0 +1 @@
uid://e1r5j8w3n6c9h
@@ -0,0 +1,8 @@
using System;
namespace Game.Features.Items.Contracts;
public readonly record struct ItemInstanceId(Guid Value)
{
public override string ToString() => Value.ToString();
}
@@ -0,0 +1 @@
uid://b6x2f9m4t7k3q
@@ -0,0 +1,11 @@
using Game.Features.Interactions.Contracts;
using Game.Features.Players.Contracts;
namespace Game.Features.Items.Contracts;
public readonly record struct ItemUseRequest(
PlayerId PlayerId,
Hand Hand,
ItemActionPhase Phase,
InteractionTargetId? TargetId = null
);
@@ -0,0 +1 @@
uid://d6k2v8m5r1c9n