refactoring and crash fixing for audio glossary.

This commit is contained in:
Ryan 2024-03-20 19:17:09 -04:00
parent ac6c84f296
commit 87a5a5c4ff
1 changed files with 41 additions and 36 deletions

View File

@ -59,7 +59,14 @@ typedef struct {
}SfxRecord; }SfxRecord;
class AudioGlossaryData {
public:
AccessibleActorList_t accessibleActorList;
AccessibleActorList_t::iterator current = accessibleActorList.begin();
bool GlossaryStarted = false;
int cooldown = 0;
int frameCount = 0;
};
class ActorAccessibility { class ActorAccessibility {
public: public:
@ -68,6 +75,7 @@ class ActorAccessibility {
SupportedActors_t supportedActors; SupportedActors_t supportedActors;
TrackedActors_t trackedActors; TrackedActors_t trackedActors;
AccessibleActorList_t accessibleActorList; AccessibleActorList_t accessibleActorList;
AudioGlossaryData* glossary;
VAZones_t vaZones; VAZones_t vaZones;
SceneList_t sceneList; SceneList_t sceneList;
AccessibleAudioEngine* audioEngine; AccessibleAudioEngine* audioEngine;
@ -83,14 +91,8 @@ class ActorAccessibility {
}; };
static ActorAccessibility* aa; static ActorAccessibility* aa;
class AudioGlossaryData {
public:
AccessibleActorList_t::iterator current = aa->accessibleActorList.begin();
bool GlossaryStarted = false;
int cooldown = 0;
int frameCount = 0;
};
static AudioGlossaryData* glossary;
uint64_t ActorAccessibility_GetNextID() { uint64_t ActorAccessibility_GetNextID() {
uint64_t result = aa->nextActorID; uint64_t result = aa->nextActorID;
@ -126,7 +128,7 @@ void ActorAccessibility_OnGameStillFrozen()
void ActorAccessibility_Init() { void ActorAccessibility_Init() {
aa = new ActorAccessibility(); aa = new ActorAccessibility();
glossary = new AudioGlossaryData(); aa->glossary = new AudioGlossaryData();
aa->isOn = CVarGetInteger("gA11yAudioInteraction", 0); aa->isOn = CVarGetInteger("gA11yAudioInteraction", 0);
if (!aa->isOn) if (!aa->isOn)
return; return;
@ -408,13 +410,15 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
} }
} }
actor->frameCount++; actor->frameCount++;
glossary->frameCount++; if (aa->glossary->GlossaryStarted) {
aa->glossary->frameCount++;
}
if (actor->frameCount != 1 && (actor->frameCount - 1) % actor->policy.n != 0) if (actor->frameCount != 1 && (actor->frameCount - 1) % actor->policy.n != 0)
return; return;
if (!actor->policy.runsAlways && actor->xyzDistToPlayer > actor->policy.distance) { if (!actor->policy.runsAlways && actor->xyzDistToPlayer > actor->policy.distance) {
return; return;
} }
if (actor->isDrawn == 0 && actor->actor->id != 406 && actor->actor->id != 302 && !glossary->GlossaryStarted) if (actor->isDrawn == 0 && actor->actor->id != 406 && actor->actor->id != 302 && !aa->glossary->GlossaryStarted)
return; return;
if (actor->policy.aimAssist.isProvider) { if (actor->policy.aimAssist.isProvider) {
if (player->stateFlags1 & PLAYER_STATE1_FIRST_PERSON && if (player->stateFlags1 & PLAYER_STATE1_FIRST_PERSON &&
@ -467,7 +471,7 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
return; return;
} }
ActorAccessibility_AudioGlossary(play); ActorAccessibility_AudioGlossary(play);
if (glossary->GlossaryStarted) { if (aa->glossary->GlossaryStarted) {
return; return;
} }
@ -495,16 +499,16 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
} }
void ActorAccessibility_AudioGlossary(PlayState* play) { void ActorAccessibility_AudioGlossary(PlayState* play) {
if (glossary->GlossaryStarted) { if (aa->glossary->GlossaryStarted) {
AccessibleActor glossaryActor = (*glossary->current).second; AccessibleActor glossaryActor = (*aa->glossary->current).second;
ActorAccessibility_CopyParamsFromRealActor(&glossaryActor); ActorAccessibility_CopyParamsFromRealActor(&glossaryActor);
glossaryActor.policy.distance = glossaryActor.xzDistToPlayer * 3; glossaryActor.policy.distance = glossaryActor.xzDistToPlayer * 3;
glossaryActor.policy.ydist = 1000; glossaryActor.policy.ydist = 1000;
glossaryActor.frameCount = glossary->frameCount; glossaryActor.frameCount = aa->glossary->frameCount;
ActorAccessibility_RunAccessibilityForActor(play, &glossaryActor); ActorAccessibility_RunAccessibilityForActor(play, &glossaryActor);
} }
if (glossary->cooldown != 0) { if (aa->glossary->cooldown != 0) {
glossary->cooldown--; aa->glossary->cooldown--;
return; return;
} }
@ -512,40 +516,41 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
bool comboStartGlossary = trackerButtonsPressed != nullptr && trackerButtonsPressed[0].button & buttons[10] && bool comboStartGlossary = trackerButtonsPressed != nullptr && trackerButtonsPressed[0].button & buttons[10] &&
trackerButtonsPressed[0].button & buttons[6]; trackerButtonsPressed[0].button & buttons[6];
if (comboStartGlossary) { if (comboStartGlossary) {
glossary->GlossaryStarted = true; aa->glossary->GlossaryStarted = true;
glossary->current = aa->accessibleActorList.begin(); aa->glossary->current = aa->accessibleActorList.begin();
SpeechSynthesizer::Instance->Speak((*glossary->current).second.policy.englishName, GetLanguageCode()); SpeechSynthesizer::Instance->Speak((*aa->glossary->current).second.policy.englishName, GetLanguageCode());
return; return;
} }
bool comboNextGlossary = trackerButtonsPressed != nullptr && trackerButtonsPressed[0].button & buttons[13] && bool comboNextGlossary = trackerButtonsPressed != nullptr && trackerButtonsPressed[0].button & buttons[13] &&
trackerButtonsPressed[0].button & buttons[6]; trackerButtonsPressed[0].button & buttons[6];
if (comboNextGlossary && glossary->GlossaryStarted) { if (comboNextGlossary && aa->glossary->GlossaryStarted) {
if (glossary->current != aa->accessibleActorList.end()) { aa->glossary->current++;
glossary->current++; if (aa->glossary->current == aa->accessibleActorList.end()) {
aa->glossary->current = aa->accessibleActorList.begin();
}; };
glossary->cooldown = 20; aa->glossary->cooldown = 5;
SpeechSynthesizer::Instance->Speak((*glossary->current).second.policy.englishName, GetLanguageCode()); SpeechSynthesizer::Instance->Speak((*aa->glossary->current).second.policy.englishName, GetLanguageCode());
} }
bool comboPrevGlossary = trackerButtonsPressed != nullptr && trackerButtonsPressed[0].button & buttons[12] && bool comboPrevGlossary = trackerButtonsPressed != nullptr && trackerButtonsPressed[0].button & buttons[12] &&
trackerButtonsPressed[0].button & buttons[6]; trackerButtonsPressed[0].button & buttons[6];
if (comboPrevGlossary && glossary->GlossaryStarted) { if (comboPrevGlossary && aa->glossary->GlossaryStarted) {
if (glossary->current != aa->accessibleActorList.begin()) { if (aa->glossary->current != aa->accessibleActorList.begin()) {
glossary->current--; aa->glossary->current--;
}
}; aa->glossary->cooldown = 5;
glossary->cooldown = 20;
SpeechSynthesizer::Instance->Speak((*glossary->current).second.policy.englishName, GetLanguageCode()); SpeechSynthesizer::Instance->Speak((*aa->glossary->current).second.policy.englishName, GetLanguageCode());
} }
bool comboDisableGlossary = trackerButtonsPressed != nullptr && trackerButtonsPressed[0].button & buttons[11] && bool comboDisableGlossary = trackerButtonsPressed != nullptr && trackerButtonsPressed[0].button & buttons[11] &&
trackerButtonsPressed[0].button & buttons[6]; trackerButtonsPressed[0].button & buttons[6];
if (comboDisableGlossary) { if (comboDisableGlossary) {
glossary->cooldown = 0; aa->glossary->cooldown = 0;
glossary->GlossaryStarted = false; aa->glossary->GlossaryStarted = false;
} }
// Processes external audio engine.
ActorAccessibility_PrepareNextAudioFrame();
} }
//Virtual actor config. //Virtual actor config.