From ac9957954ee523437375cf4165e1a67e41cd767a Mon Sep 17 00:00:00 2001
From: shoaib11120 <shoaib.khan20@outlook.com>
Date: Mon, 17 Jan 2022 13:16:58 +0530
Subject: [PATCH] Adding sound cues

---
 stardew-access/Game/Radar.cs    | 161 ++++++++++++++++++++++++++++++++
 stardew-access/Game/ReadTile.cs |  16 ++++
 stardew-access/ModEntry.cs      |  28 +++++-
 3 files changed, 202 insertions(+), 3 deletions(-)
 create mode 100644 stardew-access/Game/Radar.cs

diff --git a/stardew-access/Game/Radar.cs b/stardew-access/Game/Radar.cs
new file mode 100644
index 0000000..29b907a
--- /dev/null
+++ b/stardew-access/Game/Radar.cs
@@ -0,0 +1,161 @@
+using Microsoft.Xna.Framework;
+using StardewValley;
+using StardewValley.Objects;
+using StardewValley.TerrainFeatures;
+using System.Diagnostics;
+
+namespace stardew_access.Game
+{
+    public class Radar
+    {
+        private List<Vector2> closed;
+        private List<Furniture> furnitures;
+        public List<string> exclusions;
+
+        public Radar()
+        {
+            closed = new List<Vector2>();
+            furnitures = new List<Furniture>();
+            exclusions = new List<string>();
+
+            exclusions.Add("stone");
+            exclusions.Add("weed");
+            exclusions.Add("twig");
+            exclusions.Add("coloured stone");
+            exclusions.Add("mine stone");
+            exclusions.Add("clay stone");
+            exclusions.Add("fossil stone");
+            exclusions.Add("crop");
+            exclusions.Add("giant crop");
+            exclusions.Add("grass");
+            exclusions.Add("tree");
+            exclusions.Add("flooring");
+        }
+
+        public void run()
+        {
+            Stopwatch sw = new Stopwatch();
+            sw.Start();
+            Vector2 currPosition = Game1.player.getTileLocation();
+            int limit = 5;
+
+            closed.Clear();
+            furnitures.Clear();
+            findTile(currPosition, currPosition, limit);
+            sw.Stop();
+            MainClass.monitor.Log($"Time taken:{sw.ElapsedMilliseconds}ms", StardewModdingAPI.LogLevel.Debug);
+        }
+
+        public void findTile(Vector2 position, Vector2 center, int limit)
+        {
+            if (Math.Abs(position.X - center.X) > limit)
+                return;
+            if (Math.Abs(position.Y - center.Y) > limit)
+                return;
+            if (closed.Contains(position))
+                return;
+
+            closed.Add(position);
+            checkTile(position);
+
+            Vector2 northPosition = new Vector2(position.X, position.Y-1);
+            Vector2 eastPosition = new Vector2(position.X+1, position.Y);
+            Vector2 westPosition = new Vector2(position.X-1, position.Y);
+            Vector2 southPosition = new Vector2(position.X, position.Y+1);
+
+            findTile(northPosition, center, limit);
+            findTile(eastPosition, center, limit);
+            findTile(westPosition, center, limit);
+            findTile(southPosition, center, limit);
+        }
+
+        public void checkTile(Vector2 position)
+        {
+            Dictionary<Vector2, Netcode.NetRef<TerrainFeature>> terrainFeature = Game1.currentLocation.terrainFeatures.FieldDict;
+
+            if (Game1.currentLocation.isObjectAtTile((int)position.X, (int)position.Y))
+            {
+                string? obj = ReadTile.getObjectNameAtTile((int)position.X, (int)position.Y);
+                StardewValley.Object @object = Game1.currentLocation.getObjectAtTile((int)position.X, (int)position.Y);
+
+                if (@object is Furniture)
+                {
+                    if (!furnitures.Contains(@object as Furniture))
+                    {
+                        furnitures.Add(@object as Furniture);
+                        Game1.currentLocation.localSoundAt("sa_poi", position);
+                        MainClass.monitor.Log($"FUR:{@object.DisplayName}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                    }
+                }
+                else if (!exclusions.Contains(obj.ToLower()))
+                {
+                    Game1.currentLocation.localSoundAt("sa_poi", position);
+                    MainClass.monitor.Log($"OBJ:{obj}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                }
+            }
+            else if (terrainFeature.ContainsKey(position))
+            {
+                Netcode.NetRef<TerrainFeature> tr = terrainFeature[position];
+                string? terrain = ReadTile.getTerrainFeatureAtTile(tr);
+                if (tr != null)
+                {
+                    if(tr.Get() is HoeDirt && !exclusions.Contains("crop"))
+                    {
+                        Game1.currentLocation.localSoundAt("sa_poi", position);
+                        MainClass.monitor.Log($"CROP:{terrain}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                    }
+                    else if(tr.Get() is GiantCrop && !exclusions.Contains("giant crop"))
+                    {
+                        Game1.currentLocation.localSoundAt("sa_poi", position);
+                        MainClass.monitor.Log($"BUSH:{terrain}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                    }
+                    else if (tr.Get() is Bush && !exclusions.Contains("bush"))
+                    {
+                        Game1.currentLocation.localSoundAt("sa_poi", position);
+                        MainClass.monitor.Log($"BUSH:{terrain}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                    }
+                    else if (tr.Get() is CosmeticPlant && !exclusions.Contains("cosmetic plant"))
+                    {
+                        Game1.currentLocation.localSoundAt("sa_poi", position);
+                        MainClass.monitor.Log($"COSMETIC_PLANT:{terrain}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                    }
+                    else if (tr.Get() is Flooring && !exclusions.Contains("flooring"))
+                    {
+                        Game1.currentLocation.localSoundAt("sa_poi", position);
+                        MainClass.monitor.Log($"FLOORING:{terrain}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                    }
+                    else if (tr.Get() is FruitTree && !exclusions.Contains("fruit tree"))
+                    {
+                        Game1.currentLocation.localSoundAt("sa_poi", position);
+                        MainClass.monitor.Log($"FRUTI_TREE:{terrain}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                    }
+                    else if (tr.Get() is Grass && !exclusions.Contains("grass"))
+                    {
+                        Game1.currentLocation.localSoundAt("sa_poi", position);
+                        MainClass.monitor.Log($"GRASS:{terrain}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                    }
+                    else if (tr.Get() is Tree && !exclusions.Contains("tree"))
+                    {
+                        Game1.currentLocation.localSoundAt("sa_poi", position);
+                        MainClass.monitor.Log($"TREE:{terrain}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                    }
+                    else if (tr.Get() is Quartz && !exclusions.Contains("quartz"))
+                    {
+                        Game1.currentLocation.localSoundAt("sa_poi", position);
+                        MainClass.monitor.Log($"QUARTZ:{terrain}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                    }
+                    else if (tr.Get() is Leaf && !exclusions.Contains("leaf"))
+                    {
+                        Game1.currentLocation.localSoundAt("sa_poi", position);
+                        MainClass.monitor.Log($"LEAF:{terrain}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                    }
+                    else if(!exclusions.Contains(terrain.ToLower()))
+                    {
+                        Game1.currentLocation.localSoundAt("sa_poi", position);
+                        MainClass.monitor.Log($"TERRAIN:{tr}\tX:{position.X}\tY:{position.Y}", StardewModdingAPI.LogLevel.Debug);
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/stardew-access/Game/ReadTile.cs b/stardew-access/Game/ReadTile.cs
index a9f0890..0c2d6bc 100644
--- a/stardew-access/Game/ReadTile.cs
+++ b/stardew-access/Game/ReadTile.cs
@@ -173,6 +173,22 @@ namespace stardew_access.Game
                         toReturn = "Fertilized " + toReturn;
                 }
             }
+            else if(terrain.Get() is GiantCrop)
+            {
+                int whichCrop = (terrain.Get() as GiantCrop).which.Value;
+                switch (whichCrop)
+                {
+                    case 0:
+                        toReturn = "Cauliflower";
+                        break;
+                    case 1:
+                        toReturn = "Melon";
+                        break;
+                    case 2:
+                        toReturn = "Pumpkin";
+                        break;
+                }
+            }
             else if (terrain.Get() is Bush)
             {
                 toReturn = "Bush";
diff --git a/stardew-access/ModEntry.cs b/stardew-access/ModEntry.cs
index 37ca32d..f65a959 100644
--- a/stardew-access/ModEntry.cs
+++ b/stardew-access/ModEntry.cs
@@ -21,6 +21,7 @@ namespace stardew_access
         public static IMonitor? monitor;
         AutoHotkeyEngine ahk;
         public static string hudMessageQueryKey = "";
+        public static Radar radar;
 
         /*********
         ** Public methods
@@ -54,6 +55,8 @@ namespace stardew_access
 
             harmony = new Harmony(ModManifest.UniqueID); // Init harmony
 
+            radar = new Radar();
+
             #endregion
 
             #region Harmony Patches
@@ -269,16 +272,29 @@ namespace stardew_access
                 collidingCueDef.instanceLimit = 1;
                 collidingCueDef.limitBehavior = CueDefinition.LimitBehavior.ReplaceOldest;
                 SoundEffect collidingAudio;
-                string collidingFilePath = Path.Combine(Path.Combine(this.Helper.DirectoryPath), "sounds/NPC.wav");
+                string collidingFilePath = Path.Combine(Path.Combine(this.Helper.DirectoryPath), "sounds/colliding.ogg");
                 using (FileStream stream = new(collidingFilePath, FileMode.Open))
                 {
                     collidingAudio = SoundEffect.FromStream(stream);
                 }
-                collidingCueDef.SetSound(collidingAudio, Game1.audioEngine.GetCategoryIndex("Sound"), false); 
+                collidingCueDef.SetSound(collidingAudio, Game1.audioEngine.GetCategoryIndex("Sound"), false);
+                #endregion
+
+                #region POI sound
+                CueDefinition poiCueDef = new CueDefinition();
+                poiCueDef.name = "sa_poi";
+                SoundEffect poiAudio;
+                string poiFilePath = Path.Combine(Path.Combine(this.Helper.DirectoryPath), "sounds/sound1.ogg");
+                using (FileStream stream = new(poiFilePath, FileMode.Open))
+                {
+                    poiAudio = SoundEffect.FromStream(stream);
+                }
+                poiCueDef.SetSound(poiAudio, Game1.audioEngine.GetCategoryIndex("Footsteps"), false);
                 #endregion
 
                 Game1.soundBank.AddCue(dropItemCueDef);
                 Game1.soundBank.AddCue(collidingCueDef);
+                Game1.soundBank.AddCue(poiCueDef);
             }
             catch (Exception e)
             {
@@ -345,10 +361,16 @@ namespace stardew_access
             }
 
             // Manual read tile
-            if(Equals(e.Button, SButton.J))
+            if (Equals(e.Button, SButton.J))
             {
                 ReadTile.run(manuallyTriggered: true);
             }
+
+            // Manual read tile
+            if (Equals(e.Button, SButton.B))
+            {
+                radar.run();
+            }
         }
 
         private void SnapMouseToPlayer()