mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-19 13:00:11 -07:00
fix archive creation, must be o2r
This commit is contained in:
parent
d9760694d8
commit
17d2e39a57
9 changed files with 1598 additions and 1765 deletions
|
@ -14,60 +14,55 @@
|
||||||
|
|
||||||
std::vector<uint32_t> buttonList = { BTN_A, BTN_B, BTN_CUP, BTN_CDOWN, BTN_CLEFT, BTN_CRIGHT, BTN_L,
|
std::vector<uint32_t> buttonList = { BTN_A, BTN_B, BTN_CUP, BTN_CDOWN, BTN_CLEFT, BTN_CRIGHT, BTN_L,
|
||||||
BTN_Z, BTN_R, BTN_START, BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT };
|
BTN_Z, BTN_R, BTN_START, BTN_DUP, BTN_DDOWN, BTN_DLEFT, BTN_DRIGHT };
|
||||||
//Declarations specific to chests.
|
// Declarations specific to chests.
|
||||||
#include "overlays/actors/ovl_En_Box/z_en_box.h"
|
#include "overlays/actors/ovl_En_Box/z_en_box.h"
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
void EnBox_WaitOpen(EnBox*, PlayState*);
|
void EnBox_WaitOpen(EnBox*, PlayState*);
|
||||||
}
|
}
|
||||||
//Declarations specific to Babas.
|
// Declarations specific to Babas.
|
||||||
#include "overlays/actors/ovl_En_Karebaba/z_en_karebaba.h"
|
#include "overlays/actors/ovl_En_Karebaba/z_en_karebaba.h"
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
void EnKarebaba_DeadItemDrop(EnKarebaba*, PlayState*);
|
void EnKarebaba_DeadItemDrop(EnKarebaba*, PlayState*);
|
||||||
}
|
}
|
||||||
//Declarations specific to Torches
|
// Declarations specific to Torches
|
||||||
#include "overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h"
|
#include "overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h"
|
||||||
//Declarations specific to dogs
|
// Declarations specific to dogs
|
||||||
#include "overlays/actors/ovl_En_Dog/z_en_dog.h"
|
#include "overlays/actors/ovl_En_Dog/z_en_dog.h"
|
||||||
extern "C" {
|
extern "C" {
|
||||||
void EnDog_FollowPlayer(EnDog*, PlayState*);
|
void EnDog_FollowPlayer(EnDog*, PlayState*);
|
||||||
s8 EnDog_CanFollow(EnDog*, PlayState*);
|
s8 EnDog_CanFollow(EnDog*, PlayState*);
|
||||||
}
|
}
|
||||||
//User data for the general helper VA.
|
// User data for the general helper VA.
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
s16 currentScene;
|
s16 currentScene;
|
||||||
s8 currentRoom;
|
s8 currentRoom;
|
||||||
bool currentRoomClear;
|
bool currentRoomClear;
|
||||||
|
|
||||||
}GeneralHelperData;
|
} GeneralHelperData;
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
f32 linearVelocity;
|
f32 linearVelocity;
|
||||||
int framesUntilChime;
|
int framesUntilChime;
|
||||||
|
|
||||||
}AudioCompassData;
|
} AudioCompassData;
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
int framesUntilAboveChime;
|
int framesUntilAboveChime;
|
||||||
|
|
||||||
}SwitchData;
|
} SwitchData;
|
||||||
|
|
||||||
// Begin actor-specific policy callbacks.
|
// Begin actor-specific policy callbacks.
|
||||||
|
|
||||||
void accessible_en_ishi(AccessibleActor* actor) {
|
void accessible_en_ishi(AccessibleActor* actor) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_OCTAROCK_ROCK, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_OCTAROCK_ROCK, false);
|
||||||
//ActorAccessibility_PlaySpecialSound(actor, NA_SE_EN_OCTAROCK_ROCK);
|
// ActorAccessibility_PlaySpecialSound(actor, NA_SE_EN_OCTAROCK_ROCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_en_NPC_Gen(AccessibleActor* actor) {
|
void accessible_en_NPC_Gen(AccessibleActor* actor) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_VO_NB_LAUGH, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_VO_NB_LAUGH, false);
|
||||||
|
|
||||||
}
|
}
|
||||||
void accessible_en_chest(AccessibleActor* actor) {
|
void accessible_en_chest(AccessibleActor* actor) {
|
||||||
|
|
||||||
|
|
||||||
Player* player = GET_PLAYER(actor->play);
|
Player* player = GET_PLAYER(actor->play);
|
||||||
EnBox* chest = (EnBox*)actor->actor;
|
EnBox* chest = (EnBox*)actor->actor;
|
||||||
if (chest->actionFunc != EnBox_WaitOpen)
|
if (chest->actionFunc != EnBox_WaitOpen)
|
||||||
|
@ -77,12 +72,13 @@ void accessible_en_chest(AccessibleActor* actor) {
|
||||||
if (chest->type <= 8 && chest->type >= 5) {
|
if (chest->type <= 8 && chest->type >= 5) {
|
||||||
size = 15; // small
|
size = 15; // small
|
||||||
} else {
|
} else {
|
||||||
size = 30;//large
|
size = 30; // large
|
||||||
}
|
}
|
||||||
if (!(treasureFlag >= 20 && treasureFlag < 32)) {
|
if (!(treasureFlag >= 20 && treasureFlag < 32)) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_TBOX_UNLOCK, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_TBOX_UNLOCK, false);
|
||||||
}
|
}
|
||||||
//Only chests that are "waiting to be opened" should play a sound. Chests which have not yet appeared (because some enemy has not been killed, switch has not been hit, etc) will not be in this action mode.
|
// Only chests that are "waiting to be opened" should play a sound. Chests which have not yet appeared (because some
|
||||||
|
// enemy has not been killed, switch has not been hit, etc) will not be in this action mode.
|
||||||
f32 leftAngle = actor->actor->world.rot.y - 16384;
|
f32 leftAngle = actor->actor->world.rot.y - 16384;
|
||||||
f32 velocityXRight = Math_SinS(leftAngle);
|
f32 velocityXRight = Math_SinS(leftAngle);
|
||||||
f32 velocityZRight = Math_CosS(leftAngle);
|
f32 velocityZRight = Math_CosS(leftAngle);
|
||||||
|
@ -92,22 +88,19 @@ void accessible_en_chest(AccessibleActor* actor) {
|
||||||
f32 velocityZFront = Math_CosS(frontAngle);
|
f32 velocityZFront = Math_CosS(frontAngle);
|
||||||
|
|
||||||
f32 xdist = (player->actor.world.pos.x - actor->actor->world.pos.x) * velocityXFront +
|
f32 xdist = (player->actor.world.pos.x - actor->actor->world.pos.x) * velocityXFront +
|
||||||
(player->actor.world.pos.z-actor->actor->world.pos.z) * velocityZFront;
|
(player->actor.world.pos.z - actor->actor->world.pos.z) * velocityZFront;
|
||||||
f32 zdist = fabs((player->actor.world.pos.x - actor->actor->world.pos.x) * velocityXRight +
|
f32 zdist = fabs((player->actor.world.pos.x - actor->actor->world.pos.x) * velocityXRight +
|
||||||
(player->actor.world.pos.z-actor->actor->world.pos.z) * velocityZRight);
|
(player->actor.world.pos.z - actor->actor->world.pos.z) * velocityZRight);
|
||||||
|
|
||||||
|
|
||||||
if ((xdist - size / 2) < 0) {
|
if ((xdist - size / 2) < 0) {
|
||||||
ActorAccessibility_SetSoundPitch(actor, 0, 0.5);
|
ActorAccessibility_SetSoundPitch(actor, 0, 0.5);
|
||||||
} else if ((xdist + size / 2) > 0 && zdist < size / 2 && xdist < 150.0) {
|
} else if ((xdist + size / 2) > 0 && zdist < size / 2 && xdist < 150.0) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 1, NA_SE_EV_DIAMOND_SWITCH, false);
|
ActorAccessibility_PlaySoundForActor(actor, 1, NA_SE_EV_DIAMOND_SWITCH, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_en_gerudo(AccessibleActor* actor) {
|
void accessible_en_gerudo(AccessibleActor* actor) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_VO_NB_LAUGH, false);//update sound for ones that detect you
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_VO_NB_LAUGH, false); // update sound for ones that detect you
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_en_Sign(AccessibleActor* actor) {
|
void accessible_en_Sign(AccessibleActor* actor) {
|
||||||
|
@ -154,7 +147,7 @@ void accessible_torches(AccessibleActor* actor) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//unlit permanent torches
|
// unlit permanent torches
|
||||||
if ((actor->actor->params) == 8192) {
|
if ((actor->actor->params) == 8192) {
|
||||||
if (torche->litTimer == 0) {
|
if (torche->litTimer == 0) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_IT_BOMB_IGNIT, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_IT_BOMB_IGNIT, false);
|
||||||
|
@ -162,7 +155,7 @@ void accessible_torches(AccessibleActor* actor) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_ANUBIS_FIRE, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_ANUBIS_FIRE, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//lit permanent torches
|
// lit permanent torches
|
||||||
if ((actor->actor->params) == 9216 || (actor->actor->params) == 962) {
|
if ((actor->actor->params) == 9216 || (actor->actor->params) == 962) {
|
||||||
|
|
||||||
actor->policy.volume = 0.5;
|
actor->policy.volume = 0.5;
|
||||||
|
@ -187,18 +180,15 @@ bool accessible_switch_init(AccessibleActor* actor) {
|
||||||
SwitchData* data = (SwitchData*)malloc(sizeof(SwitchData));
|
SwitchData* data = (SwitchData*)malloc(sizeof(SwitchData));
|
||||||
data->framesUntilAboveChime = 0;
|
data->framesUntilAboveChime = 0;
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return false;//failure to allocate memory.
|
return false; // failure to allocate memory.
|
||||||
actor->userData = (void*) data;
|
actor->userData = (void*)data;
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
void accessible_switch_cleanup(AccessibleActor* actor)
|
void accessible_switch_cleanup(AccessibleActor* actor) {
|
||||||
{
|
|
||||||
free(actor->userData);
|
free(actor->userData);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_switch(AccessibleActor * actor) {
|
void accessible_switch(AccessibleActor* actor) {
|
||||||
|
|
||||||
SwitchData* data = (SwitchData*)actor->userData;
|
SwitchData* data = (SwitchData*)actor->userData;
|
||||||
|
|
||||||
|
@ -211,26 +201,24 @@ void accessible_switch_cleanup(AccessibleActor* actor)
|
||||||
}
|
}
|
||||||
if (scale.y >= 33.0f / 200.0f) {
|
if (scale.y >= 33.0f / 200.0f) {
|
||||||
if (actor->play->sceneNum == 0 && actor->play->roomCtx.curRoom.num == 5 && actor->xzDistToPlayer < 20) {
|
if (actor->play->sceneNum == 0 && actor->play->roomCtx.curRoom.num == 5 && actor->xzDistToPlayer < 20) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_DIAMOND_SWITCH, false);//Should result in same behaviour.
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_DIAMOND_SWITCH,
|
||||||
|
false); // Should result in same behaviour.
|
||||||
}
|
}
|
||||||
if (actor->frameCount % 30 != 0) {
|
if (actor->frameCount % 30 != 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 1, NA_SE_EV_FOOT_SWITCH, false);
|
ActorAccessibility_PlaySoundForActor(actor, 1, NA_SE_EV_FOOT_SWITCH, false);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (actor->frameCount % 30 != 0) {
|
} else if (actor->frameCount % 30 != 0) {
|
||||||
return;
|
return;
|
||||||
}
|
} else if ((actor->actor->params & 7) == 1) {
|
||||||
else if ((actor->actor->params & 7) == 1) {
|
|
||||||
if (actor->xyzDistToPlayer > 800) {
|
if (actor->xyzDistToPlayer > 800) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (scale.y >= 33.0f / 200.0f) { //(!(Flags_GetSwitch(actor->play, (actor->params >> 8 & 0x3F)))) {
|
if (scale.y >= 33.0f / 200.0f) { //(!(Flags_GetSwitch(actor->play, (actor->params >> 8 & 0x3F)))) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_IT_HAMMER_HIT, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_IT_HAMMER_HIT, false);
|
||||||
}
|
}
|
||||||
}
|
} else if ((actor->actor->params & 7) == 2) {
|
||||||
else if ((actor->actor->params & 7) == 2) {
|
|
||||||
if (sw->eyeTexIndex == 0) { //(!(Flags_GetSwitch(actor->play, (actor->params >> 8 & 0x3F))))
|
if (sw->eyeTexIndex == 0) { //(!(Flags_GetSwitch(actor->play, (actor->params >> 8 & 0x3F))))
|
||||||
// make it only play for open eye
|
// make it only play for open eye
|
||||||
actor->policy.aimAssist.isProvider = true;
|
actor->policy.aimAssist.isProvider = true;
|
||||||
|
@ -243,9 +231,7 @@ void accessible_switch_cleanup(AccessibleActor* actor)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_DIAMOND_SWITCH, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_DIAMOND_SWITCH, false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_larva(AccessibleActor* actor) {
|
void accessible_larva(AccessibleActor* actor) {
|
||||||
|
@ -261,7 +247,6 @@ void accessible_va_prototype(AccessibleActor* actor) {
|
||||||
|
|
||||||
Player* player = GET_PLAYER(actor->play);
|
Player* player = GET_PLAYER(actor->play);
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_IT_BOMB_EXPLOSION, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_IT_BOMB_EXPLOSION, false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_maruta(AccessibleActor* actor) {
|
void accessible_maruta(AccessibleActor* actor) {
|
||||||
|
@ -288,7 +273,7 @@ void accessible_area_change(AccessibleActor* actor) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_FANTOM_WARP_L, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_FANTOM_WARP_L, false);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
//hyrule field attenuation
|
// hyrule field attenuation
|
||||||
if (actor->play->sceneNum == 81) {
|
if (actor->play->sceneNum == 81) {
|
||||||
if (actor->xzDistToPlayer > 700) {
|
if (actor->xzDistToPlayer > 700) {
|
||||||
actor->policy.distance = actor->xzDistToPlayer * 1.2;
|
actor->policy.distance = actor->xzDistToPlayer * 1.2;
|
||||||
|
@ -302,7 +287,7 @@ void accessible_area_change(AccessibleActor* actor) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//kakariko village attenuation
|
// kakariko village attenuation
|
||||||
else if (actor->play->sceneNum == 82) {
|
else if (actor->play->sceneNum == 82) {
|
||||||
if (actor->sceneIndex == 83 || actor->sceneIndex == 81 || actor->sceneIndex == 96) {
|
if (actor->sceneIndex == 83 || actor->sceneIndex == 81 || actor->sceneIndex == 96) {
|
||||||
actor->policy.runsAlways = true;
|
actor->policy.runsAlways = true;
|
||||||
|
@ -325,8 +310,7 @@ void accessible_area_change(AccessibleActor* actor) {
|
||||||
} else if (actor->sceneIndex == 8) {
|
} else if (actor->sceneIndex == 8) {
|
||||||
if (!(((gSaveContext.eventChkInf[6]) >> (7)) & 1))
|
if (!(((gSaveContext.eventChkInf[6]) >> (7)) & 1))
|
||||||
return;
|
return;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
actor->policy.ydist = 500;
|
actor->policy.ydist = 500;
|
||||||
actor->policy.distance = 1000;
|
actor->policy.distance = 1000;
|
||||||
if (actor->xzDistToPlayer > 1000) {
|
if (actor->xzDistToPlayer > 1000) {
|
||||||
|
@ -335,7 +319,6 @@ void accessible_area_change(AccessibleActor* actor) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
else if (actor->play->sceneNum == 91 || actor->play->sceneNum == 69 || actor->play->sceneNum == 70) {
|
else if (actor->play->sceneNum == 91 || actor->play->sceneNum == 69 || actor->play->sceneNum == 70) {
|
||||||
actor->policy.distance = 1000;
|
actor->policy.distance = 1000;
|
||||||
if (actor->xzDistToPlayer > 1000) {
|
if (actor->xzDistToPlayer > 1000) {
|
||||||
|
@ -360,17 +343,17 @@ void accessible_area_change(AccessibleActor* actor) {
|
||||||
} else {
|
} else {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_SARIA_MELODY, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_SARIA_MELODY, false);
|
||||||
}
|
}
|
||||||
//kokiri forest and lost woods
|
// kokiri forest and lost woods
|
||||||
} else if (actor->play->sceneNum >= 17 && actor->play->sceneNum <= 25) {
|
} else if (actor->play->sceneNum >= 17 && actor->play->sceneNum <= 25) {
|
||||||
return; // dont check for entrances while in boss rooms
|
return; // dont check for entrances while in boss rooms
|
||||||
} else if (actor->sceneIndex == 81) {
|
} else if (actor->sceneIndex == 81) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_HORSE_RUN_LEVEL, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_HORSE_RUN_LEVEL, false);
|
||||||
//hyrule field
|
// hyrule field
|
||||||
} else if (actor->sceneIndex == 10 && actor->play->sceneNum != 85) {//temp
|
} else if (actor->sceneIndex == 10 && actor->play->sceneNum != 85) { // temp
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_OC_DOOR_OPEN, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_OC_DOOR_OPEN, false);
|
||||||
} else if (actor->sceneIndex <= 11) {
|
} else if (actor->sceneIndex <= 11) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_FANTOM_WARP_L, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_FANTOM_WARP_L, false);
|
||||||
//dungeons
|
// dungeons
|
||||||
} else if (actor->sceneIndex >= 27 && actor->sceneIndex <= 29) {
|
} else if (actor->sceneIndex >= 27 && actor->sceneIndex <= 29) {
|
||||||
if (actor->play->sceneNum >= 32 && actor->play->sceneNum <= 34) {
|
if (actor->play->sceneNum >= 32 && actor->play->sceneNum <= 34) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_HORSE_RUN_LEVEL, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_HORSE_RUN_LEVEL, false);
|
||||||
|
@ -379,7 +362,7 @@ void accessible_area_change(AccessibleActor* actor) {
|
||||||
}
|
}
|
||||||
} else if (actor->sceneIndex >= 30 && actor->sceneIndex <= 33) {
|
} else if (actor->sceneIndex >= 30 && actor->sceneIndex <= 33) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_SMALL_DOG_BARK, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_SMALL_DOG_BARK, false);
|
||||||
//market sound
|
// market sound
|
||||||
} else if ((actor->sceneIndex >= 34 && actor->sceneIndex <= 36) || actor->sceneIndex == 67) {
|
} else if ((actor->sceneIndex >= 34 && actor->sceneIndex <= 36) || actor->sceneIndex == 67) {
|
||||||
if (actor->play->sceneNum == 67) {
|
if (actor->play->sceneNum == 67) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_SMALL_DOG_BARK, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_SMALL_DOG_BARK, false);
|
||||||
|
@ -387,55 +370,54 @@ void accessible_area_change(AccessibleActor* actor) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_STONE_BOUND, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_STONE_BOUND, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//ToT sound
|
// ToT sound
|
||||||
} else if (actor->sceneIndex == 69 || actor->sceneIndex == 70) {
|
} else if (actor->sceneIndex == 69 || actor->sceneIndex == 70) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_MUSI_SINK, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_MUSI_SINK, false);
|
||||||
} else if (actor->sceneIndex == 82) {
|
} else if (actor->sceneIndex == 82) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_CHICKEN_CRY_M, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_CHICKEN_CRY_M, false);
|
||||||
//kakariko sound
|
// kakariko sound
|
||||||
} else if (actor->sceneIndex == 83) {
|
} else if (actor->sceneIndex == 83) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_PO_APPEAR, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_PO_APPEAR, false);
|
||||||
//graveyard sound
|
// graveyard sound
|
||||||
} else if (actor->sceneIndex == 84 || actor->sceneIndex == 88 || actor->sceneIndex == 89) { //last one is zora fountain maybe seperate?
|
} else if (actor->sceneIndex == 84 || actor->sceneIndex == 88 ||
|
||||||
|
actor->sceneIndex == 89) { // last one is zora fountain maybe seperate?
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_RIVER_STREAM_S, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_RIVER_STREAM_S, false);
|
||||||
//zora sound
|
// zora sound
|
||||||
} else if (actor->sceneIndex == 86) {//might not need to exist
|
} else if (actor->sceneIndex == 86) { // might not need to exist
|
||||||
//forest medow sound
|
// forest medow sound
|
||||||
} else if (actor->sceneIndex == 87) {
|
} else if (actor->sceneIndex == 87) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_WATER_WALL, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_WATER_WALL, false);
|
||||||
//Lake Hylia sound
|
// Lake Hylia sound
|
||||||
} else if (actor->sceneIndex == 90 || actor->sceneIndex == 93) { //gerudo valley and fortress
|
} else if (actor->sceneIndex == 90 || actor->sceneIndex == 93) { // gerudo valley and fortress
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_GERUDOFT_BREATH, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_GERUDOFT_BREATH, false);
|
||||||
//gerudo valley sound
|
// gerudo valley sound
|
||||||
} else if (actor->sceneIndex == 92 || actor->sceneIndex == 94) {//haunted wasteland and desert colosus
|
} else if (actor->sceneIndex == 92 || actor->sceneIndex == 94) { // haunted wasteland and desert colosus
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_SAND_STORM, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_SAND_STORM, false);
|
||||||
|
|
||||||
} else if (actor->sceneIndex == 100 || actor->sceneIndex ==95) {
|
} else if (actor->sceneIndex == 100 || actor->sceneIndex == 95) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_BRIDGE_OPEN, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_BRIDGE_OPEN, false);
|
||||||
//Hyrule Castle sound
|
// Hyrule Castle sound
|
||||||
} else if (actor->sceneIndex == 96) {
|
} else if (actor->sceneIndex == 96) {
|
||||||
|
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_DODO_K_ROLL, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_DODO_K_ROLL, false);
|
||||||
//DMT sound
|
// DMT sound
|
||||||
} else if (actor->sceneIndex == 97) {
|
} else if (actor->sceneIndex == 97) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_DODO_K_LAVA, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_DODO_K_LAVA, false);
|
||||||
//DMC sound
|
// DMC sound
|
||||||
} else if (actor->sceneIndex == 98) {
|
} else if (actor->sceneIndex == 98) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_DARUNIA_HIT_BREAST, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_DARUNIA_HIT_BREAST, false);
|
||||||
//Goron City
|
// Goron City
|
||||||
} else if (actor->sceneIndex == 99) {
|
} else if (actor->sceneIndex == 99) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_COW_CRY, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_COW_CRY, false);
|
||||||
//Lon Lon
|
// Lon Lon
|
||||||
} else if (actor->sceneIndex >= 17 && actor->sceneIndex <= 25) {
|
} else if (actor->sceneIndex >= 17 && actor->sceneIndex <= 25) {
|
||||||
return;//boss rooms
|
return; // boss rooms
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
actor->policy.distance = 500;
|
actor->policy.distance = 500;
|
||||||
if (actor->play->sceneNum == 83) {
|
if (actor->play->sceneNum == 83) {
|
||||||
actor->policy.ydist = 0;
|
actor->policy.ydist = 0;
|
||||||
}
|
}
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_OC_DOOR_OPEN, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_OC_DOOR_OPEN, false);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,7 +437,6 @@ void accessible_231_dekus(AccessibleActor* actor) {
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_hana(AccessibleActor* actor) {
|
void accessible_hana(AccessibleActor* actor) {
|
||||||
|
@ -464,7 +445,6 @@ void accessible_hana(AccessibleActor* actor) {
|
||||||
} else if (actor->actor->params == 0) {
|
} else if (actor->actor->params == 0) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_DIG_UP, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_DIG_UP, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_climable(AccessibleActor* actor) {
|
void accessible_climable(AccessibleActor* actor) {
|
||||||
|
@ -482,14 +462,15 @@ void accessible_en_guard(AccessibleActor* actor) {
|
||||||
f32 guardsfx = NA_SE_IT_SWORD_IMPACT;
|
f32 guardsfx = NA_SE_IT_SWORD_IMPACT;
|
||||||
if (fabs(actor->actor->world.pos.x - player->actor.world.pos.x) >
|
if (fabs(actor->actor->world.pos.x - player->actor.world.pos.x) >
|
||||||
fabs(actor->actor->world.pos.z - player->actor.world.pos.z)) {
|
fabs(actor->actor->world.pos.z - player->actor.world.pos.z)) {
|
||||||
if (fabs(actor->actor->shape.rot.y - 16384) <1000) { if (actor->actor->world.pos.x < player->actor.world.pos.x) {
|
if (fabs(actor->actor->shape.rot.y - 16384) < 1000) {
|
||||||
|
if (actor->actor->world.pos.x < player->actor.world.pos.x) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, guardsfx, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, guardsfx, false);
|
||||||
ActorAccessibility_SetSoundPitch(actor, 0, 2.0);
|
ActorAccessibility_SetSoundPitch(actor, 0, 2.0);
|
||||||
} else {
|
} else {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, guardsfx, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, guardsfx, false);
|
||||||
ActorAccessibility_SetSoundPitch(actor, 0, 0.2);
|
ActorAccessibility_SetSoundPitch(actor, 0, 0.2);
|
||||||
}
|
}
|
||||||
} else if ((actor->actor->shape.rot.y + 16384)<1000) {
|
} else if ((actor->actor->shape.rot.y + 16384) < 1000) {
|
||||||
if (actor->actor->world.pos.x < player->actor.world.pos.x) {
|
if (actor->actor->world.pos.x < player->actor.world.pos.x) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, guardsfx, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, guardsfx, false);
|
||||||
ActorAccessibility_SetSoundPitch(actor, 0, 0.2);
|
ActorAccessibility_SetSoundPitch(actor, 0, 0.2);
|
||||||
|
@ -510,7 +491,7 @@ void accessible_en_guard(AccessibleActor* actor) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, guardsfx, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, guardsfx, false);
|
||||||
ActorAccessibility_SetSoundPitch(actor, 0, 0.2);
|
ActorAccessibility_SetSoundPitch(actor, 0, 0.2);
|
||||||
}
|
}
|
||||||
} else if (fabs(actor->actor->shape.rot.y+32768)<1000) {
|
} else if (fabs(actor->actor->shape.rot.y + 32768) < 1000) {
|
||||||
if (actor->actor->world.pos.z < player->actor.world.pos.z) {
|
if (actor->actor->world.pos.z < player->actor.world.pos.z) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, guardsfx, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, guardsfx, false);
|
||||||
ActorAccessibility_SetSoundPitch(actor, 0, 0.2);
|
ActorAccessibility_SetSoundPitch(actor, 0, 0.2);
|
||||||
|
@ -523,8 +504,6 @@ void accessible_en_guard(AccessibleActor* actor) {
|
||||||
ActorAccessibility_SetSoundPitch(actor, 0, 1.0);
|
ActorAccessibility_SetSoundPitch(actor, 0, 1.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_en_dogs(AccessibleActor* actor) {
|
void accessible_en_dogs(AccessibleActor* actor) {
|
||||||
|
@ -533,14 +512,12 @@ void accessible_en_dogs(AccessibleActor* actor) {
|
||||||
dog->actionFunc = EnDog_FollowPlayer;
|
dog->actionFunc = EnDog_FollowPlayer;
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_DIAMOND_SWITCH, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_DIAMOND_SWITCH, false);
|
||||||
ActorAccessibility_SetSoundPitch(actor, 0, 1.0);
|
ActorAccessibility_SetSoundPitch(actor, 0, 1.0);
|
||||||
|
|
||||||
}
|
}
|
||||||
if (actor->frameCount % 30 != 0) {
|
if (actor->frameCount % 30 != 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (actor->actor->params == 608 || actor->actor->params == 336 || actor->actor->params == 304 ||
|
if (actor->actor->params == 608 || actor->actor->params == 336 || actor->actor->params == 304 ||
|
||||||
actor->actor->params == 3088 ||
|
actor->actor->params == 3088 || actor->actor->params == 2576 || actor->actor->params < 0) {
|
||||||
actor->actor->params == 2576 || actor->actor->params <0) {
|
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_SMALL_DOG_BARK, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_SMALL_DOG_BARK, false);
|
||||||
|
|
||||||
ActorAccessibility_SetSoundPitch(actor, 0, 2.0);
|
ActorAccessibility_SetSoundPitch(actor, 0, 2.0);
|
||||||
|
@ -548,7 +525,6 @@ void accessible_en_dogs(AccessibleActor* actor) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_SMALL_DOG_BARK, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_SMALL_DOG_BARK, false);
|
||||||
ActorAccessibility_SetSoundPitch(actor, 0, 0.5);
|
ActorAccessibility_SetSoundPitch(actor, 0, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_goma(AccessibleActor* actor) {
|
void accessible_goma(AccessibleActor* actor) {
|
||||||
|
@ -562,7 +538,7 @@ void accessible_door_of_time(AccessibleActor* actor) {
|
||||||
ActorAccessibility_PlaySampleForActor(actor, 0, "Chanting", false);
|
ActorAccessibility_PlaySampleForActor(actor, 0, "Chanting", false);
|
||||||
ActorAccessibility_SetSoundPitch(actor, 0, 1.0);
|
ActorAccessibility_SetSoundPitch(actor, 0, 1.0);
|
||||||
|
|
||||||
//ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_DIAMOND_SWITCH, false);
|
// ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_DIAMOND_SWITCH, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_sticks(AccessibleActor* actor) {
|
void accessible_sticks(AccessibleActor* actor) {
|
||||||
|
@ -574,7 +550,6 @@ void accessible_sticks(AccessibleActor* actor) {
|
||||||
|
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_NUTS_DAMAGE, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_NUTS_DAMAGE, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_graveyard_soil(AccessibleActor* actor) {
|
void accessible_graveyard_soil(AccessibleActor* actor) {
|
||||||
|
@ -602,40 +577,31 @@ bool accessible_general_helper_init(AccessibleActor* actor) {
|
||||||
|
|
||||||
actor->userData = data;
|
actor->userData = data;
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
void accessible_general_helper_cleanup(AccessibleActor* actor)
|
void accessible_general_helper_cleanup(AccessibleActor* actor) {
|
||||||
{
|
|
||||||
free(actor->userData);
|
free(actor->userData);
|
||||||
actor->userData = NULL;
|
actor->userData = NULL;
|
||||||
}
|
}
|
||||||
void accessible_va_general_helper(AccessibleActor* actor)
|
void accessible_va_general_helper(AccessibleActor* actor) {
|
||||||
{
|
|
||||||
GeneralHelperData* data = (GeneralHelperData*)actor->userData;
|
GeneralHelperData* data = (GeneralHelperData*)actor->userData;
|
||||||
if (data->currentScene == actor->play->sceneNum && data->currentRoom != actor->play->roomCtx.curRoom.num)
|
if (data->currentScene == actor->play->sceneNum && data->currentRoom != actor->play->roomCtx.curRoom.num) {
|
||||||
{
|
|
||||||
ActorAccessibility_AnnounceRoomNumber(actor->play);
|
ActorAccessibility_AnnounceRoomNumber(actor->play);
|
||||||
data->currentRoom = actor->play->roomCtx.curRoom.num;
|
data->currentRoom = actor->play->roomCtx.curRoom.num;
|
||||||
data->currentRoomClear = Flags_GetClear(actor->play, data->currentRoom);
|
data->currentRoomClear = Flags_GetClear(actor->play, data->currentRoom);
|
||||||
}
|
}
|
||||||
if (data->currentScene != actor->play->sceneNum)
|
if (data->currentScene != actor->play->sceneNum) {
|
||||||
{
|
|
||||||
ActorAccessibility_InterpretCurrentScene(actor->play);
|
ActorAccessibility_InterpretCurrentScene(actor->play);
|
||||||
data->currentScene = actor->play->sceneNum;
|
data->currentScene = actor->play->sceneNum;
|
||||||
data->currentRoom = actor->play->roomCtx.curRoom.num;
|
data->currentRoom = actor->play->roomCtx.curRoom.num;
|
||||||
data->currentRoomClear = Flags_GetClear(actor->play, data->currentRoom);
|
data->currentRoomClear = Flags_GetClear(actor->play, data->currentRoom);
|
||||||
|
|
||||||
}
|
}
|
||||||
//Report when a room is completed.
|
// Report when a room is completed.
|
||||||
if (!data->currentRoomClear && Flags_GetClear(actor->play, data->currentRoom))
|
if (!data->currentRoomClear && Flags_GetClear(actor->play, data->currentRoom)) {
|
||||||
{
|
|
||||||
data->currentRoomClear = Flags_GetClear(actor->play, data->currentRoom);
|
data->currentRoomClear = Flags_GetClear(actor->play, data->currentRoom);
|
||||||
ActorAccessibility_AnnounceRoomNumber(actor->play);
|
ActorAccessibility_AnnounceRoomNumber(actor->play);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool accessible_audio_compass_init(AccessibleActor* actor)
|
bool accessible_audio_compass_init(AccessibleActor* actor) {
|
||||||
{
|
|
||||||
AudioCompassData* data = (AudioCompassData*)malloc(sizeof(AudioCompassData));
|
AudioCompassData* data = (AudioCompassData*)malloc(sizeof(AudioCompassData));
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
@ -644,24 +610,22 @@ bool accessible_audio_compass_init(AccessibleActor* actor)
|
||||||
|
|
||||||
actor->userData = data;
|
actor->userData = data;
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
void accessible_audio_compass_cleanup(AccessibleActor* actor)
|
void accessible_audio_compass_cleanup(AccessibleActor* actor) {
|
||||||
{
|
|
||||||
free(actor->userData);
|
free(actor->userData);
|
||||||
}
|
}
|
||||||
void accessible_audio_compass(AccessibleActor* actor) {
|
void accessible_audio_compass(AccessibleActor* actor) {
|
||||||
Player* player = GET_PLAYER(actor->play);
|
Player* player = GET_PLAYER(actor->play);
|
||||||
if (player->stateFlags1 & PLAYER_STATE1_Z_TARGETING || player->stateFlags1 & PLAYER_STATE1_CLIMBING_LADDER)
|
if (player->stateFlags1 & PLAYER_STATE1_Z_TARGETING || player->stateFlags1 & PLAYER_STATE1_CLIMBING_LADDER)
|
||||||
return;
|
return;
|
||||||
OSContPad* trackerButtonsPressed = std::dynamic_pointer_cast<LUS::ControlDeck>(Ship::Context::GetInstance()->GetControlDeck())->GetPads();
|
OSContPad* trackerButtonsPressed =
|
||||||
|
std::dynamic_pointer_cast<LUS::ControlDeck>(Ship::Context::GetInstance()->GetControlDeck())->GetPads();
|
||||||
AudioCompassData* data = (AudioCompassData*)actor->userData;
|
AudioCompassData* data = (AudioCompassData*)actor->userData;
|
||||||
bool compassCombo = trackerButtonsPressed != nullptr && trackerButtonsPressed[0].button & buttonList[11] &&
|
bool compassCombo = trackerButtonsPressed != nullptr && trackerButtonsPressed[0].button & buttonList[11] &&
|
||||||
trackerButtonsPressed[0].button & buttonList[6];
|
trackerButtonsPressed[0].button & buttonList[6];
|
||||||
actor->world.pos = player->actor.world.pos;
|
actor->world.pos = player->actor.world.pos;
|
||||||
actor->world.pos.z -= 50;
|
actor->world.pos.z -= 50;
|
||||||
|
|
||||||
|
|
||||||
if (data->framesUntilChime > 0)
|
if (data->framesUntilChime > 0)
|
||||||
data->framesUntilChime--;
|
data->framesUntilChime--;
|
||||||
if (compassCombo && data->framesUntilChime <= 0) {
|
if (compassCombo && data->framesUntilChime <= 0) {
|
||||||
|
@ -670,47 +634,44 @@ void accessible_audio_compass(AccessibleActor* actor) {
|
||||||
data->framesUntilChime = 30;
|
data->framesUntilChime = 30;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Player* player = GET_PLAYER(actor->play);
|
/* Player* player = GET_PLAYER(actor->play);
|
||||||
if (player->stateFlags1 & PLAYER_STATE1_Z_TARGETING || player->stateFlags1 & PLAYER_STATE1_CLIMBING_LADDER)
|
if (player->stateFlags1 & PLAYER_STATE1_Z_TARGETING || player->stateFlags1 & PLAYER_STATE1_CLIMBING_LADDER)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
actor->world.pos = player->actor.world.pos;
|
actor->world.pos = player->actor.world.pos;
|
||||||
actor->world.pos.z -= 50;
|
actor->world.pos.z -= 50;
|
||||||
bool shouldChime = false;
|
bool shouldChime = false;
|
||||||
if (actor->world.rot.y != player->actor.world.rot.y) {
|
if (actor->world.rot.y != player->actor.world.rot.y) {
|
||||||
actor->world.rot.y = player->actor.world.rot.y;
|
actor->world.rot.y = player->actor.world.rot.y;
|
||||||
if (player->linearVelocity == 0)
|
if (player->linearVelocity == 0)
|
||||||
shouldChime = true;
|
shouldChime = true;
|
||||||
}
|
}
|
||||||
AudioCompassData* data = (AudioCompassData*)actor->userData;
|
AudioCompassData* data = (AudioCompassData*)actor->userData;
|
||||||
if (data->linearVelocity == 0.0 && player->linearVelocity > 0.0) {
|
if (data->linearVelocity == 0.0 && player->linearVelocity > 0.0) {
|
||||||
shouldChime = true;
|
shouldChime = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
data->linearVelocity = player->linearVelocity;
|
data->linearVelocity = player->linearVelocity;
|
||||||
if (data->framesUntilChime > 0)
|
if (data->framesUntilChime > 0)
|
||||||
data->framesUntilChime--;
|
data->framesUntilChime--;
|
||||||
if (shouldChime && data->framesUntilChime <= 0) {
|
if (shouldChime && data->framesUntilChime <= 0) {
|
||||||
|
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, actor->policy.sound, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, actor->policy.sound, false);
|
||||||
data->framesUntilChime = 10;
|
data->framesUntilChime = 10;
|
||||||
|
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void accessible_stick_warning(AccessibleActor* actor) {
|
void accessible_stick_warning(AccessibleActor* actor) {
|
||||||
Player* player = GET_PLAYER(actor->play);
|
Player* player = GET_PLAYER(actor->play);
|
||||||
actor->world.pos = player->actor.world.pos;
|
actor->world.pos = player->actor.world.pos;
|
||||||
actor->world.pos.z -= 50;
|
actor->world.pos.z -= 50;
|
||||||
if (fabs(player->unk_860 - 25) < 24.0 && player->heldItemId==0) {
|
if (fabs(player->unk_860 - 25) < 24.0 && player->heldItemId == 0) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_SY_WARNING_COUNT_N, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_SY_WARNING_COUNT_N, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActorAccessibility_InitActors() {
|
void ActorAccessibility_InitActors() {
|
||||||
const int Npc_Frames = 35;
|
const int Npc_Frames = 35;
|
||||||
ActorAccessibilityPolicy policy;
|
ActorAccessibilityPolicy policy;
|
||||||
ActorAccessibility_InitPolicy(&policy, "Rock", accessible_en_ishi, 0);
|
ActorAccessibility_InitPolicy(&policy, "Rock", accessible_en_ishi, 0);
|
||||||
|
@ -826,7 +787,7 @@ void accessible_stick_warning(AccessibleActor* actor) {
|
||||||
policy.distance = 800;
|
policy.distance = 800;
|
||||||
ActorAccessibility_AddSupportedActor(ACTOR_EN_KANBAN, policy);
|
ActorAccessibility_AddSupportedActor(ACTOR_EN_KANBAN, policy);
|
||||||
|
|
||||||
//ACTOR_EN_A_OBJ has exactly the same configuration.
|
// ACTOR_EN_A_OBJ has exactly the same configuration.
|
||||||
ActorAccessibility_AddSupportedActor(ACTOR_EN_A_OBJ, policy);
|
ActorAccessibility_AddSupportedActor(ACTOR_EN_A_OBJ, policy);
|
||||||
ActorAccessibility_InitPolicy(&policy, "Large Crate", NULL, NA_SE_EV_WOODBOX_BREAK);
|
ActorAccessibility_InitPolicy(&policy, "Large Crate", NULL, NA_SE_EV_WOODBOX_BREAK);
|
||||||
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_KIBAKO2, policy);
|
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_KIBAKO2, policy);
|
||||||
|
@ -882,7 +843,6 @@ void accessible_stick_warning(AccessibleActor* actor) {
|
||||||
policy.ydist = 200;
|
policy.ydist = 200;
|
||||||
policy.pitch = 1.1;
|
policy.pitch = 1.1;
|
||||||
|
|
||||||
|
|
||||||
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_SWITCH, policy);
|
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_SWITCH, policy);
|
||||||
ActorAccessibility_InitPolicy(&policy, "Ocarina Spots", NULL, NA_SE_EV_DIAMOND_SWITCH);
|
ActorAccessibility_InitPolicy(&policy, "Ocarina Spots", NULL, NA_SE_EV_DIAMOND_SWITCH);
|
||||||
policy.n = 30;
|
policy.n = 30;
|
||||||
|
@ -902,14 +862,14 @@ void accessible_stick_warning(AccessibleActor* actor) {
|
||||||
policy.distance = 800;
|
policy.distance = 800;
|
||||||
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_SYOKUDAI, policy);
|
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_SYOKUDAI, policy);
|
||||||
ActorAccessibility_InitPolicy(&policy, "Deku Tree Moving Platform", accessible_hasi, 0);
|
ActorAccessibility_InitPolicy(&policy, "Deku Tree Moving Platform", accessible_hasi, 0);
|
||||||
//policy.volume = 1.3;
|
// policy.volume = 1.3;
|
||||||
policy.distance = 1000;
|
policy.distance = 1000;
|
||||||
ActorAccessibility_AddSupportedActor(ACTOR_BG_YDAN_HASI, policy);
|
ActorAccessibility_AddSupportedActor(ACTOR_BG_YDAN_HASI, policy);
|
||||||
ActorAccessibility_InitPolicy(&policy, "Pot", NULL, NA_SE_EV_POT_BROKEN);
|
ActorAccessibility_InitPolicy(&policy, "Pot", NULL, NA_SE_EV_POT_BROKEN);
|
||||||
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_TSUBO, policy);
|
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_TSUBO, policy);
|
||||||
//ActorAccessibility_InitPolicy(&policy, "Deku Tree Entrance", NULL, NA_SE_EV_FANTOM_WARP_L);
|
// ActorAccessibility_InitPolicy(&policy, "Deku Tree Entrance", NULL, NA_SE_EV_FANTOM_WARP_L);
|
||||||
//policy.distance = 5000;
|
// policy.distance = 5000;
|
||||||
//ActorAccessibility_AddSupportedActor(ACTOR_BG_TREEMOUTH, policy);
|
// ActorAccessibility_AddSupportedActor(ACTOR_BG_TREEMOUTH, policy);
|
||||||
ActorAccessibility_InitPolicy(&policy, "Platform collapsable", NULL, NA_SE_EV_BLOCK_SHAKE);
|
ActorAccessibility_InitPolicy(&policy, "Platform collapsable", NULL, NA_SE_EV_BLOCK_SHAKE);
|
||||||
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_LIFT, policy);
|
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_LIFT, policy);
|
||||||
ActorAccessibility_InitPolicy(&policy, "Ladder in Slingshot Room", accessible_maruta, 0);
|
ActorAccessibility_InitPolicy(&policy, "Ladder in Slingshot Room", accessible_maruta, 0);
|
||||||
|
@ -964,9 +924,9 @@ void accessible_stick_warning(AccessibleActor* actor) {
|
||||||
policy.distance = 2000;
|
policy.distance = 2000;
|
||||||
ActorAccessibility_AddSupportedActor(VA_CRAWLSPACE, policy);
|
ActorAccessibility_AddSupportedActor(VA_CRAWLSPACE, policy);
|
||||||
ActorAccessibility_InitPolicy(&policy, "Ladder/climable", accessible_climable, 0);
|
ActorAccessibility_InitPolicy(&policy, "Ladder/climable", accessible_climable, 0);
|
||||||
//policy.volume = 1.5;
|
// policy.volume = 1.5;
|
||||||
policy.pitch = 1.3;
|
policy.pitch = 1.3;
|
||||||
//policy.distance = 2000;
|
// policy.distance = 2000;
|
||||||
ActorAccessibility_AddSupportedActor(VA_CLIMB, policy);
|
ActorAccessibility_AddSupportedActor(VA_CLIMB, policy);
|
||||||
ActorAccessibility_InitPolicy(&policy, "Door", NULL, NA_SE_OC_DOOR_OPEN);
|
ActorAccessibility_InitPolicy(&policy, "Door", NULL, NA_SE_OC_DOOR_OPEN);
|
||||||
policy.n = 30;
|
policy.n = 30;
|
||||||
|
@ -978,15 +938,14 @@ void accessible_stick_warning(AccessibleActor* actor) {
|
||||||
policy.n = 60;
|
policy.n = 60;
|
||||||
policy.distance = 100000;
|
policy.distance = 100000;
|
||||||
ActorAccessibility_AddSupportedActor(VA_AREA_CHANGE, policy);
|
ActorAccessibility_AddSupportedActor(VA_AREA_CHANGE, policy);
|
||||||
ActorAccessibility_InitPolicy(&policy, "marker", NULL,
|
ActorAccessibility_InitPolicy(&policy, "marker", NULL, NA_SE_EV_DIAMOND_SWITCH);
|
||||||
NA_SE_EV_DIAMOND_SWITCH);
|
|
||||||
policy.distance = 1000;
|
policy.distance = 1000;
|
||||||
policy.pitch = 1.7;
|
policy.pitch = 1.7;
|
||||||
ActorAccessibility_AddSupportedActor(VA_MARKER, policy);
|
ActorAccessibility_AddSupportedActor(VA_MARKER, policy);
|
||||||
//ActorAccessibility_InitPolicy(&policy, "Spike", NULL, NA_SE_EV_DIAMOND_SWITCH);
|
// ActorAccessibility_InitPolicy(&policy, "Spike", NULL, NA_SE_EV_DIAMOND_SWITCH);
|
||||||
//policy.distance = 200;
|
// policy.distance = 200;
|
||||||
//policy.pitch = 0.5;
|
// policy.pitch = 0.5;
|
||||||
//ActorAccessibility_AddSupportedActor(VA_SPIKE, policy);
|
// ActorAccessibility_AddSupportedActor(VA_SPIKE, policy);
|
||||||
ActorAccessibility_InitPolicy(&policy, "Stick Burnout Warning", accessible_stick_warning, 0);
|
ActorAccessibility_InitPolicy(&policy, "Stick Burnout Warning", accessible_stick_warning, 0);
|
||||||
policy.n = 1;
|
policy.n = 1;
|
||||||
policy.runsAlways = true;
|
policy.runsAlways = true;
|
||||||
|
@ -1002,27 +961,27 @@ void accessible_stick_warning(AccessibleActor* actor) {
|
||||||
policy.cleanupUserData = accessible_audio_compass_cleanup;
|
policy.cleanupUserData = accessible_audio_compass_cleanup;
|
||||||
policy.initUserData = accessible_audio_compass_init;
|
policy.initUserData = accessible_audio_compass_init;
|
||||||
policy.runsAlways = true;
|
policy.runsAlways = true;
|
||||||
policy.sound = NA_SE_EV_SHIP_BELL;//Setting this here so it's easy to change if we ever decide to change it.
|
policy.sound = NA_SE_EV_SHIP_BELL; // Setting this here so it's easy to change if we ever decide to change it.
|
||||||
policy.pitch = 0.5;
|
policy.pitch = 0.5;
|
||||||
|
|
||||||
|
|
||||||
ActorAccessibility_AddSupportedActor(VA_AUDIO_COMPASS, policy);
|
ActorAccessibility_AddSupportedActor(VA_AUDIO_COMPASS, policy);
|
||||||
|
|
||||||
// Now query a list of virtual actors for a given
|
// Now query a list of virtual actors for a given
|
||||||
// location (scene
|
// location (scene
|
||||||
// and room
|
// and room
|
||||||
// number).
|
// number).
|
||||||
VirtualActorList* list = (VirtualActorList*)ActorAccessibility_GetVirtualActorList(EVERYWHERE, 0);//Global/ omnipresent.
|
VirtualActorList* list =
|
||||||
|
(VirtualActorList*)ActorAccessibility_GetVirtualActorList(EVERYWHERE, 0); // Global/ omnipresent.
|
||||||
|
|
||||||
// Now place the actor.
|
// Now place the actor.
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_GENERAL_HELPER, { { 0.0, 0.0, 0.0 }, { 0, 0, 0 } });
|
ActorAccessibility_AddVirtualActor(list, VA_GENERAL_HELPER, { { 0.0, 0.0, 0.0 }, { 0, 0, 0 } });
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_AUDIO_COMPASS, { { 0.0, 0.0, 0.0}, { 0, 0, 0 } });
|
ActorAccessibility_AddVirtualActor(list, VA_AUDIO_COMPASS, { { 0.0, 0.0, 0.0 }, { 0, 0, 0 } });
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_STICK_WARNING, { { 0.0, 0.0, 0.0 }, { 0, 0, 0 } });
|
ActorAccessibility_AddVirtualActor(list, VA_STICK_WARNING, { { 0.0, 0.0, 0.0 }, { 0, 0, 0 } });
|
||||||
list = ActorAccessibility_GetVirtualActorList(85, 0); // Kokiri Forest
|
list = ActorAccessibility_GetVirtualActorList(85, 0); // Kokiri Forest
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_CRAWLSPACE, { { -784.0, 120.0, 1046.00 }, { 0, 14702, 0 } });
|
ActorAccessibility_AddVirtualActor(list, VA_CRAWLSPACE, { { -784.0, 120.0, 1046.00 }, { 0, 14702, 0 } });
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { 2146.5, 1.0, -142.8 } });
|
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { 2146.5, 1.0, -142.8 } });
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -547.0, 60.0, -1036.00 }, { 0, 14702, 0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -547.0, 60.0, -1036.00 }, { 0, 14702, 0 } });
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -29.0, -80.0, 983.00 }, { 0, 14702, 0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -29.0, -80.0, 983.00 }, { 0, 14702, 0 } });
|
||||||
/*ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { -448.0, 0.0, -528.00 }, { 0, 14702, 0 } });
|
/*ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { -448.0, 0.0, -528.00 }, { 0, 14702, 0 } });
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { -1082.0, 120.0, 383.00 }, { 0, 14702, 0 } });
|
ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { -1082.0, 120.0, 383.00 }, { 0, 14702, 0 } });
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { -27.0, 100.0, 1117.00 }, { 0, 14702, 0 } });
|
ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { -27.0, 100.0, 1117.00 }, { 0, 14702, 0 } });
|
||||||
|
@ -1030,50 +989,52 @@ void accessible_stick_warning(AccessibleActor* actor) {
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 1046.0, 0.0, 549.00 }, { 0, 14702, 0 } });
|
ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 1046.0, 0.0, 549.00 }, { 0, 14702, 0 } });
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 848.0, 0.0, -323.00 }, { 0, 14702, 0 } });
|
ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 848.0, 0.0, -323.00 }, { 0, 14702, 0 } });
|
||||||
*/
|
*/
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_AREA_CHANGE,{ { -317.0, 373.2, -1542.00 }, {0, 14702, 0 }}, AREA_KORIRI);
|
// ActorAccessibility_AddVirtualActor(list, VA_AREA_CHANGE,{ { -317.0, 373.2, -1542.00 }, {0, 14702, 0 }},
|
||||||
|
// AREA_KORIRI);
|
||||||
|
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_AREA_CHANGE, { { -1380.0, -67.0, -288.00 }, { 0, 14702, 0 } }, AREA_HYRULE_FIELD);
|
// ActorAccessibility_AddVirtualActor(list, VA_AREA_CHANGE, { { -1380.0, -67.0, -288.00 }, { 0, 14702, 0 } },
|
||||||
|
// AREA_HYRULE_FIELD);
|
||||||
|
|
||||||
list = ActorAccessibility_GetVirtualActorList(85, 2); // Kokiri Forest Room with boulder and kokiri sword
|
list = ActorAccessibility_GetVirtualActorList(85, 2); // Kokiri Forest Room with boulder and kokiri sword
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_CRAWLSPACE, { { -788.0, 120.0, 1392.00 }, { 0, 14702, 0 } });
|
ActorAccessibility_AddVirtualActor(list, VA_CRAWLSPACE, { { -788.0, 120.0, 1392.00 }, { 0, 14702, 0 } });
|
||||||
|
|
||||||
//list = ActorAccessibility_GetVirtualActorList(38, 0); //know-it-all house
|
// list = ActorAccessibility_GetVirtualActorList(38, 0); //know-it-all house
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 12.0, 0.0, -131.00 }, { 0, 14702, 0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 12.0, 0.0, -131.00 }, { 0, 14702, 0 } });
|
||||||
|
|
||||||
//list = ActorAccessibility_GetVirtualActorList(40, 0); // mido house
|
// list = ActorAccessibility_GetVirtualActorList(40, 0); // mido house
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { -6.6, 0.0, -179.00 }, { 0, 14702, 0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { -6.6, 0.0, -179.00 }, { 0, 14702, 0 } });
|
||||||
|
|
||||||
//list = ActorAccessibility_GetVirtualActorList(52, 0); // link's house
|
// list = ActorAccessibility_GetVirtualActorList(52, 0); // link's house
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 2.3, 0.0, -134.00 }, { 0, 14702, 0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 2.3, 0.0, -134.00 }, { 0, 14702, 0 } });
|
||||||
|
|
||||||
//list = ActorAccessibility_GetVirtualActorList(41, 0); // saria's house
|
// list = ActorAccessibility_GetVirtualActorList(41, 0); // saria's house
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 1.7, 0.0, -188.00 }, { 0, 14702, 0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 1.7, 0.0, -188.00 }, { 0, 14702, 0 } });
|
||||||
|
|
||||||
//list = ActorAccessibility_GetVirtualActorList(39, 0); // twins house
|
// list = ActorAccessibility_GetVirtualActorList(39, 0); // twins house
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 3.0, 0.0, -179.00 }, { 0, 14702, 0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 3.0, 0.0, -179.00 }, { 0, 14702, 0 } });
|
||||||
|
|
||||||
//list = ActorAccessibility_GetVirtualActorList(45, 0); // Kokiri Shop
|
// list = ActorAccessibility_GetVirtualActorList(45, 0); // Kokiri Shop
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 0.0, 0.0, 150.00 }, { 0, 14702, 0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_DOOR, { { 0.0, 0.0, 150.00 }, { 0, 14702, 0 } });
|
||||||
|
|
||||||
list = ActorAccessibility_GetVirtualActorList(0, 0);//deku tree main room
|
list = ActorAccessibility_GetVirtualActorList(0, 0); // deku tree main room
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -226.7, 0, 197.0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -226.7, 0, 197.0 } });
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 118.6, 0, -286.6 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 118.6, 0, -286.6 } });
|
||||||
|
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_AREA_CHANGE, { {0, 0, 640} }, AREA_KORIRI);
|
// ActorAccessibility_AddVirtualActor(list, VA_AREA_CHANGE, { {0, 0, 640} }, AREA_KORIRI);
|
||||||
|
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 287.4, 368.0, 347.0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 287.4, 368.0, 347.0 } });
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 419.4, 368.0, 173.6 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 419.4, 368.0, 173.6 } });
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 323, 567.0, 314.6 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 323, 567.0, 314.6 } });
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 127.5, 897.0, 433.6 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 127.5, 897.0, 433.6 } });
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 440.9, 897.0, 101.6 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 440.9, 897.0, 101.6 } });
|
||||||
|
|
||||||
list = ActorAccessibility_GetVirtualActorList(0, 2); // deku tree slingshot room
|
list = ActorAccessibility_GetVirtualActorList(0, 2); // deku tree slingshot room
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -1159, 288.0, 1403.0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -1159, 288.0, 1403.0 } });
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -1179.6, 480.0, 1463.6 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -1179.6, 480.0, 1463.6 } });
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -1398.9, 288.0, 1161.6 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -1398.9, 288.0, 1161.6 } });
|
||||||
|
|
||||||
list = ActorAccessibility_GetVirtualActorList(0, 10); // deku tree compass room
|
list = ActorAccessibility_GetVirtualActorList(0, 10); // deku tree compass room
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -762, 733.0, 151.0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -762, 733.0, 151.0 } });
|
||||||
/*ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { -935, 780.0, -113 } });
|
/*ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { -935, 780.0, -113 } });
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { -1031.0, 800.0, 109.7 } });
|
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { -1031.0, 800.0, 109.7 } });
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { -1184, 820.0, -103.4 } });*/
|
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { -1184, 820.0, -103.4 } });*/
|
||||||
|
@ -1084,14 +1045,14 @@ void accessible_stick_warning(AccessibleActor* actor) {
|
||||||
list = ActorAccessibility_GetVirtualActorList(0, 3); // deku tree basement 1 lobby
|
list = ActorAccessibility_GetVirtualActorList(0, 3); // deku tree basement 1 lobby
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_CRAWLSPACE, { { -901, -820.0, 0.5 } });
|
ActorAccessibility_AddVirtualActor(list, VA_CRAWLSPACE, { { -901, -820.0, 0.5 } });
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { -181.761, -905.0, -28.3 } });
|
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { -181.761, -905.0, -28.3 } });
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 108, -919.5, 5.0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { 108, -919.5, 5.0 } });
|
||||||
|
|
||||||
list = ActorAccessibility_GetVirtualActorList(0, 9); // deku tree b2 lobby
|
list = ActorAccessibility_GetVirtualActorList(0, 9); // deku tree b2 lobby
|
||||||
//ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -639, -1912.5, 188.0 } });
|
// ActorAccessibility_AddVirtualActor(list, VA_CLIMB, { { -639, -1912.5, 188.0 } });
|
||||||
//Install cues for walls, ledges etc.
|
// Install cues for walls, ledges etc.
|
||||||
list = ActorAccessibility_GetVirtualActorList(1, 2);//dodongo bombflower stairs room
|
list = ActorAccessibility_GetVirtualActorList(1, 2); // dodongo bombflower stairs room
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { -1958, 20, -1297 } });
|
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { -1958, 20, -1297 } });
|
||||||
list = ActorAccessibility_GetVirtualActorList(69, 0);//hyrule courtyard
|
list = ActorAccessibility_GetVirtualActorList(69, 0); // hyrule courtyard
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { 1734.0, 0.0, 140.514 } });
|
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { 1734.0, 0.0, 140.514 } });
|
||||||
AccessibleActor* temp = ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { 1734.0, 0.0, 140.514 } });
|
AccessibleActor* temp = ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { 1734.0, 0.0, 140.514 } });
|
||||||
temp->policy.pitch = 0.3;
|
temp->policy.pitch = 0.3;
|
||||||
|
@ -1117,5 +1078,4 @@ void accessible_stick_warning(AccessibleActor* actor) {
|
||||||
temp->policy.pitch = 1.8;
|
temp->policy.pitch = 1.8;
|
||||||
temp->policy.volume = 0.5;
|
temp->policy.volume = 0.5;
|
||||||
ActorAccessibility_InitCues();
|
ActorAccessibility_InitCues();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,11 +7,11 @@
|
||||||
#define AAE_MAX_BUFFER_SIZE AAE_SAMPLE_RATE / 10
|
#define AAE_MAX_BUFFER_SIZE AAE_SAMPLE_RATE / 10
|
||||||
#define AAE_PREP_CHUNK_SIZE 64
|
#define AAE_PREP_CHUNK_SIZE 64
|
||||||
#define AAE_MIX_CHUNK_SIZE 64
|
#define AAE_MIX_CHUNK_SIZE 64
|
||||||
#define AAE_GC_INTERVAL 20 * 60//How often, in frames, do we clean up sound handles that are no longer active.
|
#define AAE_GC_INTERVAL 20 * 60 // How often, in frames, do we clean up sound handles that are no longer active.
|
||||||
#define AAE_MAX_DB_REDUCTION -20
|
#define AAE_MAX_DB_REDUCTION -20
|
||||||
#define AAE_LPF_ORDER 4
|
#define AAE_LPF_ORDER 4
|
||||||
|
|
||||||
#define NOMINMAX//because Windows is a joke.
|
#define NOMINMAX // because Windows is a joke.
|
||||||
#include "AccessibleAudioEngine.h"
|
#include "AccessibleAudioEngine.h"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -25,25 +25,25 @@ enum AAE_COMMANDS {
|
||||||
AAE_STOP,
|
AAE_STOP,
|
||||||
AAE_STOP_ALL,
|
AAE_STOP_ALL,
|
||||||
AAE_PITCH,
|
AAE_PITCH,
|
||||||
AAE_PITCH_BEHIND,//Specify how much to change the pitch when the sound is behind the listener.
|
AAE_PITCH_BEHIND, // Specify how much to change the pitch when the sound is behind the listener.
|
||||||
AAE_VOLUME,
|
AAE_VOLUME,
|
||||||
AAE_PAN,
|
AAE_PAN,
|
||||||
AAE_FILTER,
|
AAE_FILTER,
|
||||||
AAE_SEEK,
|
AAE_SEEK,
|
||||||
AAE_LISTENER, //Set the listener's position and direction.
|
AAE_LISTENER, // Set the listener's position and direction.
|
||||||
AAE_POS,//Set the sound source's position and direction.
|
AAE_POS, // Set the sound source's position and direction.
|
||||||
AAE_PREPARE,
|
AAE_PREPARE,
|
||||||
AAE_TERMINATE,
|
AAE_TERMINATE,
|
||||||
};
|
};
|
||||||
typedef float f32;
|
typedef float f32;
|
||||||
typedef int8_t s8;
|
typedef int8_t s8;
|
||||||
typedef uint8_t u8;
|
typedef uint8_t u8;
|
||||||
//Processing for our custom audio positioning.
|
// Processing for our custom audio positioning.
|
||||||
static float lerp_aae(float x, float y, float z) {
|
static float lerp_aae(float x, float y, float z) {
|
||||||
return (1.0 - z) * x + z * y;
|
return (1.0 - z) * x + z * y;
|
||||||
}
|
}
|
||||||
|
|
||||||
static float computeGain(SoundExtras * extras) {
|
static float computeGain(SoundExtras* extras) {
|
||||||
if (extras->maxDistance == 0)
|
if (extras->maxDistance == 0)
|
||||||
return 0;
|
return 0;
|
||||||
float leftover = ma_volume_db_to_linear(AAE_MAX_DB_REDUCTION);
|
float leftover = ma_volume_db_to_linear(AAE_MAX_DB_REDUCTION);
|
||||||
|
@ -53,23 +53,24 @@ static float lerp_aae(float x, float y, float z) {
|
||||||
gain -= lerp_aae(0, leftover, normDist);
|
gain -= lerp_aae(0, leftover, normDist);
|
||||||
return gain;
|
return gain;
|
||||||
}
|
}
|
||||||
//Borrow the pan calculation from the game itself. Todo: this is technical debt, so copy/ revise it or something at some point.
|
// Borrow the pan calculation from the game itself. Todo: this is technical debt, so copy/ revise it or something at
|
||||||
extern "C" int8_t Audio_ComputeSoundPanSigned(float x, float z, uint8_t token);
|
// some point.
|
||||||
static void positioner_process_pcm_frames(ma_node * pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn,
|
extern "C" int8_t Audio_ComputeSoundPanSigned(float x, float z, uint8_t token);
|
||||||
float** ppFramesOut,
|
static void positioner_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn,
|
||||||
ma_uint32* pFrameCountOut)
|
float** ppFramesOut, ma_uint32* pFrameCountOut) {
|
||||||
{
|
|
||||||
|
|
||||||
const float* framesIn = ppFramesIn[0];
|
const float* framesIn = ppFramesIn[0];
|
||||||
float* framesOut = ppFramesOut[0];
|
float* framesOut = ppFramesOut[0];
|
||||||
ma_copy_pcm_frames(framesOut, framesIn, *pFrameCountIn, ma_format_f32, 2);
|
ma_copy_pcm_frames(framesOut, framesIn, *pFrameCountIn, ma_format_f32, 2);
|
||||||
*pFrameCountOut = *pFrameCountIn;
|
*pFrameCountOut = *pFrameCountIn;
|
||||||
SoundExtras* extras = (SoundExtras*)pNode;
|
SoundExtras* extras = (SoundExtras*)pNode;
|
||||||
//Pan the sound based on its projected position.
|
// Pan the sound based on its projected position.
|
||||||
float pan;
|
float pan;
|
||||||
//Use the game's panning mechanism, which returns a signed 8-bit integer between 0 (far-left) and 127 (far-right).
|
// Use the game's panning mechanism, which returns a signed 8-bit integer between 0 (far-left) and 127 (far-right).
|
||||||
//It would appear that the correct thing to do is interpret this value as a gain factor in decibels. In practice, values below 38 or above 90 are never seen, so a sound that's panned far to one side or the other amounts to about -25DB worth of attenuation.
|
// It would appear that the correct thing to do is interpret this value as a gain factor in decibels. In practice,
|
||||||
//Also: lie about the value of Z and give it a constant value to prevent weird behaviour when Z is far away.
|
// values below 38 or above 90 are never seen, so a sound that's panned far to one side or the other amounts to
|
||||||
|
// about -25DB worth of attenuation. Also: lie about the value of Z and give it a constant value to prevent weird
|
||||||
|
// behaviour when Z is far away.
|
||||||
s8 panSigned = Audio_ComputeSoundPanSigned(extras->x, extras->z, 4);
|
s8 panSigned = Audio_ComputeSoundPanSigned(extras->x, extras->z, 4);
|
||||||
int db;
|
int db;
|
||||||
if (panSigned < 64)
|
if (panSigned < 64)
|
||||||
|
@ -82,22 +83,24 @@ static float lerp_aae(float x, float y, float z) {
|
||||||
|
|
||||||
ma_panner_set_pan(&extras->panner, pan);
|
ma_panner_set_pan(&extras->panner, pan);
|
||||||
ma_panner_process_pcm_frames(&extras->panner, framesOut, framesOut, *pFrameCountIn);
|
ma_panner_process_pcm_frames(&extras->panner, framesOut, framesOut, *pFrameCountIn);
|
||||||
//Next we'll apply the gain based on the object's distance relationship to the player. The strategy here is to use a combination of decibel-based and linear attenuation, so that the gain reaches 0 at the exact point when the object is at exactly the maximum distance from the player.
|
// Next we'll apply the gain based on the object's distance relationship to the player. The strategy here is to use
|
||||||
|
// a combination of decibel-based and linear attenuation, so that the gain reaches 0 at the exact point when the
|
||||||
|
// object is at exactly the maximum distance from the player.
|
||||||
|
|
||||||
float gain = computeGain(extras);
|
float gain = computeGain(extras);
|
||||||
ma_gainer_set_gain(&extras->gainer, gain);
|
ma_gainer_set_gain(&extras->gainer, gain);
|
||||||
ma_gainer_process_pcm_frames(&extras->gainer, framesOut, framesOut, *pFrameCountIn);
|
ma_gainer_process_pcm_frames(&extras->gainer, framesOut, framesOut, *pFrameCountIn);
|
||||||
//Run LPF only when necessary because we can't afford to run a 4th-order lowpass on every single sound. This probably causes minor glitches when the filter switches on and off. Todo: cross that bridge.
|
// Run LPF only when necessary because we can't afford to run a 4th-order lowpass on every single sound. This
|
||||||
|
// probably causes minor glitches when the filter switches on and off. Todo: cross that bridge.
|
||||||
if (extras->cutoff != 1.0)
|
if (extras->cutoff != 1.0)
|
||||||
ma_lpf_process_pcm_frames(&extras->filter, framesOut, framesOut, *pFrameCountIn);
|
ma_lpf_process_pcm_frames(&extras->filter, framesOut, framesOut, *pFrameCountIn);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ma_node_vtable positioner_vtable = {
|
static ma_node_vtable positioner_vtable = { positioner_process_pcm_frames, NULL, 1, 1, 0 };
|
||||||
positioner_process_pcm_frames, NULL, 1, 1, 0};
|
|
||||||
static ma_uint32 positioner_channels[1] = { 2 };
|
static ma_uint32 positioner_channels[1] = { 2 };
|
||||||
|
|
||||||
void AccessibleAudioEngine::destroy() {
|
void AccessibleAudioEngine::destroy() {
|
||||||
switch (initialized){
|
switch (initialized) {
|
||||||
case 3:
|
case 3:
|
||||||
ma_engine_uninit(&engine);
|
ma_engine_uninit(&engine);
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -105,13 +108,13 @@ static ma_uint32 positioner_channels[1] = { 2 };
|
||||||
case 1:
|
case 1:
|
||||||
ma_resource_manager_uninit(&resourceManager);
|
ma_resource_manager_uninit(&resourceManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::destroyAndThrow(const char* exceptionText) {
|
void AccessibleAudioEngine::destroyAndThrow(const char* exceptionText) {
|
||||||
destroy();
|
destroy();
|
||||||
|
|
||||||
throw std::runtime_error(exceptionText);
|
throw std::runtime_error(exceptionText);
|
||||||
}
|
}
|
||||||
uint32_t AccessibleAudioEngine::retrieve(float* buffer, uint32_t nFrames) {
|
uint32_t AccessibleAudioEngine::retrieve(float* buffer, uint32_t nFrames) {
|
||||||
uint32_t framesAvailable = ma_pcm_rb_available_read(&preparedOutput);
|
uint32_t framesAvailable = ma_pcm_rb_available_read(&preparedOutput);
|
||||||
if (nFrames > framesAvailable)
|
if (nFrames > framesAvailable)
|
||||||
nFrames = framesAvailable;
|
nFrames = framesAvailable;
|
||||||
|
@ -128,16 +131,13 @@ throw std::runtime_error(exceptionText);
|
||||||
|
|
||||||
memcpy(buffer, readBuffer, sizeof(float) * framesObtained * AAE_CHANNELS);
|
memcpy(buffer, readBuffer, sizeof(float) * framesObtained * AAE_CHANNELS);
|
||||||
buffer += framesObtained * AAE_CHANNELS;
|
buffer += framesObtained * AAE_CHANNELS;
|
||||||
nFrames -= framesObtained;
|
nFrames -= framesObtained;
|
||||||
ma_pcm_rb_commit_read(&preparedOutput, framesObtained);
|
ma_pcm_rb_commit_read(&preparedOutput, framesObtained);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ogNFrames;
|
return ogNFrames;
|
||||||
|
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::doPrepare(SoundAction& action)
|
void AccessibleAudioEngine::doPrepare(SoundAction& action) {
|
||||||
{
|
|
||||||
framesUntilGC--;
|
framesUntilGC--;
|
||||||
int nFrames = ma_pcm_rb_available_write(&preparedOutput);
|
int nFrames = ma_pcm_rb_available_write(&preparedOutput);
|
||||||
if (nFrames <= 0)
|
if (nFrames <= 0)
|
||||||
|
@ -145,19 +145,19 @@ void AccessibleAudioEngine::doPrepare(SoundAction& action)
|
||||||
|
|
||||||
float* chunk;
|
float* chunk;
|
||||||
while (nFrames > 0) {
|
while (nFrames > 0) {
|
||||||
//This should not loop more than twice.
|
// This should not loop more than twice.
|
||||||
uint32_t nextChunk = nFrames;
|
uint32_t nextChunk = nFrames;
|
||||||
ma_pcm_rb_acquire_write(&preparedOutput, &nextChunk, (void**)&chunk);//Might reduce nextChunk if there isn't enough buffer space available to accommodate the request.
|
ma_pcm_rb_acquire_write(&preparedOutput, &nextChunk,
|
||||||
|
(void**)&chunk); // Might reduce nextChunk if there isn't enough buffer space available
|
||||||
|
// to accommodate the request.
|
||||||
ma_uint64 framesRead = 0;
|
ma_uint64 framesRead = 0;
|
||||||
ma_engine_read_pcm_frames(&engine, chunk, nextChunk, &framesRead);
|
ma_engine_read_pcm_frames(&engine, chunk, nextChunk, &framesRead);
|
||||||
//Even if we get fewer frames than expected, we should still submit a full buffer of silence.
|
// Even if we get fewer frames than expected, we should still submit a full buffer of silence.
|
||||||
if (framesRead < nextChunk)
|
if (framesRead < nextChunk)
|
||||||
ma_silence_pcm_frames(chunk + (framesRead * 2), (nextChunk - framesRead), ma_format_f32, 2);
|
ma_silence_pcm_frames(chunk + (framesRead * 2), (nextChunk - framesRead), ma_format_f32, 2);
|
||||||
ma_pcm_rb_commit_write(&preparedOutput, (uint32_t) nextChunk);
|
ma_pcm_rb_commit_write(&preparedOutput, (uint32_t)nextChunk);
|
||||||
nFrames -= nextChunk;
|
nFrames -= nextChunk;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
int AccessibleAudioEngine::getSoundActions(SoundAction* dest, int limit) {
|
int AccessibleAudioEngine::getSoundActions(SoundAction* dest, int limit) {
|
||||||
std::unique_lock<std::mutex> lock(mtx);
|
std::unique_lock<std::mutex> lock(mtx);
|
||||||
|
@ -171,9 +171,8 @@ int AccessibleAudioEngine::getSoundActions(SoundAction* dest, int limit) {
|
||||||
limit--;
|
limit--;
|
||||||
}
|
}
|
||||||
return actionsOut;
|
return actionsOut;
|
||||||
|
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::postSoundActions(){
|
void AccessibleAudioEngine::postSoundActions() {
|
||||||
{
|
{
|
||||||
std::scoped_lock<std::mutex> lock(mtx);
|
std::scoped_lock<std::mutex> lock(mtx);
|
||||||
for (int i = 0; i < nextOutgoingSoundAction; i++)
|
for (int i = 0; i < nextOutgoingSoundAction; i++)
|
||||||
|
@ -187,13 +186,13 @@ void AccessibleAudioEngine::postHighPrioritySoundAction(SoundAction& action) {
|
||||||
soundActions.push_front(action);
|
soundActions.push_front(action);
|
||||||
cv.notify_one();
|
cv.notify_one();
|
||||||
}
|
}
|
||||||
SoundAction& AccessibleAudioEngine::getNextOutgoingSoundAction() {
|
SoundAction& AccessibleAudioEngine::getNextOutgoingSoundAction() {
|
||||||
if (nextOutgoingSoundAction >= AAE_SOUND_ACTION_BATCH_SIZE)
|
if (nextOutgoingSoundAction >= AAE_SOUND_ACTION_BATCH_SIZE)
|
||||||
postSoundActions();
|
postSoundActions();
|
||||||
nextOutgoingSoundAction++;
|
nextOutgoingSoundAction++;
|
||||||
return outgoingSoundActions[nextOutgoingSoundAction - 1];
|
return outgoingSoundActions[nextOutgoingSoundAction - 1];
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::runThread() {
|
void AccessibleAudioEngine::runThread() {
|
||||||
bool shouldTerminate = false;
|
bool shouldTerminate = false;
|
||||||
SoundAction incomingSoundActions[AAE_SOUND_ACTION_BATCH_SIZE];
|
SoundAction incomingSoundActions[AAE_SOUND_ACTION_BATCH_SIZE];
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -245,14 +244,11 @@ void AccessibleAudioEngine::postHighPrioritySoundAction(SoundAction& action) {
|
||||||
case AAE_PREPARE:
|
case AAE_PREPARE:
|
||||||
doPrepare(action);
|
doPrepare(action);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SoundSlot* AccessibleAudioEngine::findSound(SoundAction& action)
|
SoundSlot* AccessibleAudioEngine::findSound(SoundAction& action) {
|
||||||
{
|
|
||||||
if (action.slot < 0 || action.slot >= AAE_SLOTS_PER_HANDLE)
|
if (action.slot < 0 || action.slot >= AAE_SLOTS_PER_HANDLE)
|
||||||
return NULL;
|
return NULL;
|
||||||
auto i = sounds.find(action.handle);
|
auto i = sounds.find(action.handle);
|
||||||
|
@ -262,9 +258,8 @@ void AccessibleAudioEngine::postHighPrioritySoundAction(SoundAction& action) {
|
||||||
if (!target.active)
|
if (!target.active)
|
||||||
return NULL;
|
return NULL;
|
||||||
return ⌖
|
return ⌖
|
||||||
|
}
|
||||||
}
|
void AccessibleAudioEngine::doPlaySound(SoundAction& action) {
|
||||||
void AccessibleAudioEngine::doPlaySound(SoundAction& action) {
|
|
||||||
SoundSlot* sound;
|
SoundSlot* sound;
|
||||||
if (sounds.contains(action.handle)) {
|
if (sounds.contains(action.handle)) {
|
||||||
sound = &sounds[action.handle][action.slot];
|
sound = &sounds[action.handle][action.slot];
|
||||||
|
@ -282,41 +277,38 @@ void AccessibleAudioEngine::postHighPrioritySoundAction(SoundAction& action) {
|
||||||
sounds[action.handle] = temp;
|
sounds[action.handle] = temp;
|
||||||
sound = &sounds[action.handle][action.slot];
|
sound = &sounds[action.handle][action.slot];
|
||||||
}
|
}
|
||||||
if (ma_sound_init_from_file(&engine, action.path.c_str(), MA_SOUND_FLAG_NO_SPATIALIZATION|MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT, NULL, NULL,
|
if (ma_sound_init_from_file(&engine, action.path.c_str(),
|
||||||
|
MA_SOUND_FLAG_NO_SPATIALIZATION | MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT, NULL, NULL,
|
||||||
&sound->sound) != MA_SUCCESS)
|
&sound->sound) != MA_SUCCESS)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
initSoundExtras(sound);
|
initSoundExtras(sound);
|
||||||
ma_sound_set_looping(&sound->sound, action.looping);
|
ma_sound_set_looping(&sound->sound, action.looping);
|
||||||
//We actually attach the extras to the engine, not the sound itself.
|
// We actually attach the extras to the engine, not the sound itself.
|
||||||
ma_node_attach_output_bus(&sound->extras, 0, ma_node_graph_get_endpoint(&engine.nodeGraph), 0);
|
ma_node_attach_output_bus(&sound->extras, 0, ma_node_graph_get_endpoint(&engine.nodeGraph), 0);
|
||||||
|
|
||||||
ma_sound_start(&sound->sound);
|
ma_sound_start(&sound->sound);
|
||||||
|
|
||||||
sound->active = true;
|
sound->active = true;
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::doStopSound(SoundAction& action) {
|
void AccessibleAudioEngine::doStopSound(SoundAction& action) {
|
||||||
SoundSlot* slot = findSound(action);
|
SoundSlot* slot = findSound(action);
|
||||||
if (slot == NULL)
|
if (slot == NULL)
|
||||||
return;
|
return;
|
||||||
destroySound(slot);
|
destroySound(slot);
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::doStopAllSounds(SoundAction& action)
|
void AccessibleAudioEngine::doStopAllSounds(SoundAction& action) {
|
||||||
{
|
|
||||||
auto it = sounds.find(action.handle);
|
auto it = sounds.find(action.handle);
|
||||||
if (it == sounds.end())
|
if (it == sounds.end())
|
||||||
return;
|
return;
|
||||||
SoundSlots& slots = it->second;
|
SoundSlots& slots = it->second;
|
||||||
for (int i = 0; i < AAE_SLOTS_PER_HANDLE; i++)
|
for (int i = 0; i < AAE_SLOTS_PER_HANDLE; i++) {
|
||||||
{
|
|
||||||
if (slots[i].active)
|
if (slots[i].active)
|
||||||
destroySound(&slots[i]);
|
destroySound(&slots[i]);
|
||||||
}
|
}
|
||||||
sounds.erase(it);
|
sounds.erase(it);
|
||||||
|
}
|
||||||
}
|
void AccessibleAudioEngine::doSetPitch(SoundAction& action) {
|
||||||
void AccessibleAudioEngine::doSetPitch(SoundAction& action)
|
|
||||||
{
|
|
||||||
SoundSlot* slot = findSound(action);
|
SoundSlot* slot = findSound(action);
|
||||||
if (slot == NULL)
|
if (slot == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -325,55 +317,44 @@ void AccessibleAudioEngine::postHighPrioritySoundAction(SoundAction& action) {
|
||||||
if (slot->extras.z < 0)
|
if (slot->extras.z < 0)
|
||||||
pitch *= (1.0 - slot->extras.pitchBehindModifier);
|
pitch *= (1.0 - slot->extras.pitchBehindModifier);
|
||||||
ma_sound_set_pitch(&slot->sound, pitch);
|
ma_sound_set_pitch(&slot->sound, pitch);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
void AccessibleAudioEngine::doSetPitchBehindModifier(SoundAction& action) {
|
||||||
|
|
||||||
void AccessibleAudioEngine::doSetPitchBehindModifier(SoundAction& action)
|
|
||||||
{
|
|
||||||
SoundSlot* slot = findSound(action);
|
SoundSlot* slot = findSound(action);
|
||||||
if (slot == NULL)
|
if (slot == NULL)
|
||||||
return;
|
return;
|
||||||
slot->extras.pitchBehindModifier = action.pitch;
|
slot->extras.pitchBehindModifier = action.pitch;
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::doSetVolume(SoundAction& action)
|
void AccessibleAudioEngine::doSetVolume(SoundAction& action) {
|
||||||
{
|
|
||||||
SoundSlot* slot = findSound(action);
|
SoundSlot* slot = findSound(action);
|
||||||
if (slot == NULL)
|
if (slot == NULL)
|
||||||
return;
|
return;
|
||||||
ma_sound_set_volume(&slot->sound, action.pitch);
|
ma_sound_set_volume(&slot->sound, action.pitch);
|
||||||
|
}
|
||||||
}
|
void AccessibleAudioEngine::doSetPan(SoundAction& action) {
|
||||||
void AccessibleAudioEngine::doSetPan(SoundAction& action)
|
|
||||||
{
|
|
||||||
SoundSlot* slot = findSound(action);
|
SoundSlot* slot = findSound(action);
|
||||||
if (slot == NULL)
|
if (slot == NULL)
|
||||||
return;
|
return;
|
||||||
ma_sound_set_pan(&slot->sound, action.pan);
|
ma_sound_set_pan(&slot->sound, action.pan);
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::doSetFilter(SoundAction& action)
|
void AccessibleAudioEngine::doSetFilter(SoundAction& action) {
|
||||||
{
|
|
||||||
SoundSlot* slot = findSound(action);
|
SoundSlot* slot = findSound(action);
|
||||||
if (slot == NULL)
|
if (slot == NULL)
|
||||||
return;
|
return;
|
||||||
slot->extras.cutoff = action.cutoff;
|
slot->extras.cutoff = action.cutoff;
|
||||||
ma_lpf_config config =
|
ma_lpf_config config = ma_lpf_config_init(ma_format_f32, AAE_CHANNELS, AAE_SAMPLE_RATE,
|
||||||
ma_lpf_config_init(ma_format_f32, AAE_CHANNELS, AAE_SAMPLE_RATE, lerp_aae(0.0, AAE_SAMPLE_RATE / 2, action.cutoff), AAE_LPF_ORDER);
|
lerp_aae(0.0, AAE_SAMPLE_RATE / 2, action.cutoff), AAE_LPF_ORDER);
|
||||||
ma_lpf_reinit(&config, &slot->extras.filter);
|
ma_lpf_reinit(&config, &slot->extras.filter);
|
||||||
|
}
|
||||||
}
|
void AccessibleAudioEngine::doSeekSound(SoundAction& action) {
|
||||||
void AccessibleAudioEngine::doSeekSound(SoundAction& action)
|
|
||||||
{
|
|
||||||
SoundSlot* slot = findSound(action);
|
SoundSlot* slot = findSound(action);
|
||||||
if (slot == NULL)
|
if (slot == NULL)
|
||||||
return;
|
return;
|
||||||
ma_sound_seek_to_pcm_frame(&slot->sound, action.offset);
|
ma_sound_seek_to_pcm_frame(&slot->sound, action.offset);
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::doSetListenerPos(SoundAction& action)
|
void AccessibleAudioEngine::doSetListenerPos(SoundAction& action) {
|
||||||
{
|
}
|
||||||
|
void AccessibleAudioEngine::doSetSoundPos(SoundAction& action) {
|
||||||
}
|
|
||||||
void AccessibleAudioEngine::doSetSoundPos(SoundAction& action)
|
|
||||||
{
|
|
||||||
SoundSlot* slot = findSound(action);
|
SoundSlot* slot = findSound(action);
|
||||||
if (slot == NULL)
|
if (slot == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -386,10 +367,9 @@ void AccessibleAudioEngine::postHighPrioritySoundAction(SoundAction& action) {
|
||||||
if (action.posZ < 0)
|
if (action.posZ < 0)
|
||||||
pitch *= (1.0 - slot->extras.pitchBehindModifier);
|
pitch *= (1.0 - slot->extras.pitchBehindModifier);
|
||||||
ma_sound_set_pitch(&slot->sound, pitch);
|
ma_sound_set_pitch(&slot->sound, pitch);
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::garbageCollect()
|
void AccessibleAudioEngine::garbageCollect() {
|
||||||
{
|
for (auto i = sounds.begin(); i != sounds.end();) {
|
||||||
for (auto i = sounds.begin(); i != sounds.end(); ) {
|
|
||||||
int deadSlots = 0;
|
int deadSlots = 0;
|
||||||
for (int x = 0; x < AAE_SLOTS_PER_HANDLE; x++) {
|
for (int x = 0; x < AAE_SLOTS_PER_HANDLE; x++) {
|
||||||
if (!i->second[x].active)
|
if (!i->second[x].active)
|
||||||
|
@ -398,7 +378,6 @@ void AccessibleAudioEngine::postHighPrioritySoundAction(SoundAction& action) {
|
||||||
destroySound(&i->second[x]);
|
destroySound(&i->second[x]);
|
||||||
i->second[x].active = false;
|
i->second[x].active = false;
|
||||||
deadSlots++;
|
deadSlots++;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (deadSlots == AAE_SLOTS_PER_HANDLE) // Entire batch is garbage.
|
if (deadSlots == AAE_SLOTS_PER_HANDLE) // Entire batch is garbage.
|
||||||
|
@ -407,15 +386,13 @@ void AccessibleAudioEngine::postHighPrioritySoundAction(SoundAction& action) {
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
framesUntilGC = AAE_GC_INTERVAL;
|
framesUntilGC = AAE_GC_INTERVAL;
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::processAudioJobs()
|
void AccessibleAudioEngine::processAudioJobs() {
|
||||||
{
|
|
||||||
ma_job job;
|
ma_job job;
|
||||||
while (ma_resource_manager_next_job(&resourceManager, &job) == MA_SUCCESS)
|
while (ma_resource_manager_next_job(&resourceManager, &job) == MA_SUCCESS)
|
||||||
ma_job_process(&job);
|
ma_job_process(&job);
|
||||||
|
}
|
||||||
}
|
bool AccessibleAudioEngine::initSoundExtras(SoundSlot* slot) {
|
||||||
bool AccessibleAudioEngine::initSoundExtras(SoundSlot* slot) {
|
|
||||||
ma_node_config config = ma_node_config_init();
|
ma_node_config config = ma_node_config_init();
|
||||||
config.inputBusCount = 1;
|
config.inputBusCount = 1;
|
||||||
config.outputBusCount = 1;
|
config.outputBusCount = 1;
|
||||||
|
@ -428,29 +405,30 @@ void AccessibleAudioEngine::postHighPrioritySoundAction(SoundAction& action) {
|
||||||
ma_panner_config pc = ma_panner_config_init(ma_format_f32, AAE_CHANNELS);
|
ma_panner_config pc = ma_panner_config_init(ma_format_f32, AAE_CHANNELS);
|
||||||
pc.mode = ma_pan_mode_balance;
|
pc.mode = ma_pan_mode_balance;
|
||||||
ma_panner_init(&pc, &slot->extras.panner);
|
ma_panner_init(&pc, &slot->extras.panner);
|
||||||
ma_gainer_config gc = ma_gainer_config_init(AAE_CHANNELS, AAE_SAMPLE_RATE / 20);//Allow one in-game frame for the gain to work its way towards the target value.
|
ma_gainer_config gc = ma_gainer_config_init(
|
||||||
|
AAE_CHANNELS,
|
||||||
|
AAE_SAMPLE_RATE / 20); // Allow one in-game frame for the gain to work its way towards the target value.
|
||||||
if (ma_gainer_init(&gc, NULL, &slot->extras.gainer) != MA_SUCCESS)
|
if (ma_gainer_init(&gc, NULL, &slot->extras.gainer) != MA_SUCCESS)
|
||||||
return false;
|
return false;
|
||||||
ma_lpf_config fc = ma_lpf_config_init(ma_format_f32, AAE_CHANNELS, AAE_SAMPLE_RATE, AAE_SAMPLE_RATE / 2, AAE_LPF_ORDER);
|
ma_lpf_config fc =
|
||||||
|
ma_lpf_config_init(ma_format_f32, AAE_CHANNELS, AAE_SAMPLE_RATE, AAE_SAMPLE_RATE / 2, AAE_LPF_ORDER);
|
||||||
ma_lpf_init(&fc, NULL, &slot->extras.filter);
|
ma_lpf_init(&fc, NULL, &slot->extras.filter);
|
||||||
slot->extras.cutoff = 1.0f;
|
slot->extras.cutoff = 1.0f;
|
||||||
slot->extras.pitch = 1.0f;
|
slot->extras.pitch = 1.0f;
|
||||||
slot->extras.pitchBehindModifier = 0.0f;
|
slot->extras.pitchBehindModifier = 0.0f;
|
||||||
//ma_node_attach_output_bus(&slot->sound, 0, &slot->extras.filter, 0);
|
// ma_node_attach_output_bus(&slot->sound, 0, &slot->extras.filter, 0);
|
||||||
ma_node_attach_output_bus(&slot->sound, 0, &slot->extras, 0);
|
ma_node_attach_output_bus(&slot->sound, 0, &slot->extras, 0);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
}
|
void AccessibleAudioEngine::destroySound(SoundSlot* slot) {
|
||||||
void AccessibleAudioEngine::destroySound(SoundSlot* slot) {
|
|
||||||
ma_node_detach_all_output_buses(&slot->extras);
|
ma_node_detach_all_output_buses(&slot->extras);
|
||||||
ma_sound_uninit(&slot->sound);
|
ma_sound_uninit(&slot->sound);
|
||||||
ma_gainer_uninit(&slot->extras.gainer, NULL);
|
ma_gainer_uninit(&slot->extras.gainer, NULL);
|
||||||
|
|
||||||
slot->active = false;
|
slot->active = false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
AccessibleAudioEngine::AccessibleAudioEngine() {
|
||||||
|
|
||||||
AccessibleAudioEngine::AccessibleAudioEngine() {
|
|
||||||
initialized = 0;
|
initialized = 0;
|
||||||
ma_resource_manager_config rmc = ma_resource_manager_config_init();
|
ma_resource_manager_config rmc = ma_resource_manager_config_init();
|
||||||
rmc.decodedChannels = AAE_CHANNELS;
|
rmc.decodedChannels = AAE_CHANNELS;
|
||||||
|
@ -477,29 +455,30 @@ void AccessibleAudioEngine::postHighPrioritySoundAction(SoundAction& action) {
|
||||||
nextOutgoingSoundAction = 0;
|
nextOutgoingSoundAction = 0;
|
||||||
framesUntilGC = AAE_GC_INTERVAL;
|
framesUntilGC = AAE_GC_INTERVAL;
|
||||||
thread = std::thread(&AccessibleAudioEngine::runThread, this);
|
thread = std::thread(&AccessibleAudioEngine::runThread, this);
|
||||||
|
}
|
||||||
}
|
AccessibleAudioEngine::~AccessibleAudioEngine() {
|
||||||
AccessibleAudioEngine::~AccessibleAudioEngine() {
|
// Place a terminate command on the top of the pile, then wait for thread to die.
|
||||||
//Place a terminate command on the top of the pile, then wait for thread to die.
|
|
||||||
SoundAction action;
|
SoundAction action;
|
||||||
action.command = AAE_TERMINATE;
|
action.command = AAE_TERMINATE;
|
||||||
postHighPrioritySoundAction(action);
|
postHighPrioritySoundAction(action);
|
||||||
thread.join();
|
thread.join();
|
||||||
destroy();
|
destroy();
|
||||||
|
}
|
||||||
}
|
void AccessibleAudioEngine::mix(int16_t* ogBuffer, uint32_t nFrames) {
|
||||||
void AccessibleAudioEngine::mix(int16_t * ogBuffer, uint32_t nFrames) {
|
|
||||||
uint32_t framesAvailable = ma_pcm_rb_available_read(&preparedOutput);
|
uint32_t framesAvailable = ma_pcm_rb_available_read(&preparedOutput);
|
||||||
float sourceChunk[AAE_MIX_CHUNK_SIZE * AAE_CHANNELS];
|
float sourceChunk[AAE_MIX_CHUNK_SIZE * AAE_CHANNELS];
|
||||||
float mixedChunk[AAE_MIX_CHUNK_SIZE * AAE_CHANNELS];
|
float mixedChunk[AAE_MIX_CHUNK_SIZE * AAE_CHANNELS];
|
||||||
while (nFrames > 0) {
|
while (nFrames > 0) {
|
||||||
uint32_t nextChunk = std::min <uint32_t> (AAE_MIX_CHUNK_SIZE, nFrames);
|
uint32_t nextChunk = std::min<uint32_t>(AAE_MIX_CHUNK_SIZE, nFrames);
|
||||||
ma_silence_pcm_frames(sourceChunk, nextChunk, ma_format_f32, AAE_CHANNELS);//This is so that it doesn't matter if we have less output available than expected.
|
ma_silence_pcm_frames(
|
||||||
|
sourceChunk, nextChunk, ma_format_f32,
|
||||||
|
AAE_CHANNELS); // This is so that it doesn't matter if we have less output available than expected.
|
||||||
ma_silence_pcm_frames(mixedChunk, nextChunk, ma_format_f32, AAE_CHANNELS);
|
ma_silence_pcm_frames(mixedChunk, nextChunk, ma_format_f32, AAE_CHANNELS);
|
||||||
retrieve(sourceChunk, nextChunk);
|
retrieve(sourceChunk, nextChunk);
|
||||||
ma_pcm_s16_to_f32(mixedChunk, ogBuffer, nextChunk * AAE_CHANNELS, ma_dither_mode_none);//The game's output is changed to 32-bit floating point samples.
|
ma_pcm_s16_to_f32(mixedChunk, ogBuffer, nextChunk * AAE_CHANNELS,
|
||||||
|
ma_dither_mode_none); // The game's output is changed to 32-bit floating point samples.
|
||||||
ma_mix_pcm_frames_f32(mixedChunk, sourceChunk, nextChunk, AAE_CHANNELS, 1.0);
|
ma_mix_pcm_frames_f32(mixedChunk, sourceChunk, nextChunk, AAE_CHANNELS, 1.0);
|
||||||
//If we've gone over 1.0, we'll need to scale back before we go back to 16-bit or we'll distort.
|
// If we've gone over 1.0, we'll need to scale back before we go back to 16-bit or we'll distort.
|
||||||
float scalar = 1.0;
|
float scalar = 1.0;
|
||||||
for (int i = 0; i < nextChunk * AAE_CHANNELS; i++)
|
for (int i = 0; i < nextChunk * AAE_CHANNELS; i++)
|
||||||
scalar = std::max(scalar, mixedChunk[i]);
|
scalar = std::max(scalar, mixedChunk[i]);
|
||||||
|
@ -508,12 +487,12 @@ void AccessibleAudioEngine::postHighPrioritySoundAction(SoundAction& action) {
|
||||||
for (int i = 0; i < nextChunk * AAE_CHANNELS; i++)
|
for (int i = 0; i < nextChunk * AAE_CHANNELS; i++)
|
||||||
mixedChunk[i] *= scalar;
|
mixedChunk[i] *= scalar;
|
||||||
}
|
}
|
||||||
ma_pcm_f32_to_s16(ogBuffer, mixedChunk, nextChunk * AAE_CHANNELS, ma_dither_mode_triangle);//Chunk is ready to go out via the game's usual channels.
|
ma_pcm_f32_to_s16(ogBuffer, mixedChunk, nextChunk * AAE_CHANNELS,
|
||||||
|
ma_dither_mode_triangle); // Chunk is ready to go out via the game's usual channels.
|
||||||
ogBuffer += nextChunk * AAE_CHANNELS;
|
ogBuffer += nextChunk * AAE_CHANNELS;
|
||||||
nFrames -= nextChunk;
|
nFrames -= nextChunk;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
void AccessibleAudioEngine::playSound(uintptr_t handle, int slot, const char* path, bool looping) {
|
void AccessibleAudioEngine::playSound(uintptr_t handle, int slot, const char* path, bool looping) {
|
||||||
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
||||||
return;
|
return;
|
||||||
|
@ -523,21 +502,21 @@ void AccessibleAudioEngine::playSound(uintptr_t handle, int slot, const char* pa
|
||||||
action.command = AAE_START;
|
action.command = AAE_START;
|
||||||
action.path = path;
|
action.path = path;
|
||||||
action.looping = looping;
|
action.looping = looping;
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::stopSound(uintptr_t handle, int slot) {
|
void AccessibleAudioEngine::stopSound(uintptr_t handle, int slot) {
|
||||||
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
||||||
return;
|
return;
|
||||||
SoundAction& action = getNextOutgoingSoundAction();
|
SoundAction& action = getNextOutgoingSoundAction();
|
||||||
action.command = AAE_STOP;
|
action.command = AAE_STOP;
|
||||||
action.handle = (uintptr_t) handle;
|
action.handle = (uintptr_t)handle;
|
||||||
action.slot = slot;
|
action.slot = slot;
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::stopAllSounds(uintptr_t handle) {
|
void AccessibleAudioEngine::stopAllSounds(uintptr_t handle) {
|
||||||
SoundAction& action = getNextOutgoingSoundAction();
|
SoundAction& action = getNextOutgoingSoundAction();
|
||||||
action.command = AAE_STOP_ALL;
|
action.command = AAE_STOP_ALL;
|
||||||
action.handle = handle;
|
action.handle = handle;
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::setPitch(uintptr_t handle, int slot, float pitch) {
|
void AccessibleAudioEngine::setPitch(uintptr_t handle, int slot, float pitch) {
|
||||||
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -546,9 +525,8 @@ void AccessibleAudioEngine::stopAllSounds(uintptr_t handle) {
|
||||||
action.handle = handle;
|
action.handle = handle;
|
||||||
action.slot = slot;
|
action.slot = slot;
|
||||||
action.pitch = pitch;
|
action.pitch = pitch;
|
||||||
|
}
|
||||||
}
|
void AccessibleAudioEngine::setPitchBehindModifier(uintptr_t handle, int slot, float mod) {
|
||||||
void AccessibleAudioEngine::setPitchBehindModifier(uintptr_t handle, int slot, float mod) {
|
|
||||||
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -557,11 +535,9 @@ void AccessibleAudioEngine::stopAllSounds(uintptr_t handle) {
|
||||||
action.handle = handle;
|
action.handle = handle;
|
||||||
action.slot = slot;
|
action.slot = slot;
|
||||||
action.pitch = mod;
|
action.pitch = mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AccessibleAudioEngine::setVolume(uintptr_t handle, int slot, float volume) {
|
||||||
}
|
|
||||||
|
|
||||||
void AccessibleAudioEngine::setVolume(uintptr_t handle, int slot, float volume) {
|
|
||||||
|
|
||||||
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
||||||
return;
|
return;
|
||||||
|
@ -570,7 +546,7 @@ void AccessibleAudioEngine::stopAllSounds(uintptr_t handle) {
|
||||||
action.handle = handle;
|
action.handle = handle;
|
||||||
action.slot = slot;
|
action.slot = slot;
|
||||||
action.volume = volume;
|
action.volume = volume;
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::setPan(uintptr_t handle, int slot, float pan) {
|
void AccessibleAudioEngine::setPan(uintptr_t handle, int slot, float pan) {
|
||||||
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
||||||
return;
|
return;
|
||||||
|
@ -579,7 +555,7 @@ void AccessibleAudioEngine::setPan(uintptr_t handle, int slot, float pan) {
|
||||||
action.handle = handle;
|
action.handle = handle;
|
||||||
action.slot = slot;
|
action.slot = slot;
|
||||||
action.pan = pan;
|
action.pan = pan;
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::setFilter(uintptr_t handle, int slot, float cutoff) {
|
void AccessibleAudioEngine::setFilter(uintptr_t handle, int slot, float cutoff) {
|
||||||
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
||||||
return;
|
return;
|
||||||
|
@ -590,19 +566,19 @@ void AccessibleAudioEngine::setFilter(uintptr_t handle, int slot, float cutoff)
|
||||||
action.slot = slot;
|
action.slot = slot;
|
||||||
action.command = AAE_FILTER;
|
action.command = AAE_FILTER;
|
||||||
action.cutoff = cutoff;
|
action.cutoff = cutoff;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AccessibleAudioEngine::seekSound(uintptr_t handle, int slot, size_t offset) {
|
void AccessibleAudioEngine::seekSound(uintptr_t handle, int slot, size_t offset) {
|
||||||
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
||||||
return;
|
return;
|
||||||
SoundAction& action = getNextOutgoingSoundAction();
|
SoundAction& action = getNextOutgoingSoundAction();
|
||||||
action.handle = handle;
|
action.handle = handle;
|
||||||
action.slot = slot;
|
action.slot = slot;
|
||||||
action.command = AAE_SEEK;
|
action.command = AAE_SEEK;
|
||||||
action.offset = offset;
|
action.offset = offset;
|
||||||
|
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::setSoundPosition(uintptr_t handle, int slot, float posX, float posY, float posZ, float distToPlayer, float maxDistance) {
|
void AccessibleAudioEngine::setSoundPosition(uintptr_t handle, int slot, float posX, float posY, float posZ,
|
||||||
|
float distToPlayer, float maxDistance) {
|
||||||
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
if (slot < 0 || slot >= AAE_SLOTS_PER_HANDLE)
|
||||||
return;
|
return;
|
||||||
SoundAction& action = getNextOutgoingSoundAction();
|
SoundAction& action = getNextOutgoingSoundAction();
|
||||||
|
@ -614,15 +590,15 @@ void AccessibleAudioEngine::setSoundPosition(uintptr_t handle, int slot, float p
|
||||||
action.posZ = posZ;
|
action.posZ = posZ;
|
||||||
action.distToPlayer = distToPlayer;
|
action.distToPlayer = distToPlayer;
|
||||||
action.maxDistance = maxDistance;
|
action.maxDistance = maxDistance;
|
||||||
|
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::prepare() {
|
void AccessibleAudioEngine::prepare() {
|
||||||
SoundAction& action = getNextOutgoingSoundAction();
|
SoundAction& action = getNextOutgoingSoundAction();
|
||||||
action.command = AAE_PREPARE;
|
action.command = AAE_PREPARE;
|
||||||
//This is called once at the end of every frame, so now is the time to post all of the accumulated commands.
|
// This is called once at the end of every frame, so now is the time to post all of the accumulated commands.
|
||||||
postSoundActions();
|
postSoundActions();
|
||||||
}
|
}
|
||||||
void AccessibleAudioEngine::cacheDecodedSample(std::string& path, void* data, size_t size) {
|
void AccessibleAudioEngine::cacheDecodedSample(std::string& path, void* data, size_t size) {
|
||||||
//The data is stored in wave format, so we register it with MiniAudio as an encoded asset as opposed to a decoded one.
|
// The data is stored in wave format, so we register it with MiniAudio as an encoded asset as opposed to a decoded
|
||||||
|
// one.
|
||||||
ma_resource_manager_register_encoded_data(&resourceManager, path.c_str(), data, size);
|
ma_resource_manager_register_encoded_data(&resourceManager, path.c_str(), data, size);
|
||||||
}
|
}
|
|
@ -13,13 +13,13 @@
|
||||||
#define AAE_SLOTS_PER_HANDLE 10
|
#define AAE_SLOTS_PER_HANDLE 10
|
||||||
class IResource;
|
class IResource;
|
||||||
struct DecodedSample {
|
struct DecodedSample {
|
||||||
void* data;//A wav file.
|
void* data; // A wav file.
|
||||||
size_t dataSize;
|
size_t dataSize;
|
||||||
};
|
};
|
||||||
struct SoundAction {
|
struct SoundAction {
|
||||||
uintptr_t handle; // This handle is user-defined and uniquely identifies a sound source. It can be anything, but the
|
uintptr_t handle; // This handle is user-defined and uniquely identifies a sound source. It can be anything, but the
|
||||||
// address of an object with which the sound is associated is recommended.
|
// address of an object with which the sound is associated is recommended.
|
||||||
int slot;//Allows multiple sounds per handle. The exact number is controlled by AAE_SOUNDS_PER_HANDLE.
|
int slot; // Allows multiple sounds per handle. The exact number is controlled by AAE_SOUNDS_PER_HANDLE.
|
||||||
int command; // One of the items belonging to AAE_COMMANDS.
|
int command; // One of the items belonging to AAE_COMMANDS.
|
||||||
std::string path; // If command is AAE_START, this is the path to the desired resource.
|
std::string path; // If command is AAE_START, this is the path to the desired resource.
|
||||||
bool looping; // If command is AAE_START, specifies whether or not the sound should loop.
|
bool looping; // If command is AAE_START, specifies whether or not the sound should loop.
|
||||||
|
@ -28,11 +28,11 @@ struct SoundAction {
|
||||||
float volume;
|
float volume;
|
||||||
float pan;
|
float pan;
|
||||||
float cutoff;
|
float cutoff;
|
||||||
size_t offset;//for seeking.
|
size_t offset; // for seeking.
|
||||||
float distance;
|
float distance;
|
||||||
};
|
};
|
||||||
|
|
||||||
//Position and rotation vectors for AAE_LISTENER and AAE_POS.
|
// Position and rotation vectors for AAE_LISTENER and AAE_POS.
|
||||||
float posX;
|
float posX;
|
||||||
float posY;
|
float posY;
|
||||||
float posZ;
|
float posZ;
|
||||||
|
@ -41,8 +41,7 @@ struct SoundAction {
|
||||||
uint32_t frames; // If command is AAE_PREPARE, this tells the engine how many PCM frames to get ready.
|
uint32_t frames; // If command is AAE_PREPARE, this tells the engine how many PCM frames to get ready.
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
ma_node_base base;
|
ma_node_base base;
|
||||||
ma_panner panner;
|
ma_panner panner;
|
||||||
ma_gainer gainer;
|
ma_gainer gainer;
|
||||||
|
@ -55,48 +54,50 @@ typedef struct
|
||||||
float maxDistance;
|
float maxDistance;
|
||||||
float pitch;
|
float pitch;
|
||||||
float pitchBehindModifier;
|
float pitchBehindModifier;
|
||||||
}SoundExtras;//Used for attenuation and other effects.
|
} SoundExtras; // Used for attenuation and other effects.
|
||||||
|
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
ma_sound sound;
|
ma_sound sound;
|
||||||
SoundExtras extras;
|
SoundExtras extras;
|
||||||
|
|
||||||
bool active;
|
bool active;
|
||||||
}SoundSlot;
|
} SoundSlot;
|
||||||
typedef std::array<SoundSlot, AAE_SLOTS_PER_HANDLE> SoundSlots;
|
typedef std::array<SoundSlot, AAE_SLOTS_PER_HANDLE> SoundSlots;
|
||||||
|
|
||||||
class AccessibleAudioEngine {
|
class AccessibleAudioEngine {
|
||||||
int initialized;
|
int initialized;
|
||||||
ma_resource_manager resourceManager;
|
ma_resource_manager resourceManager;
|
||||||
ma_engine engine;
|
ma_engine engine;
|
||||||
ma_pcm_rb preparedOutput;//Lock-free single producer single consumer.
|
ma_pcm_rb preparedOutput; // Lock-free single producer single consumer.
|
||||||
std::deque <SoundAction> soundActions;//A command cue.
|
std::deque<SoundAction> soundActions; // A command cue.
|
||||||
std::thread thread;
|
std::thread thread;
|
||||||
std::condition_variable cv;
|
std::condition_variable cv;
|
||||||
std::mutex mtx;
|
std::mutex mtx;
|
||||||
std::unordered_map<uintptr_t, SoundSlots> sounds;
|
std::unordered_map<uintptr_t, SoundSlots> sounds;
|
||||||
SoundAction outgoingSoundActions[AAE_SOUND_ACTION_BATCH_SIZE];//Allows batch delivery of SoundActions to the FIFO to minimize the amount of time spent locking and unlocking.
|
SoundAction
|
||||||
|
outgoingSoundActions[AAE_SOUND_ACTION_BATCH_SIZE]; // Allows batch delivery of SoundActions to the FIFO to
|
||||||
|
// minimize the amount of time spent locking and unlocking.
|
||||||
int nextOutgoingSoundAction;
|
int nextOutgoingSoundAction;
|
||||||
int framesUntilGC;
|
int framesUntilGC;
|
||||||
void destroy();//Called by the destructor, or if a throw occurs during construction.
|
void destroy(); // Called by the destructor, or if a throw occurs during construction.
|
||||||
//Dismantal a partial initialization and throw an exception.
|
// Dismantal a partial initialization and throw an exception.
|
||||||
void destroyAndThrow(const char* exceptionText);
|
void destroyAndThrow(const char* exceptionText);
|
||||||
|
|
||||||
//Retrieve some audio from the output buffer. This is to be performed by the audio thread. May return less data than requested.
|
// Retrieve some audio from the output buffer. This is to be performed by the audio thread. May return less data
|
||||||
|
// than requested.
|
||||||
uint32_t retrieve(float* buffer, uint32_t nFrames);
|
uint32_t retrieve(float* buffer, uint32_t nFrames);
|
||||||
//Functions dealing with the command queue.
|
// Functions dealing with the command queue.
|
||||||
int getSoundActions(SoundAction* dest, int limit);
|
int getSoundActions(SoundAction* dest, int limit);
|
||||||
void postSoundActions();
|
void postSoundActions();
|
||||||
void postHighPrioritySoundAction(SoundAction& action);//For now this is used only for termination events.
|
void postHighPrioritySoundAction(SoundAction& action); // For now this is used only for termination events.
|
||||||
|
|
||||||
SoundAction& getNextOutgoingSoundAction();
|
SoundAction& getNextOutgoingSoundAction();
|
||||||
void runThread();
|
void runThread();
|
||||||
//Find a sound by handle and slot, if it exists.
|
// Find a sound by handle and slot, if it exists.
|
||||||
SoundSlot* findSound(SoundAction& action);
|
SoundSlot* findSound(SoundAction& action);
|
||||||
|
|
||||||
//Functions which correspond to SoundAction commands.
|
// Functions which correspond to SoundAction commands.
|
||||||
//Ready a sound for playback.
|
// Ready a sound for playback.
|
||||||
void doPlaySound(SoundAction& action);
|
void doPlaySound(SoundAction& action);
|
||||||
void doStopSound(SoundAction& action);
|
void doStopSound(SoundAction& action);
|
||||||
void doStopAllSounds(SoundAction& action);
|
void doStopAllSounds(SoundAction& action);
|
||||||
|
@ -113,37 +114,39 @@ SoundSlot* findSound(SoundAction& action);
|
||||||
// Generate some output, and store it in the output buffer for later retrieval. May generate less output than
|
// Generate some output, and store it in the output buffer for later retrieval. May generate less output than
|
||||||
// requested if buffer space is insufficient.
|
// requested if buffer space is insufficient.
|
||||||
void doPrepare(SoundAction& action);
|
void doPrepare(SoundAction& action);
|
||||||
//Run every so often to clean up expired sound handles.
|
// Run every so often to clean up expired sound handles.
|
||||||
void garbageCollect();
|
void garbageCollect();
|
||||||
//Run MiniAudio's jobs.
|
// Run MiniAudio's jobs.
|
||||||
void processAudioJobs();
|
void processAudioJobs();
|
||||||
//Set up the panner and other effect processing on a sound slot.
|
// Set up the panner and other effect processing on a sound slot.
|
||||||
bool initSoundExtras(SoundSlot* slot);
|
bool initSoundExtras(SoundSlot* slot);
|
||||||
void destroySound(SoundSlot* slot);
|
void destroySound(SoundSlot* slot);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AccessibleAudioEngine();
|
AccessibleAudioEngine();
|
||||||
~AccessibleAudioEngine();
|
~AccessibleAudioEngine();
|
||||||
//Mix the game's audio with this engine's audio to produce the final mix. To be performed exclusively in the audio thread. Mixing is done in-place (meaning the buffer containing the game's audio is overwritten with the mixed content).
|
// Mix the game's audio with this engine's audio to produce the final mix. To be performed exclusively in the audio
|
||||||
|
// thread. Mixing is done in-place (meaning the buffer containing the game's audio is overwritten with the mixed
|
||||||
|
// content).
|
||||||
void mix(int16_t* ogBuffer, uint32_t nFrames);
|
void mix(int16_t* ogBuffer, uint32_t nFrames);
|
||||||
//Start playing a sound.
|
// Start playing a sound.
|
||||||
void playSound(uintptr_t handle, int slot, const char* path, bool looping);
|
void playSound(uintptr_t handle, int slot, const char* path, bool looping);
|
||||||
void stopSound(uintptr_t handle, int slot);
|
void stopSound(uintptr_t handle, int slot);
|
||||||
//Stop all sounds belonging to a handle.
|
// Stop all sounds belonging to a handle.
|
||||||
void stopAllSounds(uintptr_t handle);
|
void stopAllSounds(uintptr_t handle);
|
||||||
|
|
||||||
void setPitch(uintptr_t handle, int slot, float pitch);
|
void setPitch(uintptr_t handle, int slot, float pitch);
|
||||||
void setPitchBehindModifier(uintptr_t handle, int slot, float mod);
|
void setPitchBehindModifier(uintptr_t handle, int slot, float mod);
|
||||||
void setVolume(uintptr_t handle, int slot, float volume);
|
void setVolume(uintptr_t handle, int slot, float volume);
|
||||||
void setPan(uintptr_t handle, int slot, float pan);
|
void setPan(uintptr_t handle, int slot, float pan);
|
||||||
//Set the lowpass filter cutoff. Set to 1.0 for no filtering.
|
// Set the lowpass filter cutoff. Set to 1.0 for no filtering.
|
||||||
void setFilter(uintptr_t handle, int slot, float cutoff);
|
void setFilter(uintptr_t handle, int slot, float cutoff);
|
||||||
//Seek the sound to a particular PCM frame.
|
// Seek the sound to a particular PCM frame.
|
||||||
void seekSound(uintptr_t handle, int slot, size_t offset);
|
void seekSound(uintptr_t handle, int slot, size_t offset);
|
||||||
void setSoundPosition(uintptr_t handle, int slot, float posX, float posY, float posZ, float distToPlayer, float maxDistance);
|
void setSoundPosition(uintptr_t handle, int slot, float posX, float posY, float posZ, float distToPlayer,
|
||||||
//Schedule the preparation of output for delivery.
|
float maxDistance);
|
||||||
|
// Schedule the preparation of output for delivery.
|
||||||
void prepare();
|
void prepare();
|
||||||
void cacheDecodedSample(std::string& path, void* data, size_t size);
|
void cacheDecodedSample(std::string& path, void* data, size_t size);
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -31,13 +31,15 @@ extern bool freezeActors;
|
||||||
|
|
||||||
const char* GetLanguageCode();
|
const char* GetLanguageCode();
|
||||||
|
|
||||||
#define MAX_DB_REDUCTION 35// This is the amount in DB that a sound will be reduced by when it is at the maximum distance
|
#define MAX_DB_REDUCTION \
|
||||||
|
35 // This is the amount in DB that a sound will be reduced by when it is at the maximum distance
|
||||||
// from the player.
|
// from the player.
|
||||||
extern "C" {
|
extern "C" {
|
||||||
void CollisionPoly_GetVertices(CollisionPoly* poly, Vec3s* vtxList, Vec3f* dest);//Used to tell where polygons are located.
|
void CollisionPoly_GetVertices(CollisionPoly* poly, Vec3s* vtxList,
|
||||||
}
|
Vec3f* dest); // Used to tell where polygons are located.
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
s16 sceneIndex; // Corresponds directly to the game's scene indices.
|
s16 sceneIndex; // Corresponds directly to the game's scene indices.
|
||||||
|
@ -46,19 +48,23 @@ extern "C" {
|
||||||
s32 raw; // Combination of the two which can be used for dictionary lookups.
|
s32 raw; // Combination of the two which can be used for dictionary lookups.
|
||||||
};
|
};
|
||||||
|
|
||||||
} SceneAndRoom;
|
} SceneAndRoom;
|
||||||
typedef std::map<s16, ActorAccessibilityPolicy> SupportedActors_t;//Maps actors to their accessibility policies, which describe how accessibility should treat them.
|
typedef std::map<s16, ActorAccessibilityPolicy> SupportedActors_t; // Maps actors to their accessibility policies, which
|
||||||
typedef std::map<Actor*, uint64_t> TrackedActors_t;//Maps real actors to internal IDs specific to accessibility.
|
// describe how accessibility should treat them.
|
||||||
typedef std::map<uint64_t, AccessibleActor> AccessibleActorList_t;//Maps internal IDs to wrapped actor objects. These actors can be real or virtual.
|
typedef std::map<Actor*, uint64_t> TrackedActors_t; // Maps real actors to internal IDs specific to accessibility.
|
||||||
typedef std::vector<AccessibleActor> VAList_t;//Denotes a list of virtual actors specific to a single room.
|
typedef std::map<uint64_t, AccessibleActor>
|
||||||
typedef std::map<s32, VAList_t> VAZones_t;//Maps room/ scene indices to their corresponding virtual actor collections.
|
AccessibleActorList_t; // Maps internal IDs to wrapped actor objects. These actors can be real or virtual.
|
||||||
typedef std::unordered_set<s16> SceneList_t;//A list of scenes which have already been visited (since the game was launched). Used to prevent re-creation of terrain VAs every time the player reloads a scene.
|
typedef std::vector<AccessibleActor> VAList_t; // Denotes a list of virtual actors specific to a single room.
|
||||||
|
typedef std::map<s32, VAList_t> VAZones_t; // Maps room/ scene indices to their corresponding virtual actor collections.
|
||||||
|
typedef std::unordered_set<s16>
|
||||||
|
SceneList_t; // A list of scenes which have already been visited (since the game was launched). Used to prevent
|
||||||
|
// re-creation of terrain VAs every time the player reloads a scene.
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
std::string path;
|
std::string path;
|
||||||
std::shared_ptr<Ship::IResource> resource;
|
std::shared_ptr<Ship::IResource> resource;
|
||||||
std::shared_ptr<s16*> decodedSample;//Set if the record is for a raw sample as opposed to a SFX.
|
std::shared_ptr<s16*> decodedSample; // Set if the record is for a raw sample as opposed to a SFX.
|
||||||
}SfxRecord;
|
} SfxRecord;
|
||||||
|
|
||||||
class AudioGlossaryData {
|
class AudioGlossaryData {
|
||||||
public:
|
public:
|
||||||
|
@ -83,8 +89,9 @@ class ActorAccessibility {
|
||||||
SceneList_t sceneList;
|
SceneList_t sceneList;
|
||||||
AccessibleAudioEngine* audioEngine;
|
AccessibleAudioEngine* audioEngine;
|
||||||
SfxExtractor sfxExtractor;
|
SfxExtractor sfxExtractor;
|
||||||
std::unordered_map<s16, SfxRecord> sfxMap;//Maps internal sfx to external (prerendered) resources.
|
std::unordered_map<s16, SfxRecord> sfxMap; // Maps internal sfx to external (prerendered) resources.
|
||||||
std::unordered_map<std::string, SfxRecord> sampleMap;//Similar to above, but this one maps raw audio samples as opposed to SFX.
|
std::unordered_map<std::string, SfxRecord>
|
||||||
|
sampleMap; // Similar to above, but this one maps raw audio samples as opposed to SFX.
|
||||||
int extractSfx = 0;
|
int extractSfx = 0;
|
||||||
s16 currentScene = -1;
|
s16 currentScene = -1;
|
||||||
s8 currentRoom = -1;
|
s8 currentRoom = -1;
|
||||||
|
@ -94,9 +101,6 @@ class ActorAccessibility {
|
||||||
};
|
};
|
||||||
static ActorAccessibility* aa;
|
static ActorAccessibility* aa;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint64_t ActorAccessibility_GetNextID() {
|
uint64_t ActorAccessibility_GetNextID() {
|
||||||
uint64_t result = aa->nextActorID;
|
uint64_t result = aa->nextActorID;
|
||||||
aa->nextActorID++;
|
aa->nextActorID++;
|
||||||
|
@ -111,24 +115,20 @@ void ActorAccessibility_OnGameFrameUpdate() {
|
||||||
if (gPlayState == NULL)
|
if (gPlayState == NULL)
|
||||||
return;
|
return;
|
||||||
if (!GameInteractor::IsSaveLoaded() && !aa->extractSfx)
|
if (!GameInteractor::IsSaveLoaded() && !aa->extractSfx)
|
||||||
return;//Title screen, skip.
|
return; // Title screen, skip.
|
||||||
|
|
||||||
ActorAccessibility_RunAccessibilityForAllActors(gPlayState);
|
ActorAccessibility_RunAccessibilityForAllActors(gPlayState);
|
||||||
}
|
}
|
||||||
void ActorAccessibility_OnActorDestroy(void* actor)
|
void ActorAccessibility_OnActorDestroy(void* actor) {
|
||||||
{
|
ActorAccessibility_RemoveTrackedActor((Actor*)actor);
|
||||||
ActorAccessibility_RemoveTrackedActor((Actor*) actor);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
void ActorAccessibility_OnGameStillFrozen()
|
void ActorAccessibility_OnGameStillFrozen() {
|
||||||
{
|
|
||||||
if (gPlayState == NULL)
|
if (gPlayState == NULL)
|
||||||
return;
|
return;
|
||||||
if (aa->extractSfx)
|
if (aa->extractSfx)
|
||||||
ActorAccessibility_HandleSoundExtractionMode(gPlayState);
|
ActorAccessibility_HandleSoundExtractionMode(gPlayState);
|
||||||
|
|
||||||
}
|
}
|
||||||
void ActorAccessibility_Init() {
|
void ActorAccessibility_Init() {
|
||||||
|
|
||||||
aa = new ActorAccessibility();
|
aa = new ActorAccessibility();
|
||||||
aa->glossary = new AudioGlossaryData();
|
aa->glossary = new AudioGlossaryData();
|
||||||
|
@ -145,12 +145,12 @@ void ActorAccessibility_OnGameStillFrozen()
|
||||||
|
|
||||||
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnPlayerUpdate>(ActorAccessibility_OnGameFrameUpdate);
|
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnPlayerUpdate>(ActorAccessibility_OnGameFrameUpdate);
|
||||||
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnGameStillFrozen>(ActorAccessibility_OnGameStillFrozen);
|
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnGameStillFrozen>(ActorAccessibility_OnGameStillFrozen);
|
||||||
}
|
}
|
||||||
void ActorAccessibility_Shutdown() {
|
void ActorAccessibility_Shutdown() {
|
||||||
ActorAccessibility_ShutdownAudio();
|
ActorAccessibility_ShutdownAudio();
|
||||||
delete aa;
|
delete aa;
|
||||||
}
|
}
|
||||||
void ActorAccessibility_InitPolicy(ActorAccessibilityPolicy * policy, const char* englishName,
|
void ActorAccessibility_InitPolicy(ActorAccessibilityPolicy* policy, const char* englishName,
|
||||||
ActorAccessibilityCallback callback, s16 sfx) {
|
ActorAccessibilityCallback callback, s16 sfx) {
|
||||||
policy->callback = callback;
|
policy->callback = callback;
|
||||||
policy->distance = 500;
|
policy->distance = 500;
|
||||||
|
@ -167,12 +167,10 @@ void ActorAccessibility_Shutdown() {
|
||||||
policy->aimAssist.isProvider = false;
|
policy->aimAssist.isProvider = false;
|
||||||
policy->aimAssist.sfx = NA_SE_SY_HITPOINT_ALARM;
|
policy->aimAssist.sfx = NA_SE_SY_HITPOINT_ALARM;
|
||||||
policy->aimAssist.tolerance = 0.0;
|
policy->aimAssist.tolerance = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
void ActorAccessibility_AddSupportedActor(s16 type, ActorAccessibilityPolicy policy) {
|
||||||
|
|
||||||
void ActorAccessibility_AddSupportedActor(s16 type, ActorAccessibilityPolicy policy) {
|
|
||||||
aa->supportedActors[type] = policy;
|
aa->supportedActors[type] = policy;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ActorAccessibilityPolicy* ActorAccessibility_GetPolicyForActor(s16 type) {
|
ActorAccessibilityPolicy* ActorAccessibility_GetPolicyForActor(s16 type) {
|
||||||
|
@ -180,16 +178,14 @@ ActorAccessibilityPolicy* ActorAccessibility_GetPolicyForActor(s16 type) {
|
||||||
if (i == aa->supportedActors.end())
|
if (i == aa->supportedActors.end())
|
||||||
return NULL;
|
return NULL;
|
||||||
return &(i->second);
|
return &(i->second);
|
||||||
|
}
|
||||||
}
|
|
||||||
int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
static std::mt19937 gen;
|
static std::mt19937 gen;
|
||||||
std::uniform_int_distribution<> dist(min, max);
|
std::uniform_int_distribution<> dist(min, max);
|
||||||
return dist(gen);
|
return dist(gen);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
void ActorAccessibility_TrackNewActor(Actor* actor) {
|
||||||
|
|
||||||
void ActorAccessibility_TrackNewActor(Actor * actor) {
|
|
||||||
// Don't track actors for which no accessibility policy has been configured.
|
// Don't track actors for which no accessibility policy has been configured.
|
||||||
ActorAccessibilityPolicy* policy = ActorAccessibility_GetPolicyForActor(actor->id);
|
ActorAccessibilityPolicy* policy = ActorAccessibility_GetPolicyForActor(actor->id);
|
||||||
if (policy == NULL)
|
if (policy == NULL)
|
||||||
|
@ -198,7 +194,7 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
accessibleActor.instanceID = ActorAccessibility_GetNextID();
|
accessibleActor.instanceID = ActorAccessibility_GetNextID();
|
||||||
accessibleActor.actor = actor;
|
accessibleActor.actor = actor;
|
||||||
accessibleActor.id = actor->id;
|
accessibleActor.id = actor->id;
|
||||||
//Stagger the start times so that all of the sounds don't play at exactly the same time.
|
// Stagger the start times so that all of the sounds don't play at exactly the same time.
|
||||||
accessibleActor.frameCount = ActorAccessibility_GetRandomStartingFrameCount(0, policy->n);
|
accessibleActor.frameCount = ActorAccessibility_GetRandomStartingFrameCount(0, policy->n);
|
||||||
accessibleActor.basePitch = policy->pitch;
|
accessibleActor.basePitch = policy->pitch;
|
||||||
accessibleActor.policy = *policy;
|
accessibleActor.policy = *policy;
|
||||||
|
@ -220,9 +216,8 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
|
|
||||||
return; // Probably a malloc error preventing user data initialization.
|
return; // Probably a malloc error preventing user data initialization.
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_RemoveTrackedActor(Actor* actor) {
|
||||||
void ActorAccessibility_RemoveTrackedActor(Actor* actor) {
|
|
||||||
TrackedActors_t::iterator i = aa->trackedActors.find(actor);
|
TrackedActors_t::iterator i = aa->trackedActors.find(actor);
|
||||||
if (i == aa->trackedActors.end())
|
if (i == aa->trackedActors.end())
|
||||||
return;
|
return;
|
||||||
|
@ -235,13 +230,12 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
i2->second.policy.cleanupUserData(&i2->second);
|
i2->second.policy.cleanupUserData(&i2->second);
|
||||||
ActorAccessibility_StopAllSoundsForActor(&i2->second);
|
ActorAccessibility_StopAllSoundsForActor(&i2->second);
|
||||||
aa->accessibleActorList.erase(i2);
|
aa->accessibleActorList.erase(i2);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
f32 ActorAccessibility_DBToLinear(float gain) {
|
||||||
|
|
||||||
f32 ActorAccessibility_DBToLinear(float gain) {
|
|
||||||
return (float)pow(10.0, gain / 20.0f);
|
return (float)pow(10.0, gain / 20.0f);
|
||||||
}
|
}
|
||||||
f32 ActorAccessibility_ComputeCurrentVolume(f32 maxDistance, f32 xzDistToPlayer) {
|
f32 ActorAccessibility_ComputeCurrentVolume(f32 maxDistance, f32 xzDistToPlayer) {
|
||||||
if (maxDistance == 0)
|
if (maxDistance == 0)
|
||||||
return 0.0;
|
return 0.0;
|
||||||
f32 absDistance = fabs(xzDistToPlayer);
|
f32 absDistance = fabs(xzDistToPlayer);
|
||||||
|
@ -249,118 +243,91 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
f32 db = LERP(0.0 - MAX_DB_REDUCTION, 0.0, (maxDistance - absDistance) / maxDistance);
|
f32 db = LERP(0.0 - MAX_DB_REDUCTION, 0.0, (maxDistance - absDistance) / maxDistance);
|
||||||
|
|
||||||
return ActorAccessibility_DBToLinear(db);
|
return ActorAccessibility_DBToLinear(db);
|
||||||
|
}
|
||||||
}
|
const char* ActorAccessibility_MapSfxToExternalAudio(s16 sfxId);
|
||||||
const char* ActorAccessibility_MapSfxToExternalAudio(s16 sfxId);
|
void ActorAccessibility_PlaySound(void* handle, int slot, s16 sfxId, bool looping) {
|
||||||
void ActorAccessibility_PlaySound(void* handle, int slot, s16 sfxId, bool looping)
|
|
||||||
{
|
|
||||||
const char* path = ActorAccessibility_MapSfxToExternalAudio(sfxId);
|
const char* path = ActorAccessibility_MapSfxToExternalAudio(sfxId);
|
||||||
if (path == NULL)
|
if (path == NULL)
|
||||||
return;
|
return;
|
||||||
aa->audioEngine->playSound((uintptr_t)handle, slot, path, looping);
|
aa->audioEngine->playSound((uintptr_t)handle, slot, path, looping);
|
||||||
}
|
}
|
||||||
const char* ActorAccessibility_MapRawSampleToExternalAudio(const char* name);
|
const char* ActorAccessibility_MapRawSampleToExternalAudio(const char* name);
|
||||||
|
|
||||||
void ActorAccessibility_PlayRawSample(void* handle, int slot, const char* name, bool looping)
|
void ActorAccessibility_PlayRawSample(void* handle, int slot, const char* name, bool looping) {
|
||||||
{
|
|
||||||
const char* path = ActorAccessibility_MapRawSampleToExternalAudio(name);
|
const char* path = ActorAccessibility_MapRawSampleToExternalAudio(name);
|
||||||
if (path == NULL)
|
if (path == NULL)
|
||||||
return;
|
return;
|
||||||
aa->audioEngine->playSound((uintptr_t)handle, slot, path, looping);
|
aa->audioEngine->playSound((uintptr_t)handle, slot, path, looping);
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_StopSound(void* handle, int slot) {
|
||||||
void ActorAccessibility_StopSound(void* handle, int slot)
|
aa->audioEngine->stopSound((uintptr_t)handle, slot);
|
||||||
{
|
}
|
||||||
aa->audioEngine->stopSound((uintptr_t) handle, slot);
|
void ActorAccessibility_StopAllSounds(void* handle) {
|
||||||
|
|
||||||
}
|
|
||||||
void ActorAccessibility_StopAllSounds(void* handle)
|
|
||||||
{
|
|
||||||
aa->audioEngine->stopAllSounds((uintptr_t)handle);
|
aa->audioEngine->stopAllSounds((uintptr_t)handle);
|
||||||
}
|
}
|
||||||
void ActorAccessibility_SetSoundPitch(void* handle, int slot, float pitch)
|
void ActorAccessibility_SetSoundPitch(void* handle, int slot, float pitch) {
|
||||||
{
|
|
||||||
aa->audioEngine->setPitch((uintptr_t)handle, slot, pitch);
|
aa->audioEngine->setPitch((uintptr_t)handle, slot, pitch);
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_SetPitchBehindModifier(void* handle, int slot, float mod) {
|
||||||
void ActorAccessibility_SetPitchBehindModifier(void* handle, int slot, float mod)
|
aa->audioEngine->setPitchBehindModifier((uintptr_t)handle, slot, mod);
|
||||||
{
|
}
|
||||||
aa->audioEngine->setPitchBehindModifier((uintptr_t) handle, slot, mod);
|
void ActorAccessibility_SetSoundPos(void* handle, int slot, Vec3f* pos, f32 distToPlayer, f32 maxDistance) {
|
||||||
|
aa->audioEngine->setSoundPosition((uintptr_t)handle, slot, pos->x, pos->y, pos->z, distToPlayer, maxDistance);
|
||||||
}
|
}
|
||||||
void ActorAccessibility_SetSoundPos(void* handle, int slot, Vec3f* pos, f32 distToPlayer, f32 maxDistance) {
|
void ActorAccessibility_SetSoundVolume(void* handle, int slot, float volume) {
|
||||||
aa->audioEngine->setSoundPosition((uintptr_t) handle, slot, pos->x, pos->y, pos->z, distToPlayer, maxDistance);
|
|
||||||
}
|
|
||||||
void ActorAccessibility_SetSoundVolume(void* handle, int slot, float volume)
|
|
||||||
{
|
|
||||||
aa->audioEngine->setVolume((uintptr_t)handle, slot, volume);
|
aa->audioEngine->setVolume((uintptr_t)handle, slot, volume);
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_SetSoundPan(void* handle, int slot, Vec3f* projectedPos) {
|
||||||
void ActorAccessibility_SetSoundPan(void* handle, int slot, Vec3f* projectedPos)
|
|
||||||
{
|
|
||||||
float pan = projectedPos->x / 270;
|
float pan = projectedPos->x / 270;
|
||||||
if (pan < -1.0)
|
if (pan < -1.0)
|
||||||
pan = -1.0;
|
pan = -1.0;
|
||||||
if (pan > 1.0)
|
if (pan > 1.0)
|
||||||
pan = 1.0;
|
pan = 1.0;
|
||||||
aa->audioEngine->setPan((uintptr_t)handle, slot, pan);
|
aa->audioEngine->setPan((uintptr_t)handle, slot, pan);
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_SetSoundFilter(void* handle, int slot, float cutoff) {
|
||||||
void ActorAccessibility_SetSoundFilter(void* handle, int slot, float cutoff)
|
|
||||||
{
|
|
||||||
aa->audioEngine->setFilter((uintptr_t)handle, slot, cutoff);
|
aa->audioEngine->setFilter((uintptr_t)handle, slot, cutoff);
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_SeekSound(void* handle, int slot, size_t offset) {
|
||||||
void ActorAccessibility_SeekSound(void* handle, int slot, size_t offset)
|
|
||||||
{
|
|
||||||
aa->audioEngine->seekSound((uintptr_t)handle, slot, offset);
|
aa->audioEngine->seekSound((uintptr_t)handle, slot, offset);
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_ConfigureSoundForActor(AccessibleActor* actor, int slot) {
|
||||||
void ActorAccessibility_ConfigureSoundForActor(AccessibleActor* actor, int slot)
|
|
||||||
{
|
|
||||||
ActorAccessibility_SetSoundPitch(actor, slot, actor->policy.pitch);
|
ActorAccessibility_SetSoundPitch(actor, slot, actor->policy.pitch);
|
||||||
ActorAccessibility_SetPitchBehindModifier(actor, slot, actor->policy.pitchModifier);
|
ActorAccessibility_SetPitchBehindModifier(actor, slot, actor->policy.pitchModifier);
|
||||||
ActorAccessibility_SetSoundPos(actor, slot, &actor->projectedPos, actor->xyzDistToPlayer,
|
ActorAccessibility_SetSoundPos(actor, slot, &actor->projectedPos, actor->xyzDistToPlayer, actor->policy.distance);
|
||||||
actor->policy.distance);
|
|
||||||
ActorAccessibility_SetSoundVolume(actor, slot, actor->policy.volume);
|
ActorAccessibility_SetSoundVolume(actor, slot, actor->policy.volume);
|
||||||
actor->managedSoundSlots[slot] = true;
|
actor->managedSoundSlots[slot] = true;
|
||||||
}
|
}
|
||||||
void ActorAccessibility_PlaySoundForActor(AccessibleActor* actor, int slot, s16 sfxId, bool looping)
|
void ActorAccessibility_PlaySoundForActor(AccessibleActor* actor, int slot, s16 sfxId, bool looping) {
|
||||||
{
|
|
||||||
if (slot < 0 || slot > NUM_MANAGED_SOUND_SLOTS)
|
if (slot < 0 || slot > NUM_MANAGED_SOUND_SLOTS)
|
||||||
return;
|
return;
|
||||||
ActorAccessibility_PlaySound(actor, slot, sfxId, looping);
|
ActorAccessibility_PlaySound(actor, slot, sfxId, looping);
|
||||||
ActorAccessibility_ConfigureSoundForActor(actor, slot);
|
ActorAccessibility_ConfigureSoundForActor(actor, slot);
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_PlaySampleForActor(AccessibleActor* actor, int slot, const char* name, bool looping) {
|
||||||
void ActorAccessibility_PlaySampleForActor(AccessibleActor* actor, int slot, const char* name, bool looping)
|
|
||||||
{
|
|
||||||
if (slot < 0 || slot > NUM_MANAGED_SOUND_SLOTS)
|
if (slot < 0 || slot > NUM_MANAGED_SOUND_SLOTS)
|
||||||
return;
|
return;
|
||||||
ActorAccessibility_PlayRawSample(actor, slot, name, looping);
|
ActorAccessibility_PlayRawSample(actor, slot, name, looping);
|
||||||
ActorAccessibility_ConfigureSoundForActor(actor, slot);
|
ActorAccessibility_ConfigureSoundForActor(actor, slot);
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_StopSoundForActor(AccessibleActor* actor, int slot) {
|
||||||
void ActorAccessibility_StopSoundForActor(AccessibleActor* actor, int slot)
|
|
||||||
{
|
|
||||||
if (slot < 0 || slot >= NUM_MANAGED_SOUND_SLOTS)
|
if (slot < 0 || slot >= NUM_MANAGED_SOUND_SLOTS)
|
||||||
return;
|
return;
|
||||||
ActorAccessibility_StopSound(actor, slot);
|
ActorAccessibility_StopSound(actor, slot);
|
||||||
actor->managedSoundSlots[slot] = false;
|
actor->managedSoundSlots[slot] = false;
|
||||||
}
|
}
|
||||||
void ActorAccessibility_StopAllSoundsForActor(AccessibleActor* actor)
|
void ActorAccessibility_StopAllSoundsForActor(AccessibleActor* actor)
|
||||||
|
|
||||||
{
|
{
|
||||||
ActorAccessibility_StopAllSounds(actor);
|
ActorAccessibility_StopAllSounds(actor);
|
||||||
for (int i = 0; i < NUM_MANAGED_SOUND_SLOTS; i++)
|
for (int i = 0; i < NUM_MANAGED_SOUND_SLOTS; i++)
|
||||||
actor->managedSoundSlots[i] = false;
|
actor->managedSoundSlots[i] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ActorAccessibility_IsRealActor(AccessibleActor* actor) {
|
bool ActorAccessibility_IsRealActor(AccessibleActor* actor) {
|
||||||
return actor->actor != NULL;
|
return actor->actor != NULL;
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_CopyParamsFromRealActor(AccessibleActor* actor) {
|
||||||
void ActorAccessibility_CopyParamsFromRealActor(AccessibleActor* actor) {
|
|
||||||
Player* player = GET_PLAYER(actor->play);
|
Player* player = GET_PLAYER(actor->play);
|
||||||
if (actor->actor == NULL)
|
if (actor->actor == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -368,31 +335,28 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
actor->xzDistToPlayer = actor->actor->xzDistToPlayer;
|
actor->xzDistToPlayer = actor->actor->xzDistToPlayer;
|
||||||
actor->isDrawn = actor->actor->isDrawn;
|
actor->isDrawn = actor->actor->isDrawn;
|
||||||
actor->xyzDistToPlayer = Math_Vec3f_DistXYZ(&actor->actor->world.pos, &player->actor.world.pos);
|
actor->xyzDistToPlayer = Math_Vec3f_DistXYZ(&actor->actor->world.pos, &player->actor.world.pos);
|
||||||
}
|
}
|
||||||
void ActorAccessibility_PrepareNextAudioFrame();
|
void ActorAccessibility_PrepareNextAudioFrame();
|
||||||
void ActorAccessibility_StopAllVirtualActors(VirtualActorList* list)
|
void ActorAccessibility_StopAllVirtualActors(VirtualActorList* list) {
|
||||||
{
|
|
||||||
if (list == NULL)
|
if (list == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
VAList_t* val = (VAList_t*)list;
|
VAList_t* val = (VAList_t*)list;
|
||||||
for (auto i = val->begin(); i != val->end(); i++)
|
for (auto i = val->begin(); i != val->end(); i++)
|
||||||
ActorAccessibility_StopAllSounds((void*) &(*i));
|
ActorAccessibility_StopAllSounds((void*)&(*i));
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_RunAccessibilityForActor(PlayState* play, AccessibleActor* actor) {
|
||||||
void ActorAccessibility_RunAccessibilityForActor(PlayState* play, AccessibleActor* actor) {
|
|
||||||
Player* player = GET_PLAYER(play);
|
Player* player = GET_PLAYER(play);
|
||||||
actor->play = play;
|
actor->play = play;
|
||||||
if(ActorAccessibility_IsRealActor(actor))
|
if (ActorAccessibility_IsRealActor(actor))
|
||||||
ActorAccessibility_CopyParamsFromRealActor(actor);
|
ActorAccessibility_CopyParamsFromRealActor(actor);
|
||||||
|
|
||||||
else {
|
else {
|
||||||
//Perform calculations that the game would normally take care of for real actors.
|
// Perform calculations that the game would normally take care of for real actors.
|
||||||
f32 w = 0.0f;
|
f32 w = 0.0f;
|
||||||
//Set actor->projectedPos.
|
// Set actor->projectedPos.
|
||||||
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &actor->world.pos, &actor->projectedPos,
|
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &actor->world.pos, &actor->projectedPos, &w);
|
||||||
&w);
|
// Set actor->xzDistToPlayer.
|
||||||
//Set actor->xzDistToPlayer.
|
|
||||||
|
|
||||||
actor->xzDistToPlayer = Math_Vec3f_DistXZ(&actor->world.pos, &player->actor.world.pos);
|
actor->xzDistToPlayer = Math_Vec3f_DistXZ(&actor->world.pos, &player->actor.world.pos);
|
||||||
actor->xyzDistToPlayer = Math_Vec3f_DistXYZ(&actor->world.pos, &player->actor.world.pos);
|
actor->xyzDistToPlayer = Math_Vec3f_DistXYZ(&actor->world.pos, &player->actor.world.pos);
|
||||||
|
@ -402,14 +366,13 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
if (actor->actor != NULL && fabs(actor->actor->yDistToPlayer) > actor->policy.ydist) {
|
if (actor->actor != NULL && fabs(actor->actor->yDistToPlayer) > actor->policy.ydist) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//Send sound parameters to the new audio engine. Eventually remove the old stuff once all actors are carried over.
|
// Send sound parameters to the new audio engine. Eventually remove the old stuff once all actors are carried over.
|
||||||
for (int i = 0; i < NUM_MANAGED_SOUND_SLOTS; i++)
|
for (int i = 0; i < NUM_MANAGED_SOUND_SLOTS; i++) {
|
||||||
{
|
if (actor->managedSoundSlots[i]) {
|
||||||
if (actor->managedSoundSlots[i])
|
ActorAccessibility_SetSoundPos(actor, i, &actor->projectedPos, actor->xyzDistToPlayer,
|
||||||
{
|
actor->policy.distance);
|
||||||
ActorAccessibility_SetSoundPos(actor, i, &actor->projectedPos, actor->xyzDistToPlayer, actor->policy.distance);
|
// Judgement call: pitch changes are rare enough that it doesn't make sense to pay the cost of updating it
|
||||||
//Judgement call: pitch changes are rare enough that it doesn't make sense to pay the cost of updating it every frame. If you want a pitch change, call the function as needed.
|
// every frame. If you want a pitch change, call the function as needed.
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
actor->frameCount++;
|
actor->frameCount++;
|
||||||
|
@ -425,8 +388,7 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
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 &&
|
||||||
(player->stateFlags1 & PLAYER_STATE1_USING_BOOMERANG ||
|
(player->stateFlags1 & PLAYER_STATE1_USING_BOOMERANG || player->stateFlags1 & PLAYER_STATE1_ITEM_IN_HAND)) {
|
||||||
player->stateFlags1 & PLAYER_STATE1_ITEM_IN_HAND)) {
|
|
||||||
ActorAccessibility_SetSoundPitch(actor, 9, actor->aimAssist.pitch);
|
ActorAccessibility_SetSoundPitch(actor, 9, actor->aimAssist.pitch);
|
||||||
actor->aimAssist.framesSinceAimAssist++;
|
actor->aimAssist.framesSinceAimAssist++;
|
||||||
ActorAccessibility_ProvideAimAssistForActor(actor);
|
ActorAccessibility_ProvideAimAssistForActor(actor);
|
||||||
|
@ -438,21 +400,19 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 9, actor->policy.aimAssist.sfx, false);
|
ActorAccessibility_PlaySoundForActor(actor, 9, actor->policy.aimAssist.sfx, false);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
actor->aimAssist.framesSinceAimAssist = 32768;//Make sure there's no delay the next time you draw your bow or whatever.
|
actor->aimAssist.framesSinceAimAssist =
|
||||||
|
32768; // Make sure there's no delay the next time you draw your bow or whatever.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (actor->policy.callback != NULL)
|
if (actor->policy.callback != NULL)
|
||||||
actor->policy.callback(actor);
|
actor->policy.callback(actor);
|
||||||
else
|
else
|
||||||
ActorAccessibility_PlaySoundForActor(actor, 0, actor->policy.sound, false);
|
ActorAccessibility_PlaySoundForActor(actor, 0, actor->policy.sound, false);
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_RunAccessibilityForAllActors(PlayState* play) {
|
||||||
void ActorAccessibility_RunAccessibilityForAllActors(PlayState* play) {
|
|
||||||
|
|
||||||
Player* player = GET_PLAYER(play);
|
Player* player = GET_PLAYER(play);
|
||||||
if (play->sceneNum != aa->currentScene)
|
if (play->sceneNum != aa->currentScene) {
|
||||||
{
|
|
||||||
ActorAccessibility_StopAllVirtualActors(aa->currentEverywhere);
|
ActorAccessibility_StopAllVirtualActors(aa->currentEverywhere);
|
||||||
ActorAccessibility_StopAllVirtualActors(aa->currentSceneGlobal);
|
ActorAccessibility_StopAllVirtualActors(aa->currentSceneGlobal);
|
||||||
ActorAccessibility_StopAllVirtualActors(aa->currentRoomLocal);
|
ActorAccessibility_StopAllVirtualActors(aa->currentRoomLocal);
|
||||||
|
@ -461,23 +421,18 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
aa->currentScene = play->sceneNum;
|
aa->currentScene = play->sceneNum;
|
||||||
aa->currentRoomLocal = NULL;
|
aa->currentRoomLocal = NULL;
|
||||||
aa->currentRoom = -1;
|
aa->currentRoom = -1;
|
||||||
|
|
||||||
}
|
}
|
||||||
if (aa->currentRoom != play->roomCtx.curRoom.num)
|
if (aa->currentRoom != play->roomCtx.curRoom.num) {
|
||||||
{
|
|
||||||
ActorAccessibility_StopAllVirtualActors(aa->currentRoomLocal);
|
ActorAccessibility_StopAllVirtualActors(aa->currentRoomLocal);
|
||||||
aa->currentRoomLocal = ActorAccessibility_GetVirtualActorList(play->sceneNum, play->roomCtx.curRoom.num);
|
aa->currentRoomLocal = ActorAccessibility_GetVirtualActorList(play->sceneNum, play->roomCtx.curRoom.num);
|
||||||
aa->currentRoom = play->roomCtx.curRoom.num;
|
aa->currentRoom = play->roomCtx.curRoom.num;
|
||||||
|
|
||||||
}
|
}
|
||||||
if (aa->glossary->currentScene != play->sceneNum || aa->glossary->currentRoom != play->roomCtx.curRoom.num) {
|
if (aa->glossary->currentScene != play->sceneNum || aa->glossary->currentRoom != play->roomCtx.curRoom.num) {
|
||||||
if (aa->glossary->GlossaryStarted = true) {
|
if (aa->glossary->GlossaryStarted = true) {
|
||||||
aa->glossary->cooldown = 0;
|
aa->glossary->cooldown = 0;
|
||||||
aa->glossary->GlossaryStarted = false;
|
aa->glossary->GlossaryStarted = false;
|
||||||
freezeActors = false;
|
freezeActors = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if (player->stateFlags1 & PLAYER_STATE1_IN_CUTSCENE) {
|
if (player->stateFlags1 & PLAYER_STATE1_IN_CUTSCENE) {
|
||||||
return;
|
return;
|
||||||
|
@ -487,30 +442,29 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//Real actors.
|
// Real actors.
|
||||||
for (AccessibleActorList_t::iterator i = aa->accessibleActorList.begin(); i != aa->accessibleActorList.end(); i++)
|
for (AccessibleActorList_t::iterator i = aa->accessibleActorList.begin(); i != aa->accessibleActorList.end(); i++)
|
||||||
ActorAccessibility_RunAccessibilityForActor(play, &i->second);
|
ActorAccessibility_RunAccessibilityForActor(play, &i->second);
|
||||||
//Virtual actors in the "everywhere" group.
|
// Virtual actors in the "everywhere" group.
|
||||||
VAList_t* list = (VAList_t*)aa->currentEverywhere;
|
VAList_t* list = (VAList_t*)aa->currentEverywhere;
|
||||||
|
|
||||||
for (VAList_t::iterator i = list->begin(); i != list->end(); i++)
|
for (VAList_t::iterator i = list->begin(); i != list->end(); i++)
|
||||||
ActorAccessibility_RunAccessibilityForActor(play, &(*i));
|
ActorAccessibility_RunAccessibilityForActor(play, &(*i));
|
||||||
//Virtual actors for the current room and scene.
|
// Virtual actors for the current room and scene.
|
||||||
list = (VAList_t*)aa->currentRoomLocal;
|
list = (VAList_t*)aa->currentRoomLocal;
|
||||||
for (VAList_t::iterator i = list->begin(); i != list->end(); i++)
|
for (VAList_t::iterator i = list->begin(); i != list->end(); i++)
|
||||||
ActorAccessibility_RunAccessibilityForActor(play, &(*i));
|
ActorAccessibility_RunAccessibilityForActor(play, &(*i));
|
||||||
//Scene-global virtual actors. Most of these are automatically generated VAs from polygons, because there's no way to sort these into rooms.
|
// Scene-global virtual actors. Most of these are automatically generated VAs from polygons, because there's no way
|
||||||
|
// to sort these into rooms.
|
||||||
list = (VAList_t*)aa->currentSceneGlobal;
|
list = (VAList_t*)aa->currentSceneGlobal;
|
||||||
for (VAList_t::iterator i = list->begin(); i != list->end(); i++)
|
for (VAList_t::iterator i = list->begin(); i != list->end(); i++)
|
||||||
ActorAccessibility_RunAccessibilityForActor(play, &(*i));
|
ActorAccessibility_RunAccessibilityForActor(play, &(*i));
|
||||||
|
|
||||||
|
// Processes external audio engine.
|
||||||
|
|
||||||
//Processes external audio engine.
|
|
||||||
ActorAccessibility_PrepareNextAudioFrame();
|
ActorAccessibility_PrepareNextAudioFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActorAccessibility_AudioGlossary(PlayState* play) {
|
void ActorAccessibility_AudioGlossary(PlayState* play) {
|
||||||
|
|
||||||
if (aa->glossary->GlossaryStarted) {
|
if (aa->glossary->GlossaryStarted) {
|
||||||
|
|
||||||
|
@ -527,7 +481,8 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
OSContPad* trackerButtonsPressed = std::dynamic_pointer_cast<LUS::ControlDeck>(Ship::Context::GetInstance()->GetControlDeck())->GetPads();
|
OSContPad* trackerButtonsPressed =
|
||||||
|
std::dynamic_pointer_cast<LUS::ControlDeck>(Ship::Context::GetInstance()->GetControlDeck())->GetPads();
|
||||||
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) {
|
||||||
|
@ -556,9 +511,7 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
}
|
}
|
||||||
aa->glossary->cooldown = 5;
|
aa->glossary->cooldown = 5;
|
||||||
|
|
||||||
|
|
||||||
SpeechSynthesizer::Instance->Speak((*aa->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];
|
||||||
|
@ -569,13 +522,10 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
}
|
}
|
||||||
// Processes external audio engine.
|
// Processes external audio engine.
|
||||||
ActorAccessibility_PrepareNextAudioFrame();
|
ActorAccessibility_PrepareNextAudioFrame();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
// Virtual actor config.
|
||||||
|
VirtualActorList* ActorAccessibility_GetVirtualActorList(s16 sceneNum, s8 roomNum) {
|
||||||
|
|
||||||
//Virtual actor config.
|
|
||||||
VirtualActorList* ActorAccessibility_GetVirtualActorList(s16 sceneNum, s8 roomNum)
|
|
||||||
{
|
|
||||||
SceneAndRoom sr;
|
SceneAndRoom sr;
|
||||||
sr.values.sceneIndex = sceneNum;
|
sr.values.sceneIndex = sceneNum;
|
||||||
sr.values.roomIndex = roomNum;
|
sr.values.roomIndex = roomNum;
|
||||||
|
@ -584,10 +534,8 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
|
|
||||||
VAList_t* l = &aa->vaZones[sr.raw];
|
VAList_t* l = &aa->vaZones[sr.raw];
|
||||||
return (VirtualActorList*)l;
|
return (VirtualActorList*)l;
|
||||||
|
}
|
||||||
}
|
AccessibleActor* ActorAccessibility_AddVirtualActor(VirtualActorList* list, VIRTUAL_ACTOR_TABLE type, PosRot where) {
|
||||||
AccessibleActor* ActorAccessibility_AddVirtualActor(VirtualActorList* list, VIRTUAL_ACTOR_TABLE type, PosRot where)
|
|
||||||
{
|
|
||||||
ActorAccessibilityPolicy* policy = ActorAccessibility_GetPolicyForActor(type);
|
ActorAccessibilityPolicy* policy = ActorAccessibility_GetPolicyForActor(type);
|
||||||
if (policy == NULL)
|
if (policy == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -622,21 +570,19 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
return NULL; // Probably a malloc error preventing user data initialization.
|
return NULL; // Probably a malloc error preventing user data initialization.
|
||||||
}
|
}
|
||||||
return savedActor;
|
return savedActor;
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_InterpretCurrentScene(PlayState* play) {
|
||||||
void ActorAccessibility_InterpretCurrentScene(PlayState* play)
|
|
||||||
{
|
|
||||||
if (aa->sceneList.contains(play->sceneNum))
|
if (aa->sceneList.contains(play->sceneNum))
|
||||||
return;//Scene interpretation already complete for this scene.
|
return; // Scene interpretation already complete for this scene.
|
||||||
aa->sceneList.insert(play->sceneNum);
|
aa->sceneList.insert(play->sceneNum);
|
||||||
VirtualActorList* list = ActorAccessibility_GetVirtualActorList(play->sceneNum, -1);//Scene-global VAs.
|
VirtualActorList* list = ActorAccessibility_GetVirtualActorList(play->sceneNum, -1); // Scene-global VAs.
|
||||||
if (list == NULL)
|
if (list == NULL)
|
||||||
return;
|
return;
|
||||||
for (int i = 0; i < play->colCtx.colHeader->numPolygons; i++)
|
for (int i = 0; i < play->colCtx.colHeader->numPolygons; i++) {
|
||||||
{
|
|
||||||
CollisionPoly* poly = &play->colCtx.colHeader->polyList[i];
|
CollisionPoly* poly = &play->colCtx.colHeader->polyList[i];
|
||||||
// checks if climable
|
// checks if climable
|
||||||
if ((func_80041DB8(&play->colCtx, poly, BGCHECK_SCENE) == 8 || func_80041DB8(&play->colCtx, poly, BGCHECK_SCENE) == 3)) {
|
if ((func_80041DB8(&play->colCtx, poly, BGCHECK_SCENE) == 8 ||
|
||||||
|
func_80041DB8(&play->colCtx, poly, BGCHECK_SCENE) == 3)) {
|
||||||
ActorAccessibility_PolyToVirtualActor(play, poly, VA_CLIMB, list);
|
ActorAccessibility_PolyToVirtualActor(play, poly, VA_CLIMB, list);
|
||||||
}
|
}
|
||||||
if (SurfaceType_IsWallDamage(&play->colCtx, poly, BGCHECK_SCENE)) {
|
if (SurfaceType_IsWallDamage(&play->colCtx, poly, BGCHECK_SCENE)) {
|
||||||
|
@ -649,11 +595,10 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
ActorAccessibility_PolyToVirtualActor(play, poly, VA_SPIKE, list);
|
ActorAccessibility_PolyToVirtualActor(play, poly, VA_SPIKE, list);
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
// Convert poly to VA.
|
||||||
//Convert poly to VA.
|
void ActorAccessibility_PolyToVirtualActor(PlayState* play, CollisionPoly* poly, VIRTUAL_ACTOR_TABLE va,
|
||||||
void ActorAccessibility_PolyToVirtualActor(PlayState* play, CollisionPoly* poly, VIRTUAL_ACTOR_TABLE va, VirtualActorList* destination)
|
VirtualActorList* destination) {
|
||||||
{
|
|
||||||
Vec3f polyVerts[3];
|
Vec3f polyVerts[3];
|
||||||
CollisionPoly_GetVertices(poly, play->colCtx.colHeader->vtxList, polyVerts);
|
CollisionPoly_GetVertices(poly, play->colCtx.colHeader->vtxList, polyVerts);
|
||||||
PosRot where;
|
PosRot where;
|
||||||
|
@ -673,9 +618,8 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
s16 nextEntranceIndex = play->setupExitList[actor->sceneIndex - 1];
|
s16 nextEntranceIndex = play->setupExitList[actor->sceneIndex - 1];
|
||||||
actor->sceneIndex = gEntranceTable[nextEntranceIndex].scene;
|
actor->sceneIndex = gEntranceTable[nextEntranceIndex].scene;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void ActorAccessibility_AnnounceRoomNumber(PlayState* play)
|
void ActorAccessibility_AnnounceRoomNumber(PlayState* play) {
|
||||||
{
|
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "Room" << (int)play->roomCtx.curRoom.num;
|
ss << "Room" << (int)play->roomCtx.curRoom.num;
|
||||||
if (Flags_GetClear(play, play->roomCtx.curRoom.num))
|
if (Flags_GetClear(play, play->roomCtx.curRoom.num))
|
||||||
|
@ -683,28 +627,26 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
else
|
else
|
||||||
ss << "." << std::endl;
|
ss << "." << std::endl;
|
||||||
SpeechSynthesizer::Instance->Speak(ss.str().c_str(), GetLanguageCode());
|
SpeechSynthesizer::Instance->Speak(ss.str().c_str(), GetLanguageCode());
|
||||||
|
}
|
||||||
}
|
// Aim cue support.
|
||||||
//Aim cue support.
|
void ActorAccessibility_ProvideAimAssistForActor(AccessibleActor* actor) {
|
||||||
void ActorAccessibility_ProvideAimAssistForActor(AccessibleActor* actor)
|
|
||||||
{
|
|
||||||
Player* player = GET_PLAYER(actor->play);
|
Player* player = GET_PLAYER(actor->play);
|
||||||
// 16384
|
// 16384
|
||||||
s32 angle = player->actor.focus.rot.x;
|
s32 angle = player->actor.focus.rot.x;
|
||||||
angle = angle / -14000.0 * 16384;
|
angle = angle / -14000.0 * 16384;
|
||||||
f32 slope = Math_SinS(angle) / Math_CosS(angle)*1.0;
|
f32 slope = Math_SinS(angle) / Math_CosS(angle) * 1.0;
|
||||||
s32 yIntercept = (slope * (actor->xzDistToPlayer)) + player->actor.focus.pos.y;
|
s32 yIntercept = (slope * (actor->xzDistToPlayer)) + player->actor.focus.pos.y;
|
||||||
s32 yHight = actor->actor->world.pos.y+25;
|
s32 yHight = actor->actor->world.pos.y + 25;
|
||||||
if (slope < 1) {
|
if (slope < 1) {
|
||||||
slope = 1;
|
slope = 1;
|
||||||
}
|
}
|
||||||
s32 correction = (1 - 1 / slope)*100;
|
s32 correction = (1 - 1 / slope) * 100;
|
||||||
if ((yIntercept) > yHight + 25) {
|
if ((yIntercept) > yHight + 25) {
|
||||||
actor->aimAssist.pitch = 1.5;
|
actor->aimAssist.pitch = 1.5;
|
||||||
} else if ((yIntercept) < yHight - 25) {
|
} else if ((yIntercept) < yHight - 25) {
|
||||||
actor->aimAssist.pitch = 0.5;
|
actor->aimAssist.pitch = 0.5;
|
||||||
}
|
}
|
||||||
s32 yDiff = fabs(yIntercept-yHight);
|
s32 yDiff = fabs(yIntercept - yHight);
|
||||||
if (yIntercept - yHight > 0) {
|
if (yIntercept - yHight > 0) {
|
||||||
yDiff -= correction;
|
yDiff -= correction;
|
||||||
if (yDiff < 0) {
|
if (yDiff < 0) {
|
||||||
|
@ -716,10 +658,10 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
} else {
|
} else {
|
||||||
actor->aimAssist.frequency = 1 + (uint8_t)(yDiff / 5);
|
actor->aimAssist.frequency = 1 + (uint8_t)(yDiff / 5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//External audio engine stuff.
|
// External audio engine stuff.
|
||||||
bool ActorAccessibility_InitAudio() {
|
bool ActorAccessibility_InitAudio() {
|
||||||
try {
|
try {
|
||||||
aa->audioEngine = new AccessibleAudioEngine();
|
aa->audioEngine = new AccessibleAudioEngine();
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
@ -727,33 +669,31 @@ int ActorAccessibility_GetRandomStartingFrameCount(int min, int max) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void ActorAccessibility_ShutdownAudio() {
|
void ActorAccessibility_ShutdownAudio() {
|
||||||
if (aa->isOn == 0)
|
if (aa->isOn == 0)
|
||||||
return;
|
return;
|
||||||
delete aa->audioEngine;
|
delete aa->audioEngine;
|
||||||
}
|
}
|
||||||
void ActorAccessibility_MixAccessibleAudioWithGameAudio(int16_t* ogBuffer, uint32_t nFrames) {
|
void ActorAccessibility_MixAccessibleAudioWithGameAudio(int16_t* ogBuffer, uint32_t nFrames) {
|
||||||
if (aa->isOn == 0)
|
if (aa->isOn == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
aa->audioEngine->mix(ogBuffer, nFrames);
|
aa->audioEngine->mix(ogBuffer, nFrames);
|
||||||
|
}
|
||||||
}
|
// Map one of the game's sfx to a path which as understood by the external audio engine. The returned token is a
|
||||||
// Map one of the game's sfx to a path which as understood by the external audio engine. The returned token is a
|
// short hex string that can be passed directly to the audio engine.
|
||||||
// short hex string that can be passed directly to the audio engine.
|
const char* ActorAccessibility_MapSfxToExternalAudio(s16 sfxId) {
|
||||||
const char* ActorAccessibility_MapSfxToExternalAudio(s16 sfxId)
|
|
||||||
{
|
|
||||||
SfxRecord* record;
|
SfxRecord* record;
|
||||||
auto it = aa->sfxMap.find(sfxId);
|
auto it = aa->sfxMap.find(sfxId);
|
||||||
if (it == aa->sfxMap.end())
|
if (it == aa->sfxMap.end()) {
|
||||||
{
|
|
||||||
SfxRecord tempRecord;
|
SfxRecord tempRecord;
|
||||||
std::string fullPath = SfxExtractor::getExternalFileName(sfxId);
|
std::string fullPath = SfxExtractor::getExternalFileName(sfxId);
|
||||||
auto res = std::static_pointer_cast<Ship::Blob>(Ship::Context::GetInstance()->GetResourceManager()->LoadResource(fullPath));
|
auto res = std::static_pointer_cast<Ship::Blob>(
|
||||||
|
Ship::Context::GetInstance()->GetResourceManager()->LoadResource(fullPath));
|
||||||
|
|
||||||
if(res == nullptr)
|
if (res == nullptr)
|
||||||
return NULL;//Resource doesn't exist, user's gotta run the extractor.
|
return NULL; // Resource doesn't exist, user's gotta run the extractor.
|
||||||
tempRecord.resource = res;
|
tempRecord.resource = res;
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << std::setw(4) << std::setfill('0') << std::hex << sfxId;
|
ss << std::setw(4) << std::setfill('0') << std::hex << sfxId;
|
||||||
|
@ -766,12 +706,9 @@ return NULL;//Resource doesn't exist, user's gotta run the extractor.
|
||||||
record = &it->second;
|
record = &it->second;
|
||||||
|
|
||||||
return record->path.c_str();
|
return record->path.c_str();
|
||||||
|
}
|
||||||
|
// Map the path to a raw sample to the external audio engine.
|
||||||
}
|
const char* ActorAccessibility_MapRawSampleToExternalAudio(const char* name) {
|
||||||
//Map the path to a raw sample to the external audio engine.
|
|
||||||
const char* ActorAccessibility_MapRawSampleToExternalAudio(const char* name)
|
|
||||||
{
|
|
||||||
SfxRecord* record;
|
SfxRecord* record;
|
||||||
std::string key(name);
|
std::string key(name);
|
||||||
auto it = aa->sampleMap.find(key);
|
auto it = aa->sampleMap.find(key);
|
||||||
|
@ -782,7 +719,7 @@ return NULL;//Resource doesn't exist, user's gotta run the extractor.
|
||||||
std::string fullPath = ss.str();
|
std::string fullPath = ss.str();
|
||||||
auto res = Ship::Context::GetInstance()->GetResourceManager()->LoadResource(fullPath);
|
auto res = Ship::Context::GetInstance()->GetResourceManager()->LoadResource(fullPath);
|
||||||
if (res == nullptr)
|
if (res == nullptr)
|
||||||
return NULL; // Resource doesn't exist, user's gotta run the extractor.
|
return NULL; // Resource doesn't exist, user's gotta run the extractor.
|
||||||
AudioDecoder decoder;
|
AudioDecoder decoder;
|
||||||
decoder.setSample((SOH::AudioSample*)res.get());
|
decoder.setSample((SOH::AudioSample*)res.get());
|
||||||
s16* wav;
|
s16* wav;
|
||||||
|
@ -792,29 +729,21 @@ return NULL; // Resource doesn't exist, user's gotta run the extractor.
|
||||||
tempRecord.decodedSample = std::make_shared<s16*>(wav);
|
tempRecord.decodedSample = std::make_shared<s16*>(wav);
|
||||||
aa->sampleMap[key] = tempRecord;
|
aa->sampleMap[key] = tempRecord;
|
||||||
record = &aa->sampleMap[key];
|
record = &aa->sampleMap[key];
|
||||||
aa->audioEngine->cacheDecodedSample(record->path, wav,
|
aa->audioEngine->cacheDecodedSample(record->path, wav, wavSize);
|
||||||
wavSize);
|
|
||||||
} else
|
} else
|
||||||
record = &it->second;
|
record = &it->second;
|
||||||
|
|
||||||
return record->path.c_str();
|
return record->path.c_str();
|
||||||
}
|
}
|
||||||
// Call once per frame to tell the audio engine to start working on the latest batch of queued instructions.
|
// Call once per frame to tell the audio engine to start working on the latest batch of queued instructions.
|
||||||
|
|
||||||
void ActorAccessibility_PrepareNextAudioFrame() {
|
void ActorAccessibility_PrepareNextAudioFrame() {
|
||||||
aa->audioEngine->prepare();
|
aa->audioEngine->prepare();
|
||||||
|
}
|
||||||
}
|
void ActorAccessibility_HandleSoundExtractionMode(PlayState* play) {
|
||||||
void ActorAccessibility_HandleSoundExtractionMode(PlayState* play)
|
|
||||||
{
|
|
||||||
aa->sfxExtractor.frameCallback();
|
aa->sfxExtractor.frameCallback();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
void ActorAccessibility_DoSoundExtractionStep() {
|
||||||
|
|
||||||
void ActorAccessibility_DoSoundExtractionStep()
|
|
||||||
{
|
|
||||||
aa->sfxExtractor.captureCallback();
|
aa->sfxExtractor.captureCallback();
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#define NUM_MANAGED_SOUND_SLOTS 10 //How many auto-managed sound slots can any given actor have? this can differ from AAE_SLOTS_PER_HANDLE, but cannot be greater.
|
#define NUM_MANAGED_SOUND_SLOTS \
|
||||||
|
10 // How many auto-managed sound slots can any given actor have? this can differ from AAE_SLOTS_PER_HANDLE, but
|
||||||
|
// cannot be greater.
|
||||||
struct AccessibleActor;
|
struct AccessibleActor;
|
||||||
typedef struct AccessibleActor AccessibleActor;
|
typedef struct AccessibleActor AccessibleActor;
|
||||||
// A callback that is run regularely as the game progresses in order to provide accessibility services for an actor.
|
// A callback that is run regularely as the game progresses in order to provide accessibility services for an actor.
|
||||||
|
@ -35,13 +37,13 @@ typedef struct {
|
||||||
bool runsAlways; // If set, then the distance policy is ignored.
|
bool runsAlways; // If set, then the distance policy is ignored.
|
||||||
ActorAccessibilityUserDataInit initUserData;
|
ActorAccessibilityUserDataInit initUserData;
|
||||||
ActorAccessibilityUserDataCleanup cleanupUserData;
|
ActorAccessibilityUserDataCleanup cleanupUserData;
|
||||||
//Aim assist settings.
|
// Aim assist settings.
|
||||||
struct {
|
struct {
|
||||||
bool isProvider;//determines whether or not this actor supports aim assist.
|
bool isProvider; // determines whether or not this actor supports aim assist.
|
||||||
s16 sfx; // The sound to play when this actor provides aim assist. Uses sound slot 9.
|
s16 sfx; // The sound to play when this actor provides aim assist. Uses sound slot 9.
|
||||||
f32 tolerance; // How close to the center of the actor does Link have to aim for aim assist to consider
|
f32 tolerance; // How close to the center of the actor does Link have to aim for aim assist to consider
|
||||||
// it lined up.
|
// it lined up.
|
||||||
}aimAssist;
|
} aimAssist;
|
||||||
|
|
||||||
} ActorAccessibilityPolicy;
|
} ActorAccessibilityPolicy;
|
||||||
|
|
||||||
|
@ -71,8 +73,10 @@ struct AccessibleActor {
|
||||||
f32 basePitch;
|
f32 basePitch;
|
||||||
|
|
||||||
f32 currentPitch;
|
f32 currentPitch;
|
||||||
s16 sceneIndex;//If this actor represents a scene transition, then this will contain the destination scene index. Zero otherwise.
|
s16 sceneIndex; // If this actor represents a scene transition, then this will contain the destination scene index.
|
||||||
bool managedSoundSlots[NUM_MANAGED_SOUND_SLOTS];//These have their attenuation and panning parameters updated every frame automatically.
|
// Zero otherwise.
|
||||||
|
bool managedSoundSlots[NUM_MANAGED_SOUND_SLOTS]; // These have their attenuation and panning parameters updated
|
||||||
|
// every frame automatically.
|
||||||
struct {
|
struct {
|
||||||
u16 framesSinceAimAssist; // Allows rate-based vertical aim assist. Incremented every frame for aim assist
|
u16 framesSinceAimAssist; // Allows rate-based vertical aim assist. Incremented every frame for aim assist
|
||||||
// actors. Manually reset by aim assist provider.
|
// actors. Manually reset by aim assist provider.
|
||||||
|
@ -99,22 +103,25 @@ void ActorAccessibility_AddSupportedActor(s16 type, ActorAccessibilityPolicy pol
|
||||||
void ActorAccessibility_RunAccessibilityForActor(PlayState* play, AccessibleActor* actor);
|
void ActorAccessibility_RunAccessibilityForActor(PlayState* play, AccessibleActor* actor);
|
||||||
void ActorAccessibility_RunAccessibilityForAllActors(PlayState* play);
|
void ActorAccessibility_RunAccessibilityForAllActors(PlayState* play);
|
||||||
/*
|
/*
|
||||||
*Play sounds (usually from the game) using the external sound engine. This is probably not the function you want to call most of the time (see below).
|
*Play sounds (usually from the game) using the external sound engine. This is probably not the function you want to
|
||||||
* handle: pointer to an arbitrary object. This object can be anything as it's only used as a classifier, but it's recommended that you use an AccessibleActor* as your handle whenever possible. Using AccessibleActor* as the handle gives you automatic cleanup when the actor is killed.
|
*call most of the time (see below). handle: pointer to an arbitrary object. This object can be anything as it's only
|
||||||
* slot: Allows multiple sounds to be assigned to a single handle. The maximum number of slots per actor is 10 by default (but can be controlled by modifying AAE_SLOTS_PER_HANDLE).
|
*used as a classifier, but it's recommended that you use an AccessibleActor* as your handle whenever possible. Using
|
||||||
* sfxId: one of the game's sfx IDs. Note that this plays prerendered sounds which you must have previously prepared.
|
*AccessibleActor* as the handle gives you automatic cleanup when the actor is killed. slot: Allows multiple sounds to
|
||||||
*looping: whether to play the sound just once or on a continuous loop.
|
*be assigned to a single handle. The maximum number of slots per actor is 10 by default (but can be controlled by
|
||||||
*/
|
*modifying AAE_SLOTS_PER_HANDLE). sfxId: one of the game's sfx IDs. Note that this plays prerendered sounds which you
|
||||||
|
*must have previously prepared. looping: whether to play the sound just once or on a continuous loop.
|
||||||
|
*/
|
||||||
void ActorAccessibility_PlaySound(void* actor, int slot, s16 sfxId, bool looping);
|
void ActorAccessibility_PlaySound(void* actor, int slot, s16 sfxId, bool looping);
|
||||||
//Play one of the game's internal samples.
|
// Play one of the game's internal samples.
|
||||||
void ActorAccessibility_PlayRawSample(void* handle, int slot, const char* name, bool looping);
|
void ActorAccessibility_PlayRawSample(void* handle, int slot, const char* name, bool looping);
|
||||||
//
|
//
|
||||||
//Stop a sound. Todo: consider making this a short fade instead of just cutting it off.
|
// Stop a sound. Todo: consider making this a short fade instead of just cutting it off.
|
||||||
void ActorAccessibility_StopSound(void* handle, int slot);
|
void ActorAccessibility_StopSound(void* handle, int slot);
|
||||||
void ActorAccessibility_StopAllSounds(void* handle);
|
void ActorAccessibility_StopAllSounds(void* handle);
|
||||||
|
|
||||||
void ActorAccessibility_SetSoundPitch(void* handle, int slot, float pitch);
|
void ActorAccessibility_SetSoundPitch(void* handle, int slot, float pitch);
|
||||||
//When we don't have access to something super fancy (such as HRTF), blind-accessible games generally use a change in pitch to tell the player that an object is behind the player.
|
// When we don't have access to something super fancy (such as HRTF), blind-accessible games generally use a change in
|
||||||
|
// pitch to tell the player that an object is behind the player.
|
||||||
void ActorAccessibility_SetPitchBehindModifier(void* handle, int slot, float mod);
|
void ActorAccessibility_SetPitchBehindModifier(void* handle, int slot, float mod);
|
||||||
|
|
||||||
void ActorAccessibility_SetListenerPos(Vec3f* pos, Vec3f* rot);
|
void ActorAccessibility_SetListenerPos(Vec3f* pos, Vec3f* rot);
|
||||||
|
@ -125,18 +132,19 @@ void ActorAccessibility_SetSoundPan(void* handle, int slot, Vec3f* projectedPos)
|
||||||
void ActorAccessibility_SetSoundFilter(void* handle, int slot, float cutoff);
|
void ActorAccessibility_SetSoundFilter(void* handle, int slot, float cutoff);
|
||||||
void ActorAccessibility_SeekSound(void* handle, int slot, size_t offset);
|
void ActorAccessibility_SeekSound(void* handle, int slot, size_t offset);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Play a sound on behalf of an AccessibleActor.
|
* Play a sound on behalf of an AccessibleActor.
|
||||||
* This version includes automatic sound management: pitch, panning and attenuation parameters will be updated automatically based on the actor's position.
|
* This version includes automatic sound management: pitch, panning and attenuation parameters will be updated
|
||||||
*
|
* automatically based on the actor's position.
|
||||||
*/
|
*
|
||||||
|
*/
|
||||||
void ActorAccessibility_PlaySoundForActor(AccessibleActor* actor, int slot, s16 sfxId, bool looping);
|
void ActorAccessibility_PlaySoundForActor(AccessibleActor* actor, int slot, s16 sfxId, bool looping);
|
||||||
void ActorAccessibility_PlaySampleForActor(AccessibleActor* actor, int slot, const char* name, bool looping);
|
void ActorAccessibility_PlaySampleForActor(AccessibleActor* actor, int slot, const char* name, bool looping);
|
||||||
|
|
||||||
void ActorAccessibility_StopSoundForActor(AccessibleActor* actor, int slot);
|
void ActorAccessibility_StopSoundForActor(AccessibleActor* actor, int slot);
|
||||||
void ActorAccessibility_StopAllSoundsForActor(AccessibleActor* actor);
|
void ActorAccessibility_StopAllSoundsForActor(AccessibleActor* actor);
|
||||||
f32 ActorAccessibility_ComputeCurrentVolume(f32 maxDistance, f32 xzDistToPlayer);
|
f32 ActorAccessibility_ComputeCurrentVolume(f32 maxDistance, f32 xzDistToPlayer);
|
||||||
// Computes a relative angle based on Link's (or some other actor's) current angle.
|
// Computes a relative angle based on Link's (or some other actor's) current angle.
|
||||||
Vec3s ActorAccessibility_ComputeRelativeAngle(Vec3s* origin, Vec3s* offset);
|
Vec3s ActorAccessibility_ComputeRelativeAngle(Vec3s* origin, Vec3s* offset);
|
||||||
void ActorAccessibility_InitCues();
|
void ActorAccessibility_InitCues();
|
||||||
// Stuff related to lists of virtual actors.
|
// Stuff related to lists of virtual actors.
|
||||||
|
@ -153,38 +161,37 @@ typedef enum {
|
||||||
VA_MARKER,
|
VA_MARKER,
|
||||||
VA_SPIKE,
|
VA_SPIKE,
|
||||||
VA_GENERAL_HELPER, // Room announcements, action icon and other misc help.
|
VA_GENERAL_HELPER, // Room announcements, action icon and other misc help.
|
||||||
VA_AUDIO_COMPASS,//Points north.
|
VA_AUDIO_COMPASS, // Points north.
|
||||||
VA_STICK_WARNING,//beep when stick is about to burn out.
|
VA_STICK_WARNING, // beep when stick is about to burn out.
|
||||||
|
|
||||||
VA_FINAL,
|
VA_FINAL,
|
||||||
|
|
||||||
} VIRTUAL_ACTOR_TABLE;
|
} VIRTUAL_ACTOR_TABLE;
|
||||||
|
|
||||||
|
|
||||||
#define EVERYWHERE -32768 // Denotes a virtual actor that is global/ omnipresent.
|
#define EVERYWHERE -32768 // Denotes a virtual actor that is global/ omnipresent.
|
||||||
|
|
||||||
// Get the list of virtual actors for a given scene and room index.
|
// Get the list of virtual actors for a given scene and room index.
|
||||||
VirtualActorList* ActorAccessibility_GetVirtualActorList(s16 sceneNum, s8 roomNum);
|
VirtualActorList* ActorAccessibility_GetVirtualActorList(s16 sceneNum, s8 roomNum);
|
||||||
AccessibleActor* ActorAccessibility_AddVirtualActor(VirtualActorList* list, VIRTUAL_ACTOR_TABLE type, PosRot where);
|
AccessibleActor* ActorAccessibility_AddVirtualActor(VirtualActorList* list, VIRTUAL_ACTOR_TABLE type, PosRot where);
|
||||||
//Parses the loaded seen and converts select polygons (like ladders, spikes and scene exits) into virtual actors.
|
// Parses the loaded seen and converts select polygons (like ladders, spikes and scene exits) into virtual actors.
|
||||||
void ActorAccessibility_InterpretCurrentScene(PlayState* play);
|
void ActorAccessibility_InterpretCurrentScene(PlayState* play);
|
||||||
//Convert a collision polygon into a virtual actor.
|
// Convert a collision polygon into a virtual actor.
|
||||||
void ActorAccessibility_PolyToVirtualActor(PlayState* play, CollisionPoly* poly, VIRTUAL_ACTOR_TABLE va, VirtualActorList* destination);
|
void ActorAccessibility_PolyToVirtualActor(PlayState* play, CollisionPoly* poly, VIRTUAL_ACTOR_TABLE va,
|
||||||
//Report which room of a dungeon the player is in.
|
VirtualActorList* destination);
|
||||||
void ActorAccessibility_AnnounceRoomNumber(PlayState* play);
|
// Report which room of a dungeon the player is in.
|
||||||
//Aim cue support.
|
void ActorAccessibility_AnnounceRoomNumber(PlayState* play);
|
||||||
void ActorAccessibility_ProvideAimAssistForActor(AccessibleActor* actor);
|
// Aim cue support.
|
||||||
// External audio engine stuff.
|
void ActorAccessibility_ProvideAimAssistForActor(AccessibleActor* actor);
|
||||||
|
// External audio engine stuff.
|
||||||
// Initialize the accessible audio engine.
|
// Initialize the accessible audio engine.
|
||||||
bool ActorAccessibility_InitAudio();
|
bool ActorAccessibility_InitAudio();
|
||||||
void ActorAccessibility_ShutdownAudio();
|
void ActorAccessibility_ShutdownAudio();
|
||||||
// Combine the games' audio with the output from AccessibleAudioEngine. To be called exclusively from the audio thread.
|
// Combine the games' audio with the output from AccessibleAudioEngine. To be called exclusively from the audio thread.
|
||||||
void ActorAccessibility_MixAccessibleAudioWithGameAudio(int16_t* ogBuffer, uint32_t nFrames);
|
void ActorAccessibility_MixAccessibleAudioWithGameAudio(int16_t* ogBuffer, uint32_t nFrames);
|
||||||
void ActorAccessibility_HandleSoundExtractionMode(PlayState* play);
|
void ActorAccessibility_HandleSoundExtractionMode(PlayState* play);
|
||||||
//This is called by the audio thread when it's ready to try to pull sfx from the game.
|
// This is called by the audio thread when it's ready to try to pull sfx from the game.
|
||||||
void ActorAccessibility_DoSoundExtractionStep();
|
void ActorAccessibility_DoSoundExtractionStep();
|
||||||
|
|
||||||
|
|
||||||
void ActorAccessibility_AudioGlossary(PlayState* play);
|
void ActorAccessibility_AudioGlossary(PlayState* play);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,13 +92,13 @@ void SfxExtractor::renderOutput() {
|
||||||
|
|
||||||
void SfxExtractor::setup() {
|
void SfxExtractor::setup() {
|
||||||
try {
|
try {
|
||||||
|
SpeechSynthesizer::Instance->Speak(
|
||||||
SpeechSynthesizer::Instance->Speak("Sfx extraction speedrun initiated. Please wait. This will take a few minutes.", GetLanguageCode());
|
"Sfx extraction speedrun initiated. Please wait. This will take a few minutes.", GetLanguageCode());
|
||||||
// Kill the audio thread so we can take control.
|
// Kill the audio thread so we can take control.
|
||||||
captureThreadState = CT_WAITING;
|
captureThreadState = CT_WAITING;
|
||||||
OTRAudio_InstallSfxCaptureThread();
|
OTRAudio_InstallSfxCaptureThread();
|
||||||
// Make sure we're starting from a clean slate.
|
// Make sure we're starting from a clean slate.
|
||||||
std::string sohAccessibilityPath = Ship::Context::GetPathRelativeToAppDirectory("accessibility.otr");
|
std::string sohAccessibilityPath = Ship::Context::GetPathRelativeToAppDirectory("accessibility.o2r");
|
||||||
if (std::filesystem::exists(sohAccessibilityPath)) {
|
if (std::filesystem::exists(sohAccessibilityPath)) {
|
||||||
currentStep = STEP_ERROR_OTR;
|
currentStep = STEP_ERROR_OTR;
|
||||||
return;
|
return;
|
||||||
|
@ -115,10 +115,11 @@ void SfxExtractor::setup() {
|
||||||
for (int i = 1; i < 10; i++) {
|
for (int i = 1; i < 10; i++) {
|
||||||
progressMilestones[i - 1] = sfxToRip.size() - ((int)ceil(sfxToRip.size() * (i / 10.0f)));
|
progressMilestones[i - 1] = sfxToRip.size() - ((int)ceil(sfxToRip.size() * (i / 10.0f)));
|
||||||
}
|
}
|
||||||
archive = Ship::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->AddArchive("accessibility.otr");
|
archive = std::make_shared<Ship::O2rArchive>("accessibility.o2r");
|
||||||
|
archive->Open();
|
||||||
} catch (...) { currentStep = STEP_ERROR; }
|
} catch (...) { currentStep = STEP_ERROR; }
|
||||||
}
|
}
|
||||||
|
|
||||||
void SfxExtractor::ripNextSfx() {
|
void SfxExtractor::ripNextSfx() {
|
||||||
{
|
{
|
||||||
auto lock = OTRAudio_Lock();
|
auto lock = OTRAudio_Lock();
|
||||||
|
@ -143,7 +144,8 @@ void SfxExtractor::ripNextSfx() {
|
||||||
sfxToRip.pop();
|
sfxToRip.pop();
|
||||||
startOfInput = 0;
|
startOfInput = 0;
|
||||||
endOfInput = 0;
|
endOfInput = 0;
|
||||||
Audio_PlaySoundGeneral(currentSfx, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
|
Audio_PlaySoundGeneral(currentSfx, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale,
|
||||||
|
&gSfxDefaultReverb);
|
||||||
|
|
||||||
{
|
{
|
||||||
auto lock = OTRAudio_Lock();
|
auto lock = OTRAudio_Lock();
|
||||||
|
@ -161,17 +163,18 @@ void SfxExtractor::finished() {
|
||||||
Audio_QueueSeqCmd(NA_BGM_TITLE);
|
Audio_QueueSeqCmd(NA_BGM_TITLE);
|
||||||
|
|
||||||
if (currentStep == STEP_ERROR || currentStep == STEP_ERROR_OTR) {
|
if (currentStep == STEP_ERROR || currentStep == STEP_ERROR_OTR) {
|
||||||
Audio_PlaySoundGeneral(NA_SE_SY_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
|
Audio_PlaySoundGeneral(NA_SE_SY_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
|
||||||
Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
|
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
|
||||||
|
Audio_PlaySoundGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
|
||||||
|
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "Sorry, we tried to extract the sound effects, but Ganondorf overruled us with an iron fist."
|
ss << "Sorry, we tried to extract the sound effects, but Ganondorf overruled us with an iron fist."
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
if (currentStep == STEP_ERROR_OTR)
|
if (currentStep == STEP_ERROR_OTR)
|
||||||
ss << "In all seriousness, please delete accessibility.otr and try again.";
|
ss << "In all seriousness, please delete accessibility.o2r and try again.";
|
||||||
SpeechSynthesizer::Instance->Speak(ss.str().c_str(), GetLanguageCode());
|
SpeechSynthesizer::Instance->Speak(ss.str().c_str(), GetLanguageCode());
|
||||||
} else
|
} else
|
||||||
Audio_PlayFanfare(NA_BGM_ITEM_GET);
|
Audio_PlayFanfare(NA_BGM_ITEM_GET);
|
||||||
|
|
||||||
}
|
}
|
||||||
void SfxExtractor::maybeGiveProgressReport() {
|
void SfxExtractor::maybeGiveProgressReport() {
|
||||||
size_t ripsRemaining = sfxToRip.size() + 1;
|
size_t ripsRemaining = sfxToRip.size() + 1;
|
||||||
|
@ -188,7 +191,7 @@ SfxExtractor::SfxExtractor() {
|
||||||
currentStep = STEP_SETUP;
|
currentStep = STEP_SETUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SfxExtractor::frameCallback() {
|
void SfxExtractor::frameCallback() {
|
||||||
switch (currentStep) {
|
switch (currentStep) {
|
||||||
case STEP_SETUP:
|
case STEP_SETUP:
|
||||||
setup();
|
setup();
|
||||||
|
@ -223,9 +226,9 @@ void SfxExtractor::captureCallback() {
|
||||||
AudioMgr_CreateNextAudioBuffer(mark, SFX_EXTRACTION_ONE_FRAME);
|
AudioMgr_CreateNextAudioBuffer(mark, SFX_EXTRACTION_ONE_FRAME);
|
||||||
|
|
||||||
if (!outputStarted && isAllZero(mark, SFX_EXTRACTION_ONE_FRAME * 2)) {
|
if (!outputStarted && isAllZero(mark, SFX_EXTRACTION_ONE_FRAME * 2)) {
|
||||||
waitTime++;
|
waitTime++;
|
||||||
if (waitTime < 300)
|
if (waitTime < 300)
|
||||||
continue;//Output is silent, allow more time for audio to begin.
|
continue; // Output is silent, allow more time for audio to begin.
|
||||||
captureThreadState = CT_FINISHED; // Sound is unavailable, so skip over it and move on.
|
captureThreadState = CT_FINISHED; // Sound is unavailable, so skip over it and move on.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
//A big nasty array containing every SFX ID in the game.
|
// A big nasty array containing every SFX ID in the game.
|
||||||
//All of the "DUMMY's" and "YOBI's" have been removed as they produce duplicate sounds at best, and cause errors or even crashes at worst.
|
// All of the "DUMMY's" and "YOBI's" have been removed as they produce duplicate sounds at best, and cause errors or
|
||||||
|
// even crashes at worst.
|
||||||
|
|
||||||
const s16 sfxTable[1207] = {
|
const s16 sfxTable[1207] = {
|
||||||
NA_SE_PL_WALK_GROUND,
|
NA_SE_PL_WALK_GROUND,
|
||||||
|
|
|
@ -13,27 +13,29 @@ f32 BgCheck_RaycastFloorImpl(PlayState* play, CollisionContext* colCtx, u16 xpFl
|
||||||
#include "soh/Enhancements/speechsynthesizer/SpeechSynthesizer.h"
|
#include "soh/Enhancements/speechsynthesizer/SpeechSynthesizer.h"
|
||||||
#include "soh/Enhancements/tts/tts.h"
|
#include "soh/Enhancements/tts/tts.h"
|
||||||
}
|
}
|
||||||
# define DETECTION_DISTANCE 500.0
|
#define DETECTION_DISTANCE 500.0
|
||||||
#define MIN_INCLINE_DISTANCE 5.0
|
#define MIN_INCLINE_DISTANCE 5.0
|
||||||
#define MIN_DECLINE_DISTANCE 5.0
|
#define MIN_DECLINE_DISTANCE 5.0
|
||||||
#define DEFAULT_PROBE_SPEED 5.5
|
#define DEFAULT_PROBE_SPEED 5.5
|
||||||
#define NOMINMAX
|
#define NOMINMAX
|
||||||
static Player fakePlayer;//Used for wall height detection.
|
static Player fakePlayer; // Used for wall height detection.
|
||||||
static Vec3f D_80854798 = { 0.0f, 18.0f, 0.0f }; // From z_player.c.
|
static Vec3f D_80854798 = { 0.0f, 18.0f, 0.0f }; // From z_player.c.
|
||||||
|
|
||||||
const char* GetLanguageCode();
|
const char* GetLanguageCode();
|
||||||
|
|
||||||
enum { DISCOVERED_NOTHING = 0,
|
enum {
|
||||||
DISCOVERED_INCLINE,
|
DISCOVERED_NOTHING = 0,
|
||||||
DISCOVERED_DECLINE,
|
DISCOVERED_INCLINE,
|
||||||
DISCOVERED_LEDGE,
|
DISCOVERED_DECLINE,
|
||||||
DISCOVERED_WALL,
|
DISCOVERED_LEDGE,
|
||||||
DISCOVERED_SPIKE,
|
DISCOVERED_WALL,
|
||||||
DISCOVERED_WATER,
|
DISCOVERED_SPIKE,
|
||||||
DISCOVERED_GROUND,
|
DISCOVERED_WATER,
|
||||||
DISCOVERED_LAVA,
|
DISCOVERED_GROUND,
|
||||||
|
DISCOVERED_LAVA,
|
||||||
};
|
};
|
||||||
//Abstract class for terrain cue sound handling. Implementations should not allocate memory. These are always in-place constructed in static memory owned by the TerrainCueDirection object.
|
// Abstract class for terrain cue sound handling. Implementations should not allocate memory. These are always in-place
|
||||||
|
// constructed in static memory owned by the TerrainCueDirection object.
|
||||||
class TerrainCueSound {
|
class TerrainCueSound {
|
||||||
protected:
|
protected:
|
||||||
AccessibleActor* actor;
|
AccessibleActor* actor;
|
||||||
|
@ -42,7 +44,7 @@ class TerrainCueSound {
|
||||||
f32 currentPitch;
|
f32 currentPitch;
|
||||||
f32 xzDistToPlayer;
|
f32 xzDistToPlayer;
|
||||||
s16 currentSFX;
|
s16 currentSFX;
|
||||||
int restFrames;//Used to control how often sounds get played.
|
int restFrames; // Used to control how often sounds get played.
|
||||||
|
|
||||||
bool shouldLoop;
|
bool shouldLoop;
|
||||||
// Call to start playback.
|
// Call to start playback.
|
||||||
|
@ -50,7 +52,6 @@ class TerrainCueSound {
|
||||||
ActorAccessibility_PlaySound(this, 0, currentSFX, shouldLoop);
|
ActorAccessibility_PlaySound(this, 0, currentSFX, shouldLoop);
|
||||||
ActorAccessibility_SetSoundPos(this, 0, &terrainProjectedPos, xzDistToPlayer, actor->policy.distance);
|
ActorAccessibility_SetSoundPos(this, 0, &terrainProjectedPos, xzDistToPlayer, actor->policy.distance);
|
||||||
ActorAccessibility_SetSoundPitch(this, 0, currentPitch);
|
ActorAccessibility_SetSoundPitch(this, 0, currentPitch);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call when terrain is no longer present to stop playback.
|
// Call when terrain is no longer present to stop playback.
|
||||||
|
@ -58,7 +59,7 @@ class TerrainCueSound {
|
||||||
ActorAccessibility_StopSound(this, 0);
|
ActorAccessibility_StopSound(this, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Custom terrain sound behaviour.
|
// Custom terrain sound behaviour.
|
||||||
virtual void run() = 0;
|
virtual void run() = 0;
|
||||||
// Update sound position and volume once per frame.
|
// Update sound position and volume once per frame.
|
||||||
virtual void updatePositions(Vec3f& pos) {
|
virtual void updatePositions(Vec3f& pos) {
|
||||||
|
@ -73,7 +74,6 @@ class TerrainCueSound {
|
||||||
xzDistToPlayer = Math_Vec3f_DistXZ(&terrainPos, &player->actor.world.pos);
|
xzDistToPlayer = Math_Vec3f_DistXZ(&terrainPos, &player->actor.world.pos);
|
||||||
ActorAccessibility_SetSoundPos(this, 0, &terrainProjectedPos, xzDistToPlayer, actor->policy.distance);
|
ActorAccessibility_SetSoundPos(this, 0, &terrainProjectedPos, xzDistToPlayer, actor->policy.distance);
|
||||||
ActorAccessibility_SetSoundPitch(this, 0, currentPitch);
|
ActorAccessibility_SetSoundPitch(this, 0, currentPitch);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -84,16 +84,13 @@ class TerrainCueSound {
|
||||||
restFrames = 0;
|
restFrames = 0;
|
||||||
xzDistToPlayer = 0;
|
xzDistToPlayer = 0;
|
||||||
currentSFX = 0;
|
currentSFX = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
virtual ~TerrainCueSound() {
|
virtual ~TerrainCueSound() {
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
}
|
}
|
||||||
void update(Vec3f& pos) {
|
void update(Vec3f& pos) {
|
||||||
updatePositions(pos);
|
updatePositions(pos);
|
||||||
run();
|
run();
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
class Incline : protected TerrainCueSound {
|
class Incline : protected TerrainCueSound {
|
||||||
|
@ -117,7 +114,7 @@ class Incline : protected TerrainCueSound {
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ActorAccessibility_SetSoundPitch(this, 0, 0.5 + (1-pitchModifier));
|
ActorAccessibility_SetSoundPitch(this, 0, 0.5 + (1 - pitchModifier));
|
||||||
/*currentPitch += 0.1;
|
/*currentPitch += 0.1;
|
||||||
if (currentPitch >= 2.0) {
|
if (currentPitch >= 2.0) {
|
||||||
stop();
|
stop();
|
||||||
|
@ -125,10 +122,8 @@ class Incline : protected TerrainCueSound {
|
||||||
restFrames = 5;
|
restFrames = 5;
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
void setPitchModifier(float modifier)
|
void setPitchModifier(float modifier) {
|
||||||
{
|
|
||||||
pitchModifier = modifier;
|
pitchModifier = modifier;
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -162,15 +157,12 @@ class Decline : protected TerrainCueSound {
|
||||||
restFrames = 5;
|
restFrames = 5;
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
void setPitchModifier(float mod)
|
void setPitchModifier(float mod) {
|
||||||
{
|
|
||||||
pitchModifier = mod;
|
pitchModifier = mod;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
};
|
class Ledge : protected TerrainCueSound {
|
||||||
class Ledge :protected TerrainCueSound {
|
s8 savedType; // Distinguishes between a ledge link can fall from and one he can climb up.
|
||||||
s8 savedType;//Distinguishes between a ledge link can fall from and one he can climb up.
|
|
||||||
Vec3s probeRot;
|
Vec3s probeRot;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -209,47 +201,37 @@ class Ledge :protected TerrainCueSound {
|
||||||
}
|
}
|
||||||
|
|
||||||
play();
|
play();
|
||||||
|
|
||||||
}
|
}
|
||||||
virtual ~Ledge() {
|
virtual ~Ledge() {
|
||||||
|
|
||||||
}
|
}
|
||||||
s8 type() {
|
s8 type() {
|
||||||
return savedType;
|
return savedType;
|
||||||
|
|
||||||
}
|
}
|
||||||
void run() {
|
void run() {
|
||||||
if (savedType==0)
|
if (savedType == 0)
|
||||||
return;//Downward ledges play a looping sound and do not need ongoing maintenance.
|
return; // Downward ledges play a looping sound and do not need ongoing maintenance.
|
||||||
if (restFrames == 0)
|
if (restFrames == 0) {
|
||||||
{
|
|
||||||
play();
|
play();
|
||||||
restFrames = 10;
|
restFrames = 10;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
restFrames--;
|
restFrames--;
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
class Platform: protected TerrainCueSound {
|
class Platform : protected TerrainCueSound {
|
||||||
public:
|
public:
|
||||||
Platform(AccessibleActor* actor, Vec3f pos) : TerrainCueSound(actor, pos) {
|
Platform(AccessibleActor* actor, Vec3f pos) : TerrainCueSound(actor, pos) {
|
||||||
currentPitch = 2.0;
|
currentPitch = 2.0;
|
||||||
//actor->policy.volume = 1.5;
|
// actor->policy.volume = 1.5;
|
||||||
currentSFX = NA_SE_IT_SHIELD_REFLECT_SW;
|
currentSFX = NA_SE_IT_SHIELD_REFLECT_SW;
|
||||||
shouldLoop = false;
|
shouldLoop = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
virtual ~Platform() {
|
virtual ~Platform() {
|
||||||
}
|
}
|
||||||
void setActor(AccessibleActor* actor)
|
void setActor(AccessibleActor* actor) {
|
||||||
{
|
|
||||||
this->actor = actor;
|
this->actor = actor;
|
||||||
|
|
||||||
}
|
}
|
||||||
void setPosition(Vec3f& pos)
|
void setPosition(Vec3f& pos) {
|
||||||
{
|
|
||||||
updatePositions(pos);
|
updatePositions(pos);
|
||||||
}
|
}
|
||||||
void run() {
|
void run() {
|
||||||
|
@ -262,16 +244,17 @@ class Platform: protected TerrainCueSound {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Wall: protected TerrainCueSound {
|
class Wall : protected TerrainCueSound {
|
||||||
int frames;
|
int frames;
|
||||||
Vec3s probeRot;
|
Vec3s probeRot;
|
||||||
f32 targetPitch;
|
f32 targetPitch;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Wall(AccessibleActor* actor, Vec3f pos, Vec3s rot) : TerrainCueSound(actor, pos) {
|
Wall(AccessibleActor* actor, Vec3f pos, Vec3s rot) : TerrainCueSound(actor, pos) {
|
||||||
probeRot = rot;
|
probeRot = rot;
|
||||||
currentPitch = 0.5;
|
currentPitch = 0.5;
|
||||||
|
|
||||||
targetPitch = (f32) probeRot.y / (16384.0f * 2.0f);
|
targetPitch = (f32)probeRot.y / (16384.0f * 2.0f);
|
||||||
if (probeRot.y != 0 && targetPitch < -0.4)
|
if (probeRot.y != 0 && targetPitch < -0.4)
|
||||||
targetPitch = -0.4;
|
targetPitch = -0.4;
|
||||||
|
|
||||||
|
@ -341,6 +324,7 @@ class Water : protected TerrainCueSound {
|
||||||
|
|
||||||
class Ground : protected TerrainCueSound {
|
class Ground : protected TerrainCueSound {
|
||||||
float pitchModifier;
|
float pitchModifier;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Ground(AccessibleActor* actor, Vec3f pos, float pitchModifier) : TerrainCueSound(actor, pos) {
|
Ground(AccessibleActor* actor, Vec3f pos, float pitchModifier) : TerrainCueSound(actor, pos) {
|
||||||
currentPitch = 1.0;
|
currentPitch = 1.0;
|
||||||
|
@ -356,7 +340,7 @@ class Ground : protected TerrainCueSound {
|
||||||
restFrames = 10;
|
restFrames = 10;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ActorAccessibility_SetSoundPitch(this, 0, 1.0 + (2*pitchModifier));
|
ActorAccessibility_SetSoundPitch(this, 0, 1.0 + (2 * pitchModifier));
|
||||||
restFrames--;
|
restFrames--;
|
||||||
}
|
}
|
||||||
void setPitchModifier(float modifier) {
|
void setPitchModifier(float modifier) {
|
||||||
|
@ -368,7 +352,7 @@ class Lava : protected TerrainCueSound {
|
||||||
public:
|
public:
|
||||||
Lava(AccessibleActor* actor, Vec3f pos) : TerrainCueSound(actor, pos) {
|
Lava(AccessibleActor* actor, Vec3f pos) : TerrainCueSound(actor, pos) {
|
||||||
currentPitch = 1.0;
|
currentPitch = 1.0;
|
||||||
currentSFX = NA_SE_SY_WARNING_COUNT_N; //change?
|
currentSFX = NA_SE_SY_WARNING_COUNT_N; // change?
|
||||||
play();
|
play();
|
||||||
}
|
}
|
||||||
virtual ~Lava() {
|
virtual ~Lava() {
|
||||||
|
@ -383,9 +367,10 @@ class Lava : protected TerrainCueSound {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class TerrainCueDirection {
|
class TerrainCueDirection {
|
||||||
AccessibleActor* actor;
|
AccessibleActor* actor;
|
||||||
int startingBodyPart;//Decides where the probe starts from. Probes going out to the left or right of the player start from the shoulders.
|
int startingBodyPart; // Decides where the probe starts from. Probes going out to the left or right of the player
|
||||||
|
// start from the shoulders.
|
||||||
Vec3f pos;
|
Vec3f pos;
|
||||||
Vec3f prevPos;
|
Vec3f prevPos;
|
||||||
Vec3s relRot; // Relative angle.
|
Vec3s relRot; // Relative angle.
|
||||||
|
@ -484,8 +469,7 @@ class Lava : protected TerrainCueSound {
|
||||||
|
|
||||||
void discoverWall(Vec3f pos) {
|
void discoverWall(Vec3f pos) {
|
||||||
Player* player = GET_PLAYER(actor->play);
|
Player* player = GET_PLAYER(actor->play);
|
||||||
if (player->stateFlags1 & PLAYER_STATE1_FIRST_PERSON)
|
if (player->stateFlags1 & PLAYER_STATE1_FIRST_PERSON) {
|
||||||
{
|
|
||||||
if (terrainDiscovered == DISCOVERED_WALL)
|
if (terrainDiscovered == DISCOVERED_WALL)
|
||||||
destroyCurrentSound();
|
destroyCurrentSound();
|
||||||
return;
|
return;
|
||||||
|
@ -658,7 +642,6 @@ class Lava : protected TerrainCueSound {
|
||||||
move(false);
|
move(false);
|
||||||
move(false);
|
move(false);
|
||||||
|
|
||||||
|
|
||||||
rot = ogRot;
|
rot = ogRot;
|
||||||
rot.y += 16384;
|
rot.y += 16384;
|
||||||
rot.y += 16384;
|
rot.y += 16384;
|
||||||
|
@ -688,7 +671,7 @@ class Lava : protected TerrainCueSound {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
wallPoly = checkWall(pos, prevPos, wallPos);
|
wallPoly = checkWall(pos, prevPos, wallPos);
|
||||||
if (wallPoly == NULL || rdist(pos)>200) {
|
if (wallPoly == NULL || rdist(pos) > 200) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -807,7 +790,6 @@ class Lava : protected TerrainCueSound {
|
||||||
return false; // Out of bounds.
|
return false; // Out of bounds.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool isHeadOnCollision(Vec3f& wallPos, Vec3f& velocity) {
|
bool isHeadOnCollision(Vec3f& wallPos, Vec3f& velocity) {
|
||||||
|
@ -845,7 +827,7 @@ class Lava : protected TerrainCueSound {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
s8 floorparam = func_80041D4C(colCtx, floorpoly, BG_ACTOR_MAX);
|
s8 floorparam = func_80041D4C(colCtx, floorpoly, BG_ACTOR_MAX);
|
||||||
if (floorparam == 2 || floorparam ==3) {
|
if (floorparam == 2 || floorparam == 3) {
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -881,13 +863,12 @@ class Lava : protected TerrainCueSound {
|
||||||
rot = ActorAccessibility_ComputeRelativeAngle(&player->actor.world.rot, &relRot);
|
rot = ActorAccessibility_ComputeRelativeAngle(&player->actor.world.rot, &relRot);
|
||||||
pushedSpeed = 0.0;
|
pushedSpeed = 0.0;
|
||||||
pushedYaw = 0;
|
pushedYaw = 0;
|
||||||
probeSpeed = DEFAULT_PROBE_SPEED;//Experiment with this.
|
probeSpeed = DEFAULT_PROBE_SPEED; // Experiment with this.
|
||||||
// Draw a line from Link's position to the max detection distance based on the configured relative angle.
|
// Draw a line from Link's position to the max detection distance based on the configured relative angle.
|
||||||
if (!trackingModeStarted) {
|
if (!trackingModeStarted) {
|
||||||
pos = player->actor.world.pos;
|
pos = player->actor.world.pos;
|
||||||
//If a starting body part has been specified, then set the probe's initial X and Z position only.
|
// If a starting body part has been specified, then set the probe's initial X and Z position only.
|
||||||
if (startingBodyPart != PLAYER_BODYPART_MAX)
|
if (startingBodyPart != PLAYER_BODYPART_MAX) {
|
||||||
{
|
|
||||||
pos.x = player->bodyPartsPos[startingBodyPart].x;
|
pos.x = player->bodyPartsPos[startingBodyPart].x;
|
||||||
pos.z = player->bodyPartsPos[startingBodyPart].y;
|
pos.z = player->bodyPartsPos[startingBodyPart].y;
|
||||||
}
|
}
|
||||||
|
@ -901,7 +882,8 @@ class Lava : protected TerrainCueSound {
|
||||||
distToTravel = 1.0;
|
distToTravel = 1.0;
|
||||||
Vec3f collisionResult;
|
Vec3f collisionResult;
|
||||||
s32 bgId = 0;
|
s32 bgId = 0;
|
||||||
//Don't be fooled: link being in the air does not mean we've found a dropoff. I mean... it could mean that, but it's a little too late to do anything about it at that point anyway.
|
// Don't be fooled: link being in the air does not mean we've found a dropoff. I mean... it could mean that, but
|
||||||
|
// it's a little too late to do anything about it at that point anyway.
|
||||||
|
|
||||||
if (player->stateFlags3 & PLAYER_STATE3_MIDAIR || player->stateFlags2 & PLAYER_STATE2_HOPPING) {
|
if (player->stateFlags3 & PLAYER_STATE3_MIDAIR || player->stateFlags2 & PLAYER_STATE2_HOPPING) {
|
||||||
f32 floorHeight = 0;
|
f32 floorHeight = 0;
|
||||||
|
@ -918,7 +900,7 @@ class Lava : protected TerrainCueSound {
|
||||||
setVelocity();
|
setVelocity();
|
||||||
f32 step = fabs(velocity.x + velocity.z);
|
f32 step = fabs(velocity.x + velocity.z);
|
||||||
distToTravel -= (step + fabs(pos.y - pos.y));
|
distToTravel -= (step + fabs(pos.y - pos.y));
|
||||||
//checks if link is in the water, needs different logic
|
// checks if link is in the water, needs different logic
|
||||||
if (player->stateFlags1 & PLAYER_STATE1_IN_WATER) {
|
if (player->stateFlags1 & PLAYER_STATE1_IN_WATER) {
|
||||||
pos.y = player->actor.prevPos.y;
|
pos.y = player->actor.prevPos.y;
|
||||||
if (!move()) {
|
if (!move()) {
|
||||||
|
@ -934,7 +916,7 @@ class Lava : protected TerrainCueSound {
|
||||||
discoverIncline(pos);
|
discoverIncline(pos);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//keeps probe at links feet
|
// keeps probe at links feet
|
||||||
if (pos.y < player->actor.world.pos.y) {
|
if (pos.y < player->actor.world.pos.y) {
|
||||||
pos.y = player->actor.world.pos.y;
|
pos.y = player->actor.world.pos.y;
|
||||||
}
|
}
|
||||||
|
@ -945,21 +927,20 @@ class Lava : protected TerrainCueSound {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//sets probe to be at surface of water
|
// sets probe to be at surface of water
|
||||||
pos.y += player->actor.yDistToWater;
|
pos.y += player->actor.yDistToWater;
|
||||||
prevPos.y += player->actor.yDistToWater;
|
prevPos.y += player->actor.yDistToWater;
|
||||||
|
|
||||||
//checks for new wall poly
|
// checks for new wall poly
|
||||||
wallPoly = checkWall(pos, prevPos, wallPos);
|
wallPoly = checkWall(pos, prevPos, wallPos);
|
||||||
|
|
||||||
|
// if not climable and exists then treats it as a wall
|
||||||
//if not climable and exists then treats it as a wall
|
|
||||||
if (wallPoly != NULL) {
|
if (wallPoly != NULL) {
|
||||||
discoverWall(pos);
|
discoverWall(pos);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//checks for ledges
|
// checks for ledges
|
||||||
pos.y = player->actor.world.pos.y - 10.0;
|
pos.y = player->actor.world.pos.y - 10.0;
|
||||||
f32 ogStep = step;
|
f32 ogStep = step;
|
||||||
step = 1.0;
|
step = 1.0;
|
||||||
|
@ -997,7 +978,8 @@ class Lava : protected TerrainCueSound {
|
||||||
rot.y = ogRot.y;
|
rot.y = ogRot.y;
|
||||||
pos = ogPos;
|
pos = ogPos;
|
||||||
|
|
||||||
if (clockwiseTest && counterclockwiseTest && (forwardTest || wallHeight < 44.0) && wallHeight < 48 && //probably have to change for adult
|
if (clockwiseTest && counterclockwiseTest && (forwardTest || wallHeight < 44.0) &&
|
||||||
|
wallHeight < 48 && // probably have to change for adult
|
||||||
(fabs(clockwiseY - counterclockwiseY) < 2.0 ||
|
(fabs(clockwiseY - counterclockwiseY) < 2.0 ||
|
||||||
fabs(clockwiseY - counterclockwiseY) > wallHeight - 5.0)) {
|
fabs(clockwiseY - counterclockwiseY) > wallHeight - 5.0)) {
|
||||||
discoverLedge(pos, true);
|
discoverLedge(pos, true);
|
||||||
|
@ -1006,28 +988,28 @@ class Lava : protected TerrainCueSound {
|
||||||
discoverWall(pos);
|
discoverWall(pos);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//link is climbing
|
// link is climbing
|
||||||
} else if (player->stateFlags1 == PLAYER_STATE1_CLIMBING_LADDER) {
|
} else if (player->stateFlags1 == PLAYER_STATE1_CLIMBING_LADDER) {
|
||||||
f32 playerHeight = BgCheck_EntityRaycastFloor3(&actor->play->colCtx, &floorPoly, &floorBgId, &player->actor.world.pos);
|
f32 playerHeight =
|
||||||
|
BgCheck_EntityRaycastFloor3(&actor->play->colCtx, &floorPoly, &floorBgId, &player->actor.world.pos);
|
||||||
f32 floorHeight;
|
f32 floorHeight;
|
||||||
s8 moveMethod = false;
|
s8 moveMethod = false;
|
||||||
Vec3s_ ogRot = rot;
|
Vec3s_ ogRot = rot;
|
||||||
setVelocity();
|
setVelocity();
|
||||||
|
|
||||||
if (ogRot.y == player->actor.world.rot.y) {
|
if (ogRot.y == player->actor.world.rot.y) {
|
||||||
//sets forward probe to look above link
|
// sets forward probe to look above link
|
||||||
moveMethod = 2;
|
moveMethod = 2;
|
||||||
|
|
||||||
}
|
}
|
||||||
player->actor.world.rot.y = player->actor.shape.rot.y;//corrects links rotation
|
player->actor.world.rot.y = player->actor.shape.rot.y; // corrects links rotation
|
||||||
|
|
||||||
if (!move(moveMethod)) {
|
if (!move(moveMethod)) {
|
||||||
destroyCurrentSound();
|
destroyCurrentSound();
|
||||||
|
|
||||||
break; // Probe is out of bounds.
|
break; // Probe is out of bounds.
|
||||||
}
|
}
|
||||||
//this following bit checks the wall poly and for now just checks if it has a drop off below it
|
// this following bit checks the wall poly and for now just checks if it has a drop off below it
|
||||||
//or if it is the forward probe, checks if the vine ends otherwise it continues
|
// or if it is the forward probe, checks if the vine ends otherwise it continues
|
||||||
Vec3f wallPos;
|
Vec3f wallPos;
|
||||||
CollisionPoly* wallPoly = checkWall(pos, prevPos, wallPos);
|
CollisionPoly* wallPoly = checkWall(pos, prevPos, wallPos);
|
||||||
|
|
||||||
|
@ -1046,14 +1028,14 @@ class Lava : protected TerrainCueSound {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (moveMethod != 2 && checkVinePlatform(pos, ogRot, playerHeight)){
|
if (moveMethod != 2 && checkVinePlatform(pos, ogRot, playerHeight)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//this means that either the wall poly found above is not a vine or is NULL
|
// this means that either the wall poly found above is not a vine or is NULL
|
||||||
//the next three secections check infront and behind the probe for wall polys
|
// the next three secections check infront and behind the probe for wall polys
|
||||||
//
|
//
|
||||||
if (moveMethod != 2) {
|
if (moveMethod != 2) {
|
||||||
prevPos = pos;
|
prevPos = pos;
|
||||||
|
@ -1127,7 +1109,7 @@ class Lava : protected TerrainCueSound {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//this means no wall polys were found, first we check for ceilng poly
|
// this means no wall polys were found, first we check for ceilng poly
|
||||||
if (moveMethod == 2) {
|
if (moveMethod == 2) {
|
||||||
rot.y = player->actor.shape.rot.y;
|
rot.y = player->actor.shape.rot.y;
|
||||||
rot.y += 16384;
|
rot.y += 16384;
|
||||||
|
@ -1139,7 +1121,7 @@ class Lava : protected TerrainCueSound {
|
||||||
break; // Probe is out of bounds.
|
break; // Probe is out of bounds.
|
||||||
}
|
}
|
||||||
prevPos = pos;
|
prevPos = pos;
|
||||||
//pos.y += 200;
|
// pos.y += 200;
|
||||||
f32 checkHeight = fabs(player->actor.world.pos.y - pos.y);
|
f32 checkHeight = fabs(player->actor.world.pos.y - pos.y);
|
||||||
f32 ceilingPos;
|
f32 ceilingPos;
|
||||||
if (BgCheck_AnyCheckCeiling(&actor->play->colCtx, &ceilingPos, &player->actor.world.pos,
|
if (BgCheck_AnyCheckCeiling(&actor->play->colCtx, &ceilingPos, &player->actor.world.pos,
|
||||||
|
@ -1150,7 +1132,6 @@ class Lava : protected TerrainCueSound {
|
||||||
discoverWall(pos);
|
discoverWall(pos);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
destroyCurrentSound();
|
destroyCurrentSound();
|
||||||
break; /*else {
|
break; /*else {
|
||||||
|
@ -1158,8 +1139,7 @@ class Lava : protected TerrainCueSound {
|
||||||
discoverLedge(pos, true);
|
discoverLedge(pos, true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}*///not needed?
|
}*/ // not needed?
|
||||||
|
|
||||||
}
|
}
|
||||||
if (moveMethod != 2 && checkPerpendicularWall(pos, ogRot)) {
|
if (moveMethod != 2 && checkPerpendicularWall(pos, ogRot)) {
|
||||||
discoverWall(pos);
|
discoverWall(pos);
|
||||||
|
@ -1182,7 +1162,6 @@ class Lava : protected TerrainCueSound {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// link is on land
|
// link is on land
|
||||||
else {
|
else {
|
||||||
|
|
||||||
|
@ -1191,7 +1170,6 @@ class Lava : protected TerrainCueSound {
|
||||||
break; // Probe is out of bounds.
|
break; // Probe is out of bounds.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (isPushedAway() && player->stateFlags1 != PLAYER_STATE1_CLIMBING_LADDER) {
|
if (isPushedAway() && player->stateFlags1 != PLAYER_STATE1_CLIMBING_LADDER) {
|
||||||
// Call this a wall for now.
|
// Call this a wall for now.
|
||||||
discoverWall(pos);
|
discoverWall(pos);
|
||||||
|
@ -1203,12 +1181,11 @@ class Lava : protected TerrainCueSound {
|
||||||
// This is a fall.
|
// This is a fall.
|
||||||
|
|
||||||
bool foundLiquid = false;
|
bool foundLiquid = false;
|
||||||
if (((pos.y - player->actor.prevPos.y) < player->actor.yDistToWater-30) &&
|
if (((pos.y - player->actor.prevPos.y) < player->actor.yDistToWater - 30) &&
|
||||||
(player->actor.yDistToWater < 0)) {
|
(player->actor.yDistToWater < 0)) {
|
||||||
discoverLedge(pos, 2);
|
discoverLedge(pos, 2);
|
||||||
foundLiquid = true;
|
foundLiquid = true;
|
||||||
}
|
} else if (rdist(pos) < 100.0) {
|
||||||
else if (rdist(pos) < 100.0) {
|
|
||||||
s8 i = 50;
|
s8 i = 50;
|
||||||
Vec3f_ oldPos = pos;
|
Vec3f_ oldPos = pos;
|
||||||
while (i > 0) {
|
while (i > 0) {
|
||||||
|
@ -1231,7 +1208,7 @@ class Lava : protected TerrainCueSound {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//checks for water
|
// checks for water
|
||||||
if (((pos.y - player->actor.prevPos.y) < player->actor.yDistToWater) &&
|
if (((pos.y - player->actor.prevPos.y) < player->actor.yDistToWater) &&
|
||||||
(player->actor.yDistToWater < 0 && player->stateFlags1 != PLAYER_STATE1_CLIMBING_LADDER)) {
|
(player->actor.yDistToWater < 0 && player->stateFlags1 != PLAYER_STATE1_CLIMBING_LADDER)) {
|
||||||
discoverWater(pos);
|
discoverWater(pos);
|
||||||
|
@ -1243,7 +1220,6 @@ class Lava : protected TerrainCueSound {
|
||||||
discoverLedge(pos);
|
discoverLedge(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (pos.y > prevPos.y && fabs(pos.y - prevPos.y) < 20 && fabs(pos.y - prevPos.y) > 1.2 &&
|
if (pos.y > prevPos.y && fabs(pos.y - prevPos.y) < 20 && fabs(pos.y - prevPos.y) > 1.2 &&
|
||||||
player->stateFlags1 != PLAYER_STATE1_CLIMBING_LADDER) {
|
player->stateFlags1 != PLAYER_STATE1_CLIMBING_LADDER) {
|
||||||
// This is an incline.
|
// This is an incline.
|
||||||
|
@ -1259,7 +1235,7 @@ class Lava : protected TerrainCueSound {
|
||||||
player->stateFlags1 != PLAYER_STATE1_CLIMBING_LADDER)) {
|
player->stateFlags1 != PLAYER_STATE1_CLIMBING_LADDER)) {
|
||||||
prevPos = pos;
|
prevPos = pos;
|
||||||
if (!move()) {
|
if (!move()) {
|
||||||
//destroyCurrentSound();
|
// destroyCurrentSound();
|
||||||
break; // Probe is out of bounds.
|
break; // Probe is out of bounds.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1283,7 +1259,7 @@ class Lava : protected TerrainCueSound {
|
||||||
player->stateFlags1 != PLAYER_STATE1_CLIMBING_LADDER)) {
|
player->stateFlags1 != PLAYER_STATE1_CLIMBING_LADDER)) {
|
||||||
prevPos = pos;
|
prevPos = pos;
|
||||||
if (!move()) {
|
if (!move()) {
|
||||||
//destroyCurrentSound();
|
// destroyCurrentSound();
|
||||||
break; // Probe is out of bounds.
|
break; // Probe is out of bounds.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1334,8 +1310,6 @@ class Lava : protected TerrainCueSound {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
else {
|
else {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1344,25 +1318,20 @@ class Lava : protected TerrainCueSound {
|
||||||
discoverWall(pos);
|
discoverWall(pos);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (trackingMode)
|
if (trackingMode)
|
||||||
player->actor.world.pos = pos;
|
player->actor.world.pos = pos;
|
||||||
//Emit sound from the discovered position.
|
// Emit sound from the discovered position.
|
||||||
if (currentSound)
|
if (currentSound)
|
||||||
currentSound->update(pos);
|
currentSound->update(pos);
|
||||||
if (currentSound && trackingMode) {
|
if (currentSound && trackingMode) {
|
||||||
disabled = true;
|
disabled = true;
|
||||||
trackingMode = false;
|
trackingMode = false;
|
||||||
trackingModeStarted = false;
|
trackingModeStarted = false;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
void testForPlatform()
|
}
|
||||||
{
|
void testForPlatform() {
|
||||||
Player* player = GET_PLAYER(actor->play);
|
Player* player = GET_PLAYER(actor->play);
|
||||||
|
|
||||||
f32 ledgeCheckDistance = 200.0;
|
f32 ledgeCheckDistance = 200.0;
|
||||||
|
@ -1386,45 +1355,40 @@ trackingModeStarted = false;
|
||||||
}
|
}
|
||||||
pos = startingPos;
|
pos = startingPos;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
TerrainCueDirection directions[3]; // Directly ahead of Link, 90 degrees to his left and 90 degrees to his right.
|
TerrainCueDirection directions[3]; // Directly ahead of Link, 90 degrees to his left and 90 degrees to his right.
|
||||||
int previousAction; //previous action icon state
|
int previousAction; // previous action icon state
|
||||||
}TerrainCueState;
|
} TerrainCueState;
|
||||||
|
|
||||||
//Callback for initialization of terrain cue state.
|
// Callback for initialization of terrain cue state.
|
||||||
bool ActorAccessibility_InitTerrainCueState(AccessibleActor* actor) {
|
bool ActorAccessibility_InitTerrainCueState(AccessibleActor* actor) {
|
||||||
TerrainCueState* state = (TerrainCueState*) malloc(sizeof(TerrainCueState));
|
TerrainCueState* state = (TerrainCueState*)malloc(sizeof(TerrainCueState));
|
||||||
if (state == NULL)
|
if (state == NULL)
|
||||||
return false;
|
return false;
|
||||||
state->directions[0].init(actor, { 0, 0, 0 });
|
state->directions[0].init(actor, { 0, 0, 0 });
|
||||||
state->directions[1].init(actor, { 0, 16384, 0 });//, PLAYER_BODYPART_L_SHOULDER);
|
state->directions[1].init(actor, { 0, 16384, 0 }); //, PLAYER_BODYPART_L_SHOULDER);
|
||||||
state->directions[2].init(actor, { 0, -16384, 0 });//, PLAYER_BODYPART_R_SHOULDER);
|
state->directions[2].init(actor, { 0, -16384, 0 }); //, PLAYER_BODYPART_R_SHOULDER);
|
||||||
state->previousAction = DO_ACTION_NONE;
|
state->previousAction = DO_ACTION_NONE;
|
||||||
|
|
||||||
actor->userData = state;
|
actor->userData = state;
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
void ActorAccessibility_CleanupTerrainCueState(AccessibleActor* actor) {
|
void ActorAccessibility_CleanupTerrainCueState(AccessibleActor* actor) {
|
||||||
free(actor->userData);
|
free(actor->userData);
|
||||||
actor->userData = NULL;
|
actor->userData = NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
//Computes a relative angle based on Link's (or some other actor's) current angle.
|
// Computes a relative angle based on Link's (or some other actor's) current angle.
|
||||||
Vec3s ActorAccessibility_ComputeRelativeAngle(Vec3s* origin, Vec3s* offset) {
|
Vec3s ActorAccessibility_ComputeRelativeAngle(Vec3s* origin, Vec3s* offset) {
|
||||||
Vec3s rot = *origin;
|
Vec3s rot = *origin;
|
||||||
rot.x += offset->x;
|
rot.x += offset->x;
|
||||||
rot.y += offset->y;
|
rot.y += offset->y;
|
||||||
rot.z += offset->z;
|
rot.z += offset->z;
|
||||||
return rot;
|
return rot;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void accessible_va_terrain_cue(AccessibleActor* actor) {
|
||||||
void accessible_va_terrain_cue(AccessibleActor * actor) {
|
|
||||||
TerrainCueState* state = (TerrainCueState*)actor->userData;
|
TerrainCueState* state = (TerrainCueState*)actor->userData;
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
|
@ -1434,7 +1398,7 @@ void accessible_va_terrain_cue(AccessibleActor * actor) {
|
||||||
Player* player = GET_PLAYER(actor->play);
|
Player* player = GET_PLAYER(actor->play);
|
||||||
|
|
||||||
if (state->previousAction != currentState) {
|
if (state->previousAction != currentState) {
|
||||||
//Audio_PlaySoundGeneral(NA_SE_EV_DIAMOND_SWITCH, &player->actor.world.pos, 4, &actor->basePitch,
|
// Audio_PlaySoundGeneral(NA_SE_EV_DIAMOND_SWITCH, &player->actor.world.pos, 4, &actor->basePitch,
|
||||||
// &actor->baseVolume,
|
// &actor->baseVolume,
|
||||||
// &actor->currentReverb);
|
// &actor->currentReverb);
|
||||||
switch (currentState) {
|
switch (currentState) {
|
||||||
|
@ -1457,60 +1421,57 @@ void accessible_va_terrain_cue(AccessibleActor * actor) {
|
||||||
SpeechSynthesizer::Instance->Speak("Speak", GetLanguageCode());
|
SpeechSynthesizer::Instance->Speak("Speak", GetLanguageCode());
|
||||||
break;
|
break;
|
||||||
case DO_ACTION_STOP:
|
case DO_ACTION_STOP:
|
||||||
SpeechSynthesizer::Instance->Speak("Stop", GetLanguageCode()); // possibly disable? not sure what it does
|
SpeechSynthesizer::Instance->Speak("Stop",
|
||||||
|
GetLanguageCode()); // possibly disable? not sure what it does
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
SpeechSynthesizer::Instance->Speak(" ", GetLanguageCode());
|
SpeechSynthesizer::Instance->Speak(" ", GetLanguageCode());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
state->previousAction = currentState;
|
state->previousAction = currentState;
|
||||||
} else {
|
} else {
|
||||||
state->previousAction = currentState;
|
state->previousAction = currentState;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
/*
|
|
||||||
void accessible_va_wall_cue(AccessibleActor* actor) {
|
void accessible_va_wall_cue(AccessibleActor* actor) {
|
||||||
Player* player = GET_PLAYER(actor->play);
|
Player* player = GET_PLAYER(actor->play);
|
||||||
//The virtual cue actors travel in lines relative to Link's angle.
|
//The virtual cue actors travel in lines relative to Link's angle.
|
||||||
Vec3s rot = computeRelativeAngle(player->actor.world.rot, actor->world.rot);
|
Vec3s rot = computeRelativeAngle(player->actor.world.rot, actor->world.rot);
|
||||||
Vec3f velocity;
|
Vec3f velocity;
|
||||||
velocity.x = Math_SinS(rot.y);
|
velocity.x = Math_SinS(rot.y);
|
||||||
velocity.z = Math_CosS(rot.y);
|
velocity.z = Math_CosS(rot.y);
|
||||||
//Draw a line from Link's position to the max detection distance based on the configured relative angle.
|
//Draw a line from Link's position to the max detection distance based on the configured relative angle.
|
||||||
Vec3f pos = player->actor.world.pos;
|
Vec3f pos = player->actor.world.pos;
|
||||||
Vec3f headPos = player->bodyPartsPos[PLAYER_BODYPART_TORSO];
|
Vec3f headPos = player->bodyPartsPos[PLAYER_BODYPART_TORSO];
|
||||||
f32 headDistY = headPos.y - pos.y;
|
f32 headDistY = headPos.y - pos.y;
|
||||||
|
|
||||||
f32 step = fabs(velocity.x + velocity.z);
|
f32 step = fabs(velocity.x + velocity.z);
|
||||||
f32 distToTravel = detectionDistance;
|
f32 distToTravel = detectionDistance;
|
||||||
CollisionPoly* poly = NULL;
|
CollisionPoly* poly = NULL;
|
||||||
Vec3f collisionResult;
|
Vec3f collisionResult;
|
||||||
s32 bgId = 0;
|
s32 bgId = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
Vec3f prevPos = pos;
|
Vec3f prevPos = pos;
|
||||||
Vec3f prevHeadPos = headPos;
|
Vec3f prevHeadPos = headPos;
|
||||||
|
|
||||||
pos.x += velocity.x;
|
pos.x += velocity.x;
|
||||||
pos.y += 1;
|
pos.y += 1;
|
||||||
pos.z += velocity.z;
|
pos.z += velocity.z;
|
||||||
headPos.x += velocity.x;
|
headPos.x += velocity.x;
|
||||||
headPos.y += 1;
|
headPos.y += 1;
|
||||||
headPos.z += velocity.z;
|
headPos.z += velocity.z;
|
||||||
|
|
||||||
distToTravel -= step;
|
distToTravel -= step;
|
||||||
f32 floorHeight = 0;
|
f32 floorHeight = 0;
|
||||||
CollisionPoly tempPoly;
|
CollisionPoly tempPoly;
|
||||||
floorHeight = BgCheck_AnyRaycastFloor1(&actor->play->colCtx, &tempPoly, &pos);
|
floorHeight = BgCheck_AnyRaycastFloor1(&actor->play->colCtx, &tempPoly, &pos);
|
||||||
pos.y = floorHeight;
|
pos.y = floorHeight;
|
||||||
headPos.y = floorHeight + headDistY;
|
headPos.y = floorHeight + headDistY;
|
||||||
|
|
||||||
if (BgCheck_AnyLineTest3(&actor->play->colCtx, &prevPos, &pos, &collisionResult, &poly, 1, 0, 0, 0, &bgId)) {
|
if (BgCheck_AnyLineTest3(&actor->play->colCtx, &prevPos, &pos, &collisionResult, &poly, 1, 0, 0, 0, &bgId)) {
|
||||||
s16 wallYaw = Math_Atan2S(poly->normal.z, poly->normal.x);
|
s16 wallYaw = Math_Atan2S(poly->normal.z, poly->normal.x);
|
||||||
CollisionPoly* headPoly = NULL;
|
CollisionPoly* headPoly = NULL;
|
||||||
|
|
||||||
|
@ -1521,38 +1482,33 @@ Vec3s rot = computeRelativeAngle(player->actor.world.rot, actor->world.rot);
|
||||||
|
|
||||||
poly = NULL;
|
poly = NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (distToTravel <= 0)
|
if (distToTravel <= 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
if (poly == NULL) {
|
if (poly == NULL) {
|
||||||
//Audio_StopSfxByPosAndId(&actor->world.pos, wallCueSound);
|
//Audio_StopSfxByPosAndId(&actor->world.pos, wallCueSound);
|
||||||
return; // Nothing found.
|
return; // Nothing found.
|
||||||
|
|
||||||
}
|
}
|
||||||
// Move the virtual actor to the position of the discovered wall so we can use preexisting sound
|
// Move the virtual actor to the position of the discovered wall so we can use preexisting sound
|
||||||
// logic.
|
// logic.
|
||||||
actor->world.pos = collisionResult;
|
actor->world.pos = collisionResult;
|
||||||
framesUntilCue--;
|
framesUntilCue--;
|
||||||
if (framesUntilCue < 1) {
|
if (framesUntilCue < 1) {
|
||||||
framesUntilCue = 10;
|
framesUntilCue = 10;
|
||||||
ActorAccessibility_PlaySpecialSound(actor, wallCueSound);
|
ActorAccessibility_PlaySpecialSound(actor, wallCueSound);
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void ActorAccessibility_InitCues() {
|
void ActorAccessibility_InitCues() {
|
||||||
|
|
||||||
ActorAccessibilityPolicy policy;
|
ActorAccessibilityPolicy policy;
|
||||||
ActorAccessibility_InitPolicy(&policy, "Terrain cue helper", accessible_va_terrain_cue, 0);
|
ActorAccessibility_InitPolicy(&policy, "Terrain cue helper", accessible_va_terrain_cue, 0);
|
||||||
policy.n = 1;
|
policy.n = 1;
|
||||||
policy.runsAlways = true;
|
policy.runsAlways = true;
|
||||||
|
@ -1563,6 +1519,4 @@ ActorAccessibilityPolicy policy;
|
||||||
ActorAccessibility_AddSupportedActor(VA_TERRAIN_CUE, policy);
|
ActorAccessibility_AddSupportedActor(VA_TERRAIN_CUE, policy);
|
||||||
VirtualActorList* list = ActorAccessibility_GetVirtualActorList(EVERYWHERE, 0);
|
VirtualActorList* list = ActorAccessibility_GetVirtualActorList(EVERYWHERE, 0);
|
||||||
ActorAccessibility_AddVirtualActor(list, VA_TERRAIN_CUE, { { 0, 0, 0 }, { 0, 0, 0 } });
|
ActorAccessibility_AddVirtualActor(list, VA_TERRAIN_CUE, { { 0, 0, 0 }, { 0, 0, 0 } });
|
||||||
|
}
|
||||||
|
|
||||||
}
|
|
|
@ -274,7 +274,7 @@ OTRGlobals::OTRGlobals() {
|
||||||
if (std::filesystem::exists(ootPath)) {
|
if (std::filesystem::exists(ootPath)) {
|
||||||
OTRFiles.push_back(ootPath);
|
OTRFiles.push_back(ootPath);
|
||||||
}
|
}
|
||||||
std::string sohOtrPath = Ship::Context::GetPathRelativeToAppBundle("soh.otr");
|
std::string sohOtrPath = Ship::Context::GetPathRelativeToAppBundle("soh.o2r");
|
||||||
if (std::filesystem::exists(sohOtrPath)) {
|
if (std::filesystem::exists(sohOtrPath)) {
|
||||||
OTRFiles.push_back(sohOtrPath);
|
OTRFiles.push_back(sohOtrPath);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue