diff --git a/Scripts/Crafting/Ingredient.cs b/Scripts/Crafting/Ingredient.cs index b563846..5b69187 100644 --- a/Scripts/Crafting/Ingredient.cs +++ b/Scripts/Crafting/Ingredient.cs @@ -1,7 +1,10 @@ +using System.Text.Json.Serialization; using Godot; public class Ingredient { - public string item; - public int amount; + [JsonPropertyName("item")] + public string Item {get; set;} + [JsonPropertyName("amount")] + public int Amount {get;set;} } \ No newline at end of file diff --git a/Scripts/Crafting/Inventory.cs b/Scripts/Crafting/Inventory.cs index 3cb7a39..5df9455 100644 --- a/Scripts/Crafting/Inventory.cs +++ b/Scripts/Crafting/Inventory.cs @@ -32,9 +32,9 @@ public class Inventory { bool canCraft = true; Item item; - foreach(Ingredient ingredient in neededIngredients) + foreach (Ingredient ingredient in neededIngredients) { - item = items.Find(x => x.data.Id == ingredient.item && x.currentAmount >= ingredient.amount * amount); + item = items.Find(x => x.data.Id == ingredient.Item && x.currentAmount >= ingredient.Amount * amount); if (item == null) { canCraft = false; @@ -43,4 +43,13 @@ public class Inventory } return canCraft; } + + public void RemoveItem(string id, int amount) + { + Item item = items.Find(x => x.data.Id == id && x.currentAmount >= amount); + if (item != null) + { + item.currentAmount -= amount; + } + } } \ No newline at end of file diff --git a/Scripts/Crafting/InventoryDisplay.cs b/Scripts/Crafting/InventoryDisplay.cs index b86a41b..68ef01d 100644 --- a/Scripts/Crafting/InventoryDisplay.cs +++ b/Scripts/Crafting/InventoryDisplay.cs @@ -26,7 +26,7 @@ public partial class InventoryDisplay : PanelContainer { display = itemDisplayPrefab.Instantiate(); display.item = item; - display.text.Text = item.GetReadableName(); + display.text.Text = item.data.GetReadableName(); display.amount.Text = item.currentAmount.ToString(); display.texture.Texture = ResourceLoader.LoadPath(item.data.Texture); itemList.AddChild(display); diff --git a/Scripts/Crafting/Item.cs b/Scripts/Crafting/Item.cs index ef81147..d85cbdf 100644 --- a/Scripts/Crafting/Item.cs +++ b/Scripts/Crafting/Item.cs @@ -11,30 +11,30 @@ public class Item public CraftingResult Craft(int amount, double delta) { - if (GameData.inventory.CanCraft(data.Inputs, amount - amountCrafted)) + elapsedCraftTime += delta; + GD.Print(elapsedCraftTime); + if (elapsedCraftTime >= data.CraftTime) { - elapsedCraftTime += delta; - if (elapsedCraftTime >= data.CraftTime) + GD.Print("Crafted!"); + elapsedCraftTime -= data.CraftTime; + if(!GameData.inventory.AddItem(this, 1)) { - elapsedCraftTime -= data.CraftTime; - currentAmount += 1; - amountCrafted++; - if (amountCrafted >= amount) - { - amountCrafted = 0; - elapsedCraftTime = 0; - return CraftingResult.FINISHED; - } + return CraftingResult.FAILED; + } + foreach (Ingredient ingredient in data.Inputs) + { + GameData.inventory.RemoveItem(ingredient.Item, ingredient.Amount); + } + amountCrafted++; + if (amountCrafted >= amount) + { + GD.Print("Finished!"); + amountCrafted = 0; + elapsedCraftTime = 0; + return CraftingResult.FINISHED; } - return CraftingResult.CRAFTING; } - return CraftingResult.FAILED; - } - - public string GetReadableName() - { - string noUnderscore = data.Id.Replace("_", " ").ToLower(); - return char.ToUpper(noUnderscore[0]) + noUnderscore.Substring(1); + return CraftingResult.CRAFTING; } } diff --git a/Scripts/Crafting/ItemData.cs b/Scripts/Crafting/ItemData.cs index 70794dd..609e069 100644 --- a/Scripts/Crafting/ItemData.cs +++ b/Scripts/Crafting/ItemData.cs @@ -27,4 +27,15 @@ public class ItemData [JsonPropertyName("stacksize")] public int StackSize { get; set; } + + public string GetReadableName() + { + string noUnderscore = Id.Replace("_", " ").ToLower(); + return char.ToUpper(noUnderscore[0]) + noUnderscore.Substring(1); + } + + public static string GetIndex(string readable) + { + return readable.ToLower().Replace(" ", "_"); + } } \ No newline at end of file diff --git a/Scripts/DSL/NodeDisplay.cs b/Scripts/DSL/NodeDisplay.cs index ff30915..dc57b66 100644 --- a/Scripts/DSL/NodeDisplay.cs +++ b/Scripts/DSL/NodeDisplay.cs @@ -12,14 +12,9 @@ public partial class NodeDisplay : PanelContainer this.node = node; } - public void SetupUIElement() - { - - } - public override void _Ready() { - + node.Setup(this); } public override void _Process(double delta) diff --git a/Scripts/DSL/Nodes/CraftNode.cs b/Scripts/DSL/Nodes/CraftNode.cs index b5f0b0e..7949e97 100644 --- a/Scripts/DSL/Nodes/CraftNode.cs +++ b/Scripts/DSL/Nodes/CraftNode.cs @@ -2,31 +2,74 @@ using Godot; public class CraftNode : ProgramNode { + Item selectedItem; + int amount; public CraftNode() { DisplayText = "Craft"; } public override NodeResult Execute(Robot robot, double delta) { - GD.Print("Craft"); - if (nextNode != null) + if (selectedItem == null) { - return nextNode.Execute(robot, delta); + lastExecutionMessage = "No Item selected"; + return NodeResult.FAILURE; } - else + if (amount <= 0) { - return NodeResult.SUCCESS; + lastExecutionMessage = "Amount has to be atleast 1"; + return NodeResult.FAILURE; } + if (!GameData.inventory.CanCraft(selectedItem.data.Inputs, amount)) + { + lastExecutionMessage = "Not enough items to craft this"; + return NodeResult.FAILURE; + } + + switch (selectedItem.Craft(amount, delta)) + { + case CraftingResult.FAILED: + lastExecutionMessage = "Not enough space to add item to inventory"; + return NodeResult.FAILURE; + case CraftingResult.FINISHED: + return NodeResult.SUCCESS; + } + + return NodeResult.RUNNING; } public override void ReadParameters(NodeDisplay display) { - // + HBoxContainer valueContainer = display.GetNode("./EditorDisplay/HBoxContainer/"); + OptionButton items = valueContainer.GetNode("./Item"); + string readableItem = items.GetItemText(items.GetSelectedId()); + if (GameData.availableItems.ContainsKey(ItemData.GetIndex(readableItem))) + { + selectedItem = new Item { data = GameData.availableItems[ItemData.GetIndex(readableItem)]}; + } + amount = (int)valueContainer.GetNode("./Amount").Value; } public override ProgramNode Duplicate() { - CraftNode duplicate = new CraftNode(); + CraftNode duplicate = new CraftNode() + { + selectedItem = selectedItem, + amount = amount + }; return duplicate; } + + public override void Setup(NodeDisplay display) + { + OptionButton options = display.GetNode("./EditorDisplay/HBoxContainer/Item"); + options.AddItem("Select item..."); + foreach (ItemData item in GameData.availableItems.Values) + { + if (item.Inputs.Count > 0) + { + options.AddItem(item.GetReadableName()); + } + } + } } \ No newline at end of file diff --git a/Scripts/DSL/Nodes/ExploreNode.cs b/Scripts/DSL/Nodes/ExploreNode.cs index a62d3d4..a4d6235 100644 --- a/Scripts/DSL/Nodes/ExploreNode.cs +++ b/Scripts/DSL/Nodes/ExploreNode.cs @@ -87,4 +87,9 @@ public class ExploreNode : ProgramNode { //Currently does nothing } + + public override void Setup(NodeDisplay display) + { + //Currently does nothing + } } \ No newline at end of file diff --git a/Scripts/DSL/Nodes/HarvestNode.cs b/Scripts/DSL/Nodes/HarvestNode.cs index e6e23ca..76bd852 100644 --- a/Scripts/DSL/Nodes/HarvestNode.cs +++ b/Scripts/DSL/Nodes/HarvestNode.cs @@ -36,7 +36,7 @@ public class HarvestNode : ProgramNode public override void ReadParameters(NodeDisplay display) { - // + //Currently does nothing } public override ProgramNode Duplicate() @@ -44,4 +44,9 @@ public class HarvestNode : ProgramNode HarvestNode duplicate = new HarvestNode(); return duplicate; } + + public override void Setup(NodeDisplay display) + { + //Currently does nothing + } } \ No newline at end of file diff --git a/Scripts/DSL/Nodes/MoveNode.cs b/Scripts/DSL/Nodes/MoveNode.cs index 0df9406..6e683d3 100644 --- a/Scripts/DSL/Nodes/MoveNode.cs +++ b/Scripts/DSL/Nodes/MoveNode.cs @@ -72,4 +72,9 @@ public class MoveNode : ProgramNode }; return duplicate; } + + public override void Setup(NodeDisplay display) + { + //Currently does nothing + } } \ No newline at end of file diff --git a/Scripts/DSL/Nodes/ProgramNode.cs b/Scripts/DSL/Nodes/ProgramNode.cs index 7d5a507..5cef70b 100644 --- a/Scripts/DSL/Nodes/ProgramNode.cs +++ b/Scripts/DSL/Nodes/ProgramNode.cs @@ -6,6 +6,7 @@ public abstract class ProgramNode public string DisplayText; public string lastExecutionMessage; + public abstract void Setup(NodeDisplay display); public abstract NodeResult Execute(Robot robot, double delta); public abstract void ReadParameters(NodeDisplay display); public abstract ProgramNode Duplicate();