mirror of https://github.com/zeldaret/tp.git
260 lines
8.4 KiB
C++
260 lines
8.4 KiB
C++
/**
|
|
* d_envse.cpp
|
|
* Environment Sound Effects handler
|
|
*/
|
|
|
|
#include "d/d_envse.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_path.h"
|
|
#include "string.h"
|
|
|
|
/* 80182DD4-80182DDC 17D714 0008+00 1/0 0/0 0/0 .text dEnvSe_Draw__FP8dEnvSe_c */
|
|
static int dEnvSe_Draw(dEnvSe_c* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
/* 80182DDC-80182FD8 17D71C 01FC+00 1/1 0/0 0/0 .text dEnvSe_getNearPathPos__FP4cXyzP4cXyzP5dPath
|
|
*/
|
|
static void dEnvSe_getNearPathPos(cXyz* param_0, cXyz* param_1, dPath* i_path) {
|
|
int var_r31 = 0;
|
|
BOOL sp10[2] = {0, 0};
|
|
f32 sp8;
|
|
|
|
f32 var_f31 = FLT_MAX;
|
|
|
|
int i;
|
|
dStage_dPnt_c* point_p = i_path->m_points;
|
|
|
|
cXyz sp3C[2];
|
|
cM3dGLin sp14;
|
|
|
|
for (i = 0; i < i_path->m_num; i++) {
|
|
sp8 = cM3d_LenSq(param_1, &point_p->m_position);
|
|
if (var_f31 > sp8) {
|
|
var_f31 = sp8;
|
|
var_r31 = i;
|
|
}
|
|
|
|
point_p++;
|
|
}
|
|
|
|
point_p = &i_path->m_points[var_r31];
|
|
if (var_r31 != 0) {
|
|
sp14.set(point_p[-1].m_position, point_p[0].m_position);
|
|
sp10[0] = cM3d_Len3dSqPntAndSegLine(&sp14, param_1, &sp3C[0], &sp8);
|
|
}
|
|
|
|
if (var_r31 != i_path->m_num - 1) {
|
|
sp14.set(point_p[0].m_position, point_p[1].m_position);
|
|
sp10[1] = cM3d_Len3dSqPntAndSegLine(&sp14, param_1, &sp3C[1], &sp8);
|
|
}
|
|
|
|
if (sp10[0]) {
|
|
if (sp10[1]) {
|
|
if (cM3d_LenSq(&sp3C[1], param_1) > sp8) {
|
|
*param_0 = sp3C[0];
|
|
} else {
|
|
*param_0 = sp3C[1];
|
|
}
|
|
} else {
|
|
*param_0 = sp3C[0];
|
|
}
|
|
} else if (sp10[1]) {
|
|
*param_0 = sp3C[1];
|
|
} else {
|
|
param_0->set(point_p[0].m_position);
|
|
}
|
|
}
|
|
|
|
/* 80182FD8-80183480 17D918 04A8+00 1/1 0/0 0/0 .text
|
|
* execute_common__8dEnvSe_cFP18dStage_SoundInfo_cPScUc */
|
|
int dEnvSe_c::execute_common(dStage_SoundInfo_c* i_soundInf, s8* param_1, u8 param_2) {
|
|
s32 roomNo = dComIfGp_roomControl_getStayNo();
|
|
int path_roomNo = dComIfGp_roomControl_getStayNo();
|
|
BOOL var_r25 = false;
|
|
|
|
if (i_soundInf == NULL) {
|
|
return 1;
|
|
}
|
|
|
|
int i = i_soundInf->num;
|
|
stage_sound_data* data_p = i_soundInf->entries;
|
|
|
|
cXyz cam_eye = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0))->mCamera.Eye();
|
|
|
|
if (param_2 == 0) {
|
|
path_roomNo = -1;
|
|
}
|
|
|
|
for (; i != 0; i--) {
|
|
if (memcmp(data_p->field_0x0, "sndtag", 6) == 0) {
|
|
if (!(*param_1 & 1)) {
|
|
if (data_p->field_0x17 != 0) {
|
|
mDoAud_mEnvse_initStaticEnvSe(data_p->field_0x17, data_p->field_0x14,
|
|
data_p->field_0x19, data_p->field_0x1a,
|
|
&data_p->field_0x8);
|
|
}
|
|
*param_1 |= 1;
|
|
}
|
|
|
|
if (!var_r25) {
|
|
mDoAud_mEnvse_startStaticEnvSe(dComIfGp_getReverb(roomNo));
|
|
}
|
|
var_r25 = true;
|
|
} else if (data_p->field_0x17 < 8) {
|
|
if (!(*param_1 & 2)) {
|
|
mDoAud_mEnvse_initRiverSe(data_p->field_0x17, data_p->field_0x14,
|
|
data_p->field_0x19, data_p->field_0x1a);
|
|
*param_1 |= 2;
|
|
}
|
|
|
|
for (dPath* path_p = dPath_GetRoomPath(data_p->field_0x18, path_roomNo); path_p != NULL;
|
|
path_p = dPath_GetNextRoomPath(path_p, path_roomNo))
|
|
{
|
|
dEnvSe_getNearPathPos(&mPos, &cam_eye, path_p);
|
|
mDoAud_mEnvse_registRiverSePos(&mPos);
|
|
}
|
|
|
|
mDoAud_mEnvse_startRiverSe(dComIfGp_getReverb(roomNo));
|
|
} else if (data_p->field_0x17 < 16) {
|
|
cXyz sp14;
|
|
f32 fvar12 = FLT_MAX;
|
|
|
|
if (!(*param_1 & 4)) {
|
|
mDoAud_mEnvse_initFallSe(data_p->field_0x17, data_p->field_0x14, data_p->field_0x19,
|
|
data_p->field_0x1a);
|
|
*param_1 |= 4;
|
|
}
|
|
|
|
mPos = cam_eye;
|
|
|
|
for (dPath* path_p = dPath_GetRoomPath(data_p->field_0x18, path_roomNo); path_p != NULL;
|
|
path_p = dPath_GetNextRoomPath(path_p, path_roomNo))
|
|
{
|
|
dEnvSe_getNearPathPos(&sp14, &cam_eye, path_p);
|
|
|
|
f32 fvar11 = cM3d_LenSq(&sp14, &cam_eye);
|
|
if (fvar11 < fvar12) {
|
|
fvar12 = fvar11;
|
|
mPos = sp14;
|
|
}
|
|
|
|
mDoAud_mEnvse_registFallSePos(&sp14);
|
|
}
|
|
|
|
mDoAud_mEnvse_startFallSe(dComIfGp_getReverb(roomNo));
|
|
} else if (data_p->field_0x17 < 32) {
|
|
if (!(*param_1 & 8)) {
|
|
mDoAud_mEnvse_initSmellSe(data_p->field_0x17, data_p->field_0x14,
|
|
data_p->field_0x19, data_p->field_0x1a);
|
|
*param_1 |= 8;
|
|
}
|
|
|
|
for (dPath* path_p = dPath_GetRoomPath(data_p->field_0x18, path_roomNo); path_p != NULL;
|
|
path_p = dPath_GetNextRoomPath(path_p, path_roomNo))
|
|
{
|
|
dEnvSe_getNearPathPos(&mPos, &cam_eye, path_p);
|
|
mDoAud_mEnvse_registSmellSePos(&mPos);
|
|
}
|
|
|
|
mDoAud_mEnvse_startSmellSe(dComIfGp_getReverb(roomNo));
|
|
} else if (data_p->field_0x17 < 64) {
|
|
for (dPath* path_p = dPath_GetRoomPath(data_p->field_0x18, path_roomNo); path_p != NULL;
|
|
path_p = dPath_GetNextRoomPath(path_p, path_roomNo))
|
|
{
|
|
dEnvSe_getNearPathPos(&mPos, &cam_eye, path_p);
|
|
mDoAud_mEnvse_registWindowPos(&mPos);
|
|
}
|
|
} else if (data_p->field_0x17 >= 100) {
|
|
if (!((field_0x108 >> i) & 1)) {
|
|
mDoAud_initLv3WaterSe(data_p->field_0x17, data_p->field_0x14, data_p->field_0x19,
|
|
data_p->field_0x1a);
|
|
field_0x108 |= (1 << i);
|
|
}
|
|
|
|
for (dPath* path_p = dPath_GetRoomPath(data_p->field_0x18, path_roomNo); path_p != NULL;
|
|
path_p = dPath_GetNextRoomPath(path_p, path_roomNo))
|
|
{
|
|
dEnvSe_getNearPathPos(&mPos, &cam_eye, path_p);
|
|
mDoAud_registLv3WaterSePos(data_p->field_0x17, &mPos);
|
|
}
|
|
|
|
mDoAud_startLv3WaterSe(dComIfGp_getReverb(roomNo));
|
|
}
|
|
data_p++;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80183480-801835A0 17DDC0 0120+00 1/1 0/0 0/0 .text execute__8dEnvSe_cFv */
|
|
int dEnvSe_c::execute() {
|
|
s32 roomNo = dComIfGp_roomControl_getStayNo();
|
|
dStage_roomDt_c* roomDt_p = &dComIfGp_roomControl_getStatusRoomDt(roomNo)->mRoomDt;
|
|
|
|
if (roomDt_p == NULL) {
|
|
return 1;
|
|
}
|
|
|
|
if (mRoomNo != roomNo) {
|
|
field_0xfc = 0;
|
|
field_0xfd = 0;
|
|
field_0x108 = 0;
|
|
mRoomNo = roomNo;
|
|
}
|
|
|
|
execute_common(roomDt_p->getSoundInfCL(), &field_0xfc, 1);
|
|
execute_common(roomDt_p->getSoundInf(), &field_0xfd, 1);
|
|
execute_common(dComIfGp_getStage()->getSoundInfCL(), &field_0xfe, 0);
|
|
|
|
return execute_common(dComIfGp_getStage()->getSoundInf(), &field_0xff, 0);
|
|
}
|
|
|
|
/* 801835A0-801835C0 17DEE0 0020+00 1/0 0/0 0/0 .text dEnvSe_Execute__FP8dEnvSe_c */
|
|
static int dEnvSe_Execute(dEnvSe_c* i_this) {
|
|
return i_this->execute();
|
|
}
|
|
|
|
/* 801835C0-801835C8 17DF00 0008+00 1/0 0/0 0/0 .text dEnvSe_IsDelete__FP8dEnvSe_c */
|
|
static int dEnvSe_IsDelete(dEnvSe_c* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
/* 801835C8-801835D0 17DF08 0008+00 1/0 0/0 0/0 .text dEnvSe_Delete__FP8dEnvSe_c */
|
|
static int dEnvSe_Delete(dEnvSe_c* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
/* 801835D0-801835F8 17DF10 0028+00 1/0 0/0 0/0 .text dEnvSe_Create__FP8dEnvSe_c */
|
|
static int dEnvSe_Create(dEnvSe_c* i_this) {
|
|
i_this->field_0xfc = 0;
|
|
i_this->field_0xfd = 0;
|
|
i_this->field_0xfe = 0;
|
|
i_this->field_0xff = 0;
|
|
i_this->mRoomNo = 0xFF;
|
|
i_this->field_0x108 = 0;
|
|
|
|
return cPhs_COMPLEATE_e;
|
|
}
|
|
|
|
/* 803BA808-803BA81C -00001 0014+00 1/0 0/0 0/0 .data l_dEnvSe_Method */
|
|
static leafdraw_method_class l_dEnvSe_Method = {
|
|
(process_method_func)dEnvSe_Create, (process_method_func)dEnvSe_Delete,
|
|
(process_method_func)dEnvSe_Execute, (process_method_func)dEnvSe_IsDelete,
|
|
(process_method_func)dEnvSe_Draw,
|
|
};
|
|
|
|
/* 803BA81C-803BA848 -00001 0028+04 0/0 0/0 1/0 .data g_profile_ENVSE */
|
|
extern kankyo_process_profile_definition g_profile_ENVSE = {
|
|
fpcLy_CURRENT_e,
|
|
2,
|
|
fpcPi_CURRENT_e,
|
|
PROC_ENVSE,
|
|
&g_fpcLf_Method.mBase,
|
|
sizeof(dEnvSe_c),
|
|
0,
|
|
0,
|
|
&g_fopKy_Method,
|
|
689,
|
|
&l_dEnvSe_Method,
|
|
}; |