diff --git a/GeneralMods/StardustCore/StardustCore.csproj b/GeneralMods/StardustCore/StardustCore.csproj index 9b44ed11..f6afd46d 100644 --- a/GeneralMods/StardustCore/StardustCore.csproj +++ b/GeneralMods/StardustCore/StardustCore.csproj @@ -51,6 +51,7 @@ + diff --git a/GeneralMods/StardustCore/StaticClass.cs b/GeneralMods/StardustCore/StaticClass.cs new file mode 100644 index 00000000..8f892d42 --- /dev/null +++ b/GeneralMods/StardustCore/StaticClass.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StardustCore +{ + public static class StaticExtentions + { + + /// + /// Thank you stack overflow. https://stackoverflow.com/questions/3907299/if-statements-matching-multiple-values + /// Ex:) if(1.In(1,2,3)) //This returns true since 1 is in the parameter list. + /// + /// + /// Object to pass in value. + /// A list like (1,2,3) to see if it's contained. + /// + public static bool In(this T obj, params T[] args) + { + return args.Contains(obj); + } + } +} diff --git a/StarAI/StarAI/MenuCore/CropUtilityMenu.cs b/StarAI/StarAI/MenuCore/CropUtilityMenu.cs new file mode 100644 index 00000000..50aaa68b --- /dev/null +++ b/StarAI/StarAI/MenuCore/CropUtilityMenu.cs @@ -0,0 +1,441 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using StardewValley; +using StardewValley.Menus; +using System; +using System.Collections.Generic; +using System.Linq; +using StardustCore; +namespace StarAI.MenuCore +{ + + public class CropUtilityMenu : IClickableMenu + { + public static int widthToMoveActiveTab = Game1.tileSize / 8; + private string descriptionText = ""; + private string hoverText = ""; + public List sideTabs = new List(); + public Dictionary>> collections = new Dictionary>>(); + public const int region_sideTabShipped = 7001; + public const int region_sideTabFish = 7002; + public const int region_sideTabArtifacts = 7003; + public const int region_sideTabMinerals = 7004; + public const int region_sideTabCooking = 7005; + public const int region_sideTabAchivements = 7006; + public const int region_forwardButton = 707; + public const int region_backButton = 706; + public const int organicsTab = 0; + public const int fishTab = 1; + public const int archaeologyTab = 2; + public const int mineralsTab = 3; + public const int cookingTab = 4; + public const int achievementsTab = 5; + public const int distanceFromMenuBottomBeforeNewPage = 128; + public ClickableTextureComponent backButton; + public ClickableTextureComponent forwardButton; + private int currentTab; + private int currentPage; + private int value; + + + + public CropUtilityMenu(int x, int y, int width, int height) + : base(x, y, width, height, false) + { + List sideTabs1 = this.sideTabs; + ClickableTextureComponent textureComponent1 = new ClickableTextureComponent("", new Rectangle(this.xPositionOnScreen - Game1.tileSize * 3 / 4 + CollectionsPage.widthToMoveActiveTab, this.yPositionOnScreen + Game1.tileSize * 2, Game1.tileSize, Game1.tileSize), "", Game1.content.LoadString("Strings\\UI:Collections_Shipped"), Game1.mouseCursors, new Rectangle(640, 80, 16, 16), (float)Game1.pixelZoom, false); + int num1 = 7001; + textureComponent1.myID = num1; + int num2 = 7002; + textureComponent1.downNeighborID = num2; + int num3 = 0; + textureComponent1.rightNeighborID = num3; + sideTabs1.Add(textureComponent1); + this.collections.Add(0, new List>()); + List sideTabs2 = this.sideTabs; + ClickableTextureComponent textureComponent2 = new ClickableTextureComponent("", new Rectangle(this.xPositionOnScreen - Game1.tileSize * 3 / 4, this.yPositionOnScreen + Game1.tileSize * 3, Game1.tileSize, Game1.tileSize), "", Game1.content.LoadString("Strings\\UI:Collections_Fish"), Game1.mouseCursors, new Rectangle(640, 64, 16, 16), (float)Game1.pixelZoom, false); + int num4 = 7002; + textureComponent2.myID = num4; + int num5 = 7001; + textureComponent2.upNeighborID = num5; + int num6 = 7003; + textureComponent2.downNeighborID = num6; + int num7 = 0; + textureComponent2.rightNeighborID = num7; + sideTabs2.Add(textureComponent2); + this.collections.Add(1, new List>()); + List sideTabs3 = this.sideTabs; + ClickableTextureComponent textureComponent3 = new ClickableTextureComponent("", new Rectangle(this.xPositionOnScreen - Game1.tileSize * 3 / 4, this.yPositionOnScreen + Game1.tileSize * 4, Game1.tileSize, Game1.tileSize), "", Game1.content.LoadString("Strings\\UI:Collections_Artifacts"), Game1.mouseCursors, new Rectangle(656, 64, 16, 16), (float)Game1.pixelZoom, false); + int num8 = 7003; + textureComponent3.myID = num8; + int num9 = 7002; + textureComponent3.upNeighborID = num9; + int num10 = 7004; + textureComponent3.downNeighborID = num10; + int num11 = 0; + textureComponent3.rightNeighborID = num11; + sideTabs3.Add(textureComponent3); + this.collections.Add(2, new List>()); + List sideTabs4 = this.sideTabs; + ClickableTextureComponent textureComponent4 = new ClickableTextureComponent("", new Rectangle(this.xPositionOnScreen - Game1.tileSize * 3 / 4, this.yPositionOnScreen + Game1.tileSize * 5, Game1.tileSize, Game1.tileSize), "", Game1.content.LoadString("Strings\\UI:Collections_Minerals"), Game1.mouseCursors, new Rectangle(672, 64, 16, 16), (float)Game1.pixelZoom, false); + int num12 = 7004; + textureComponent4.myID = num12; + int num13 = 7003; + textureComponent4.upNeighborID = num13; + int num14 = 7005; + textureComponent4.downNeighborID = num14; + int num15 = 0; + textureComponent4.rightNeighborID = num15; + sideTabs4.Add(textureComponent4); + this.collections.Add(3, new List>()); + List sideTabs5 = this.sideTabs; + ClickableTextureComponent textureComponent5 = new ClickableTextureComponent("", new Rectangle(this.xPositionOnScreen - Game1.tileSize * 3 / 4, this.yPositionOnScreen + Game1.tileSize * 6, Game1.tileSize, Game1.tileSize), "", Game1.content.LoadString("Strings\\UI:Collections_Cooking"), Game1.mouseCursors, new Rectangle(688, 64, 16, 16), (float)Game1.pixelZoom, false); + int num16 = 7005; + textureComponent5.myID = num16; + int num17 = 7004; + textureComponent5.upNeighborID = num17; + int num18 = 7006; + textureComponent5.downNeighborID = num18; + int num19 = 0; + textureComponent5.rightNeighborID = num19; + sideTabs5.Add(textureComponent5); + this.collections.Add(4, new List>()); + List sideTabs6 = this.sideTabs; + ClickableTextureComponent textureComponent6 = new ClickableTextureComponent("", new Rectangle(this.xPositionOnScreen - Game1.tileSize * 3 / 4, this.yPositionOnScreen + Game1.tileSize * 7, Game1.tileSize, Game1.tileSize), "", Game1.content.LoadString("Strings\\UI:Collections_Achievements"), Game1.mouseCursors, new Rectangle(656, 80, 16, 16), (float)Game1.pixelZoom, false); + int num20 = 7006; + textureComponent6.myID = num20; + int num21 = 7005; + textureComponent6.upNeighborID = num21; + int num22 = 0; + textureComponent6.rightNeighborID = num22; + sideTabs6.Add(textureComponent6); + this.collections.Add(5, new List>()); + CollectionsPage.widthToMoveActiveTab = Game1.tileSize / 8; + ClickableTextureComponent textureComponent7 = new ClickableTextureComponent(new Rectangle(this.xPositionOnScreen + Game1.tileSize * 3 / 4, this.yPositionOnScreen + height - 20 * Game1.pixelZoom, 12 * Game1.pixelZoom, 11 * Game1.pixelZoom), Game1.mouseCursors, new Rectangle(352, 495, 12, 11), (float)Game1.pixelZoom, false); + int num23 = 706; + textureComponent7.myID = num23; + int num24 = -7777; + textureComponent7.rightNeighborID = num24; + this.backButton = textureComponent7; + ClickableTextureComponent textureComponent8 = new ClickableTextureComponent(new Rectangle(this.xPositionOnScreen + width - Game1.tileSize / 2 - 15 * Game1.pixelZoom, this.yPositionOnScreen + height - 20 * Game1.pixelZoom, 12 * Game1.pixelZoom, 11 * Game1.pixelZoom), Game1.mouseCursors, new Rectangle(365, 495, 12, 11), (float)Game1.pixelZoom, false); + int num25 = 707; + textureComponent8.myID = num25; + int num26 = -7777; + textureComponent8.leftNeighborID = num26; + this.forwardButton = textureComponent8; + int[] numArray = new int[this.sideTabs.Count]; + int num27 = this.xPositionOnScreen + IClickableMenu.borderWidth + IClickableMenu.spaceToClearSideBorder; + int num28 = this.yPositionOnScreen + IClickableMenu.borderWidth + IClickableMenu.spaceToClearTopBorder - Game1.tileSize / 4; + int num29 = 10; + foreach (KeyValuePair keyValuePair in Game1.objectInformation) + { + string str = keyValuePair.Value.Split('/')[3]; + bool drawShadow = false; + int index; + if (str.Contains("Arch")) + { + index = 2; + if (Game1.player.archaeologyFound.ContainsKey(keyValuePair.Key)) + drawShadow = true; + } + else if (str.Contains("Fish")) + { + if (keyValuePair.Key < 167 || keyValuePair.Key >= 173) + { + index = 1; + if (Game1.player.fishCaught.ContainsKey(keyValuePair.Key)) + drawShadow = true; + } + else + continue; + } + else if (str.Contains("Mineral") || str.Substring(str.Length - 3).Equals("-2")) + { + index = 3; + if (Game1.player.mineralsFound.ContainsKey(keyValuePair.Key)) + drawShadow = true; + } + else if (str.Contains("Cooking") || str.Substring(str.Length - 3).Equals("-7")) + { + index = 4; + if (Game1.player.recipesCooked.ContainsKey(keyValuePair.Key)) + drawShadow = true; + if (keyValuePair.Key == 217 || keyValuePair.Key == 772 || keyValuePair.Key == 773) + continue; + } + else if(keyValuePair.Key>0) + { + index = 0; + StardewValley.Object obj = new StardewValley.Object(keyValuePair.Key, 1); + if (obj.getCategoryName()!="Seed") continue; + drawShadow = true; + + } + else + continue; + int x1 = num27 + numArray[index] % num29 * (Game1.tileSize + 4); + int y1 = num28 + numArray[index] / num29 * (Game1.tileSize + 4); + if (y1 > this.yPositionOnScreen + height - 128) + { + this.collections[index].Add(new List()); + numArray[index] = 0; + x1 = num27; + y1 = num28; + } + if (this.collections[index].Count == 0) + this.collections[index].Add(new List()); + StardewValley.Object o = new StardewValley.Object(keyValuePair.Key, 1); + if (o.getCategoryName() != "Seed") continue; + List textureComponentList = this.collections[index].Last>(); + float scale= Game1.pixelZoom * (1 + UtilityCore.SeedCropUtility.getUtilityScaleValue(o.parentSheetIndex)); + if (UtilityCore.SeedCropUtility.getUtilityScaleValue(o.parentSheetIndex)==0) scale = 1.00f; + ClickableTextureComponent textureComponent9 = new ClickableTextureComponent(keyValuePair.Key.ToString() + " " + drawShadow.ToString(), new Rectangle(x1, y1, Game1.tileSize, Game1.tileSize), (string)null, "", Game1.objectSpriteSheet, Game1.getSourceRectForStandardTileSheet(Game1.objectSpriteSheet, keyValuePair.Key, 16, 16),scale, drawShadow); + int count = this.collections[index].Last>().Count; + textureComponent9.myID = count; + int num30 = (this.collections[index].Last>().Count + 1) % num29 == 0 ? -1 : this.collections[index].Last>().Count + 1; + textureComponent9.rightNeighborID = num30; + int num31 = this.collections[index].Last>().Count % num29 == 0 ? 7001 : this.collections[index].Last>().Count - 1; + textureComponent9.leftNeighborID = num31; + int num32 = y1 + (Game1.tileSize + 4) > this.yPositionOnScreen + height - 128 ? -7777 : this.collections[index].Last>().Count + num29; + textureComponent9.downNeighborID = num32; + int num33 = this.collections[index].Last>().Count < num29 ? 12345 : this.collections[index].Last>().Count - num29; + textureComponent9.upNeighborID = num33; + int num34 = 1; + textureComponent9.fullyImmutable = num34 != 0; + textureComponentList.Add(textureComponent9); + ++numArray[index]; + } + if (this.collections[5].Count == 0) + this.collections[5].Add(new List()); + } + + protected override void customSnapBehavior(int direction, int oldRegion, int oldID) + { + base.customSnapBehavior(direction, oldRegion, oldID); + if (direction == 2) + { + if (this.currentPage > 0) + this.currentlySnappedComponent = this.getComponentWithID(706); + else if (this.currentPage == 0 && this.collections[this.currentTab].Count > 1) + this.currentlySnappedComponent = this.getComponentWithID(707); + this.backButton.upNeighborID = oldID; + this.forwardButton.upNeighborID = oldID; + } + else if (direction == 3) + { + if (oldID != 707 || this.currentPage <= 0) + return; + this.currentlySnappedComponent = this.getComponentWithID(706); + } + else + { + if (direction != 1 || oldID != 706 || this.collections[this.currentTab].Count <= this.currentPage + 1) + return; + this.currentlySnappedComponent = this.getComponentWithID(707); + } + } + + public override void snapToDefaultClickableComponent() + { + base.snapToDefaultClickableComponent(); + this.currentlySnappedComponent = this.getComponentWithID(0); + this.snapCursorToCurrentSnappedComponent(); + } + + public override void receiveLeftClick(int x, int y, bool playSound = true) + { + for (int index = 0; index < this.sideTabs.Count; ++index) + { + if (this.sideTabs[index].containsPoint(x, y) && this.currentTab != index) + { + Game1.playSound("smallSelect"); + this.sideTabs[this.currentTab].bounds.X -= CollectionsPage.widthToMoveActiveTab; + this.currentTab = index; + this.currentPage = 0; + this.sideTabs[index].bounds.X += CollectionsPage.widthToMoveActiveTab; + } + } + if (this.currentPage > 0 && this.backButton.containsPoint(x, y)) + { + this.currentPage = this.currentPage - 1; + Game1.playSound("shwip"); + this.backButton.scale = this.backButton.baseScale; + if (Game1.options.snappyMenus && Game1.options.gamepadControls && this.currentPage == 0) + { + this.currentlySnappedComponent = (ClickableComponent)this.forwardButton; + Game1.setMousePosition(this.currentlySnappedComponent.bounds.Center); + } + } + ClickableTextureComponent texture; + foreach (ClickableTextureComponent textureComponent in this.collections[0][this.currentPage]) + { + if (textureComponent.containsPoint(x, y)) + { + string[] s = textureComponent.name.Split(' '); + ModCore.CoreMonitor.Log(s[0]); + ModCore.CoreMonitor.Log("CLICKED A THING!"); + UtilityCore.SeedCropUtility.updateUserUtilities(Convert.ToInt32(s[0]), 0.05f); + textureComponent.scale = Game1.pixelZoom * (1 + UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0]))); + if (UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0]))==0) textureComponent.scale = 1.00f; + texture = textureComponent; + } + } + if (this.currentPage >= this.collections[this.currentTab].Count - 1 || !this.forwardButton.containsPoint(x, y)) + return; + this.currentPage = this.currentPage + 1; + Game1.playSound("shwip"); + this.forwardButton.scale = this.forwardButton.baseScale; + if (!Game1.options.snappyMenus || !Game1.options.gamepadControls || this.currentPage != this.collections[this.currentTab].Count - 1) + return; + this.currentlySnappedComponent = (ClickableComponent)this.backButton; + Game1.setMousePosition(this.currentlySnappedComponent.bounds.Center); + } + + public override void receiveRightClick(int x, int y, bool playSound = true) + { + foreach (ClickableTextureComponent textureComponent in this.collections[0][this.currentPage]) + { + if (textureComponent.containsPoint(x, y)) + { + string[] s = textureComponent.name.Split(' '); + ModCore.CoreMonitor.Log(s[0]); + ModCore.CoreMonitor.Log("CLICKED A THING!"); + UtilityCore.SeedCropUtility.updateUserUtilities(Convert.ToInt32(s[0]), -0.05f); + //ModCore.CoreMonitor.Log(textureComponent.scale.ToString()); + textureComponent.scale = Game1.pixelZoom * (1 + UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0]))); + if (UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0])) == 0) textureComponent.scale = 1.00f; + } + } + } + + public override void performHoverAction(int x, int y) + { + this.descriptionText = ""; + this.hoverText = ""; + this.value = -1; + int i = 0; + foreach (ClickableTextureComponent sideTab in this.sideTabs) + { + if (i != 0) break; + if (sideTab.containsPoint(x, y)) + { + this.hoverText = sideTab.hoverText; + return; + } + i++; + } + foreach (ClickableTextureComponent textureComponent in this.collections[this.currentTab][this.currentPage]) + { + if (textureComponent.containsPoint(x, y)) + { + string[] s = textureComponent.name.Split(' '); + + textureComponent.scale = Game1.pixelZoom * (1+ UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0]))); + if (UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0])) == 0) textureComponent.scale = 1.00f; + if (Convert.ToBoolean(textureComponent.name.Split(' ')[1]) || this.currentTab == 5) { + this.hoverText = this.createDescription(Convert.ToInt32(textureComponent.name.Split(' ')[0])); + this.hoverText += "\n\nAI Utility Value: " + UtilityCore.SeedCropUtility.CropSeedUtilityDictionary[(Convert.ToInt32(s[0]))]; + this.hoverText += "\n\nUser Utility Value: " + UtilityCore.SeedCropUtility.UserCropSeedUtilityDictionary[(Convert.ToInt32(s[0]))]; + this.hoverText += "\n\nTotal Utility Value: " + UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0])); + } + else + this.hoverText = "???"; + } + else + { + string[] s = textureComponent.name.Split(' '); + textureComponent.scale = Game1.pixelZoom * (1 + UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0]))); + if (UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0])) == 0) textureComponent.scale = 1.00f; + } + } + this.forwardButton.tryHover(x, y, 0.5f); + this.backButton.tryHover(x, y, 0.5f); + } + + public string createDescription(int index) + { + string str1 = ""; + string str2; + if (this.currentTab == 5) + { + string[] strArray = Game1.achievements[index].Split('^'); + str2 = str1 + strArray[0] + Environment.NewLine + Environment.NewLine + strArray[1]; + } + else + { + string[] strArray = Game1.objectInformation[index].Split('/'); + string str3 = strArray[4]; + string str4 = str1 + str3 + Environment.NewLine + Environment.NewLine + Game1.parseText(strArray[5], Game1.smallFont, Game1.tileSize * 4) + Environment.NewLine + Environment.NewLine; + if (strArray[3].Contains("Arch")) + { + string str5 = str4; + string str6; + if (!Game1.player.archaeologyFound.ContainsKey(index)) + str6 = ""; + else + str6 = Game1.content.LoadString("Strings\\UI:Collections_Description_ArtifactsFound", (object)Game1.player.archaeologyFound[index][0]); + str2 = str5 + str6; + } + else if (strArray[3].Contains("Cooking")) + { + string str5 = str4; + string str6; + if (!Game1.player.recipesCooked.ContainsKey(index)) + str6 = ""; + else + str6 = Game1.content.LoadString("Strings\\UI:Collections_Description_RecipesCooked", (object)Game1.player.recipesCooked[index]); + str2 = str5 + str6; + } + else if (strArray[3].Contains("Fish")) + { + str2 = str4 + Game1.content.LoadString("Strings\\UI:Collections_Description_FishCaught", (object)(Game1.player.fishCaught.ContainsKey(index) ? Game1.player.fishCaught[index][0] : 0)); + if (Game1.player.fishCaught.ContainsKey(index) && Game1.player.fishCaught[index][1] > 0) + str2 = str2 + Environment.NewLine + Game1.content.LoadString("Strings\\UI:Collections_Description_BiggestCatch", (object)(LocalizedContentManager.CurrentLanguageCode != LocalizedContentManager.LanguageCode.en ? Math.Round((double)Game1.player.fishCaught[index][1] * 2.54) : (double)Game1.player.fishCaught[index][1])); + } + else if (strArray[3].Contains("Minerals") || strArray[3].Substring(strArray[3].Length - 3).Equals("-2")) + str2 = str4 + Game1.content.LoadString("Strings\\UI:Collections_Description_MineralsFound", (object)(Game1.player.mineralsFound.ContainsKey(index) ? Game1.player.mineralsFound[index] : 0)); + else + str2 = str4 + Game1.content.LoadString("Strings\\UI:Collections_Description_NumberShipped", (object)(Game1.player.basicShipped.ContainsKey(index) ? Game1.player.basicShipped[index] : 0)); + this.value = Convert.ToInt32(strArray[1]); + } + return str2; + } + + public override void draw(SpriteBatch b) + { + Game1.drawDialogueBox(this.xPositionOnScreen, this.yPositionOnScreen, this.width, this.height, false, true); + int i = 0; + foreach (ClickableTextureComponent sideTab in this.sideTabs) + { + sideTab.draw(b); + i++; + if (i != 0) break; + } + if (this.currentPage > 0) + this.backButton.draw(b); + if (this.currentPage < this.collections[this.currentTab].Count - 1) + this.forwardButton.draw(b); + b.End(); + b.Begin(SpriteSortMode.FrontToBack, BlendState.NonPremultiplied, SamplerState.PointClamp, (DepthStencilState)null, (RasterizerState)null); + foreach (ClickableTextureComponent textureComponent in this.collections[0][this.currentPage]) + { + bool boolean = Convert.ToBoolean(textureComponent.name.Split(' ')[1]); + textureComponent.draw(b, boolean ? Color.White : Color.Black * 0.2f, 0.86f); + if (this.currentTab == 5 & boolean) + { + int num = new Random(Convert.ToInt32(textureComponent.name.Split(' ')[0])).Next(12); + b.Draw(Game1.mouseCursors, new Vector2((float)(textureComponent.bounds.X + 16 + Game1.tileSize / 4), (float)(textureComponent.bounds.Y + 20 + Game1.tileSize / 4)), new Rectangle?(new Rectangle(256 + num % 6 * Game1.tileSize / 2, 128 + num / 6 * Game1.tileSize / 2, Game1.tileSize / 2, Game1.tileSize / 2)), Color.White, 0.0f, new Vector2((float)(Game1.tileSize / 4), (float)(Game1.tileSize / 4)), textureComponent.scale, SpriteEffects.None, 0.88f); + } + } + b.End(); + b.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, (DepthStencilState)null, (RasterizerState)null); + if (this.hoverText.Equals("")) + { + this.drawMouse(b); + return; + } + IClickableMenu.drawHoverText(b, this.hoverText, Game1.smallFont, 0, 0, this.value, (string)null, -1, (string[])null, (Item)null, 0, -1, -1, -1, -1, 1f, (CraftingRecipe)null); + this.drawMouse(b); + } + } +} \ No newline at end of file diff --git a/StarAI/StarAI/ModCore.cs b/StarAI/StarAI/ModCore.cs index 37c587d0..3de56ddb 100644 --- a/StarAI/StarAI/ModCore.cs +++ b/StarAI/StarAI/ModCore.cs @@ -90,13 +90,17 @@ namespace StarAI Game1.endOfNightMenus = menus; } + + private void SaveEvents_AfterLoad(object sender, EventArgs e) { // loadExceptionTiles(); CheatCore.DoorsToWarps.makeAllDoorsWarps(); WayPoints.setUpBedWaypoint(); WayPoints.verifyWayPoints(); - UtilityCore.SeedCropUtility.setUpCropUtilityDictionaryDaily(); + UtilityCore.SeedCropUtility.setUpUserCropUtilityDictionary(); //Runs once + UtilityCore.SeedCropUtility.setUpCropUtilityDictionaryDaily(); //Runs daily + } private void ControlEvents_KeyPressed(object sender, StardewModdingAPI.Events.EventArgsKeyPressed e) @@ -169,7 +173,13 @@ namespace StarAI { ShopCore.ShopLogic.openSeedShopMenu(); } - if (e.KeyPressed == Microsoft.Xna.Framework.Input.Keys.U) + + if (e.KeyPressed == Microsoft.Xna.Framework.Input.Keys.T) + { + Game1.activeClickableMenu = new MenuCore.CropUtilityMenu((int)(Game1.viewport.Width * .1f), (int)(Game1.viewport.Height * .05f), (int)(Game1.viewport.Width*.7f),(int)(Game1.viewport.Height*.75f)); + } + + if (e.KeyPressed == Microsoft.Xna.Framework.Input.Keys.U) { ExecutionCore.TaskList.printAllTaskMetaData(); foreach(var v in PathFindingCore.Utilities.tileExceptionList) diff --git a/StarAI/StarAI/StarAI.csproj b/StarAI/StarAI/StarAI.csproj index 146a3504..406a9b3a 100644 --- a/StarAI/StarAI/StarAI.csproj +++ b/StarAI/StarAI/StarAI.csproj @@ -69,6 +69,7 @@ + diff --git a/StarAI/StarAI/UtilityCore/SeedCropUtility.cs b/StarAI/StarAI/UtilityCore/SeedCropUtility.cs index 2be29de1..82426498 100644 --- a/StarAI/StarAI/UtilityCore/SeedCropUtility.cs +++ b/StarAI/StarAI/UtilityCore/SeedCropUtility.cs @@ -9,35 +9,129 @@ namespace StarAI.UtilityCore { class SeedCropUtility { - public static Dictionary, float> CropSeedUtilityDictionary = new Dictionary, float>(); + public static Dictionary CropSeedUtilityDictionary = new Dictionary(); + public static Dictionary UserCropSeedUtilityDictionary = new Dictionary(); + public static Dictionary ScaleUtilityDictionary = new Dictionary(); - public static void setUpCropUtilityDictionaryDaily() + public static void setUpUserCropUtilityDictionary() { - CropSeedUtilityDictionary.Clear(); - int numberOfInitializedUtilitySeedValues = 0; - foreach(var item in Game1.objectInformation) + UserCropSeedUtilityDictionary.Clear(); + Dictionary, float> tempDictionary = new Dictionary, float>(); + foreach (var item in Game1.objectInformation) { StardewValley.Object test = new StardewValley.Object(item.Key, 1); if (test.getCategoryName() == "Seed") { - KeyValuePair pair = StarAI.TaskCore.CropLogic.SeedLogic.getSeedCropPair(test.parentSheetIndex); - if (pair.Value == null) continue; - if (!pair.Value.seasonsToGrowIn.Contains(Game1.currentSeason)) continue; - float utilityValue = averageGoldPerDay(pair.Value,test); + KeyValuePair pair = StarAI.TaskCore.CropLogic.SeedLogic.getSeedCropPair(test.parentSheetIndex); - if (utilityValue <= 0) continue; - CropSeedUtilityDictionary.Add(pair, utilityValue); //CHANGE THIS TO BE BASED ON THE MENU UTILITY - numberOfInitializedUtilitySeedValues++; - ModCore.CoreMonitor.Log("Star AI: Utility Core: Calculating " + test.name + " for utility picking with a value of: "+utilityValue.ToString()); + + if (pair.Value == null) continue; + //if (utilityValue <= 0) continue; + UserCropSeedUtilityDictionary.Add(test.parentSheetIndex, 0); //CHANGE THIS TO BE BASED ON THE MENU UTILITY + //numberOfInitializedUtilitySeedValues++; + ModCore.CoreMonitor.Log("Star AI: Utility Core: Calculating " + test.name + " for user utility picking with a value of: 0"); } } + ModCore.CoreMonitor.Log("UTIL COUNT:" + UserCropSeedUtilityDictionary.Count); + } + + public static void setUpCropUtilityDictionaryDaily() + { + CropSeedUtilityDictionary.Clear(); + Dictionary tempDictionary = new Dictionary(); + int numberOfInitializedUtilitySeedValues = 0; + float totalValue = 0; + foreach (var item in Game1.objectInformation) + { + StardewValley.Object test = new StardewValley.Object(item.Key, 1); + if (test.getCategoryName() == "Seed") + { + KeyValuePair pair = StarAI.TaskCore.CropLogic.SeedLogic.getSeedCropPair(test.parentSheetIndex); + if (pair.Value == null) continue; + + float utilityValue = averageGoldPerDay(pair.Value, test); + if (!pair.Value.seasonsToGrowIn.Contains(Game1.currentSeason)) utilityValue = 0; + totalValue += utilityValue; + utilityValue =(float) Math.Round(utilityValue, 2); + //if (utilityValue <= 0) continue; + tempDictionary.Add(test.parentSheetIndex, utilityValue); //CHANGE THIS TO BE BASED ON THE MENU UTILITY + numberOfInitializedUtilitySeedValues++; + //ModCore.CoreMonitor.Log("Star AI: Utility Core: Calculating " + test.name + " for utility picking with a value of: "+utilityValue.ToString()); + } + } + + foreach (var c in tempDictionary) + { + KeyValuePair hello = c; + float afterValue = hello.Value / totalValue; + CropSeedUtilityDictionary.Add(hello.Key, afterValue); + StardewValley.Object test = new StardewValley.Object(c.Key, 1); + ModCore.CoreMonitor.Log("Star AI: Utility Core: Calculating " + test.name + " for utility picking value of (" + hello.Value + " : " + (afterValue * 100).ToString() + "%)"); + } ModCore.CoreMonitor.Log("Star AI: Utility Core: Calculating " + numberOfInitializedUtilitySeedValues + " seeds for utility picking."); if (numberOfInitializedUtilitySeedValues == 0) { - ModCore.CoreMonitor.Log("No seed values initialized. There must be no possible seeds I can grow for the rest of this season.",StardewModdingAPI.LogLevel.Alert); + ModCore.CoreMonitor.Log("No seed values initialized. There must be no possible seeds I can grow for the rest of this season.", StardewModdingAPI.LogLevel.Alert); } + recalculateAllUtilityValues(); } + + public static void recalculateAllUtilityValues() + { + ScaleUtilityDictionary.Clear(); + float totalValue = 0; + foreach(var v in CropSeedUtilityDictionary) + { + totalValue +=Math.Abs(v.Value); + } + foreach (var v in UserCropSeedUtilityDictionary) + { + totalValue +=Math.Abs(v.Value); + } + Dictionary ok = new Dictionary(); + foreach(var v in CropSeedUtilityDictionary) + { + ok.Add(v.Key, v.Value); + } + + Dictionary ok2 = new Dictionary(); + foreach (var v in UserCropSeedUtilityDictionary) + { + ok2.Add(v.Key, v.Value); + } + + foreach (var v in ok) + { + CropSeedUtilityDictionary[v.Key] = CropSeedUtilityDictionary[v.Key] / totalValue; + } + foreach (var v in ok2) + { + UserCropSeedUtilityDictionary[v.Key] = UserCropSeedUtilityDictionary[v.Key] / totalValue; + } + ModCore.CoreMonitor.Log("TOTAL VALUE:"+totalValue.ToString()); + + foreach (var v in CropSeedUtilityDictionary) + { + float scale = CropSeedUtilityDictionary[v.Key] + UserCropSeedUtilityDictionary[v.Key]; + if (scale <= 0) + { + scale = 0; + } + ScaleUtilityDictionary.Add(v.Key,scale); + StardewValley.Object obj = new StardewValley.Object(v.Key, 1); + ModCore.CoreMonitor.Log("Updated: " + obj.name + " to now have a percent utility contribution of: "+ (CropSeedUtilityDictionary[v.Key] + UserCropSeedUtilityDictionary[v.Key]).ToString()); + } + + } + + public static float getUtilityScaleValue(int seedIndex) + { + return ScaleUtilityDictionary[seedIndex]; + } + + + public static int numberOfDaysToGrow(Crop c) { int total = 0; @@ -48,6 +142,18 @@ namespace StarAI.UtilityCore return (total-100000+1); } + public static void updateUserUtilities(int seedIndex,float amount) + { + + ModCore.CoreMonitor.Log("This is the seed index:" + seedIndex); + UserCropSeedUtilityDictionary[seedIndex] += amount; + //if (UserCropSeedUtilityDictionary[seedIndex] <= 0) UserCropSeedUtilityDictionary[seedIndex] = 0; + UserCropSeedUtilityDictionary[seedIndex] = (float) Math.Round(UserCropSeedUtilityDictionary[seedIndex], 2); + StardewValley.Object obj = new StardewValley.Object(seedIndex, 1); + ModCore.CoreMonitor.Log("Updated: " + obj.name + " to now have a user utility value of " + UserCropSeedUtilityDictionary[seedIndex] + " and a total utlity value of: " +(UserCropSeedUtilityDictionary[seedIndex] + CropSeedUtilityDictionary[seedIndex])); + recalculateAllUtilityValues(); + } + //Doesn't recalculate crops that regrow. Favors crops with mutiple yields. Quantity over quality I suppose. public static float averageGoldPerDay(Crop c,Item seeds) @@ -80,16 +186,16 @@ namespace StarAI.UtilityCore public static List sortSeedListByUtility(List seedList) { - List, float>> sortList = new List, float>>(); + List> sortList = new List>(); foreach(var seeds in seedList) { - var ret = getKeyPairValueBySeedIndex(seeds.parentSheetIndex); - if (ret.Key.Key == -999) continue; + var ret = getKeyBySeedIndex(seeds.parentSheetIndex,ScaleUtilityDictionary); + if (ret.Key == -999) continue; sortList.Add(ret); } //Sort the list by utility of the seeds. - sortList.Sort(delegate (KeyValuePair < KeyValuePair < int, Crop >,float> t1, KeyValuePair, float> t2) + sortList.Sort(delegate (KeyValuePair < int,float> t1, KeyValuePair t2) { return t1.Value.CompareTo(t2.Value); }); @@ -100,7 +206,7 @@ namespace StarAI.UtilityCore List finalList = new List(); foreach(var utilitySeed in sortList) { - if (utilitySeed.Value >= maxUtility) finalList.Add(utilitySeed.Key.Key); + if (utilitySeed.Value >= maxUtility) finalList.Add(utilitySeed.Key); } List finalShopStock = new List(); foreach(var seedIndex in finalList) @@ -114,13 +220,15 @@ namespace StarAI.UtilityCore return finalShopStock; } - public static KeyValuePair,float> getKeyPairValueBySeedIndex(int seedIndex) + + + public static KeyValuePair getKeyBySeedIndex(int seedIndex,Dictionary dic) { - foreach(var key in CropSeedUtilityDictionary) + foreach (var key in dic) { - if (key.Key.Key == seedIndex) return key; - } - return new KeyValuePair, float>(new KeyValuePair(-999,null),-999); + if (key.Key == seedIndex) return key; + } + return new KeyValuePair(-999, -999); } }