d_envse mostly OK. more work on kankyo_rain (#1969)

* d_envse OK, work on kankyo_rain

* remove asm
This commit is contained in:
TakaRikka
2023-10-25 13:16:56 -07:00
committed by GitHub
parent 95d103b237
commit e2d51bf956
19 changed files with 878 additions and 567 deletions
+89 -9
View File
@@ -5,16 +5,9 @@
#include "d/bg/d_bg_w_kcol.h"
#include "d/bg/d_bg_pc.h"
#include "d/com/d_com_inf_game.h"
#include "dol2asm.h"
//
// Types:
//
struct cM3dGTri {
/* 8026F8C8 */ void set(Vec const*, Vec const*, Vec const*, Vec const*);
};
//
// Forward References:
//
@@ -133,7 +126,6 @@ extern "C" void _restgpr_29();
extern "C" extern void* __vt__8cM3dGPla[3];
extern "C" extern void* __vt__8cM3dGAab[3];
extern "C" extern void* __vt__8cM3dGTri[3];
extern "C" extern u8 g_dComIfG_gameInfo[122384];
extern "C" u8 sincosTable___5JMath[65536];
//
@@ -315,6 +307,93 @@ asm bool dBgWKCol::LineCheck(cBgS_LinChk* param_0) {
SECTION_SDATA2 static f32 lit_4293 = 0.014000000432133675f;
/* 8007F628-8007F9A4 079F68 037C+00 1/0 0/0 0/0 .text GroundCross__8dBgWKColFP11cBgS_GndChk */
#ifdef NONMATCHING
bool dBgWKCol::GroundCross(cBgS_GndChk* i_chk) {
cXyz* point_p = (cXyz*)&i_chk->GetPointP();
cXyz sp20;
VECSubtract(point_p, &m_pkc_head->m_area_min_pos, &sp20);
u32 temp_r3 = (u32)sp20.x;
if (temp_r3 < 0) {
return 0;
}
if (temp_r3 > ~m_pkc_head->field_0x20) {
return 0;
}
u32 temp_r3_2 = (u32)sp20.z;
if (temp_r3_2 < 0) {
return 0;
}
if (temp_r3_2 > ~m_pkc_head->field_0x28) {
return 0;
}
u32 var_r25 = (u32)sp20.y;
if (var_r25 < 0) {
return 0;
}
if (var_r25 > ~m_pkc_head->field_0x24) {
var_r25 = (u32)~m_pkc_head->field_0x24;
}
bool var_r24 = 0;
int var_r23 = 0;
cXyz sp14;
while (var_r25 >= var_r23) {
u32 var_r22 = m_pkc_head->field_0x2c;
u32 var_r4 = ((temp_r3 >> var_r22) | (((temp_r3_2 >> var_r22) << m_pkc_head->field_0x34) | ((var_r25 >> var_r22) << m_pkc_head->field_0x30))) * 4;
KC_PrismData* data_p = &m_pkc_head->m_block_data[var_r4];
for (; data_p->field_0x0[0] >= 0; data_p++) {
var_r22--;
var_r4 = ((((((var_r25 >> var_r22) * 2) & 2 & ~4) | (((temp_r3_2 >> var_r22) << 2) & 4)) & ~1) | ((temp_r3 >> var_r22) & 1)) * 4;
}
u16* var_r21 = data_p->field_0x0;
while (var_r21[0]++ != 0) {
KC_PrismData* temp_r27 = &m_pkc_head->m_prism_data[var_r21[0]];
Vec* temp_r20 = &m_pkc_head->field_0x4[temp_r27->field_0x6];
if (temp_r20->y >= 0.014000000432133675f && !cM3d_IsZero(temp_r20->y) && (cBgW_CheckBWall(temp_r20->y) || i_chk->GetWallPrecheck())) {
Vec* temp_r19_2 = &m_pkc_head->field_0x0[temp_r27->field_0x4];
sp14.x = i_chk->m_pos.x - temp_r19_2->x;
sp14.z = i_chk->m_pos.z - temp_r19_2->z;
sp14.y = -(sp14.x * temp_r20->x + sp14.z * temp_r20->z) / temp_r19_2->y;
if (VECDotProduct(&sp14, &m_pkc_head->field_0x4[temp_r27->field_0x8]) <= 0.0075f &&
VECDotProduct(&sp14, &m_pkc_head->field_0x4[temp_r27->field_0xa]) <= 0.0075f &&
VECDotProduct(&sp14, &m_pkc_head->field_0x4[temp_r27->field_0xc]) <= 0.0075f)
{
dBgPc sp64;
getPolyCode(var_r21[0], &sp64);
cXyz sp40(*temp_r20);
if (!chkPolyThrough(&sp64, i_chk->GetPolyPassChk(), i_chk->GetGrpPassChk(), sp40)) {
f32 tmp_height_kcw = sp14.y + temp_r19_2->y;
f32 now_y = i_chk->GetNowY();
if (now_y < tmp_height_kcw && tmp_height_kcw < i_chk->m_pos.y) {
i_chk->SetPolyIndex(var_r21[0]);
i_chk->SetNowY(tmp_height_kcw);
var_r24 = 1;
var_r23 = (u32)(tmp_height_kcw - m_pkc_head->m_area_min_pos.y);
}
}
}
}
}
var_r25 = (var_r25 & ~((1 << var_r22) - 1)) - 1;
}
return var_r24;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -323,6 +402,7 @@ asm bool dBgWKCol::GroundCross(cBgS_GndChk* param_0) {
#include "asm/d/bg/d_bg_w_kcol/GroundCross__8dBgWKColFP11cBgS_GndChk.s"
}
#pragma pop
#endif
/* 8007F9A4-8007FF00 07A2E4 055C+00 1/0 0/0 0/0 .text ShdwDraw__8dBgWKColFP13cBgS_ShdwDraw */
#pragma push
+1 -1
View File
@@ -3624,7 +3624,7 @@ asm void dCamera_c::Up() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dCamera_c::Eye() {
asm cXyz dCamera_c::Eye() {
nofralloc
#include "asm/d/d_camera/Eye__9dCamera_cFv.s"
}
+227 -118
View File
@@ -4,55 +4,11 @@
//
#include "d/d_envse.h"
#include "d/com/d_com_inf_game.h"
#include "d/d_path.h"
#include "d/d_procname.h"
#include "dol2asm.h"
//
// Types:
//
struct dStage_roomControl_c {
/* 80024384 */ void getStatusRoomDt(int);
};
struct dStage_SoundInfo_c {};
struct dPath {};
struct dEnvSe_c {
/* 80182FD8 */ void execute_common(dStage_SoundInfo_c*, s8*, u8);
/* 80183480 */ void execute();
};
struct dCamera_c {
/* 80181E64 */ void Eye();
};
struct cXyz {};
struct Vec {};
struct cM3dGLin {
/* 8026F31C */ void SetStartEnd(Vec const&, Vec const&);
};
struct Z2EnvSeMgr {
/* 802C6C84 */ void initStaticEnvSe(u8, u8, u8, u8, Vec*);
/* 802C70C8 */ void startStaticEnvSe(s8);
/* 802C780C */ void registWindowPos(Vec*);
/* 802C80F8 */ void initRiverSe(u8, u8, u8, u8);
/* 802C8234 */ void registRiverSePos(Vec*);
/* 802C8300 */ void startRiverSe(s8);
/* 802C8730 */ void initFallSe(u8, u8, u8, u8);
/* 802C886C */ void registFallSePos(Vec*);
/* 802C8890 */ void startFallSe(s8);
/* 802C8A90 */ void initEtcSe(u8, u8, u8, u8);
/* 802C8C24 */ void registEtcSePos(Vec*);
/* 802C8C48 */ void startEtcSe(s8);
/* 802C950C */ void initLv3WaterSe(u8, u8, u8, u8);
/* 802C9F58 */ void registLv3WaterSePos(u8, Vec*);
/* 802CA794 */ void startLv3WaterSe(s8);
};
//
// Forward References:
//
@@ -66,7 +22,6 @@ extern "C" static bool dEnvSe_IsDelete__FP8dEnvSe_c();
extern "C" static bool dEnvSe_Delete__FP8dEnvSe_c();
extern "C" static void dEnvSe_Create__FP8dEnvSe_c();
extern "C" extern char const* const d_d_envse__stringBase0;
extern "C" extern void* g_profile_ENVSE[10 + 1 /* padding */];
//
// External References:
@@ -94,29 +49,21 @@ extern "C" void startEtcSe__10Z2EnvSeMgrFSc();
extern "C" void initLv3WaterSe__10Z2EnvSeMgrFUcUcUcUc();
extern "C" void registLv3WaterSePos__10Z2EnvSeMgrFUcP3Vec();
extern "C" void startLv3WaterSe__10Z2EnvSeMgrFSc();
extern "C" void PSVECSquareDistance();
extern "C" void _savegpr_22();
extern "C" void _savegpr_26();
extern "C" void _savegpr_28();
extern "C" void _restgpr_22();
extern "C" void _restgpr_26();
extern "C" void _restgpr_28();
extern "C" void memcmp();
extern "C" extern void* g_fopKy_Method[5 + 1 /* padding */];
extern "C" extern void* g_fpcLf_Method[5 + 1 /* padding */];
extern "C" extern void* __vt__8cM3dGLin[3];
extern "C" extern u8 g_dComIfG_gameInfo[122384];
extern "C" extern u8 g_mEnvSeMgr[780];
extern "C" extern u32 __float_max;
extern "C" extern u8 mStayNo__20dStage_roomControl_c[4];
//
// Declarations:
//
/* 80182DD4-80182DDC 17D714 0008+00 1/0 0/0 0/0 .text dEnvSe_Draw__FP8dEnvSe_c */
static bool dEnvSe_Draw(dEnvSe_c* param_0) {
return true;
static int dEnvSe_Draw(dEnvSe_c* i_this) {
return 1;
}
/* ############################################################################################## */
@@ -128,6 +75,59 @@ SECTION_SBSS2 static u8 data_80456B84[4];
/* 80182DDC-80182FD8 17D71C 01FC+00 1/1 0/0 0/0 .text dEnvSe_getNearPathPos__FP4cXyzP4cXyzP5dPath
*/
// stack issues
#ifdef NONMATCHING
static void dEnvSe_getNearPathPos(cXyz* param_0, cXyz* param_1, dPath* i_path) {
int var_r28 = 0;
BOOL sp10[2] = {0, 0};
f32 sp8;
f32 var_f31 = FLT_MAX;
dStage_dPnt_c* point_p = i_path->m_points;
cXyz sp3C;
cXyz sp30;
cM3dGLin sp14;
for (int 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_r28 = i;
}
point_p++;
}
dStage_dPnt_c* point2_p = &i_path->m_points[var_r28];
if (var_r28 != 0) {
sp14.set(point2_p[-1].m_position, point2_p[0].m_position);
sp10[0] = cM3d_Len3dSqPntAndSegLine(&sp14, param_1, &sp30, &sp8);
}
if (var_r28 != i_path->m_num - 1) {
sp14.set(point2_p[0].m_position, point2_p[1].m_position);
sp10[1] = cM3d_Len3dSqPntAndSegLine(&sp14, param_1, &sp3C, &sp8);
}
if (sp10[0]) {
if (sp10[1]) {
if (cM3d_LenSq(&sp3C, param_1) > sp8) {
*param_0 = sp30;
} else {
*param_0 = sp3C;
}
} else {
*param_0 = sp30;
}
} else if (sp10[1]) {
*param_0 = sp3C;
} else {
param_0->set(point2_p[0].m_position);
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -136,89 +136,198 @@ static asm void dEnvSe_getNearPathPos(cXyz* param_0, cXyz* param_1, dPath* param
#include "asm/d/d_envse/dEnvSe_getNearPathPos__FP4cXyzP4cXyzP5dPath.s"
}
#pragma pop
/* ############################################################################################## */
/* 80394308-80394308 020968 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_80394308 = "sndtag";
/* @stringBase0 padding */
SECTION_DEAD static char const* const pad_8039430F = "";
#pragma pop
#endif
/* 80182FD8-80183480 17D918 04A8+00 1/1 0/0 0/0 .text
* execute_common__8dEnvSe_cFP18dStage_SoundInfo_cPScUc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dEnvSe_c::execute_common(dStage_SoundInfo_c* param_0, s8* param_1, u8 param_2) {
nofralloc
#include "asm/d/d_envse/execute_common__8dEnvSe_cFP18dStage_SoundInfo_cPScUc.s"
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(i_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;
}
#pragma pop
/* 80183480-801835A0 17DDC0 0120+00 1/1 0/0 0/0 .text execute__8dEnvSe_cFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dEnvSe_c::execute() {
nofralloc
#include "asm/d/d_envse/execute__8dEnvSe_cFv.s"
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(i_dComIfGp_getStage()->getSoundInfCL(), &field_0xfe, 0);
return execute_common(i_dComIfGp_getStage()->getSoundInf(), &field_0xff, 0);
}
#pragma pop
/* 801835A0-801835C0 17DEE0 0020+00 1/0 0/0 0/0 .text dEnvSe_Execute__FP8dEnvSe_c */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
static asm void dEnvSe_Execute(dEnvSe_c* param_0) {
nofralloc
#include "asm/d/d_envse/dEnvSe_Execute__FP8dEnvSe_c.s"
static int dEnvSe_Execute(dEnvSe_c* i_this) {
return i_this->execute();
}
#pragma pop
/* 801835C0-801835C8 17DF00 0008+00 1/0 0/0 0/0 .text dEnvSe_IsDelete__FP8dEnvSe_c */
static bool dEnvSe_IsDelete(dEnvSe_c* param_0) {
return true;
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 bool dEnvSe_Delete(dEnvSe_c* param_0) {
return true;
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 */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
static asm void dEnvSe_Create(dEnvSe_c* param_0) {
nofralloc
#include "asm/d/d_envse/dEnvSe_Create__FP8dEnvSe_c.s"
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;
}
#pragma pop
/* ############################################################################################## */
/* 803BA808-803BA81C -00001 0014+00 1/0 0/0 0/0 .data l_dEnvSe_Method */
SECTION_DATA static void* l_dEnvSe_Method[5] = {
(void*)dEnvSe_Create__FP8dEnvSe_c, (void*)dEnvSe_Delete__FP8dEnvSe_c,
(void*)dEnvSe_Execute__FP8dEnvSe_c, (void*)dEnvSe_IsDelete__FP8dEnvSe_c,
(void*)dEnvSe_Draw__FP8dEnvSe_c,
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 */
SECTION_DATA extern void* g_profile_ENVSE[10 + 1 /* padding */] = {
(void*)0xFFFFFFFD,
(void*)0x0002FFFD,
(void*)0x00150000,
(void*)&g_fpcLf_Method,
(void*)0x0000010C,
(void*)NULL,
(void*)NULL,
(void*)&g_fopKy_Method,
(void*)0x02B10000,
(void*)&l_dEnvSe_Method,
/* padding */
NULL,
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,
};
/* 80394308-80394308 020968 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
+453 -3
View File
@@ -2044,6 +2044,283 @@ SECTION_SDATA2 static f32 lit_6367 = 9800.0f;
SECTION_SDATA2 static f32 lit_6368 = 19.0f / 50.0f;
/* 8005FD48-80061324 05A688 15DC+00 0/0 1/1 0/0 .text dKyr_snow_move__Fv */
// mostly matches, 1 out of order instruction
#ifdef NONMATCHING
void dKyr_snow_move() {
f32* temp_r26;
cXyz* temp_r25;
dKankyo_snow_Packet* snow_p = g_env_light.mpSnowPacket;
SNOW_EFF* effect_p;
camera_class* camera_p = (camera_class*)dComIfGp_getCamera(0);
fopAc_ac_c* player_p = dComIfGp_getPlayer(0);
DOUBLE_POS spC8;
cXyz spB8;
cXyz spAC;
cXyz spA0;
cXyz sp94 = dKyw_get_wind_vecpow();
cXyz sp88 = dKyw_get_wind_vecpow();
cXyz sp7C;
cXyz sp70;
dBgS_ObjGndChk_All spE0;
cXyz sp64;
if (snow_p->field_0x6d88 <= g_env_light.mSnowCount) {
snow_p->field_0x6d88 = g_env_light.mSnowCount;
}
if (snow_p->field_0x6d88 == 0) {
return;
}
sp64 = player_p->current.pos;
sp64.y += 100.0f;
spE0.SetPos(&sp64);
f32 temp_f19 = dComIfG_Bgsp().GroundCross(&spE0);
dKy_set_eyevect_calc2(camera_p, &spB8, 500.0f, 500.0f);
dKy_set_eyevect_calc2(camera_p, &spAC, 1000.0f, 1000.0f);
if (snow_p->field_0x6d74.abs(camera_p->mLookat.mEye) > 1500.0f) {
snow_p->field_0x6d88 = 0;
}
snow_p->field_0x6d74 = camera_p->mLookat.mEye;
spA0.z = 0.0f;
spA0.y = 0.0f;
spA0.x = 0.0f;
cXyz* temp_r21 = dKyw_get_wind_vec();
f32 var_f20 = dKyw_get_wind_pow();
if (g_env_light.field_0xe92 == 1) {
var_f20 *= 1.2f;
}
if (strcmp(dComIfGp_getStartStageName(), "R_SP127") == 0) {
sp94.x = 0.3f;
sp94.y = 0.0f;
sp94.z = 0.0f;
var_f20 = 0.3f;
}
cXyz sp58;
spC8.x = camera_p->mLookat.mCenter.x - camera_p->mLookat.mEye.x;
spC8.y = 0.0f;
spC8.z = camera_p->mLookat.mCenter.z - camera_p->mLookat.mEye.z;
vectle_calc(&spC8, &sp58);
snow_p->field_0x6d84 =
cM3d_VectorProduct2d(0.0f, 0.0f, -temp_r21->x, -temp_r21->z, sp58.x, sp58.z);
f32 temp_f20_1 = fabsf((temp_r21->x * sp58.x) + (temp_r21->z * sp58.z));
snow_p->field_0x6d80 = ((1.0f - temp_f20_1) * var_f20) * (1.0f - fabsf(temp_r21->y + 0.3f));
snow_p->field_0x6d80 *= fabsf(snow_p->field_0x6d84);
for (int i = snow_p->field_0x6d88 - 1; i >= 0; i--) {
f32 temp_f27 = -(2.0f + cM_rndF(0.08f));
f32 temp_f26 = 2.0f * (5.0f + (f32)(i & 15));
effect_p = &snow_p->mSnowEff[i];
switch (snow_p->mSnowEff[i].mStatus) {
case 0:
effect_p->mWindSpeed = temp_f26;
effect_p->mGravity = temp_f27;
effect_p->mTimer = 0;
effect_p->mBasePos.x = spAC.x + cM_rndFX(1100.0f);
effect_p->mBasePos.y = spAC.y + 1100.0f;
effect_p->mBasePos.z = spAC.z + cM_rndFX(1100.0f);
effect_p->mPosition.x = spB8.x + cM_rndFX(550.0f);
effect_p->mPosition.y = spB8.y + 550.0f;
effect_p->mPosition.z = spB8.z + cM_rndFX(550.0f);
effect_p->mScale = 0.0f;
effect_p->mPosWaveX = cM_rndF(65536.0f);
effect_p->mPosWaveZ = cM_rndF(65536.0f);
effect_p->mStatus++;
break;
case 1:
f32 target = cM_rndFX(0.08f);
temp_r26 = &effect_p->mWindSpeed;
target = effect_p->mWindSpeed - target;
cLib_addCalc(temp_r26, target, 0.5f, 0.1f, 0.01f);
cXyz sp4C;
sp88 = sp94;
temp_r25 = &effect_p->mPosition;
if (camera_p->mLookat.mEye.abs(*temp_r25) < 500.0f &&
effect_p->mPosition.y < temp_f19 + 250.0f)
{
f32 var_f1_3 = ((temp_f19 + 250.0f) - effect_p->mPosition.y) / 250.0f;
if (var_f1_3 > 1.0f) {
var_f1_3 = 1.0f;
}
sp88.y = var_f1_3 * 0.45f;
}
s16 wave_x = effect_p->mPosWaveX;
s16 wave_z = effect_p->mPosWaveZ;
sp4C.x = cM_scos(wave_x) * cM_ssin(wave_z);
sp4C.y = cM_ssin(wave_x);
sp4C.z = cM_scos(wave_x) * cM_scos(wave_z);
effect_p->mPosition.x += sp88.x * *temp_r26;
effect_p->mPosition.z += sp88.z * *temp_r26;
effect_p->mPosition.y += effect_p->mGravity + (sp88.y * *temp_r26);
effect_p->mPosition.x += sp4C.x * 5.3f;
effect_p->mPosition.y += sp4C.y * 5.3f;
effect_p->mPosition.z += sp4C.z * 5.3f;
sp88 = sp94;
if (camera_p->mLookat.mEye.abs(*temp_r25) < 500.0f &&
effect_p->mBasePos.y < temp_f19 + 250.0f)
{
f32 var_f1_5 = ((temp_f19 + 250.0f) - effect_p->mBasePos.y) / 250.0f;
if (var_f1_5 > 1.0f) {
var_f1_5 = 1.0f;
}
sp88.y = var_f1_5 * 0.35f;
}
effect_p->mBasePos.x += sp88.x * *temp_r26;
effect_p->mBasePos.z += sp88.z * *temp_r26;
effect_p->mBasePos.y += effect_p->mGravity + (sp88.y * *temp_r26);
effect_p->mBasePos.x += sp4C.x * 5.3f;
effect_p->mBasePos.y += sp4C.y * 5.3f;
effect_p->mBasePos.z += sp4C.z * 5.3f;
cLib_addCalc(&effect_p->mPosWaveX, effect_p->mPosWaveX + cM_rndF(3000.0f), 0.25f,
1500.0f, 0.001f);
cLib_addCalc(&effect_p->mPosWaveZ, effect_p->mPosWaveZ + cM_rndF(3000.0f), 0.25f,
1500.0f, 0.001f);
sp7C = effect_p->mPosition;
f32 var_f1_6 = sp7C.abs(spB8);
if (effect_p->mTimer == 0) {
if (var_f1_6 > 550.0f) {
effect_p->mTimer = 10;
*temp_r26 = temp_f26;
effect_p->mGravity = temp_f27;
if (sp7C.abs(spB8) > 600.0f) {
effect_p->mPosition.x = spB8.x + cM_rndFX(550.0f);
effect_p->mPosition.y = spB8.y + cM_rndFX(550.0f);
effect_p->mPosition.z = spB8.z + cM_rndFX(550.0f);
} else {
f32 temp_f26_2 = cM_rndFX(27.5f);
get_vectle_calc(&sp7C, &spB8, &sp70);
effect_p->mPosition.x = spB8.x + sp70.x * (temp_f26_2 + 550.0f);
effect_p->mPosition.y = spB8.y + sp70.y * (temp_f26_2 + 550.0f);
effect_p->mPosition.z = spB8.z + sp70.z * (temp_f26_2 + 550.0f);
}
}
} else {
effect_p->mTimer--;
}
sp7C = effect_p->mBasePos;
if (sp7C.abs(spAC) > 1100.0f) {
if (sp7C.abs(spAC) > 1150.0f) {
effect_p->mBasePos.x = spAC.x + cM_rndFX(1100.0f);
effect_p->mBasePos.y = spAC.y + cM_rndFX(1100.0f);
effect_p->mBasePos.z = spAC.z + cM_rndFX(1100.0f);
} else {
f32 temp_f26_3 = cM_rndFX(27.5f);
get_vectle_calc(&sp7C, &spAC, &sp70);
effect_p->mBasePos.x = spAC.x + sp70.x * (temp_f26_3 + 1100.0f);
effect_p->mBasePos.y = spAC.y + sp70.y * (temp_f26_3 + 1100.0f);
effect_p->mBasePos.z = spAC.z + sp70.z * (temp_f26_3 + 1100.0f);
}
}
break;
}
sp7C = effect_p->mPosition;
f32 var_f26 = sp7C.abs(camera_p->mLookat.mEye) / 100.0f;
if (var_f26 > 1.0) {
var_f26 = 1.0;
}
var_f26 *= 0.4f;
f32 var_f1_11 = sp7C.abs(spB8);
if (var_f1_11 > 300.0f) {
f32 var_f1_12 = (550.0f - var_f1_11) / 250.0f;
if (var_f1_12 < 0.0f) {
var_f1_12 = 0.0f;
}
var_f26 *= var_f1_12;
}
if (i > g_env_light.mSnowCount - 1) {
cLib_addCalc(&effect_p->mScale, 0.0f, 0.2f, 0.1f, 0.01f);
} else {
effect_p->mScale = var_f26;
}
if (i > g_env_light.mSnowCount - 1 && effect_p->mScale < 0.01f) {
if (i == snow_p->field_0x6d88 - 1) {
snow_p->field_0x6d88--;
}
}
if (strcmp(dComIfGp_getStartStageName(), "R_SP127") == 0) {
if (sp7C.z > -340.0f) {
effect_p->mScale = 0.0f;
}
} else if (strcmp(dComIfGp_getStartStageName(), "F_SP127") == 0) {
if (sp7C.z > 9800.0f) {
effect_p->mScale = 0.0f;
}
}
sp7C = effect_p->mBasePos;
f32 var_f26_3 = sp7C.abs(camera_p->mLookat.mEye) / 100.0f;
if (var_f26_3 > 1.0) {
var_f26_3 = 1.0;
}
var_f26_3 *= 0.38f;
f32 var_f1_14 = sp7C.abs(spAC);
if (var_f1_14 > 850.0f) {
f32 var_f1_15 = (1100.0f - var_f1_14) / 250.0f;
if (var_f1_15 < 0.0f) {
var_f1_15 = 0.0f;
}
var_f26_3 *= var_f1_15;
}
if (i > g_env_light.mSnowCount - 1) {
cLib_addCalc(&effect_p->field_0x30, 0.0f, 0.2f, 0.1f, 0.01f);
} else {
effect_p->field_0x30 = var_f26_3;
}
if (strcmp(dComIfGp_getStartStageName(), "R_SP127") == 0) {
if (sp7C.z > -340.0f) {
effect_p->field_0x30 = 0.0f;
}
} else if (strcmp(dComIfGp_getStartStageName(), "F_SP127") == 0) {
if (sp7C.z > 9800.0f) {
effect_p->field_0x30 = 0.0f;
}
}
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -2052,6 +2329,7 @@ asm void dKyr_snow_move() {
#include "asm/d/kankyo/d_kankyo_rain/dKyr_snow_move__Fv.s"
}
#pragma pop
#endif
/* 80061324-8006140C 05BC64 00E8+00 0/0 1/1 0/0 .text dKyr_star_init__Fv */
// Matches without literals
@@ -2454,6 +2732,144 @@ SECTION_SDATA2 static f32 lit_8360 = 7000.0f;
SECTION_SDATA2 static f32 lit_8361 = 3600.0f;
/* 80066048-8006653C 060988 04F4+00 0/0 1/1 0/0 .text dKyr_drawSibuki__FPA4_fPPUc */
// stack issues, double branch weirdness
#ifdef NONMATCHING
void dKyr_drawSibuki(Mtx param_0, u8** param_1) {
camera_class* temp_r30 = (camera_class*)dComIfGp_getCamera(0);
dKankyo_rain_Packet* temp_r29 = g_env_light.mpRainPacket;
Mtx sp88;
cXyz sp7C;
cXyz sp70;
cXyz sp64;
cXyz sp58;
GXTexObj sp38;
cXyz sp2C;
cXyz sp20;
cXyz sp14;
if (g_env_light.mSnowCount == 0 && g_env_light.mCameraInWater == 0 &&
dComIfGd_getView() != NULL)
{
MTXInverse(dComIfGd_getView()->mViewMtxNoTrans, sp88);
if (strcmp(dComIfGp_getStartStageName(), "F_SP113") == 0 &&
dComIfGp_roomControl_getStayNo() == 1)
{
if ((temp_r30->mLookat.mEye.z < 5100.0f ||
(temp_r30->mLookat.mEye.x < -3250.0f && temp_r30->mLookat.mEye.y < -50.0f)) ||
(temp_r30->mLookat.mEye.x < -2700.0f && temp_r30->mLookat.mEye.z > 15750.0f))
{
return;
}
}
f32 var_f1 = 255.0f;
if (temp_r29->mStatus & 1) {
var_f1 = 0.0f;
} else if (temp_r29->mStatus & 2) {
var_f1 = 200.0f;
}
cLib_addCalc(&temp_r29->mSibukiAlpha, var_f1, 0.2f, 30.0f, 0.001f);
dKy_set_eyevect_calc(temp_r30, &sp2C, 7000.0f, 4000.0f);
dKyr_get_vectle_calc(&temp_r30->mLookat.mEye, &temp_r30->mLookat.mCenter, &sp20);
f32 var_f1_2 = 0.0f;
if (sp20.y > var_f1_2) {
if (sp20.y < 0.5f) {
var_f1_2 = 1.0f - (sp20.y / 0.5f);
}
} else {
var_f1_2 = 1.0f;
}
GXColor sp10;
sp10.r = 0xB4;
sp10.g = 0xC8;
sp10.b = 0xC8;
sp10.a = temp_r29->mSibukiAlpha * var_f1_2;
dKyr_set_btitex(&sp38, (ResTIMG*)*(++param_1));
GXSetNumChans(0);
GXSetTevColor(GX_TEVREG0, sp10);
GXSetTevColor(GX_TEVREG1, sp10);
GXSetNumTexGens(1);
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3C, GX_FALSE, 0x7D);
GXSetNumTevStages(1);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C1, GX_CC_C0, GX_CC_TEXC, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_ONE, GX_LO_COPY);
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
GXSetZMode(GX_TRUE, GX_GEQUAL, GX_FALSE);
GXSetClipMode(GX_CLIP_DISABLE);
GXSetNumIndStages(0);
dKr_cullVtx_Set();
GXLoadPosMtxImm(param_0, 0);
GXSetCurrentMtx(0);
f32 var_f30;
if (dComIfGd_getView() != NULL) {
var_f30 = dComIfGd_getView()->mFovy / 45.0f;
var_f30 *= var_f30;
if (var_f30 >= 1.0f) {
var_f30 = 1.0f;
}
} else {
var_f30 = 0.2f;
}
for (int i = 0; i < g_env_light.mRainCount >> 1; i++) {
f32 temp_f27 = var_f30 * (15.0f + cM_rndF(10.0f));
f32 temp_f28 = cM_rndFX(3600.0f);
f32 temp_f29 = cM_rndFX(1500.0f);
f32 temp_f1 = cM_rndFX(3600.0f);
sp14.x = sp2C.x + temp_f28;
sp14.y = sp2C.y + temp_f29;
sp14.z = sp2C.z + temp_f1;
sp58.x = sp14.x - temp_f27;
sp58.y = sp14.y;
sp58.z = sp14.z - temp_f27;
sp64.x = sp14.x + temp_f27;
sp64.y = sp14.y;
sp64.z = sp14.z - temp_f27;
sp70.x = sp14.x + temp_f27;
sp70.y = sp14.y;
sp70.z = sp14.z + temp_f27;
sp7C.x = sp14.x - temp_f27;
sp7C.y = sp14.y;
sp7C.z = sp14.z + temp_f27;
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3f32(sp58.x, sp58.y, sp58.z);
GXTexCoord2s16(0, 0);
GXPosition3f32(sp64.x, sp64.y, sp64.z);
GXTexCoord2s16(0x1FF, 0);
GXPosition3f32(sp70.x, sp70.y, sp70.z);
GXTexCoord2s16(0x1FF, 0x1FF);
GXPosition3f32(sp7C.x, sp7C.y, sp7C.z);
GXTexCoord2s16(0, 0x1FF);
i_GXEnd();
}
GXSetClipMode(GX_CLIP_ENABLE);
J3DShape::resetVcdVatCache();
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -2462,6 +2878,7 @@ asm void dKyr_drawSibuki(Mtx param_0, u8** param_1) {
#include "asm/d/kankyo/d_kankyo_rain/dKyr_drawSibuki__FPA4_fPPUc.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 8037A578-8037A578 006BD8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
@@ -3279,6 +3696,20 @@ void dKyr_shstar_init() {}
void dKyr_shstar_move() {}
/* 8006B8E4-8006B924 066224 0040+00 0/0 1/1 0/0 .text dKyr_odour_init__Fv */
// matches with literals
#ifdef NONMATCHING
void dKyr_odour_init() {
dScnKy_env_light_c* env_light = i_dKy_getEnvlight();
dKankyo_odour_Packet* odour_p = env_light->mpOdourPacket;
for (int i = 0; i < 2000; i++) {
odour_p->mOdourEff[i].mStatus = 0;
odour_p->mOdourEff[i].field_0x28 = 0.0f;
odour_p->mOdourEff[i].field_0x2c = 0.0f;
odour_p->mOdourEff[i].field_0x24 = 0.0f;
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -3287,6 +3718,7 @@ asm void dKyr_odour_init() {
#include "asm/d/kankyo/d_kankyo_rain/dKyr_odour_init__Fv.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 804525CC-804525D0 000BCC 0004+00 1/1 0/0 0/0 .sdata2 @10872 */
@@ -3409,11 +3841,11 @@ void dKyr_evil_init() {
/* 8006DA04-8006DA7C 068344 0078+00 0/0 1/1 0/0 .text dKyr_evil_move__Fv */
void dKyr_evil_move() {
dKankyo_evil_Packet* packet = g_env_light.mpEvilPacket;
dKankyo_evil_Packet* evil_p = g_env_light.mpEvilPacket;
cXyz vec = dKyw_get_wind_vecpow();
dBgS_GndChk gndchk;
for (int i = 0; i < packet->mEffectNum; i++) {
for (int i = 0; i < evil_p->mEffectNum; i++) {
}
}
@@ -3458,14 +3890,32 @@ SECTION_SDATA2 static f32 lit_11953 = 10000000.0f;
/* 8006E448-8006E6B0 068D88 0268+00 1/1 0/0 0/0 .text dKyr_near_bosslight_check__F4cXyz
*/
// matches with literals
#ifdef NONMATCHING
static f32 dKyr_near_bosslight_check(cXyz param_0) {
f32 dist = 10000000.0f;
dScnKy_env_light_c* env_light = i_dKy_getEnvlight();
for (int i = 0; i < 6; i++) {
if (env_light->field_0x0c18[i].field_0x26 == 1) {
if (env_light->field_0x0c18[i].mPos.abs(param_0) < dist) {
dist = env_light->field_0x0c18[i].mPos.abs(param_0);
}
}
}
return dist;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
static asm void dKyr_near_bosslight_check(cXyz param_0) {
static asm f32 dKyr_near_bosslight_check(cXyz param_0) {
nofralloc
#include "asm/d/kankyo/d_kankyo_rain/dKyr_near_bosslight_check__F4cXyz.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 80450F48-80450F4C 000448 0004+00 1/1 0/0 0/0 .sbss rot$11958 */