From 44e2c2695a8026a3dfc76b4a593cd5d6576f4382 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sat, 6 Jul 2024 01:47:05 -0400 Subject: [PATCH] JAIZelSound OK --- configure.py | 2 +- include/JAZelAudio/JAIZelBasic.h | 8 +- include/JAZelAudio/JAIZelSound.h | 8 +- include/JSystem/JAudio/JAIGlobalParameter.h | 7 ++ include/JSystem/JAudio/JAISound.h | 22 ++-- src/JAZelAudio/JAIZelBasic.cpp | 126 ++++++++++---------- src/JAZelAudio/JAIZelSound.cpp | 101 ++++++++++++++-- 7 files changed, 184 insertions(+), 90 deletions(-) diff --git a/configure.py b/configure.py index 8d3503d72..e4ece5edd 100644 --- a/configure.py +++ b/configure.py @@ -797,7 +797,7 @@ config.libs = [ Object(Matching, "JAZelAudio/JAIZelParam.cpp"), Object(NonMatching, "JAZelAudio/JAIZelCharVoiceTable.cpp"), Object(Matching, "JAZelAudio/JAIZelScene.cpp"), - Object(NonMatching, "JAZelAudio/JAIZelSound.cpp"), + Object(Matching, "JAZelAudio/JAIZelSound.cpp"), ], ), DolphinLib( diff --git a/include/JAZelAudio/JAIZelBasic.h b/include/JAZelAudio/JAIZelBasic.h index 166729939..cc38a7ab1 100644 --- a/include/JAZelAudio/JAIZelBasic.h +++ b/include/JAZelAudio/JAIZelBasic.h @@ -195,6 +195,8 @@ public: static const char* spot_dir_name[]; static isle_area_s mIsleArea[]; + static const int MAX_CONCURRENT_SE_NUM = 24; + /* 0x0020 */ u8 field_0x0020; /* 0x0021 */ u8 field_0x0021; /* 0x0022 */ u8 field_0x0022[0x0024 - 0x0022]; @@ -278,9 +280,9 @@ public: /* 0x00CE */ u8 field_0x00ce; /* 0x00CF */ u8 field_0x00CF[0x00D0 - 0x00CF]; /* 0x00D0 */ int field_0x00d0; - /* 0x00D4 */ JAISound* field_0x00d4[24]; - /* 0x0134 */ u32 field_0x0134[24]; - /* 0x0194 */ u32 field_0x0194[24]; + /* 0x00D4 */ JAISound* mpSeSound[MAX_CONCURRENT_SE_NUM]; + /* 0x0134 */ u32 mpSeNum[MAX_CONCURRENT_SE_NUM]; + /* 0x0194 */ u32 field_0x0194[MAX_CONCURRENT_SE_NUM]; /* 0x01F4 */ int field_0x01f4; /* 0x01F8 */ u8 field_0x01f8; /* 0x01F9 */ u8 field_0x01f9; diff --git a/include/JAZelAudio/JAIZelSound.h b/include/JAZelAudio/JAIZelSound.h index a97901173..bdd70210e 100644 --- a/include/JAZelAudio/JAIZelSound.h +++ b/include/JAZelAudio/JAIZelSound.h @@ -8,10 +8,10 @@ public: JAIZelSound(); ~JAIZelSound() {} - f32 setDistanceVolumeCommon(f32, u8); - void setSeDistanceVolume(u8); - void setSeDistancePan(u8); - void setSeDistanceDolby(u8); + virtual f32 setDistanceVolumeCommon(f32, u8); + virtual void setSeDistanceVolume(u8); + virtual void setSeDistancePan(u8); + virtual void setSeDistanceDolby(u8); }; #endif /* JAIZELSOUND_H */ diff --git a/include/JSystem/JAudio/JAIGlobalParameter.h b/include/JSystem/JAudio/JAIGlobalParameter.h index a7fb8b2ad..a07201542 100644 --- a/include/JSystem/JAudio/JAIGlobalParameter.h +++ b/include/JSystem/JAudio/JAIGlobalParameter.h @@ -4,6 +4,13 @@ #include "dolphin/types.h" namespace JAIGlobalParameter { + inline void getPointerDistanceMax() {} + inline void getPointerMaxVolumeDistance() {} + inline void getPointerMinDistanceVolume() {} + inline void getPointerSeDolbyBehindDistanceMax() {} + inline void getPointerSeDolbyCenterValue() {} + inline void getPointerSeDolbyFrontDistanceMax() {} + void setParamInitDataPointer(void*); void setParamInterfaceHeapSize(u32); void setParamSoundSceneMax(u32); diff --git a/include/JSystem/JAudio/JAISound.h b/include/JSystem/JAudio/JAISound.h index 6be4b0552..f9a928d21 100644 --- a/include/JSystem/JAudio/JAISound.h +++ b/include/JSystem/JAudio/JAISound.h @@ -12,6 +12,14 @@ namespace JAInter { class JAISound { public: + struct PositionInfo_t { + /* 0x00 */ f32 field_0x0; + /* 0x04 */ u8 field_0x4[0x8 - 0x4]; + /* 0x08 */ f32 field_0x8; + /* 0x0C */ u8 field_0xc[0x18 - 0xc]; + /* 0x10 */ f32 field_0x18; + }; + JAISound(); virtual f32 setPositionDopplarCommon(u32); virtual f32 setDistanceVolumeCommon(f32, u8); @@ -83,7 +91,7 @@ public: void getNextSound() {} void getPlayGameFrameCounter() {} void getPlayer() {} - void getPositionInfo() {} + PositionInfo_t* getPositionInfo() { return mPositionInfo; } void getPrevSound() {} void getPriority() {} void getStatus() {} @@ -112,14 +120,6 @@ public: void setVolumeU7(u8, u32, u8) {} void setWait(u8) {} - struct PositionInfo_t { - f32 field_0x0; - u8 field_0x4[0x8 - 0x4]; - f32 field_0x8; - u8 field_0xc[0x18 - 0xc]; - f32 field_0x18; - }; - /* 0x04 */ u8 field_0x4; /* 0x05 */ u8 field_0x5; /* 0x06 */ u8 field_0x6; @@ -130,11 +130,11 @@ public: /* 0x0c */ u32 mSoundID; /* 0x10 */ int field_0x10; /* 0x14 */ u32 field_0x14; - /* 0x18 */ int field_0x18; + /* 0x18 */ u32 field_0x18; /* 0x1c */ int field_0x1c; /* 0x20 */ PositionInfo_t* mPositionInfo; /* 0x24 */ void* field_0x24; - /* 0x28 */ int field_0x28; + /* 0x28 */ u32 field_0x28; /* 0x2C */ int field_0x2c; /* 0x30 */ JAISound* field_0x30; /* 0x34 */ JAISound* field_0x34; diff --git a/src/JAZelAudio/JAIZelBasic.cpp b/src/JAZelAudio/JAIZelBasic.cpp index a4de82845..085fc18e7 100644 --- a/src/JAZelAudio/JAIZelBasic.cpp +++ b/src/JAZelAudio/JAIZelBasic.cpp @@ -185,11 +185,11 @@ void JAIZelBasic::gframeProcess() { /* 802A30A4-802A31C0 .text resetProcess__11JAIZelBasicFv */ void JAIZelBasic::resetProcess() { OSReport("[JAIZelBasic::resetProcess]\n"); - for (int i = 0; i < 24; i++) { - if (field_0x00d4[i]) { - field_0x00d4[i]->stop(1); - field_0x00d4[i] = NULL; - field_0x0134[i] = 0; + for (int i = 0; i < MAX_CONCURRENT_SE_NUM; i++) { + if (mpSeSound[i]) { + mpSeSound[i]->stop(1); + mpSeSound[i] = NULL; + mpSeNum[i] = 0; field_0x0194[i] = 0; } } @@ -648,9 +648,9 @@ void JAIZelBasic::initSe() { mAudioCamera->field_0x4 = NULL; mAudioCamera->field_0x8 = NULL; field_0x01f4 = 0; - for (int i = 0; i < 24; i++) { - field_0x00d4[i] = NULL; - field_0x0134[i] = 0; + for (int i = 0; i < MAX_CONCURRENT_SE_NUM; i++) { + mpSeSound[i] = NULL; + mpSeNum[i] = 0; field_0x0194[i] = 0; } for (int i = 0; i < 4; i++) { @@ -702,11 +702,11 @@ void JAIZelBasic::seStop(u32 i_seNum, s32 param_2) { if (i_seNum == JA_SE_LK_RUN_SLIP) { param_2 = 8; } - for (int i = 0; i < 24; i++) { - if (field_0x0134[i] == i_seNum && field_0x00d4[i]) { - field_0x00d4[i]->stop(param_2); - field_0x00d4[i] = NULL; - field_0x0134[i] = 0; + for (int i = 0; i < MAX_CONCURRENT_SE_NUM; i++) { + if (mpSeNum[i] == i_seNum && mpSeSound[i]) { + mpSeSound[i]->stop(param_2); + mpSeSound[i] = NULL; + mpSeNum[i] = 0; field_0x0194[i] = 0; } } @@ -714,8 +714,8 @@ void JAIZelBasic::seStop(u32 i_seNum, s32 param_2) { /* 802A85F4-802A8634 .text checkSePlaying__11JAIZelBasicFUl */ BOOL JAIZelBasic::checkSePlaying(u32 param_1) { - for (int i = 0; i < 24; i++) { - if (field_0x0134[i] == param_1 && field_0x00d4[i]) { + for (int i = 0; i < MAX_CONCURRENT_SE_NUM; i++) { + if (mpSeNum[i] == param_1 && mpSeSound[i]) { return true; } } @@ -1139,9 +1139,9 @@ BOOL JAIZelBasic::getMapInfoGround(u32) { } /* 802AA390-802AACE8 .text setScene__11JAIZelBasicFllll */ -void JAIZelBasic::setScene(s32 param_1, s32 roomNo, s32 param_3, s32 layerNo) { - OSReport("[JAIZelBasic::setScene] num = %d, start = %d, layer = %d (%d)\n", param_1, roomNo, layerNo, param_3); - if (param_1 >= 0x79) { +void JAIZelBasic::setScene(s32 sceneNum, s32 roomNo, s32 param_3, s32 layerNo) { + OSReport("[JAIZelBasic::setScene] num = %d, start = %d, layer = %d (%d)\n", sceneNum, roomNo, layerNo, param_3); + if (sceneNum >= 0x79) { OSReport("[JAIZelBasic::setScene] too large scene number\n"); return; } @@ -1152,7 +1152,7 @@ void JAIZelBasic::setScene(s32 param_1, s32 roomNo, s32 param_3, s32 layerNo) { field_0x00bd = field_0x00cd = bgmNum = 0; u32 var1; u32 var2; - if (param_1 == 0x12) { + if (sceneNum == 0x12) { if (roomNo > 0) { mIslandRoomNo = roomNo; } else { @@ -1206,11 +1206,11 @@ void JAIZelBasic::setScene(s32 param_1, s32 roomNo, s32 param_3, s32 layerNo) { var2 = m_isle_info[mIslandRoomNo].field_0x3; } else { mIslandRoomNo = 0; - if (param_1 == 16 && checkEventBit(0x280) == 0) { + if (sceneNum == 16 && checkEventBit(0x280) == 0) { bgmNum = JA_BGM_FIND_TETRA; - } else if (param_1 == 19 && checkEventBit(0x801) == 0) { + } else if (sceneNum == 19 && checkEventBit(0x801) == 0) { bgmNum = 0; - } else if (param_1 == 2 && field_0x0021 != 0) { + } else if (sceneNum == 2 && field_0x0021 != 0) { if (dComIfGs_isStageBossDemoSaveBit(dSv_save_c::STAGE_DRC)) { field_0x00cd = 1; } @@ -1219,10 +1219,10 @@ void JAIZelBasic::setScene(s32 param_1, s32 roomNo, s32 param_3, s32 layerNo) { bgmNum = expandSceneBgmNum(bgmNum); field_0x0204 = 1; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 7 && field_0x0021 != 0) { + } else if (sceneNum == 7 && field_0x0021 != 0) { if (dComIfGs_isStageBossDemoSaveBit(dSv_save_c::STAGE_FW)) { field_0x00cd = 1; } @@ -1230,10 +1230,10 @@ void JAIZelBasic::setScene(s32 param_1, s32 roomNo, s32 param_3, s32 layerNo) { bgmNum = m_scene_info[3].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 37 && field_0x0021 != 0) { + } else if (sceneNum == 37 && field_0x0021 != 0) { if (dComIfGs_isStageBossDemoSaveBit(dSv_save_c::STAGE_TOTG)) { field_0x00cd = 1; } @@ -1241,10 +1241,10 @@ void JAIZelBasic::setScene(s32 param_1, s32 roomNo, s32 param_3, s32 layerNo) { bgmNum = m_scene_info[10].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 24 && field_0x0021 != 0) { + } else if (sceneNum == 24 && field_0x0021 != 0) { if (dComIfGs_isStageBossDemoSaveBit(dSv_save_c::STAGE_WT)) { field_0x00cd = 1; } @@ -1253,10 +1253,10 @@ void JAIZelBasic::setScene(s32 param_1, s32 roomNo, s32 param_3, s32 layerNo) { } else if (dComIfGs_isStageBossEnemySaveBit(dSv_save_c::STAGE_WT)) { bgmNum = 0; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 45 && field_0x0021 != 0) { + } else if (sceneNum == 45 && field_0x0021 != 0) { if (dComIfGs_isStageBossDemoSaveBit(dSv_save_c::STAGE_ET)) { field_0x00cd = 1; } @@ -1265,93 +1265,93 @@ void JAIZelBasic::setScene(s32 param_1, s32 roomNo, s32 param_3, s32 layerNo) { } else if (dComIfGs_isStageBossEnemySaveBit(dSv_save_c::STAGE_ET)) { bgmNum = 0; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 54) { + } else if (sceneNum == 54) { if (checkEventBit(0x2d04) == 0) { bgmNum = JA_BGM_HYRULE_OFF; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 53) { + } else if (sceneNum == 53) { if (layerNo == 8 || layerNo == 9 || layerNo == 10 || layerNo == 11) { bgmNum = 0; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 54) { + } else if (sceneNum == 54) { if (layerNo == 8 || layerNo == 9 || layerNo == 10 || layerNo == 11) { bgmNum = 0; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 89) { + } else if (sceneNum == 89) { if (layerNo == 8 || layerNo == 9 || layerNo == 10 || layerNo == 11) { bgmNum = 0; } else if (checkEventBit(0x2d04) == 0) { bgmNum = JA_BGM_HYRULE_OFF; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 39) { + } else if (sceneNum == 39) { if (layerNo == 8 || layerNo == 9 || layerNo == 10 || layerNo == 11) { bgmNum = 0; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 41) { + } else if (sceneNum == 41) { if (layerNo == 8 || layerNo == 9 || layerNo == 10 || layerNo == 11) { bgmNum = 0; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 22) { + } else if (sceneNum == 22) { if (layerNo == 8 || layerNo == 9 || layerNo == 10 || layerNo == 11) { bgmNum = 0; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 44) { + } else if (sceneNum == 44) { if (layerNo == 8 || layerNo == 9 || layerNo == 10 || layerNo == 11) { bgmNum = 0; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 11) { + } else if (sceneNum == 11) { if (layerNo == 9 && field_0x0043 == 0) { bgmNum = 0; } else if (field_0x0043 && checkEventBit(0x2a20) == 0) { bgmNum = JA_BGM_BAACHAN; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - } else if (param_1 == 32) { + } else if (sceneNum == 32) { if (checkEventBit(0x2110) == 0 && checkEventBit(dSv_evtBit_c::ENDLESS_NIGHT) == 1) { bgmNum = JA_BGM_PIRATE_DEMO5; } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } } else { - bgmNum = m_scene_info[param_1].bgmNum; + bgmNum = m_scene_info[sceneNum].bgmNum; bgmNum = expandSceneBgmNum(bgmNum); } - var1 = m_scene_info[param_1].field_0x2; - var2 = m_scene_info[param_1].field_0x3; + var1 = m_scene_info[sceneNum].field_0x2; + var2 = m_scene_info[sceneNum].field_0x3; } sceneChange(bgmNum, var1, var2, param_3); field_0x022d = 0; - field_0x0220 = param_1; + field_0x0220 = sceneNum; field_0x022c = 1; field_0x0239 = layerNo; } @@ -1393,13 +1393,13 @@ BOOL JAIZelBasic::checkLinkOnBoardSea() { /* 802AAD94-802AAE80 .text setSceneName__11JAIZelBasicFPcll */ void JAIZelBasic::setSceneName(char* param_1, s32 roomNo, s32 param_3) { OSReport("[JAIZelBasic::setSceneName] spot = %s, room = %d\n", param_1, roomNo); - int id = spotNameToId(param_1); - if (id == 0x75) { - for (int i = 0; i < 24; i++) { - if (field_0x00d4[i]) { - field_0x00d4[i]->stop(1); - field_0x00d4[i] = NULL; - field_0x0134[i] = 0; + s32 sceneNum = spotNameToId(param_1); + if (sceneNum == 0x75) { + for (int i = 0; i < MAX_CONCURRENT_SE_NUM; i++) { + if (mpSeSound[i]) { + mpSeSound[i]->stop(1); + mpSeSound[i] = NULL; + mpSeNum[i] = 0; field_0x0194[i] = 0; } } @@ -1411,7 +1411,7 @@ void JAIZelBasic::setSceneName(char* param_1, s32 roomNo, s32 param_3) { } else { field_0x0066 = 0; } - setScene(id, roomNo, 0, param_3); + setScene(sceneNum, roomNo, 0, param_3); } /* 802AAE80-802AAF04 .text spotNameToId__11JAIZelBasicFPc */ diff --git a/src/JAZelAudio/JAIZelSound.cpp b/src/JAZelAudio/JAIZelSound.cpp index 298522ff1..1bcc87b02 100644 --- a/src/JAZelAudio/JAIZelSound.cpp +++ b/src/JAZelAudio/JAIZelSound.cpp @@ -4,26 +4,111 @@ // #include "JAZelAudio/JAIZelSound.h" +#include "JSystem/JAudio/JAIGlobalParameter.h" /* 802AEF64-802AEFA0 .text __ct__11JAIZelSoundFv */ JAIZelSound::JAIZelSound() {} /* 802AEFA0-802AF19C .text setDistanceVolumeCommon__11JAIZelSoundFfUc */ -f32 JAIZelSound::setDistanceVolumeCommon(f32, u8) { - /* Nonmatching */ +f32 JAIZelSound::setDistanceVolumeCommon(f32 f30, u8 r31) { + f32 f31; + if (field_0x8 != 4) { + f31 = getPositionInfo()[field_0x8].field_0x18; + } else { + f31 = getPositionInfo()[0].field_0x18; + for (u8 i = 1; i < JAIGlobalParameter::getParamAudioCameraMax(); i++) { + if (getPositionInfo()[i].field_0x18 < f31) { + f31 = getPositionInfo()[i].field_0x18; + } + } + } + + if (f31 < JAIGlobalParameter::getParamMaxVolumeDistance()) { + return 1.0f; + } + + f31 -= JAIGlobalParameter::getParamMaxVolumeDistance(); + f30 -= JAIGlobalParameter::getParamMaxVolumeDistance(); + + if (r31 > 7) { + f30 *= (1 << (r31 - 4)); + } else if (r31 > 3) { + f30 /= (1 << ((r31 & 3) + 1)); + } else if (r31 != 0) { + f30 *= (1 << (r31 & 3)); + } + if (f31 < f30) { + if (r31 > 3 && r31 <= 7) { + return 1.0f - (f31 / f30); + } + return ( + JAIGlobalParameter::getParamMinDistanceVolume() + + (1.0f - (f31 / f30)) * + (1.0f - JAIGlobalParameter::getParamMinDistanceVolume()) + ); + } + + if (r31 > 3 && r31 <= 7) { + return 0.0f; + } + return JAIGlobalParameter::getParamMinDistanceVolume(); } /* 802AF19C-802AF2A0 .text setSeDistanceVolume__11JAIZelSoundFUc */ -void JAIZelSound::setSeDistanceVolume(u8) { - /* Nonmatching */ +void JAIZelSound::setSeDistanceVolume(u8 r30) { + if ((getSwBit() & 0x00400000) && field_0x18 > 1) { + return; + } + f32 f31; + if ((getSwBit() & 0x00000002) == 0) { + u8 r31; + if ((getSwBit() & 0x00300000)) { + r31 = ((getSwBit() >> 20) & 3) + 7; + } else { + r31 = ((getSwBit() >> 16) & 7); + } + f31 = setDistanceVolumeCommon(JAIGlobalParameter::getParamDistanceMax(), r31); + if ((getSwBit() & 0x01000000) && f31 <= 0.3333f) { + f31 = 0.3333f; + } + } else { + f31 = 1.0f; + } + setSeInterVolume(4, f31, r30, 0); } /* 802AF2A0-802AF314 .text setSeDistancePan__11JAIZelSoundFUc */ -void JAIZelSound::setSeDistancePan(u8) { - /* Nonmatching */ +void JAIZelSound::setSeDistancePan(u8 r31) { + if ((getSwBit() & 0x00800000) && field_0x18 > 1) { + return; + } + setSeInterPan(4, setDistancePanCommon(), r31, 0); } /* 802AF314-802AF458 .text setSeDistanceDolby__11JAIZelSoundFUc */ -void JAIZelSound::setSeDistanceDolby(u8) { - /* Nonmatching */ +void JAIZelSound::setSeDistanceDolby(u8 r30) { + if ((getSwBit() & 0x00800000) && field_0x18 > 1) { + return; + } + + PositionInfo_t* posInf = &getPositionInfo()[0]; + f32 f0; + if (field_0x28 == 0 || posInf->field_0x8 < JAIGlobalParameter::getParamSeDolbyFrontDistanceMax()) { + f0 = 0.0f; + } else if (posInf->field_0x8 < 0.0f) { + f0 = ( + JAIGlobalParameter::getParamSeDolbyCenterValue() * + (JAIGlobalParameter::getParamSeDolbyFrontDistanceMax() - posInf->field_0x8) + ) / JAIGlobalParameter::getParamSeDolbyFrontDistanceMax(); + } else if (posInf->field_0x8 < JAIGlobalParameter::getParamSeDolbyBehindDistanceMax()) { + f0 = JAIGlobalParameter::getParamSeDolbyCenterValue() + ( + (127.0f - JAIGlobalParameter::getParamSeDolbyCenterValue()) * + (posInf->field_0x8 / JAIGlobalParameter::getParamSeDolbyBehindDistanceMax()) + ); + } else { + f0 = 127.0f; + } + + u8 r0 = f0; + setSeInterDolby(4, r0 / 127.0f, r30, 0); }