cleanup with lambdas & overloads

This commit is contained in:
Demur Rumed 2025-04-22 02:22:10 +00:00
parent 498a5d583a
commit 4e2f99721b
5 changed files with 181 additions and 208 deletions

View file

@ -41,69 +41,6 @@ typedef struct {
int framesUntilAboveChime;
} SwitchData;
// Begin actor-specific policy callbacks.
void accessible_en_ishi(AccessibleActor* actor) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_OCTAROCK_ROCK, false);
}
void accessible_en_bombiwa(AccessibleActor* actor) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_ROCK_BROKEN, false);
}
void accessible_en_hamishi(AccessibleActor* actor) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_IT_HAMMER_HIT, false);
}
void accessible_en_NPC_Gen(AccessibleActor* actor) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_VO_NB_LAUGH, false);
}
void accessible_en_chest(AccessibleActor* actor) {
Player* player = GET_PLAYER(actor->play);
EnBox* chest = (EnBox*)actor->actor;
if (chest->actionFunc != EnBox_WaitOpen)
return;
s32 treasureFlag = actor->actor->params & 0x1F;
s8 size;
if (chest->type <= 8 && chest->type >= 5) {
size = 15; // small
} else {
size = 30; // large
}
if (!(treasureFlag >= 20 && treasureFlag < 32)) {
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.
f32 leftAngle = actor->actor->world.rot.y - 16384;
f32 velocityXRight = Math_SinS(leftAngle);
f32 velocityZRight = Math_CosS(leftAngle);
f32 frontAngle = actor->actor->world.rot.y;
f32 velocityXFront = Math_SinS(frontAngle);
f32 velocityZFront = Math_CosS(frontAngle);
f32 xdist = (player->actor.world.pos.x - actor->actor->world.pos.x) * velocityXFront +
(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 +
(player->actor.world.pos.z - actor->actor->world.pos.z) * velocityZRight);
if ((xdist - size / 2) < 0) {
ActorAccessibility_SetSoundPitch(actor, 0, 0.5);
} else if ((xdist + size / 2) > 0 && zdist < size / 2 && xdist < 150.0) {
ActorAccessibility_PlaySoundForActor(actor, 1, NA_SE_EV_DIAMOND_SWITCH, false);
}
}
void accessible_en_gerudo(AccessibleActor* actor) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_VO_NB_LAUGH, false); // update sound for ones that detect you
}
void accessible_en_Sign(AccessibleActor* actor) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_IT_REFLECTION_WOOD, false);
}
void accessible_en_pickups(AccessibleActor* actor) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_NUTS_DAMAGE, false);
}
@ -172,7 +109,7 @@ void accessible_hasi(AccessibleActor* actor) {
}
bool accessible_switch_init(AccessibleActor* actor) {
SwitchData* data = (SwitchData*)malloc(sizeof(SwitchData));
if (data == NULL)
if (data == nullptr)
return false; // failure to allocate memory.
data->framesUntilAboveChime = 0;
actor->userData = (void*)data;
@ -415,16 +352,13 @@ void accessible_area_change(AccessibleActor* actor) {
}
void accessible_231_dekus(AccessibleActor* actor) {
if (actor->actor->params == 1) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_NUTS_FAINT, false);
ActorAccessibility_SetSoundPitch(actor, 0, 1.0);
}
if (actor->actor->params == 2) {
} else if (actor->actor->params == 2) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_NUTS_FAINT, false);
ActorAccessibility_SetSoundPitch(actor, 0, 0.5);
}
if (actor->actor->params == 3) {
} else if (actor->actor->params == 3) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EN_NUTS_FAINT, false);
ActorAccessibility_SetSoundPitch(actor, 0, 1.5);
} else {
@ -446,7 +380,7 @@ void accessible_climable(AccessibleActor* actor) {
if (actor->world.pos.y < waterLoc) {
actor->world.pos.y = waterLoc;
}
if (actor != NULL && actor->yDistToPlayer < 80)
if (actor != nullptr && actor->yDistToPlayer < 80)
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_PL_LAND_LADDER, false);
}
@ -544,23 +478,6 @@ void accessible_sticks(AccessibleActor* actor) {
}
}
void accessible_jabu_switch(AccessibleActor* actor) {
int type = actor->actor->params & 0xFF;
if (type == YELLOW_TALL_1 || type == YELLOW_TALL_2) {
actor->policy.aimAssist.isProvider = true;
}
}
void accessible_jabu_elevator(AccessibleActor* actor) {
if ((actor->actor->params & 0xFF) == 2 && actor->xzDistToPlayer > 50) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_PL_LAND_LADDER, false);
}
}
void accessible_graveyard_soil(AccessibleActor* actor) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_IT_WOODSTICK_BROKEN, false);
}
void accessible_cucco(AccessibleActor* actor) {
if (actor->actor->params == 14) {
@ -574,7 +491,7 @@ void accessible_cucco(AccessibleActor* actor) {
bool accessible_general_helper_init(AccessibleActor* actor) {
GeneralHelperData* data = (GeneralHelperData*)malloc(sizeof(GeneralHelperData));
if (data == NULL)
if (data == nullptr)
return false;
data->currentRoom = -1;
data->currentRoomClear = false;
@ -583,10 +500,12 @@ bool accessible_general_helper_init(AccessibleActor* actor) {
actor->userData = data;
return true;
}
void accessible_general_helper_cleanup(AccessibleActor* actor) {
free(actor->userData);
actor->userData = NULL;
actor->userData = nullptr;
}
void accessible_va_general_helper(AccessibleActor* actor) {
GeneralHelperData* data = (GeneralHelperData*)actor->userData;
if (data->currentScene == actor->play->sceneNum && data->currentRoom != actor->play->roomCtx.curRoom.num) {
@ -608,7 +527,7 @@ void accessible_va_general_helper(AccessibleActor* actor) {
}
bool accessible_audio_compass_init(AccessibleActor* actor) {
AudioCompassData* data = (AudioCompassData*)malloc(sizeof(AudioCompassData));
if (data == NULL)
if (data == nullptr)
return false;
data->linearVelocity = 0;
data->framesUntilChime = 0;
@ -652,10 +571,10 @@ void accessible_stick_warning(AccessibleActor* actor) {
void ActorAccessibility_InitActors() {
const int Npc_Frames = 35;
ActorAccessibilityPolicy policy;
ActorAccessibility_InitPolicy(&policy, "Rock", accessible_en_ishi, 0);
ActorAccessibility_InitPolicy(&policy, "Rock", NA_SE_EN_OCTAROCK_ROCK);
ActorAccessibility_AddSupportedActor(ACTOR_EN_ISHI, policy);
ActorAccessibility_InitPolicy(&policy, "Story NPCs", NULL, NA_SE_VO_NA_HELLO_0);
ActorAccessibility_InitPolicy(&policy, "Story NPCs", NA_SE_VO_NA_HELLO_0);
policy.englishName = "Mido";
policy.n = Npc_Frames;
policy.distance = 1000;
@ -682,18 +601,18 @@ void ActorAccessibility_InitActors() {
ActorAccessibility_AddSupportedActor(ACTOR_EN_DU, policy);
policy.englishName = "Owl";
ActorAccessibility_AddSupportedActor(ACTOR_EN_OWL, policy);
ActorAccessibility_InitPolicy(&policy, "Catching Guards", accessible_en_guard, 0);
ActorAccessibility_InitPolicy(&policy, "Catching Guards", accessible_en_guard);
policy.n = 10;
policy.distance = 500;
policy.ydist = 300;
ActorAccessibility_AddSupportedActor(ACTOR_EN_HEISHI1, policy);
ActorAccessibility_AddSupportedActor(ACTOR_EN_HEISHI3, policy);
ActorAccessibility_InitPolicy(&policy, "Passive Guards", NULL, NA_SE_IT_SWORD_IMPACT);
ActorAccessibility_InitPolicy(&policy, "Passive Guards", NA_SE_IT_SWORD_IMPACT);
ActorAccessibility_AddSupportedActor(ACTOR_EN_HEISHI2, policy);
ActorAccessibility_AddSupportedActor(ACTOR_EN_HEISHI4, policy);
ActorAccessibility_InitPolicy(&policy, "Shopkeepers", NULL, NA_SE_VO_NA_HELLO_1);
ActorAccessibility_InitPolicy(&policy, "Shopkeepers", NA_SE_VO_NA_HELLO_1);
policy.pitch = 0.6;
policy.n = 30;
policy.englishName = "Shooting Gallery Man";
@ -706,7 +625,7 @@ void ActorAccessibility_InitActors() {
ActorAccessibility_AddSupportedActor(ACTOR_EN_DS, policy);
// general NPCs
ActorAccessibility_InitPolicy(&policy, "Kokiri Child", accessible_en_NPC_Gen, 0);
ActorAccessibility_InitPolicy(&policy, "Kokiri Child", NA_SE_VO_NB_LAUGH);
policy.n = Npc_Frames;
policy.pitch = 1.1;
ActorAccessibility_AddSupportedActor(ACTOR_EN_KO, policy);
@ -742,28 +661,63 @@ void ActorAccessibility_InitActors() {
policy.pitch = 0.75;
ActorAccessibility_AddSupportedActor(ACTOR_EN_GS, policy);
ActorAccessibility_InitPolicy(&policy, "Dogs", accessible_en_dogs, 0);
ActorAccessibility_InitPolicy(&policy, "Dogs", accessible_en_dogs);
policy.n = 1;
ActorAccessibility_AddSupportedActor(ACTOR_EN_DOG, policy);
ActorAccessibility_InitPolicy(&policy, "Horses", NULL, NA_SE_EV_HORSE_NEIGH);
ActorAccessibility_InitPolicy(&policy, "Horses", NA_SE_EV_HORSE_NEIGH);
policy.n = 30;
ActorAccessibility_AddSupportedActor(ACTOR_EN_HORSE_NORMAL, policy);
ActorAccessibility_InitPolicy(&policy, "Cows", NULL, NA_SE_EV_COW_CRY_LV);
ActorAccessibility_InitPolicy(&policy, "Cows", NA_SE_EV_COW_CRY_LV);
policy.n = 30;
ActorAccessibility_AddSupportedActor(ACTOR_EN_COW, policy);
ActorAccessibility_InitPolicy(&policy, "Cuccos", accessible_cucco, 0);
ActorAccessibility_InitPolicy(&policy, "Cuccos", accessible_cucco);
ActorAccessibility_AddSupportedActor(ACTOR_EN_NIW, policy);
ActorAccessibility_InitPolicy(&policy, "Bush", NULL, NA_SE_PL_PULL_UP_PLANT);
ActorAccessibility_InitPolicy(&policy, "Bush", NA_SE_PL_PULL_UP_PLANT);
ActorAccessibility_AddSupportedActor(ACTOR_EN_KUSA, policy);
ActorAccessibility_InitPolicy(&policy, "Trees", NULL, NA_SE_EV_TREE_CUT);
ActorAccessibility_InitPolicy(&policy, "Trees", NA_SE_EV_TREE_CUT);
ActorAccessibility_AddSupportedActor(ACTOR_EN_WOOD02, policy);
ActorAccessibility_InitPolicy(&policy, "Chest", accessible_en_chest, 0);
ActorAccessibility_InitPolicy(&policy, "Chest", [](AccessibleActor* actor) {
Player* player = GET_PLAYER(actor->play);
EnBox* chest = (EnBox*)actor->actor;
if (chest->actionFunc != EnBox_WaitOpen)
return;
s32 treasureFlag = actor->actor->params & 0x1F;
s8 size;
if (chest->type <= 8 && chest->type >= 5) {
size = 15; // small
} else {
size = 30; // large
}
if (!(treasureFlag >= 20 && treasureFlag < 32)) {
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.
f32 leftAngle = actor->actor->world.rot.y - 16384;
f32 velocityXRight = Math_SinS(leftAngle);
f32 velocityZRight = Math_CosS(leftAngle);
f32 frontAngle = actor->actor->world.rot.y;
f32 velocityXFront = Math_SinS(frontAngle);
f32 velocityZFront = Math_CosS(frontAngle);
f32 xdist = (player->actor.world.pos.x - actor->actor->world.pos.x) * velocityXFront +
(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 +
(player->actor.world.pos.z - actor->actor->world.pos.z) * velocityZRight);
if ((xdist - size / 2) < 0) {
ActorAccessibility_SetSoundPitch(actor, 0, 0.5);
} else if ((xdist + size / 2) > 0 && zdist < size / 2 && xdist < 150.0) {
ActorAccessibility_PlaySoundForActor(actor, 1, NA_SE_EV_DIAMOND_SWITCH, false);
}
});
policy.pitch = 1.1;
policy.distance = 1000;
ActorAccessibility_AddSupportedActor(ACTOR_EN_BOX, policy);
ActorAccessibility_InitPolicy(&policy, "Sign", accessible_en_Sign, 0);
ActorAccessibility_InitPolicy(&policy, "Sign", NA_SE_IT_REFLECTION_WOOD);
policy.n = 40;
policy.pitch = 1.6;
policy.distance = 800;
@ -771,60 +725,61 @@ void ActorAccessibility_InitActors() {
// ACTOR_EN_A_OBJ has exactly the same configuration.
ActorAccessibility_AddSupportedActor(ACTOR_EN_A_OBJ, policy);
ActorAccessibility_InitPolicy(&policy, "Large Crate", NULL, NA_SE_EV_WOODBOX_BREAK);
ActorAccessibility_InitPolicy(&policy, "Large Crate", NA_SE_EV_WOODBOX_BREAK);
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_KIBAKO, policy);
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_KIBAKO2, policy);
ActorAccessibility_InitPolicy(&policy, "deku stick drops", accessible_sticks, 0);
ActorAccessibility_InitPolicy(&policy, "deku stick drops", accessible_sticks);
ActorAccessibility_AddSupportedActor(ACTOR_EN_DEKUBABA, policy);
ActorAccessibility_AddSupportedActor(ACTOR_EN_KAREBABA, policy);
ActorAccessibility_InitPolicy(&policy, "Owl", NULL, NA_SE_EN_OWL_FLUTTER);
ActorAccessibility_InitPolicy(&policy, "Owl", NA_SE_EN_OWL_FLUTTER);
ActorAccessibility_AddSupportedActor(ACTOR_EN_OWL, policy);
// will probably just get replaced with ghost actors anyways
// ActorAccessibility_AddSupporte dActor(ACTOR_EN_HOLL, "Room Changing Plane", NULL, 30, 500, 1.0, 1.0,
// ActorAccessibility_AddSupporte dActor(ACTOR_EN_HOLL, "Room Changing Plane", nullptr, 30, 500, 1.0, 1.0,
// NA_SE_EV_STONEDOOR_STOP /*NOT SURE YET*/);
ActorAccessibility_InitPolicy(&policy, "Ruto", NULL, NA_SE_VO_RT_LAUGH_0);
ActorAccessibility_InitPolicy(&policy, "Ruto", NA_SE_VO_RT_LAUGH_0);
policy.n = 40;
policy.pitch = 1.1;
ActorAccessibility_AddSupportedActor(ACTOR_EN_RU1, policy);
ActorAccessibility_InitPolicy(&policy, "Bean patch", NULL, NA_SE_EN_MUSI_SINK);
ActorAccessibility_InitPolicy(&policy, "Bean patch", NA_SE_EN_MUSI_SINK);
policy.n = 60;
policy.distance = 2400;
policy.pitch = 1.3;
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_BEAN, policy);
ActorAccessibility_InitPolicy(&policy, "GraveYard Digging spots", accessible_graveyard_soil, 0);
ActorAccessibility_InitPolicy(&policy, "Graveyard Digging Spot", NA_SE_IT_WOODSTICK_BROKEN);
ActorAccessibility_AddSupportedActor(ACTOR_EN_IT, policy);
ActorAccessibility_InitPolicy(&policy, "Collectible", accessible_en_pickups, 0);
ActorAccessibility_InitPolicy(&policy, "Collectible", accessible_en_pickups);
policy.n = 40;
policy.pitch = 1.4;
ActorAccessibility_AddSupportedActor(ACTOR_EN_ITEM00, policy);
ActorAccessibility_InitPolicy(&policy, "Gerudo Guard", accessible_en_gerudo, 0);
// TODO better gerudo guard logic
ActorAccessibility_InitPolicy(&policy, "Gerudo Guard", NA_SE_VO_NB_LAUGH);
policy.n = Npc_Frames;
policy.pitch = 1.1;
ActorAccessibility_AddSupportedActor(ACTOR_EN_GE1, policy);
ActorAccessibility_InitPolicy(&policy, "Brown Bombable Rock", accessible_en_bombiwa, 0);
policy.n = 30;
policy.pitch = 0.7;
ActorAccessibility_InitPolicy(&policy, "Boulder", NA_SE_EV_ROCK_BROKEN);
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_BOMBIWA, policy);
ActorAccessibility_InitPolicy(&policy, "Grotto Door", accessible_grotto, 0);
ActorAccessibility_InitPolicy(&policy, "Bronze Boulder", NA_SE_IT_HAMMER_HIT);
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_HAMISHI, policy);
ActorAccessibility_InitPolicy(&policy, "Grotto Door", accessible_grotto);
policy.n = 30;
policy.pitch = 1.0;
ActorAccessibility_AddSupportedActor(ACTOR_DOOR_ANA, policy);
ActorAccessibility_InitPolicy(&policy, "Web", NULL, NA_SE_EV_WEB_BROKEN);
ActorAccessibility_InitPolicy(&policy, "Web", NA_SE_EV_WEB_BROKEN);
policy.n = 40;
policy.ydist = 2000;
policy.distance = 2000;
policy.pitch = 1.2;
ActorAccessibility_AddSupportedActor(ACTOR_BG_YDAN_SP, policy);
ActorAccessibility_InitPolicy(&policy, "Shutter Door", accessible_door, 0);
ActorAccessibility_InitPolicy(&policy, "Shutter Door", accessible_door);
policy.n = 30;
policy.distance = 1000;
policy.pitch = 1.1;
ActorAccessibility_AddSupportedActor(ACTOR_DOOR_SHUTTER, policy);
ActorAccessibility_AddSupportedActor(ACTOR_BG_SPOT18_SHUTTER, policy);
ActorAccessibility_InitPolicy(&policy, "Switch", accessible_switch, 0);
ActorAccessibility_InitPolicy(&policy, "Switch", accessible_switch);
policy.distance = 2000;
policy.cleanupUserData = accessible_switch_cleanup;
policy.initUserData = accessible_switch_init;
@ -832,142 +787,155 @@ void ActorAccessibility_InitActors() {
policy.ydist = 200;
policy.pitch = 1.1;
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_SWITCH, policy);
ActorAccessibility_InitPolicy(&policy, "Jabu Switch", NULL, NA_SE_EV_DIAMOND_SWITCH);
ActorAccessibility_InitPolicy(&policy, "Jabu Switch", [](AccessibleActor* actor) {
int type = actor->actor->params & 0xFF;
if (type == YELLOW_TALL_1 || type == YELLOW_TALL_2) {
actor->policy.aimAssist.isProvider = true;
}
if ((actor->frameCount & 31) == 0) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_EV_DIAMOND_SWITCH, false);
}
});
policy.n = 1;
policy.volume = 0.6;
policy.distance = 1000;
policy.ydist = 300;
ActorAccessibility_AddSupportedActor(ACTOR_BG_BDAN_SWITCH, policy);
ActorAccessibility_InitPolicy(&policy, "Jabu Elevator", accessible_jabu_elevator, 0);
ActorAccessibility_InitPolicy(&policy, "Jabu Elevator", [](AccessibleActor* actor) {
if ((actor->actor->params & 0xFF) == 2 && actor->xzDistToPlayer > 50) {
ActorAccessibility_PlaySoundForActor(actor, 0, NA_SE_PL_LAND_LADDER, false);
}
});
policy.n = 1;
policy.ydist = 50;
ActorAccessibility_AddSupportedActor(ACTOR_BG_BDAN_OBJECTS, policy);
ActorAccessibility_InitPolicy(&policy, "Ocarina Spots", NULL, NA_SE_EV_DIAMOND_SWITCH);
ActorAccessibility_InitPolicy(&policy, "Ocarina Spots", NA_SE_EV_DIAMOND_SWITCH);
policy.n = 30;
policy.distance = 800;
policy.pitch = 1.1;
policy.ydist = 500;
ActorAccessibility_AddSupportedActor(ACTOR_EN_OKARINA_TAG, policy);
ActorAccessibility_InitPolicy(&policy, "Pushable Block", accessible_test, 0);
ActorAccessibility_InitPolicy(&policy, "Pushable Block", accessible_test);
policy.n = 30;
policy.distance = 800;
policy.pitch = 1.1;
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_OSHIHIKI, policy);
ActorAccessibility_AddSupportedActor(ACTOR_BG_SPOT15_RRBOX, policy);
ActorAccessibility_InitPolicy(&policy, "Torch", accessible_torches, 0);
ActorAccessibility_InitPolicy(&policy, "Torch", accessible_torches);
policy.n = 1;
policy.pitch = 1.1;
policy.distance = 800;
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);
// policy.volume = 1.3;
policy.distance = 1000;
ActorAccessibility_AddSupportedActor(ACTOR_BG_YDAN_HASI, policy);
ActorAccessibility_InitPolicy(&policy, "Pot", NULL, NA_SE_EV_POT_BROKEN);
ActorAccessibility_InitPolicy(&policy, "Pot", NA_SE_EV_POT_BROKEN);
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", NA_SE_EV_FANTOM_WARP_L);
// policy.distance = 5000;
// ActorAccessibility_AddSupportedActor(ACTOR_BG_TREEMOUTH, policy);
ActorAccessibility_InitPolicy(&policy, "Platform collapsable", NULL, NA_SE_EV_BLOCK_SHAKE);
ActorAccessibility_InitPolicy(&policy, "Platform collapsable", NA_SE_EV_BLOCK_SHAKE);
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);
ActorAccessibility_AddSupportedActor(ACTOR_BG_YDAN_MARUTA, policy);
ActorAccessibility_InitPolicy(&policy, "bombable wall", NULL, NA_SE_EN_OCTAROCK_ROCK);
ActorAccessibility_InitPolicy(&policy, "bombable wall", NA_SE_EN_OCTAROCK_ROCK);
ActorAccessibility_AddSupportedActor(ACTOR_BG_BREAKWALL, policy);
ActorAccessibility_AddSupportedActor(ACTOR_BG_BOMBWALL, policy);
ActorAccessibility_InitPolicy(&policy, "231 dekus", accessible_231_dekus, 0);
ActorAccessibility_InitPolicy(&policy, "231 dekus", accessible_231_dekus);
policy.distance = 2000;
policy.n = 50;
ActorAccessibility_AddSupportedActor(ACTOR_EN_HINTNUTS, policy);
ActorAccessibility_InitPolicy(&policy, "Flame Circle", NULL, NA_SE_EV_FIRE_PILLAR);
ActorAccessibility_InitPolicy(&policy, "Flame Circle", NA_SE_EV_FIRE_PILLAR);
ActorAccessibility_AddSupportedActor(ACTOR_BG_HIDAN_CURTAIN, policy);
ActorAccessibility_InitPolicy(&policy, "uninteractable rocks in kokiri forest", accessible_hana, 0);
ActorAccessibility_InitPolicy(&policy, "uninteractable rocks in kokiri forest", accessible_hana);
ActorAccessibility_AddSupportedActor(ACTOR_OBJ_HANA, policy);
ActorAccessibility_InitPolicy(&policy, "gold skulltula token", accessible_en_pickups, 0);
ActorAccessibility_InitPolicy(&policy, "gold skulltula token", accessible_en_pickups);
ActorAccessibility_AddSupportedActor(ACTOR_EN_SI, policy);
ActorAccessibility_InitPolicy(&policy, "Gold and Wall skulltulas", NULL, 0);
ActorAccessibility_InitPolicy(&policy, "Gold and Wall skulltulas", nullptr);
policy.aimAssist.isProvider = true;
policy.n = 1;
policy.ydist = 500;
policy.distance = 750;
ActorAccessibility_AddSupportedActor(ACTOR_EN_SW, policy);
ActorAccessibility_InitPolicy(&policy, "goma larva egg", accessible_larva, 0);
ActorAccessibility_InitPolicy(&policy, "goma larva egg", accessible_larva);
policy.distance = 1000;
policy.ydist = 1000;
ActorAccessibility_AddSupportedActor(ACTOR_EN_GOMA, policy);
ActorAccessibility_InitPolicy(&policy, "small jellyfish", NULL, NA_SE_EN_BIRI_FLY);
ActorAccessibility_InitPolicy(&policy, "small jellyfish", NA_SE_EN_BIRI_FLY);
ActorAccessibility_AddSupportedActor(ACTOR_EN_BILI, policy);
ActorAccessibility_InitPolicy(&policy, "stinger", accessible_eiyer, 0);
ActorAccessibility_InitPolicy(&policy, "stinger", accessible_eiyer);
policy.n = 1;
policy.distance = 1000;
policy.ydist = 200;
ActorAccessibility_AddSupportedActor(ACTOR_EN_EIYER, policy);
ActorAccessibility_InitPolicy(&policy, "bubble", NULL, NA_SE_EN_DAIOCTA_SPLASH);
ActorAccessibility_InitPolicy(&policy, "bubble", NA_SE_EN_DAIOCTA_SPLASH);
policy.ydist = 200;
ActorAccessibility_AddSupportedActor(ACTOR_EN_BUBBLE, policy);
ActorAccessibility_InitPolicy(&policy, "tentacle", NULL, NA_SE_EN_BALINADE_THUNDER);
ActorAccessibility_InitPolicy(&policy, "tentacle", NA_SE_EN_BALINADE_THUNDER);
ActorAccessibility_AddSupportedActor(ACTOR_EN_BA, policy);
policy.distance = 100;
ActorAccessibility_AddSupportedActor(ACTOR_EN_BX, policy);
ActorAccessibility_InitPolicy(&policy, "redead", NULL, NA_SE_EN_REDEAD_CRY);
ActorAccessibility_InitPolicy(&policy, "redead", NA_SE_EN_REDEAD_CRY);
ActorAccessibility_AddSupportedActor(ACTOR_EN_RD, policy);
ActorAccessibility_InitPolicy(&policy, "Beamos", NULL, NA_SE_EN_BIMOS_AIM);
ActorAccessibility_InitPolicy(&policy, "Beamos", NA_SE_EN_BIMOS_AIM);
ActorAccessibility_AddSupportedActor(ACTOR_EN_VM, policy);
ActorAccessibility_InitPolicy(&policy, "heart canister", accessible_en_pickups, 0);
ActorAccessibility_InitPolicy(&policy, "heart canister", accessible_en_pickups);
ActorAccessibility_AddSupportedActor(ACTOR_ITEM_B_HEART, policy);
ActorAccessibility_InitPolicy(&policy, "Goma", accessible_goma, 0);
ActorAccessibility_InitPolicy(&policy, "Goma", accessible_goma);
policy.distance = 5000;
policy.ydist = 2000;
ActorAccessibility_AddSupportedActor(ACTOR_BOSS_GOMA, policy);
ActorAccessibility_InitPolicy(&policy, "bombflowers", NULL, NA_SE_EV_BOMB_BOUND);
ActorAccessibility_InitPolicy(&policy, "bombflowers", NA_SE_EV_BOMB_BOUND);
ActorAccessibility_AddSupportedActor(ACTOR_EN_BOMBF, policy);
ActorAccessibility_InitPolicy(&policy, "Amos Statue", NULL, NA_SE_EN_AMOS_WAVE);
ActorAccessibility_InitPolicy(&policy, "Amos Statue", NA_SE_EN_AMOS_WAVE);
policy.n = 30;
ActorAccessibility_AddSupportedActor(ACTOR_EN_AM, policy);
ActorAccessibility_InitPolicy(&policy, "door of time", accessible_door_of_time, 0);
ActorAccessibility_InitPolicy(&policy, "door of time", accessible_door_of_time);
ActorAccessibility_AddSupportedActor(ACTOR_BG_MJIN, policy);
ActorAccessibility_InitPolicy(&policy, "shooting gallery rupees", NULL, 0);
ActorAccessibility_InitPolicy(&policy, "shooting gallery rupees", nullptr);
policy.aimAssist.isProvider = true;
policy.distance = 1000;
policy.n = 1;
ActorAccessibility_AddSupportedActor(ACTOR_EN_G_SWITCH, policy);
ActorAccessibility_InitPolicy(&policy, "crawlspace", NULL, NA_SE_EN_MUSI_SINK);
ActorAccessibility_InitPolicy(&policy, "crawlspace", NA_SE_EN_MUSI_SINK);
policy.volume = 1.5;
policy.distance = 2000;
ActorAccessibility_AddSupportedActor(VA_CRAWLSPACE, policy);
ActorAccessibility_InitPolicy(&policy, "Ladder/climable", accessible_climable, 0);
ActorAccessibility_InitPolicy(&policy, "Ladder/climable", accessible_climable);
// policy.volume = 1.5;
policy.pitch = 1.3;
// policy.distance = 2000;
ActorAccessibility_AddSupportedActor(VA_CLIMB, policy);
ActorAccessibility_InitPolicy(&policy, "Door", NULL, NA_SE_OC_DOOR_OPEN);
ActorAccessibility_InitPolicy(&policy, "Door", NA_SE_OC_DOOR_OPEN);
policy.n = 30;
policy.pitch = 1.1;
policy.distance = 1000;
ActorAccessibility_AddSupportedActor(VA_DOOR, policy);
ActorAccessibility_InitPolicy(&policy, "Area Change", accessible_area_change, 0);
ActorAccessibility_InitPolicy(&policy, "Area Change", accessible_area_change);
policy.n = 60;
policy.distance = 100000;
ActorAccessibility_AddSupportedActor(VA_AREA_CHANGE, policy);
ActorAccessibility_InitPolicy(&policy, "marker", NULL, NA_SE_EV_DIAMOND_SWITCH);
ActorAccessibility_InitPolicy(&policy, "marker", NA_SE_EV_DIAMOND_SWITCH);
policy.distance = 1000;
policy.pitch = 1.7;
ActorAccessibility_AddSupportedActor(VA_MARKER, policy);
// ActorAccessibility_InitPolicy(&policy, "Spike", NULL, NA_SE_EV_DIAMOND_SWITCH);
// ActorAccessibility_InitPolicy(&policy, "Spike", NA_SE_EV_DIAMOND_SWITCH);
// policy.distance = 200;
// policy.pitch = 0.5;
// ActorAccessibility_AddSupportedActor(VA_SPIKE, policy);
ActorAccessibility_InitPolicy(&policy, "Stick Burnout Warning", accessible_stick_warning, 0);
ActorAccessibility_InitPolicy(&policy, "Stick Burnout Warning", accessible_stick_warning);
policy.n = 1;
policy.runsAlways = true;
ActorAccessibility_AddSupportedActor(VA_STICK_WARNING, policy);
ActorAccessibility_InitPolicy(&policy, "System general helper", accessible_va_general_helper, 0);
ActorAccessibility_InitPolicy(&policy, "System general helper", accessible_va_general_helper);
policy.n = 1;
policy.cleanupUserData = accessible_general_helper_cleanup;
policy.initUserData = accessible_general_helper_init;
policy.runsAlways = true;
ActorAccessibility_AddSupportedActor(VA_GENERAL_HELPER, policy);
ActorAccessibility_InitPolicy(&policy, "Audio Compass", accessible_audio_compass, 0);
ActorAccessibility_InitPolicy(&policy, "Audio Compass", accessible_audio_compass);
policy.n = 1;
policy.cleanupUserData = accessible_audio_compass_cleanup;
policy.initUserData = accessible_audio_compass_init;
@ -989,8 +957,8 @@ void ActorAccessibility_InitActors() {
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 } });
list = ActorAccessibility_GetVirtualActorList(SCENE_KOKIRI_FOREST,
2); // Kokiri Forest Room with boulder and kokiri sword
// Kokiri Forest Room with boulder and kokiri sword
list = ActorAccessibility_GetVirtualActorList(SCENE_KOKIRI_FOREST, 2);
ActorAccessibility_AddVirtualActor(list, VA_CRAWLSPACE, { { -788.0, 120.0, 1392.00 }, { 0, 14702, 0 } });
list = ActorAccessibility_GetVirtualActorList(SCENE_DEKU_TREE, 2); // deku tree slingshot room
@ -1016,7 +984,7 @@ void ActorAccessibility_InitActors() {
temp->policy.distance = 200;
temp->policy.sound = NA_SE_VO_RT_FALL;
list = ActorAccessibility_GetVirtualActorList(SCENE_CASTLE_COURTYARD_GUARDS_DAY, 0); // hyrule courtyard
list = ActorAccessibility_GetVirtualActorList(SCENE_CASTLE_COURTYARD_GUARDS_DAY, 0);
ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { 1734.0, 0.0, 140.514 } });
temp = ActorAccessibility_AddVirtualActor(list, VA_MARKER, { { 1734.0, 0.0, 140.514 } });
temp->policy.pitch = 0.3;

View file

@ -35,7 +35,6 @@ enum AAE_COMMANDS {
AAE_PREPARE,
AAE_TERMINATE,
};
typedef float f32;
typedef int8_t s8;
typedef uint8_t u8;
// Processing for our custom audio positioning.

View file

@ -28,12 +28,12 @@ extern bool freezeActors;
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
// from the player.
// This is the amount in DB that a sound will be reduced by when it is at the maximum distance from the player.
#define MAX_DB_REDUCTION 35
extern "C" {
void CollisionPoly_GetVertices(CollisionPoly* poly, Vec3s* vtxList,
Vec3f* dest); // Used to tell where polygons are located.
// Used to tell where polygons are located.
void CollisionPoly_GetVertices(CollisionPoly* poly, Vec3s* vtxList, Vec3f* dest);
}
typedef struct {
@ -46,16 +46,18 @@ typedef struct {
};
} SceneAndRoom;
typedef std::map<s16, ActorAccessibilityPolicy> SupportedActors_t; // Maps actors to their accessibility policies, which
// describe how accessibility should treat them.
typedef std::map<Actor*, uint64_t> TrackedActors_t; // Maps real actors to internal IDs specific to accessibility.
typedef std::map<uint64_t, AccessibleActor>
AccessibleActorList_t; // Maps internal IDs to wrapped actor objects. These actors can be real or virtual.
// Maps actors to their accessibility policies, which describe how accessibility should treat them.
typedef std::map<s16, ActorAccessibilityPolicy> SupportedActors_t;
typedef std::map<Actor*, uint64_t>
TrackedActors_t; // Maps real actors to internal IDs specific to accessibility.
// Maps internal IDs to wrapped actor objects. These actors can be real or virtual.
typedef std::map<uint64_t, AccessibleActor> AccessibleActorList_t;
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.
// 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::unordered_set<s16> SceneList_t;
typedef struct {
std::string path;
@ -102,6 +104,8 @@ uint64_t ActorAccessibility_GetNextID() {
return aa->nextActorID++;
}
void ActorAccessibility_PrepareNextAudioFrame();
// Hooks for game-interactor.
void ActorAccessibility_OnActorInit(void* actor) {
ActorAccessibility_TrackNewActor((Actor*)actor);
@ -146,7 +150,7 @@ void ActorAccessibility_Shutdown() {
delete aa;
}
void ActorAccessibility_InitPolicy(ActorAccessibilityPolicy* policy, const char* englishName,
ActorAccessibilityCallback callback, s16 sfx) {
ActorAccessibilityCallback callback) {
policy->callback = callback;
policy->distance = 500;
policy->ydist = 80;
@ -154,6 +158,24 @@ void ActorAccessibility_InitPolicy(ActorAccessibilityPolicy* policy, const char*
policy->n = 20;
policy->pitch = 1.5;
policy->runsAlways = false;
policy->sound = 0;
policy->volume = 1.0;
policy->initUserData = NULL;
policy->cleanupUserData = NULL;
policy->pitchModifier = 0.1;
policy->aimAssist.isProvider = false;
policy->aimAssist.sfx = NA_SE_SY_HITPOINT_ALARM;
policy->aimAssist.tolerance = 0.0;
}
void ActorAccessibility_InitPolicy(ActorAccessibilityPolicy* policy, const char* englishName, s16 sfx) {
policy->callback = nullptr;
policy->distance = 500;
policy->ydist = 80;
policy->englishName = englishName;
policy->n = 20;
policy->pitch = 1.5;
policy->runsAlways = false;
policy->sound = sfx;
policy->volume = 1.0;
policy->initUserData = NULL;
@ -327,7 +349,7 @@ void ActorAccessibility_CopyParamsFromRealActor(AccessibleActor* actor) {
actor->isDrawn = actor->actor->isDrawn;
actor->xyzDistToPlayer = Math_Vec3f_DistXYZ(&actor->actor->world.pos, &player->actor.world.pos);
}
void ActorAccessibility_PrepareNextAudioFrame();
void ActorAccessibility_StopAllVirtualActors(VirtualActorList* list) {
if (list == NULL)
return;
@ -336,6 +358,7 @@ void ActorAccessibility_StopAllVirtualActors(VirtualActorList* list) {
for (auto i = val->begin(); i != val->end(); i++)
ActorAccessibility_StopAllSounds((void*)&(*i));
}
void ActorAccessibility_RunAccessibilityForActor(PlayState* play, AccessibleActor* actor) {
actor->play = play;
if (ActorAccessibility_IsRealActor(actor)) {
@ -394,10 +417,11 @@ void ActorAccessibility_RunAccessibilityForActor(PlayState* play, AccessibleActo
}
}
if (actor->policy.callback != NULL)
if (actor->policy.callback != nullptr) {
actor->policy.callback(actor);
else
} else {
ActorAccessibility_PlaySoundForActor(actor, 0, actor->policy.sound, false);
}
}
void ActorAccessibility_RunAccessibilityForAllActors(PlayState* play) {
Player* player = GET_PLAYER(play);
@ -721,11 +745,12 @@ const char* ActorAccessibility_MapRawSampleToExternalAudio(const char* name) {
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() {
aa->audioEngine->prepare();
}
void ActorAccessibility_HandleSoundExtractionMode(PlayState* play) {
aa->sfxExtractor.frameCallback();
}

View file

@ -1,11 +1,7 @@
#pragma once
#include <z64.h>
#ifdef __cplusplus
extern "C" {
#endif
struct AccessibleActor;
typedef struct AccessibleActor AccessibleActor;
// A callback that is run regularely as the game progresses in order to provide accessibility services for an actor.
typedef void (*ActorAccessibilityCallback)(AccessibleActor*);
@ -15,10 +11,8 @@ typedef bool (*ActorAccessibilityUserDataInit)(AccessibleActor*);
typedef void (*ActorAccessibilityUserDataCleanup)(AccessibleActor*);
struct VirtualActorList;
typedef struct VirtualActorList VirtualActorList;
typedef struct {
struct ActorAccessibilityPolicy {
const char* englishName;
ActorAccessibilityCallback callback; // If set, it will be called once every n frames. If null, then sfx will be
@ -41,8 +35,7 @@ typedef struct {
f32 tolerance; // How close to the center of the actor does Link have to aim for aim assist to consider
// it lined up.
} aimAssist;
} ActorAccessibilityPolicy;
};
// Accessible actor object. This can be a "real" actor (one that corresponds to an actual actor in the game) or a
// "virtual" actor (which does not actually exist in the game, but is used to create extra sounds for the player).
@ -85,12 +78,14 @@ struct AccessibleActor {
ActorAccessibilityPolicy policy; // A copy, so it can be customized on a per-actor basis if needed.
void* userData; // Set by the policy. Can be anything.
};
// Initialize accessibility.
void ActorAccessibility_Init();
void ActorAccessibility_InitActors();
void ActorAccessibility_Shutdown();
void ActorAccessibility_InitPolicy(ActorAccessibilityPolicy* policy, const char* englishName,
ActorAccessibilityCallback callback, s16 sfx);
ActorAccessibilityCallback callback);
void ActorAccessibility_InitPolicy(ActorAccessibilityPolicy* policy, const char* englishName, s16 sfx);
void ActorAccessibility_TrackNewActor(Actor* actor);
void ActorAccessibility_RemoveTrackedActor(Actor* actor);
@ -159,9 +154,7 @@ typedef enum {
VA_GENERAL_HELPER, // Room announcements, action icon and other misc help.
VA_AUDIO_COMPASS, // Points north.
VA_STICK_WARNING, // beep when stick is about to burn out.
VA_FINAL,
VA_MAX,
} VIRTUAL_ACTOR_TABLE;
#define EVERYWHERE -32768 // Denotes a virtual actor that is global
@ -189,7 +182,3 @@ void ActorAccessibility_HandleSoundExtractionMode(PlayState* play);
void ActorAccessibility_DoSoundExtractionStep();
void ActorAccessibility_AudioGlossary(PlayState* play);
#ifdef __cplusplus
}
#endif

View file

@ -809,7 +809,7 @@ class TerrainCueDirection {
return r;
}
float checkForLava(Vec3f_ pos) {
bool checkForLava(Vec3f_ pos) {
CollisionPoly* floorpoly;
int32_t bgid = BGCHECK_SCENE;
CollisionContext* colCtx = &actor->play->colCtx;
@ -821,17 +821,10 @@ class TerrainCueDirection {
return 0;
}
s8 floorparam = func_80041D4C(colCtx, floorpoly, BG_ACTOR_MAX);
if (floorparam == 2 || floorparam == 3) {
return 1;
} else {
return 0;
}
return floorparam == 2 || floorparam == 3;
}
void scan() {
Player* player = GET_PLAYER(actor->play);
CollisionContext* colCtx = &actor->play->colCtx;
@ -1493,9 +1486,8 @@ ActorAccessibility_PlaySpecialSound(actor, wallCueSound);
*/
void ActorAccessibility_InitCues() {
ActorAccessibilityPolicy policy;
ActorAccessibility_InitPolicy(&policy, "Terrain cue helper", accessible_va_terrain_cue, 0);
ActorAccessibility_InitPolicy(&policy, "Terrain cue helper", accessible_va_terrain_cue);
policy.n = 1;
policy.runsAlways = true;
policy.distance = 500;