diff --git a/stardew-access/CustomSoundEffects.cs b/stardew-access/CustomSoundEffects.cs index f4c6d43..f9df3d1 100644 --- a/stardew-access/CustomSoundEffects.cs +++ b/stardew-access/CustomSoundEffects.cs @@ -23,6 +23,9 @@ namespace stardew_access soundEffects.Add("drop_item", TYPE.Sound); soundEffects.Add("colliding", TYPE.Sound); soundEffects.Add("invalid-selection", TYPE.Sound); + + soundEffects.Add("bobber_target_up", TYPE.Sound); + soundEffects.Add("bobber_target_down", TYPE.Sound); soundEffects.Add("npc_top", TYPE.Footstep); soundEffects.Add("npc_right", TYPE.Footstep); diff --git a/stardew-access/HarmonyPatches.cs b/stardew-access/HarmonyPatches.cs index 659cb28..44447dd 100644 --- a/stardew-access/HarmonyPatches.cs +++ b/stardew-access/HarmonyPatches.cs @@ -275,6 +275,12 @@ namespace stardew_access original: AccessTools.Method(typeof(GrandpaStory), nameof(GrandpaStory.draw), new Type[] { typeof(SpriteBatch) }), postfix: new HarmonyMethod(typeof(GrandpaStoryPatch), nameof(GrandpaStoryPatch.DrawPatch)) ); + + harmony.Patch( + original: AccessTools.Method(typeof(BobberBar), nameof(BobberBar.update)), + postfix: new HarmonyMethod(typeof(FishingMiniGamePatch), nameof(FishingMiniGamePatch.BobberBarPatch)) + ); + #endregion harmony.Patch( diff --git a/stardew-access/ModConfig.cs b/stardew-access/ModConfig.cs index 24d1241..fb3aa82 100644 --- a/stardew-access/ModConfig.cs +++ b/stardew-access/ModConfig.cs @@ -89,6 +89,9 @@ namespace stardew_access public Boolean DisableInventoryVerbosity {get; set;} = false; // If enabled, does not speaks 'not usable here' and 'donatable' in inventories #endregion + public int MaximumFishingDifficulty { get; set; } = 999; // TODO Add doc + public int FixFishingMotionType { get; set; } = 999; + // TODO Add the exclusion and focus list too // public String ExclusionList { get; set; } = "test"; } diff --git a/stardew-access/Patches/FishingMiniGamePatch.cs b/stardew-access/Patches/FishingMiniGamePatch.cs new file mode 100644 index 0000000..dd543fb --- /dev/null +++ b/stardew-access/Patches/FishingMiniGamePatch.cs @@ -0,0 +1,77 @@ +using StardewValley; +using StardewValley.Menus; + +namespace stardew_access.Patches { + internal class FishingMiniGamePatch { + private static ICue? progressSound = null; + private static long previousBobberTargetUpPlayedTime = 0; + private static long previousBobberTargetDownPlayedTime = 0; + + internal static void BobberBarPatch(BobberBar __instance, ref float ___difficulty, ref int ___motionType, float ___distanceFromCatching, float ___bobberPosition, float ___bobberBarPos, bool ___bobberInBar, int ___bobberBarHeight, bool ___fadeOut, bool ___fadeIn) { + try { + if (___difficulty > MainClass.Config.MaximumFishingDifficulty) { + MainClass.DebugLog($"Fish difficulty set to {MainClass.Config.MaximumFishingDifficulty} from {___difficulty}"); + ___difficulty = MainClass.Config.MaximumFishingDifficulty; + } + + if (___motionType != MainClass.Config.FixFishingMotionType && + (MainClass.Config.FixFishingMotionType >= 0 && MainClass.Config.FixFishingMotionType <= 4)) { + MainClass.DebugLog($"Motion type set to {MainClass.Config.FixFishingMotionType} from {___motionType}"); + ___motionType = MainClass.Config.FixFishingMotionType; + } + + handleProgressBarSound(___distanceFromCatching, ___fadeOut, ___fadeIn); + + handleBobberTargetSound(___bobberPosition, ___bobberBarPos, ___bobberInBar, ___bobberBarHeight, ___fadeOut, ___fadeIn); + } catch (System.Exception e) { + MainClass.ErrorLog($"An error occured while patching bobber bar:\n{e.Message}\n{e.StackTrace}"); + } + } + + private static void handleBobberTargetSound(float bobberPosition, float bobberBarPos, bool bobberInBar, int ___bobberBarHeight, bool ___fadeOut, bool ___fadeIn) { + if (bobberInBar) return; + if (___fadeIn) return; + if (___fadeOut) return; + + DateTimeOffset now = (DateTimeOffset)DateTime.UtcNow; + long currentTimeInMilliseconds = now.ToUnixTimeMilliseconds(); + + if(bobberPosition < bobberBarPos && (currentTimeInMilliseconds - previousBobberTargetUpPlayedTime) >= 250) { + previousBobberTargetUpPlayedTime = currentTimeInMilliseconds; + int distanceFromBobber = (int)(bobberBarPos - bobberPosition + (___bobberBarHeight / 2)); + int calculatedPitch = distanceFromBobber * 4; + MainClass.DebugLog(calculatedPitch.ToString()); + Game1.playSoundPitched("bobber_target_up", calculatedPitch); + } + + if(bobberPosition > bobberBarPos && (currentTimeInMilliseconds - previousBobberTargetDownPlayedTime) >= 250) { + previousBobberTargetDownPlayedTime = currentTimeInMilliseconds; + int distanceFromBobber = (int)(bobberPosition - bobberBarPos - (___bobberBarHeight / 2)); + int calculatedPitch = distanceFromBobber * 4; + MainClass.DebugLog(calculatedPitch.ToString()); + Game1.playSoundPitched("bobber_target_down", calculatedPitch); + } + } + + private static void handleProgressBarSound(float ___distanceFromCatching, bool ___fadeOut, bool ___fadeIn) { + if (Game1.soundBank == null) return; + + if (progressSound == null) { + progressSound = Game1.soundBank.GetCue("SinWave"); + } + + progressSound.SetVariable("Pitch", 2400f * ___distanceFromCatching); + // progressSound.SetVariable("Volume", 300f); + + if (___fadeIn && !progressSound.IsPlaying) { + // Start playing the sound on menu open + progressSound.Play(); + } + + if (___fadeOut && progressSound.IsPlaying) { + // Stop playing the sound on menu close + progressSound.Stop(Microsoft.Xna.Framework.Audio.AudioStopOptions.Immediate); + } + } + } +} diff --git a/stardew-access/assets/sounds/bobber_target_down.wav b/stardew-access/assets/sounds/bobber_target_down.wav new file mode 100644 index 0000000..629a584 Binary files /dev/null and b/stardew-access/assets/sounds/bobber_target_down.wav differ diff --git a/stardew-access/assets/sounds/bobber_target_up.wav b/stardew-access/assets/sounds/bobber_target_up.wav new file mode 100644 index 0000000..3514ca2 Binary files /dev/null and b/stardew-access/assets/sounds/bobber_target_up.wav differ