Moved narrateHoveredItemInInventory to separate class
parent
042afa4d90
commit
80637af471
|
@ -303,31 +303,33 @@ namespace stardew_access.Patches
|
|||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < __instance.inventory.inventory.Count; i++)
|
||||
{
|
||||
if (!__instance.inventory.inventory[i].containsPoint(x, y))
|
||||
continue;
|
||||
|
||||
if (__instance.inventory.actualInventory[i] == null)
|
||||
toSpeak = "Empty slot";
|
||||
else
|
||||
{
|
||||
toSpeak = $"{__instance.inventory.actualInventory[i].Stack} {__instance.inventory.actualInventory[i].DisplayName}";
|
||||
|
||||
if (!__instance.inventory.highlightMethod(__instance.inventory.actualInventory[i]))
|
||||
{
|
||||
toSpeak = $"{toSpeak} not usable here";
|
||||
}
|
||||
}
|
||||
|
||||
if (fieldOfficeMenuQuery != $"{toSpeak}:{i}")
|
||||
{
|
||||
fieldOfficeMenuQuery = $"{toSpeak}:{i}";
|
||||
MainClass.ScreenReader.Say(toSpeak, true);
|
||||
}
|
||||
|
||||
if (InventoryUtils.narrateHoveredItemInInventory(__instance.inventory, __instance.inventory.inventory, __instance.inventory.actualInventory, x, y))
|
||||
return;
|
||||
}
|
||||
// for (int i = 0; i < __instance.inventory.inventory.Count; i++)
|
||||
// {
|
||||
// if (!__instance.inventory.inventory[i].containsPoint(x, y))
|
||||
// continue;
|
||||
//
|
||||
// if (__instance.inventory.actualInventory[i] == null)
|
||||
// toSpeak = "Empty slot";
|
||||
// else
|
||||
// {
|
||||
// toSpeak = $"{__instance.inventory.actualInventory[i].Stack} {__instance.inventory.actualInventory[i].DisplayName}";
|
||||
//
|
||||
// if (!__instance.inventory.highlightMethod(__instance.inventory.actualInventory[i]))
|
||||
// {
|
||||
// toSpeak = $"{toSpeak} not usable here";
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if (fieldOfficeMenuQuery != $"{toSpeak}:{i}")
|
||||
// {
|
||||
// fieldOfficeMenuQuery = $"{toSpeak}:{i}";
|
||||
// MainClass.ScreenReader.Say(toSpeak, true);
|
||||
// }
|
||||
//
|
||||
// return;
|
||||
// }
|
||||
|
||||
for (int i = 0; i < __instance.pieceHolders.Count; i++)
|
||||
{
|
||||
|
@ -414,4 +416,4 @@ namespace stardew_access.Patches
|
|||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,6 @@ namespace stardew_access.Patches
|
|||
internal static string profilePageQuery = "";
|
||||
internal static int currentSelectedCraftingRecipe = -1;
|
||||
internal static bool isSelectingRecipe = false;
|
||||
internal static int prevSlotIndex = -999;
|
||||
|
||||
internal static void CollectionsPagePatch(CollectionsPage __instance)
|
||||
{
|
||||
|
@ -241,7 +240,7 @@ namespace stardew_access.Patches
|
|||
#endregion
|
||||
|
||||
#region Narrate hovered item
|
||||
if (narrateHoveredItemInInventory(__instance.inventory, __instance.inventory.inventory, __instance.inventory.actualInventory, x, y, hoverPrice: __instance.hoverPrice))
|
||||
if (InventoryUtils.narrateHoveredItemInInventory(__instance.inventory, __instance.inventory.inventory, __instance.inventory.actualInventory, x, y, hoverPrice: __instance.hoverPrice))
|
||||
{
|
||||
shopMenuQueryKey = "";
|
||||
return;
|
||||
|
@ -396,7 +395,7 @@ namespace stardew_access.Patches
|
|||
#endregion
|
||||
|
||||
#region Narrate hovered item
|
||||
if (narrateHoveredItemInInventory(__instance.inventory, __instance.inventory.inventory, __instance.inventory.actualInventory, x, y))
|
||||
if (InventoryUtils.narrateHoveredItemInInventory(__instance.inventory, __instance.inventory.inventory, __instance.inventory.actualInventory, x, y))
|
||||
geodeMenuQueryKey = "";
|
||||
#endregion
|
||||
}
|
||||
|
@ -573,14 +572,14 @@ namespace stardew_access.Patches
|
|||
#endregion
|
||||
|
||||
#region Narrate hovered item
|
||||
if (narrateHoveredItemInInventory(__instance.inventory, __instance.inventory.inventory, __instance.inventory.actualInventory, x, y, true))
|
||||
if (InventoryUtils.narrateHoveredItemInInventory(__instance.inventory, __instance.inventory.inventory, __instance.inventory.actualInventory, x, y, true))
|
||||
{
|
||||
gameMenuQueryKey = "";
|
||||
itemGrabMenuQueryKey = "";
|
||||
return;
|
||||
}
|
||||
|
||||
if (narrateHoveredItemInInventory(__instance.ItemsToGrabMenu, __instance.ItemsToGrabMenu.inventory, __instance.ItemsToGrabMenu.actualInventory, x, y, true))
|
||||
if (InventoryUtils.narrateHoveredItemInInventory(__instance.ItemsToGrabMenu, __instance.ItemsToGrabMenu.inventory, __instance.ItemsToGrabMenu.actualInventory, x, y, true))
|
||||
{
|
||||
gameMenuQueryKey = "";
|
||||
itemGrabMenuQueryKey = "";
|
||||
|
@ -855,7 +854,7 @@ namespace stardew_access.Patches
|
|||
#endregion
|
||||
|
||||
#region Narrate hovered item
|
||||
if (narrateHoveredItemInInventory(__instance.inventory, __instance.inventory.inventory, __instance.inventory.actualInventory, x, y))
|
||||
if (InventoryUtils.narrateHoveredItemInInventory(__instance.inventory, __instance.inventory.inventory, __instance.inventory.actualInventory, x, y))
|
||||
{
|
||||
gameMenuQueryKey = "";
|
||||
craftingPageQueryKey = "";
|
||||
|
@ -1066,7 +1065,7 @@ namespace stardew_access.Patches
|
|||
#endregion
|
||||
|
||||
#region Narrate hovered item
|
||||
if (narrateHoveredItemInInventory(__instance.inventory, __instance.inventory.inventory, __instance.inventory.actualInventory, x, y, true))
|
||||
if (InventoryUtils.narrateHoveredItemInInventory(__instance.inventory, __instance.inventory.inventory, __instance.inventory.actualInventory, x, y, true))
|
||||
{
|
||||
gameMenuQueryKey = "";
|
||||
inventoryPageQueryKey = "";
|
||||
|
@ -1193,164 +1192,5 @@ namespace stardew_access.Patches
|
|||
MainClass.ErrorLog($"Unable to narrate Text:\n{e.Message}\n{e.StackTrace}");
|
||||
}
|
||||
}
|
||||
|
||||
internal static bool narrateHoveredItemInInventory(InventoryMenu inventoryMenu, List<ClickableComponent> inventory, IList<Item> actualInventory, int x, int y, bool giveExtraDetails = false, int hoverPrice = -1, int extraItemToShowIndex = -1, int extraItemToShowAmount = -1)
|
||||
{
|
||||
for (int i = 0; i < inventory.Count; i++)
|
||||
{
|
||||
if (!inventory[i].containsPoint(x, y)) continue;
|
||||
|
||||
if ((i + 1) > actualInventory.Count || actualInventory[i] == null)
|
||||
{
|
||||
// For empty slot
|
||||
checkAndSpeak("Empty Slot", i);
|
||||
prevSlotIndex = i;
|
||||
return true;
|
||||
}
|
||||
|
||||
string toSpeak = "";
|
||||
string name = $"{actualInventory[i].DisplayName}{handleUnHighlightedItem(inventoryMenu.highlightMethod(actualInventory[i]), i)}";
|
||||
int stack = actualInventory[i].Stack;
|
||||
string quality = getQualityFromItem(actualInventory[i]);
|
||||
string healthNStamine = getHealthNStaminaFromItem(actualInventory[i]);
|
||||
string buffs = getBuffsFromItem(actualInventory[i]);
|
||||
string description = actualInventory[i].getDescription();
|
||||
string price = getPrice(hoverPrice);
|
||||
string requirements = getExtraItemInfo(extraItemToShowIndex, extraItemToShowAmount);
|
||||
|
||||
if (giveExtraDetails)
|
||||
{
|
||||
if (stack > 1)
|
||||
toSpeak = $"{stack} {name} {quality}, \n{requirements}, \n{price}, \n{description}, \n{healthNStamine}, \n{buffs}";
|
||||
else
|
||||
toSpeak = $"{name} {quality}, \n{requirements}, \n{price}, \n{description}, \n{healthNStamine}, \n{buffs}";
|
||||
}
|
||||
else
|
||||
{
|
||||
if (stack > 1)
|
||||
toSpeak = $"{stack} {name} {quality}, \n{requirements}, \n{price}";
|
||||
else
|
||||
toSpeak = $"{name} {quality}, \n{requirements}, \n{price}";
|
||||
}
|
||||
|
||||
|
||||
checkAndSpeak(toSpeak, i);
|
||||
prevSlotIndex = i;
|
||||
return true;
|
||||
}
|
||||
|
||||
// If no slot is hovered
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void checkAndSpeak(String toSpeak, int hoveredInventoryIndex)
|
||||
{
|
||||
if (hoveredItemQueryKey == $"{toSpeak}:{hoveredInventoryIndex}") return;
|
||||
|
||||
hoveredItemQueryKey = $"{toSpeak}:{hoveredInventoryIndex}";
|
||||
MainClass.ScreenReader.Say(toSpeak, true);
|
||||
}
|
||||
|
||||
private static String getQualityFromItem(Item item)
|
||||
{
|
||||
if (item is not StardewValley.Object || ((StardewValley.Object)item).Quality <= 0)
|
||||
return "";
|
||||
|
||||
int qualityIndex = ((StardewValley.Object)item).Quality;
|
||||
if (qualityIndex == 1)
|
||||
{
|
||||
return "Silver quality";
|
||||
}
|
||||
else if (qualityIndex == 2 || qualityIndex == 3)
|
||||
{
|
||||
return "Gold quality";
|
||||
}
|
||||
else if (qualityIndex >= 4)
|
||||
{
|
||||
return "Iridium quality";
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
private static String getHealthNStaminaFromItem(Item item)
|
||||
{
|
||||
if (item is not StardewValley.Object || ((StardewValley.Object)item).Edibility == -300)
|
||||
return "";
|
||||
|
||||
String toReturn = "";
|
||||
int stamina_recovery = ((StardewValley.Object)item).staminaRecoveredOnConsumption();
|
||||
toReturn += $"{stamina_recovery} Energy";
|
||||
|
||||
if (stamina_recovery < 0) return toReturn;
|
||||
|
||||
int health_recovery = ((StardewValley.Object)item).healthRecoveredOnConsumption();
|
||||
toReturn += $"\n\t{health_recovery} Health";
|
||||
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
private static String getBuffsFromItem(Item item)
|
||||
{
|
||||
if (item == null) return "";
|
||||
if (item is not StardewValley.Object) return "";
|
||||
if (((StardewValley.Object)item) == null) return "";
|
||||
|
||||
// These variables are taken from the game's code itself (IClickableMenu.cs -> 1016 line)
|
||||
bool edibleItem = (int)((StardewValley.Object)item).Edibility != -300;
|
||||
string[]? buffIconsToDisplay = (edibleItem && Game1.objectInformation[((StardewValley.Object)item).ParentSheetIndex].Split('/').Length > 7)
|
||||
? item.ModifyItemBuffs(Game1.objectInformation[((StardewValley.Object)item).ParentSheetIndex].Split('/')[7].Split(' '))
|
||||
: null;
|
||||
|
||||
if (buffIconsToDisplay == null)
|
||||
return "";
|
||||
|
||||
String toReturn = "";
|
||||
for (int j = 0; j < buffIconsToDisplay.Length; j++)
|
||||
{
|
||||
string buffName = ((Convert.ToInt32(buffIconsToDisplay[j]) > 0) ? "+" : "") + buffIconsToDisplay[j] + " ";
|
||||
if (j <= 11)
|
||||
{
|
||||
buffName = Game1.content.LoadString("Strings\\UI:ItemHover_Buff" + j, buffName);
|
||||
}
|
||||
try
|
||||
{
|
||||
int count = int.Parse(buffName.Substring(0, buffName.IndexOf(' ')));
|
||||
if (count != 0)
|
||||
toReturn += $"{buffName}\n";
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
private static String getExtraItemInfo(int itemIndex, int itemAmount)
|
||||
{
|
||||
if (itemIndex == -1) return "";
|
||||
|
||||
string itemName = Game1.objectInformation[itemIndex].Split('/')[0];
|
||||
|
||||
if (itemAmount != -1)
|
||||
return $"Required: {itemAmount} {itemName}";
|
||||
else
|
||||
return $"Required: {itemName}";
|
||||
}
|
||||
|
||||
private static String getPrice(int price)
|
||||
{
|
||||
if (price == -1) return "";
|
||||
|
||||
return $"Sell Price: {price} g";
|
||||
}
|
||||
|
||||
private static String handleUnHighlightedItem(bool isHighlighted, int hoveredInventoryIndex)
|
||||
{
|
||||
if (isHighlighted) return "";
|
||||
|
||||
if (prevSlotIndex != hoveredInventoryIndex)
|
||||
Game1.playSound("invalid-selection");
|
||||
|
||||
return " not usable here";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,171 @@
|
|||
|
||||
using StardewValley;
|
||||
using StardewValley.Menus;
|
||||
|
||||
namespace stardew_access.Patches
|
||||
{
|
||||
internal class InventoryUtils
|
||||
{
|
||||
internal static string hoveredItemQueryKey = "";
|
||||
internal static int prevSlotIndex = -999;
|
||||
|
||||
internal static bool narrateHoveredItemInInventory(InventoryMenu inventoryMenu, List<ClickableComponent> inventory, IList<Item> actualInventory, int x, int y, bool giveExtraDetails = false, int hoverPrice = -1, int extraItemToShowIndex = -1, int extraItemToShowAmount = -1)
|
||||
{
|
||||
for (int i = 0; i < inventory.Count; i++)
|
||||
{
|
||||
if (!inventory[i].containsPoint(x, y)) continue;
|
||||
|
||||
if ((i + 1) > actualInventory.Count || actualInventory[i] == null)
|
||||
{
|
||||
// For empty slot
|
||||
checkAndSpeak("Empty Slot", i);
|
||||
prevSlotIndex = i;
|
||||
return true;
|
||||
}
|
||||
|
||||
string toSpeak = "";
|
||||
string name = $"{actualInventory[i].DisplayName}{handleUnHighlightedItem(inventoryMenu.highlightMethod(actualInventory[i]), i)}";
|
||||
int stack = actualInventory[i].Stack;
|
||||
string quality = getQualityFromItem(actualInventory[i]);
|
||||
string healthNStamine = getHealthNStaminaFromItem(actualInventory[i]);
|
||||
string buffs = getBuffsFromItem(actualInventory[i]);
|
||||
string description = actualInventory[i].getDescription();
|
||||
string price = getPrice(hoverPrice);
|
||||
string requirements = getExtraItemInfo(extraItemToShowIndex, extraItemToShowAmount);
|
||||
|
||||
if (giveExtraDetails)
|
||||
{
|
||||
if (stack > 1)
|
||||
toSpeak = $"{stack} {name} {quality}, \n{requirements}, \n{price}, \n{description}, \n{healthNStamine}, \n{buffs}";
|
||||
else
|
||||
toSpeak = $"{name} {quality}, \n{requirements}, \n{price}, \n{description}, \n{healthNStamine}, \n{buffs}";
|
||||
}
|
||||
else
|
||||
{
|
||||
if (stack > 1)
|
||||
toSpeak = $"{stack} {name} {quality}, \n{requirements}, \n{price}";
|
||||
else
|
||||
toSpeak = $"{name} {quality}, \n{requirements}, \n{price}";
|
||||
}
|
||||
|
||||
|
||||
checkAndSpeak(toSpeak, i);
|
||||
prevSlotIndex = i;
|
||||
return true;
|
||||
}
|
||||
|
||||
// If no slot is hovered
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void checkAndSpeak(String toSpeak, int hoveredInventoryIndex)
|
||||
{
|
||||
if (hoveredItemQueryKey == $"{toSpeak}:{hoveredInventoryIndex}") return;
|
||||
|
||||
hoveredItemQueryKey = $"{toSpeak}:{hoveredInventoryIndex}";
|
||||
MainClass.ScreenReader.Say(toSpeak, true);
|
||||
}
|
||||
|
||||
private static String getQualityFromItem(Item item)
|
||||
{
|
||||
if (item is not StardewValley.Object || ((StardewValley.Object)item).Quality <= 0)
|
||||
return "";
|
||||
|
||||
int qualityIndex = ((StardewValley.Object)item).Quality;
|
||||
if (qualityIndex == 1)
|
||||
{
|
||||
return "Silver quality";
|
||||
}
|
||||
else if (qualityIndex == 2 || qualityIndex == 3)
|
||||
{
|
||||
return "Gold quality";
|
||||
}
|
||||
else if (qualityIndex >= 4)
|
||||
{
|
||||
return "Iridium quality";
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
private static String getHealthNStaminaFromItem(Item item)
|
||||
{
|
||||
if (item is not StardewValley.Object || ((StardewValley.Object)item).Edibility == -300)
|
||||
return "";
|
||||
|
||||
String toReturn = "";
|
||||
int stamina_recovery = ((StardewValley.Object)item).staminaRecoveredOnConsumption();
|
||||
toReturn += $"{stamina_recovery} Energy";
|
||||
|
||||
if (stamina_recovery < 0) return toReturn;
|
||||
|
||||
int health_recovery = ((StardewValley.Object)item).healthRecoveredOnConsumption();
|
||||
toReturn += $"\n\t{health_recovery} Health";
|
||||
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
private static String getBuffsFromItem(Item item)
|
||||
{
|
||||
if (item == null) return "";
|
||||
if (item is not StardewValley.Object) return "";
|
||||
if (((StardewValley.Object)item) == null) return "";
|
||||
|
||||
// These variables are taken from the game's code itself (IClickableMenu.cs -> 1016 line)
|
||||
bool edibleItem = (int)((StardewValley.Object)item).Edibility != -300;
|
||||
string[]? buffIconsToDisplay = (edibleItem && Game1.objectInformation[((StardewValley.Object)item).ParentSheetIndex].Split('/').Length > 7)
|
||||
? item.ModifyItemBuffs(Game1.objectInformation[((StardewValley.Object)item).ParentSheetIndex].Split('/')[7].Split(' '))
|
||||
: null;
|
||||
|
||||
if (buffIconsToDisplay == null)
|
||||
return "";
|
||||
|
||||
String toReturn = "";
|
||||
for (int j = 0; j < buffIconsToDisplay.Length; j++)
|
||||
{
|
||||
string buffName = ((Convert.ToInt32(buffIconsToDisplay[j]) > 0) ? "+" : "") + buffIconsToDisplay[j] + " ";
|
||||
if (j <= 11)
|
||||
{
|
||||
buffName = Game1.content.LoadString("Strings\\UI:ItemHover_Buff" + j, buffName);
|
||||
}
|
||||
try
|
||||
{
|
||||
int count = int.Parse(buffName.Substring(0, buffName.IndexOf(' ')));
|
||||
if (count != 0)
|
||||
toReturn += $"{buffName}\n";
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
private static String getExtraItemInfo(int itemIndex, int itemAmount)
|
||||
{
|
||||
if (itemIndex == -1) return "";
|
||||
|
||||
string itemName = Game1.objectInformation[itemIndex].Split('/')[0];
|
||||
|
||||
if (itemAmount != -1)
|
||||
return $"Required: {itemAmount} {itemName}";
|
||||
else
|
||||
return $"Required: {itemName}";
|
||||
}
|
||||
|
||||
private static String getPrice(int price)
|
||||
{
|
||||
if (price == -1) return "";
|
||||
|
||||
return $"Sell Price: {price} g";
|
||||
}
|
||||
|
||||
private static String handleUnHighlightedItem(bool isHighlighted, int hoveredInventoryIndex)
|
||||
{
|
||||
if (isHighlighted) return "";
|
||||
|
||||
if (prevSlotIndex != hoveredInventoryIndex)
|
||||
Game1.playSound("invalid-selection");
|
||||
|
||||
return " not usable here";
|
||||
}
|
||||
}
|
||||
}
|
|
@ -148,7 +148,6 @@ namespace stardew_access.Patches
|
|||
if (prevSlotIndex != i)
|
||||
{
|
||||
prevSlotIndex = i;
|
||||
MainClass.DebugLog("here");
|
||||
Game1.playSound("invalid-selection");
|
||||
}
|
||||
}
|
||||
|
@ -322,7 +321,6 @@ namespace stardew_access.Patches
|
|||
if (prevSlotIndex != i)
|
||||
{
|
||||
prevSlotIndex = i;
|
||||
MainClass.DebugLog("here");
|
||||
Game1.playSound("invalid-selection");
|
||||
}
|
||||
}
|
||||
|
@ -803,7 +801,8 @@ namespace stardew_access.Patches
|
|||
pondQueryMenuQuery = " ";
|
||||
}
|
||||
|
||||
GameMenuPatches.hoveredItemQueryKey = "";
|
||||
InventoryUtils.hoveredItemQueryKey = "";
|
||||
InventoryUtils.prevSlotIndex = -999;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
|
Loading…
Reference in New Issue