Link voice & rng

This commit is contained in:
robojumper
2025-07-18 21:24:23 +02:00
parent 459e46cfdd
commit 9a44fbfbcf
14 changed files with 1045 additions and 55 deletions
+2 -1
View File
@@ -2,8 +2,9 @@
#include "common.h"
#include "d/snd/d_snd_fi_vocal_mgr.h"
#include "d/snd/d_snd_wzsound.h"
const s32 dSndHarpSongData_c::sNumHarpSongs = 6;
const s32 dSndHarpSongData_c::sNumHarpSongs = LABEL_HARP_TONE_RAW_END - LABEL_HARP_TONE_RAW_START - 1;
static const f32 sUnkSongVals[] = {
40.0f,
40.0f,
+152
View File
@@ -0,0 +1,152 @@
#include "d/snd/d_snd_rng_id.h"
dSndRngId_c::dSndRngId_c() : mIsConfigured(false) {}
void dSndRngId_c::configure(u32 start, u32 end, u8 genChance) {
mBaseId = start;
mLastPicked = -1;
mPickedMask = 0;
mPickedNum = 0;
mRange = end - start + 1;
mGenChance = genChance;
mIsConfigured = true;
}
u32 dSndRngId_c::rndIdNoReuse() {
if (mPickedNum >= mRange) {
return -1;
}
if (!rndBool(mGenChance)) {
return -1;
}
u32 result = mLastPicked;
if (mRange == 1) {
// only one possible ID
return mBaseId;
} else if (mRange == 2) {
// not alternating like below
result = mBaseId + rndInt(2);
} else {
int remaining = mRange - mPickedNum;
if (remaining == 1) {
// find the single last remaining ID
for (int i = 0; i < mRange; i++) {
if (((1 << i) & ~mPickedMask) != 0) {
result = mBaseId + i;
}
}
} else {
while (mLastPicked == result) {
// pick a remaining ID and find it
int pick = rndInt(remaining);
int j = 0;
for (int i = 0; i < mRange; i++) {
if (((1 << i) & ~mPickedMask) != 0) {
if (j == pick) {
result = mBaseId + i;
}
j++;
}
}
}
}
}
return result;
}
u32 dSndRngId_c::nextIdNoReuse() {
if (mPickedNum >= mRange) {
return -1;
}
if (!rndBool(mGenChance)) {
return -1;
}
if (mRange == 1) {
// only one possible ID
return mBaseId;
}
for (int i = 0; i < mRange; i++) {
if (((1 << i) & ~mPickedMask) != 0) {
return mBaseId + i;
}
}
return -1;
}
u32 dSndRngId_c::rndId() {
if (!rndBool(mGenChance)) {
return -1;
}
return mBaseId + rndInt(mRange);
}
u32 dSndRngId_c::rndIdNotSame() {
if (!rndBool(mGenChance)) {
return -1;
}
u32 last = mLastPicked;
if (mRange == 1) {
// we have to reuse if we only have one ID to pick from
return mBaseId;
}
u32 result = mLastPicked;
if (mRange == 2) {
if (last == -1) {
// we haven't generated an ID yet, so pick one of the two at random
result = mBaseId + rndInt(2);
} else {
// we have generated an ID before, so pick the other one now
if (last == mBaseId) {
result = mBaseId + 1;
} else {
result = mBaseId;
}
}
} else {
while (mLastPicked == result) {
result = mBaseId + rndInt(mRange);
}
}
return result;
}
void dSndRngId_c::markPicked(u32 id, bool allowReset) {
if (id != -1 && id >= mBaseId && id < mBaseId + mRange) {
if (mRange >= 2) {
u32 bit = 1 << (id - mBaseId);
if (!(mPickedMask & bit)) {
mPickedMask |= bit;
mPickedNum++;
}
if (allowReset && mPickedNum >= mRange) {
resetPicked();
}
mLastPicked = id;
}
}
}
void dSndRngId_c::resetPicked() {
mPickedMask = 0;
mPickedNum = 0;
}
u32 dSndRngId_c::rndInt(s32 max) {
return dSndRng_c::rndInt(max);
}
+17
View File
@@ -0,0 +1,17 @@
#include "d/snd/d_snd_rng_id_if.h"
bool dSndRngIdIf_c::doNextIdNoReuse() {
return handleId(nextIdNoReuse());
}
bool dSndRngIdIf_c::doRndId() {
return handleId(rndId());
}
bool dSndRngIdIf_c::doRndIdNoReuse() {
return handleId(rndIdNoReuse());
}
bool dSndRngIdIf_c::doRndIdNotSame() {
return handleId(rndIdNotSame());
}
+346
View File
@@ -0,0 +1,346 @@
#include "d/snd/d_snd_rng_link_voice.h"
#include "common.h"
#include "d/snd/d_snd_rng_id.h"
#include "d/snd/d_snd_source_player_head.h"
#include "d/snd/d_snd_wzsound.h"
struct dSndLinkVoiceConfig {
/* 0x00 */ u16 begin;
/* 0x02 */ u16 end;
/* 0x04 */ s16 mGenChance;
/* 0x06 */ s8 priority;
/* 0x07 */ bool priorityTiebreaker;
};
static const dSndLinkVoiceConfig sLinkVoiceConfig[] = {
/* SND_LV_PRACTICE_S*/
{ SE_LV_PRACTICE_S_01, SE_LV_PRACTICE_S_ff, 70, 9, false},
/* SND_LV_PRACTICE_M*/
{ SE_LV_PRACTICE_M_01, SE_LV_PRACTICE_M_ff, 100, 10, false},
/* SND_LV_PRACTICE_L*/
{ SE_LV_PRACTICE_L_01, SE_LV_PRACTICE_L_ff, 100, 10, false},
/* SND_LV_PRACTICE_KAITEN_M*/
{SE_LV_PRACTICE_KAITEN_M_01, SE_LV_PRACTICE_KAITEN_M_ff, 100, 11, false},
/* SND_LV_ATTACK_S*/
{ SE_LV_ATTACK_S_01, SE_LV_ATTACK_S_ff, 100, 10, false},
/* SND_LV_ATTACK_M*/
{ SE_LV_ATTACK_M_01, SE_LV_ATTACK_M_ff, 100, 10, false},
/* SND_LV_ATTACK_L*/
{ SE_LV_ATTACK_L_01, SE_LV_ATTACK_L_ff, 100, 10, false},
/* SND_LV_SAVE_POWER*/
{ SE_LV_SAVE_POWER_01, SE_LV_SAVE_POWER_ff, 100, 0, false},
/* SND_LV_ATTACK_KAITEN_M*/
{ SE_LV_ATTACK_KAITEN_M_01, SE_LV_ATTACK_KAITEN_M_ff, 100, 11, false},
/* SND_LV_NOTICE*/
{ SE_LV_NOTICE_01, SE_LV_NOTICE_ff, 100, 0, false},
/* SND_LV_PRACTICE_SHIELD*/
{ SE_LV_PRACTICE_SHIELD_01, SE_LV_PRACTICE_SHIELD_ff, 100, 8, false},
/* SND_LV_ATTACK_SHIELD*/
{ SE_LV_ATTACK_SHIELD_01, SE_LV_ATTACK_SHIELD_ff, 100, 8, false},
/* SND_LV_ATTACK_SHIELD_GJ*/
{ SE_LV_ATTACK_SHIELD_GJ_01, SE_LV_ATTACK_SHIELD_GJ_ff, 100, 9, false},
/* SND_LV_SHELD_GUARD*/
{ SE_LV_SHELD_GUARD_01, SE_LV_SHELD_GUARD_ff, 100, 8, false},
/* SND_LV_SHELD_DOWN*/
{ SE_LV_SHELD_DOWN_01, SE_LV_SHELD_DOWN_ff, 100, 15, false},
/* SND_LV_SHELD_BREAK*/
{ SE_LV_SHELD_BREAK_01, SE_LV_SHELD_BREAK_ff, 100, 16, false},
/* SND_LV_ATTACK_DOWN*/
{ SE_LV_ATTACK_DOWN_01, SE_LV_ATTACK_DOWN_ff, 100, 16, false},
/* SND_LV_DAMAGE_S*/
{ SE_LV_DAMAGE_S_01, SE_LV_DAMAGE_S_ff, 100, 15, false},
/* SND_LV_DAMAGE_L*/
{ SE_LV_DAMAGE_L_01, SE_LV_DAMAGE_L_ff, 100, 16, false},
/* SND_LV_DAMAGE_FIRE_S*/
{ SE_LV_DAMAGE_FIRE_S_01, SE_LV_DAMAGE_FIRE_S_ff, 100, 15, false},
/* SND_LV_DAMAGE_FIRE_L*/
{ SE_LV_DAMAGE_FIRE_L_01, SE_LV_DAMAGE_FIRE_L_ff, 100, 16, false},
/* SND_LV_DAMAGE_ELEC_S*/
{ SE_LV_DAMAGE_ELEC_S_01, SE_LV_DAMAGE_ELEC_S_ff, 100, 15, false},
/* SND_LV_DAMAGE_ELEC_L*/
{ SE_LV_DAMAGE_ELEC_L_01, SE_LV_DAMAGE_ELEC_L_ff, 100, 15, false},
/* SND_LV_STRUGGLE_S*/
{ SE_LV_STRUGGLE_S_01, SE_LV_STRUGGLE_S_ff, 100, 14, false},
/* SND_LV_STRUGGLE_L*/
{ SE_LV_STRUGGLE_L_01, SE_LV_STRUGGLE_L_ff, 100, 14, false},
/* SND_LV_GROAN*/
{ SE_LV_GROAN_01, SE_LV_GROAN_ff, 100, 246, false},
/* SND_LV_ESCAPE*/
{ SE_LV_ESCAPE_01, SE_LV_ESCAPE_ff, 100, 15, true},
/* SND_LV_DAMAGE_MAGMA*/
{ SE_LV_DAMAGE_MAGMA_01, SE_LV_DAMAGE_MAGMA_ff, 100, 17, false},
/* SND_LV_DAMAGE_QUICKSAND*/
{ SE_LV_DAMAGE_QUICKSAND_01, SE_LV_DAMAGE_QUICKSAND_ff, 100, 17, false},
/* SND_LV_DIE_L*/
{ SE_LV_DIE_L_01, SE_LV_DIE_L_ff, 100, 100, true},
/* SND_LV_DIE_S*/
{ SE_LV_DIE_S_01, SE_LV_DIE_S_ff, 100, 100, true},
/* SND_LV_DIE_WATER*/
{ SE_LV_DIE_WATER_01, SE_LV_DIE_WATER_ff, 100, 100, true},
/* SND_LV_RESTART*/
{ SE_LV_RESTART_01, SE_LV_RESTART_ff, 100, 100, true},
/* SND_LV_STAND_UP*/
{ SE_LV_STAND_UP_01, SE_LV_STAND_UP_ff, 100, 0, false},
/* SND_LV_PHEW*/
{ SE_LV_PHEW_01, SE_LV_PHEW_ff, 100, 0, false},
/* SND_LV_TIRED_S*/
{ SE_LV_TIRED_S_01, SE_LV_TIRED_S_ff, 100, 254, true},
/* SND_LV_TIRED_S*/
{ SE_LV_TIRED_S_01, SE_LV_TIRED_S_ff, 100, 254, true},
/* SND_LV_TIRED_M*/
{ SE_LV_TIRED_M_01, SE_LV_TIRED_M_ff, 100, 254, true},
/* SND_LV_TIRED_L*/
{ SE_LV_TIRED_L_01, SE_LV_TIRED_L_ff, 100, 254, true},
/* SND_LV_CLIMB_TIRED_S*/
{ SE_LV_CLIMB_TIRED_S_01, SE_LV_CLIMB_TIRED_S_ff, 60, 254, false},
/* SND_LV_CLIMB_TIRED_S*/
{ SE_LV_CLIMB_TIRED_S_01, SE_LV_CLIMB_TIRED_S_ff, 60, 254, false},
/* SND_LV_CLIMB_TIRED_M*/
{ SE_LV_CLIMB_TIRED_M_01, SE_LV_CLIMB_TIRED_M_ff, 60, 254, false},
/* SND_LV_CLIMB_TIRED_L*/
{ SE_LV_CLIMB_TIRED_L_01, SE_LV_CLIMB_TIRED_L_ff, 100, 254, false},
/* SND_LV_LIFT_TIRED_S*/
{ SE_LV_LIFT_TIRED_S_01, SE_LV_LIFT_TIRED_S_ff, 60, 254, false},
/* SND_LV_LIFT_TIRED_S*/
{ SE_LV_LIFT_TIRED_S_01, SE_LV_LIFT_TIRED_S_ff, 60, 254, false},
/* SND_LV_LIFT_TIRED_M*/
{ SE_LV_LIFT_TIRED_M_01, SE_LV_LIFT_TIRED_M_ff, 60, 254, false},
/* SND_LV_LIFT_TIRED_L*/
{ SE_LV_LIFT_TIRED_L_01, SE_LV_LIFT_TIRED_L_ff, 100, 254, false},
/* SND_LV_TIRED_RECOVER*/
{ SE_LV_TIRED_RECOVER_01, SE_LV_TIRED_RECOVER_ff, 100, 254, true},
/* SND_LV_TIRED_RECOVER_S*/
{ SE_LV_TIRED_RECOVER_S_01, SE_LV_TIRED_RECOVER_S_ff, 100, 254, true},
/* SND_LV_TIRED_RECOVER_M*/
{ SE_LV_TIRED_RECOVER_M_01, SE_LV_TIRED_RECOVER_M_ff, 100, 254, true},
/* SND_LV_TIRED_RECOVER_L*/
{ SE_LV_TIRED_RECOVER_L_01, SE_LV_TIRED_RECOVER_L_ff, 100, 254, true},
/* SND_LV_TIRED_EMPTY*/
{ SE_LV_TIRED_EMPTY_01, SE_LV_TIRED_EMPTY_ff, 100, 1, true},
/* SND_LV_PHEW*/
{ SE_LV_PHEW_01, SE_LV_PHEW_ff, 100, 1, true},
/* SND_LV_JUMP_S*/
{ SE_LV_JUMP_S_01, SE_LV_JUMP_S_ff, 100, 8, false},
/* SND_LV_JUMP_M*/
{ SE_LV_JUMP_M_01, SE_LV_JUMP_M_ff, 100, 8, false},
/* SND_LV_JUMP_L*/
{ SE_LV_JUMP_L_01, SE_LV_JUMP_L_ff, 100, 8, false},
/* SND_LV_SHOOT_START*/
{ SE_LV_SHOOT_START_01, SE_LV_SHOOT_START_ff, 100, 255, false},
/* SND_LV_SHOOT_SLOPE*/
{ SE_LV_SHOOT_SLOPE_01, SE_LV_SHOOT_SLOPE_ff, 100, 255, false},
/* SND_LV_RUN_UP*/
{ SE_LV_RUN_UP_01, SE_LV_RUN_UP_ff, 100, 255, false},
/* SND_LV_GRAB*/
{ SE_LV_GRAB_01, SE_LV_GRAB_ff, 100, 0, false},
/* SND_LV_CLIMB_STEP*/
{ SE_LV_CLIMB_STEP_01, SE_LV_CLIMB_STEP_ff, 100, 1, false},
/* SND_LV_HUNG*/
{ SE_LV_HUNG_01, SE_LV_HUNG_ff, 100, 0, false},
/* SND_LV_JUMP_IVY*/
{ SE_LV_JUMP_IVY_01, SE_LV_JUMP_IVY_ff, 100, 0, true},
/* SND_LV_BACKFLIP*/
{ SE_LV_BACKFLIP_01, SE_LV_BACKFLIP_ff, 70, 0, false},
/* SND_LV_ZENTEN*/
{ SE_LV_ZENTEN_01, SE_LV_ZENTEN_ff, 100, 0, false},
/* SND_LV_ZENTEN_CLASH*/
{ SE_LV_ZENTEN_CLASH_01, SE_LV_ZENTEN_CLASH_ff, 100, 14, false},
/* SND_LV_ZENTEN_UP*/
{ SE_LV_ZENTEN_UP_01, SE_LV_ZENTEN_UP_ff, 100, 247, true},
/* SND_LV_FALLING_HIGH*/
{ SE_LV_FALLING_HIGH_01, SE_LV_FALLING_HIGH_ff, 100, 15, true},
/* SND_LV_DAMAGE_FALL*/
{ SE_LV_DAMAGE_FALL_01, SE_LV_DAMAGE_FALL_ff, 100, 15, true},
/* SND_LV_SKYDIVE*/
{ SE_LV_SKYDIVE_01, SE_LV_SKYDIVE_ff, 100, 0, false},
/* SND_LV_RIDE_BIRD*/
{ SE_LV_RIDE_BIRD_01, SE_LV_RIDE_BIRD_ff, 100, 0, true},
/* SND_LV_BLAST*/
{ SE_LV_BLAST_01, SE_LV_BLAST_ff, 100, 0, false},
/* SND_LV_WIND_FLY*/
{ SE_LV_WIND_FLY_01, SE_LV_WIND_FLY_ff, 100, 0, false},
/* SND_LV_BALANCE_BALL*/
{ SE_LV_BALANCE_BALL_01, SE_LV_BALANCE_BALL_ff, 100, 0, false},
/* SND_LV_SLIDE_START*/
{ SE_LV_SLIDE_START_01, SE_LV_SLIDE_START_ff, 100, 255, false},
/* SND_LV_CLIMB_ROPE*/
{ SE_LV_CLIMB_ROPE_01, SE_LV_CLIMB_ROPE_ff, 60, 0, false},
/* SND_LV_SWING_ROPE*/
{ SE_LV_SWING_ROPE_01, SE_LV_SWING_ROPE_ff, 100, 0, false},
/* SND_LV_JUMP_ROPE*/
{ SE_LV_JUMP_ROPE_01, SE_LV_JUMP_ROPE_ff, 100, 0, false},
/* SND_LV_STOP_ROPE*/
{ SE_LV_STOP_ROPE_01, SE_LV_STOP_ROPE_ff, 100, 0, false},
/* SND_LV_SHAKE_ROPE*/
{ SE_LV_SHAKE_ROPE_01, SE_LV_SHAKE_ROPE_ff, 100, 0, false},
/* SND_LV_FOOT_MISS*/
{ SE_LV_FOOT_MISS_01, SE_LV_FOOT_MISS_ff, 100, 0, false},
/* SND_LV_BREATH*/
{ SE_LV_BREATH_01, SE_LV_BREATH_ff, 100, 0, false},
/* SND_LV_TAKE_BREATH*/
{ SE_LV_TAKE_BREATH_01, SE_LV_TAKE_BREATH_ff, 100, 0, false},
/* SND_LV_GET_AIR*/
{ SE_LV_GET_AIR_01, SE_LV_GET_AIR_ff, 100, 0, false},
/* SND_LV_DOLPHIN_JUMP*/
{ SE_LV_DOLPHIN_JUMP_01, SE_LV_DOLPHIN_JUMP_ff, 100, 0, false},
/* SND_LV_LIFT_S*/
{ SE_LV_LIFT_S_01, SE_LV_LIFT_S_ff, 100, 0, false},
/* SND_LV_THROW_S*/
{ SE_LV_THROW_S_01, SE_LV_THROW_S_ff, 100, 0, false},
/* SND_LV_LIFT_L*/
{ SE_LV_LIFT_L_01, SE_LV_LIFT_L_ff, 100, 0, false},
/* SND_LV_THROW_L*/
{ SE_LV_THROW_L_01, SE_LV_THROW_L_ff, 100, 0, false},
/* SND_LV_PUSH_M*/
{ SE_LV_PUSH_M_01, SE_LV_PUSH_M_ff, 100, 0, false},
/* SND_LV_DIG_GLOVE*/
{ SE_LV_DIG_GLOVE_01, SE_LV_DIG_GLOVE_ff, 100, 0, false},
/* SND_LV_SWING_S*/
{ SE_LV_SWING_S_01, SE_LV_SWING_S_ff, 100, 0, false},
/* SND_LV_DRINK*/
{ SE_LV_DRINK_01, SE_LV_DRINK_ff, 100, 0, false},
/* SND_LV_DRINK_FIN*/
{ SE_LV_DRINK_FIN_01, SE_LV_DRINK_FIN_ff, 100, 255, false},
/* SND_LV_CLIMB_WALL*/
{ SE_LV_CLIMB_WALL_01, SE_LV_CLIMB_WALL_ff, 60, 254, false},
/* SND_LV_JUMPON_LIFT*/
{ SE_LV_JUMPON_LIFT_01, SE_LV_JUMPON_LIFT_ff, 100, 0, false},
/* SND_LV_GET_SURPRISND*/
{ SE_LV_GET_SURPRISE_01, SE_LV_GET_SURPRISE_ff, 100, 0, false},
/* SND_LV_FLOATAWAY*/
{ SE_LV_FLOATAWAY_01, SE_LV_FLOATAWAY_ff, 100, 0, false},
/* SND_LV_CANNON_JUMP*/
{ SE_LV_CANNON_JUMP_01, SE_LV_CANNON_JUMP_ff, 100, 0, false},
/* SND_LV_FIRE*/
{ SE_LV_FIRE_01, SE_LV_FIRE_ff, 100, 0, false},
/* SND_LV_LOOK_BODY*/
{ SE_LV_LOOK_BODY_01, SE_LV_LOOK_BODY_ff, 100, 0, false},
/* SND_LV_QUICKWATER*/
{ SE_LV_QUICKWATER_01, SE_LV_QUICKWATER_ff, 60, 0, false},
/* SND_LV_DANGER_ROCK*/
{ SE_LV_DANGER_ROCK_01, SE_LV_DANGER_ROCK_ff, 100, 0, false},
/* SND_LV_PULL_SWORD*/
{ SE_LV_PULL_SWORD_01, SE_LV_PULL_SWORD_ff, 100, 0, false},
/* SND_LV_WHIP_BACK*/
{ SE_LV_WHIP_BACK_01, SE_LV_WHIP_BACK_ff, 100, 0, false},
/* SND_LV_SW_PUSH*/
{ SE_LV_SW_PUSH_01, SE_LV_SW_PUSH_ff, 100, 0, false},
/* SND_LV_SW_REJECT*/
{ SE_LV_SW_REJECT_01, SE_LV_SW_REJECT_ff, 100, 0, false},
/* SND_LV_JUMP_DIVEWATER*/
{ SE_LV_JUMP_DIVEWATER_01, SE_LV_JUMP_DIVEWATER_ff, 100, 0, false},
/* SND_LV_DAMAGE_WATER_M*/
{ SE_LV_DAMAGE_WATER_M_01, SE_LV_DAMAGE_WATER_M_ff, 100, 16, false},
/* SND_LV_DAMAGE_WATER_S*/
{ SE_LV_DAMAGE_WATER_S_01, SE_LV_DAMAGE_WATER_S_ff, 100, 15, false},
/* SND_LV_DAMAGE_ELEC_W*/
{ SE_LV_DAMAGE_ELEC_W_01, SE_LV_DAMAGE_ELEC_W_ff, 100, 15, false},
/* SND_LV_STRUGGLE_W*/
{ SE_LV_STRUGGLE_W_01, SE_LV_STRUGGLE_W_ff, 100, 0, false},
/* SND_LV_GROAN_W*/
{ SE_LV_GROAN_W_01, SE_LV_GROAN_W_ff, 100, 0, false},
/* SND_LV_ESCAPE_W*/
{ SE_LV_ESCAPE_W_01, SE_LV_ESCAPE_W_ff, 100, 0, false},
/* SND_LV_BREATH_TIRED_S*/
{ SE_LV_BREATH_TIRED_S_01, SE_LV_BREATH_TIRED_S_ff, 100, 254, false},
/* SND_LV_BREATH_TIRED_S*/
{ SE_LV_BREATH_TIRED_S_01, SE_LV_BREATH_TIRED_S_ff, 30, 254, false},
/* SND_LV_BREATH_TIRED_M*/
{ SE_LV_BREATH_TIRED_M_01, SE_LV_BREATH_TIRED_M_ff, 60, 254, false},
/* SND_LV_BREATH_TIRED_L*/
{ SE_LV_BREATH_TIRED_L_01, SE_LV_BREATH_TIRED_L_ff, 100, 254, false},
/* SND_LV_LIE_UP*/
{ SE_LV_LIE_UP_01, SE_LV_LIE_UP_ff, 100, 0, false},
/* SND_LV_PRACTICE_PUNCH*/
{ SE_LV_PRACTICE_PUNCH_01, SE_LV_PRACTICE_PUNCH_ff, 100, 0, false},
/* SND_LV_ATTACK_PUNCH*/
{ SE_LV_ATTACK_PUNCH_01, SE_LV_ATTACK_PUNCH_ff, 100, 0, false},
/* SND_LV_SURPRISND_S*/
{ SE_LV_SURPRISE_S_01, SE_LV_SURPRISE_S_ff, 100, 0, false},
/* SND_LV_SHUTTER_OPEN*/
{ SE_LV_SHUTTER_OPEN_01, SE_LV_SHUTTER_OPEN_ff, 100, 0, false},
/* SND_LV_BIRDRACE_REACH*/
{ SE_LV_BIRDRACE_REACH_01, SE_LV_BIRDRACE_REACH_ff, 100, 10, false},
/* SND_LV_ATTACK_A*/
{ SE_LV_ATTACK_A_01, SE_LV_ATTACK_A_ff, 100, 0, false},
/* SND_LV_BADSMELL_TIRED_S*/
{ SE_LV_BADSMELL_TIRED_S_01, SE_LV_BADSMELL_TIRED_S_ff, 100, 254, false},
/* SND_LV_BADSMELL_TIRED_S*/
{ SE_LV_BADSMELL_TIRED_S_01, SE_LV_BADSMELL_TIRED_S_ff, 50, 254, false},
/* SND_LV_BADSMELL_TIRED_M*/
{ SE_LV_BADSMELL_TIRED_M_01, SE_LV_BADSMELL_TIRED_M_ff, 60, 254, false},
/* SND_LV_BADSMELL_TIRED_L*/
{ SE_LV_BADSMELL_TIRED_L_01, SE_LV_BADSMELL_TIRED_L_ff, 100, 254, false},
/* SND_LV_GIRA_SWORD_REJECT*/
{SE_LV_GIRA_SWORD_REJECT_01, SE_LV_GIRA_SWORD_REJECT_ff, 100, 0, false},
/* SND_LV_GIRA_SWORD_PULL*/
{ SE_LV_GIRA_SWORD_PULL_01, SE_LV_GIRA_SWORD_PULL_ff, 100, 0, false},
/* SND_LV_GIRA_GRAPPLE*/
{ SE_LV_GIRA_GRAPPLE_01, SE_LV_GIRA_GRAPPLE_ff, 100, 0, false},
/* SND_LV_SWORD_SIREN_IN*/
{ SE_LV_SWORD_SIREN_IN_01, SE_LV_SWORD_SIREN_IN_ff, 100, 0, false},
/* SND_LV_APPEAR_SURPRISND*/
{ SE_LV_APPEAR_SURPRISE_01, SE_LV_APPEAR_SURPRISE_ff, 100, 0, false},
/* SND_LV_EXIT_SURPRISND*/
{ SE_LV_EXIT_SURPRISE_01, SE_LV_EXIT_SURPRISE_ff, 100, 0, false},
/* SND_LV_BIRD_DAMAGE*/
{ SE_LV_BIRD_DAMAGE_01, SE_LV_BIRD_DAMAGE_ff, 100, 15, false},
/* SND_LV_BIRD_SPIN*/
{ SE_LV_BIRD_SPIN_01, SE_LV_BIRD_SPIN_ff, 100, 10, false},
/* SND_LV_BIRD_ATTACK*/
{ SE_LV_BIRD_ATTACK_01, SE_LV_BIRD_ATTACK_ff, 100, 9, false},
/* SND_LV_TRUCK_JUMP*/
{ SE_LV_TRUCK_JUMP_01, SE_LV_TRUCK_JUMP_ff, 100, 0, false},
/* SND_LV_TRUCK_IN*/
{ SE_LV_TRUCK_IN_01, SE_LV_TRUCK_IN_ff, 100, 0, false},
/* SND_LV_TRUCK_BRAKE*/
{ SE_LV_TRUCK_BRAKE_01, SE_LV_TRUCK_BRAKE_ff, 100, 0, false},
/* SND_LV_DAMAGE_MUTEKI_S*/
{ SE_LV_DAMAGE_MUTEKI_S_01, SE_LV_DAMAGE_MUTEKI_S_ff, 100, 15, false},
/* SND_LV_DAMAGE_MUTEKI_L*/
{ SE_LV_DAMAGE_MUTEKI_L_01, SE_LV_DAMAGE_MUTEKI_L_ff, 100, 15, false},
/* SND_LV_DAMAGE_MUTEKI_W_S*/
{SE_LV_DAMAGE_MUTEKI_W_S_01, SE_LV_DAMAGE_MUTEKI_W_S_ff, 100, 15, false},
/* SND_LV_DAMAGE_MUTEKI_W_L*/
{SE_LV_DAMAGE_MUTEKI_W_L_01, SE_LV_DAMAGE_MUTEKI_W_L_ff, 100, 15, false},
/* SND_LV_RECOVER_WATER*/
{ SE_LV_RECOVER_WATER_01, SE_LV_RECOVER_WATER_ff, 100, 100, true},
/* SND_LV_SPIN_WATER*/
{ SE_LV_SPIN_WATER_01, SE_LV_SPIN_WATER_ff, 100, 8, false},
/* SND_LV_SHOCKED*/
{ SE_LV_SHOCKED_01, SE_LV_SHOCKED_ff, 100, 14, false},
/* SND_LV_LIGHT_SURPRISND*/
{ SE_LV_LIGHT_SURPRISE_01, SE_LV_LIGHT_SURPRISE_ff, 100, 0, false},
/* SND_LV_QUIETLY_S*/
{ SE_LV_QUIETLY_S_01, SE_LV_QUIETLY_S_ff, 60, 0, false},
/* SND_LV_QUIETLY_M*/
{ SE_LV_QUIETLY_M_01, SE_LV_QUIETLY_M_ff, 60, 0, false},
/* SND_LV_DAMAGE_L*/
{ SE_LV_DAMAGE_L_01, SE_LV_DAMAGE_L_ff, 100, 17, false},
};
dSndRngLinkVoice_c::dSndRngLinkVoice_c() {}
void dSndRngLinkVoice_c::configure(const dSndLinkVoiceConfig *config, dSndSourcePlayerHead_c *source) {
dSndRngId_c::configure(config->begin, config->end, config->mGenChance);
mPriority = config->priority;
mPriorityTiebreaker = config->priorityTiebreaker;
mpSource = source;
}
bool dSndRngLinkVoice_c::handleId(u32 id) {
if (mpSource == nullptr) {
return false;
}
bool ok = mpSource->startVoiceSoundInternal(id);
if (ok) {
markPicked(id, true);
}
return ok;
}
const dSndLinkVoiceConfig *dSndRngLinkVoice_c::getConfig(s32 idx) {
return &sLinkVoiceConfig[idx];
}
+166
View File
@@ -0,0 +1,166 @@
#include "d/snd/d_snd_source_player_head.h"
#include "common.h"
#include "d/d_player_act.h"
#include "d/snd/d_snd_rng_link_voice.h"
#include "d/snd/d_snd_wzsound.h"
dSndSourcePlayerHead_c::dSndSourcePlayerHead_c(
s32 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup
)
: dSoundSource_c(sourceType, ac, name, pOwnerGroup) {
configureVoiceRngs();
}
void dSndSourcePlayerHead_c::configureVoiceRngs() {
field_0x22A0 = SND_LV_MAX;
mLastPlayedSound = SND_LV_MAX;
for (int i = 0; i < SND_LV_MAX; i++) {
mLinkVoiceRngs[i].configure(dSndRngLinkVoice_c::getConfig(i), this);
}
}
bool dSndSourcePlayerHead_c::startVoiceLine(u32 id) {
// id might be a sound ID, or it might be the ID of one of our RNGs
if (id > LABEL_LV_START && id < LABEL_LV_END) {
return startVoiceSoundInternal(id);
}
if (id >= SND_LV_MAX) {
return false;
}
if (checkFlag(1)) {
switch (id) {
case SND_LV_JUMP_S:
case SND_LV_SHOOT_START:
case SND_LV_SHOOT_SLOPE:
case SND_LV_RUN_UP:
case SND_LV_CLIMB_STEP:
case SND_LV_BACKFLIP:
case SND_LV_CLIMB_WALL: {
id = SND_LV_QUIETLY_S;
break;
}
case SND_LV_JUMP_M:
case SND_LV_JUMP_L:
case SND_LV_ZENTEN: {
id = SND_LV_QUIETLY_M;
break;
}
case SND_LV_GRAB:
case SND_LV_HUNG: {
return false;
}
}
}
f32 stamina = daPlayerActBase_c::getStamina();
switch (id) {
case SND_LV_TIRED_S_1: {
if (stamina < 0.25) {
id = SND_LV_TIRED_L;
} else if (stamina < 0.5) {
id = SND_LV_TIRED_M;
} else if (stamina < 0.8) {
id = SND_LV_TIRED_S_2;
} else {
return false;
}
break;
}
case SND_LV_CLIMB_TIRED_S_1: {
if (stamina < 0.125) {
id = SND_LV_CLIMB_TIRED_L;
} else if (stamina < 0.375) {
id = SND_LV_CLIMB_TIRED_M;
} else {
return false;
}
break;
}
case SND_LV_LIFT_TIRED_S_1: {
if (stamina < 0.125) {
id = SND_LV_LIFT_TIRED_L;
} else if (stamina < 0.375) {
id = SND_LV_LIFT_TIRED_M;
} else {
return false;
}
break;
}
case SND_LV_TIRED_RECOVER: {
if (stamina > 0.75) {
id = SND_LV_TIRED_RECOVER_S;
} else if (stamina > 0.5) {
id = SND_LV_TIRED_RECOVER_M;
} else if (stamina > 0.375) {
id = SND_LV_TIRED_RECOVER_L;
}
break;
}
case SND_LV_BREATH_TIRED_S_1: {
if (stamina <= 0.0f) {
id = SND_LV_BREATH_TIRED_L;
} else if (stamina < 0.125) {
id = SND_LV_BREATH_TIRED_M;
} else if (stamina < 0.25) {
id = SND_LV_BREATH_TIRED_S_2;
} else {
return false;
}
break;
}
case SND_LV_BADSMELL_TIRED_S_1: {
if (stamina < 0.125) {
id = SND_LV_BADSMELL_TIRED_L;
} else if (stamina < 0.375) {
id = SND_LV_BADSMELL_TIRED_M;
} else if (stamina < 0.99) {
id = SND_LV_BADSMELL_TIRED_S_2;
} else {
return false;
}
break;
}
case SND_LV_DIE_WATER:
case SND_LV_DAMAGE_WATER_M:
case SND_LV_DAMAGE_WATER_S:
case SND_LV_DAMAGE_ELEC_W: startSound(SE_L_WATER_AIR_OUT); break;
}
if (mLastPlayedSound != SND_LV_MAX && isPlayingActionSound()) {
s32 oldPriority = mLinkVoiceRngs[mLastPlayedSound].getPriority();
s32 newPriority = mLinkVoiceRngs[id].getPriority();
if (oldPriority > newPriority) {
return false;
}
if (oldPriority == newPriority && !mLinkVoiceRngs[id].getPriorityTiebreaker()) {
return false;
}
}
field_0x22A0 = id;
bool ok = mLinkVoiceRngs[id].doRndIdNoReuse();
if (ok) {
mLastPlayedSound = id;
}
return ok;
}
bool dSndSourcePlayerHead_c::startVoiceSoundInternal(u32 id) {
bool ok = false;
// @bug shouldn't this be > and < ?
if (id >= LABEL_LV_START && id <= LABEL_LV_END) {
ok = startSound(id, &mSoundHandle) != nullptr;
field_0x22A0 = SND_LV_MAX;
}
return ok;
}