✨When beetroot is in inventory the player can heal
This commit is contained in:
@@ -1,8 +1,10 @@
|
|||||||
[gd_scene load_steps=3 format=3 uid="uid://n5cj71bxxjkk"]
|
[gd_scene load_steps=4 format=3 uid="uid://n5cj71bxxjkk"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://dqe1i2qmpttwf" path="res://scripts/CSharp/Common/Fight/FightWorld.cs" id="1_tnyce"]
|
[ext_resource type="Script" uid="uid://dqe1i2qmpttwf" path="res://scripts/CSharp/Common/Fight/FightWorld.cs" id="1_tnyce"]
|
||||||
[ext_resource type="Resource" uid="uid://duq7tshxv6uhp" path="res://resources/items/beet_seed.tres" id="2_lxs0o"]
|
[ext_resource type="Resource" uid="uid://duq7tshxv6uhp" path="res://resources/items/beet_seed.tres" id="2_lxs0o"]
|
||||||
|
[ext_resource type="Resource" uid="uid://0mnsr4anoaiq" path="res://resources/items/beet.tres" id="3_008v8"]
|
||||||
|
|
||||||
[node name="FightWorldAutoload" type="Node2D"]
|
[node name="FightWorldAutoload" type="Node2D"]
|
||||||
script = ExtResource("1_tnyce")
|
script = ExtResource("1_tnyce")
|
||||||
_itemToDropByEnemyGroup = ExtResource("2_lxs0o")
|
_itemToDropByEnemyGroup = ExtResource("2_lxs0o")
|
||||||
|
itemBeetrootToEatForHealth = ExtResource("3_008v8")
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ theme_override_constants/margin_bottom = 10
|
|||||||
[node name="Talk Button" type="Button" parent="ActionSelect/BottomPanel/VBoxContainer/MarginContainer/HBoxContainer/MarginContainer3"]
|
[node name="Talk Button" type="Button" parent="ActionSelect/BottomPanel/VBoxContainer/MarginContainer/HBoxContainer/MarginContainer3"]
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
theme_override_font_sizes/font_size = 41
|
theme_override_font_sizes/font_size = 41
|
||||||
text = "Talk"
|
text = "Heal"
|
||||||
|
|
||||||
[node name="MarginContainer4" type="MarginContainer" parent="ActionSelect/BottomPanel/VBoxContainer/MarginContainer/HBoxContainer"]
|
[node name="MarginContainer4" type="MarginContainer" parent="ActionSelect/BottomPanel/VBoxContainer/MarginContainer/HBoxContainer"]
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public class AllyAttackAction : FighterAction
|
|||||||
public override void ExecuteAction()
|
public override void ExecuteAction()
|
||||||
{
|
{
|
||||||
var totalDamage = minigameDetail.damageHits!.Sum(dh => dh);
|
var totalDamage = minigameDetail.damageHits!.Sum(dh => dh);
|
||||||
targetSelect.GetTarget().AddHealth(-totalDamage);
|
targetSelect.GetTarget().ChangeHealth(-totalDamage);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task AnimateAction(AllFightersVisual allFightersVisual)
|
public override async Task AnimateAction(AllFightersVisual allFightersVisual)
|
||||||
@@ -63,7 +63,7 @@ public class AllyAttackAction : FighterAction
|
|||||||
|
|
||||||
foreach (var hit in minigameDetail.damageHits!)
|
foreach (var hit in minigameDetail.damageHits!)
|
||||||
{
|
{
|
||||||
targetFighterVisual.SpawnDamageIndicatorNumber(hit);
|
targetFighterVisual.SpawnDamageIndicatorNumber($"-{hit}");
|
||||||
}
|
}
|
||||||
|
|
||||||
await currentFighterVisual.AnimatePosToBase();
|
await currentFighterVisual.AnimatePosToBase();
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public class BlobAttackAction(int damage = 3) : FighterAction
|
|||||||
|
|
||||||
public override void ExecuteAction()
|
public override void ExecuteAction()
|
||||||
{
|
{
|
||||||
FightWorld.Instance.allyFighters.vesnaFighter.AddHealth(-damage);
|
FightWorld.Instance.allyFighters.vesnaFighter.ChangeHealth(-damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task AnimateAction(AllFightersVisual allFightersVisual)
|
public override async Task AnimateAction(AllFightersVisual allFightersVisual)
|
||||||
@@ -31,7 +31,7 @@ public class BlobAttackAction(int damage = 3) : FighterAction
|
|||||||
|
|
||||||
await currentFighterVisual.AnimatePosToTarget(targetFighterVisual);
|
await currentFighterVisual.AnimatePosToTarget(targetFighterVisual);
|
||||||
_ = targetFighterVisual.AnimateHit();
|
_ = targetFighterVisual.AnimateHit();
|
||||||
targetFighterVisual.SpawnDamageIndicatorNumber(damage);
|
targetFighterVisual.SpawnDamageIndicatorNumber($"-{damage}");
|
||||||
await currentFighterVisual.AnimatePosToBase();
|
await currentFighterVisual.AnimatePosToBase();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Babushka.scripts.CSharp.Common.Inventory;
|
||||||
|
using Babushka.scripts.CSharp.Common.Util;
|
||||||
|
|
||||||
|
namespace Babushka.scripts.CSharp.Common.Fight.Actions;
|
||||||
|
|
||||||
|
public class EatBeetrootAction : FighterAction
|
||||||
|
{
|
||||||
|
public override Variant<float, Func<bool>> GetAnimationEnd() => 1;
|
||||||
|
public override bool NextDetail() => false;
|
||||||
|
|
||||||
|
private const int HealAmount = 20;
|
||||||
|
|
||||||
|
public override bool ShouldAbort()
|
||||||
|
{
|
||||||
|
Debug.Assert(FightWorld.Instance.itemBeetrootToEatForHealth != null,
|
||||||
|
"Item to eat for health has not been set in the FightWorld autoload");
|
||||||
|
return !InventoryManager.Instance.playerInventory!.HasItems(new ItemInstance
|
||||||
|
{ blueprint = FightWorld.Instance.itemBeetrootToEatForHealth });
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task AnimateAction(AllFightersVisual allFightersVisual)
|
||||||
|
{
|
||||||
|
var fighter = HappeningData.fighterTurn.Current;
|
||||||
|
var fighterVisual = allFightersVisual.GetVisualForFighter(fighter);
|
||||||
|
fighterVisual.SpawnDamageIndicatorNumber($"+{HealAmount}");
|
||||||
|
await fighterVisual.AnimateHeal();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ExecuteAction()
|
||||||
|
{
|
||||||
|
var fighter = HappeningData.fighterTurn.Current;
|
||||||
|
|
||||||
|
var result = InventoryManager.Instance.playerInventory!.TryRemoveAllItems(
|
||||||
|
new ItemInstance { blueprint = FightWorld.Instance.itemBeetrootToEatForHealth! });
|
||||||
|
|
||||||
|
if (result != InventoryActionResult.Success)
|
||||||
|
throw new Exception("No Beetroot in inventory. This case should have been handled earlier");
|
||||||
|
|
||||||
|
fighter.ChangeHealth(HealAmount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override AllyActionButton BindToActionButton() => AllyActionButton.Talk; // Temporarily bound to talk button
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://b2463q1waqvdu
|
||||||
@@ -10,7 +10,8 @@ public class AllyFighters
|
|||||||
maxHealth = 60,
|
maxHealth = 60,
|
||||||
availableActions =
|
availableActions =
|
||||||
[
|
[
|
||||||
new AllyAttackAction()
|
new AllyAttackAction(),
|
||||||
|
new EatBeetrootAction()
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
public FightWorld.Fighter chuhaFighter = new()
|
public FightWorld.Fighter chuhaFighter = new()
|
||||||
|
|||||||
@@ -222,9 +222,9 @@ public partial class FightHappening : Node
|
|||||||
case FightState.ActionCheckDetails:
|
case FightState.ActionCheckDetails:
|
||||||
RequireNotNull(HappeningData.actionStaging);
|
RequireNotNull(HappeningData.actionStaging);
|
||||||
|
|
||||||
if (ActionAbort())
|
if (ShouldActionAbort())
|
||||||
ChangeState(FightState.InputActionSelect);
|
ChangeState(FightState.InputActionSelect);
|
||||||
else if (ActionNeededDetail())
|
else if (DoesActionNeededDetail())
|
||||||
ChangeState(FightState.InputActionDetail);
|
ChangeState(FightState.InputActionDetail);
|
||||||
else
|
else
|
||||||
ChangeState(FightState.ActionExecute);
|
ChangeState(FightState.ActionExecute);
|
||||||
@@ -328,13 +328,13 @@ public partial class FightHappening : Node
|
|||||||
return HappeningData.actionStaging.GetAnimationEnd();
|
return HappeningData.actionStaging.GetAnimationEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool ActionAbort()
|
private bool ShouldActionAbort()
|
||||||
{
|
{
|
||||||
Debug.Assert(HappeningData.actionStaging != null);
|
Debug.Assert(HappeningData.actionStaging != null);
|
||||||
return HappeningData.actionStaging.MarkedForAbort();
|
return HappeningData.actionStaging.ShouldAbort();
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool ActionNeededDetail()
|
private bool DoesActionNeededDetail()
|
||||||
{
|
{
|
||||||
Debug.Assert(HappeningData.actionStaging != null);
|
Debug.Assert(HappeningData.actionStaging != null);
|
||||||
return HappeningData.actionStaging.NextDetail();
|
return HappeningData.actionStaging.NextDetail();
|
||||||
@@ -344,7 +344,7 @@ public partial class FightHappening : Node
|
|||||||
private void ReviveVesna()
|
private void ReviveVesna()
|
||||||
{
|
{
|
||||||
var vesnaFighter = FightWorld.Instance.allyFighters.vesnaFighter;
|
var vesnaFighter = FightWorld.Instance.allyFighters.vesnaFighter;
|
||||||
vesnaFighter.health = vesnaFighter.maxHealth;
|
vesnaFighter.Health = vesnaFighter.maxHealth;
|
||||||
GD.Print("Vesna has been revived. This is for the current prototype only");
|
GD.Print("Vesna has been revived. This is for the current prototype only");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,14 +11,15 @@ public static class FightUtils
|
|||||||
return self.Where(e => e.IsAlive());
|
return self.Where(e => e.IsAlive());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IEnumerable<FightWorld.Fighter> WhereIsNotInFormation(this IEnumerable<FightWorld.Fighter> self, FighterFormation formation)
|
public static IEnumerable<FightWorld.Fighter> WhereIsNotInFormation(this IEnumerable<FightWorld.Fighter> self,
|
||||||
|
FighterFormation formation)
|
||||||
{
|
{
|
||||||
return self.Where(e => !e.IsInFormation(formation));
|
return self.Where(e => !e.IsInFormation(formation));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsAlive(this FightWorld.Fighter self)
|
public static bool IsAlive(this FightWorld.Fighter self)
|
||||||
{
|
{
|
||||||
return self.GetHealth() > 0;
|
return self.Health > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsDead(this FightWorld.Fighter self)
|
public static bool IsDead(this FightWorld.Fighter self)
|
||||||
@@ -26,14 +27,14 @@ public static class FightUtils
|
|||||||
return !self.IsAlive();
|
return !self.IsAlive();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetHealth(this FightWorld.Fighter self)
|
/// <summary>
|
||||||
|
/// Changes the health of a fighter
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="self">The fighter itself</param>
|
||||||
|
/// <param name="amount">The amount of health to add. Make negative to remove health</param>
|
||||||
|
public static void ChangeHealth(this FightWorld.Fighter self, int amount)
|
||||||
{
|
{
|
||||||
return Math.Max(self.health ?? self.maxHealth, 0);
|
self.Health += amount;
|
||||||
}
|
|
||||||
|
|
||||||
public static void AddHealth(this FightWorld.Fighter self, int addHealth)
|
|
||||||
{
|
|
||||||
self.health = self.GetHealth() + addHealth;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsInFormation(this FightWorld.Fighter self, FighterFormation formation)
|
public static bool IsInFormation(this FightWorld.Fighter self, FighterFormation formation)
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Babushka.scripts.CSharp.Common.Fight.Actions;
|
using Babushka.scripts.CSharp.Common.Fight.Actions;
|
||||||
using Babushka.scripts.CSharp.Common.Inventory;
|
using Babushka.scripts.CSharp.Common.Inventory;
|
||||||
@@ -59,9 +60,17 @@ public partial class FightWorld : Node
|
|||||||
public required int maxHealth;
|
public required int maxHealth;
|
||||||
public required List<FighterAction> availableActions;
|
public required List<FighterAction> availableActions;
|
||||||
public const int MaxActionPoints = 1;
|
public const int MaxActionPoints = 1;
|
||||||
public int? health = null; // null => initialize to full health on spawn
|
|
||||||
public int actionPointsLeft;
|
public int actionPointsLeft;
|
||||||
|
|
||||||
|
private int? _healthBacking = null;
|
||||||
|
|
||||||
|
public int Health
|
||||||
|
{
|
||||||
|
get => _healthBacking ?? maxHealth;
|
||||||
|
set => _healthBacking = Math.Clamp(value, 0, maxHealth);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public FighterAction AutoSelectAction()
|
public FighterAction AutoSelectAction()
|
||||||
{
|
{
|
||||||
return availableActions.Random() ?? new FighterAction.Skip();
|
return availableActions.Random() ?? new FighterAction.Skip();
|
||||||
@@ -86,6 +95,7 @@ public partial class FightWorld : Node
|
|||||||
|
|
||||||
// settings
|
// settings
|
||||||
[Export] private ItemResource? _itemToDropByEnemyGroup;
|
[Export] private ItemResource? _itemToDropByEnemyGroup;
|
||||||
|
[Export] public ItemResource? itemBeetrootToEatForHealth;
|
||||||
|
|
||||||
public void ResetFightWorld()
|
public void ResetFightWorld()
|
||||||
{
|
{
|
||||||
@@ -200,7 +210,6 @@ public partial class FightWorld : Node
|
|||||||
var enemy = new Fighter
|
var enemy = new Fighter
|
||||||
{
|
{
|
||||||
type = type,
|
type = type,
|
||||||
health = null,
|
|
||||||
maxHealth = GD.RandRange(8, 20),
|
maxHealth = GD.RandRange(8, 20),
|
||||||
availableActions =
|
availableActions =
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -30,8 +30,6 @@ public abstract class FighterAction
|
|||||||
public abstract bool DetailComplete();
|
public abstract bool DetailComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool _abort = false;
|
|
||||||
|
|
||||||
#region Shortcuts
|
#region Shortcuts
|
||||||
|
|
||||||
protected static FightWorld.FightHappeningData HappeningData =>
|
protected static FightWorld.FightHappeningData HappeningData =>
|
||||||
@@ -65,15 +63,7 @@ public abstract class FighterAction
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MarkAbort()
|
public virtual bool ShouldAbort() => false;
|
||||||
{
|
|
||||||
_abort = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool MarkedForAbort()
|
|
||||||
{
|
|
||||||
return _abort;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the FighterActionDetail, that is currently handled.
|
/// Returns the FighterActionDetail, that is currently handled.
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ public partial class FighterDamageIndicatorFlyingNumber : Node2D
|
|||||||
{
|
{
|
||||||
[Export] private Label _label;
|
[Export] private Label _label;
|
||||||
|
|
||||||
public void Initialize(int number)
|
public void Initialize(string text)
|
||||||
{
|
{
|
||||||
_label.Text = number.ToString();
|
_label.Text = text;
|
||||||
|
|
||||||
var tween = CreateTween();
|
var tween = CreateTween();
|
||||||
var xMovement = GD.RandRange(-150, 150);
|
var xMovement = GD.RandRange(-150, 150);
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ public partial class FighterDamageIndicatorVisual : Node2D
|
|||||||
[Export] private PackedScene _flyingNumberPrefab;
|
[Export] private PackedScene _flyingNumberPrefab;
|
||||||
|
|
||||||
|
|
||||||
public void SpawnFlyingNumber(int number)
|
public void SpawnFlyingNumber(string text)
|
||||||
{
|
{
|
||||||
var flyingNumberInstance = _flyingNumberPrefab.Instantiate<FighterDamageIndicatorFlyingNumber>();
|
var flyingNumberInstance = _flyingNumberPrefab.Instantiate<FighterDamageIndicatorFlyingNumber>();
|
||||||
AddChild(flyingNumberInstance);
|
AddChild(flyingNumberInstance);
|
||||||
flyingNumberInstance.Initialize(number);
|
flyingNumberInstance.Initialize(text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,7 +42,12 @@ public partial class FighterVisual : Node2D
|
|||||||
_boundFighter.IsInFormation(HappeningData.enemyFighterFormation) ? -1 : 1,
|
_boundFighter.IsInFormation(HappeningData.enemyFighterFormation) ? -1 : 1,
|
||||||
_boundFighter.IsDead() ? .3f : 1);
|
_boundFighter.IsDead() ? .3f : 1);
|
||||||
|
|
||||||
healthBarVisual.UpdateHealth(_boundFighter.GetHealth(), _boundFighter.maxHealth);
|
UpdateHealthBarVisuals();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateHealthBarVisuals()
|
||||||
|
{
|
||||||
|
healthBarVisual.UpdateHealth(_boundFighter.Health, _boundFighter.maxHealth);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetTargetSelectionActive(bool value)
|
public void SetTargetSelectionActive(bool value)
|
||||||
@@ -78,6 +83,7 @@ public partial class FighterVisual : Node2D
|
|||||||
|
|
||||||
public async Task AnimateHit()
|
public async Task AnimateHit()
|
||||||
{
|
{
|
||||||
|
UpdateHealthBarVisuals();
|
||||||
var tween = GetTree().CreateTween();
|
var tween = GetTree().CreateTween();
|
||||||
tween.TweenProperty(_squashParent, "scale", new Vector2(1.4f, 0.6f), 0.15);
|
tween.TweenProperty(_squashParent, "scale", new Vector2(1.4f, 0.6f), 0.15);
|
||||||
tween.TweenProperty(_squashParent, "scale", new Vector2(1, 1), 0.4)
|
tween.TweenProperty(_squashParent, "scale", new Vector2(1, 1), 0.4)
|
||||||
@@ -85,17 +91,18 @@ public partial class FighterVisual : Node2D
|
|||||||
await ToSignal(tween, "finished");
|
await ToSignal(tween, "finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep for reference for new Heal animation
|
public async Task AnimateHeal()
|
||||||
//public void HealAnimation()
|
|
||||||
//{
|
|
||||||
// EmitSignalHealed();
|
|
||||||
// var tween = GetTree().CreateTween();
|
|
||||||
// tween.TweenProperty(this, "scale", new Vector2(0.6f, 1.4f), 0.15);
|
|
||||||
// tween.TweenProperty(this, "scale", new Vector2(1, 1), 0.4)
|
|
||||||
// .SetTrans(Tween.TransitionType.Cubic).SetEase(Tween.EaseType.Out);
|
|
||||||
//}
|
|
||||||
public void SpawnDamageIndicatorNumber(int number)
|
|
||||||
{
|
{
|
||||||
_fighterDamageIndicatorVisual.SpawnFlyingNumber(number);
|
UpdateHealthBarVisuals();
|
||||||
|
var tween = GetTree().CreateTween();
|
||||||
|
tween.TweenProperty(_squashParent, "scale", new Vector2(0.6f, 1.4f), 0.15);
|
||||||
|
tween.TweenProperty(_squashParent, "scale", new Vector2(1, 1), 0.4)
|
||||||
|
.SetTrans(Tween.TransitionType.Cubic).SetEase(Tween.EaseType.Out);
|
||||||
|
await ToSignal(tween, "finished");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SpawnDamageIndicatorNumber(string text)
|
||||||
|
{
|
||||||
|
_fighterDamageIndicatorVisual.SpawnFlyingNumber(text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -101,7 +101,8 @@ public partial class InventoryInstance : Node, ISaveable
|
|||||||
return InventoryActionResult.DestinationFull;
|
return InventoryActionResult.DestinationFull;
|
||||||
}
|
}
|
||||||
|
|
||||||
var itemInstance = _slots[slotIndex].itemInstance ?? new ItemInstance { blueprint = newItem.blueprint, amount = 0 };
|
var itemInstance = _slots[slotIndex].itemInstance ??
|
||||||
|
new ItemInstance { blueprint = newItem.blueprint, amount = 0 };
|
||||||
var maxStack = itemInstance!.blueprint.maxStack;
|
var maxStack = itemInstance!.blueprint.maxStack;
|
||||||
var freeOnStack = maxStack - itemInstance.amount;
|
var freeOnStack = maxStack - itemInstance.amount;
|
||||||
var moveAmount = Math.Min(freeOnStack, newItem.amount);
|
var moveAmount = Math.Min(freeOnStack, newItem.amount);
|
||||||
@@ -145,6 +146,38 @@ public partial class InventoryInstance : Node, ISaveable
|
|||||||
return RemoveItem(inventorySlot, out _);
|
return RemoveItem(inventorySlot, out _);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public InventoryActionResult TryRemoveAllItems(ItemInstance items)
|
||||||
|
{
|
||||||
|
var hasItemsCount = TotalItemsOfBlueprint(items.blueprint);
|
||||||
|
if (hasItemsCount < items.amount)
|
||||||
|
return InventoryActionResult.SourceDoesNotExist;
|
||||||
|
|
||||||
|
var amountToRemove = items.amount;
|
||||||
|
foreach (var s in _slots)
|
||||||
|
{
|
||||||
|
if (s.IsEmpty() || s.itemInstance!.blueprint != items.blueprint)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var slotItem = s.itemInstance!;
|
||||||
|
if (slotItem.amount <= amountToRemove)
|
||||||
|
{
|
||||||
|
amountToRemove -= slotItem.amount;
|
||||||
|
s.itemInstance = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
slotItem.amount -= amountToRemove;
|
||||||
|
amountToRemove = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (amountToRemove == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
EmitSignal(SignalName.InventoryContentsChanged);
|
||||||
|
return InventoryActionResult.Success;
|
||||||
|
}
|
||||||
|
|
||||||
public InventoryActionResult AddItemToSlot(ItemInstance itemInstance, int destinationSlot)
|
public InventoryActionResult AddItemToSlot(ItemInstance itemInstance, int destinationSlot)
|
||||||
{
|
{
|
||||||
if (destinationSlot < 0 || destinationSlot >= _slots.Count)
|
if (destinationSlot < 0 || destinationSlot >= _slots.Count)
|
||||||
@@ -230,5 +263,6 @@ public partial class InventoryInstance : Node, ISaveable
|
|||||||
slot.itemInstance = null;
|
slot.itemInstance = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,7 @@ namespace Babushka.scripts.CSharp.Common.Inventory;
|
|||||||
[GlobalClass]
|
[GlobalClass]
|
||||||
public partial class ItemInstance: Resource
|
public partial class ItemInstance: Resource
|
||||||
{
|
{
|
||||||
[Export] public ItemResource blueprint;
|
[Export] public required ItemResource blueprint;
|
||||||
[Export] public int amount = 1;
|
[Export] public int amount = 1;
|
||||||
|
|
||||||
public ItemInstance Clone()
|
public ItemInstance Clone()
|
||||||
|
|||||||
Reference in New Issue
Block a user