From d33055236182c621efb5e28acdf5dd05fd02907c Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 23 Sep 2023 03:40:46 -0700 Subject: [PATCH] d_attention work --- include/d/d_attention.h | 58 ++++---- include/d/d_com_inf_game.h | 10 ++ include/d/d_kankyo.h | 2 +- src/d/actor/d_a_agb.cpp | 4 +- src/d/d_att_dist.cpp | 3 - src/d/d_attention.cpp | 262 +++++++++++++++++++++++++++++-------- src/d/d_com_inf_game.cpp | 4 +- src/d/d_kankyo.cpp | 4 +- src/d/d_kankyo_rain.cpp | 121 ++++++++++++++++- src/d/d_kankyo_wether.cpp | 18 +-- 10 files changed, 384 insertions(+), 102 deletions(-) diff --git a/include/d/d_attention.h b/include/d/d_attention.h index df8072f73..c34dbbf7e 100644 --- a/include/d/d_attention.h +++ b/include/d/d_attention.h @@ -5,6 +5,19 @@ #include "m_Do/m_Do_ext.h" class fopAc_ac_c; +class mDoExt_McaMorf; +class J3DAnmColor; +class J3DMatColorAnm; + +class dAttDraw_c { +public: + void setAnm(int, int, int); + void draw(cXyz&, Mtx); + + /* 0x0 */ mDoExt_McaMorf * mpMorf; + /* 0x4 */ J3DAnmColor * mpAnmClr; + /* 0x8 */ J3DMatColorAnm * mpAnmMatClr; +}; class dAttHint_c { public: @@ -66,10 +79,11 @@ public: class dAttLook_c { public: - /* 80073CA4 */ fopAc_ac_c* convPId(unsigned int); - /* 80073CD4 */ void init(); - /* 80073CEC */ void proc(); - /* 80073D08 */ void request(fopAc_ac_c*, f32, f32, f32, s16, int); + fopAc_ac_c* convPId(unsigned int); + void init(); + void proc(); + void request(fopAc_ac_c*, f32, f32, f32, s16, int); + void requestF(fopAc_ac_c*, s16, int); private: u32 field_0x0; @@ -105,24 +119,24 @@ public: dAttention_c(fopAc_ac_c*, u32); ~dAttention_c(); - void GetActionList(s32); - void GetLockonList(s32); - void getActionBtnB(); - void getActionBtnXYZ_local(int); - void getActionBtnX(); - void getActionBtnY(); - void getActionBtnZ(); + dAttList_c* GetActionList(s32); + dAttList_c* GetLockonList(s32); + dAttList_c* getActionBtnB(); + dAttList_c* getActionBtnXYZ_local(int); + dAttList_c* getActionBtnX(); + dAttList_c* getActionBtnY(); + dAttList_c* getActionBtnZ(); void chkAttMask(u32, u32); void calcWeight(int, fopAc_ac_c*, f32, s16, s16, u32*); void setLList(fopAc_ac_c*, f32, f32, u32); void setAList(fopAc_ac_c*, f32, f32, u32); void initList(u32); - void makeList(); + s32 makeList(); void SelectAttention(fopAc_ac_c*); void sortList(); void stockAttention(u32); void nextAttention(u32); - void freeAttention(); + s32 freeAttention(); void chaseAttention(); void EnemyDistance(fopAc_ac_c*); void runSoundProc(); @@ -136,12 +150,11 @@ public: void judgementStatusHd(u32); void Run(u32); void Draw(); - void LockonTarget(s32); + fopAc_ac_c* LockonTarget(s32); void LockonReleaseDistanse(); - void LockonTargetPId(s32); - void ActionTarget(s32); - void LockonTruth(); - void Lockon(); + unsigned int LockonTargetPId(s32); + fopAc_ac_c* ActionTarget(s32); + bool LockonTruth(); void Init(fopAc_ac_c* i_owner, u32 i_playerNo) { mpPlayer = (daPy_lk_c*)i_owner; @@ -158,7 +171,7 @@ public: public: /* 0x000 */ daPy_lk_c* mpPlayer; /* 0x004 */ int mLockOnTargetBsPcID; - /* 0x008 */ dAttDraw_CallBack_c field_0x8; + /* 0x008 */ dAttDraw_CallBack_c mpCallBack; /* 0x00C */ int mPlayerNo; /* 0x010 */ u32 mFlagMask; /* 0x014 */ u8 field_0x014[0x018 - 0x014]; @@ -171,7 +184,9 @@ public: /* 0x020 */ u32 mFlags; /* 0x024 */ JKRHeap* mpHeap; /* 0x028 */ u8 field_0x028; - /* 0x029 */ u8 field_0x029[0x054 - 0x029]; + /* 0x02C */ cXyz field_0x02c; + /* 0x038 */ dAttDraw_c mDraw[2]; + /* 0x050 */ u32 field_0x050; /* 0x054 */ dAttList_c mLockOnList[8]; /* 0x0D4 */ int mLockOnNum; /* 0x0D8 */ int mLockOnOffs; @@ -180,8 +195,7 @@ public: /* 0x120 */ int mActionOffs; /* 0x124 */ dAttHint_c mHint; /* 0x130 */ dAttCatch_c mCatch; - /* 0x148 */ dAttLook_c field_0x148; - /* 0x158 */ dAttLook_c field_0x158; + /* 0x148 */ dAttLook_c mLook[2]; /* 0x168 */ int mEnemyBsPcId; /* 0x16C */ f32 mEnemyDistance; /* 0x170 */ dAttParam_c mAttParam; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index b274b1bc6..e0b52a878 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -723,6 +723,8 @@ inline u8 dComIfGs_getMaxMagic() { return g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusA().getMaxMagic(); } +u8 dComIfGs_checkGetItemNum(u8 i_itemNo); + /** * === PLAY === */ @@ -1315,6 +1317,14 @@ inline void dComIfGd_entryZSortXluList(J3DPacket* i_packet, cXyz& param_1) { g_dComIfG_gameInfo.drawlist.entryZSortXluList(i_packet, param_1); } +inline view_class* dComIfGd_getView() { + return (view_class*)g_dComIfG_gameInfo.drawlist.mpCamera; +} + +inline MtxP dComIfGd_getViewRotMtx() { + return dComIfGd_getView()->mViewMtxNoTrans; +} + /** * === RESOURCE === */ diff --git a/include/d/d_kankyo.h b/include/d/d_kankyo.h index 575c20ece..5e81226ab 100644 --- a/include/d/d_kankyo.h +++ b/include/d/d_kankyo.h @@ -35,7 +35,7 @@ struct WIND_INFLUENCE { /* 0x18 */ f32 mRadius; /* 0x1C */ f32 mStrength; /* 0x20 */ f32 field_0x20; - /* 0x24 */ f32 field_0x24; + /* 0x24 */ s32 mRegistIdx; /* 0x28 */ u8 mbConstant; }; diff --git a/src/d/actor/d_a_agb.cpp b/src/d/actor/d_a_agb.cpp index 6e8a671b4..00720cf6f 100644 --- a/src/d/actor/d_a_agb.cpp +++ b/src/d/actor/d_a_agb.cpp @@ -149,7 +149,7 @@ void daAgb_c::NameConv() { int daAgb_c::uploadInitCheck() { s32 roomNo = dComIfGp_roomControl_getStayNo(); dStage_FileList_dt_c* fili_p = - dComIfGp_roomControl_getStatusRoomDt(roomNo)->mRoomDt.getFileListInfo(); + dComIfGp_roomControl_getStatusRoomDt(roomNo)->getFileListInfo(); if ((dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()) != 7 && !dMap_c::isEnableDispMap()) || @@ -656,7 +656,7 @@ void daAgb_c::GbaItemUse() { if (temp_r0 == 0 || temp_r0 == 1 || temp_r0 == 2 || temp_r29 == 0x11 || temp_r29 == 0x12) { s32 roomNo = dComIfGp_roomControl_getStayNo(); dStage_FileList_dt_c* fili_p = - dComIfGp_roomControl_getStatusRoomDt(roomNo)->mRoomDt.getFileListInfo(); + dComIfGp_roomControl_getStatusRoomDt(roomNo)->getFileListInfo(); if (fili_p != NULL && fili_p->mParam & 4) { if (field_0x67c != 0) { diff --git a/src/d/d_att_dist.cpp b/src/d/d_att_dist.cpp index 5ae63cbf0..2f3fef0a2 100644 --- a/src/d/d_att_dist.cpp +++ b/src/d/d_att_dist.cpp @@ -3,6 +3,3 @@ // Translation Unit: d_att_dist.cpp // -#include "d_att_dist.h" -#include "dolphin/types.h" - diff --git a/src/d/d_attention.cpp b/src/d/d_attention.cpp index ec43e222e..1e9fb4bc8 100644 --- a/src/d/d_attention.cpp +++ b/src/d/d_attention.cpp @@ -3,8 +3,9 @@ // Translation Unit: d_attention.cpp // -#include "d_attention.h" -#include "dolphin/types.h" +#include "d/d_attention.h" +#include "f_op/f_op_actor_mng.h" +#include "d/d_com_inf_game.h" /* 8009D220-8009D268 .text __ct__11dAttParam_cFl */ dAttParam_c::dAttParam_c(long) { @@ -32,38 +33,53 @@ dAttention_c::~dAttention_c() { } /* 8009D6EC-8009D728 .text GetActionList__12dAttention_cFl */ -void dAttention_c::GetActionList(long) { - /* Nonmatching */ +dAttList_c* dAttention_c::GetActionList(long idx) { + if (mActionNum != 0) + return &mActionList[(mActionOffs + idx) % mActionNum]; + else + return NULL; } /* 8009D728-8009D764 .text GetLockonList__12dAttention_cFl */ -void dAttention_c::GetLockonList(long) { - /* Nonmatching */ +dAttList_c* dAttention_c::GetLockonList(long idx) { + if (mLockOnNum != 0) + return &mLockOnList[(mLockOnOffs + idx) % mLockOnNum]; + else + return NULL; } /* 8009D764-8009D858 .text getActionBtnB__12dAttention_cFv */ -void dAttention_c::getActionBtnB() { +dAttList_c* dAttention_c::getActionBtnB() { /* Nonmatching */ } /* 8009D858-8009D9A8 .text getActionBtnXYZ_local__12dAttention_cFi */ -void dAttention_c::getActionBtnXYZ_local(int) { +dAttList_c* dAttention_c::getActionBtnXYZ_local(int) { /* Nonmatching */ } /* 8009D9A8-8009D9FC .text getActionBtnX__12dAttention_cFv */ -void dAttention_c::getActionBtnX() { - /* Nonmatching */ +dAttList_c* dAttention_c::getActionBtnX() { + if (!dComIfGs_checkGetItemNum(g_dComIfG_gameInfo.play.mEquippedItems[0])) + return NULL; + + return getActionBtnXYZ_local(0); } /* 8009D9FC-8009DA50 .text getActionBtnY__12dAttention_cFv */ -void dAttention_c::getActionBtnY() { - /* Nonmatching */ +dAttList_c* dAttention_c::getActionBtnY() { + if (!dComIfGs_checkGetItemNum(g_dComIfG_gameInfo.play.mEquippedItems[1])) + return NULL; + + return getActionBtnXYZ_local(1); } /* 8009DA50-8009DAA4 .text getActionBtnZ__12dAttention_cFv */ -void dAttention_c::getActionBtnZ() { - /* Nonmatching */ +dAttList_c* dAttention_c::getActionBtnZ() { + if (!dComIfGs_checkGetItemNum(g_dComIfG_gameInfo.play.mEquippedItems[2])) + return NULL; + + return getActionBtnXYZ_local(2); } /* 8009DAA4-8009DAF4 .text chkAttMask__12dAttention_cFUlUl */ @@ -102,27 +118,86 @@ void dAttention_c::calcWeight(int, fopAc_ac_c*, float, short, short, unsigned lo } /* 8009E03C-8009E128 .text setLList__12dAttention_cFP10fopAc_ac_cffUl */ -void dAttention_c::setLList(fopAc_ac_c*, float, float, unsigned long) { - /* Nonmatching */ +void dAttention_c::setLList(fopAc_ac_c* i_actor, float weight, float distance, unsigned long type) { + float bestWeight = 0.0f; + + if (weight > 0.0f) { + int bestIdx; + if (mLockOnNum < (s32)ARRAY_SIZE(mLockOnList)) { + bestIdx = mLockOnNum++; + } else { + for (int i = (s32)ARRAY_SIZE(mLockOnList); i >= 0; i--) { + if (weight > bestWeight) { + bestIdx = i; + bestWeight = weight; + } + } + } + + if (weight < mLockOnList[bestIdx].mWeight) { + mLockOnList[bestIdx].setActor(i_actor); + mLockOnList[bestIdx].mWeight = weight; + mLockOnList[bestIdx].mDistance = distance; + mLockOnList[bestIdx].mType = type; + } + } } /* 8009E128-8009E214 .text setAList__12dAttention_cFP10fopAc_ac_cffUl */ -void dAttention_c::setAList(fopAc_ac_c*, float, float, unsigned long) { - /* Nonmatching */ +void dAttention_c::setAList(fopAc_ac_c* i_actor, float weight, float distance, unsigned long type) { + float bestWeight = 0.0f; + + if (weight > 0.0f) { + int bestIdx; + if (mActionNum < (s32)ARRAY_SIZE(mActionList)) { + bestIdx = mActionNum++; + } else { + for (int i = (s32)ARRAY_SIZE(mActionList); i >= 0; i--) { + if (weight > bestWeight) { + bestIdx = i; + bestWeight = weight; + } + } + } + + if (weight < mActionList[bestIdx].mWeight) { + mActionList[bestIdx].setActor(i_actor); + mActionList[bestIdx].mWeight = weight; + mActionList[bestIdx].mDistance = distance; + mActionList[bestIdx].mType = type; + } + } } /* 8009E214-8009E2CC .text initList__12dAttention_cFUl */ -void dAttention_c::initList(unsigned long) { - /* Nonmatching */ +void dAttention_c::initList(unsigned long flagMask) { + int i; + + mFlagMask = flagMask; + + for (i = 0; i < (s32)ARRAY_SIZE(mLockOnList); i++) { + mLockOnList[i].setActor(NULL); + mLockOnList[i].mWeight = 3.4028235E38f; + } + mLockOnOffs = 0; + mLockOnNum = 0; + + for (i = 0; i < (s32)ARRAY_SIZE(mActionList); i++) { + mActionList[i].setActor(NULL); + mActionList[i].mWeight = 3.4028235E38f; + } + mActionOffs = 0; + mActionNum = 0; } /* 8009E2CC-8009E2F8 .text select_attention__FP10fopAc_ac_cPv */ -void select_attention(fopAc_ac_c*, void*) { - /* Nonmatching */ +void select_attention(fopAc_ac_c* pActor, void* i_attention) { + dAttention_c * pAttention = (dAttention_c*)i_attention; + pAttention->SelectAttention(pActor); } /* 8009E2F8-8009E33C .text makeList__12dAttention_cFv */ -void dAttention_c::makeList() { +s32 dAttention_c::makeList() { /* Nonmatching */ } @@ -137,18 +212,47 @@ void dAttention_c::sortList() { } /* 8009E5C4-8009E684 .text stockAttention__12dAttention_cFUl */ -void dAttention_c::stockAttention(unsigned long) { - /* Nonmatching */ +void dAttention_c::stockAttention(unsigned long interactMask) { + fopAc_ac_c * pTarget = LockonTarget(0); + initList(interactMask); + if (makeList()) + sortList(); + + if (pTarget != mLockOnList[0].getActor()) { + if (pTarget != NULL) { + if (mLockOnList[0].getActor() != NULL) + mFlags |= 2; + } else { + mFlags |= 1; + } + + mFlags |= 4; + } + + LockonTarget(0); } /* 8009E684-8009E728 .text nextAttention__12dAttention_cFUl */ -void dAttention_c::nextAttention(unsigned long) { - /* Nonmatching */ +void dAttention_c::nextAttention(unsigned long interactMask) { + fopAc_ac_c * pTarget = fopAcM_SearchByID(mLockOnTargetBsPcID); + initList(interactMask); + if (makeList()) + sortList(); + + if (pTarget == mLockOnList[0].getActor() && mLockOnNum > 1) + mLockOnOffs = 1; + + LockonTarget(0); } /* 8009E728-8009E764 .text freeAttention__12dAttention_cFv */ -void dAttention_c::freeAttention() { - /* Nonmatching */ +s32 dAttention_c::freeAttention() { + mLockOnOffs = 0; + mLockOnNum = 0; + mActionOffs = 0; + mActionNum = 0; + initList(0xFFFFFFFF); + return 0; } /* 8009E764-8009E978 .text chaseAttention__12dAttention_cFv */ @@ -232,8 +336,15 @@ void dAttDraw_c::draw(cXyz&, float(*)[4]) { } /* 8009F834-8009F88C .text LockonTarget__12dAttention_cFl */ -void dAttention_c::LockonTarget(long) { - /* Nonmatching */ +fopAc_ac_c* dAttention_c::LockonTarget(s32 idx) { + if (idx >= mLockOnNum) + return NULL; + + s32 listIdx = mLockOnOffs + idx; + if (listIdx >= mLockOnNum) + listIdx -= mLockOnNum; + + return mLockOnList[listIdx].getActor(); } /* 8009F88C-8009F980 .text LockonReleaseDistanse__12dAttention_cFv */ @@ -242,68 +353,101 @@ void dAttention_c::LockonReleaseDistanse() { } /* 8009F980-8009F9B8 .text LockonTargetPId__12dAttention_cFl */ -void dAttention_c::LockonTargetPId(long) { - /* Nonmatching */ +unsigned int dAttention_c::LockonTargetPId(s32 idx) { + if (idx >= mLockOnNum) + return NULL; + + s32 listIdx = mLockOnOffs + idx; + if (listIdx >= mLockOnNum) + listIdx -= mLockOnNum; + + return mLockOnList[listIdx].getPid(); } /* 8009F9B8-8009FA10 .text ActionTarget__12dAttention_cFl */ -void dAttention_c::ActionTarget(long) { - /* Nonmatching */ +fopAc_ac_c* dAttention_c::ActionTarget(s32 idx) { + if (idx >= mActionNum) + return NULL; + + s32 listIdx = mActionOffs + idx; + if (listIdx >= mActionNum) + listIdx -= mActionNum; + + return mActionList[listIdx].getActor(); } /* 8009FA10-8009FA64 .text LockonTruth__12dAttention_cFv */ -void dAttention_c::LockonTruth() { - /* Nonmatching */ +bool dAttention_c::LockonTruth() { + return mLockOnState == 1 || (mLockOnState == 2 && LockonTarget(0)); } /* 8009FA64-8009FA98 .text getActor__10dAttList_cFv */ -void dAttList_c::getActor() { - /* Nonmatching */ +fopAc_ac_c* dAttList_c::getActor() { + return fopAcM_SearchByID(mActorID); } /* 8009FA98-8009FAB4 .text setActor__10dAttList_cFP10fopAc_ac_c */ -void dAttList_c::setActor(fopAc_ac_c*) { - /* Nonmatching */ +void dAttList_c::setActor(fopAc_ac_c* i_actor) { + mActorID = fpcM_GetID(i_actor); } /* 8009FAB4-8009FACC .text getPId__10dAttHint_cFPv */ -void dAttHint_c::getPId(void*) { - /* Nonmatching */ +u32 dAttHint_c::getPId(void* i_proc) { + return fpcM_GetID(i_proc); } /* 8009FACC-8009FAFC .text convPId__10dAttHint_cFUi */ -void dAttHint_c::convPId(unsigned int) { - /* Nonmatching */ +fopAc_ac_c* dAttHint_c::convPId(unsigned int i_procID) { + return fopAcM_SearchByID(i_procID); } /* 8009FAFC-8009FB58 .text request__10dAttHint_cFP10fopAc_ac_ci */ -void dAttHint_c::request(fopAc_ac_c*, int) { - /* Nonmatching */ +int dAttHint_c::request(fopAc_ac_c* i_actor, int priority) { + if (priority < 0) + priority = 0x1FF; + + if (priority <= mPriority) { + mHintActorID = getPId(i_actor); + mPriority = priority; + } + + return TRUE; } /* 8009FB58-8009FB70 .text init__10dAttHint_cFv */ void dAttHint_c::init() { - /* Nonmatching */ + mHintActorID = -1; + field_0x8 = -1; + mPriority = 0x200; } /* 8009FB70-8009FB8C .text proc__10dAttHint_cFv */ void dAttHint_c::proc() { - /* Nonmatching */ + field_0x8 = mHintActorID; + mHintActorID = -1; + mPriority = 0x200; } /* 8009FB8C-8009FBBC .text convPId__11dAttCatch_cFUi */ -void dAttCatch_c::convPId(unsigned int) { - /* Nonmatching */ +fopAc_ac_c* dAttCatch_c::convPId(unsigned int i_procID) { + return fopAcM_SearchByID(i_procID); } /* 8009FBBC-8009FBDC .text init__11dAttCatch_cFv */ void dAttCatch_c::init() { - /* Nonmatching */ + field_0xc = 0x56; + field_0x0 = -1; + mCatghTargetID = -1; + field_0x4 = 3; } /* 8009FBDC-8009FC08 .text proc__11dAttCatch_cFv */ void dAttCatch_c::proc() { - /* Nonmatching */ + mCatghTargetID = field_0x0; + mChangeItem = field_0xc; + field_0x0 = -1; + field_0x4 = 3; + field_0xc = 0x56; } /* 8009FC08-8009FE10 .text request__11dAttCatch_cFP10fopAc_ac_cUcfffsi */ @@ -312,18 +456,22 @@ void dAttCatch_c::request(fopAc_ac_c*, unsigned char, float, float, float, short } /* 8009FE10-8009FE40 .text convPId__10dAttLook_cFUi */ -void dAttLook_c::convPId(unsigned int) { - /* Nonmatching */ +fopAc_ac_c* dAttLook_c::convPId(unsigned int i_procID) { + return fopAcM_SearchByID(i_procID); } /* 8009FE40-8009FE58 .text init__10dAttLook_cFv */ void dAttLook_c::init() { - /* Nonmatching */ + field_0x0 = -1; + mLookTargetID = -1; + field_0x4 = 3; } /* 8009FE58-8009FE74 .text proc__10dAttLook_cFv */ void dAttLook_c::proc() { - /* Nonmatching */ + mLookTargetID = field_0x0; + field_0x0 = -1; + field_0x4 = 3; } /* 8009FE74-800A009C .text request__10dAttLook_cFP10fopAc_ac_cfffsi */ diff --git a/src/d/d_com_inf_game.cpp b/src/d/d_com_inf_game.cpp index 13f011723..dea1270c2 100644 --- a/src/d/d_com_inf_game.cpp +++ b/src/d/d_com_inf_game.cpp @@ -616,7 +616,7 @@ stage_camera_class* dComIfGp_getRoomCamera(int i_roomNo) { return NULL; } - return status->mRoomDt.getCamera(); + return status->getCamera(); } /* 80053778-800537C8 .text dComIfGp_getRoomArrow__Fi */ @@ -627,7 +627,7 @@ stage_arrow_class* dComIfGp_getRoomArrow(int i_roomNo) { return NULL; } - return status->mRoomDt.getArrow(); + return status->getArrow(); } /* 800537C8-8005388C .text dComIfGp_setNextStage__FPCcsScScfUliSc */ diff --git a/src/d/d_kankyo.cpp b/src/d/d_kankyo.cpp index db389ffaf..e1764eb5d 100644 --- a/src/d/d_kankyo.cpp +++ b/src/d/d_kankyo.cpp @@ -80,7 +80,7 @@ static u16 lightMaskData[] = { BOOL toon_proc_check() { s32 roomNo = dComIfGp_roomControl_getStayNo(); if (roomNo >= 0) { - dComIfGp_roomControl_getStatusRoomDt(roomNo)->mRoomDt.getFileListInfo(); + dComIfGp_roomControl_getStatusRoomDt(roomNo)->getFileListInfo(); } return false; @@ -1718,7 +1718,7 @@ void dScnKy_env_light_c::SetBaseLight() { int roomNo = dComIfGp_roomControl_getStayNo(); if (roomNo >= 0) { - plight_p = dComIfGp_roomControl_getStatusRoomDt(roomNo)->mRoomDt.getLightVecInfo(); + plight_p = dComIfGp_roomControl_getStatusRoomDt(roomNo)->getLightVecInfo(); } if (plight_p != NULL) { diff --git a/src/d/d_kankyo_rain.cpp b/src/d/d_kankyo_rain.cpp index ab5386f9d..b0668b507 100644 --- a/src/d/d_kankyo_rain.cpp +++ b/src/d/d_kankyo_rain.cpp @@ -74,6 +74,12 @@ void dKy_set_eyevect_calc2(camera_class* i_camera, Vec* param_1, f32 param_2, f3 } } +static inline void dKyr_init_btitex(GXTexObj* i_obj, ResTIMG* i_img) { + GXInitTexObj(i_obj, (&i_img->format + i_img->imageOffset), i_img->width, i_img->height, + (GXTexFmt)i_img->format, (GXTexWrapMode)i_img->wrapS, (GXTexWrapMode)i_img->wrapT, + (GXBool)(i_img->mipmapCount > 1)); +} + /* 8008AD60-8008AE54 .text dKyr_set_btitex__FP9_GXTexObjP7ResTIMG */ void dKyr_set_btitex(GXTexObj* i_obj, ResTIMG* i_img) { GXInitTexObj(i_obj, (&i_img->format + i_img->imageOffset), i_img->width, i_img->height, @@ -269,7 +275,19 @@ void vrkumo_move() { /* 800940D4-80094144 .text dKy_wave_chan_init__Fv */ void dKy_wave_chan_init() { - /* Nonmatching */ + g_env_light.mWaveChan.field_0x0 = -1.0f; + g_env_light.mWaveChan.field_0x4 = 0.0f; + g_env_light.mWaveChan.field_0x8 = 0.0f; + g_env_light.mWaveChan.mWaveSpeed = 0.1f; + g_env_light.mWaveChan.mWaveSpawnDist = 3000.0f; + g_env_light.mWaveChan.mWaveSpawnRadius = 3150.0f; + g_env_light.mWaveChan.mWaveScale = 250.0f; + g_env_light.mWaveChan.mWaveScaleRand = 0.217f; + g_env_light.mWaveChan.mWaveCounterSpeedScale = 1.6f; + g_env_light.mWaveChan.mWaveScaleBottom = 5.0f; + g_env_light.mWaveChan.mWaveCount = 0; + g_env_light.mWaveChan.mWaveReset = 0; + g_env_light.mWaveChan.field_0x2f = 0; } /* 80094144-8009428C .text snap_sunmoon_proc__FP4cXyzi */ @@ -293,8 +311,103 @@ void dKyr_drawRain(Mtx, u8**) { } /* 8009682C-80096D18 .text dKyr_drawSibuki__FPA4_fPPUc */ -void dKyr_drawSibuki(Mtx, u8**) { - /* Nonmatching */ +void dKyr_drawSibuki(Mtx drawMtx, u8** pImg) { + dKankyo_rain_Packet * pPkt = g_env_light.mpRainPacket; + camera_class *pCamera = dComIfGp_getCamera(0); + + if (g_env_light.mSnowCount != 0 || dComIfGd_getView() == NULL) + return; + + Mtx camMtx; + MTXInverse(dComIfGd_getViewRotMtx(), camMtx); + + f32 alpha = 200.0f; + if (pPkt->mStatus & 1) + alpha = 0.0f; + + cLib_addCalc(&pPkt->mSibukiAlpha, alpha, 0.2f, 30.0f, 0.001f); + + cXyz eyevect, camDir; + dKy_set_eyevect_calc(pCamera, &eyevect, 7000.0f, 4000.0f); + dKyr_get_vectle_calc(&pCamera->mLookat.mEye, &pCamera->mLookat.mCenter, &camDir); + + float alphaFade = 0.0f; + if (camDir.y <= 0.0f) + alphaFade = 1.0f; + else if (camDir.y < 0.5f) + alphaFade = 1.0f - (camDir.y / 0.5f); + + GXColor color = { 0xB4, 0xC8, 0xC8, 0x00 }; + color.a = (u8)(pPkt->mSibukiAlpha * alphaFade); + + GXTexObj texObj; + dKyr_init_btitex(&texObj, (ResTIMG*)pImg[1]); + GXLoadTexObj(&texObj, GX_TEXMAP0); + + GXSetNumChans(0); + GXSetTevColor(GX_TEVREG0, color); + GXSetTevColor(GX_TEVREG1, color); + GXSetNumTexGens(1); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, false, GX_PTIDENTITY); + 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, 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, true, GX_TEVPREV); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_SET); + GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0); + GXSetZMode(true, GX_GEQUAL, false); + GXSetCullMode(GX_CULL_NONE); + GXSetClipMode(GX_CLIP_DISABLE); + GXSetNumIndStages(0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S16, 8); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GXLoadPosMtxImm(drawMtx, GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + + f32 scale; + if (dComIfGd_getView() == NULL) { + scale = 0.2f; + } else { + scale = dComIfGd_getView()->mFovy / 20.0f; + if (scale >= 1.0f) + scale = 1.0f; + scale = 1.0f - scale; + } + + for (s32 i = 0; i < g_env_light.mRainCount / 2; i++) { + f32 size = 20.0f + scale * cM_rndF(25.0f); + + f32 x = eyevect.x + cM_rndFX(3600.0f); + f32 y = eyevect.y + cM_rndFX(1500.0f); + f32 z = eyevect.z + cM_rndFX(3600.0f); + + f32 x0 = x - size, x1 = x + size; + f32 z0 = z - size, z1 = z + size; + + cXyz p0( x0, y, z0 ); + cXyz p1( x1, y, z0 ); + cXyz p2( x1, y, z1 ); + cXyz p3( x0, y, z1 ); + + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + GXPosition3f32(p0.x, p0.y, p0.z); + GXTexCoord2s16(0, 0); + GXPosition3f32(p1.x, p1.y, p1.z); + GXTexCoord2s16(0x1FF, 0); + GXPosition3f32(p2.x, p2.y, p2.z); + GXTexCoord2s16(0x1FF, 0x1FF); + GXPosition3f32(p3.x, p3.y, p3.z); + GXTexCoord2s16(0, 0x1FF); + i_GXEnd(); + } + + GXSetClipMode(GX_CLIP_ENABLE); + J3DShape::sOldVcdVatCmd = NULL; } /* 80096D18-800973CC .text drawPoison__FPA4_fPPUc */ @@ -339,7 +452,7 @@ void drawVrkumo(Mtx, GXColor&, u8**) { /* 8009B9C4-8009B9D8 .text dKyr_thunder_init__Fv */ void dKyr_thunder_init() { - /* Nonmatching */ + g_env_light.mThunderEff.mStateTimer = 0; } /* 8009B9D8-8009BDEC .text dKyr_thunder_move__Fv */ diff --git a/src/d/d_kankyo_wether.cpp b/src/d/d_kankyo_wether.cpp index 6cfe103bd..64883b07e 100644 --- a/src/d/d_kankyo_wether.cpp +++ b/src/d/d_kankyo_wether.cpp @@ -399,7 +399,7 @@ void wether_move_windline() { int roomNo = dComIfGp_roomControl_getStayNo(); if (roomNo >= 0) { - fili_p = dComIfGp_roomControl_getStatusRoomDt(roomNo)->mRoomDt.getFileListInfo(); + fili_p = dComIfGp_roomControl_getStatusRoomDt(roomNo)->getFileListInfo(); } g_env_light.mWindlineCount = 0; @@ -989,7 +989,7 @@ void dKyw_wind_set() { s32 roomNo = dComIfGp_roomControl_getStayNo(); if (roomNo >= 0) { - fili_p = dComIfGp_roomControl_getStatusRoomDt(roomNo)->mRoomDt.getFileListInfo(); + fili_p = dComIfGp_roomControl_getStatusRoomDt(roomNo)->getFileListInfo(); } s16 tact_wind_x; @@ -1146,16 +1146,16 @@ void dKyw_pntwind_init() { /* 8008A144-8008A1A8 .text pntwind_set__FP14WIND_INFLUENCE */ void pntwind_set(WIND_INFLUENCE* i_influence) { int i = 0; - for (; i < 30; i++) { + for (; i < ARRAY_SIZE(g_env_light.mpWindInfluence); i++) { if (g_env_light.mpWindInfluence[i] == NULL) { g_env_light.mpWindInfluence[i] = i_influence; - g_env_light.mpWindInfluence[i]->field_0x24 = i; + g_env_light.mpWindInfluence[i]->mRegistIdx = i; break; } } if (i >= 30) { - i_influence->field_0x24 = 9999; + i_influence->mRegistIdx = 9999; } } @@ -1174,8 +1174,8 @@ void dKyw_pwind_cylinder_set(WIND_INFLUENCE* i_influence) { /* 8008A1F8-8008A230 .text dKyw_pntwind_cut__FP14WIND_INFLUENCE */ void dKyw_pntwind_cut(WIND_INFLUENCE* i_influence) { if (i_influence != NULL) { - if (i_influence->field_0x24 >= 0 && i_influence->field_0x24 < 30) { - g_env_light.mpWindInfluence[i_influence->field_0x24] = NULL; + if (i_influence->mRegistIdx >= 0 && i_influence->mRegistIdx < 30) { + g_env_light.mpWindInfluence[i_influence->mRegistIdx] = NULL; } } } @@ -1188,7 +1188,7 @@ void dKyw_pntwind_get_info(cXyz* param_0, cXyz* i_dir, f32* i_power) { *i_power = 0.0f; WIND_INFLUENCE* influence; - for (int i = 0; i < 30; i++) { + for (int i = 0; i < ARRAY_SIZE(g_env_light.mpWindInfluence); i++) { influence = g_env_light.mpWindInfluence[i]; if (influence != NULL) { f32 dist = param_0->abs(influence->mPos); @@ -1376,7 +1376,7 @@ BOOL dKyw_gbwind_use_check() { if (g_env_light.mWind.mpWindVecOverride == NULL) { s32 roomNo = dComIfGp_roomControl_getStayNo(); if (roomNo >= 0) { - fili_p = dComIfGp_roomControl_getStatusRoomDt(roomNo)->mRoomDt.getFileListInfo(); + fili_p = dComIfGp_roomControl_getStatusRoomDt(roomNo)->getFileListInfo(); } if (fili_p != NULL && dStage_FileList_dt_GlobalWindLevel(fili_p) <= 2) {