Fixed dialogue narration
parent
84c22868d7
commit
96e5d5a8cc
|
@ -8,7 +8,8 @@ namespace stardew_access.Patches
|
||||||
{
|
{
|
||||||
internal class DialoguePatches
|
internal class DialoguePatches
|
||||||
{
|
{
|
||||||
private static string currentDialogue = " ";
|
internal static string currentDialogue = " ";
|
||||||
|
internal static bool isDialogueAppearingFirstTime = true;
|
||||||
|
|
||||||
internal static void DialoguePatch(DialogueBox __instance, SpriteBatch b)
|
internal static void DialoguePatch(DialogueBox __instance, SpriteBatch b)
|
||||||
{
|
{
|
||||||
|
@ -22,67 +23,99 @@ namespace stardew_access.Patches
|
||||||
// For Normal Character dialogues
|
// For Normal Character dialogues
|
||||||
Dialogue dialogue = __instance.characterDialogue;
|
Dialogue dialogue = __instance.characterDialogue;
|
||||||
string speakerName = dialogue.speaker.displayName;
|
string speakerName = dialogue.speaker.displayName;
|
||||||
|
List<Response> responses = dialogue.getResponseOptions();
|
||||||
string toSpeak = " ";
|
string toSpeak = " ";
|
||||||
bool hasResponses = false;
|
string dialogueText = "";
|
||||||
|
string response = "";
|
||||||
|
bool hasResponses = dialogue.isCurrentDialogueAQuestion();
|
||||||
|
|
||||||
if (__instance.responses.Count > 0)
|
dialogueText = $"{speakerName} said {__instance.getCurrentString()}";
|
||||||
hasResponses = true;
|
|
||||||
|
|
||||||
if (currentDialogue != __instance.getCurrentString())
|
if (hasResponses)
|
||||||
{
|
{
|
||||||
toSpeak = __instance.getCurrentString();
|
if (__instance.selectedResponse >= 0 && __instance.selectedResponse < responses.Count)
|
||||||
currentDialogue = toSpeak;
|
response = $"{__instance.selectedResponse + 1}: {responses[__instance.selectedResponse].responseText}";
|
||||||
toSpeak = $"{speakerName} said {toSpeak}";
|
else
|
||||||
|
// When the dialogue is not finished writing then the selectedResponse is <0 and this results
|
||||||
|
// in the first response not being detcted, so this sets the first response option to be the default
|
||||||
|
// if the current dialogue is a question or has responses
|
||||||
|
response = $"1: {responses[0].responseText}";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__instance.responses.Count > 0)
|
if (hasResponses)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < __instance.responses.Count; i++)
|
if (currentDialogue != response)
|
||||||
{
|
{
|
||||||
if (i == __instance.selectedResponse)
|
currentDialogue = response;
|
||||||
|
|
||||||
|
if (isDialogueAppearingFirstTime)
|
||||||
{
|
{
|
||||||
toSpeak += $" \t\n Selected response: {__instance.responses[i].responseText}";
|
toSpeak = $"{dialogueText} \n\t {response}";
|
||||||
|
isDialogueAppearingFirstTime = false;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
toSpeak = response;
|
||||||
|
|
||||||
|
MainClass.GetScreenReader().Say(toSpeak, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if (toSpeak != " ")
|
|
||||||
{
|
{
|
||||||
if (hasResponses)
|
if (currentDialogue != dialogueText)
|
||||||
MainClass.GetScreenReader().SayWithChecker(toSpeak, false);
|
{
|
||||||
else
|
currentDialogue = dialogueText;
|
||||||
MainClass.GetScreenReader().SayWithChecker(toSpeak, true);
|
MainClass.GetScreenReader().Say(dialogueText, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (__instance.isQuestion)
|
else if (__instance.isQuestion)
|
||||||
{
|
{
|
||||||
// For Dialogues with responses/answers like the dialogue when we click on tv
|
// For Dialogues with responses/answers like the dialogue when we click on tv
|
||||||
string toSpeak = " ";
|
string toSpeak = "";
|
||||||
|
string dialogueText = "";
|
||||||
|
string response = "";
|
||||||
bool hasResponses = false;
|
bool hasResponses = false;
|
||||||
|
|
||||||
if (__instance.responses.Count > 0)
|
if (__instance.responses.Count > 0)
|
||||||
hasResponses = true;
|
hasResponses = true;
|
||||||
|
|
||||||
if (currentDialogue != __instance.getCurrentString())
|
dialogueText = __instance.getCurrentString();
|
||||||
{
|
|
||||||
toSpeak = __instance.getCurrentString();
|
|
||||||
currentDialogue = toSpeak;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < __instance.responses.Count; i++)
|
if (hasResponses)
|
||||||
|
if (__instance.selectedResponse >= 0 && __instance.selectedResponse < __instance.responses.Count)
|
||||||
|
response = $"{__instance.selectedResponse + 1}: {__instance.responses[__instance.selectedResponse].responseText}";
|
||||||
|
else
|
||||||
|
// When the dialogue is not finished writing then the selectedResponse is <0 and this results
|
||||||
|
// in the first response not being detcted, so this sets the first response option to be the default
|
||||||
|
// if the current dialogue is a question or has responses
|
||||||
|
response = $"1: {__instance.responses[0].responseText}";
|
||||||
|
|
||||||
|
|
||||||
|
if (hasResponses)
|
||||||
{
|
{
|
||||||
if (i == __instance.selectedResponse)
|
if (currentDialogue != response)
|
||||||
{
|
{
|
||||||
toSpeak += $" \t\n Selected response: {__instance.responses[i].responseText}";
|
currentDialogue = response;
|
||||||
|
|
||||||
|
if (isDialogueAppearingFirstTime)
|
||||||
|
{
|
||||||
|
toSpeak = $"{dialogueText} \n\t {response}";
|
||||||
|
isDialogueAppearingFirstTime = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
toSpeak = response;
|
||||||
|
|
||||||
|
MainClass.GetMonitor().Log(toSpeak, LogLevel.Debug);
|
||||||
|
MainClass.GetScreenReader().Say(toSpeak, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if (toSpeak != " ")
|
|
||||||
{
|
{
|
||||||
if (hasResponses)
|
if (currentDialogue != dialogueText)
|
||||||
MainClass.GetScreenReader().SayWithChecker(toSpeak, false);
|
{
|
||||||
else
|
currentDialogue = dialogueText;
|
||||||
MainClass.GetScreenReader().SayWithChecker(toSpeak, true);
|
MainClass.GetScreenReader().Say(dialogueText, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (Game1.activeClickableMenu is DialogueBox)
|
else if (Game1.activeClickableMenu is DialogueBox)
|
||||||
|
@ -106,6 +139,7 @@ namespace stardew_access.Patches
|
||||||
{
|
{
|
||||||
// CLears the currentDialogue string on closing dialog
|
// CLears the currentDialogue string on closing dialog
|
||||||
currentDialogue = " ";
|
currentDialogue = " ";
|
||||||
|
isDialogueAppearingFirstTime = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void HoverTextPatch(string? text, int moneyAmountToDisplayAtBottom = -1, string? boldTitleText = null, int extraItemToShowIndex = -1, int extraItemToShowAmount = -1, string[]? buffIconsToDisplay = null, Item? hoveredItem = null, CraftingRecipe? craftingIngredients = null)
|
internal static void HoverTextPatch(string? text, int moneyAmountToDisplayAtBottom = -1, string? boldTitleText = null, int extraItemToShowIndex = -1, int extraItemToShowAmount = -1, string[]? buffIconsToDisplay = null, Item? hoveredItem = null, CraftingRecipe? craftingIngredients = null)
|
||||||
|
|
|
@ -414,6 +414,12 @@ namespace stardew_access.Patches
|
||||||
BuildingNAnimalMenuPatches.purchaseAnimalsMenu = null;
|
BuildingNAnimalMenuPatches.purchaseAnimalsMenu = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (__instance is DialogueBox)
|
||||||
|
{
|
||||||
|
DialoguePatches.isDialogueAppearingFirstTime = true;
|
||||||
|
DialoguePatches.currentDialogue = " ";
|
||||||
|
}
|
||||||
|
|
||||||
GameMenuPatches.hoveredItemQueryKey = "";
|
GameMenuPatches.hoveredItemQueryKey = "";
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"Name": "Stardew Access",
|
"Name": "Stardew Access",
|
||||||
"Author": "Mohammad Shoaib",
|
"Author": "Mohammad Shoaib",
|
||||||
"Version": "1.0.23-beta",
|
"Version": "1.1.0",
|
||||||
"Description": "An accessibility mod with screen reader support!",
|
"Description": "An accessibility mod with screen reader support!",
|
||||||
"UniqueID": "shoaib.stardewaccess",
|
"UniqueID": "shoaib.stardewaccess",
|
||||||
"EntryDll": "stardew-access.dll",
|
"EntryDll": "stardew-access.dll",
|
||||||
|
|
Loading…
Reference in New Issue