feat: add extensible item inventory and world system
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
namespace Game.Features.Items.Contracts;
|
||||
|
||||
public enum Hand
|
||||
{
|
||||
Left,
|
||||
Right
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user