From 38f69dd2e96775bac8995f715bf4d92de5d9bf59 Mon Sep 17 00:00:00 2001 From: Richard Mukalian Date: Mon, 17 Jun 2024 20:41:33 -0400 Subject: [PATCH 1/3] Experience bar now functions into the mastery levels --- UIInfoSuite2/UIElements/ExperienceBar.cs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/UIInfoSuite2/UIElements/ExperienceBar.cs b/UIInfoSuite2/UIElements/ExperienceBar.cs index eceb1c0a..4dc5947c 100644 --- a/UIInfoSuite2/UIElements/ExperienceBar.cs +++ b/UIInfoSuite2/UIElements/ExperienceBar.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using Microsoft.Xna.Framework; using StardewModdingAPI; using StardewModdingAPI.Enums; @@ -18,6 +18,7 @@ public partial class ExperienceBar #region Properties private readonly PerScreen _previousItem = new(); private readonly PerScreen _currentExperience = new(() => new int[5]); + private readonly PerScreen _currentMasteryXP = new(() => 0); private readonly PerScreen _currentLevelExtenderExperience = new(() => new int[5]); private readonly PerScreen _currentSkillLevel = new(() => 0); private readonly PerScreen _experienceRequiredToLevel = new(() => -1); @@ -261,7 +262,12 @@ private void InitializeExperiencePoints() _currentExperience.Value[i] = Game1.player.experiencePoints[i]; } - if (_levelExtenderApi != null) + if (Game1.player.Level >= 25) + { + _currentMasteryXP.Value = (int)Game1.stats.Get("MasteryExp"); + } + + if (_levelExtenderApi != null) { for (var i = 0; i < _currentLevelExtenderExperience.Value.Length; ++i) { @@ -323,7 +329,7 @@ private void UpdateExperience(int currentLevelIndex, bool displayExperience) if (displayExperience) { - if (ExperienceGainTextEnabled && _experienceRequiredToLevel.Value > 0) + if (ExperienceGainTextEnabled && _experienceRequiredToLevel.Value > 0 && Game1.player.Level < 25) { int currentExperienceToUse = Game1.player.experiencePoints[currentLevelIndex]; int previousExperienceToUse = _currentExperience.Value[currentLevelIndex]; @@ -342,6 +348,14 @@ private void UpdateExperience(int currentLevelIndex, bool displayExperience) ); } } + else if(Game1.player.Level >= 25 && ((int)Game1.stats.Get("MasteryExp") < 100000)) + { + int newMasteryXP = (int)Game1.stats.Get("MasteryExp") - _currentMasteryXP.Value; + _currentMasteryXP.Value = (int)Game1.stats.Get("MasteryExp"); + _displayedExperienceValues.Value.Add( + new DisplayedExperienceValue(newMasteryXP, Game1.player.getLocalPosition(Game1.viewport)) + ); + } _currentExperience.Value[currentLevelIndex] = Game1.player.experiencePoints[currentLevelIndex]; From cadf897be1ef7cd549cf1f5056a679f053e2bfc2 Mon Sep 17 00:00:00 2001 From: Richard Mukalian Date: Tue, 18 Jun 2024 00:36:20 -0400 Subject: [PATCH 2/3] The exp pop-ups and bar now function for mastery levels. --- UIInfoSuite2/UIElements/ExperienceBar.cs | 37 ++++++++++++------- .../DisplayedExperienceBar.cs | 12 +++++- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/UIInfoSuite2/UIElements/ExperienceBar.cs b/UIInfoSuite2/UIElements/ExperienceBar.cs index 4dc5947c..a9742e86 100644 --- a/UIInfoSuite2/UIElements/ExperienceBar.cs +++ b/UIInfoSuite2/UIElements/ExperienceBar.cs @@ -6,6 +6,7 @@ using StardewModdingAPI.Utilities; using StardewValley; using StardewValley.Tools; +using StardewValley.Menus; using UIInfoSuite2.Compatibility; using UIInfoSuite2.Infrastructure; using UIInfoSuite2.Infrastructure.Extensions; @@ -313,10 +314,26 @@ private void UpdateExperience(int currentLevelIndex, bool displayExperience) _experienceFillColor.Value = ExperienceFillColor[(SkillType)currentLevelIndex]; _currentSkillLevel.Value = Game1.player.GetUnmodifiedSkillLevel(currentLevelIndex); - _experienceRequiredToLevel.Value = GetExperienceRequiredToLevel(_currentSkillLevel.Value); - _experienceFromPreviousLevels.Value = GetExperienceRequiredToLevel(_currentSkillLevel.Value - 1); - _experienceEarnedThisLevel.Value = - Game1.player.experiencePoints[currentLevelIndex] - _experienceFromPreviousLevels.Value; + + if (Game1.player.Level >= 25 && (MasteryTrackerMenu.getCurrentMasteryLevel() < 5)) + { + _experienceRequiredToLevel.Value = MasteryTrackerMenu.getMasteryExpNeededForLevel(MasteryTrackerMenu.getCurrentMasteryLevel() + 1); + _experienceFromPreviousLevels.Value = MasteryTrackerMenu.getMasteryExpNeededForLevel(MasteryTrackerMenu.getCurrentMasteryLevel()); + _experienceEarnedThisLevel.Value = (int)Game1.stats.Get("MasteryExp") - MasteryTrackerMenu.getMasteryExpNeededForLevel(MasteryTrackerMenu.getCurrentMasteryLevel()); + _currentMasteryXP.Value = (int)Game1.stats.Get("MasteryExp"); + + //TODO: I tried making this match the dark green from the mastery bar on the player menu but no matter what i did, it oversaturates and makes a bright color + _experienceFillColor.Value = new Color(0, 5, 0, 0.93f); + //TODO: Need to find a good icon to use for this (and also figure out how to implement that) + _experienceIconRectangle.Value = SkillIconRectangles[SkillType.Luck]; + //TODO: text overflows the EXP bar + } + else + { + _experienceRequiredToLevel.Value = GetExperienceRequiredToLevel(_currentSkillLevel.Value); + _experienceFromPreviousLevels.Value = GetExperienceRequiredToLevel(_currentSkillLevel.Value - 1); + _experienceEarnedThisLevel.Value = Game1.player.experiencePoints[currentLevelIndex] - _experienceFromPreviousLevels.Value; + } if (_experienceRequiredToLevel.Value <= 0 && _levelExtenderApi != null) { @@ -329,7 +346,7 @@ private void UpdateExperience(int currentLevelIndex, bool displayExperience) if (displayExperience) { - if (ExperienceGainTextEnabled && _experienceRequiredToLevel.Value > 0 && Game1.player.Level < 25) + if (ExperienceGainTextEnabled && _experienceRequiredToLevel.Value > 0) { int currentExperienceToUse = Game1.player.experiencePoints[currentLevelIndex]; int previousExperienceToUse = _currentExperience.Value[currentLevelIndex]; @@ -348,14 +365,6 @@ private void UpdateExperience(int currentLevelIndex, bool displayExperience) ); } } - else if(Game1.player.Level >= 25 && ((int)Game1.stats.Get("MasteryExp") < 100000)) - { - int newMasteryXP = (int)Game1.stats.Get("MasteryExp") - _currentMasteryXP.Value; - _currentMasteryXP.Value = (int)Game1.stats.Get("MasteryExp"); - _displayedExperienceValues.Value.Add( - new DisplayedExperienceValue(newMasteryXP, Game1.player.getLocalPosition(Game1.viewport)) - ); - } _currentExperience.Value[currentLevelIndex] = Game1.player.experiencePoints[currentLevelIndex]; @@ -383,5 +392,5 @@ private static int GetExperienceRequiredToLevel(int currentLevel) _ => -1 }; } -#endregion Logic + #endregion Logic } diff --git a/UIInfoSuite2/UIElements/ExperienceElements/DisplayedExperienceBar.cs b/UIInfoSuite2/UIElements/ExperienceElements/DisplayedExperienceBar.cs index 6987c98f..d4638b08 100644 --- a/UIInfoSuite2/UIElements/ExperienceElements/DisplayedExperienceBar.cs +++ b/UIInfoSuite2/UIElements/ExperienceElements/DisplayedExperienceBar.cs @@ -82,8 +82,18 @@ int currentLevel 0.85f ); + String levelNumber = ""; + if (Game1.player.Level < 25) + { + levelNumber = currentLevel.ToString(); + } + else + { + levelNumber = MasteryTrackerMenu.getCurrentMasteryLevel().ToString(); + } + Game1.drawWithBorder( - currentLevel.ToString(), + levelNumber, Color.Black * 0.6f, Color.Black, new Vector2(leftSide + 33, Game1.graphics.GraphicsDevice.Viewport.TitleSafeArea.Bottom - 70) From 6a0708f5bb07ed6af77c0f59eaf9b6be05134f71 Mon Sep 17 00:00:00 2001 From: Richard Mukalian Date: Tue, 18 Jun 2024 03:38:43 -0400 Subject: [PATCH 3/3] Fixed Color of the bar Added an icon Made the bar slightly wider to accommodate longer XP numbers Refactored some code to be a little cleaner --- UIInfoSuite2/UIElements/ExperienceBar.cs | 8 +-- .../DisplayedExperienceBar.cs | 54 ++++++++++++------- 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/UIInfoSuite2/UIElements/ExperienceBar.cs b/UIInfoSuite2/UIElements/ExperienceBar.cs index a9742e86..79771754 100644 --- a/UIInfoSuite2/UIElements/ExperienceBar.cs +++ b/UIInfoSuite2/UIElements/ExperienceBar.cs @@ -63,6 +63,7 @@ public partial class ExperienceBar private readonly PerScreen _levelUpIconRectangle = new(() => SkillIconRectangles[SkillType.Farming]); private readonly PerScreen _experienceFillColor = new(() => ExperienceFillColor[SkillType.Farming]); + private readonly PerScreen _experienceTextColor = new(() => Color.Black); private bool ExperienceBarFadeoutEnabled { get; set; } = true; private bool ExperienceGainTextEnabled { get; set; } = true; @@ -246,6 +247,7 @@ private void OnRenderingHud(object sender, RenderingHudEventArgs e) { _displayedExperienceBar.Value.Draw( _experienceFillColor.Value, + _experienceTextColor.Value, _experienceIconRectangle.Value, _experienceEarnedThisLevel.Value, _experienceRequiredToLevel.Value - _experienceFromPreviousLevels.Value, @@ -322,11 +324,9 @@ private void UpdateExperience(int currentLevelIndex, bool displayExperience) _experienceEarnedThisLevel.Value = (int)Game1.stats.Get("MasteryExp") - MasteryTrackerMenu.getMasteryExpNeededForLevel(MasteryTrackerMenu.getCurrentMasteryLevel()); _currentMasteryXP.Value = (int)Game1.stats.Get("MasteryExp"); - //TODO: I tried making this match the dark green from the mastery bar on the player menu but no matter what i did, it oversaturates and makes a bright color - _experienceFillColor.Value = new Color(0, 5, 0, 0.93f); - //TODO: Need to find a good icon to use for this (and also figure out how to implement that) + _experienceFillColor.Value = new Color(0, 0.443f, 0.243f , 1.0f); + _experienceTextColor.Value = Color.White; _experienceIconRectangle.Value = SkillIconRectangles[SkillType.Luck]; - //TODO: text overflows the EXP bar } else { diff --git a/UIInfoSuite2/UIElements/ExperienceElements/DisplayedExperienceBar.cs b/UIInfoSuite2/UIElements/ExperienceElements/DisplayedExperienceBar.cs index d4638b08..02266d5b 100644 --- a/UIInfoSuite2/UIElements/ExperienceElements/DisplayedExperienceBar.cs +++ b/UIInfoSuite2/UIElements/ExperienceElements/DisplayedExperienceBar.cs @@ -8,10 +8,11 @@ namespace UIInfoSuite2.UIElements.ExperienceElements; public class DisplayedExperienceBar { - private const int MaxBarWidth = 175; + private const int MaxBarWidth = 235; public void Draw( Color experienceFillColor, + Color textColor, Rectangle experienceIconPosition, int experienceEarnedThisLevel, int experienceDifferenceBetweenLevels, @@ -24,7 +25,7 @@ int currentLevel Game1.drawDialogueBox( (int)leftSide, Game1.graphics.GraphicsDevice.Viewport.TitleSafeArea.Bottom - 160, - 240, + 300, 160, false, true @@ -59,44 +60,57 @@ int currentLevel experienceFillColor ); - if (IsMouseOverExperienceBar(leftSide)) + if (IsMouseOverExperienceBar(leftSide)) { Game1.drawWithBorder( experienceEarnedThisLevel + "/" + experienceDifferenceBetweenLevels, - Color.Black, - Color.Black, + textColor, + textColor, new Vector2(leftSide + 33, Game1.graphics.GraphicsDevice.Viewport.TitleSafeArea.Bottom - 70) ); } else { - Game1.spriteBatch.Draw( - Game1.mouseCursors, - new Vector2(leftSide + 54, Game1.graphics.GraphicsDevice.Viewport.TitleSafeArea.Bottom - 62), - experienceIconPosition, - Color.White, - 0, - Vector2.Zero, - 2.9f, - SpriteEffects.None, - 0.85f - ); - String levelNumber = ""; + int masteryMargin = 0; if (Game1.player.Level < 25) { + Game1.spriteBatch.Draw( + Game1.mouseCursors, + new Vector2(leftSide + 54, Game1.graphics.GraphicsDevice.Viewport.TitleSafeArea.Bottom - 62), + experienceIconPosition, + Color.White, + 0, + Vector2.Zero, + 2.9f, + SpriteEffects.None, + 0.85f + ); levelNumber = currentLevel.ToString(); } else { + Game1.spriteBatch.Draw( + Game1.mouseCursors_1_6, + new Vector2(leftSide + 38, Game1.graphics.GraphicsDevice.Viewport.TitleSafeArea.Bottom - 62), + new Rectangle(458,299,10,10), + Color.White, + 0, + Vector2.Zero, + 2.9f, + SpriteEffects.None, + 0.85f + ); + levelNumber = MasteryTrackerMenu.getCurrentMasteryLevel().ToString(); + masteryMargin = 37; } Game1.drawWithBorder( levelNumber, - Color.Black * 0.6f, - Color.Black, - new Vector2(leftSide + 33, Game1.graphics.GraphicsDevice.Viewport.TitleSafeArea.Bottom - 70) + textColor * 0.6f, + textColor, + new Vector2(leftSide + 33 + masteryMargin, Game1.graphics.GraphicsDevice.Viewport.TitleSafeArea.Bottom - 70) ); } }