Allows players to drag items onto the item container for quick storage.
允许玩家将物品拖到物品容器上以便快速入库。
This commit is contained in:
parent
2d92a92faf
commit
c1c3fce58a
|
@ -51,22 +51,22 @@ public interface IItem
|
||||||
/// </summary>
|
/// </summary>
|
||||||
bool IsSelect { get; set; }
|
bool IsSelect { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// <para>Whether this item can also hold other items</para>
|
|
||||||
/// <para>此物品是否还能容纳其他物品</para>
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
///<para>For example, a backpack is an object that can hold other objects.</para>
|
|
||||||
///<para>例如,背包是一个物品,他可以容纳其他物品。</para>
|
|
||||||
/// </remarks>
|
|
||||||
bool CanContainItems { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <para>The container in which the item is located</para>
|
/// <para>The container in which the item is located</para>
|
||||||
/// <para>物品所在的物品容器</para>
|
/// <para>物品所在的物品容器</para>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
IItemContainer? ItemContainer { get; set; }
|
IItemContainer? ItemContainer { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>Its own container of items</para>
|
||||||
|
/// <para>自身的物品容器</para>
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// <para>Returns a non-null value if the item itself can hold other items</para>
|
||||||
|
/// <para>物品本身可容纳其他物品,则返回非空值</para>
|
||||||
|
/// </remarks>
|
||||||
|
public IItemContainer? SelfItemContainer { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <para>Calculate how many items can be merged with other items</para>
|
/// <para>Calculate how many items can be merged with other items</para>
|
||||||
/// <para>计算当前物品可与其他物品合并多少个</para>
|
/// <para>计算当前物品可与其他物品合并多少个</para>
|
||||||
|
|
|
@ -78,6 +78,20 @@ public partial class ItemSlotNode : MarginContainer, IItemDisplay
|
||||||
}
|
}
|
||||||
return placeholderItemContainer.CanReplaceItem(placeholderItem.Index, sourceItem);
|
return placeholderItemContainer.CanReplaceItem(placeholderItem.Index, sourceItem);
|
||||||
default:
|
default:
|
||||||
|
var sourceItemSelfContainer = sourceItem.SelfItemContainer;
|
||||||
|
if (sourceItemSelfContainer != null)
|
||||||
|
{
|
||||||
|
//Place the container on the item.
|
||||||
|
//将容器放在物品上。
|
||||||
|
return sourceItemSelfContainer.CanAddItem(Item);
|
||||||
|
}
|
||||||
|
var itemSelfContainer = Item.SelfItemContainer;
|
||||||
|
if (itemSelfContainer != null)
|
||||||
|
{
|
||||||
|
//Drag the item onto the container.
|
||||||
|
//将物品拖到容器上。
|
||||||
|
return itemSelfContainer.CanAddItem(sourceItem);
|
||||||
|
}
|
||||||
return Item.MergeableItemCount(sourceItem, sourceItem.Quantity) > 0;
|
return Item.MergeableItemCount(sourceItem, sourceItem.Quantity) > 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -102,6 +116,48 @@ public partial class ItemSlotNode : MarginContainer, IItemDisplay
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Item.SelfItemContainer != null)
|
||||||
|
{
|
||||||
|
//Use items and place them on the container.
|
||||||
|
//用物品,在物品容器上放置。
|
||||||
|
var oldIndex = sourceItem.Index;
|
||||||
|
var oldItemContainer = sourceItem.ItemContainer;
|
||||||
|
var addNumber = Item.SelfItemContainer.AddItem(sourceItem);
|
||||||
|
if (addNumber >= 0)
|
||||||
|
{
|
||||||
|
if (addNumber == sourceItem.Quantity)
|
||||||
|
{
|
||||||
|
oldItemContainer?.ClearItem(oldIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
oldItemContainer?.RemoveItem(oldIndex, addNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sourceItem.SelfItemContainer != null)
|
||||||
|
{
|
||||||
|
//Use containers and place on top of items.
|
||||||
|
//用容器物品,在物品上放置。
|
||||||
|
var oldIndex = Item.Index;
|
||||||
|
var oldItemContainer = Item.ItemContainer;
|
||||||
|
var addNumber = sourceItem.SelfItemContainer.AddItem(Item);
|
||||||
|
if (addNumber >= 0)
|
||||||
|
{
|
||||||
|
if (addNumber == Item.Quantity)
|
||||||
|
{
|
||||||
|
oldItemContainer?.ClearItem(oldIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
oldItemContainer?.RemoveItem(oldIndex, addNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (Item is PlaceholderItem placeholderItem)
|
if (Item is PlaceholderItem placeholderItem)
|
||||||
{
|
{
|
||||||
var placeholderItemContainer = placeholderItem.ItemContainer;
|
var placeholderItemContainer = placeholderItem.ItemContainer;
|
||||||
|
|
|
@ -13,7 +13,6 @@ public partial class Packsack : PickAbleTemplate
|
||||||
{
|
{
|
||||||
private const string Path = "res://prefab/ui/packsackUI.tscn";
|
private const string Path = "res://prefab/ui/packsackUI.tscn";
|
||||||
[Export] public int NumberSlots { get; set; }
|
[Export] public int NumberSlots { get; set; }
|
||||||
public override bool CanContainItems { get; set; } = true;
|
|
||||||
public override void Use(Node2D? owner, Vector2 targetGlobalPosition)
|
public override void Use(Node2D? owner, Vector2 targetGlobalPosition)
|
||||||
{
|
{
|
||||||
GameSceneDepend.DynamicUiGroup?.ShowControl(Path, control =>
|
GameSceneDepend.DynamicUiGroup?.ShowControl(Path, control =>
|
||||||
|
@ -35,7 +34,6 @@ public partial class Packsack : PickAbleTemplate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IItemContainer? SelfItemContainer { get; set; }
|
|
||||||
|
|
||||||
public override void _Ready()
|
public override void _Ready()
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,6 +18,7 @@ public class PlaceholderItem : IItem
|
||||||
public bool IsSelect { get; set; }
|
public bool IsSelect { get; set; }
|
||||||
public bool CanContainItems { get; set; } = false;
|
public bool CanContainItems { get; set; } = false;
|
||||||
public IItemContainer? ItemContainer { get; set; }
|
public IItemContainer? ItemContainer { get; set; }
|
||||||
|
public IItemContainer? SelfItemContainer { get; set; }
|
||||||
|
|
||||||
public int MergeableItemCount(IItem other, int unallocatedQuantity)
|
public int MergeableItemCount(IItem other, int unallocatedQuantity)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,7 +37,7 @@ public class UniversalItemContainer(int totalCapacity) : IItemContainer
|
||||||
|
|
||||||
public bool CanAddItem(IItem item)
|
public bool CanAddItem(IItem item)
|
||||||
{
|
{
|
||||||
if (item.CanContainItems && !CanContainContainer)
|
if (item.SelfItemContainer != null && !CanContainContainer)
|
||||||
{
|
{
|
||||||
//The item to be added can hold other items, and this item container does not allow item containers.
|
//The item to be added can hold other items, and this item container does not allow item containers.
|
||||||
//要添加的物品能够容纳其他物品,且此物品容器不允许放置物品容器。
|
//要添加的物品能够容纳其他物品,且此物品容器不允许放置物品容器。
|
||||||
|
@ -132,16 +132,17 @@ public class UniversalItemContainer(int totalCapacity) : IItemContainer
|
||||||
//There can be more than one item, try to share equally.
|
//There can be more than one item, try to share equally.
|
||||||
//物品可有多个,尝试均摊。
|
//物品可有多个,尝试均摊。
|
||||||
var originalQuantity = item.Quantity;
|
var originalQuantity = item.Quantity;
|
||||||
|
var temporarilyQuantity = item.Quantity;
|
||||||
var index = 0;
|
var index = 0;
|
||||||
foreach (var unitItem in _itemDictionary.Values)
|
foreach (var unitItem in _itemDictionary.Values)
|
||||||
{
|
{
|
||||||
var number = unitItem.MergeableItemCount(item, item.Quantity);
|
var number = unitItem.MergeableItemCount(item, temporarilyQuantity);
|
||||||
if (number == 0)
|
if (number == 0)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
item.Quantity -= number;
|
temporarilyQuantity -= number;
|
||||||
unitItem.Quantity += number;
|
unitItem.Quantity += number;
|
||||||
ItemDataChangeEvent?.Invoke(new ItemDataChangeEvent
|
ItemDataChangeEvent?.Invoke(new ItemDataChangeEvent
|
||||||
{
|
{
|
||||||
|
@ -165,7 +166,7 @@ public class UniversalItemContainer(int totalCapacity) : IItemContainer
|
||||||
{
|
{
|
||||||
//The capacity is full. The remaining capacity cannot be stored.
|
//The capacity is full. The remaining capacity cannot be stored.
|
||||||
//容量已满,无法存放剩余。
|
//容量已满,无法存放剩余。
|
||||||
return originalQuantity - item.Quantity;
|
return originalQuantity - temporarilyQuantity;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Add the rest to the container.
|
//Add the rest to the container.
|
||||||
|
@ -237,7 +238,7 @@ public class UniversalItemContainer(int totalCapacity) : IItemContainer
|
||||||
|
|
||||||
public bool CanReplaceItem(int index, IItem item)
|
public bool CanReplaceItem(int index, IItem item)
|
||||||
{
|
{
|
||||||
if (item.CanContainItems && !CanContainContainer)
|
if (item.SelfItemContainer != null && !CanContainContainer)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,8 +77,8 @@ public partial class PickAbleTemplate : RigidBody2D, IItem
|
||||||
|
|
||||||
public int MaxQuantity { get; set; } = 1;
|
public int MaxQuantity { get; set; } = 1;
|
||||||
public bool IsSelect { get; set; }
|
public bool IsSelect { get; set; }
|
||||||
public virtual bool CanContainItems { get; set; }
|
|
||||||
public IItemContainer? ItemContainer { get; set; }
|
public IItemContainer? ItemContainer { get; set; }
|
||||||
|
public IItemContainer? SelfItemContainer { get; set; }
|
||||||
|
|
||||||
private Label? _tipLabel;
|
private Label? _tipLabel;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user