diff --git a/stardew-access/API.cs b/stardew-access/API.cs index c97ecf5..e967ee0 100644 --- a/stardew-access/API.cs +++ b/stardew-access/API.cs @@ -1,3 +1,6 @@ +using Microsoft.Xna.Framework; +using stardew_access.Features; + namespace stardew_access.ScreenReader { public class API @@ -7,6 +10,16 @@ namespace stardew_access.ScreenReader { } + public (string?, string?) GetNameWithCategoryNameAtTile(Vector2 tile) + { + return ReadTile.getNameWithCategoryNameAtTile(tile); + } + + public string? GetNameAtTile(Vector2 tile) + { + return ReadTile.getNameAtTile(tile); + } + public void Say(String text, Boolean interrupt) { if (MainClass.GetScreenReader() == null) diff --git a/stardew-access/Features/CurrentPlayer.cs b/stardew-access/Features/CurrentPlayer.cs index 820d997..1bc15cd 100644 --- a/stardew-access/Features/CurrentPlayer.cs +++ b/stardew-access/Features/CurrentPlayer.cs @@ -1,21 +1,20 @@ using StardewValley; -using StardewModdingAPI; using Microsoft.Xna.Framework; -namespace stardew_access.Game +namespace stardew_access.Features { internal class CurrentPlayer { public static int getHealth() { - if(Game1.player == null) + if (Game1.player == null) return 0; int maxHealth = Game1.player.maxHealth; int currentHealth = Game1.player.health; - int healthPercentage = (int) (currentHealth * 100)/maxHealth; + int healthPercentage = (int)(currentHealth * 100) / maxHealth; return healthPercentage; } @@ -57,7 +56,7 @@ namespace stardew_access.Game int minutes = timeOfDay % 100; int hours = timeOfDay / 100; string amOrpm = "A M"; - if(hours>=12) + if (hours >= 12) { amOrpm = "P M"; if (hours > 12) @@ -84,7 +83,7 @@ namespace stardew_access.Game public static int getMoney() { - if(Game1.player == null) + if (Game1.player == null) return -1; return Game1.player.Money; diff --git a/stardew-access/Features/Other.cs b/stardew-access/Features/Other.cs index 922ce59..a9d078e 100644 --- a/stardew-access/Features/Other.cs +++ b/stardew-access/Features/Other.cs @@ -1,7 +1,7 @@ using StardewValley; using System.Text.RegularExpressions; -namespace stardew_access.Game +namespace stardew_access.Features { internal class Other { diff --git a/stardew-access/Features/Radar.cs b/stardew-access/Features/Radar.cs index a3089a9..f96c67e 100644 --- a/stardew-access/Features/Radar.cs +++ b/stardew-access/Features/Radar.cs @@ -3,7 +3,7 @@ using StardewValley; using StardewValley.Objects; using StardewValley.TerrainFeatures; -namespace stardew_access.Game +namespace stardew_access.Features { /// @@ -28,12 +28,16 @@ namespace stardew_access.Game public static CATEGORY NPCs = new CATEGORY("npc"); public static CATEGORY Furnitures = new CATEGORY("furniture"); public static CATEGORY Flooring = new CATEGORY("flooring"); - public static CATEGORY Grass = new CATEGORY("grass"); + public static CATEGORY Debris = new CATEGORY("debris"); public static CATEGORY Crops = new CATEGORY("crop"); public static CATEGORY Trees = new CATEGORY("tree"); + public static CATEGORY Bush = new CATEGORY("bush"); public static CATEGORY Buildings = new CATEGORY("building"); public static CATEGORY MineItems = new CATEGORY("mine item"); + public static CATEGORY ResourceClumps = new CATEGORY("resource clump"); public static CATEGORY Chests = new CATEGORY("chest"); + public static CATEGORY JunimoBundle = new CATEGORY("bundle"); + public static CATEGORY Doors = new CATEGORY("door"); // Also includes ladders and elevators public static CATEGORY Others = new CATEGORY("other"); public static CATEGORY WaterTiles = new CATEGORY("water"); @@ -176,33 +180,11 @@ namespace stardew_access.Game { Dictionary> terrainFeature = Game1.currentLocation.terrainFeatures.FieldDict; - // Check for npcs - if (Game1.currentLocation.isCharacterAtTile(position) != null) + if (Game1.currentLocation.isObjectAtTile((int)position.X, (int)position.Y)) { - NPC npc = Game1.currentLocation.isCharacterAtTile(position); - if (!npcs.Contains(npc)) - { - if (npc.isVillager() || npc.CanSocialize) - PlaySoundAt(position, npc.displayName, CATEGORY.Farmers); // Villager - else - PlaySoundAt(position, npc.displayName, CATEGORY.NPCs); - } - } - // Check for animals - else if (ReadTile.getFarmAnimalAt(Game1.currentLocation, (int)position.X, (int)position.Y) != null) - { - string name = $"{ReadTile.getFarmAnimalAt(Game1.currentLocation, (int)position.X, (int)position.Y, onlyName: true)}"; - PlaySoundAt(position, name, CATEGORY.FarmAnimals); - } - // Check for water - else if (Game1.currentLocation.isWaterTile((int)position.X, (int)position.Y)) - { - PlaySoundAt(position, "water", CATEGORY.WaterTiles); - } - // Check for objects - else if (Game1.currentLocation.isObjectAtTile((int)position.X, (int)position.Y)) - { - string? objectName = ReadTile.getObjectNameAtTile((int)position.X, (int)position.Y); + (string?, CATEGORY) objDetails = ReadTile.getObjectAtTile((int)position.X, (int)position.Y); + string? objectName = objDetails.Item1; + CATEGORY category = objDetails.Item2; StardewValley.Object obj = Game1.currentLocation.getObjectAtTile((int)position.X, (int)position.Y); if (objectName != null) @@ -214,109 +196,25 @@ namespace stardew_access.Game if (!furnitures.Contains((Furniture)obj)) { furnitures.Add((Furniture)obj); - PlaySoundAt(position, objectName, CATEGORY.Furnitures); + PlaySoundAt(position, objectName, category); } } - else if (obj is Chest) - { - PlaySoundAt(position, objectName, CATEGORY.Chests); - } - else if (obj is not Furniture && obj is not Chest) - { - bool isMineItem = false; + else + PlaySoundAt(position, objectName, category); - if (objectName.Contains("node") || objectName.Contains("mystic stone") || objectName.Contains("jade stone")) - isMineItem = true; - else if (objectName.Contains("geode") || objectName.Contains("mine stone") || objectName.Contains("barrel") || objectName.Contains("item box")) - isMineItem = true; - - if (isMineItem) - PlaySoundAt(position, objectName, CATEGORY.MineItems); - else - PlaySoundAt(position, objectName, CATEGORY.Others); - } } } - // Check for terrain features - else if (terrainFeature.ContainsKey(position)) + else { - Netcode.NetRef tr = terrainFeature[position]; - string? terrain = ReadTile.getTerrainFeatureAtTile(tr); - if (terrain != null) + (string?, CATEGORY?) tileDetail = ReadTile.getNameWithCategoryAtTile(position); + if (tileDetail.Item1 != null) { - if (tr.Get() is HoeDirt) - { - PlaySoundAt(position, terrain, CATEGORY.Crops); - } - else if (tr.Get() is GiantCrop) - { - PlaySoundAt(position, terrain, CATEGORY.Crops); - } - else if (tr.Get() is Bush) - { - PlaySoundAt(position, terrain, CATEGORY.Others); - } - else if (tr.Get() is CosmeticPlant) - { - PlaySoundAt(position, terrain, CATEGORY.Furnitures); - } - else if (tr.Get() is Flooring) - { - PlaySoundAt(position, terrain, CATEGORY.Flooring); - } - else if (tr.Get() is FruitTree) - { - PlaySoundAt(position, terrain, CATEGORY.Trees); - } - else if (tr.Get() is Grass) - { - PlaySoundAt(position, terrain, CATEGORY.Grass); - } - else if (tr.Get() is Tree) - { - PlaySoundAt(position, terrain, CATEGORY.Trees); - } - else if (tr.Get() is Quartz) - { - PlaySoundAt(position, terrain, CATEGORY.Others); - } + if (tileDetail.Item2 == null) + tileDetail.Item2 = CATEGORY.Others; + + PlaySoundAt(position, tileDetail.Item1, tileDetail.Item2); } } - // Check for Mine ladders - else if (ReadTile.isMineDownLadderAtTile((int)position.X, (int)position.Y)) - { - PlaySoundAt(position, "ladder", CATEGORY.Buildings); - } - else if (ReadTile.isMineUpLadderAtTile((int)position.X, (int)position.Y)) - { - PlaySoundAt(position, "ladder", CATEGORY.Buildings); - } - else if (ReadTile.isElevatorAtTile((int)position.X, (int)position.Y)) - { - PlaySoundAt(position, "ladder", CATEGORY.Buildings); - } - // Check for doors - else if (ReadTile.getDoorAtTile((int)position.X, (int)position.Y) != null) - { - PlaySoundAt(position, "door", CATEGORY.Buildings); - } - // Check for buildings on maps - else if (ReadTile.getTileInfo((int)position.X, (int)position.Y).Item2 != null) - { - (CATEGORY?, string?) item = ReadTile.getTileInfo((int)position.X, (int)position.Y); - if (item.Item2 != null && item.Item1 != null) - PlaySoundAt(position, item.Item2, item.Item1); - } - // Check for resource clumps - else if (ReadTile.getResourceClumpAtTile((int)position.X, (int)position.Y) != null) - { - PlaySoundAt(position, "resource clump", CATEGORY.MineItems); - } - // Check for junimo bundle - else if (ReadTile.getJunimoBundleAt((int)position.X, (int)position.Y) != null) - { - PlaySoundAt(position, "junimo bundle", CATEGORY.Chests); - } } catch (Exception e) { @@ -431,7 +329,7 @@ namespace stardew_access.Game soundName = $"obj{soundName}"; else if (category == CATEGORY.Chests) // Chests soundName = $"obj{soundName}"; - else if (category == CATEGORY.Grass) // Grass + else if (category == CATEGORY.Debris) // Grass and debris soundName = $"obj{soundName}"; else if (category == CATEGORY.Flooring) // Flooring soundName = $"obj{soundName}"; diff --git a/stardew-access/Features/ReadTile.cs b/stardew-access/Features/ReadTile.cs index 5be8094..1673e65 100644 --- a/stardew-access/Features/ReadTile.cs +++ b/stardew-access/Features/ReadTile.cs @@ -6,7 +6,7 @@ using StardewValley.Locations; using StardewValley.Objects; using StardewValley.TerrainFeatures; -namespace stardew_access.Game +namespace stardew_access.Features { public class ReadTile { @@ -71,6 +71,117 @@ namespace stardew_access.Game isReadingTile = false; } + ///Returns the name of the object at tile alongwith it's category's name + public static (string?, string?) getNameWithCategoryNameAtTile(Vector2 tile) + { + (string?, CATEGORY?) tileDetail = getNameWithCategoryAtTile(tile); + + if (tileDetail.Item2 == null) + tileDetail.Item2 = CATEGORY.Others; + + return (tileDetail.Item1, tileDetail.Item2.ToString()); + } + + ///Returns the name of the object at tile alongwith it's category + public static (string?, CATEGORY?) getNameWithCategoryAtTile(Vector2 tile) + { + int x = (int)tile.X; + int y = (int)tile.Y; + string? toReturn = ""; + CATEGORY? category = CATEGORY.Others; + + bool isColliding = isCollidingAtTile(x, y); + Dictionary> terrainFeature = Game1.currentLocation.terrainFeatures.FieldDict; + string? door = getDoorAtTile(x, y); + (CATEGORY?, string?) tileInfo = getTileInfo(x, y); + string? junimoBundle = getJunimoBundleAt(x, y); + string? resourceClump = getResourceClumpAtTile(x, y); + string? farmAnimal = getFarmAnimalAt(Game1.currentLocation, x, y); + + if (Game1.currentLocation.isCharacterAtTile(tile) != null) + { + NPC npc = Game1.currentLocation.isCharacterAtTile(tile); + toReturn = npc.displayName; + if (npc.isVillager() || npc.CanSocialize) + category = CATEGORY.Farmers; + else + category = CATEGORY.NPCs; + } + else if (farmAnimal != null) + { + toReturn = farmAnimal; + category = CATEGORY.FarmAnimals; + } + else if (Game1.currentLocation.isWaterTile(x, y) && isColliding) + { + toReturn = "Water"; + category = CATEGORY.WaterTiles; + } + else if (Game1.currentLocation.isObjectAtTile(x, y)) + { + (string?, CATEGORY?) obj = getObjectAtTile(x, y); + toReturn = obj.Item1; + category = obj.Item2; + } + else if (terrainFeature.ContainsKey(tile)) + { + (string?, CATEGORY) tf = getTerrainFeatureAtTile(terrainFeature[tile]); + string? terrain = tf.Item1; + if (terrain != null) + { + toReturn = terrain; + category = tf.Item2; + } + + } + else if (Game1.currentLocation.getLargeTerrainFeatureAt(x, y) != null) + { + toReturn = getBushAtTile(x, y); + category = CATEGORY.Bush; + } + else if (resourceClump != null) + { + toReturn = resourceClump; + category = CATEGORY.ResourceClumps; + } + else if (door != null) + { + toReturn = door; + category = CATEGORY.Doors; + } + else if (isMineDownLadderAtTile(x, y)) + { + toReturn = "Ladder"; + category = CATEGORY.Doors; + } + else if (isMineUpLadderAtTile(x, y)) + { + toReturn = "Up Ladder"; + category = CATEGORY.Doors; + } + else if (isElevatorAtTile(x, y)) + { + toReturn = "Elevator"; + category = CATEGORY.Doors; + } + else if (tileInfo.Item2 != null) + { + toReturn = tileInfo.Item2; + category = tileInfo.Item1; + } + else if (junimoBundle != null) + { + toReturn = junimoBundle; + category = CATEGORY.JunimoBundle; + } + + if (toReturn == "") + return (null, category); + + return (toReturn, category); + } + + ///Returns the name of the object at tile public static string? getNameAtTile(Vector2 tile) { int x = (int)tile.X; @@ -100,11 +211,11 @@ namespace stardew_access.Game } else if (Game1.currentLocation.isObjectAtTile(x, y)) { - toReturn = getObjectNameAtTile(x, y); + toReturn = getObjectAtTile(x, y).Item1; } else if (terrainFeature.ContainsKey(tile)) { - string? terrain = getTerrainFeatureAtTile(terrainFeature[tile]); + string? terrain = getTerrainFeatureAtTile(terrainFeature[tile]).Item1; if (terrain != null) toReturn = terrain; } @@ -230,7 +341,8 @@ namespace stardew_access.Game return true; } - + if (Game1.currentLocation is Woods && getStumpsInWoods(x, y) != null) + return true; return false; } @@ -337,11 +449,14 @@ namespace stardew_access.Game return (null, null); } - public static string? getTerrainFeatureAtTile(Netcode.NetRef terrain) + public static (string?, CATEGORY) getTerrainFeatureAtTile(Netcode.NetRef terrain) { string? toReturn = null; + CATEGORY category = CATEGORY.Others; + if (terrain.Get() is HoeDirt) { + category = CATEGORY.Crops; HoeDirt dirt = (HoeDirt)terrain.Get(); if (dirt.crop != null) { @@ -376,6 +491,7 @@ namespace stardew_access.Game } else if (terrain.Get() is GiantCrop) { + category = CATEGORY.Crops; int whichCrop = ((GiantCrop)terrain.Get()).which.Value; switch (whichCrop) { @@ -392,6 +508,7 @@ namespace stardew_access.Game } else if (terrain.Get() is CosmeticPlant) { + category = CATEGORY.Furnitures; CosmeticPlant cosmeticPlant = (CosmeticPlant)terrain.Get(); toReturn = cosmeticPlant.textureName().ToLower(); @@ -403,6 +520,7 @@ namespace stardew_access.Game } else if (terrain.Get() is Flooring) { + category = CATEGORY.Flooring; Flooring flooring = (Flooring)terrain.Get(); bool isPathway = flooring.isPathway.Get(); bool isSteppingStone = flooring.isSteppingStone.Get(); @@ -417,22 +535,26 @@ namespace stardew_access.Game } else if (terrain.Get() is FruitTree) { + category = CATEGORY.Trees; toReturn = getFruitTree((FruitTree)terrain.Get()); } else if (terrain.Get() is Grass) { + category = CATEGORY.Debris; toReturn = "Grass"; } else if (terrain.Get() is Tree) { + category = CATEGORY.Trees; toReturn = getTree((Tree)terrain.Get()); } else if (terrain.Get() is Quartz) { + category = CATEGORY.MineItems; toReturn = "Quartz"; } - return toReturn; + return (toReturn, category); } public static string getFruitTree(FruitTree fruitTree) @@ -517,7 +639,7 @@ namespace stardew_access.Game return seedName; } - public static string? getObjectNameAtTile(int x, int y) + public static (string?, CATEGORY) getObjectAtTile(int x, int y) { string? toReturn = null; @@ -545,17 +667,17 @@ namespace stardew_access.Game case 784: case 785: case 786: - return "Weed"; + return ("Weed", CATEGORY.Debris); case 792: case 793: case 794: - return "Fertile weed"; + return ("Fertile weed", CATEGORY.Debris); case 319: case 320: case 321: - return "Ice crystal"; + return ("Ice crystal", CATEGORY.Debris); case 75: - return "Geode"; + return ("Geode", CATEGORY.MineItems); case 32: case 34: case 36: @@ -568,28 +690,28 @@ namespace stardew_access.Game case 54: case 56: case 58: - return "Coloured stone"; + return ("Coloured stone", CATEGORY.Debris); case 668: case 670: case 845: case 846: case 847: - return "Mine stone"; + return ("Mine stone", CATEGORY.MineItems); case 818: - return "Clay stone"; + return ("Clay stone", CATEGORY.Debris); case 816: case 817: - return "Fossil stone"; + return ("Fossil stone", CATEGORY.Debris); case 118: case 120: case 122: case 124: - return "Barrel"; + return ("Barrel", CATEGORY.MineItems); case 119: case 121: case 123: case 125: - return "Item box"; + return ("Item box", CATEGORY.MineItems); } if (Game1.currentLocation is Mine or MineShaft) @@ -597,61 +719,67 @@ namespace stardew_access.Game switch (index) { case 76: - return "Frozen geode"; + return ("Frozen geode", CATEGORY.MineItems); case 77: - return "Magma geode"; + return ("Magma geode", CATEGORY.MineItems); case 8: case 66: - return "Amethyst node"; + return ("Amethyst node", CATEGORY.MineItems); case 14: case 62: - return "Aquamarine node"; + return ("Aquamarine node", CATEGORY.MineItems); case 843: case 844: - return "Cinder shard node"; + return ("Cinder shard node", CATEGORY.MineItems); case 2: case 72: - return "Diamond node"; + return ("Diamond node", CATEGORY.MineItems); case 12: case 60: - return "Emerald node"; + return ("Emerald node", CATEGORY.MineItems); case 44: - return "Gem node"; + return ("Gem node", CATEGORY.MineItems); case 6: case 70: - return "Jade node"; + return ("Jade node", CATEGORY.MineItems); case 46: - return "Mystic stone"; + return ("Mystic stone", CATEGORY.MineItems); case 74: - return "Prismatic node"; + return ("Prismatic node", CATEGORY.MineItems); case 4: case 64: - return "Ruby node"; + return ("Ruby node", CATEGORY.MineItems); case 10: case 68: - return "Topaz node"; + return ("Topaz node", CATEGORY.MineItems); case 819: - return "Omni geode node"; + return ("Omni geode node", CATEGORY.MineItems); case 751: case 849: - return "Copper node"; + return ("Copper node", CATEGORY.MineItems); case 764: - return "Gold node"; + return ("Gold node", CATEGORY.MineItems); case 765: - return "Iridium node"; + return ("Iridium node", CATEGORY.MineItems); case 290: case 850: - return "Iron node"; + return ("Iron node", CATEGORY.MineItems); } } if (obj is Chest) { Chest chest = (Chest)obj; - toReturn = chest.DisplayName; + return (chest.DisplayName, CATEGORY.Chests); } - return toReturn; + if (obj is Furniture) + return (toReturn, CATEGORY.Furnitures); + + if (toReturn != null) + return (toReturn, CATEGORY.Others); + + return (null, CATEGORY.Others); } public static bool isMineDownLadderAtTile(int x, int y) diff --git a/stardew-access/ModEntry.cs b/stardew-access/ModEntry.cs index ea0224f..415dad3 100644 --- a/stardew-access/ModEntry.cs +++ b/stardew-access/ModEntry.cs @@ -1,4 +1,4 @@ -using stardew_access.Game; +using stardew_access.Features; using StardewModdingAPI; using StardewModdingAPI.Events; using StardewValley; diff --git a/stardew-access/Patches/MenuPatches.cs b/stardew-access/Patches/MenuPatches.cs index 7192003..18fbd4f 100644 --- a/stardew-access/Patches/MenuPatches.cs +++ b/stardew-access/Patches/MenuPatches.cs @@ -1,5 +1,5 @@ using Microsoft.Xna.Framework; -using stardew_access.Game; +using stardew_access.Features; using StardewModdingAPI; using StardewValley; using StardewValley.Menus;