mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-21 13:53:49 -07:00
fix terrain cues
This commit is contained in:
parent
5d4c2749cd
commit
92dc122fdb
4 changed files with 71 additions and 38 deletions
|
@ -979,7 +979,7 @@ void ActorAccessibility_InitActors() {
|
|||
ActorAccessibility_AddSupportedActor(VA_MARKER, policy);
|
||||
|
||||
// Virtual actors for a given location (scene and room number).
|
||||
VirtualActorList* list = (VirtualActorList*)ActorAccessibility_GetVirtualActorList(EVERYWHERE, 0);
|
||||
VirtualActorList* list;
|
||||
AccessibleActor* temp;
|
||||
|
||||
list = ActorAccessibility_GetVirtualActorList(SCENE_KOKIRI_FOREST, 0);
|
||||
|
@ -1160,5 +1160,31 @@ void ActorAccessibility_InitActors() {
|
|||
temp->policy.ydist = 100;
|
||||
temp->policy.sound = NA_SE_EV_BLOCK_SHAKE;
|
||||
|
||||
ActorAccessibility_InitCues();
|
||||
ActorAccessibility_InitPolicy(&policy, "Terrain cue helper", accessible_va_terrain_cue);
|
||||
policy.n = 1;
|
||||
policy.runsAlways = true;
|
||||
policy.distance = 500;
|
||||
policy.initUserData = ActorAccessibility_InitTerrainCueState;
|
||||
policy.cleanupUserData = ActorAccessibility_CleanupTerrainCueState;
|
||||
ActorAccessibility_AddSupportedActor(VA_TERRAIN_CUE, policy);
|
||||
|
||||
AccessibleActor* actor = new AccessibleActor;
|
||||
actor->actor = nullptr;
|
||||
actor->basePitch = 1.0;
|
||||
actor->baseVolume = 1.0;
|
||||
actor->currentPitch = 1.0;
|
||||
actor->currentVolume = 1.0;
|
||||
actor->frameCount = 0;
|
||||
actor->id = VA_TERRAIN_CUE;
|
||||
actor->instanceID = ActorAccessibility_GetNextID();
|
||||
actor->isDrawn = 1;
|
||||
actor->play = nullptr;
|
||||
actor->pos = { 0, 0, 0 };
|
||||
actor->sceneIndex = 0;
|
||||
actor->managedSoundSlots = 0;
|
||||
actor->aimAssist.framesSinceAimAssist = 0;
|
||||
actor->aimAssist.frequency = 10;
|
||||
actor->policy = policy;
|
||||
ActorAccessibility_InitTerrainCueState(actor);
|
||||
ActorAccessibility_AddTerrainCues(actor);
|
||||
}
|
||||
|
|
|
@ -94,8 +94,9 @@ class ActorAccessibility {
|
|||
Vec3f prevPos = { 0, 0, 0 };
|
||||
s16 prevYaw = 0;
|
||||
bool extractSfx = false;
|
||||
VirtualActorList* currentSceneGlobal = NULL;
|
||||
VirtualActorList* currentRoomLocal = NULL;
|
||||
AccessibleActor* terrainCues = nullptr;
|
||||
VirtualActorList* currentSceneGlobal = nullptr;
|
||||
VirtualActorList* currentRoomLocal = nullptr;
|
||||
};
|
||||
static ActorAccessibility* aa;
|
||||
|
||||
|
@ -117,9 +118,11 @@ void ActorAccessibility_OnGameFrameUpdate() {
|
|||
|
||||
ActorAccessibility_RunAccessibilityForAllActors(gPlayState);
|
||||
}
|
||||
|
||||
void ActorAccessibility_OnActorDestroy(void* actor) {
|
||||
ActorAccessibility_RemoveTrackedActor((Actor*)actor);
|
||||
}
|
||||
|
||||
void ActorAccessibility_OnGameStillFrozen() {
|
||||
if (gPlayState == NULL)
|
||||
return;
|
||||
|
@ -183,6 +186,10 @@ void ActorAccessibility_AddSupportedActor(s16 type, ActorAccessibilityPolicy pol
|
|||
aa->supportedActors[type] = policy;
|
||||
}
|
||||
|
||||
void ActorAccessibility_AddTerrainCues(AccessibleActor* actor) {
|
||||
aa->terrainCues = actor;
|
||||
}
|
||||
|
||||
ActorAccessibilityPolicy* ActorAccessibility_GetPolicyForActor(s16 type) {
|
||||
SupportedActors_t::iterator i = aa->supportedActors.find(type);
|
||||
if (i == aa->supportedActors.end())
|
||||
|
@ -224,6 +231,7 @@ void ActorAccessibility_TrackNewActor(Actor* actor) {
|
|||
policy->initUserData(&savedActor);
|
||||
}
|
||||
}
|
||||
|
||||
void ActorAccessibility_RemoveTrackedActor(Actor* actor) {
|
||||
TrackedActors_t::iterator i = aa->trackedActors.find(actor);
|
||||
if (i == aa->trackedActors.end())
|
||||
|
@ -242,6 +250,7 @@ void ActorAccessibility_RemoveTrackedActor(Actor* actor) {
|
|||
f32 ActorAccessibility_DBToLinear(float gain) {
|
||||
return powf(10.0, gain / 20.0f);
|
||||
}
|
||||
|
||||
f32 ActorAccessibility_ComputeCurrentVolume(f32 maxDistance, f32 xzDistToPlayer) {
|
||||
if (maxDistance == 0)
|
||||
return 0.0;
|
||||
|
@ -250,6 +259,7 @@ f32 ActorAccessibility_ComputeCurrentVolume(f32 maxDistance, f32 xzDistToPlayer)
|
|||
|
||||
return ActorAccessibility_DBToLinear(db);
|
||||
}
|
||||
|
||||
const char* ActorAccessibility_MapSfxToExternalAudio(s16 sfxId);
|
||||
void ActorAccessibility_PlaySound(void* handle, int slot, s16 sfxId) {
|
||||
const char* path = ActorAccessibility_MapSfxToExternalAudio(sfxId);
|
||||
|
@ -285,6 +295,7 @@ void ActorAccessibility_SetSoundFilter(void* handle, int slot, float cutoff) {
|
|||
void ActorAccessibility_SeekSound(void* handle, int slot, size_t offset) {
|
||||
aa->audioEngine->seekSound((uintptr_t)handle, slot, offset);
|
||||
}
|
||||
|
||||
void ActorAccessibility_ConfigureSoundForActor(AccessibleActor* actor, int slot) {
|
||||
ActorAccessibility_SetSoundPitch(actor, slot, actor->policy.pitch);
|
||||
ActorAccessibility_SetPitchBehindModifier(actor, slot, actor->policy.pitchModifier);
|
||||
|
@ -292,12 +303,14 @@ void ActorAccessibility_ConfigureSoundForActor(AccessibleActor* actor, int slot)
|
|||
ActorAccessibility_SetSoundVolume(actor, slot, actor->policy.volume);
|
||||
actor->managedSoundSlots |= 1 << slot;
|
||||
}
|
||||
|
||||
void ActorAccessibility_PlaySoundForActor(AccessibleActor* actor, int slot, s16 sfxId) {
|
||||
if (slot < 0 || slot > AAE_SLOTS_PER_HANDLE)
|
||||
return;
|
||||
ActorAccessibility_PlaySound(actor, slot, sfxId);
|
||||
ActorAccessibility_ConfigureSoundForActor(actor, slot);
|
||||
}
|
||||
|
||||
void ActorAccessibility_StopSoundForActor(AccessibleActor* actor, int slot) {
|
||||
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
||||
return;
|
||||
|
@ -310,9 +323,6 @@ void ActorAccessibility_StopAllSoundsForActor(AccessibleActor* actor) {
|
|||
actor->managedSoundSlots = 0;
|
||||
}
|
||||
|
||||
bool ActorAccessibility_IsRealActor(AccessibleActor* actor) {
|
||||
return actor->actor != NULL;
|
||||
}
|
||||
void ActorAccessibility_CopyParamsFromRealActor(AccessibleActor* actor) {
|
||||
Player* player = GET_PLAYER(actor->play);
|
||||
if (actor->actor == NULL)
|
||||
|
@ -335,7 +345,7 @@ void ActorAccessibility_StopAllVirtualActors(VirtualActorList* list) {
|
|||
|
||||
void ActorAccessibility_RunAccessibilityForActor(PlayState* play, AccessibleActor* actor) {
|
||||
actor->play = play;
|
||||
if (ActorAccessibility_IsRealActor(actor)) {
|
||||
if (actor->actor != nullptr) {
|
||||
ActorAccessibility_CopyParamsFromRealActor(actor);
|
||||
} else {
|
||||
Player* player = GET_PLAYER(play);
|
||||
|
@ -363,14 +373,15 @@ void ActorAccessibility_RunAccessibilityForActor(PlayState* play, AccessibleActo
|
|||
if (aa->glossary->GlossaryStarted) {
|
||||
aa->glossary->frameCount++;
|
||||
}
|
||||
if (actor->frameCount % actor->policy.n)
|
||||
if (actor->frameCount % actor->policy.n) {
|
||||
return;
|
||||
if (!actor->policy.runsAlways && actor->xyzDistToPlayer > actor->policy.distance) {
|
||||
} else if (!actor->policy.runsAlways && actor->xyzDistToPlayer > actor->policy.distance) {
|
||||
return;
|
||||
} else if (actor->isDrawn == 0 && actor->actor->id != ACTOR_EN_IT && actor->actor->id != ACTOR_EN_OKARINA_TAG &&
|
||||
!aa->glossary->GlossaryStarted) {
|
||||
return;
|
||||
}
|
||||
if (actor->isDrawn == 0 && actor->actor->id != ACTOR_EN_IT && actor->actor->id != ACTOR_EN_OKARINA_TAG &&
|
||||
!aa->glossary->GlossaryStarted)
|
||||
return;
|
||||
|
||||
if (actor->policy.aimAssist.isProvider) {
|
||||
Player* player = GET_PLAYER(play);
|
||||
if (player->stateFlags1 & PLAYER_STATE1_FIRST_PERSON &&
|
||||
|
@ -399,6 +410,8 @@ void ActorAccessibility_RunAccessibilityForActor(PlayState* play, AccessibleActo
|
|||
void ActorAccessibility_RunAccessibilityForAllActors(PlayState* play) {
|
||||
Player* player = GET_PLAYER(play);
|
||||
if (play->sceneNum != aa->currentScene) {
|
||||
if (aa->terrainCues)
|
||||
ActorAccessibility_StopAllSounds(aa->terrainCues);
|
||||
ActorAccessibility_StopAllVirtualActors(aa->currentSceneGlobal);
|
||||
ActorAccessibility_StopAllVirtualActors(aa->currentRoomLocal);
|
||||
aa->currentSceneGlobal = ActorAccessibility_GetVirtualActorList(play->sceneNum, -1);
|
||||
|
@ -432,6 +445,10 @@ void ActorAccessibility_RunAccessibilityForAllActors(PlayState* play) {
|
|||
for (AccessibleActorList_t::iterator i = aa->accessibleActorList.begin(); i != aa->accessibleActorList.end(); i++)
|
||||
ActorAccessibility_RunAccessibilityForActor(play, &i->second);
|
||||
|
||||
if (aa->terrainCues) {
|
||||
ActorAccessibility_RunAccessibilityForActor(play, aa->terrainCues);
|
||||
}
|
||||
|
||||
// Virtual actors for the current room and scene.
|
||||
VAList_t* list = (VAList_t*)aa->currentRoomLocal;
|
||||
for (VAList_t::iterator i = list->begin(); i != list->end(); i++)
|
||||
|
@ -599,18 +616,14 @@ VirtualActorList* ActorAccessibility_GetVirtualActorList(s16 sceneNum, s8 roomNu
|
|||
SceneAndRoom sr;
|
||||
sr.values.sceneIndex = sceneNum;
|
||||
sr.values.roomIndex = roomNum;
|
||||
if (sceneNum == EVERYWHERE)
|
||||
sr.values.sceneIndex = EVERYWHERE;
|
||||
|
||||
return (VirtualActorList*)&aa->vaZones[sr.raw];
|
||||
}
|
||||
|
||||
AccessibleActor* ActorAccessibility_AddVirtualActor(VirtualActorList* list, VIRTUAL_ACTOR_TABLE type, Vec3f where) {
|
||||
ActorAccessibilityPolicy* policy = ActorAccessibility_GetPolicyForActor(type);
|
||||
if (policy == NULL)
|
||||
return NULL;
|
||||
|
||||
AccessibleActor actor;
|
||||
actor.actor = NULL;
|
||||
actor.actor = nullptr;
|
||||
actor.basePitch = 1.0;
|
||||
actor.baseVolume = 1.0;
|
||||
actor.currentPitch = 1.0;
|
||||
|
@ -619,14 +632,14 @@ AccessibleActor* ActorAccessibility_AddVirtualActor(VirtualActorList* list, VIRT
|
|||
actor.id = (s16)type;
|
||||
actor.instanceID = ActorAccessibility_GetNextID();
|
||||
actor.isDrawn = 1;
|
||||
actor.play = NULL;
|
||||
actor.play = nullptr;
|
||||
actor.pos = where;
|
||||
actor.sceneIndex = 0;
|
||||
actor.managedSoundSlots = 0;
|
||||
actor.aimAssist.framesSinceAimAssist = 0;
|
||||
actor.aimAssist.frequency = 10;
|
||||
|
||||
actor.policy = *policy;
|
||||
|
||||
VAList_t* l = (VAList_t*)list;
|
||||
l->push_back(actor);
|
||||
size_t index = l->size() - 1;
|
||||
|
@ -635,6 +648,7 @@ AccessibleActor* ActorAccessibility_AddVirtualActor(VirtualActorList* list, VIRT
|
|||
policy->initUserData(savedActor);
|
||||
return savedActor;
|
||||
}
|
||||
|
||||
void ActorAccessibility_InterpretCurrentScene(PlayState* play) {
|
||||
if (aa->sceneList.contains(play->sceneNum))
|
||||
return; // Scene interpretation already complete for this scene.
|
||||
|
@ -657,6 +671,7 @@ void ActorAccessibility_InterpretCurrentScene(PlayState* play) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Convert poly to VA.
|
||||
void ActorAccessibility_PolyToVirtualActor(PlayState* play, CollisionPoly* poly, VIRTUAL_ACTOR_TABLE va,
|
||||
VirtualActorList* destination) {
|
||||
|
@ -745,6 +760,10 @@ bool ActorAccessibility_InitAudio() {
|
|||
void ActorAccessibility_ShutdownAudio() {
|
||||
if (aa->isOn) {
|
||||
delete aa->audioEngine;
|
||||
if (aa->terrainCues) {
|
||||
ActorAccessibility_CleanupTerrainCueState(aa->terrainCues);
|
||||
delete aa->terrainCues;
|
||||
}
|
||||
aa->isOn = false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -92,10 +92,15 @@ void ActorAccessibility_InitPolicy(ActorAccessibilityPolicy* policy, const char*
|
|||
void ActorAccessibility_InitPolicy(ActorAccessibilityPolicy* policy, const char* englishName,
|
||||
ActorAccessibilityCallback callback);
|
||||
void ActorAccessibility_InitPolicy(ActorAccessibilityPolicy* policy, const char* englishName, s16 sfx);
|
||||
void ActorAccessibility_InitTerrainCueState(AccessibleActor* actor);
|
||||
void ActorAccessibility_CleanupTerrainCueState(AccessibleActor* actor);
|
||||
void accessible_va_terrain_cue(AccessibleActor* actor);
|
||||
|
||||
uint64_t ActorAccessibility_GetNextID();
|
||||
void ActorAccessibility_TrackNewActor(Actor* actor);
|
||||
void ActorAccessibility_RemoveTrackedActor(Actor* actor);
|
||||
void ActorAccessibility_AddSupportedActor(s16 type, ActorAccessibilityPolicy policy);
|
||||
void ActorAccessibility_AddTerrainCues(AccessibleActor* actor);
|
||||
|
||||
void ActorAccessibility_RunAccessibilityForActor(PlayState* play, AccessibleActor* actor);
|
||||
void ActorAccessibility_RunAccessibilityForAllActors(PlayState* play);
|
||||
|
@ -139,7 +144,6 @@ void ActorAccessibility_StopAllSoundsForActor(AccessibleActor* actor);
|
|||
f32 ActorAccessibility_ComputeCurrentVolume(f32 maxDistance, f32 xzDistToPlayer);
|
||||
// Computes a relative angle based on Link's (or some other actor's) current angle.
|
||||
Vec3s ActorAccessibility_ComputeRelativeAngle(Vec3s* origin, Vec3s* offset);
|
||||
void ActorAccessibility_InitCues();
|
||||
// Stuff related to lists of virtual actors.
|
||||
typedef enum {
|
||||
// Similar to the game's actual actor table
|
||||
|
@ -155,8 +159,6 @@ typedef enum {
|
|||
VA_MAX,
|
||||
} VIRTUAL_ACTOR_TABLE;
|
||||
|
||||
#define EVERYWHERE -32768 // Denotes a virtual actor that is global
|
||||
|
||||
// Get the list of virtual actors for a given scene and room index.
|
||||
VirtualActorList* ActorAccessibility_GetVirtualActorList(s16 sceneNum, s8 roomNum);
|
||||
AccessibleActor* ActorAccessibility_AddVirtualActor(VirtualActorList* list, VIRTUAL_ACTOR_TABLE type, Vec3f where);
|
||||
|
|
|
@ -1374,18 +1374,4 @@ void accessible_va_terrain_cue(AccessibleActor* actor) {
|
|||
|
||||
for (int i = 0; i < 3; i++)
|
||||
state->directions[i].scan();
|
||||
}
|
||||
|
||||
void ActorAccessibility_InitCues() {
|
||||
ActorAccessibilityPolicy policy;
|
||||
ActorAccessibility_InitPolicy(&policy, "Terrain cue helper", accessible_va_terrain_cue);
|
||||
policy.n = 1;
|
||||
policy.runsAlways = true;
|
||||
policy.distance = 500;
|
||||
policy.initUserData = ActorAccessibility_InitTerrainCueState;
|
||||
policy.cleanupUserData = ActorAccessibility_CleanupTerrainCueState;
|
||||
|
||||
ActorAccessibility_AddSupportedActor(VA_TERRAIN_CUE, policy);
|
||||
VirtualActorList* list = ActorAccessibility_GetVirtualActorList(EVERYWHERE, 0);
|
||||
ActorAccessibility_AddVirtualActor(list, VA_TERRAIN_CUE, { 0, 0, 0 });
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue