From 9c91b939a76f0c6c922ec3829f7f8329bfdd8446 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sat, 7 Oct 2023 20:06:56 -0400 Subject: [PATCH] d_a_player OK --- configure.py | 2 +- include/JSystem/JParticle/JPAEmitter.h | 16 +++- include/JSystem/JParticle/JPAParticle.h | 2 +- include/d/actor/d_a_player.h | 89 +++++++++++++++++----- include/d/d_cc_d.h | 2 + include/d/d_com_inf_game.h | 5 ++ include/d/d_particle.h | 4 +- src/d/actor/d_a_agb.cpp | 32 ++++---- src/d/actor/d_a_obj_toripost.cpp | 2 +- src/d/actor/d_a_player.cpp | 98 ++++++++++++++++++------- src/d/d_com_inf_game.cpp | 22 +++--- 11 files changed, 198 insertions(+), 76 deletions(-) diff --git a/configure.py b/configure.py index 96ac9f916..7ba94d1f3 100644 --- a/configure.py +++ b/configure.py @@ -432,7 +432,7 @@ config.libs = [ Object(Matching, "d/actor/d_a_nh.cpp"), Object(NonMatching, "d/actor/d_a_npc_fa1.cpp"), Object(NonMatching, "d/actor/d_a_obj_search.cpp"), - Object(NonMatching, "d/actor/d_a_player.cpp"), + Object(Matching, "d/actor/d_a_player.cpp"), Object(NonMatching, "d/actor/d_a_player_main.cpp"), Object(NonMatching, "d/actor/d_a_player_npc.cpp"), Object(NonMatching, "d/actor/d_a_sea.cpp"), diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index 7e42fbc35..349593acd 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -78,6 +78,9 @@ public: void getPivotY(); void setStatus(u32 status) { mFlags |= status; } + void clearStatus(u32 status) { mFlags &= ~status; } + bool checkStatus(u32 status) { return mFlags & status; } + void initStatus(u32 status); u8 getGlobalAlpha() { return mGlobalPrmColor.a; } void setGlobalAlpha(u8 alpha) { mGlobalPrmColor.a = alpha; } @@ -102,12 +105,21 @@ public: void setRate(float i_rate) { mRate = i_rate; } void stopCreateParticle() { setStatus(JPAEmtrStts_StopEmit); } + void becomeImmortalEmitter() { setStatus(JPAEmtrStts_Immortal); } + void quitImmortalEmitter() { clearStatus(JPAEmtrStts_Immortal); } void becomeInvalidEmitter() { mMaxFrame = -1; stopCreateParticle(); } + void setEmitterCallBackPtr(JPACallBackBase* callback) { + mpEmitterCallBack = callback; + } + void setParticleCallBackPtr(JPACallBackBase2* callback) { + mpParticleCallBack = callback; + } + /* 0x000 */ VolumeFunc mVolumeFunc; /* 0x00C */ cXyz mEmitterScale; /* 0x018 */ cXyz mEmitterTranslation; @@ -148,8 +160,8 @@ public: /* 0x188 */ JSUPtrList mChildParticles; /* 0x194 */ JSUPtrList* mpPtclVacList; /* 0x198 */ JPADataBlockLinkInfo* mpDataLinkInfo; - /* 0x19C */ JPACallBackBase* mpEmitterCallBack; - /* 0x1A0 */ JPACallBackBase2* mpParticleCallBack; + /* 0x19C */ JPACallBackBase* mpEmitterCallBack; + /* 0x1A0 */ JPACallBackBase2* mpParticleCallBack; /* 0x1A4 */ JMath::TRandom_fast_ mRandomSeed; /* 0x1A8 */ Mtx mGlobalRotation; /* 0x1D8 */ JGeometry::TVec3 mGlobalScale; diff --git a/include/JSystem/JParticle/JPAParticle.h b/include/JSystem/JParticle/JPAParticle.h index 81565a9ff..3ab594179 100644 --- a/include/JSystem/JParticle/JPAParticle.h +++ b/include/JSystem/JParticle/JPAParticle.h @@ -63,7 +63,7 @@ public: /* 0xC2 */ s16 mRotateSpeed; /* 0xC4 */ u8 field_0xC4[0xC6 - 0xC4]; /* 0xC6 */ u16 mTexIdx; - /* 0xC8 */ JPACallBackBase2* mpCallBack2; + /* 0xC8 */ JPACallBackBase2* mpCallBack2; /* 0xCC */ u32 mFlags; }; diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index 71b36cda3..17930b785 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -16,15 +16,16 @@ public: virtual void calc(J3DMaterial*) const; }; -class daPy_mtxFollowEcallBack_c { +class daPy_mtxFollowEcallBack_c : public dPa_levelEcallBack { public: void execute(JPABaseEmitter*); void end(); - void makeEmitter(unsigned short, float(*)[4], const cXyz*, const cXyz*); - void makeEmitterColor(unsigned short, float(*)[4], const cXyz*, const _GXColor*, const _GXColor*); - void setup(JPABaseEmitter*, const cXyz*, const csXyz*, signed char); + void makeEmitter(u16, MtxP, const cXyz*, const cXyz*); + void makeEmitterColor(u16, MtxP, const cXyz*, const _GXColor*, const _GXColor*); + void setup(JPABaseEmitter* emitter, const cXyz*, const csXyz*, s8) { mpEmitter = emitter; } - /* 0x0 */ u8 field_0x0[0xC]; + /* 0x04 */ JPABaseEmitter* mpEmitter; + /* 0x08 */ MtxP mpMtx; }; class daPy_HIO_c { @@ -66,15 +67,41 @@ private: class daPy_py_c : public fopAc_ac_c { public: enum daPy_PROC {}; - + + enum daPy_FLG0 { + daPyFlg0_CUT_AT_FLG = 0x00000040, + daPyFlg0_PUSH_PULL_KEEP = 0x00000800, + daPyFlg0_UNK1000 = 0x00001000, + daPyFlg0_UNK200000 = 0x00200000, + daPyFlg0_EQUIP_HEAVY_BOOTS = 0x02000000, + daPyFlg0_NO_DRAW = 0x08000000, + daPyFlg0_HEAVY_STATE = 0x40000000, + }; + + enum daPy_FLG1 { + daPy_FLG1_EQUIP_DRAGON_SHIELD = 0x00000001, + daPy_FLG1_NPC_CALL_COMMAND = 0x00000002, + daPy_FLG1_FORCE_VOMIT_JUMP = 0x00000010, + daPy_FLG1_NPC_NOT_CHANGE = 0x00000040, + daPy_FLG1_CONFUSE = 0x00000100, + daPy_FLG1_SHIP_TACT = 0x00001000, + daPy_FLG1_USE_ARROW_EFFECT = 0x00002000, + daPy_FLG1_LETTER_READ_EYE_MOVE = 0x00004000, + daPy_FLG1_UNK8000 = 0x00008000, + daPy_FLG1_FOREST_WATER_USE = 0x00020000, + daPy_FLG1_WATER_DROP = 0x00080000, + daPy_FLG1_VINE_CATCH = 0x02000000, + daPy_FLG1_LAST_COMBO_WAIT = 0x20000000, + }; + /* 0x290 */ u8 mAttackState; /* 0x291 */ u8 field_0x291; /* 0x292 */ u8 field_0x292[0x294 - 0x292]; /* 0x294 */ s16 mDamageWaitTimer; /* 0x296 */ s16 mQuakeTimer; /* 0x298 */ int field_0x298; - /* 0x29C */ u32 field_0x29c; - /* 0x2A0 */ u32 field_0x2a0; + /* 0x29C */ u32 mNoResetFlg0; + /* 0x2A0 */ u32 mNoResetFlg1; /* 0x2A4 */ u32 field_0x2a4; /* 0x2A8 */ f32 field_0x2a8; /* 0x2AC */ u8 field_0x2AC[0x2B0 - 0x2AC]; @@ -86,9 +113,7 @@ public: /* 0x2D4 */ cXyz field_0x2d4; /* 0x2E0 */ cXyz field_0x2e0; /* 0x2EC */ cXyz mRopePos; - /* 0x2F8 */ f32 field_0x2f8; - /* 0x2FC */ u8 field_0x2FC[0x300 - 0x2FC]; - /* 0x300 */ f32 field_0x300; + /* 0x2F8 */ cXyz field_0x2f8; /* 0x304 */ daPy_demo_c mDemo; u8 getCutType() const { return mAttackState; } @@ -97,9 +122,41 @@ public: s16 getBodyAngleY() { return mBodyAngle.y; } void changeDemoMoveAngle(s16 angle) { mDemo.setMoveAngle(angle); } - void onPlayerNoDraw() { field_0x29c |= 0x8000000; } - void offPlayerNoDraw() { field_0x29c &= ~0x8000000; } - + void onNoResetFlg0(daPy_FLG0 flag) { mNoResetFlg0 |= flag; } + void offNoResetFlg0(daPy_FLG0 flag) { mNoResetFlg0 &= ~flag; } + bool checkNoResetFlg0(daPy_FLG0 flag) const { return mNoResetFlg0 & flag; } + bool getCutAtFlg() const { return checkNoResetFlg0(daPyFlg0_CUT_AT_FLG); } + void onPushPullKeep() { onNoResetFlg0(daPyFlg0_PUSH_PULL_KEEP); } + void offPushPullKeep() { offNoResetFlg0(daPyFlg0_PUSH_PULL_KEEP); } + bool checkEquipHeavyBoots() const { return checkNoResetFlg0(daPyFlg0_EQUIP_HEAVY_BOOTS); } + void onPlayerNoDraw() { onNoResetFlg0(daPyFlg0_NO_DRAW); } + void offPlayerNoDraw() { offNoResetFlg0(daPyFlg0_NO_DRAW); } + void onHeavyState() { onNoResetFlg0(daPyFlg0_HEAVY_STATE); } + void offHeavyState() { offNoResetFlg0(daPyFlg0_HEAVY_STATE); } + + void onNoResetFlg1(daPy_FLG1 flag) { mNoResetFlg1 |= flag; } + void offNoResetFlg1(daPy_FLG1 flag) { mNoResetFlg1 &= ~flag; } + bool checkNoResetFlg1(daPy_FLG1 flag) const { return mNoResetFlg1 & flag; } + bool checkEquipDragonShield() const { return checkNoResetFlg1(daPy_FLG1_EQUIP_DRAGON_SHIELD); } + void onNpcCall() { onNoResetFlg1(daPy_FLG1_NPC_CALL_COMMAND); } + void offNpcCallCommand() { offNoResetFlg1(daPy_FLG1_NPC_CALL_COMMAND); } + bool checkNpcCallCommand() const { return checkNoResetFlg1(daPy_FLG1_NPC_CALL_COMMAND); } + void onForceVomitJump() { onNoResetFlg1(daPy_FLG1_FORCE_VOMIT_JUMP); } + void onNpcNotChange() { onNoResetFlg1(daPy_FLG1_NPC_NOT_CHANGE); } + void offNpcNotChange() { offNoResetFlg1(daPy_FLG1_NPC_NOT_CHANGE); } + void onConfuse() { onNoResetFlg1(daPy_FLG1_CONFUSE); } + void offConfuse() { offNoResetFlg1(daPy_FLG1_CONFUSE); } + bool checkConfuse() const { return checkNoResetFlg1(daPy_FLG1_CONFUSE); } + void onShipTact() { onNoResetFlg1(daPy_FLG1_SHIP_TACT); } + void offShipTact() { offNoResetFlg1(daPy_FLG1_SHIP_TACT); } + void onUseArrowEffect() { onNoResetFlg1(daPy_FLG1_USE_ARROW_EFFECT); } + void offUseArrowEffect() { offNoResetFlg1(daPy_FLG1_USE_ARROW_EFFECT); } + void onLetterReadEyeMove() { onNoResetFlg1(daPy_FLG1_LETTER_READ_EYE_MOVE); } + bool checkForestWaterUse() const { return checkNoResetFlg1(daPy_FLG1_FOREST_WATER_USE); } + void onWaterDrop() { onNoResetFlg1(daPy_FLG1_WATER_DROP); } + void onVineCatch() { onNoResetFlg1(daPy_FLG1_VINE_CATCH); } + bool checkLastComboWait() const { return checkNoResetFlg1(daPy_FLG1_LAST_COMBO_WAIT); } + virtual MtxP getLeftHandMatrix() = 0; virtual MtxP getRightHandMatrix() = 0; virtual void getGroundY() = 0; @@ -133,7 +190,7 @@ public: virtual void setHookshotCarryOffset(unsigned int, const cXyz*); virtual void setPlayerPosAndAngle(cXyz*, s16); virtual void setPlayerPosAndAngle(cXyz*, csXyz*); - virtual void setPlayerPosAndAngle(float (*)[4]); + virtual void setPlayerPosAndAngle(MtxP); virtual void setThrowDamage(cXyz*, s16, f32, f32, int); virtual void changeTextureAnime(u16, u16, int); virtual void cancelChangeTextureAnime(); @@ -148,8 +205,6 @@ public: void setDoButtonQuake(); void stopDoButtonQuake(int); void getRopePos() const; - - BOOL checkConfuse() { return field_0x2a0 & 0x100; } }; #endif /* D_A_PLAYER */ diff --git a/include/d/d_cc_d.h b/include/d/d_cc_d.h index ac0ef47c1..674bbe32b 100644 --- a/include/d/d_cc_d.h +++ b/include/d/d_cc_d.h @@ -220,6 +220,7 @@ public: u8 GetHitMark() { return mHitMark; } void SetRVec(cXyz& vec) { mRVec = vec; } cXyz* GetVecP() { return &mVec; } + cXyz* GetRVecP() { return &mRVec; } void SetHitPos(cXyz& pos) { mHitPos = pos; } cXyz* GetHitPosP() { return &mHitPos; } inline void ClrHit() { ClrActorInfo(); } @@ -294,6 +295,7 @@ public: bool ChkAtShieldHit() { return mGObjAt.ChkRPrm(1); } cXyz* GetAtVecP() { return mGObjAt.GetVecP(); } cXyz* GetTgVecP() { return mGObjTg.GetVecP(); } + cXyz* GetTgRVecP() { return mGObjTg.GetRVecP(); } void SetAtSpl(dCcG_At_Spl spl) { mGObjAt.SetAtSpl(spl); } void SetAtHitCallback(dCcD_HitCallback callback) { mGObjAt.SetHitCallback(callback); } void SetTgHitCallback(dCcD_HitCallback callback) { mGObjTg.SetHitCallback(callback); } diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 1ff10474e..d0d343a59 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -330,6 +330,7 @@ public: fopAc_ac_c* getPlayerPtr(int idx) { return (fopAc_ac_c*)mpPlayerPtr[idx]; } fopAc_ac_c* getPlayer(int idx) { return (fopAc_ac_c*)mpPlayer[idx]; } + void setPlayer(int idx, fopAc_ac_c* player) { mpPlayer[idx] = (daPy_py_c*)player; } s8 getPlayerCameraID(int idx) { return mCurCamera[idx]; } int getItemRupeeCount() { return mItemRupeeCount; } @@ -1041,6 +1042,10 @@ inline fopAc_ac_c* dComIfGp_getPlayer(int idx) { return g_dComIfG_gameInfo.play.getPlayer(idx); } +inline void dComIfGp_setPlayer(int idx, fopAc_ac_c* player) { + g_dComIfG_gameInfo.play.setPlayer(idx, player); +} + inline fopAc_ac_c* dComIfGp_getCb1Player() { return g_dComIfG_gameInfo.play.getPlayerPtr(1); } diff --git a/include/d/d_particle.h b/include/d/d_particle.h index c4a9aa20e..9d0d2df4c 100644 --- a/include/d/d_particle.h +++ b/include/d/d_particle.h @@ -222,7 +222,7 @@ public: virtual void setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8); }; -class dPa_windPcallBack : JPACallBackBase2 { +class dPa_windPcallBack : public JPACallBackBase2 { public: dPa_windPcallBack(); virtual ~dPa_windPcallBack() {} @@ -240,7 +240,7 @@ public: virtual void setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8); }; -class dPa_ripplePcallBack : JPACallBackBase2 { +class dPa_ripplePcallBack : public JPACallBackBase2 { public: dPa_ripplePcallBack(); virtual ~dPa_ripplePcallBack() {} diff --git a/src/d/actor/d_a_agb.cpp b/src/d/actor/d_a_agb.cpp index f15566d00..8b6594686 100644 --- a/src/d/actor/d_a_agb.cpp +++ b/src/d/actor/d_a_agb.cpp @@ -53,15 +53,15 @@ u8 daAgb_c::mShop; /* 800CF5EC-800CF6B8 .text __ct__11daAgb_HIO_cFv */ daAgb_HIO_c::daAgb_HIO_c() { - field_0x04[0].r = 0; - field_0x04[0].g = 255; - field_0x04[0].b = 0; - field_0x04[0].a = 255; + field_0x04[0].mColor.r = 0; + field_0x04[0].mColor.g = 255; + field_0x04[0].mColor.b = 0; + field_0x04[0].mColor.a = 255; - field_0x04[1].r = 0; - field_0x04[1].g = 30; - field_0x04[1].b = 0; - field_0x04[1].a = 0; + field_0x04[1].mColor.r = 0; + field_0x04[1].mColor.g = 30; + field_0x04[1].mColor.b = 0; + field_0x04[1].mColor.a = 0; field_0x14 = 24.0f; field_0x18 = 50.0f; @@ -678,7 +678,7 @@ void daAgb_c::GbaItemUse() { } if ((var_r28 == 0xC || var_r28 == 0xD) && - (daPy_getPlayerLinkActorClass()->field_0x2a0 & 1)) + (daPy_getPlayerLinkActorClass()->checkEquipDragonShield())) { var_r28 = 0xA; } @@ -760,14 +760,14 @@ void daAgb_c::GbaItemUse() { return; case 3: daPy_lk_c* temp_r3 = daPy_getPlayerLinkActorClass(); - temp_r3->field_0x29c |= 0x1000; + temp_r3->onNoResetFlg0(daPy_py_c::daPyFlg0_UNK1000); temp_r3->field_0x354c = 0x96; resetCursor(false); field_0x65c = 0x96; mBrk.setPlaySpeed(6.0f); break; case 0x12: - if (daPy_getPlayerLinkActorClass()->field_0x2a0 & 1) { + if (daPy_getPlayerLinkActorClass()->checkEquipDragonShield()) { mEffect = 0; return; } else { @@ -776,7 +776,7 @@ void daAgb_c::GbaItemUse() { } break; case 4: - if (daPy_getPlayerLinkActorClass()->field_0x2a0 & 1) { + if (daPy_getPlayerLinkActorClass()->checkEquipDragonShield()) { mEffect = 0; return; } else { @@ -792,9 +792,9 @@ void daAgb_c::GbaItemUse() { return; } else { daPy_lk_c* temp_r4 = daPy_getPlayerLinkActorClass(); - temp_r4->field_0x29c |= 0x1000; + temp_r4->onNoResetFlg0(daPy_py_c::daPyFlg0_UNK1000); temp_r4->field_0x354c = 300; - if (!(daPy_getPlayerLinkActorClass()->field_0x2a0 & 1)) { + if (!(daPy_getPlayerLinkActorClass()->checkEquipDragonShield())) { temp_r4->field_0x354e = 300; } @@ -808,7 +808,7 @@ void daAgb_c::GbaItemUse() { mEffect = BigLittleChange((field_0x660 << 0x10) | 0x300); return; } else { - if ((daPy_getPlayerLinkActorClass()->field_0x2a0 & 1)) { + if ((daPy_getPlayerLinkActorClass()->checkEquipDragonShield())) { mEffect = 0; return; } @@ -953,7 +953,7 @@ int daAgb_Execute(daAgb_c* i_this) { if (i_this->field_0x65c != 0) { if (i_this->field_0x66b == 3 || i_this->field_0x66b == 12) { daPy_lk_c* player_p = daPy_getPlayerLinkActorClass(); - player_p->field_0x29c |= 0x1000; + player_p->onNoResetFlg0(daPy_py_c::daPyFlg0_UNK1000); player_p->field_0x354c = 10; } else if (i_this->field_0x66b == 4 || i_this->field_0x66b == 13 || i_this->field_0x66b == 12) diff --git a/src/d/actor/d_a_obj_toripost.cpp b/src/d/actor/d_a_obj_toripost.cpp index df7c64d59..4e24787ff 100644 --- a/src/d/actor/d_a_obj_toripost.cpp +++ b/src/d/actor/d_a_obj_toripost.cpp @@ -321,7 +321,7 @@ void daObjTpost_c::cutDispLetterStart(int staffIdx) { void daObjTpost_c::cutDispLetterProc(int staffIdx) { u16 mode = talk(0); if(mode == 5) { - daPy_getPlayerActorClass()->field_0x2a0 |= 0x4000; // may be a onLetterReadEyeMove__9daPy_py_cFv inline based on debug map + daPy_getPlayerActorClass()->onLetterReadEyeMove(); } if(mode == dNpcMsgStts_BOX_CLOSED_e) { dComIfGp_evmng_cutEnd(staffIdx); diff --git a/src/d/actor/d_a_player.cpp b/src/d/actor/d_a_player.cpp index 20b930285..000055a4a 100644 --- a/src/d/actor/d_a_player.cpp +++ b/src/d/actor/d_a_player.cpp @@ -5,54 +5,102 @@ #include "dolphin/types.h" #include "d/actor/d_a_player.h" +#include "f_op/f_op_camera_mng.h" /* 801028FC-80102940 .text changePlayer__9daPy_py_cFP10fopAc_ac_c */ -void daPy_py_c::changePlayer(fopAc_ac_c*) { - /* Nonmatching */ +void daPy_py_c::changePlayer(fopAc_ac_c* newPlayer) { + if (!newPlayer) { + return; + } + if (dComIfGp_roomControl_getStayNo() != newPlayer->getRoomNo()) { + return; + } + dComIfGp_setPlayer(0, newPlayer); + dComIfGp_getCamera(0)->mCamera.mpPlayerActor = newPlayer; + dComIfGp_getAttention().mFlags |= 0x80; } /* 80102940-80102B84 .text objWindHitCheck__9daPy_py_cFP8dCcD_Cyl */ -void daPy_py_c::objWindHitCheck(dCcD_Cyl*) { - /* Nonmatching */ +void daPy_py_c::objWindHitCheck(dCcD_Cyl* cyl) { + cXyz targetSpeed(0.0f, 0.0f, 0.0f); + f32 maxStep = 3.0f; + + if (cyl->ChkTgHit()) { + cCcD_Obj* hitObj = cyl->GetTgHitObj(); + if (hitObj && hitObj->GetAtType() & AT_TYPE_LEAF_WIND) { + targetSpeed = *cyl->GetTgRVecP(); + f32 distXZ = cyl->GetTgRVecP()->absXZ(); + maxStep = 1.0f; + if (distXZ < 1.0f) { + targetSpeed = (current.pos - *cyl->GetTgHitPosP()) * 30.0f; + distXZ = targetSpeed.absXZ(); + } + if (distXZ > 30.0f) { + targetSpeed *= 30.0f / distXZ; + } + } + } + + cLib_addCalc(&field_0x2f8.x, targetSpeed.x, 0.5f, maxStep, 0.5f); + cLib_addCalc(&field_0x2f8.z, targetSpeed.z, 0.5f, maxStep, 0.5f); + current.pos.x += field_0x2f8.x; + current.pos.z += field_0x2f8.z; } /* 80102B84-80102BB4 .text execute__25daPy_mtxFollowEcallBack_cFP14JPABaseEmitter */ -void daPy_mtxFollowEcallBack_c::execute(JPABaseEmitter*) { - /* Nonmatching */ +void daPy_mtxFollowEcallBack_c::execute(JPABaseEmitter* emitter) { + emitter->setGlobalRTMatrix(mpMtx); } /* 80102BB4-80102BF8 .text end__25daPy_mtxFollowEcallBack_cFv */ void daPy_mtxFollowEcallBack_c::end() { - /* Nonmatching */ + if (!mpEmitter) { + return; + } + mpEmitter->becomeInvalidEmitter(); + mpEmitter->quitImmortalEmitter(); + mpEmitter->setEmitterCallBackPtr(NULL); + mpEmitter = NULL; } /* 80102BF8-80102C84 .text makeEmitter__25daPy_mtxFollowEcallBack_cFUsPA4_fPC4cXyzPC4cXyz */ -void daPy_mtxFollowEcallBack_c::makeEmitter(unsigned short, float(*)[4], const cXyz*, const cXyz*) { - /* Nonmatching */ +void daPy_mtxFollowEcallBack_c::makeEmitter(u16 particleID, MtxP mtx, const cXyz* pos, const cXyz* scale) { + end(); + mpMtx = mtx; + dComIfGp_particle_setP1(particleID, pos, NULL, scale, 0xFF, this, -1, NULL, NULL, NULL); } /* 80102C84-80102D14 .text makeEmitterColor__25daPy_mtxFollowEcallBack_cFUsPA4_fPC4cXyzPC8_GXColorPC8_GXColor */ -void daPy_mtxFollowEcallBack_c::makeEmitterColor(unsigned short, float(*)[4], const cXyz*, const _GXColor*, const _GXColor*) { - /* Nonmatching */ +void daPy_mtxFollowEcallBack_c::makeEmitterColor(u16 particleID, MtxP mtx, const cXyz* pos, const _GXColor* prmColor, const _GXColor* envColor) { + end(); + mpMtx = mtx; + dComIfGp_particle_setP1(particleID, pos, NULL, NULL, 0xFF, this, -1, prmColor, envColor, NULL); } /* 80102D14-80102D90 .text setDoButtonQuake__9daPy_py_cFv */ void daPy_py_c::setDoButtonQuake() { - /* Nonmatching */ + if (checkNoResetFlg0(daPyFlg0_UNK200000)) { + return; + } + + onNoResetFlg0(daPyFlg0_UNK200000); + mQuakeTimer = 60; + + // u8 temp[4] = {0x00, 0x10, 0xFF, 0xEE}; // Doesn't match + u32 temp2 = 0x0010FFEE; + u8* temp = (u8*)&temp2; + dComIfGp_getVibration().StartQuake(temp, 0, 1, cXyz(0.0f, 1.0f, 0.0f)); } /* 80102D90-80102E18 .text stopDoButtonQuake__9daPy_py_cFi */ -void daPy_py_c::stopDoButtonQuake(int) { - /* Nonmatching */ +void daPy_py_c::stopDoButtonQuake(int param_1) { + if (mQuakeTimer > 0) { + mQuakeTimer--; + if (mQuakeTimer == 0) { + dComIfGp_getVibration().StopQuake(-1); + } + } + if (param_1 && mQuakeTimer == 0) { + mNoResetFlg0 &= ~0x00200000; + } } - -/* 80102E18-80102E84 .text __dt__25daPy_mtxFollowEcallBack_cFv */ -daPy_mtxFollowEcallBack_c::~daPy_mtxFollowEcallBack_c() { - /* Nonmatching */ -} - -/* 80102E84-80102E8C .text setup__25daPy_mtxFollowEcallBack_cFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ -void daPy_mtxFollowEcallBack_c::setup(JPABaseEmitter*, const cXyz*, const csXyz*, signed char) { - /* Nonmatching */ -} - diff --git a/src/d/d_com_inf_game.cpp b/src/d/d_com_inf_game.cpp index dea1270c2..94a396c98 100644 --- a/src/d/d_com_inf_game.cpp +++ b/src/d/d_com_inf_game.cpp @@ -42,10 +42,10 @@ void dComIfG_play_c::ct() { mpTreePacket = NULL; mpWoodPacket = NULL; mpFlowerPacket = NULL; - field_0x4A64[0] = 0xFF; - field_0x4A64[1] = 0xFF; - mLastSeaRoom = 0xFF; - field_0x4A67[0] = 0xFF; + mShipId = 0xFF; + mShipRoomId = 0xFF; + mIkadaShipBeforeRoomId = 0xFF; + mIkadaShipId = 0xFF; mIkadaLinkPos.set(0.0f, 0.0f, 0.0f); mLkDArcIdx = -1; @@ -566,8 +566,8 @@ dStage_Ship_data* dComIfGp_getShip(int i_roomNo, int param_1) { return NULL; } - dStage_Ship_c* ship_p = roomSt_p->mRoomDt.getShip(); - if (ship_p == NULL || ship_p->m_num <= 0 || param_1 == 0xFF) { + dStage_Ship_c* ship_p = roomSt_p->getShip(); + if (ship_p == NULL || ship_p->num <= 0 || param_1 == 0xFF) { return NULL; } @@ -576,7 +576,7 @@ dStage_Ship_data* dComIfGp_getShip(int i_roomNo, int param_1) { return NULL; } - for (int i = 0; i < ship_p->m_num; i++) { + for (int i = 0; i < ship_p->num; i++) { if (param_1 == data_p->field_0xe) { return data_p; } @@ -595,7 +595,7 @@ bool dComIfGp_getMapTrans(int i_roomNo, f32* o_transX, f32* o_transY, s16* o_ang } dStage_Mult_info* data_p = multi_p->m_entries; - for (int i = 0; i < multi_p->m_num; i++) { + for (int i = 0; i < multi_p->num; i++) { if (i_roomNo == data_p->mRoomNo) { *o_transX = data_p->mTransX; *o_transY = data_p->mTransY; @@ -636,15 +636,15 @@ void dComIfGp_setNextStage(const char* i_stageName, s16 i_point, s8 i_roomNo, s8 g_dComIfG_gameInfo.play.setNextStage(i_stageName, i_roomNo, i_point, i_layer, i_wipe); if (daPy_getPlayerLinkActorClass() != NULL) { - u32 mode = daPy_getPlayerLinkActorClass()->field_0x2a0; + u32 mode = daPy_getPlayerLinkActorClass()->mNoResetFlg1; - if (mode & 1) { + if (mode & daPy_lk_c::daPy_FLG1_EQUIP_DRAGON_SHIELD) { i_lastMode |= 0x8000; } i_lastMode |= daPy_getPlayerLinkActorClass()->field_0x354e << 0x10; - if (mode & 0x8000) { + if (mode & daPy_lk_c::daPy_FLG1_UNK8000) { i_lastMode |= 0x4000; } }