using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Revitalize.Framework.Menus.MenuComponents; using StardewValley; using StardustCore.UIUtilities; using StardustCore.UIUtilities.MenuComponents.ComponentsV2.Buttons; namespace Revitalize.Framework.Menus { public class CraftingMenuV1 : IClickableMenuExtended { /// /// All the different pages for crafting. /// public Dictionary CraftingTabs; public Dictionary> craftingItemsToDisplay; public IList fromInventory; public IList toInventory; public int currentPageIndex; public string currentTab; public int currentScrollIndex; public Color backgroundColor; public int xOffset = 72; public string hoverText; /// /// How many crafting recipes to display at a time. /// public int amountOfRecipesToShow = 4; public bool playerInventory; public CraftingInformationPage craftingInfo; public CraftingMenuV1() : base() { } public CraftingMenuV1(int X, int Y, int Width, int Height, Color BackgroundColor, IList Inventory) : base(X, Y, Width, Height, false) { this.backgroundColor = BackgroundColor; this.CraftingTabs = new Dictionary(); this.craftingItemsToDisplay = new Dictionary>(); this.currentPageIndex = 0; this.fromInventory = Inventory; this.toInventory = Inventory; this.playerInventory = true; } public CraftingMenuV1(int X, int Y, int Width, int Height, Color BackgroundColor, ref IList Inventory) : base(X, Y, Width, Height, false) { this.backgroundColor = BackgroundColor; this.CraftingTabs = new Dictionary(); this.craftingItemsToDisplay = new Dictionary>(); this.currentPageIndex = 0; this.fromInventory = Inventory; this.toInventory = Inventory; } public CraftingMenuV1(int X, int Y, int Width, int Height, Color BackgroundColor, ref IList FromInventory, ref IList ToInventory) : base(X, Y, Width, Height, false) { this.backgroundColor = BackgroundColor; this.CraftingTabs = new Dictionary(); this.craftingItemsToDisplay = new Dictionary>(); this.currentPageIndex = 0; this.fromInventory = FromInventory; this.toInventory = ToInventory; } public void addInCraftingPageTab(string name, AnimatedButton Button) { int count = this.CraftingTabs.Count; if (this.CraftingTabs.ContainsKey(name)) { return; } else { Vector2 newPos = new Vector2(100 + (48) * (count + 1), 100 + (24 * 4) * (count + 1)); Button.Position = newPos; this.CraftingTabs.Add(name, Button); this.craftingItemsToDisplay.Add(name, new List()); } } public void addInCraftingRecipe(CraftingRecipeButton Button, string WhichTab) { if (this.craftingItemsToDisplay.ContainsKey(WhichTab)) { int count = this.craftingItemsToDisplay.Count; Vector2 newPos = new Vector2(100 + (64) * (count + 1), 100 + (16 * 4) * (count + 1)); Button.displayItem.Position = newPos; this.craftingItemsToDisplay[WhichTab].Add(Button); } else { throw new Exception("Tab: " + WhichTab + " doesn't exist!"); } } public override void receiveScrollWheelAction(int direction) { } public override void performHoverAction(int x, int y) { bool hovered = false; foreach (KeyValuePair pair in this.CraftingTabs) { if (pair.Value.containsPoint(x, y)) { this.hoverText = pair.Key; hovered = true; } } //get range of buttons to show if (string.IsNullOrEmpty(this.currentTab) == false) { List buttonsToDraw = this.getRecipeButtonsToDisplay(); foreach (CraftingRecipeButton button in buttonsToDraw) { if (button.containsPoint(x, y)) { this.hoverText = button.recipe.outputName; hovered = true; } } } if (hovered == false) { this.hoverText = ""; } } public override void receiveLeftClick(int x, int y, bool playSound = true) { foreach (KeyValuePair pair in this.CraftingTabs) { if (pair.Value.containsPoint(x, y)) { this.currentTab = pair.Key; return; } } //get range of buttons to show if (string.IsNullOrEmpty(this.currentTab) == false) { List buttonsToDraw = this.getRecipeButtonsToDisplay(); foreach (CraftingRecipeButton button in buttonsToDraw) { if (button.containsPoint(x, y)) { //button.craftItem(this.fromInventory, this.toInventory); this.craftingInfo = new CraftingInformationPage(this.xPositionOnScreen + this.width+this.xOffset, this.yPositionOnScreen, 400, 400, this.backgroundColor, button,ref this.fromInventory); Game1.soundBank.PlayCue("coin"); if (this.playerInventory) { Game1.player.Items = this.toInventory; return; } } } } if (this.craftingInfo != null) { if (this.craftingInfo.doesMenuContainPoint(x, y)) return; } this.craftingInfo = null; } public override void draw(SpriteBatch b) { this.drawDialogueBoxBackground(this.xPositionOnScreen + this.xOffset, this.yPositionOnScreen, this.width, this.height, this.backgroundColor); foreach (KeyValuePair pair in this.CraftingTabs) { pair.Value.draw(b); } if (string.IsNullOrEmpty(this.currentTab)) { if (string.IsNullOrEmpty(this.hoverText) == false) { IClickableMenuExtended.drawHoverText(b, this.hoverText, Game1.dialogueFont); } this.drawMouse(b); return; } List buttonsToDraw = this.getRecipeButtonsToDisplay(); foreach (CraftingRecipeButton button in buttonsToDraw) { if (button.recipe.CanCraft(this.fromInventory)) { button.draw(b); } else { button.draw(b, .25f); } b.DrawString(Game1.smallFont, button.displayItem.item.DisplayName, button.displayItem.Position + new Vector2(64, 0), Color.Brown); } if (this.craftingInfo != null) { this.craftingInfo.draw(b); } if (string.IsNullOrEmpty(this.hoverText) == false) { IClickableMenuExtended.drawHoverText(b, this.hoverText, Game1.dialogueFont); } this.drawMouse(b); } public override void update(GameTime time) { base.update(time); } public List getRecipeButtonsToDisplay() { List buttonsToDraw = this.craftingItemsToDisplay[this.currentTab].GetRange(this.currentScrollIndex, Math.Min(this.craftingItemsToDisplay[this.currentTab].Count, this.amountOfRecipesToShow)); return buttonsToDraw; } } }