Made coop menu accessible

master
shoaib11120 2021-12-28 20:43:07 +05:30
parent d16f53723a
commit 51dd77d9fc
2 changed files with 135 additions and 62 deletions

View File

@ -117,6 +117,12 @@ namespace stardew_access
postfix: new HarmonyMethod(typeof(MenuPatch), nameof(MenuPatch.OptionsPagePatch)) postfix: new HarmonyMethod(typeof(MenuPatch), nameof(MenuPatch.OptionsPagePatch))
); );
harmony.Patch(
original: AccessTools.Method(typeof(CoopMenu), nameof(CoopMenu.update), new Type[] { typeof(GameTime) }),
postfix: new HarmonyMethod(typeof(MenuPatch), nameof(MenuPatch.CoopMenuPatch))
);
#endregion #endregion
#region Custom Commands #region Custom Commands

View File

@ -4,6 +4,7 @@ using StardewModdingAPI;
using StardewValley; using StardewValley;
using StardewValley.Menus; using StardewValley.Menus;
using StardewValley.Quests; using StardewValley.Quests;
using static StardewValley.Menus.LoadGameMenu;
namespace stardew_access.Patches namespace stardew_access.Patches
{ {
@ -13,68 +14,130 @@ namespace stardew_access.Patches
private static bool isRunning = false; private static bool isRunning = false;
private static string currentLetterText = " "; private static string currentLetterText = " ";
private static string currentDailyQuestText = " "; private static string currentDailyQuestText = " ";
public static bool isJoinTabSelected = false;
public static bool isHostTabSelected = false;
internal static void CoopMenuPatch(CoopMenu __instance, CoopMenu.Tab ___currentTab)
{
try
{
int x = Game1.getMousePosition(true).X, y = Game1.getMousePosition(true).Y;
string toSpeak = " ";
#region Join/Host Button (Important! This should be checked before checking other buttons)
if (__instance.slotButtons[0].containsPoint(x, y))
{
MainClass.monitor.Log($"here", LogLevel.Debug);
if (___currentTab == CoopMenu.Tab.JOIN_TAB)
toSpeak = "Join lan game";
if (___currentTab == CoopMenu.Tab.HOST_TAB)
toSpeak = "Host new farm";
}
#endregion
#region Other Buttons
if (__instance.joinTab.containsPoint(x, y))
{
toSpeak = "Join Tab Button";
}
else if (__instance.hostTab.containsPoint(x, y))
{
toSpeak = "Host Tab Button";
}
else if (__instance.refreshButton.containsPoint(x, y))
{
toSpeak = "Refresh Button";
}
#endregion
if (toSpeak != " ")
ScreenReader.sayWithChecker(toSpeak, true);
}
catch (Exception e)
{
throw;
}
}
internal static void OptionsPagePatch(OptionsPage __instance) internal static void OptionsPagePatch(OptionsPage __instance)
{ {
int currentItemIndex = Math.Max(0, Math.Min(__instance.options.Count - 7, __instance.currentItemIndex)); try
int x = Game1.getMousePosition(true).X, y = Game1.getMousePosition(true).Y;
for (int i = 0; i < __instance.optionSlots.Count; i++)
{ {
if (__instance.optionSlots[i].bounds.Contains(x, y) && currentItemIndex + i < __instance.options.Count && __instance.options[currentItemIndex + i].bounds.Contains(x - __instance.optionSlots[i].bounds.X, y - __instance.optionSlots[i].bounds.Y)) int currentItemIndex = Math.Max(0, Math.Min(__instance.options.Count - 7, __instance.currentItemIndex));
int x = Game1.getMousePosition(true).X, y = Game1.getMousePosition(true).Y;
for (int i = 0; i < __instance.optionSlots.Count; i++)
{ {
OptionsElement optionsElement = __instance.options[currentItemIndex + i]; if (__instance.optionSlots[i].bounds.Contains(x, y) && currentItemIndex + i < __instance.options.Count && __instance.options[currentItemIndex + i].bounds.Contains(x - __instance.optionSlots[i].bounds.X, y - __instance.optionSlots[i].bounds.Y))
string toSpeak = optionsElement.label;
if (optionsElement is OptionsButton)
toSpeak = $" {toSpeak} Button";
else if (optionsElement is OptionsCheckbox)
toSpeak = ((optionsElement as OptionsCheckbox).isChecked ? "Enabled" : "Disabled") + $" {toSpeak} Checkbox";
else if (optionsElement is OptionsDropDown)
toSpeak = $"{toSpeak} Dropdown, option {(optionsElement as OptionsDropDown).dropDownDisplayOptions[(optionsElement as OptionsDropDown).selectedOption]} selected";
else if (optionsElement is OptionsSlider)
toSpeak = $"{(optionsElement as OptionsSlider).value}% {toSpeak} Slider";
else if (optionsElement is OptionsPlusMinus)
toSpeak = $"{(optionsElement as OptionsPlusMinus).displayOptions[(optionsElement as OptionsPlusMinus).selected]} selected of {toSpeak}";
else if (optionsElement is OptionsInputListener)
{ {
string buttons = ""; OptionsElement optionsElement = __instance.options[currentItemIndex + i];
(optionsElement as OptionsInputListener).buttonNames.ForEach(name => { buttons += $", {name}"; }); string toSpeak = optionsElement.label;
toSpeak = $"{toSpeak} is bound to {buttons}. Left click to change.";
}
else
{
if(toSpeak.Contains(':'))
toSpeak = toSpeak.Remove(':');
toSpeak = $"{toSpeak} Options:"; if (optionsElement is OptionsButton)
} toSpeak = $" {toSpeak} Button";
else if (optionsElement is OptionsCheckbox)
toSpeak = ((optionsElement as OptionsCheckbox).isChecked ? "Enabled" : "Disabled") + $" {toSpeak} Checkbox";
else if (optionsElement is OptionsDropDown)
toSpeak = $"{toSpeak} Dropdown, option {(optionsElement as OptionsDropDown).dropDownDisplayOptions[(optionsElement as OptionsDropDown).selectedOption]} selected";
else if (optionsElement is OptionsSlider)
toSpeak = $"{(optionsElement as OptionsSlider).value}% {toSpeak} Slider";
else if (optionsElement is OptionsPlusMinus)
toSpeak = $"{(optionsElement as OptionsPlusMinus).displayOptions[(optionsElement as OptionsPlusMinus).selected]} selected of {toSpeak}";
else if (optionsElement is OptionsInputListener)
{
string buttons = "";
(optionsElement as OptionsInputListener).buttonNames.ForEach(name => { buttons += $", {name}"; });
toSpeak = $"{toSpeak} is bound to {buttons}. Left click to change.";
}
else
{
if (toSpeak.Contains(":"))
toSpeak = toSpeak.Replace(":", "");
ScreenReader.sayWithChecker(toSpeak, true); toSpeak = $"{toSpeak} Options:";
break; }
ScreenReader.sayWithChecker(toSpeak, true);
break;
}
} }
} }
catch (Exception e)
{
throw;
}
} }
internal static void ShippingMenuPatch(ShippingMenu __instance, List<int> ___categoryTotals) internal static void ShippingMenuPatch(ShippingMenu __instance, List<int> ___categoryTotals)
{ {
if(__instance.currentPage == -1) try
{ {
int total = ___categoryTotals[5]; if (__instance.currentPage == -1)
string toSpeak;
if(__instance.okButton.containsPoint(Game1.getMousePosition(true).X, Game1.getMousePosition(true).Y))
{ {
toSpeak = $"{total}g in total. Press left mouse button to save."; int total = ___categoryTotals[5];
ScreenReader.sayWithChecker(toSpeak, true); string toSpeak;
} if (__instance.okButton.containsPoint(Game1.getMousePosition(true).X, Game1.getMousePosition(true).Y))
for (int i =0; i < __instance.categories.Count; i++)
{
if (__instance.categories[i].containsPoint(Game1.getMousePosition(true).X, Game1.getMousePosition(true).Y))
{ {
toSpeak = $"Money recieved from {__instance.getCategoryName(i)}: {___categoryTotals[i]}g."; toSpeak = $"{total}g in total. Press left mouse button to save.";
ScreenReader.sayWithChecker(toSpeak, true); ScreenReader.sayWithChecker(toSpeak, true);
} }
for (int i = 0; i < __instance.categories.Count; i++)
{
if (__instance.categories[i].containsPoint(Game1.getMousePosition(true).X, Game1.getMousePosition(true).Y))
{
toSpeak = $"Money recieved from {__instance.getCategoryName(i)}: {___categoryTotals[i]}g.";
ScreenReader.sayWithChecker(toSpeak, true);
}
}
} }
} }
catch (Exception e)
{
throw;
}
} }
internal static void BillboardPatch(Billboard __instance, bool ___dailyQuestBoard) internal static void BillboardPatch(Billboard __instance, bool ___dailyQuestBoard)
@ -296,10 +359,13 @@ namespace stardew_access.Patches
} }
} }
internal static void TitleMenuPatch(TitleMenu __instance) internal static void TitleMenuPatch(TitleMenu __instance, bool ___isTransitioningButtons)
{ {
try try
{ {
if (___isTransitioningButtons)
return;
string toSpeak = ""; string toSpeak = "";
__instance.buttons.ForEach(component => __instance.buttons.ForEach(component =>
@ -347,33 +413,34 @@ namespace stardew_access.Patches
} }
} }
internal static void LoadGameMenuPatch(LoadGameMenu.SaveFileSlot __instance, LoadGameMenu ___menu, int i) internal static void LoadGameMenuPatch(SaveFileSlot __instance, LoadGameMenu ___menu, int i)
{ {
try try
{ {
if (___menu.slotButtons[i].containsPoint(Game1.getMousePosition(true).X, Game1.getMousePosition(true).Y)) if (___menu.slotButtons[i].containsPoint(Game1.getMousePosition(true).X, Game1.getMousePosition(true).Y))
{ {
if (__instance.Farmer == null) if (__instance.Farmer != null)
return;
if (___menu.deleteButtons[i].containsPoint(Game1.getMousePosition(true).X, Game1.getMousePosition(true).Y))
{ {
// Fix for delete button hover text not narrating #region Farms
ScreenReader.sayWithChecker($"Delete {__instance.Farmer.farmName} Farm", true); if (Game1.activeClickableMenu is LoadGameMenu && ___menu.deleteButtons[i].containsPoint(Game1.getMousePosition(true).X, Game1.getMousePosition(true).Y))
return; {
ScreenReader.sayWithChecker($"Delete {__instance.Farmer.farmName} Farm", true);
return;
}
String farmerName = __instance.Farmer.displayName;
String farmName = __instance.Farmer.farmName;
String money = __instance.Farmer.Money.ToString();
String hoursPlayed = Utility.getHoursMinutesStringFromMilliseconds(__instance.Farmer.millisecondsPlayed);
string dateStringForSaveGame = ((!__instance.Farmer.dayOfMonthForSaveGame.HasValue ||
!__instance.Farmer.seasonForSaveGame.HasValue ||
!__instance.Farmer.yearForSaveGame.HasValue) ? __instance.Farmer.dateStringForSaveGame : Utility.getDateStringFor(__instance.Farmer.dayOfMonthForSaveGame.Value, __instance.Farmer.seasonForSaveGame.Value, __instance.Farmer.yearForSaveGame.Value));
string toSpeak = $"{farmName} Farm Selected, \t\n Farmer:{farmerName}, \t\nMoney:{money}, \t\nHours Played:{hoursPlayed}, \t\nDate:{dateStringForSaveGame}";
ScreenReader.sayWithChecker(toSpeak, true);
#endregion
} }
String farmerName = __instance.Farmer.displayName;
String farmName = __instance.Farmer.farmName;
String money = __instance.Farmer.Money.ToString();
String hoursPlayed = Utility.getHoursMinutesStringFromMilliseconds(__instance.Farmer.millisecondsPlayed);
string dateStringForSaveGame = ((!__instance.Farmer.dayOfMonthForSaveGame.HasValue ||
!__instance.Farmer.seasonForSaveGame.HasValue ||
!__instance.Farmer.yearForSaveGame.HasValue) ? __instance.Farmer.dateStringForSaveGame : Utility.getDateStringFor(__instance.Farmer.dayOfMonthForSaveGame.Value, __instance.Farmer.seasonForSaveGame.Value, __instance.Farmer.yearForSaveGame.Value));
string toSpeak = $"{farmName} Farm Selected, \t\n Farmer:{farmerName}, \t\nMoney:{money}, \t\nHours Played:{hoursPlayed}, \t\nDate:{dateStringForSaveGame}";
ScreenReader.sayWithChecker(toSpeak, true);
} }
} }
catch (Exception e) catch (Exception e)