using System.Reflection.Metadata; using Godot; using Godot.Collections; using TheLegendOfGustav.Entities.Actions; using TheLegendOfGustav.Entities.Actors; namespace TheLegendOfGustav.Entities.Items; public partial class Item : RefCounted, ISaveable { public Item(ItemResource definition) { Definition = definition; Uses = Definition.MaxUses; } public Item() { } public ItemResource Definition { get; private set; } public int Uses { get; set; } /// /// Gera uma ação onde o ator consome o item. /// /// /// public Action GetAction(Player consumer) { return new ItemAction(consumer, this); } /// /// Ativa a função deste item. /// Este método é chamado pela ação gerada por ele mesmo. /// Este método permite definir condições para a sua ativação. /// /// Ação gerada pelo item. /// Se a ação foi realizada ou não. public bool Activate(ItemAction action) { if (Uses != 0) { bool ret = Definition.Activation.OnActivation(action.Player); if (ret && Uses > 0) { Uses--; } return ret; } else { return false; } } public virtual void ConsumedBy(Player consumer) { Inventory inventory = consumer.Inventory; inventory.RemoveItem(this); } public Dictionary GetSaveData() { return new() { {"definition", Definition.ResourcePath}, {"uses", Uses} }; } public bool LoadSaveData(Dictionary saveData) { Definition = GD.Load((string)saveData["definition"]); Uses = (int)saveData["uses"]; return true; } }