using Godot; public class CraftNode : ProgramNode { Item selectedItem; int amount; public CraftNode() { DisplayText = "Craft"; } public override NodeResult Execute(Robot robot, double delta) { if (selectedItem == null) { lastExecutionMessage = "No Item selected"; return NodeResult.FAILURE; } if (amount <= 0) { 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() { 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()); } } } }