diff options
| author | hatal175 <hatal175@users.noreply.github.com> | 2023-05-09 01:10:22 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-08 15:10:22 -0700 |
| commit | 44b0fdbb0d73226eb8f365572f75d2ee026f1040 (patch) | |
| tree | ad41342a74f614c52413c0f0a037862672196c10 /src | |
| parent | 85827b28ff27c09702930738e8c188472428f959 (diff) | |
Do some work on f_op_actor_mng (#328)
* decompctx - try without shiftjis and write utf8 as output
* Do some work on f_op_actor_mng
* Remove duplicated includes
* Add fopAcM_setEffectMtx
* Match dShopSystem_searchCameraActor
* fopAcM_setEffectMtx now matches with literals
* Remove unnecessary inline in headers
Diffstat (limited to 'src')
| -rw-r--r-- | src/d/d_path.cpp | 2 | ||||
| -rw-r--r-- | src/d/particle/d_particle.cpp | 2 | ||||
| -rw-r--r-- | src/d/shop/d_shop_system.cpp | 29 | ||||
| -rw-r--r-- | src/f_op/f_op_actor_mng.cpp | 188 |
4 files changed, 126 insertions, 95 deletions
diff --git a/src/d/d_path.cpp b/src/d/d_path.cpp index 49693106a3..8617013943 100644 --- a/src/d/d_path.cpp +++ b/src/d/d_path.cpp @@ -67,7 +67,7 @@ dPath* dPath_GetNextRoomPath(dPath const* p_path, int room_no) { /* 8005195C-80051AC0 04C29C 0164+00 0/0 1/1 4/4 .text * dPath_GetPolyRoomPathVec__FRC13cBgS_PolyInfoP4cXyzPi */ -int dPath_GetPolyRoomPathVec(cBgS_PolyInfo const& poly, cXyz* p_pathVec, int* param_2) { +u8 dPath_GetPolyRoomPathVec(cBgS_PolyInfo const& poly, cXyz* p_pathVec, int* param_2) { int roomId = dComIfG_Bgsp().GetRoomId(poly); int roomPathId = dComIfG_Bgsp().GetRoomPathId(poly); diff --git a/src/d/particle/d_particle.cpp b/src/d/particle/d_particle.cpp index 349f823e04..377212c2fe 100644 --- a/src/d/particle/d_particle.cpp +++ b/src/d/particle/d_particle.cpp @@ -1970,7 +1970,7 @@ asm void dPa_control_c::setStopContinue(u32 param_0) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void dPa_control_c::setSimpleFoot(u32 param_0, u32* param_1, cBgS_PolyInfo& param_2, +asm u32 dPa_control_c::setSimpleFoot(u32 param_0, u32* param_1, cBgS_PolyInfo& param_2, cXyz const* param_3, dKy_tevstr_c const* param_4, int param_5, csXyz const* param_6, cXyz const* param_7, dPa_levelEcallBack* param_8, s8 param_9, diff --git a/src/d/shop/d_shop_system.cpp b/src/d/shop/d_shop_system.cpp index a67363b9cd..a1ed67aae8 100644 --- a/src/d/shop/d_shop_system.cpp +++ b/src/d/shop/d_shop_system.cpp @@ -267,14 +267,29 @@ SECTION_SDATA static fopAc_ac_c* dShopSystem_cameraActor[2] = {NULL, NULL}; static int dShopSystem_camera_count; /* 80197270-80197338 191BB0 00C8+00 1/1 0/0 0/0 .text dShopSystem_searchCameraActor__FPvPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void dShopSystem_searchCameraActor(void* param_0, void* param_1) { - nofralloc -#include "asm/d/shop/d_shop_system/dShopSystem_searchCameraActor__FPvPv.s" +static int dShopSystem_searchCameraActor(void* param_0, void* param_1) { + if (fopAcM_IsActor(param_0) && fopAcM_GetName(param_0) == PROC_TAG_SHOPCAM) { + if ((fopAcM_GetParam(param_1) & 0xf0000000) == (fopAcM_GetParam(param_0) & 0xf0000000) && dShopSystem_camera_count < 2) { + switch (fopAcM_GetParam(param_0) & 0xf) { + case 0: + if (dShopSystem_cameraActor[0] == NULL) { + dShopSystem_cameraActor[0] = (fopAc_ac_c*)param_0; + dShopSystem_camera_count++; + } + break; + case 1: + if (dShopSystem_cameraActor[1] == NULL) { + dShopSystem_cameraActor[1] = (fopAc_ac_c*)param_0; + dShopSystem_camera_count++; + } + break; + default: + break; + } + } + } + return 0; } -#pragma pop /* ############################################################################################## */ /* 80453B00-80453B04 002100 0004+00 1/1 0/0 0/0 .sdata2 @4097 */ diff --git a/src/f_op/f_op_actor_mng.cpp b/src/f_op/f_op_actor_mng.cpp index b3b9d309eb..81347de663 100644 --- a/src/f_op/f_op_actor_mng.cpp +++ b/src/f_op/f_op_actor_mng.cpp @@ -11,16 +11,20 @@ #include "MSL_C/math.h" #include "SSystem/SComponent/c_lib.h" #include "SSystem/SComponent/c_malloc.h" -#include "SSystem/SComponent/c_math.h" +#include "dol2asm.h" +#include "global.h" #include "d/com/d_com_inf_game.h" +#include "JSystem/JMath/JMath.h" +#include "SSystem/SComponent/c_math.h" #include "d/d_procname.h" #include "d/d_stage.h" -#include "dol2asm.h" #include "f_op/f_op_actor.h" #include "global.h" #include "m_Do/m_Do_ext.h" #include "m_Do/m_Do_lib.h" #include "m_Do/m_Do_mtx.h" +#include "rel/d/a/tag/d_a_tag_stream/d_a_tag_stream.h" +#include "d/d_path.h" // // Types: @@ -30,12 +34,6 @@ struct l_HIO { /* 8001E098 */ ~l_HIO(); }; -struct daTagStream_c { - /* 800318B4 */ void checkArea(cXyz const*); - - static u8 m_top[4]; -}; - class dEnemyItem_c { public: static u8* mData; @@ -797,31 +795,25 @@ SECTION_SDATA2 static u8 lit_4645[4] = { 0x00, }; -inline f32 JMAFastSqrt__Ff(f32 f) { - if (f > /* 0.0f */ FLOAT_LABEL(lit_4645)) { - f *= __frsqrte(f); // generates a useless frsp - } - return f; -} - inline f32 square(f32 f) { return f * f; } /* 8001A738-8001A79C 015078 0064+00 0/0 0/0 13/13 .text * fopAcM_searchActorAngleX__FPC10fopAc_ac_cPC10fopAc_ac_c */ +// matches with literals #ifdef NONMATCHING s16 fopAcM_searchActorAngleX(const fopAc_ac_c* i_actorA, const fopAc_ac_c* i_actorB) { const cXyz& posA = fopAcM_GetPosition_p(i_actorA); const cXyz& posB = fopAcM_GetPosition_p(i_actorB); return cM_atan2s(posB.y - posA.y, - JMAFastSqrt__Ff(square(posB.x - posA.x) + square(posB.z - posA.z))); + JMAFastSqrt(square(posB.x - posA.x) + square(posB.z - posA.z))); } #else #pragma push #pragma optimization_level 0 -#pragma optimizewithasm off -asm s16 fopAcM_searchActorAngleX(const fopAc_ac_c* i_actorA, const fopAc_ac_c* i_actorB) { +#pragma optimizewithasm off +asm s16 fopAcM_searchActorAngleX(const fopAc_ac_c* p_actorA, const fopAc_ac_c* p_actorB) { nofralloc #include "asm/f_op/f_op_actor_mng/fopAcM_searchActorAngleX__FPC10fopAc_ac_cPC10fopAc_ac_c.s" } @@ -1187,8 +1179,6 @@ s32 fopAcM_orderTalkItemBtnEvent(u16 eventType, fopAc_ac_c* actorA, fopAc_ac_c* /* 8001B19C-8001B244 015ADC 00A8+00 0/0 3/3 16/16 .text fopAcM_orderSpeakEvent__FP10fopAc_ac_cUsUs */ -// wrong load order -#ifdef NONMATCHING s32 fopAcM_orderSpeakEvent(fopAc_ac_c* actor, u16 priority, u16 flag) { if (!i_dComIfGp_getEvent().i_isOrderOK() && (!(flag & 0x400) || !i_dComIfGp_getEvent().isChangeOK(actor))) @@ -1203,16 +1193,6 @@ s32 fopAcM_orderSpeakEvent(fopAc_ac_c* actor, u16 priority, u16 flag) { return dComIfGp_event_order(EVT_TYPE_TALK, priority, flag, 0x14F, dComIfGp_getPlayer(0), actor, -1, -1); } -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm s32 fopAcM_orderSpeakEvent(fopAc_ac_c* param_0, u16 param_1, u16 param_2) { - nofralloc -#include "asm/f_op/f_op_actor_mng/fopAcM_orderSpeakEvent__FP10fopAc_ac_cUsUs.s" -} -#pragma pop -#endif /* 8001B244-8001B334 015B84 00F0+00 0/0 2/2 0/0 .text * fopAcM_orderDoorEvent__FP10fopAc_ac_cP10fopAc_ac_cUsUs */ @@ -1420,8 +1400,6 @@ s32 fopAcM_orderPotentialEvent(fopAc_ac_c* actor, u16 flag, u16 param_2, u16 pri /* 8001B9D0-8001BA7C 016310 00AC+00 0/0 3/3 12/12 .text fopAcM_orderItemEvent__FP10fopAc_ac_cUsUs */ -// load order -#ifdef NONMATCHING s32 fopAcM_orderItemEvent(fopAc_ac_c* actor, u16 priority, u16 flag) { if (!i_dComIfGp_getEvent().i_isOrderOK() && (!(flag & 0x400) || !i_dComIfGp_getEvent().isChangeOK(actor))) @@ -1436,16 +1414,6 @@ s32 fopAcM_orderItemEvent(fopAc_ac_c* actor, u16 priority, u16 flag) { return dComIfGp_event_order(EVT_TYPE_ITEM, priority, flag, -1, dComIfGp_getPlayer(0), actor, -1, -1); } -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm s32 fopAcM_orderItemEvent(fopAc_ac_c* param_0, u16 param_1, u16 param_2) { - nofralloc -#include "asm/f_op/f_op_actor_mng/fopAcM_orderItemEvent__FP10fopAc_ac_cUsUs.s" -} -#pragma pop -#endif /* 8001BA7C-8001BB14 0163BC 0098+00 0/0 1/1 0/0 .text * fopAcM_orderTreasureEvent__FP10fopAc_ac_cP10fopAc_ac_cUsUs */ @@ -1951,7 +1919,6 @@ void* enemySearchJugge(void* i_actor, void* i_data) { } /* 8001CA1C-8001CAD8 01735C 00BC+00 0/0 0/0 6/6 .text fopAcM_myRoomSearchEnemy__FSc */ -#ifdef NONMATCHING fopAc_ac_c* fopAcM_myRoomSearchEnemy(s8 i_roomNo) { int procID = dStage_roomControl_c::getStatusProcID(i_roomNo); scene_class* roomProc = fopScnM_SearchByID(procID); @@ -1959,22 +1926,12 @@ fopAc_ac_c* fopAcM_myRoomSearchEnemy(s8 i_roomNo) { u32 actorID = ((daPy_py_c*)dComIfGp_getPlayer(0))->getGrabActorID(); fopAc_ac_c* actor = fopAcM_SearchByID(actorID); - if (actor != NULL && fopAcM_GetGroup(actor) != 2) { - return; + if (actor != NULL && fopAcM_GetGroup(actor) == 2) { + return actor; } - fpcM_JudgeInLayer(fpcM_LayerID(roomProc), enemySearchJugge, NULL); -} -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm fopAc_ac_c* fopAcM_myRoomSearchEnemy(s8 param_0) { - nofralloc -#include "asm/f_op/f_op_actor_mng/fopAcM_myRoomSearchEnemy__FSc.s" + return (fopAc_ac_c*) fpcM_JudgeInLayer(fpcM_LayerID(roomProc), enemySearchJugge, NULL); } -#pragma pop -#endif /* 8001CAD8-8001CB48 017418 0070+00 0/0 0/0 81/81 .text * fopAcM_createDisappear__FPC10fopAc_ac_cPC4cXyzUcUcUc */ @@ -2166,15 +2123,23 @@ f32 fopAcM_gc_c::mGroundY; /* 8001D020-8001D10C 017960 00EC+00 0/0 0/0 96/96 .text * fopAcM_effSmokeSet1__FPUlPUlPC4cXyzPC5csXyzfPC12dKy_tevstr_ci */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm s32 fopAcM_effSmokeSet1(u32* param_0, u32* param_1, cXyz const* param_2, csXyz const* param_3, - f32 param_4, dKy_tevstr_c const* param_5, int param_6) { - nofralloc -#include "asm/f_op/f_op_actor_mng/fopAcM_effSmokeSet1__FPUlPUlPC4cXyzPC5csXyzfPC12dKy_tevstr_ci.s" +void fopAcM_effSmokeSet1(u32* param_0, u32* param_1, cXyz const* param_2, csXyz const* param_3, + f32 param_4, dKy_tevstr_c const* param_5, int param_6) { + cXyz p2; + float z = param_2->z; + float y = FLOAT_LABEL(lit_6035) + param_2->y; + p2.x = param_2->x; + p2.y = y; + p2.z = z; + if (fopAcM_gc_c::gndCheck(&p2)) { + p2.y = fopAcM_gc_c::getGroundY(); + cXyz stack_18; + stack_18.x = param_4; + stack_18.y = param_4; + stack_18.z = param_4; + *param_0 = dComIfGp_particle_setSimpleFoot(*param_0, param_1, *fopAcM_gc_c::getGroundCheck(), &p2, param_5, param_6, param_3, &stack_18, NULL, 0xff, NULL); + } } -#pragma pop /* ############################################################################################## */ /* 80451C50-80451C54 000250 0004+00 1/1 0/0 0/0 .sdata2 hamon_name$6107 */ @@ -2284,6 +2249,43 @@ COMPILER_STRIP_GATE(0x80378898, &mtx_adj); /* 8001D42C-8001D5A4 017D6C 0178+00 0/0 3/3 40/40 .text * fopAcM_setEffectMtx__FPC10fopAc_ac_cPC12J3DModelData */ +// matches with literals +#ifdef NONMATCHING +void fopAcM_setEffectMtx(const fopAc_ac_c* i_actor, const J3DModelData* modelData) { + const cXyz* pEyePos = &i_actor->mEyePos; + dCamera_c* camera = dCam_getCamera(); + cXyz v1 = *pEyePos - camera->field_0xd8; + cXyz v2; + get_vectle_calc(&i_actor->mTevStr.field_0x32c, pEyePos, &v2); + Vec half; + C_VECHalfAngle(&v1, &v2, &half); + Mtx mtx; + C_MTXLookAt(mtx, &cXyz::Zero, &cXyz::BaseY, &half); + mDoMtx_stack_c::scaleS(1.0, 1.0, 1.0); + mDoMtx_stack_c::concat(mtx_adj); + mDoMtx_stack_c::concat(mtx); + MtxP currentMtx = mDoMtx_stack_c::get(); + currentMtx[0][3] = 0.0; + currentMtx[1][3] = 0.0; + currentMtx[2][3] = 0.0; + + Mtx mtx2; + mDoMtx_copy(currentMtx, mtx2); + for (u16 i = 0; i < modelData->getMaterialNum(); i++) { + J3DMaterial* material = modelData->getMaterialNodePointer(i); + for (u32 j = 0; j < 8; j++) { + J3DTexMtx* texMtx = material->getTexMtx(j); + if (texMtx != NULL) { + switch (texMtx->getTexMtxInfo().mInfo) { + case 6: + texMtx->setEffectMtx(mtx2); + break; + } + } + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -2292,6 +2294,7 @@ asm void fopAcM_setEffectMtx(fopAc_ac_c const* param_0, J3DModelData const* para #include "asm/f_op/f_op_actor_mng/fopAcM_setEffectMtx__FPC10fopAc_ac_cPC12J3DModelData.s" } #pragma pop +#endif /* 8001D5A4-8001D5EC 017EE4 0048+00 1/1 0/0 0/0 .text fopAcM_getProcNameString__FPC10fopAc_ac_c */ static const char* fopAcM_getProcNameString(const fopAc_ac_c* i_actor) { @@ -2352,7 +2355,6 @@ fopAc_ac_c* fopAcM_findObject4EventCB(fopAc_ac_c* i_actor, void* i_data) { /* 8001D7A0-8001D890 0180E0 00F0+00 0/0 7/7 0/0 .text fopAcM_searchFromName4Event__FPCcs */ -#ifdef NONMATCHING fopAc_ac_c* fopAcM_searchFromName4Event(char const* name, s16 eventID) { fopAcM_search4ev_prm prm; prm.mEventID = eventID; @@ -2369,7 +2371,7 @@ fopAc_ac_c* fopAcM_searchFromName4Event(char const* name, s16 eventID) { prm.mEventID = 0xFFFF; break; } - prm.mEventID += chr[0] - 0x30; // ? + prm.mEventID = prm.mEventID * 10 + (chr[0] - 0x30); } } @@ -2382,16 +2384,6 @@ fopAc_ac_c* fopAcM_searchFromName4Event(char const* name, s16 eventID) { prm.mSubType = objInf->mSubtype; return fopAcM_Search((fopAcIt_JudgeFunc)fopAcM_findObject4EventCB, &prm); } -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm fopAc_ac_c* fopAcM_searchFromName4Event(char const* name, s16 eventID) { - nofralloc -#include "asm/f_op/f_op_actor_mng/fopAcM_searchFromName4Event__FPCcs.s" -} -#pragma pop -#endif /* ############################################################################################## */ /* 803F1D18-803F1D24 01EA38 000C+00 0/1 0/0 0/0 .bss @6509 */ @@ -2444,15 +2436,37 @@ void fpoAcM_relativePos(fopAc_ac_c const* actor, cXyz const* p_inPos, cXyz* p_ou /* 8001D9A8-8001DAE4 0182E8 013C+00 0/0 1/1 9/9 .text * fopAcM_getWaterStream__FPC4cXyzRC13cBgS_PolyInfoP4cXyzPii */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm s32 fopAcM_getWaterStream(cXyz const* param_0, cBgS_PolyInfo const& param_1, cXyz* param_2, - int* param_3, int param_4) { - nofralloc -#include "asm/f_op/f_op_actor_mng/fopAcM_getWaterStream__FPC4cXyzRC13cBgS_PolyInfoP4cXyzPii.s" +s32 fopAcM_getWaterStream(cXyz const* param_0, cBgS_PolyInfo const& param_1, cXyz* speed, + int* param_3, int param_4) { + daTagStream_c* stream = daTagStream_c::getTop(); + if (stream != NULL) { + for (stream = daTagStream_c::getTop(); stream != NULL; stream = stream->getNext()) { + if (stream->checkStreamOn() && + (param_4 == 0 || stream->checkCanoeOn()) && + stream->checkArea(param_0)) { + *speed = stream->speed; + *param_3 = stream->getPower() & 0xff; + return 1; + } + } + } + + if (param_4) { + return 0; + } + + if (dComIfG_Bgsp().ChkPolySafe(param_1)) { + if (dPath_GetPolyRoomPathVec(param_1, speed, param_3)) { + speed->normalizeZP(); + return 1; + } + } else { + *speed = cXyz::Zero; + *param_3 = 0; + } + + return 0; } -#pragma pop /* ############################################################################################## */ /* 803A37C0-803A37CC 0008E0 000C+00 2/2 93/93 0/0 .data __vt__8cM3dGPla */ @@ -2500,7 +2514,7 @@ extern "C" asm void __dt__8cM3dGPlaFv() { #pragma pop /* 8001DBD8-8001DC68 018518 0090+00 1/1 5/5 18/18 .text fopAcM_getPolygonAngle__FPC8cM3dGPlas */ -// sqrt issues +// matches with literals #ifdef NONMATCHING s16 fopAcM_getPolygonAngle(cM3dGPla const* p_plane, s16 param_1) { if (p_plane == NULL) { @@ -2509,7 +2523,9 @@ s16 fopAcM_getPolygonAngle(cM3dGPla const* p_plane, s16 param_1) { s16 atan = p_plane->mNormal.atan2sX_Z() - param_1; f32 cos = cM_scos(atan); - f32 sqrt = JMAFastSqrt__Ff(square(p_plane->mNormal.x) + square(p_plane->mNormal.z)); + f32 x2 = square(p_plane->mNormal.x); + f32 z2 = square(p_plane->mNormal.z); + f32 sqrt = JMAFastSqrt(x2 + z2); return cM_atan2s(sqrt * cos, p_plane->mNormal.y); } #else |
