diff --git a/Progress.md b/Progress.md index 8b1c1ed3c6..57ae8702f5 100644 --- a/Progress.md +++ b/Progress.md @@ -21,8 +21,8 @@ Total | 54.954197% | 2209528 | 4020672 Section | Percentage | Decompiled (bytes) | Total (bytes) ---|---|---|--- main.dol | 54.954197% | 2209528 | 4020672 -RELs | 38.789690% | 4460940 | 11500324 -Total | 42.977062% | 6670468 | 15520996 +RELs | 38.794003% | 4461436 | 11500324 +Total | 42.980257% | 6670964 | 15520996 ## RELs @@ -217,7 +217,7 @@ d_a_midna | 22.953368% | 12404 | 54040 d_a_mirror | 100.000000% | 9808 | 9808 d_a_movie_player | 23.696790% | 8328 | 35144 d_a_myna | 44.792592% | 14124 | 31532 -d_a_nbomb | 28.739233% | 8808 | 30648 +d_a_nbomb | 30.357609% | 9304 | 30648 d_a_ni | 27.299309% | 8216 | 30096 d_a_npc_aru | 34.812103% | 12932 | 37148 d_a_npc_ash | 42.736140% | 13320 | 31168 @@ -785,4 +785,4 @@ d_a_vrbox2 | 44.907111% | 2804 | 6244 d_a_warp_bug | 100.000000% | 2024 | 2024 d_a_ykgr | 44.400631% | 2252 | 5072 f_pc_profile_lst | 100.000000% | 28156 | 28156 -Total | 38.789690% | 4460940 | 11500324 +Total | 38.794003% | 4461436 | 11500324 diff --git a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/checkTimerStop__9daNbomb_cFv.s b/asm/rel/d/a/d_a_nbomb/d_a_nbomb/checkTimerStop__9daNbomb_cFv.s deleted file mode 100644 index 3c653b33a2..0000000000 --- a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/checkTimerStop__9daNbomb_cFv.s +++ /dev/null @@ -1,20 +0,0 @@ -lbl_804C8294: -/* 804C8294 38 80 00 00 */ li r4, 0 -/* 804C8298 80 A3 00 B0 */ lwz r5, 0xb0(r3) -/* 804C829C 28 05 00 04 */ cmplwi r5, 4 -/* 804C82A0 41 82 00 2C */ beq lbl_804C82CC -/* 804C82A4 80 03 0B 4C */ lwz r0, 0xb4c(r3) -/* 804C82A8 70 00 0A 00 */ andi. r0, r0, 0xa00 -/* 804C82AC 40 82 00 20 */ bne lbl_804C82CC -/* 804C82B0 88 03 0B 54 */ lbz r0, 0xb54(r3) -/* 804C82B4 28 00 00 04 */ cmplwi r0, 4 -/* 804C82B8 41 82 00 18 */ beq lbl_804C82D0 -/* 804C82BC 28 00 00 05 */ cmplwi r0, 5 -/* 804C82C0 41 82 00 10 */ beq lbl_804C82D0 -/* 804C82C4 28 05 00 06 */ cmplwi r5, 6 -/* 804C82C8 40 82 00 08 */ bne lbl_804C82D0 -lbl_804C82CC: -/* 804C82CC 38 80 00 01 */ li r4, 1 -lbl_804C82D0: -/* 804C82D0 7C 83 23 78 */ mr r3, r4 -/* 804C82D4 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/coHitCallback__9daNbomb_cFP10fopAc_ac_c.s b/asm/rel/d/a/d_a_nbomb/d_a_nbomb/coHitCallback__9daNbomb_cFP10fopAc_ac_c.s deleted file mode 100644 index a9ce79e34e..0000000000 --- a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/coHitCallback__9daNbomb_cFP10fopAc_ac_c.s +++ /dev/null @@ -1,19 +0,0 @@ -lbl_804C6DCC: -/* 804C6DCC 88 04 04 96 */ lbz r0, 0x496(r4) -/* 804C6DD0 28 00 00 02 */ cmplwi r0, 2 -/* 804C6DD4 41 82 00 2C */ beq lbl_804C6E00 -/* 804C6DD8 80 A3 0B 4C */ lwz r5, 0xb4c(r3) -/* 804C6DDC 54 A0 05 6B */ rlwinm. r0, r5, 0, 0x15, 0x15 -/* 804C6DE0 4D 82 00 20 */ beqlr -/* 804C6DE4 54 A0 06 31 */ rlwinm. r0, r5, 0, 0x18, 0x18 -/* 804C6DE8 41 82 00 18 */ beq lbl_804C6E00 -/* 804C6DEC 3C A0 80 40 */ lis r5, g_dComIfG_gameInfo@ha /* 0x804061C0@ha */ -/* 804C6DF0 38 A5 61 C0 */ addi r5, r5, g_dComIfG_gameInfo@l /* 0x804061C0@l */ -/* 804C6DF4 80 05 5D B4 */ lwz r0, 0x5db4(r5) -/* 804C6DF8 7C 04 00 40 */ cmplw r4, r0 -/* 804C6DFC 4D 82 00 20 */ beqlr -lbl_804C6E00: -/* 804C6E00 80 03 0B 4C */ lwz r0, 0xb4c(r3) -/* 804C6E04 60 00 00 04 */ ori r0, r0, 4 -/* 804C6E08 90 03 0B 4C */ stw r0, 0xb4c(r3) -/* 804C6E0C 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Create__FP10fopAc_ac_c.s b/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Create__FP10fopAc_ac_c.s deleted file mode 100644 index 8c9d254c1d..0000000000 --- a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Create__FP10fopAc_ac_c.s +++ /dev/null @@ -1,9 +0,0 @@ -lbl_804C7E94: -/* 804C7E94 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 804C7E98 7C 08 02 A6 */ mflr r0 -/* 804C7E9C 90 01 00 14 */ stw r0, 0x14(r1) -/* 804C7EA0 4B FF F4 85 */ bl create__9daNbomb_cFv -/* 804C7EA4 80 01 00 14 */ lwz r0, 0x14(r1) -/* 804C7EA8 7C 08 03 A6 */ mtlr r0 -/* 804C7EAC 38 21 00 10 */ addi r1, r1, 0x10 -/* 804C7EB0 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Delete__FP9daNbomb_c.s b/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Delete__FP9daNbomb_c.s deleted file mode 100644 index 265396460b..0000000000 --- a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Delete__FP9daNbomb_c.s +++ /dev/null @@ -1,11 +0,0 @@ -lbl_804C826C: -/* 804C826C 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 804C8270 7C 08 02 A6 */ mflr r0 -/* 804C8274 90 01 00 14 */ stw r0, 0x14(r1) -/* 804C8278 38 80 FF FF */ li r4, -1 -/* 804C827C 4B FF FC 39 */ bl __dt__9daNbomb_cFv -/* 804C8280 38 60 00 01 */ li r3, 1 -/* 804C8284 80 01 00 14 */ lwz r0, 0x14(r1) -/* 804C8288 7C 08 03 A6 */ mtlr r0 -/* 804C828C 38 21 00 10 */ addi r1, r1, 0x10 -/* 804C8290 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Draw__FP9daNbomb_c.s b/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Draw__FP9daNbomb_c.s deleted file mode 100644 index 42b769cdba..0000000000 --- a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Draw__FP9daNbomb_c.s +++ /dev/null @@ -1,9 +0,0 @@ -lbl_804CC200: -/* 804CC200 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 804CC204 7C 08 02 A6 */ mflr r0 -/* 804CC208 90 01 00 14 */ stw r0, 0x14(r1) -/* 804CC20C 4B FF FA 55 */ bl draw__9daNbomb_cFv -/* 804CC210 80 01 00 14 */ lwz r0, 0x14(r1) -/* 804CC214 7C 08 03 A6 */ mtlr r0 -/* 804CC218 38 21 00 10 */ addi r1, r1, 0x10 -/* 804CC21C 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Execute__FP9daNbomb_c.s b/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Execute__FP9daNbomb_c.s deleted file mode 100644 index 8bf8c095ba..0000000000 --- a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Execute__FP9daNbomb_c.s +++ /dev/null @@ -1,9 +0,0 @@ -lbl_804CBC40: -/* 804CBC40 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 804CBC44 7C 08 02 A6 */ mflr r0 -/* 804CBC48 90 01 00 14 */ stw r0, 0x14(r1) -/* 804CBC4C 4B FF F2 9D */ bl execute__9daNbomb_cFv -/* 804CBC50 80 01 00 14 */ lwz r0, 0x14(r1) -/* 804CBC54 7C 08 03 A6 */ mtlr r0 -/* 804CBC58 38 21 00 10 */ addi r1, r1, 0x10 -/* 804CBC5C 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_coHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf.s b/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_coHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf.s deleted file mode 100644 index d83fe7c91d..0000000000 --- a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_coHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf.s +++ /dev/null @@ -1,10 +0,0 @@ -lbl_804C6E10: -/* 804C6E10 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 804C6E14 7C 08 02 A6 */ mflr r0 -/* 804C6E18 90 01 00 14 */ stw r0, 0x14(r1) -/* 804C6E1C 7C A4 2B 78 */ mr r4, r5 -/* 804C6E20 4B FF FF AD */ bl coHitCallback__9daNbomb_cFP10fopAc_ac_c -/* 804C6E24 80 01 00 14 */ lwz r0, 0x14(r1) -/* 804C6E28 7C 08 03 A6 */ mtlr r0 -/* 804C6E2C 38 21 00 10 */ addi r1, r1, 0x10 -/* 804C6E30 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_createHeap__FP10fopAc_ac_c.s b/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_createHeap__FP10fopAc_ac_c.s deleted file mode 100644 index 3d1b41b672..0000000000 --- a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_createHeap__FP10fopAc_ac_c.s +++ /dev/null @@ -1,9 +0,0 @@ -lbl_804C7304: -/* 804C7304 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 804C7308 7C 08 02 A6 */ mflr r0 -/* 804C730C 90 01 00 14 */ stw r0, 0x14(r1) -/* 804C7310 4B FF FE 05 */ bl createHeap__9daNbomb_cFv -/* 804C7314 80 01 00 14 */ lwz r0, 0x14(r1) -/* 804C7318 7C 08 03 A6 */ mtlr r0 -/* 804C731C 38 21 00 10 */ addi r1, r1, 0x10 -/* 804C7320 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_searchEnemy__FP10fopAc_ac_cPv.s b/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_searchEnemy__FP10fopAc_ac_cPv.s deleted file mode 100644 index f3d3d7d13b..0000000000 --- a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_searchEnemy__FP10fopAc_ac_cPv.s +++ /dev/null @@ -1,24 +0,0 @@ -lbl_804C70C0: -/* 804C70C0 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 804C70C4 7C 08 02 A6 */ mflr r0 -/* 804C70C8 90 01 00 14 */ stw r0, 0x14(r1) -/* 804C70CC 93 E1 00 0C */ stw r31, 0xc(r1) -/* 804C70D0 7C 7F 1B 78 */ mr r31, r3 -/* 804C70D4 88 03 04 96 */ lbz r0, 0x496(r3) -/* 804C70D8 28 00 00 02 */ cmplwi r0, 2 -/* 804C70DC 40 82 00 20 */ bne lbl_804C70FC -/* 804C70E0 7C 83 23 78 */ mr r3, r4 -/* 804C70E4 7F E4 FB 78 */ mr r4, r31 -/* 804C70E8 4B FF FE F1 */ bl searchEnemy__9daNbomb_cFP10fopAc_ac_c -/* 804C70EC 2C 03 00 00 */ cmpwi r3, 0 -/* 804C70F0 41 82 00 0C */ beq lbl_804C70FC -/* 804C70F4 7F E3 FB 78 */ mr r3, r31 -/* 804C70F8 48 00 00 08 */ b lbl_804C7100 -lbl_804C70FC: -/* 804C70FC 38 60 00 00 */ li r3, 0 -lbl_804C7100: -/* 804C7100 83 E1 00 0C */ lwz r31, 0xc(r1) -/* 804C7104 80 01 00 14 */ lwz r0, 0x14(r1) -/* 804C7108 7C 08 03 A6 */ mtlr r0 -/* 804C710C 38 21 00 10 */ addi r1, r1, 0x10 -/* 804C7110 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_tgHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf.s b/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_tgHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf.s deleted file mode 100644 index 9dd29ffd33..0000000000 --- a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_tgHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf.s +++ /dev/null @@ -1,10 +0,0 @@ -lbl_804C6FB4: -/* 804C6FB4 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 804C6FB8 7C 08 02 A6 */ mflr r0 -/* 804C6FBC 90 01 00 14 */ stw r0, 0x14(r1) -/* 804C6FC0 7C C4 33 78 */ mr r4, r6 -/* 804C6FC4 4B FF FE 71 */ bl tgHitCallback__9daNbomb_cFP12dCcD_GObjInf -/* 804C6FC8 80 01 00 14 */ lwz r0, 0x14(r1) -/* 804C6FCC 7C 08 03 A6 */ mtlr r0 -/* 804C6FD0 38 21 00 10 */ addi r1, r1, 0x10 -/* 804C6FD4 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/setFreeze__9daNbomb_cFv.s b/asm/rel/d/a/d_a_nbomb/d_a_nbomb/setFreeze__9daNbomb_cFv.s deleted file mode 100644 index 5e132a060a..0000000000 --- a/asm/rel/d/a/d_a_nbomb/d_a_nbomb/setFreeze__9daNbomb_cFv.s +++ /dev/null @@ -1,10 +0,0 @@ -lbl_804C88CC: -/* 804C88CC 80 03 0B 4C */ lwz r0, 0xb4c(r3) -/* 804C88D0 54 00 05 AD */ rlwinm. r0, r0, 0, 0x16, 0x16 -/* 804C88D4 4C 82 00 20 */ bnelr -/* 804C88D8 80 03 0B 4C */ lwz r0, 0xb4c(r3) -/* 804C88DC 60 00 02 00 */ ori r0, r0, 0x200 -/* 804C88E0 90 03 0B 4C */ stw r0, 0xb4c(r3) -/* 804C88E4 38 00 00 5A */ li r0, 0x5a -/* 804C88E8 B0 03 0B 5E */ sth r0, 0xb5e(r3) -/* 804C88EC 4E 80 00 20 */ blr diff --git a/include/d/a/d_a_alink.h b/include/d/a/d_a_alink.h index ab9efe8bb9..45e6e1398d 100644 --- a/include/d/a/d_a_alink.h +++ b/include/d/a/d_a_alink.h @@ -2394,7 +2394,7 @@ public: /* 80107744 */ int procBoardCutTurn(); /* 801083C8 */ void hookshotAtHitCallBack(dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*); /* 801086DC */ void resetHookshotMode(); - /* 8010871C */ bool setEnemyBombHookshot(fopAc_ac_c*); + /* 8010871C */ BOOL setEnemyBombHookshot(fopAc_ac_c*); /* 80108784 */ bool checkLv7BossRoom(); /* 801087B0 */ BOOL checkHookshotStickBG(cBgS_PolyInfo&); /* 80108828 */ void cancelHookshotCarry(); @@ -3022,8 +3022,8 @@ public: virtual s32 getAtnActorID() const; virtual s32 getItemID() const; virtual s32 getGrabActorID() const; - virtual bool exchangeGrabActor(fopAc_ac_c*); - virtual bool setForceGrab(fopAc_ac_c*, int, int); + virtual BOOL exchangeGrabActor(fopAc_ac_c*); + virtual BOOL setForceGrab(fopAc_ac_c*, int, int); virtual void setForcePutPos(cXyz const&); virtual u32 checkPlayerNoDraw(); virtual void voiceStart(u32); @@ -3302,6 +3302,7 @@ public: bool checkCopyRodRevive() const { return mProcID == PROC_COPY_ROD_REVIVE; } bool checkHorseGetOffMode() const { return mProcID == PROC_HORSE_GETOFF; } bool checkHorseRideOn() const { return mProcID == PROC_HORSE_RIDE; } + bool checkGrabUp() const { return mProcID == PROC_GRAB_UP; } BOOL checkRideOn() const { return mRideStatus != 0; } @@ -3330,6 +3331,20 @@ public: mDamageColorTime = 32 - (mDamageTimer % 16); } + BOOL setEnemyBomb(fopAc_ac_c* i_actor) { return exchangeGrabActor(i_actor); } + + void decrementBombCnt() { + if (mActiveBombNum != 0) { + mActiveBombNum--; + } + } + + void decrementInsectBombCnt() { + if (field_0x2fcf != 0) { + field_0x2fcf--; + } + } + // Gets the cardinal direction of the Left Stick relative to player facing angle int getDirectionFromShapeAngle() const { return getDirectionFromAngle(field_0x2fe2 - shape_angle.y); diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index b286c50cbb..c35075fbcf 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -610,8 +610,8 @@ public: virtual s32 getAtnActorID() const { return -1; } virtual s32 getItemID() const; virtual s32 getGrabActorID() const; // weak - virtual bool exchangeGrabActor(fopAc_ac_c*); - virtual bool setForceGrab(fopAc_ac_c*, int, int); + virtual BOOL exchangeGrabActor(fopAc_ac_c*); + virtual BOOL setForceGrab(fopAc_ac_c*, int, int); virtual void setForcePutPos(cXyz const&); virtual u32 checkPlayerNoDraw(); virtual bool checkRopeTag(); diff --git a/include/d/bg/d_bg_s_acch.h b/include/d/bg/d_bg_s_acch.h index 3523107a77..c1df22e415 100644 --- a/include/d/bg/d_bg_s_acch.h +++ b/include/d/bg/d_bg_s_acch.h @@ -232,4 +232,13 @@ public: /* 806646F8 */ virtual ~dBgS_StatueAcch(); }; +class dBgS_BombAcch : public dBgS_Acch { +public: + dBgS_BombAcch() { + SetBomb(); + } + + virtual ~dBgS_BombAcch() {} +}; + #endif /* D_BG_D_BG_S_ACCH_H */ diff --git a/include/d/d_bomb.h b/include/d/d_bomb.h index 7269e622a2..983d205d8f 100644 --- a/include/d/d_bomb.h +++ b/include/d/d_bomb.h @@ -1,48 +1,42 @@ #ifndef D_D_BOMB_H #define D_D_BOMB_H -#include "d/bg/d_bg_s_acch.h" -#include "d/cc/d_cc_d.h" #include "f_op/f_op_actor_mng.h" -#include "d/d_procname.h" -class daNbomb_c : public fopAc_ac_c { +class dBomb_c : public fopAc_ac_c { public: - enum daNbomb_FLG0 { WATER_BOMB = 16 }; + enum dBomb_PRM { + PRM_NORMAL_BOMB_EXPLODE, + PRM_BOMB_CARRY, + PRM_BOMB_HOOKSHOT, + PRM_BOMB_WAIT, + PRM_FLOWER_BOMB, + PRM_BOMB_BOOMERANG_MOVE, + PRM_ENEMY_BOMB_BOOMERANG_MOVE, + PRM_INSECT_BOMB_MOVE, + PRM_NORMAL_BOMB_PLAYER, + PRM_WATER_BOMB_PLAYER, + PRM_INSECT_BOMB_PLAYER, + PRM_ENEMY_BOMB, + PRM_ENEMY_BOMB_BOOMERANG, + PRM_ENEMY_BOMB_HOOKSHOT, + PRM_ENEMY_WATER_BOMB, + PRM_UNK_15, + PRM_ENEMY_WATER_BOMB_HOOKSHOT, + PRM_BOMB_CARGO_CARRY, + PRM_WATER_BOMB_EXPLODE, + }; - u32 checkStateFlg0(daNbomb_FLG0 flag) const { return mStateFlg0 & flag; } - u32 checkWaterBomb() const { return checkStateFlg0(WATER_BOMB); } - - /* 0x568 */ u8 field_0x568[0x10]; - /* 0x578 */ dBgS_Acch mAcch; - /* 0x750 */ dBgS_AcchCir mAcchCir; - /* 0x790 */ dCcD_Stts mStts; - /* 0x7CC */ dCcD_Sph mSph1; - /* 0x904 */ dCcD_Sph mSph2; - /* 0xA3C */ u8 field_0xa3c[0x64]; - /* 0xAA0 */ dBgS_BombLinChk mLinChk; - /* 0xB10 */ cBgS_PolyInfo mPolyInfo; - /* 0xB20 */ Z2SoundObjSimple mSoundObj; - /* 0xB40 */ u8 field_0xb40[0xC]; - /* 0xB4C */ u32 mStateFlg0; - /* 0xB50 */ u8 field_0xb50; - /* 0xB51 */ u8 field_0xb51[0x3]; - /* 0xB54 */ u8 field_0xb54; - /* 0xB55 */ u8 field_0xb55[0xB]; - /* 0xB60 */ LIGHT_INFLUENCE field_0xb60; - /* 0xB80 */ WIND_INFLUENCE field_0xb80; -}; - -class dBomb_c : public daNbomb_c { -public: bool checkStateCarry(); static bool checkFlowerBombWait(fopAc_ac_c*); - bool checkWaterBomb(fopAc_ac_c*); - bool checkInsectBombMove(fopAc_ac_c*); + static bool checkWaterBomb(fopAc_ac_c*); + static bool checkInsectBombMove(fopAc_ac_c*); - bool checkStateExplode() { - return fopAcM_GetParam(this) == 0; - } + virtual BOOL checkExplodeNow(); + virtual void deleteBombAndEffect(); + virtual void setCargoBombExplode(); + + bool checkStateExplode() { return fopAcM_GetParam(this) == 0; } static bool checkBombActor(fopAc_ac_c* i_actor) { return fopAcM_GetName(i_actor) == PROC_NBOMB; @@ -61,19 +55,23 @@ public: } static fopAc_ac_c* createFlowerBomb(cXyz* i_pos, csXyz* i_angle, int param_2) { - return (fopAc_ac_c*)fopAcM_fastCreate(PROC_NBOMB, 4, i_pos, param_2, i_angle, NULL, -1, NULL, NULL); + return (fopAc_ac_c*)fopAcM_fastCreate(PROC_NBOMB, 4, i_pos, param_2, i_angle, NULL, -1, + NULL, NULL); } static fopAc_ac_c* createWaterBombExplode(cXyz* i_pos) { - return (fopAc_ac_c*)fopAcM_fastCreate(PROC_NBOMB, 18, i_pos, -1, NULL, NULL, -1, NULL, NULL); + return (fopAc_ac_c*)fopAcM_fastCreate(PROC_NBOMB, 18, i_pos, -1, NULL, NULL, -1, NULL, + NULL); } static fopAc_ac_c* createEnemyWaterBomb(cXyz* i_pos, csXyz* i_angle, int i_roomNo) { - return (fopAc_ac_c*)fopAcM_fastCreate(PROC_NBOMB, 14, i_pos, i_roomNo, i_angle, NULL, -1, NULL, NULL); + return (fopAc_ac_c*)fopAcM_fastCreate(PROC_NBOMB, 14, i_pos, i_roomNo, i_angle, NULL, -1, + NULL, NULL); } static fopAc_ac_c* createEnemyWaterBombHookshot(cXyz* i_pos, csXyz* i_angle, int i_roomNo) { - return (fopAc_ac_c*)fopAcM_fastCreate(PROC_NBOMB, 16, i_pos, i_roomNo, i_angle, NULL, -1, NULL, NULL); + return (fopAc_ac_c*)fopAcM_fastCreate(PROC_NBOMB, 16, i_pos, i_roomNo, i_angle, NULL, -1, + NULL, NULL); } }; diff --git a/include/d/kankyo/d_kankyo.h b/include/d/kankyo/d_kankyo.h index d78e965e56..f8a2077508 100644 --- a/include/d/kankyo/d_kankyo.h +++ b/include/d/kankyo/d_kankyo.h @@ -48,6 +48,8 @@ u8 dKy_shadow_mode_check(u8 mode); void dKy_shadow_mode_set(u8 mode); void dKy_shadow_mode_reset(u8 mode); void dKy_Itemgetcol_chg_on(); +void dKy_actor_addcol_amb_set(s16 r, s16 g, s16 b, f32 factor); +void dKy_bg_addcol_amb_set(s16 r, s16 g, s16 b, f32 factor); struct LIGHT_INFLUENCE { /* 0x00 */ cXyz mPosition; diff --git a/include/m_Do/m_Do_mtx.h b/include/m_Do/m_Do_mtx.h index c68d3c4e06..ed0b857d14 100644 --- a/include/m_Do/m_Do_mtx.h +++ b/include/m_Do/m_Do_mtx.h @@ -345,6 +345,10 @@ inline MtxP mDoMtx_getIdentity() { return g_mDoMtx_identity; } +inline MtxP cMtx_getIdentity() { + return mDoMtx_getIdentity(); +} + class mDoMtx_quatStack_c { public: mDoMtx_quatStack_c() { diff --git a/include/rel/d/a/d_a_nbomb/d_a_nbomb.h b/include/rel/d/a/d_a_nbomb/d_a_nbomb.h index ba6ba6adf1..50f20e2b1c 100644 --- a/include/rel/d/a/d_a_nbomb/d_a_nbomb.h +++ b/include/rel/d/a/d_a_nbomb/d_a_nbomb.h @@ -1,5 +1,126 @@ #ifndef D_A_NBOMB_H #define D_A_NBOMB_H +#include "d/d_bomb.h" +#include "d/bg/d_bg_s_acch.h" +#include "d/cc/d_cc_d.h" +#include "d/a/d_a_player.h" + +class daNbomb_c : public dBomb_c { +public: + enum daNbomb_FLG0 { + FLG0_PLAYER_MAKE = 0x1, + FLG0_BOMB_HIT = 0x4, + FLG0_WATER_BOMB = 0x10, + FLG0_UNDERWATER = 0x20, + FLG0_UNK_40 = 0x40, + FLG0_NO_HIT_PLAYER = 0x80, + FLG0_CARGO_CARRY = 0x100, + FLG0_FROZEN = 0x200, + FLG0_INSECT_BOMB = 0x400, + FLG0_UNK_800 = 0x800, + FLG0_DELETE_BOMB = 0x1000, + FLG0_UNK_2000 = 0x2000, + FLG0_SET_HOOKSHOT_OFFSET = 0x4000, + FLG0_UNK_8000 = 0x8000, + FLG0_UNK_10000 = 0x10000, + FLG0_UNK_20000 = 0x20000, + }; + + enum daNbomb_TYPE { + TYPE_NORMAL_PLAYER, + TYPE_WATER_PLAYER, + TYPE_INSECT_PLAYER, + TYPE_FLOWER, + TYPE_INSECT_ENEMY, + TYPE_WATER_ENEMY, + }; + + /* 804C6DCC */ void coHitCallback(fopAc_ac_c*); + /* 804C6E34 */ void tgHitCallback(dCcD_GObjInf*); + /* 804C6FD8 */ int searchEnemy(fopAc_ac_c*); + /* 804C7114 */ int createHeap(); + /* 804C7324 */ int create(); + /* 804C7B44 */ daNbomb_c(); + /* 804C7EB4 */ ~daNbomb_c(); + /* 804C8294 */ bool checkTimerStop(); + /* 804C82D8 */ BOOL checkExplode(); + /* 804C8430 */ void setRoomInfo(); + /* 804C84D8 */ void setSmokePos(); + /* 804C8588 */ void setEffect(); + /* 804C87F0 */ void setHookshotOffset(); + /* 804C88CC */ void setFreeze(); + /* 804C88F0 */ BOOL checkWaterIn(); + /* 804C8928 */ BOOL insectLineCheck(); + /* 804C8A88 */ void setHitPolygon(int); + /* 804C8CF8 */ BOOL procExplodeInit(); + /* 804C9118 */ BOOL procExplode(); + /* 804C93E0 */ BOOL procCarryInit(); + /* 804C955C */ BOOL procCarry(); + /* 804C9930 */ BOOL procWaitInit(); + /* 804C9984 */ BOOL procWait(); + /* 804CA268 */ BOOL procFlowerWaitInit(); + /* 804CA2EC */ BOOL procFlowerWait(); + /* 804CA3B8 */ BOOL procBoomerangMoveInit(dCcD_GObjInf*); + /* 804CA4E0 */ BOOL procBoomerangMove(); + /* 804CA688 */ BOOL procInsectMoveInit(); + /* 804CA780 */ BOOL procInsectMove(); + /* 804CAEE8 */ int execute(); + /* 804CBC60 */ int draw(); + + virtual BOOL checkExplodeNow(); + virtual void deleteBombAndEffect(); + virtual void setCargoBombExplode(); + + void onStateFlg0(daNbomb_FLG0 i_flag) { mStateFlg0 |= i_flag; } + void offStateFlg0(daNbomb_FLG0 i_flag) { mStateFlg0 &= ~i_flag; } + u32 checkStateFlg0(daNbomb_FLG0 i_flag) const { return mStateFlg0 & i_flag; } + + u32 checkWaterBomb() const { return checkStateFlg0(FLG0_WATER_BOMB); } + + static const char* m_arcNameList[6]; + + /* 0x56C */ request_of_phase_process_class mPhase; + /* 0x574 */ J3DModel* mpModel; + /* 0x578 */ dBgS_BombAcch mAcch; + /* 0x750 */ dBgS_AcchCir mAcchCir; + /* 0x790 */ dCcD_Stts mCcStts; + /* 0x7CC */ dCcD_Sph mCcSph; + /* 0x904 */ dCcD_Sph mSph2; + /* 0xA3C */ mDoExt_bckAnm* mpBck; + /* 0xA40 */ Mtx field_0xa40; + /* 0xA70 */ Mtx field_0xa70; + /* 0xAA0 */ dBgS_BombLinChk mLineChk; + /* 0xB10 */ cBgS_PolyInfo mInsectHitPolyInfo; + /* 0xB20 */ Z2SoundObjSimple mSound; + /* 0xB40 */ daPy_boomerangMove_c mBoomerangMove; + /* 0xB4C */ u32 mStateFlg0; + /* 0xB50 */ u8 mExplodeMode; + /* 0xB51 */ u8 field_0xb51; + /* 0xB52 */ u8 mNoHitPlayerTimer; + /* 0xB53 */ s8 mSoundReverb; + /* 0xB54 */ u8 mType; + /* 0xB55 */ u8 field_0xB55[0xB58 - 0xB55]; + /* 0xB58 */ s16 mExTime; + /* 0xB5A */ s16 field_0xb5a; + /* 0xB5C */ s16 field_0xb5c; + /* 0xB5E */ s16 mFreezeTimer; + /* 0xB60 */ LIGHT_INFLUENCE mLightInfluence; + /* 0xB80 */ WIND_INFLUENCE mWindInfluence; + /* 0xBAC */ f32 mExplosionStrength; + /* 0xBB0 */ f32 field_0xbb0; + /* 0xBB4 */ u32 mPolySound; + /* 0xBB8 */ u32 mEffectEmitterIDs[5]; + /* 0xBCC */ cXyz mEffectPosition; + /* 0xBD8 */ cXyz mEffectLastPosition; + /* 0xBE4 */ cXyz field_0xbe4; + /* 0xBF0 */ cXyz field_0xbf0; + /* 0xBFC */ cXyz field_0xbfc; + /* 0xC08 */ cXyz field_0xc08; + /* 0xC14 */ cXyz field_0xc14; + /* 0xC20 */ cXyz field_0xc20; + /* 0xC2C */ cXyz field_0xc2c; + /* 0xC38 */ BOOL (daNbomb_c::*mProcFunc)(); +}; #endif /* D_A_NBOMB_H */ diff --git a/rel/d/a/d_a_nbomb/d_a_nbomb.cpp b/rel/d/a/d_a_nbomb/d_a_nbomb.cpp index 70e58e1d79..b0513c3fff 100644 --- a/rel/d/a/d_a_nbomb/d_a_nbomb.cpp +++ b/rel/d/a/d_a_nbomb/d_a_nbomb.cpp @@ -1,258 +1,16 @@ -// -// Generated By: dol2asm -// Translation Unit: d_a_nbomb -// +/** + * d_a_nbomb.cpp + * Bomb Actor + */ #include "rel/d/a/d_a_nbomb/d_a_nbomb.h" -#include "d/cc/d_cc_d.h" +#include "JSystem/J3DGraphBase/J3DMaterial.h" +#include "SSystem/SComponent/c_math.h" +#include "d/a/d_a_alink.h" +#include "d/com/d_com_inf_game.h" #include "dol2asm.h" - -// -// Types: -// - -struct request_of_phase_process_class {}; - -struct csXyz {}; - -struct mDoMtx_stack_c { - /* 8000CD64 */ void transS(cXyz const&); - /* 8000CD9C */ void transM(f32, f32, f32); - /* 8000CF44 */ void ZXYrotM(csXyz const&); - - static u8 now[48]; -}; - -struct J3DModelData {}; - -struct J3DAnmTransform {}; - -struct mDoExt_bckAnm { - /* 8000D7DC */ void init(J3DAnmTransform*, int, int, f32, s16, s16, bool); - /* 8000D9CC */ void entry(J3DModelData*, f32); -}; - -struct mDoExt_baseAnm { - /* 8000D428 */ void play(); -}; - -struct fopAc_ac_c { - /* 80018B64 */ fopAc_ac_c(); - /* 80018C8C */ ~fopAc_ac_c(); -}; - -struct daPy_boomerangMove_c { - /* 8015E5B0 */ void initOffset(cXyz const*); - /* 8015E654 */ void posMove(cXyz*, s16*, fopAc_ac_c*, s16); - /* 8015E87C */ void bgCheckAfterOffset(cXyz const*); -}; - -struct daNbomb_c { - /* 804C6DCC */ void coHitCallback(fopAc_ac_c*); - /* 804C6E34 */ void tgHitCallback(dCcD_GObjInf*); - /* 804C6FD8 */ void searchEnemy(fopAc_ac_c*); - /* 804C7114 */ void createHeap(); - /* 804C7324 */ void create(); - /* 804C7B44 */ daNbomb_c(); - /* 804C7EB4 */ ~daNbomb_c(); - /* 804C8294 */ void checkTimerStop(); - /* 804C82D8 */ void checkExplode(); - /* 804C8430 */ void setRoomInfo(); - /* 804C84D8 */ void setSmokePos(); - /* 804C8588 */ void setEffect(); - /* 804C87F0 */ void setHookshotOffset(); - /* 804C88CC */ void setFreeze(); - /* 804C88F0 */ void checkWaterIn(); - /* 804C8928 */ void insectLineCheck(); - /* 804C8A88 */ void setHitPolygon(int); - /* 804C8CF8 */ void procExplodeInit(); - /* 804C9118 */ void procExplode(); - /* 804C93E0 */ void procCarryInit(); - /* 804C955C */ void procCarry(); - /* 804C9930 */ void procWaitInit(); - /* 804C9984 */ void procWait(); - /* 804CA268 */ void procFlowerWaitInit(); - /* 804CA2EC */ void procFlowerWait(); - /* 804CA3B8 */ void procBoomerangMoveInit(dCcD_GObjInf*); - /* 804CA4E0 */ void procBoomerangMove(); - /* 804CA688 */ void procInsectMoveInit(); - /* 804CA780 */ void procInsectMove(); - /* 804CAEE8 */ void execute(); - /* 804CBC60 */ void draw(); - /* 804CC2C0 */ void checkExplodeNow(); - /* 804CC2D4 */ void deleteBombAndEffect(); - /* 804CC30C */ void setCargoBombExplode(); - - static void* m_arcNameList[6]; -}; - -struct J3DModel {}; - -struct daMirror_c { - /* 8003194C */ void entry(J3DModel*); -}; - -struct cBgS_PolyInfo { - /* 80268074 */ cBgS_PolyInfo(); - /* 802680B0 */ ~cBgS_PolyInfo(); - /* 80268148 */ void SetPolyInfo(cBgS_PolyInfo const&); -}; - -struct daAlink_c { - /* 8009D884 */ void getAlinkArcName(); - /* 800D6D94 */ void getFreezeR() const; - /* 800D6DA4 */ void getFreezeG() const; - /* 800D6DB4 */ void getFreezeB() const; - /* 800D7768 */ void checkIcePolygonDamage(cBgS_PolyInfo*); - /* 800E3760 */ void getBombExplodeTime() const; - /* 800E3770 */ void getBombGravity() const; - /* 800E3780 */ void getBombMaxFallSpeed() const; - /* 800E3790 */ void getBombBoundRate() const; - /* 800E37A0 */ void getBombStopSpeedY() const; - /* 800E37B0 */ void getBombMaxSpeedY() const; - /* 800E37C0 */ void getBombEffScale() const; - /* 800E37D0 */ void getBombAtR() const; - /* 800E37E0 */ void getEnemyBombColorR() const; - /* 800E37F0 */ void getBombWaterGravity() const; - /* 800E3800 */ void getBombWaterMaxFallSpeed() const; - /* 800E3810 */ void getBombExplodeWaterEffectLimit() const; - /* 800E3820 */ void getBombInsectLimitAngle() const; - /* 80105ABC */ void checkSnowCodePolygon(cBgS_PolyInfo&); - /* 8010871C */ void setEnemyBombHookshot(fopAc_ac_c*); -}; - -struct dVibration_c { - /* 8006FA24 */ void StartShock(int, int, cXyz); -}; - -struct dKy_tevstr_c {}; - -struct dScnKy_env_light_c { - /* 801A37C4 */ void settingTevStruct(int, cXyz*, dKy_tevstr_c*); - /* 801A4DA0 */ void setLightTevColorType_MAJI(J3DModelData*, dKy_tevstr_c*); -}; - -struct dRes_info_c {}; - -struct dRes_control_c { - /* 8003C2EC */ void getRes(char const*, s32, dRes_info_c*, int); -}; - -struct dPa_levelEcallBack {}; - -struct _GXColor {}; - -struct dPa_control_c { - struct level_c { - /* 8004B918 */ void getEmitter(u32); - }; - - /* 8004CA90 */ void set(u8, u16, cXyz const*, dKy_tevstr_c const*, csXyz const*, cXyz const*, - u8, dPa_levelEcallBack*, s8, _GXColor const*, _GXColor const*, - cXyz const*, f32); - /* 8004D4CC */ void set(u32, u8, u16, cXyz const*, dKy_tevstr_c const*, csXyz const*, - cXyz const*, u8, dPa_levelEcallBack*, s8, _GXColor const*, - _GXColor const*, cXyz const*, f32); - - static u8 mParticleTracePCB[4 + 4 /* padding */]; -}; - -struct _GXTexObj {}; - -struct dDlst_shadowControl_c { - /* 80055F84 */ void setSimple(cXyz*, f32, f32, cXyz*, s16, f32, _GXTexObj*); - - static u8 mSimpleTexObj[32]; -}; - -struct dCcMassS_Mng { - /* 80085D98 */ void Set(cCcD_Obj*, u8); -}; - -struct dBomb_c { - /* 80031F94 */ void checkStateCarry(); - /* 804CC31C */ bool checkExplodeNow(); - /* 804CC324 */ void deleteBombAndEffect(); - /* 804CC328 */ void setCargoBombExplode(); -}; - -struct dBgS_PolyPassChk { - /* 80078EBC */ void SetBomb(); -}; - -struct dBgS_LinChk { - /* 80077D64 */ void Set(cXyz const*, cXyz const*, fopAc_ac_c const*); -}; - -struct dBgS_BombLinChk { - /* 80078104 */ dBgS_BombLinChk(); - /* 80078160 */ ~dBgS_BombLinChk(); -}; - -struct dBgS_BombAcch { - /* 804C7E24 */ ~dBgS_BombAcch(); -}; - -struct dBgS_AcchCir { - /* 80075EAC */ dBgS_AcchCir(); - /* 80075F58 */ void SetWall(f32, f32); - /* 804C7DB4 */ ~dBgS_AcchCir(); -}; - -struct dBgS { - /* 80074ABC */ void ChkMoveBG(cBgS_PolyInfo const&); - /* 80074BE8 */ void GetPolyColor(cBgS_PolyInfo const&); - /* 80074E50 */ void GetPolyAtt0(cBgS_PolyInfo const&); - /* 80074EF0 */ void GetGroundCode(cBgS_PolyInfo const&); - /* 80075100 */ void GetRoomId(cBgS_PolyInfo const&); - /* 80075880 */ void MoveBgTransPos(cBgS_PolyInfo const&, bool, cXyz*, csXyz*, csXyz*); -}; - -struct dBgS_Acch { - /* 80075F94 */ ~dBgS_Acch(); - /* 800760A0 */ dBgS_Acch(); - /* 80076288 */ void Set(fopAc_ac_c*, int, dBgS_AcchCir*); - /* 80076AAC */ void CrrPos(dBgS&); -}; - -struct cM3dGCir { - /* 8026EF18 */ ~cM3dGCir(); -}; - -struct cCcS { - /* 80264BA8 */ void Set(cCcD_Obj*); -}; - -struct cBgS_LinChk {}; - -struct cBgS { - /* 800743B4 */ void LineCross(cBgS_LinChk*); - /* 80074660 */ void ChkPolySafe(cBgS_PolyInfo const&); - /* 80074744 */ void GetTriPla(cBgS_PolyInfo const&, cM3dGPla*) const; -}; - -struct Z2SoundObjSimple { - /* 802BE844 */ Z2SoundObjSimple(); -}; - -struct Z2SoundObjBase { - /* 802BDF48 */ ~Z2SoundObjBase(); - /* 802BDFF8 */ void deleteObject(); -}; - -struct WIND_INFLUENCE {}; - -struct LIGHT_INFLUENCE {}; - -struct JMath { - static u8 sincosTable_[65536]; -}; - -struct J3DFrameCtrl { - /* 803283FC */ void init(s16); - /* 8032842C */ void checkPass(f32); - /* 804C72BC */ ~J3DFrameCtrl(); -}; +#include "f_op/f_op_kankyo_mng.h" +#include "rel/d/a/d_a_mirror/d_a_mirror.h" // // Forward References: @@ -451,13 +209,6 @@ extern "C" void* __nw__FUl(); extern "C" void __dl__FPv(); extern "C" void init__12J3DFrameCtrlFs(); extern "C" void checkPass__12J3DFrameCtrlFf(); -extern "C" void PSMTXCopy(); -extern "C" void PSMTXConcat(); -extern "C" void PSMTXInverse(); -extern "C" void PSMTXRotAxisRad(); -extern "C" void PSMTXTrans(); -extern "C" void PSMTXMultVec(); -extern "C" void PSMTXMultVecSR(); extern "C" void __ptmf_test(); extern "C" void __ptmf_cmpr(); extern "C" void __ptmf_scall(); @@ -474,9 +225,6 @@ extern "C" void _restgpr_26(); extern "C" void _restgpr_27(); extern "C" void _restgpr_28(); extern "C" void _restgpr_29(); -extern "C" extern u8 g_mDoMtx_identity[48 + 24 /* padding */]; -extern "C" extern void* g_fopAc_Method[8]; -extern "C" extern void* g_fpcLf_Method[5 + 1 /* padding */]; extern "C" extern void* __vt__8dCcD_Sph[36]; extern "C" extern void* __vt__9dCcD_Stts[11]; extern "C" extern void* __vt__12cCcD_SphAttr[25]; @@ -484,15 +232,12 @@ extern "C" extern void* __vt__14cCcD_ShapeAttr[22]; extern "C" extern void* __vt__9cCcD_Stts[8]; extern "C" extern void* __vt__16Z2SoundObjSimple[8]; extern "C" u8 now__14mDoMtx_stack_c[48]; -extern "C" extern u8 g_dComIfG_gameInfo[122384]; extern "C" u8 mSimpleTexObj__21dDlst_shadowControl_c[32]; -extern "C" extern u8 g_env_light[4880]; extern "C" f32 Zero__4cXyz[3]; extern "C" u8 BaseX__4cXyz[12]; extern "C" u8 BaseY__4cXyz[12]; extern "C" u8 BaseZ__4cXyz[12]; extern "C" u8 sincosTable___5JMath[65536]; -extern "C" extern u8 mStayNo__20dStage_roomControl_c[4]; extern "C" u8 mParticleTracePCB__13dPa_control_c[4 + 4 /* padding */]; extern "C" u8 mAudioMgrPtr__10Z2AudioMgr[4 + 4 /* padding */]; extern "C" void __register_global_object(); @@ -502,26 +247,21 @@ extern "C" void __register_global_object(); // /* 804C6DCC-804C6E10 0000EC 0044+00 1/1 0/0 0/0 .text coHitCallback__9daNbomb_cFP10fopAc_ac_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daNbomb_c::coHitCallback(fopAc_ac_c* param_0) { - nofralloc -#include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/coHitCallback__9daNbomb_cFP10fopAc_ac_c.s" +void daNbomb_c::coHitCallback(fopAc_ac_c* i_hitActor) { + if (fopAcM_GetGroup(i_hitActor) == fopAc_ENEMY_e || + (checkStateFlg0(FLG0_INSECT_BOMB) && + (!checkStateFlg0(FLG0_NO_HIT_PLAYER) || i_hitActor != daAlink_getAlinkActorClass()))) + { + onStateFlg0(FLG0_BOMB_HIT); + } } -#pragma pop /* 804C6E10-804C6E34 000130 0024+00 2/2 0/0 0/0 .text * daNbomb_coHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daNbomb_coHitCallback(fopAc_ac_c* param_0, dCcD_GObjInf* param_1, - fopAc_ac_c* param_2, dCcD_GObjInf* param_3) { - nofralloc -#include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_coHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf.s" +static void daNbomb_coHitCallback(fopAc_ac_c* i_coActorA, dCcD_GObjInf* i_coObjInfA, + fopAc_ac_c* i_coActorB, dCcD_GObjInf* i_coObjInfB) { + ((daNbomb_c*)i_coActorA)->coHitCallback(i_coActorB); } -#pragma pop /* ############################################################################################## */ /* 804CC340-804CC34C 000000 000C+00 12/12 0/0 0/0 .rodata @3767 */ @@ -533,52 +273,20 @@ COMPILER_STRIP_GATE(0x804CC340, &lit_3767); /* 804CC34C-804CC358 00000C 000C+00 0/1 0/0 0/0 .rodata l_localCenterOffset */ #pragma push #pragma force_active on -SECTION_RODATA static u8 const l_localCenterOffset[12] = { - 0x00, 0x00, 0x00, 0x00, 0x41, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; +SECTION_RODATA static Vec const l_localCenterOffset = {0.0f, 30.0f, 0.0f}; COMPILER_STRIP_GATE(0x804CC34C, &l_localCenterOffset); #pragma pop /* 804CC358-804CC360 000018 0006+02 1/0 0/0 0/0 .rodata l_arcNameBombF */ -SECTION_RODATA static u8 const l_arcNameBombF[6 + 2 /* padding */] = { - 0x42, - 0x6F, - 0x6D, - 0x62, - 0x66, - 0x00, - /* padding */ - 0x00, - 0x00, -}; +SECTION_RODATA static char const l_arcNameBombF[] = "Bombf"; COMPILER_STRIP_GATE(0x804CC358, &l_arcNameBombF); /* 804CC360-804CC368 000020 0005+03 1/1 0/0 0/0 .rodata l_arcNameBombE */ -SECTION_RODATA static u8 const l_arcNameBombE[5 + 3 /* padding */] = { - 0x45, - 0x5F, - 0x42, - 0x49, - 0x00, - /* padding */ - 0x00, - 0x00, - 0x00, -}; +SECTION_RODATA static char const l_arcNameBombE[] = "E_BI"; COMPILER_STRIP_GATE(0x804CC360, &l_arcNameBombE); /* 804CC368-804CC370 000028 0005+03 1/1 0/0 0/0 .rodata l_arcNameBombEW */ -SECTION_RODATA static u8 const l_arcNameBombEW[5 + 3 /* padding */] = { - 0x45, - 0x5F, - 0x42, - 0x47, - 0x00, - /* padding */ - 0x00, - 0x00, - 0x00, -}; +SECTION_RODATA static char const l_arcNameBombEW[] = "E_BG"; COMPILER_STRIP_GATE(0x804CC368, &l_arcNameBombEW); /* 804CC370-804CC374 000030 0004+00 0/2 0/0 0/0 .rodata @4213 */ @@ -604,6 +312,39 @@ SECTION_RODATA static f32 const lit_4216 = 1.0f; COMPILER_STRIP_GATE(0x804CC37C, &lit_4216); /* 804C6E34-804C6F78 000154 0144+00 1/1 0/0 0/0 .text tgHitCallback__9daNbomb_cFP12dCcD_GObjInf */ +// matches with literals +#ifdef NONMATCHING +void daNbomb_c::tgHitCallback(dCcD_GObjInf* i_hitObj) { + if (i_hitObj->ChkAtType(AT_TYPE_BOOMERANG)) { + if (!fopAcM_checkCarryNow(this) && !fopAcM_checkHookCarryNow(this) && + !checkStateFlg0(FLG0_INSECT_BOMB)) + { + procBoomerangMoveInit(i_hitObj); + } + } else if (i_hitObj->ChkAtType(AT_TYPE_HOOKSHOT) && fopAcM_checkStatus(this, 0x80000)) { + if (fopAcM_checkCarryNow(this)) { + fopAcM_cancelCarryNow(this); + } + + fopAcM_setHookCarryNow(this); + procCarryInit(); + onStateFlg0(FLG0_SET_HOOKSHOT_OFFSET); + } else if (i_hitObj->ChkAtType(0x200)) { + if (i_hitObj->GetAtMtrl() == 3 && !checkStateCarry() && !checkStateExplode() && + fopAcM_GetParam(this) != PRM_FLOWER_BOMB) + { + cLib_addCalcPos(&field_0xc20, *i_hitObj->GetAtVecP() * 2.0f, 0.5f, 10.0f, 1.0f); + onStateFlg0(FLG0_UNK_8000); + } + } else { + onStateFlg0(FLG0_BOMB_HIT); + } + + if (i_hitObj->GetAtMtrl() == 2) { + setFreeze(); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -612,6 +353,7 @@ asm void daNbomb_c::tgHitCallback(dCcD_GObjInf* param_0) { #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/tgHitCallback__9daNbomb_cFP12dCcD_GObjInf.s" } #pragma pop +#endif /* 804C6F78-804C6FB4 000298 003C+00 1/1 0/0 0/0 .text __dt__4cXyzFv */ #pragma push @@ -626,15 +368,10 @@ extern "C" asm void __dt__4cXyzFv() { /* 804C6FB4-804C6FD8 0002D4 0024+00 1/1 0/0 0/0 .text * daNbomb_tgHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daNbomb_tgHitCallback(fopAc_ac_c* param_0, dCcD_GObjInf* param_1, - fopAc_ac_c* param_2, dCcD_GObjInf* param_3) { - nofralloc -#include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_tgHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf.s" +static void daNbomb_tgHitCallback(fopAc_ac_c* i_tgActor, dCcD_GObjInf* i_tgObjInf, + fopAc_ac_c* i_atActor, dCcD_GObjInf* i_atObjInf) { + ((daNbomb_c*)i_tgActor)->tgHitCallback(i_atObjInf); } -#pragma pop /* ############################################################################################## */ /* 804CC380-804CC384 000040 0004+00 5/14 0/0 0/0 .rodata @4255 */ @@ -661,31 +398,52 @@ COMPILER_STRIP_GATE(0x804CC388, &lit_4257); #pragma pop /* 804C6FD8-804C70C0 0002F8 00E8+00 1/1 0/0 0/0 .text searchEnemy__9daNbomb_cFP10fopAc_ac_c */ +// matches with literals +#ifdef NONMATCHING +int daNbomb_c::searchEnemy(fopAc_ac_c* i_enemy) { + mDoMtx_multVec(field_0xa70, &i_enemy->current.pos, &field_0xc14); + + if (i_enemy->attention_info.flags & 5 && field_0xc14.abs2XZ() < 250000.0f && + fabsf(field_0xc14.y) < 100.0f) + { + if (abs(field_0xc14.atan2sX_Z()) < 0x4000) { + field_0xc14.y = 0.0f; + field_0xc14.normalizeZP(); + mDoMtx_multVecSR(mpModel->getBaseTRMtx(), &field_0xc14, &field_0xc14); + return 1; + } + } + + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::searchEnemy(fopAc_ac_c* param_0) { +asm int daNbomb_c::searchEnemy(fopAc_ac_c* param_0) { nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/searchEnemy__9daNbomb_cFP10fopAc_ac_c.s" } #pragma pop +#endif /* 804C70C0-804C7114 0003E0 0054+00 1/1 0/0 0/0 .text daNbomb_searchEnemy__FP10fopAc_ac_cPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daNbomb_searchEnemy(fopAc_ac_c* param_0, void* param_1) { - nofralloc -#include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_searchEnemy__FP10fopAc_ac_cPv.s" +static void* daNbomb_searchEnemy(fopAc_ac_c* i_actor, void* i_data) { + if (fopAcM_GetGroup(i_actor) == fopAc_ENEMY_e && + ((daNbomb_c*)i_data)->searchEnemy(i_actor) != NULL) + { + return i_actor; + } + + return NULL; } -#pragma pop /* ############################################################################################## */ /* 804CC38C-804CC398 00004C 000C+00 0/1 0/0 0/0 .rodata bmdIdx$4269 */ #pragma push #pragma force_active on -SECTION_RODATA static u8 const bmdIdx[12] = { - 0x00, 0x1E, 0x00, 0x27, 0x00, 0x26, 0x00, 0x03, 0x00, 0x0E, 0x00, 0x0A, +SECTION_RODATA static u16 const bmdIdx[6] = { + 0x001E, 0x0027, 0x0026, 0x0003, 0x000E, 0x000A, }; COMPILER_STRIP_GATE(0x804CC38C, &bmdIdx); #pragma pop @@ -693,24 +451,19 @@ COMPILER_STRIP_GATE(0x804CC38C, &bmdIdx); /* 804CC4D8-804CC518 000000 0040+00 1/1 0/0 0/0 .data l_sphSrc */ static dCcD_SrcSph l_sphSrc = { { - {0x0, {{AT_TYPE_BOMB, 0x4, 0x1e}, {0xd8fbffef, 0x11}, 0x79}}, // mObj - {dCcD_SE_NONE, 0x0, 0x1, 0x0, 0x0}, // mGObjAt - {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x4}, // mGObjTg - {0x0}, // mGObjCo - }, // mObjInf + {0x0, {{AT_TYPE_BOMB, 0x4, 0x1e}, {0xd8fbffef, 0x11}, 0x79}}, // mObj + {dCcD_SE_NONE, 0x0, 0x1, 0x0, 0x0}, // mGObjAt + {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x4}, // mGObjTg + {0x0}, // mGObjCo + }, // mObjInf { - {{0.0f, 0.0f, 0.0f}, 30.0f} // mSph - } // mSphAttr + {{0.0f, 0.0f, 0.0f}, 30.0f} // mSph + } // mSphAttr }; /* 804CC518-804CC530 -00001 0018+00 4/4 0/0 0/0 .data m_arcNameList__9daNbomb_c */ -SECTION_DATA void* daNbomb_c::m_arcNameList[6] = { - (void*)NULL, - (void*)NULL, - (void*)NULL, - (void*)&l_arcNameBombF, - (void*)&l_arcNameBombE, - (void*)&l_arcNameBombEW, +SECTION_DATA const char* daNbomb_c::m_arcNameList[6] = { + NULL, NULL, NULL, l_arcNameBombF, l_arcNameBombE, l_arcNameBombEW, }; /* 804CC530-804CC53C 000058 000A+02 1/1 0/0 0/0 .data enemyBombID$5072 */ @@ -882,20 +635,62 @@ SECTION_DATA extern void* __vt__12J3DFrameCtrl[3] = { }; /* 804C7114-804C72BC 000434 01A8+00 1/1 0/0 0/0 .text createHeap__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +int daNbomb_c::createHeap() { + static u16 const bmdIdx[6] = {0x001E, 0x0027, 0x0026, 0x0003, 0x000E, 0x000A}; + + J3DModelData* modelData = + (J3DModelData*)dComIfG_getObjectRes(m_arcNameList[mType], bmdIdx[mType]); + JUT_ASSERT(modelData != 0); + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); + if (mpModel == NULL) { + return 0; + } + + J3DAnmTransform* trans = NULL; + if (mType == TYPE_INSECT_ENEMY) { + trans = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcNameBombE, 6); + JUT_ASSERT(trans); + } else if (mType == TYPE_WATER_ENEMY) { + trans = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcNameBombEW, 5); + JUT_ASSERT(trans); + } else if (mType == TYPE_INSECT_PLAYER) { + trans = (J3DAnmTransform*)dComIfG_getObjectRes(daAlink_c::getAlinkArcName(), 0x15); + JUT_ASSERT(trans); + } + + if (trans != NULL) { + mpBck = new mDoExt_bckAnm(); + if (mpBck == NULL) { + return 0; + } + + if (!mpBck->init(trans, TRUE, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 0, -1, false)) { + return 0; + } + } + + mSound.init(¤t.pos, 2); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::createHeap() { +asm int daNbomb_c::createHeap() { nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/createHeap__9daNbomb_cFv.s" } #pragma pop +#endif /* 804C72BC-804C7304 0005DC 0048+00 1/0 0/0 0/0 .text __dt__12J3DFrameCtrlFv */ #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm J3DFrameCtrl::~J3DFrameCtrl() { +// asm J3DFrameCtrl::~J3DFrameCtrl() { +extern "C" asm void __dt__12J3DFrameCtrlFv() { nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/__dt__12J3DFrameCtrlFv.s" } @@ -903,14 +698,9 @@ asm J3DFrameCtrl::~J3DFrameCtrl() { /* 804C7304-804C7324 000624 0020+00 1/1 0/0 0/0 .text daNbomb_createHeap__FP10fopAc_ac_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daNbomb_createHeap(fopAc_ac_c* param_0) { - nofralloc -#include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_createHeap__FP10fopAc_ac_c.s" +static int daNbomb_createHeap(fopAc_ac_c* i_this) { + return ((daNbomb_c*)i_this)->createHeap(); } -#pragma pop /* ############################################################################################## */ /* 804CC398-804CC3B0 000058 0018+00 0/1 0/0 0/0 .rodata heapSize$4323 */ @@ -1003,14 +793,221 @@ SECTION_DEAD static char const* const stringBase_804CC4D0 = "D_MN01A"; #pragma pop /* 804C7324-804C7B44 000644 0820+00 1/1 0/0 0/0 .text create__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +int daNbomb_c::create() { + fopAcM_GetID(this); + fopAcM_SetupActor(this, daNbomb_c); + + BOOL is_octaeel_bomb = false; + + if (fopAcM_GetParam(this) == PRM_FLOWER_BOMB) { + mType = TYPE_FLOWER; + } else if (fopAcM_GetParam(this) == PRM_ENEMY_BOMB || + fopAcM_GetParam(this) == PRM_ENEMY_BOMB_HOOKSHOT || + fopAcM_GetParam(this) == PRM_ENEMY_BOMB_BOOMERANG) + { + mType = TYPE_INSECT_ENEMY; + } else if (fopAcM_GetParam(this) == PRM_ENEMY_WATER_BOMB || + fopAcM_GetParam(this) == PRM_ENEMY_WATER_BOMB_HOOKSHOT || + fopAcM_GetParam(this) == PRM_UNK_15) + { + if (fopAcM_GetParam(this) == PRM_ENEMY_WATER_BOMB) { + fopAcM_SetParam(this, PRM_ENEMY_BOMB); + } else if (fopAcM_GetParam(this) == PRM_ENEMY_WATER_BOMB_HOOKSHOT) { + fopAcM_SetParam(this, PRM_ENEMY_BOMB_HOOKSHOT); + if (strcmp(dComIfGp_getStartStageName(), "D_MN01A") == 0) { + is_octaeel_bomb = true; + } + } else { + fopAcM_SetParam(this, PRM_ENEMY_BOMB_BOOMERANG); + } + + mType = TYPE_WATER_ENEMY; + onStateFlg0(FLG0_WATER_BOMB); + } else if (fopAcM_GetParam(this) == PRM_INSECT_BOMB_PLAYER) { + mType = TYPE_INSECT_PLAYER; + } else if (fopAcM_GetParam(this) == PRM_WATER_BOMB_PLAYER) { + mType = TYPE_WATER_PLAYER; + } else { + mType = TYPE_NORMAL_PLAYER; + } + + if (mType >= TYPE_FLOWER && dComIfG_resLoad(&mPhase, m_arcNameList[mType]) != cPhs_COMPLEATE_e) + { + return cPhs_ERROR_e; + } + + static u32 const heapSize[] = {0xEB0, 0xEB0, 0x17C0, 0xEB0, 0x2500, 0xF90}; + + if (!fopAcM_entrySolidHeap(this, daNbomb_createHeap, heapSize[mType])) { + return cPhs_ERROR_e; + } + + mAcchCir.SetWall(30.0f, 30.0f); + mAcch.Set(this, 1, &mAcchCir); + mAcch.ClrWaterNone(); + mAcch.SetRoofCrrHeight(60.0f); + + if (fopAcM_GetParam(this) != PRM_INSECT_BOMB_PLAYER) { + mAcch.ClrRoofNone(); + } + + mAcch.SetWaterCheckOffset(10000.0f); + mAcch.SetWtrChkMode(2); + mAcch.OnLineCheck(); + + mDoMtx_copy(cMtx_getIdentity(), field_0xa40); + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + + mCcStts.Init(30, 0xFF, this); + + mCcSph.Set(l_sphSrc); + mCcSph.SetStts(&mCcStts); + mCcSph.SetTgHitCallback(daNbomb_tgHitCallback); + + mSph2.Set(l_sphSrc); + mSph2.SetStts(&mCcStts); + mSph2.SetTgMtrl(2); + mSph2.OffCoSetBit(); + mSph2.SetR(110.0f); + mSph2.SetTgHitCallback(daNbomb_tgHitCallback); + + daAlink_c* player = daAlink_getAlinkActorClass(); + gravity = player->getBombGravity(); + maxFallSpeed = player->getBombMaxFallSpeed(); + mExTime = player->getBombExplodeTime(); + + if (is_octaeel_bomb) { + mExTime *= 0.75f; + } + + cLib_onBit(attention_info.flags, 0x80); + fopAcM_OnCarryType(this, fopAcM_CARRY(fopAcM_CARRY_LIGHT | fopAcM_CARRY_SIDE)); + field_0xb5c = shape_angle.y; + + if (fopAcM_GetParam(this) == PRM_NORMAL_BOMB_EXPLODE || + fopAcM_GetParam(this) == PRM_WATER_BOMB_EXPLODE) + { + mAcch.CrrPos(dComIfG_Bgsp()); + procExplodeInit(); + onStateFlg0(FLG0_UNK_2000); + } else { + mAcch.CrrPos(dComIfG_Bgsp()); + setRoomInfo(); + + if (fopAcM_GetParam(this) == PRM_NORMAL_BOMB_PLAYER || + fopAcM_GetParam(this) == PRM_WATER_BOMB_PLAYER) + { + onStateFlg0(FLG0_PLAYER_MAKE); + + if (fopAcM_GetParam(this) == PRM_WATER_BOMB_PLAYER) { + onStateFlg0(FLG0_WATER_BOMB); + } + + if (checkWaterIn()) { + onStateFlg0(FLG0_UNDERWATER); + gravity = player->getBombWaterGravity(); + maxFallSpeed = player->getBombWaterMaxFallSpeed(); + } + + procCarryInit(); + } else if (fopAcM_GetParam(this) == PRM_ENEMY_BOMB) { + if (player->setEnemyBomb(this)) { + procCarryInit(); + } else { + procWaitInit(); + } + } else if (fopAcM_GetParam(this) == PRM_ENEMY_BOMB_HOOKSHOT) { + if (player->setEnemyBombHookshot(this)) { + setHookshotOffset(); + procCarryInit(); + } else { + procWaitInit(); + } + } else if (fopAcM_GetParam(this) == PRM_ENEMY_BOMB_BOOMERANG) { + procBoomerangMoveInit(NULL); + } else if (fopAcM_GetParam(this) == PRM_FLOWER_BOMB) { + procFlowerWaitInit(); + } else if (fopAcM_GetParam(this) == PRM_BOMB_CARGO_CARRY) { + onStateFlg0(FLG0_CARGO_CARRY); + procCarryInit(); + } else if (fopAcM_GetParam(this) == PRM_INSECT_BOMB_PLAYER) { + onStateFlg0(daNbomb_FLG0(FLG0_INSECT_BOMB | FLG0_NO_HIT_PLAYER | FLG0_PLAYER_MAKE)); + mExTime = player->getBombExplodeTime() * 2; + shape_angle.y = player->shape_angle.y; + current.angle.y = player->shape_angle.y; + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mDoMtx_inverse(mpModel->getBaseTRMtx(), field_0xa70); + + scale.set(0.6f, 0.6f, 0.6f); + mpModel->setBaseScale(scale); + field_0xbf0 = cXyz::BaseY; + + field_0xbfc.set(cM_ssin(shape_angle.y), 0.0f, cM_scos(shape_angle.y)); + field_0xc08.set(field_0xbfc.z, 0.0f, -field_0xbfc.x); + + cXyz start = current.pos + (field_0xbf0 * 5.0f); + cXyz end = current.pos - (field_0xbf0 * 100.0f); + mLineChk.Set(&start, &end, this); + + if (insectLineCheck() == 1) { + procInsectMoveInit(); + } else { + start = current.pos - (field_0xbf0 * 5.0f); + end = start - (field_0xbfc * 100.0f); + mLineChk.Set(&start, &end, this); + + if (insectLineCheck() == 1) { + procInsectMoveInit(); + } else { + procExplodeInit(); + onStateFlg0(FLG0_UNK_2000); + } + } + } else { + procWaitInit(); + } + } + + fopAcM_SetMin(this, -36.0f, 0.0f, -36.0f); + fopAcM_SetMax(this, 36.0f, 66.0f, 36.0f); + fopAcM_setCullSizeFar(this, 10.0f); + + if (!checkStateFlg0(FLG0_INSECT_BOMB)) { + mDoMtx_stack_c::transS(current.pos); + + if (!checkStateFlg0(FLG0_INSECT_BOMB)) { + fopAcM_OnStatus(this, 0x80000); + } + + mDoMtx_stack_c::ZXYrotM(0, shape_angle.y, shape_angle.z); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mDoMtx_inverse(mpModel->getBaseTRMtx(), field_0xa70); + } + + if (mpBck != NULL) { + mpBck->entry(mpModel->getModelData()); + } + + mpModel->calc(); + setSmokePos(); + model = mpModel; + return cPhs_COMPLEATE_e; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::create() { +asm int daNbomb_c::create() { nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/create__9daNbomb_cFv.s" } #pragma pop +#endif /* 804C7B44-804C7CC8 000E64 0184+00 1/1 0/0 0/0 .text __ct__9daNbomb_cFv */ #pragma push @@ -1059,7 +1056,8 @@ extern "C" asm void __dt__10dCcD_GSttsFv() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm dBgS_AcchCir::~dBgS_AcchCir() { +// asm dBgS_AcchCir::~dBgS_AcchCir() { +extern "C" asm void __dt__12dBgS_AcchCirFv() { nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/__dt__12dBgS_AcchCirFv.s" } @@ -1069,23 +1067,61 @@ asm dBgS_AcchCir::~dBgS_AcchCir() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm dBgS_BombAcch::~dBgS_BombAcch() { +// asm dBgS_BombAcch::~dBgS_BombAcch() { +extern "C" asm void __dt__13dBgS_BombAcchFv() { nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/__dt__13dBgS_BombAcchFv.s" } #pragma pop /* 804C7E94-804C7EB4 0011B4 0020+00 1/0 0/0 0/0 .text daNbomb_Create__FP10fopAc_ac_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daNbomb_Create(fopAc_ac_c* param_0) { - nofralloc -#include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Create__FP10fopAc_ac_c.s" +static int daNbomb_Create(fopAc_ac_c* i_this) { + return ((daNbomb_c*)i_this)->create(); } -#pragma pop /* 804C7EB4-804C826C 0011D4 03B8+00 1/1 0/0 0/0 .text __dt__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +daNbomb_c::~daNbomb_c() { + if (mExplodeMode < 2) { + dKy_actor_addcol_set(0, 0, 0, 0.0f); + } + + dKy_plight_cut(&mLightInfluence); + dKyw_pntwind_cut(&mWindInfluence); + mSound.deleteObject(); + + if (checkStateFlg0(FLG0_UNK_40)) { + for (int i = 0; i < 5; i++) { + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mEffectEmitterIDs[i]); + if (emitter != NULL) { + emitter->stopDrawParticle(); + } + } + } + + if (mType >= TYPE_FLOWER) { + dComIfG_resDelete(&mPhase, m_arcNameList[mType]); + } + + daAlink_c* player = daAlink_getAlinkActorClass(); + if (player != NULL) { + if (checkStateFlg0(FLG0_INSECT_BOMB)) { + player->decrementInsectBombCnt(); + } else if (checkStateFlg0(FLG0_PLAYER_MAKE)) { + player->decrementBombCnt(); + } + } + + fopAcM_cancelCarryNow(this); + fopAcM_cancelHookCarryNow(this); + + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mEffectEmitterIDs[0]); + if (emitter != NULL) { + emitter->setParticleCallBackPtr(NULL); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1094,26 +1130,21 @@ asm daNbomb_c::~daNbomb_c() { #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/__dt__9daNbomb_cFv.s" } #pragma pop +#endif /* 804C826C-804C8294 00158C 0028+00 1/0 0/0 0/0 .text daNbomb_Delete__FP9daNbomb_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daNbomb_Delete(daNbomb_c* param_0) { - nofralloc -#include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Delete__FP9daNbomb_c.s" +static int daNbomb_Delete(daNbomb_c* i_this) { + i_this->~daNbomb_c(); + return 1; } -#pragma pop /* 804C8294-804C82D8 0015B4 0044+00 2/2 0/0 0/0 .text checkTimerStop__9daNbomb_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daNbomb_c::checkTimerStop() { - nofralloc -#include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/checkTimerStop__9daNbomb_cFv.s" +bool daNbomb_c::checkTimerStop() { + return fopAcM_GetParam(this) == PRM_FLOWER_BOMB || + checkStateFlg0(daNbomb_FLG0(FLG0_UNK_800 | FLG0_FROZEN)) || + (mType != TYPE_INSECT_ENEMY && mType != TYPE_WATER_ENEMY && + fopAcM_GetParam(this) == PRM_ENEMY_BOMB_BOOMERANG_MOVE); } -#pragma pop /* ############################################################################################## */ /* 804CC3E0-804CC3E4 0000A0 0004+00 3/3 0/0 0/0 .rodata @5021 */ @@ -1121,14 +1152,46 @@ SECTION_RODATA static f32 const lit_5021 = 1.5f; COMPILER_STRIP_GATE(0x804CC3E0, &lit_5021); /* 804C82D8-804C8430 0015F8 0158+00 5/5 0/0 0/0 .text checkExplode__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::checkExplode() { + if (checkStateFlg0(daNbomb_FLG0(FLG0_UNK_800 | FLG0_FROZEN))) { + return false; + } + + if (mExTime > 0) { + if (!dComIfGp_event_runCheck() && !checkTimerStop()) { + mExTime--; + + if (checkStateFlg0(FLG0_CARGO_CARRY)) { + daAlink_c* player = daAlink_getAlinkActorClass(); + if (mExTime < player->getBombExplodeTime()) { + mExTime = player->getBombExplodeTime() * 1.5f; + } + } + } + + if ((mExTime == 0 || checkStateFlg0(FLG0_BOMB_HIT)) || + ((fopAcM_GetParam(this) == PRM_BOMB_BOOMERANG_MOVE || + fopAcM_GetParam(this) == PRM_ENEMY_BOMB_BOOMERANG_MOVE) && + mAcch.ChkWallHit() && !daAlink_c::checkIcePolygonDamage(&mAcchCir))) + { + return procExplodeInit(); + } + } + + offStateFlg0(FLG0_BOMB_HIT); + return false; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::checkExplode() { - nofralloc +asm BOOL daNbomb_c::checkExplode(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/checkExplode__9daNbomb_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 804CC3E4-804CC3E8 0000A4 0004+00 1/2 0/0 0/0 .rodata @5036 */ @@ -1136,14 +1199,32 @@ SECTION_RODATA static f32 const lit_5036 = -1000000000.0f; COMPILER_STRIP_GATE(0x804CC3E4, &lit_5036); /* 804C8430-804C84D8 001750 00A8+00 5/5 0/0 0/0 .text setRoomInfo__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +void daNbomb_c::setRoomInfo() { + int room_no; + if (mAcch.GetGroundH() != -1000000000.0f) { + room_no = dComIfG_Bgsp().GetRoomId(mAcch.m_gnd); + tevStr.mEnvrIdxOverride = dComIfG_Bgsp().GetPolyColor(mAcch.m_gnd); + mPolySound = dKy_pol_sound_get(&mAcch.m_gnd); + } else { + room_no = dComIfGp_roomControl_getStayNo(); + } + + tevStr.mRoomNo = room_no; + mSoundReverb = dComIfGp_getReverb(room_no); + mCcStts.SetRoomId(room_no); + fopAcM_SetRoomNo(this, room_no); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::setRoomInfo() { - nofralloc +asm void daNbomb_c::setRoomInfo(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/setRoomInfo__9daNbomb_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 804CC3E8-804CC3F4 0000A8 000C+00 1/1 0/0 0/0 .rodata localOffset$5044 */ @@ -1153,14 +1234,27 @@ SECTION_RODATA static u8 const localOffset[12] = { COMPILER_STRIP_GATE(0x804CC3E8, &localOffset); /* 804C84D8-804C8588 0017F8 00B0+00 2/2 0/0 0/0 .text setSmokePos__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +void daNbomb_c::setSmokePos() { + if (mType == TYPE_INSECT_ENEMY || mType == TYPE_WATER_ENEMY) { + mDoMtx_multVecZero(mpModel->getBaseTRMtx(), &mEffectPosition); + } else { + static Vec localOffset = {0.0f, 60.0f, 0.0f}; + mDoMtx_multVec(mpModel->getBaseTRMtx(), &localOffset, &mEffectPosition); + } + + field_0xbe4 = (mEffectPosition - mEffectLastPosition) * 0.5f; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::setSmokePos() { - nofralloc +asm void daNbomb_c::setSmokePos(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/setSmokePos__9daNbomb_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 804CC3F4-804CC3F8 0000B4 0004+00 1/1 0/0 0/0 .rodata @5143 */ @@ -1273,6 +1367,46 @@ static u8 effectScale[12]; #pragma pop /* 804C8588-804C87F0 0018A8 0268+00 1/1 0/0 0/0 .text setEffect__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +void daNbomb_c::setEffect() { + static cXyz effectScale(1.8f, 1.8f, 1.8f); + + if (mpBck != NULL || checkStateFlg0(FLG0_WATER_BOMB)) { + static u16 enemyBombID[] = {0xA0D, 0xA0E, 0xA0F, 0xA10, 0xA11}; + u32* emitter_id = &mEffectEmitterIDs[0]; + u16* effect_id = &enemyBombID[0]; + + mDoMtx_stack_c::copy(mpModel->getAnmMtx(0)); + + if (mType == TYPE_WATER_ENEMY || checkStateFlg0(FLG0_WATER_BOMB)) { + mDoMtx_stack_c::ZXYrotM(0, 0x4000, 0x4000); + } + + for (int i = 0; i < 5; i++, emitter_id++, effect_id++) { + *emitter_id = dComIfGp_particle_set(*emitter_id, *effect_id, ¤t.pos, &tevStr); + + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(*emitter_id); + if (emitter != NULL) { + emitter->setGlobalRTMatrix(mDoMtx_stack_c::get()); + } + } + } else { + mEffectEmitterIDs[0] = + dComIfGp_particle_set(mEffectEmitterIDs[0], 0x1DF, &mEffectPosition, &tevStr, NULL, + &effectScale, 0xFF, NULL, -1, NULL, NULL, NULL); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mEffectEmitterIDs[0]); + if (emitter != NULL) { + emitter->setParticleCallBackPtr(dPa_control_c::getParticleTracePCB()); + emitter->setUserWork((u32)&field_0xbe4); + } + + mEffectEmitterIDs[1] = + dComIfGp_particle_set(mEffectEmitterIDs[1], 0x1DE, &mEffectPosition, &tevStr, NULL, + &effectScale, 0xFF, NULL, -1, NULL, NULL, NULL); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1281,8 +1415,24 @@ asm void daNbomb_c::setEffect() { #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/setEffect__9daNbomb_cFv.s" } #pragma pop +#endif /* 804C87F0-804C88CC 001B10 00DC+00 2/2 0/0 0/0 .text setHookshotOffset__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +void daNbomb_c::setHookshotOffset() { + daAlink_c* player = daAlink_getAlinkActorClass(); + + cXyz offset = player->current.pos - current.pos; + offset.y = 0.0f; + offset.normalizeZP(); + offset *= 30.0f; + offset.y += 30.0f; + + player->setHookshotCarryOffset(fopAcM_GetID(this), &offset); + offStateFlg0(FLG0_SET_HOOKSHOT_OFFSET); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1291,26 +1441,31 @@ asm void daNbomb_c::setHookshotOffset() { #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/setHookshotOffset__9daNbomb_cFv.s" } #pragma pop +#endif /* 804C88CC-804C88F0 001BEC 0024+00 2/2 0/0 0/0 .text setFreeze__9daNbomb_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daNbomb_c::setFreeze() { - nofralloc -#include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/setFreeze__9daNbomb_cFv.s" +void daNbomb_c::setFreeze() { + if (!checkStateFlg0(FLG0_FROZEN)) { + onStateFlg0(FLG0_FROZEN); + mFreezeTimer = 90; + } } -#pragma pop /* 804C88F0-804C8928 001C10 0038+00 3/3 0/0 0/0 .text checkWaterIn__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::checkWaterIn() { + return mAcch.ChkWaterHit() && current.pos.y + 30.0f < mAcch.m_wtr.GetHeight(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::checkWaterIn() { - nofralloc +asm int daNbomb_c::checkWaterIn(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/checkWaterIn__9daNbomb_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 804CC3F8-804CC3FC 0000B8 0004+00 1/1 0/0 0/0 .rodata @5214 */ @@ -1318,22 +1473,43 @@ SECTION_RODATA static u32 const lit_5214 = 0x43360B61; COMPILER_STRIP_GATE(0x804CC3F8, &lit_5214); /* 804C8928-804C8A40 001C48 0118+00 3/3 0/0 0/0 .text insectLineCheck__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +int daNbomb_c::insectLineCheck() { + if (dComIfG_Bgsp().LineCross(&mLineChk)) { + cM3dGPla chk_poly; + dComIfG_Bgsp().GetTriPla(mLineChk, &chk_poly); + + daAlink_c* player = daAlink_getAlinkActorClass(); + + if (chk_poly.mNormal.y < cM_scos(cM_deg2s(player->getBombInsectLimitAngle())) || + dComIfG_Bgsp().GetGroundCode(mLineChk) == 1) + { + return 2; + } + + return 1; + } + + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::insectLineCheck() { +asm int daNbomb_c::insectLineCheck() { nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/insectLineCheck__9daNbomb_cFv.s" } #pragma pop +#endif /* 804C8A40-804C8A88 001D60 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGPlaFv */ #pragma push #pragma optimization_level 0 #pragma optimizewithasm off // asm cM3dGPla::~cM3dGPla() { -extern "C" asm void __dt__8cM3dGPlaFv() { - nofralloc +extern "C" asm void __dt__8cM3dGPlaFv(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/__dt__8cM3dGPlaFv.s" } #pragma pop @@ -1347,14 +1523,60 @@ COMPILER_STRIP_GATE(0x804CC3FC, &lit_5289); #pragma pop /* 804C8A88-804C8CF8 001DA8 0270+00 2/2 0/0 0/0 .text setHitPolygon__9daNbomb_cFi */ +// matches with literals +#ifdef NONMATCHING +void daNbomb_c::setHitPolygon(BOOL param_0) { + if (!param_0) { + mInsectHitPolyInfo.SetPolyInfo(mLineChk); + current.pos = mLineChk.i_GetCross(); + } + + cM3dGPla poly; + dComIfG_Bgsp().GetTriPla(mInsectHitPolyInfo, &poly); + + f32 var_f31 = field_0xbf0.inprod(poly.mNormal); + if (!(fabsf(var_f31) > 0.999f)) { + cXyz sp20 = field_0xbf0.outprod(poly.mNormal); + sp20.normalizeZP(); + + mDoMtx_stack_c::rotAxisRadS(&sp20, + cM_atan2f(JMAFastSqrt(1.0f - (var_f31 * var_f31)), var_f31)); + field_0xbf0 = poly.mNormal; + + mDoMtx_stack_c::multVecSR(&field_0xc08, &field_0xc08); + mDoMtx_stack_c::multVecSR(&field_0xbfc, &field_0xbfc); + + csXyz sp58(current.angle); + mDoMtx_stack_c::ZXYrotM(current.angle); + mDoMtx_MtxToRot(mDoMtx_stack_c::get(), ¤t.angle); + + if (param_0) { + shape_angle.x += current.angle.x - sp58.x; + shape_angle.y += current.angle.y - sp58.y; + shape_angle.z += current.angle.z - sp58.z; + } + } + + if (!param_0) { + cLib_addCalcAngleS(&shape_angle.x, current.angle.x, 3, 0x2000, 0x400); + cLib_addCalcAngleS(&shape_angle.y, current.angle.y, 3, 0x2000, 0x400); + cLib_addCalcAngleS(&shape_angle.z, current.angle.z, 3, 0x2000, 0x400); + } + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mDoMtx_inverse(mpModel->getBaseTRMtx(), field_0xa70); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::setHitPolygon(int param_0) { - nofralloc +asm void daNbomb_c::setHitPolygon(int param_0){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/setHitPolygon__9daNbomb_cFi.s" } #pragma pop +#endif /* ############################################################################################## */ /* 804CC400-804CC414 0000C0 0012+02 0/1 0/0 0/0 .rodata normalNameID$5297 */ @@ -1460,14 +1682,117 @@ COMPILER_STRIP_GATE(0x804CC448, &lit_5404); #pragma pop /* 804C8CF8-804C9118 002018 0420+00 5/5 0/0 0/0 .text procExplodeInit__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::procExplodeInit() { + fopAcM_OnStatus(this, 0x20000); + daAlink_c* player = daAlink_getAlinkActorClass(); + + scale.x = player->getBombEffScale(); + scale.y = scale.x; + scale.z = scale.x; + + shape_angle.y = cM_rndF(0x10000); + field_0xbe4 = cXyz::Zero; + + g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); + + static const u16 normalNameID[] = {0x161, 0x162, 0x163, 0x164, 0x165, + 0x166, 0x167, 0x168, 0x1EC}; + static const u16 waterNameID[] = {0xA05, 0xA06, 0xA07, 0xA08, 0xA09, 0xA0A, 0xA0B, 0xA0C}; + static const u16 waterNameID2[] = {0x9FC, 0x9FD, 0x9FE, 0x9FF, 0xA00, + 0xA01, 0xA02, 0xA03, 0xA04}; + + const u16* eff_list; + int eff_num; + u32 sound; + + if (checkStateFlg0(FLG0_UNDERWATER) || fopAcM_GetParam(this) == PRM_WATER_BOMB_EXPLODE) { + if (mAcch.ChkWaterHit() && + mAcch.m_wtr.GetHeight() - current.pos.y < player->getBombExplodeWaterEffectLimit()) + { + eff_list = waterNameID2; + eff_num = 9; + sound = Z2SE_OBJ_BOMB_EXP_WTRSURF; + } else { + eff_list = waterNameID; + eff_num = 8; + sound = Z2SE_OBJ_WATERBOMB_EXPLODE; + } + } else { + eff_list = normalNameID; + eff_num = 9; + sound = Z2SE_OBJ_BOMB_EXPLODE; + } + + for (int i = 0; i < eff_num; i++, eff_list++) { + dComIfGp_particle_setColor(*eff_list, ¤t.pos, &tevStr, NULL, NULL, 0.0f, 0xFF, + &shape_angle, &scale, NULL, -1, NULL); + } + + mLightInfluence.mPosition = current.pos; + mLightInfluence.mPosition.y += 100.0f; + mLightInfluence.mColor.r = 100; + mLightInfluence.mColor.g = 100; + mLightInfluence.mColor.b = 80; + mLightInfluence.mPow = 600.0f; + mLightInfluence.mFluctuation = 100.0f; + dKy_plight_set(&mLightInfluence); + + mWindInfluence.position = current.pos; + mWindInfluence.mDirection.x = 0.0f; + mWindInfluence.mDirection.y = 1.0f; + mWindInfluence.mDirection.z = 0.0f; + mWindInfluence.mRadius = 500.0f; + mWindInfluence.field_0x20 = 0.0f; + mWindInfluence.mStrength = 0.5f; + dKyw_pntwind_set(&mWindInfluence); + + mExplodeMode = 0; + mExplosionStrength = 0.0f; + + mProcFunc = &procExplode; + + speedF = 0.0f; + speed = cXyz::Zero; + gravity = 0.0f; + fopAcM_SetParam(this, PRM_NORMAL_BOMB_EXPLODE); + cLib_offBit(attention_info.flags, 0x10); + + mCcSph.OffTgSetBit(); + mCcSph.OffCoSetBit(); + mCcSph.OnAtSetBit(); + mCcSph.SetR(player->getBombAtR()); + mCcSph.SetC(current.pos); + g_dComIfG_gameInfo.play.mCcs.Set(&mCcSph); + g_dComIfG_gameInfo.play.mCcs.SetMass(&mCcSph, 1); + + mSound.startSound(sound, 0, mSoundReverb); + + fopAcM_cancelCarryNow(this); + fopAcM_cancelHookCarryNow(this); + dKy_Sound_set(current.pos, 0xFF, fopAcM_GetID(this), 10); + mExTime = 0; + + f32 var_f31 = current.pos.abs2(player->current.pos); + if (var_f31 < 160000.0f) { + dComIfGp_getVibration().StartShock(4, 31, cXyz(0.0f, 1.0f, 0.0f)); + } else if (var_f31 < 640000.0f) { + dComIfGp_getVibration().StartShock(2, 31, cXyz(0.0f, 1.0f, 0.0f)); + } + + field_0xb51 = 1; + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::procExplodeInit() { - nofralloc +asm BOOL daNbomb_c::procExplodeInit(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/procExplodeInit__9daNbomb_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 804CC44C-804CC450 00010C 0004+00 0/1 0/0 0/0 .rodata @5451 */ @@ -1530,44 +1855,214 @@ SECTION_RODATA static f32 const lit_5458 = 1.0f / 10.0f; COMPILER_STRIP_GATE(0x804CC474, &lit_5458); /* 804C9118-804C93E0 002438 02C8+00 1/0 0/0 0/0 .text procExplode__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::procExplode() { + camera_class* camera = dComIfGp_getCamera(0); + f32 dist_scale = 0.0f; + + mLightInfluence.mPow = mExplosionStrength * 1500.0f; + mWindInfluence.mStrength = mExplosionStrength; + + f32 dist_to_cam = current.pos.abs(camera->mLookat.mEye); + if (dist_to_cam < 1500.0f) { + dist_scale = dist_to_cam / 1500.0f; + dist_scale *= dist_scale * dist_scale; + dist_scale = 1.0f - dist_scale; + } + + switch (mExplodeMode) { + case 0: + cLib_addCalc(&mExplosionStrength, 1.0f, 0.5f, 0.5f, 0.02f); + + if (mExplosionStrength >= 0.99f) { + mExplodeMode++; + } + break; + case 1: + cLib_addCalc(&mExplosionStrength, 0.0f, 0.25f, 0.1f, 0.02f); + + if (mExplosionStrength <= 0.1f) { + mExplodeMode++; + mExplosionStrength = 0.0f; + } + break; + } + + dKy_actor_addcol_amb_set(100, 60, 50, mExplosionStrength * dist_scale); + dKy_bg_addcol_amb_set(100, 60, 50, mExplosionStrength * dist_scale); + + if (mExplodeMode < 2) { + mExTime--; + + if (mExTime > -3) { + mCcSph.SetC(current.pos); + g_dComIfG_gameInfo.play.mCcs.Set(&mCcSph); + g_dComIfG_gameInfo.play.mCcs.SetMass(&mCcSph, 1); + } + } else { + dKy_actor_addcol_set(0, 0, 0, 0); + fopAcM_delete(this); + } + + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::procExplode() { - nofralloc +asm BOOL daNbomb_c::procExplode(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/procExplode__9daNbomb_cFv.s" } #pragma pop +#endif /* 804C93E0-804C955C 002700 017C+00 6/6 0/0 0/0 .text procCarryInit__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::procCarryInit() { + mProcFunc = &procCarry; + + offStateFlg0(FLG0_UNK_10000); + field_0xc20 = cXyz::Zero; + field_0xc2c = cXyz::Zero; + + if (fopAcM_checkHookCarryNow(this)) { + fopAcM_SetParam(this, PRM_BOMB_HOOKSHOT); + } else { + fopAcM_SetParam(this, PRM_BOMB_CARRY); + } + + if (checkStateFlg0(FLG0_INSECT_BOMB)) { + mpBck->init((J3DAnmTransform*)dComIfG_getObjectRes(daAlink_c::getAlinkArcName(), 0x15), + TRUE, -1, 1.0f, 0, -1, true); + shape_angle.set(0, daAlink_getAlinkActorClass()->shape_angle.y, 0); + mDoMtx_copy(cMtx_getIdentity(), field_0xa40); + } + + speedF = 0.0f; + speed = cXyz::Zero; + cLib_offBit(attention_info.flags, 0x10); + mCcSph.OffCoSetBit(); + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::procCarryInit() { - nofralloc +asm BOOL daNbomb_c::procCarryInit(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/procCarryInit__9daNbomb_cFv.s" } #pragma pop +#endif /* 804C955C-804C9930 00287C 03D4+00 1/0 0/0 0/0 .text procCarry__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::procCarry() { + daAlink_c* player = daAlink_getAlinkActorClass(); + + cLib_chaseF(&field_0xbb0, 0.0f, 1.0f); + + if (checkStateFlg0(FLG0_SET_HOOKSHOT_OFFSET)) { + setHookshotOffset(); + } + + if (!fopAcM_checkCarryNow(this) && !fopAcM_checkHookCarryNow(this)) { + if (fopAcM_GetParam(this) == PRM_BOMB_HOOKSHOT && player->setForceGrab(this, 0, 1)) { + procCarryInit(); + return true; + } + + if (checkStateFlg0(FLG0_INSECT_BOMB)) { + if (fopAcM_GetParam(this) != PRM_BOMB_HOOKSHOT) { + mDoMtx_multVecSR(mpModel->getBaseTRMtx(), &cXyz::BaseY, &field_0xbf0); + mDoMtx_multVecSR(mpModel->getBaseTRMtx(), &cXyz::BaseZ, &field_0xbfc); + mDoMtx_multVecSR(mpModel->getBaseTRMtx(), &cXyz::BaseX, &field_0xc08); + mDoMtx_MtxToRot(mpModel->getBaseTRMtx(), &shape_angle); + current.angle = shape_angle; + + cXyz start = current.pos + (field_0xbf0 * 5.0f); + cXyz end = current.pos - (field_0xbf0 * 100.0f); + mLineChk.Set(&start, &end, this); + + if (insectLineCheck() == 1) { + procInsectMoveInit(); + return procInsectMove(); + } + + start = current.pos - (field_0xbf0 * 5.0f); + end = start - (field_0xbfc * 100.0f); + mLineChk.Set(&start, &end, this); + + if (insectLineCheck() == 1) { + procInsectMoveInit(); + return procInsectMove(); + } + } + + if (checkWaterIn()) { + onStateFlg0(FLG0_DELETE_BOMB); + return true; + } + + return procExplodeInit(); + } else { + procWaitInit(); + return procWait(); + } + } else if (checkExplode()) { + return true; + } + + cXyz sp40(current.pos); + mAcch.CrrPos(dComIfG_Bgsp()); + setRoomInfo(); + + if (fopAcM_GetParam(this) == 1) { + if (daAlink_getAlinkActorClass()->getGrabActorID() == fopAcM_GetID(this)) { + daAlink_getAlinkActorClass()->setGrabCollisionOffset(current.pos.x - sp40.x, + current.pos.z - sp40.z, NULL); + } + } + + current.pos = sp40; + speedF = 0.0f; + speed = cXyz::Zero; + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::procCarry() { - nofralloc +asm BOOL daNbomb_c::procCarry(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/procCarry__9daNbomb_cFv.s" } #pragma pop +#endif /* 804C9930-804C9984 002C50 0054+00 4/4 0/0 0/0 .text procWaitInit__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::procWaitInit() { + if (fopAcM_GetParam(this) == PRM_BOMB_CARRY) { + onStateFlg0(FLG0_UNK_20000); + } + + mProcFunc = &procWait; + fopAcM_SetParam(this, PRM_BOMB_WAIT); + mCcSph.OnCoSetBit(); + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::procWaitInit() { - nofralloc +asm BOOL daNbomb_c::procWaitInit(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/procWaitInit__9daNbomb_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 804CC478-804CC47C 000138 0004+00 0/1 0/0 0/0 .rodata @5873 */ @@ -1633,55 +2128,364 @@ COMPILER_STRIP_GATE(0x804CC498, &lit_5882); #pragma pop /* 804C9984-804CA268 002CA4 08E4+00 2/1 0/0 0/0 .text procWait__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::procWait() { + if (checkExplode()) { + return true; + } + + if (fopAcM_checkCarryNow(this)) { + return procCarryInit(); + } + + f32 prev_speedf = speedF; + + if (mAcch.i_ChkGroundHit() && !mAcch.ChkGroundLanding()) { + s16 var_r28 = fopAcM_getPolygonAngle(mAcch.m_gnd, current.angle.y); + + speed.y -= speedF * fabsf(cM_ssin(var_r28)); + speedF *= cM_scos(var_r28); + } else { + cLib_chaseF(&field_0xbb0, 0.0f, 1.0f); + } + + f32 prev_gravity = gravity; + + if (field_0xc20.y > 5.0f) { + gravity = 0.0f; + + if (speed.y < 0.0f) { + speed.y += field_0xc20.y; + + if (speed.y > 0.0f) { + field_0xc20.y = speed.y; + speed.y = 0.0f; + } else { + field_0xc20.y = 0.0f; + } + } + + if (field_0xc20.abs2XZ() < 0.1f) { + speedF *= 0.5f; + } + } + + if (field_0xc2c.y > 2.0f) { + gravity = 0.0f; + + if (speed.y < 0.0f) { + speed.y += field_0xc2c.y; + + if (speed.y > 0.0f) { + field_0xc2c.y = speed.y; + speed.y = 0.0f; + } else { + field_0xc2c.y = 0.0f; + } + + onStateFlg0(FLG0_UNK_10000); + } + + if (field_0xc2c.abs2XZ() < 0.1f) { + speedF *= 0.5f; + } + } + + fopAcM_posMoveF(this, mCcStts.GetCCMoveP()); + + if (checkStateFlg0(FLG0_UNK_10000) && checkStateFlg0(FLG0_UNDERWATER) && mAcch.ChkWaterHit() && + (current.pos.y + 30.0f) + 1.0f >= mAcch.m_wtr.GetHeight()) + { + current.pos.y = (mAcch.m_wtr.GetHeight() - 30.0f) - 1.0f; + speed.y = 0.0f; + } + + speedF = prev_speedf; + gravity = prev_gravity; + + f32 prev_speedY = speed.y; + s16 var_r28 = 0; + s16 var_r27 = 0; + + current.pos += field_0xc20 + field_0xc2c; + mAcch.CrrPos(dComIfG_Bgsp()); + setRoomInfo(); + + if (checkStateFlg0(FLG0_INSECT_BOMB) && + (mAcch.i_ChkGroundHit() || mAcch.ChkWallHit() || mAcch.ChkRoofHit())) + { + return procExplodeInit(); + } + + if (mAcch.i_ChkGroundHit()) { + cM3dGPla plane; + dComIfG_Bgsp().GetTriPla(mAcch.m_gnd, &plane); + + field_0xb5a = cM_atan2s(plane.mNormal.absXZ(), plane.mNormal.y); + var_r27 = plane.mNormal.atan2sX_Z(); + var_r28 = var_r27 - current.angle.y; + + if (checkStateFlg0(FLG0_UNK_800) && + (!mAcch.ChkWaterHit() || current.pos.y + 300.0f > mAcch.m_wtr.GetHeight())) + { + onStateFlg0(FLG0_DELETE_BOMB); + return true; + } + + if (daAlink_c::checkSnowCodePolygon(mAcch.m_gnd)) { + field_0xbb0 = -20.0f; + speedF *= 0.7f; + speed.y = 0.0f; + prev_speedY = 0.0f; + } + } + + daAlink_c* player = daAlink_getAlinkActorClass(); + + if (mAcch.ChkWallHit()) { + speedF *= player->getBombBoundRate(); + current.angle.y = (mAcchCir.GetWallAngleY() * 2) - (current.angle.y + 0x8000); + } else if (mAcch.ChkGroundLanding() && speedF > 5.0f && cM_deg2s(50.0f) <= field_0xb5a) { + if ((f32)fabs(var_r28) >= (f32)0x4000) { + speedF *= player->getBombBoundRate(); + current.angle.y = (var_r27 * 2) - (current.angle.y + 0x8000); + mAcch.ClrGroundLanding(); + mAcch.i_ClrGroundHit(); + speed.y = prev_speedY; + } + } + + if (mAcch.ChkGroundLanding()) { + u32 spC0 = fabsf(prev_speedY) * 2.0f; + + if (checkStateFlg0(FLG0_UNK_20000) && speedF < 1.0f) { + spC0 = 50; + } else if (spC0 > 100) { + spC0 = 100; + } + + Z2AudioMgr::getInterface()->seStart(Z2SE_OBJ_BOMB_BOUND, ¤t.pos, mPolySound, + mSoundReverb, 1.0f, spC0, -1.0f, -1.0f, 0); + + f32 var_f31 = prev_speedY * -player->getBombBoundRate(); + if (var_f31 < player->getBombStopSpeedY()) { + cLib_chaseF(&speedF, 0.0f, 7.0f); + } else { + speedF *= 0.9f; + + s16 gnd_angle = fopAcM_getPolygonAngle(mAcch.m_gnd, current.angle.y); + if (gnd_angle < 0) { + speedF *= cM_scos(gnd_angle); + } + + if (var_f31 > player->getBombMaxSpeedY()) { + speed.y = player->getBombMaxSpeedY(); + } else { + speed.y = var_f31; + } + } + + fopAcM_seStartCurrent(this, Z2SE_OBJ_BOMB_BOUND, 0); + } else if (mAcch.i_ChkGroundHit()) { + cM3dGPla plane; + dComIfG_Bgsp().GetTriPla(mAcch.m_gnd, &plane); + + if (field_0xb5a >= cM_deg2s(20.0f) && !daAlink_c::checkSnowCodePolygon(mAcch.m_gnd)) { + f32 var_f28 = 2.0f * cM_ssin(field_0xb5a); + f32 var_f30 = (plane.mNormal.x * var_f28) + (speedF * cM_ssin(current.angle.y)); + f32 var_f29 = (plane.mNormal.z * var_f28) + (speedF * cM_scos(current.angle.y)); + + current.angle.y = cM_atan2s(var_f30, var_f29); + speedF = JMAFastSqrt(var_f30 * var_f30 + var_f29 * var_f29); + if (speedF > 20.0f) { + speedF = 20.0f; + } + } else { + if (cLib_chaseF(&speedF, 0.0f, 2.0f)) { + if (field_0xc20.abs2() < 1.0f && field_0xc2c.abs2() < 1.0f && + !checkStateFlg0(FLG0_FROZEN)) + { + cLib_onBit(attention_info.flags, 0x10); + } else { + cLib_offBit(attention_info.flags, 0x10); + } + } + } + } else { + cLib_offBit(attention_info.flags, 0x10); + } + + offStateFlg0(FLG0_UNK_20000); + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::procWait() { - nofralloc +asm BOOL daNbomb_c::procWait(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/procWait__9daNbomb_cFv.s" } #pragma pop +#endif /* 804CA268-804CA2EC 003588 0084+00 1/1 0/0 0/0 .text procFlowerWaitInit__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::procFlowerWaitInit() { + mProcFunc = &procFlowerWait; + + mCcSph.OnCoSetBit(); + mCcSph.OffTgSetBit(); + cLib_offBit(attention_info.flags, 0x10); + scale.set(0.1f, 0.1f, 0.1f); + mCcStts.SetWeight(0xFE); + mpModel->setBaseScale(scale); + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::procFlowerWaitInit() { - nofralloc +asm BOOL daNbomb_c::procFlowerWaitInit(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/procFlowerWaitInit__9daNbomb_cFv.s" } #pragma pop +#endif /* 804CA2EC-804CA3B8 00360C 00CC+00 1/0 0/0 0/0 .text procFlowerWait__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::procFlowerWait() { + if (scale.x < 1.0f) { + cLib_chaseF(&scale.x, 1.0f, 0.1f); + scale.y = scale.x; + scale.z = scale.x; + mpModel->setBaseScale(scale); + } else { + cLib_onBit(attention_info.flags, 0x10); + mCcSph.OnTgSetBit(); + + if (checkExplode()) { + return true; + } + + if (fopAcM_checkCarryNow(this)) { + mCcStts.SetWeight(30); + return procCarryInit(); + } + } + + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::procFlowerWait() { - nofralloc +asm BOOL daNbomb_c::procFlowerWait(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/procFlowerWait__9daNbomb_cFv.s" } #pragma pop +#endif /* 804CA3B8-804CA4E0 0036D8 0128+00 2/2 0/0 0/0 .text * procBoomerangMoveInit__9daNbomb_cFP12dCcD_GObjInf */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::procBoomerangMoveInit(dCcD_GObjInf* unused) { + if (mProcFunc == &procBoomerangMove) { + return false; + } + + mProcFunc = procBoomerangMove; + + if (fopAcM_GetParam(this) == PRM_FLOWER_BOMB || + fopAcM_GetParam(this) == PRM_ENEMY_BOMB_BOOMERANG) + { + fopAcM_SetParam(this, PRM_ENEMY_BOMB_BOOMERANG_MOVE); + } else { + fopAcM_SetParam(this, PRM_BOMB_BOOMERANG_MOVE); + } + + cLib_offBit(attention_info.flags, 0x10); + mCcStts.SetWeight(30); + mCcSph.OnCoSetBit(); + mCcSph.SetCoHitCallback(daNbomb_coHitCallback); + speedF = 0.0f; + + mBoomerangMove.initOffset(¤t.pos); + mExTime = daAlink_getAlinkActorClass()->getBombExplodeTime() * 1.5f; + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::procBoomerangMoveInit(dCcD_GObjInf* param_0) { - nofralloc +asm BOOL daNbomb_c::procBoomerangMoveInit(dCcD_GObjInf* param_0){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/procBoomerangMoveInit__9daNbomb_cFP12dCcD_GObjInf.s" } #pragma pop +#endif /* 804CA4E0-804CA688 003800 01A8+00 2/0 0/0 0/0 .text procBoomerangMove__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::procBoomerangMove() { + if (checkExplode()) { + return true; + } + + daAlink_c* player = daAlink_getAlinkActorClass(); + + fopAc_ac_c* var_r29; + if (checkStateFlg0(FLG0_FROZEN)) { + var_r29 = NULL; + } else { + var_r29 = this; + } + + if (checkStateFlg0(FLG0_FROZEN) && mAcch.ChkWallHit()) { + speed.y = 0.0f; + mCcSph.SetCoHitCallback(NULL); + return procWaitInit(); + } + + if (!mBoomerangMove.posMove(¤t.pos, &shape_angle.y, var_r29, 0x1C00)) { + mExTime = player->getBombExplodeTime(); + mCcSph.SetCoHitCallback(NULL); + + if (fopAcM_checkCarryNow(this)) { + return procCarryInit(); + } + + speed.y = 0.0f; + procWaitInit(); + } else { + if (mExTime < player->getBombExplodeTime()) { + mExTime = player->getBombExplodeTime() * 1.5f; + } + } + + current.angle.y = shape_angle.y; + + if (mCcStts.GetCCMoveP() != NULL) { + current.pos += *mCcStts.GetCCMoveP(); + } + + mAcch.CrrPos(dComIfG_Bgsp()); + setRoomInfo(); + mBoomerangMove.bgCheckAfterOffset(¤t.pos); + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::procBoomerangMove() { - nofralloc +asm BOOL daNbomb_c::procBoomerangMove(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/procBoomerangMove__9daNbomb_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 804CC4A0-804CC4A4 000160 0004+00 1/1 0/0 0/0 .rodata @6001 */ @@ -1689,14 +2493,34 @@ SECTION_RODATA static f32 const lit_6001 = 3.0f; COMPILER_STRIP_GATE(0x804CC4A0, &lit_6001); /* 804CA688-804CA780 0039A8 00F8+00 2/2 0/0 0/0 .text procInsectMoveInit__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::procInsectMoveInit() { + mProcFunc = &procInsectMove; + + fopAcM_SetParam(this, PRM_INSECT_BOMB_MOVE); + mpBck->init((J3DAnmTransform*)dComIfG_getObjectRes(daAlink_c::getAlinkArcName(), 0x14), TRUE, + -1, 3.0f, 0, -1, true); + + setHitPolygon(0); + mCcSph.OnCoSetBit(); + mCcSph.SetCoHitCallback(daNbomb_coHitCallback); + cLib_offBit(attention_info.flags, 0x10); + + speedF = 20.0f; + old.pos = current.pos; + mNoHitPlayerTimer = 5; + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::procInsectMoveInit() { - nofralloc +asm BOOL daNbomb_c::procInsectMoveInit(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/procInsectMoveInit__9daNbomb_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 804CC4A4-804CC4A8 000164 0004+00 0/1 0/0 0/0 .rodata @6207 */ @@ -1742,14 +2566,148 @@ COMPILER_STRIP_GATE(0x804CC4B8, &lit_6212); #pragma pop /* 804CA780-804CAEE8 003AA0 0768+00 2/1 0/0 0/0 .text procInsectMove__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +BOOL daNbomb_c::procInsectMove() { + if (mNoHitPlayerTimer != 0) { + mNoHitPlayerTimer--; + + if (mNoHitPlayerTimer == 0) { + offStateFlg0(FLG0_NO_HIT_PLAYER); + } + } + + if (checkExplode()) { + return true; + } + + if (field_0xc20.abs2() > 1.0f) { + mpBck->init((J3DAnmTransform*)dComIfG_getObjectRes(daAlink_c::getAlinkArcName(), 0x15), + TRUE, -1, 1.0f, 0, -1, true); + + mDoMtx_copy(cMtx_getIdentity(), field_0xa40); + current.pos += field_0xbf0 * 50.0f; + field_0xbfc += field_0xbf0; + field_0xbfc *= 10.0f; + + speed.y = field_0xbfc.y; + speedF = field_0xbfc.absXZ(); + current.angle.y = field_0xbfc.atan2sX_Z(); + mAcch.i_ClrGroundHit(); + mAcch.ClrWallHit(); + mAcch.ClrRoofHit(); + mAcch.ClrRoofNone(); + return procWaitInit(); + } + + if (dComIfG_Bgsp().ChkPolySafe(mInsectHitPolyInfo) && + dComIfG_Bgsp().ChkMoveBG(mInsectHitPolyInfo)) + { + dComIfG_Bgsp().MoveBgTransPos(mInsectHitPolyInfo, true, ¤t.pos, &shape_angle, NULL); + setHitPolygon(1); + } + + if (!checkStateFlg0(FLG0_FROZEN)) { + if (fopAcIt_Judge((fopAcIt_JudgeFunc)daNbomb_searchEnemy, this)) { + f32 var_f30 = field_0xbfc.inprod(field_0xc14); + + if (!(fabsf(var_f30) > 0.999f)) { + cXyz sp60 = field_0xbfc.outprod(field_0xc14); + sp60.normalizeZP(); + + f32 var_f29 = cM_atan2f(JMAFastSqrt(1.0f - (var_f30 * var_f30)), var_f30); + f32 var_f31 = var_f29 * 0.2f; + if (var_f31 > DEG_TO_RAD(5.0f)) { + var_f31 = DEG_TO_RAD(5.0f); + } else if (var_f31 < (DEG_TO_RAD(5.0f) * 0.1f)) { + var_f31 = DEG_TO_RAD(5.0f) * 0.1f; + + if (DEG_TO_RAD(5.0f) * 0.1f > var_f29) { + var_f31 = var_f29; + } + } + + mDoMtx_stack_c::rotAxisRadS(&sp60, var_f31); + mDoMtx_stack_c::multVecSR(&field_0xbf0, &field_0xbf0); + mDoMtx_stack_c::multVecSR(&field_0xc08, &field_0xc08); + mDoMtx_stack_c::multVecSR(&field_0xbfc, &field_0xbfc); + + csXyz sp104(current.angle); + mDoMtx_stack_c::ZXYrotM(current.angle); + mDoMtx_MtxToRot(mDoMtx_stack_c::get(), ¤t.angle); + + shape_angle.x += current.angle.x - sp104.x; + shape_angle.y += current.angle.y - sp104.y; + shape_angle.z += current.angle.z - sp104.z; + } + } + + cXyz sp6C = old.pos + (field_0xbf0 * 25.0f); + cXyz sp78 = sp6C + (field_0xbfc * speedF); + mLineChk.Set(&sp6C, &sp78, this); + + int var_r28 = insectLineCheck(); + if (var_r28 == 1) { + setHitPolygon(0); + } else if (var_r28 == 0) { + sp6C = sp78 + field_0xbf0; + sp78 = sp6C - (field_0xbf0 * 30.0f); + mLineChk.Set(&sp6C, &sp78, this); + + var_r28 = insectLineCheck(); + if (var_r28 == 1) { + setHitPolygon(0); + } else if (var_r28 == 0) { + sp6C = sp78 - (field_0xbfc * speedF); + mLineChk.Set(&sp78, &sp6C, this); + + var_r28 = insectLineCheck(); + if (var_r28 == 1) { + setHitPolygon(0); + } + } + } + + if (var_r28 != 1) { + if (checkStateFlg0(FLG0_UNK_800)) { + onStateFlg0(FLG0_DELETE_BOMB); + return true; + } + + if (var_r28 == 2) { + current.pos = mLineChk.i_GetCross(); + } else { + current.pos += field_0xbfc * speedF; + } + + return procExplodeInit(); + } + } else { + mpBck->setPlaySpeed(0.0f); + } + + cXyz sp84(current.pos); + mAcch.CrrPos(dComIfG_Bgsp()); + current.pos = sp84; + + setRoomInfo(); + + if (mpBck->checkFrame(0.0f) || mpBck->checkFrame(8.0f)) { + mSound.startSound(Z2SE_EN_BI_FOOTNOTE, dKy_pol_sound_get(&mInsectHitPolyInfo), + mSoundReverb); + } + + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::procInsectMove() { - nofralloc +asm BOOL daNbomb_c::procInsectMove(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/procInsectMove__9daNbomb_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 804CC4BC-804CC4C0 00017C 0004+00 0/1 0/0 0/0 .rodata @6601 */ @@ -1774,24 +2732,263 @@ COMPILER_STRIP_GATE(0x804CC4C4, &lit_6603); #pragma pop /* 804CAEE8-804CBC40 004208 0D58+00 1/1 0/0 0/0 .text execute__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +int daNbomb_c::execute() { + if (!checkStateFlg0(FLG0_UNK_2000)) { + field_0xb51 = 0; + } else { + offStateFlg0(FLG0_UNK_2000); + } + + cXyz spB4(speedF * cM_ssin(current.angle.y), speed.y, speedF * cM_scos(current.angle.y)); + + f32 var_f31 = field_0xc20.abs2(); + if (!checkStateFlg0(FLG0_UNK_8000)) { + if (var_f31 > 1.0f) { + spB4 += field_0xc20; + current.angle.y = spB4.atan2sX_Z(); + speedF = spB4.absXZ(); + speed.y = spB4.y; + } + + var_f31 = 0.0f; + field_0xc20 = cXyz::Zero; + } else { + offStateFlg0(FLG0_UNK_8000); + } + + f32 var_f30 = field_0xc2c.abs2(); + cXyz spC0; + int sp18; + + if (checkStateFlg0(FLG0_UNDERWATER) && fopAcM_GetParam(this) == PRM_BOMB_WAIT && + fopAcM_getWaterStream(¤t.pos, mAcch.m_gnd, &spC0, &sp18, 0)) + { + cLib_addCalcPos(&field_0xc2c, (spC0 * sp18) * 0.5f, 0.5f, 5.0f, 1.0f); + } else { + if (var_f30 > 1.0f) { + spB4 += field_0xc2c; + current.angle.y = spB4.atan2sX_Z(); + speedF = spB4.absXZ(); + speed.y = spB4.y; + } + + var_f30 = 0.0f; + field_0xc2c = cXyz::Zero; + } + + field_0xb5a = 0; + mEffectLastPosition = mEffectPosition; + + if (checkStateFlg0(FLG0_UNK_800) || (checkStateFlg0(FLG0_FROZEN) && mFreezeTimer == 0)) { + if (cLib_chaseF(&scale.x, 0.0f, 0.025f)) { + onStateFlg0(FLG0_DELETE_BOMB); + } else { + scale.z = scale.y = scale.x; + mpModel->setBaseScale(scale); + } + } + + if (mProcFunc != NULL) { + (this->*mProcFunc)(); + } + + if (checkStateFlg0(FLG0_DELETE_BOMB)) { + fopAcM_delete(this); + return 1; + } + + if ((mAcch.ChkWallHit() && daAlink_c::checkIcePolygonDamage(&mAcchCir)) || + (mAcch.i_ChkGroundHit() && daAlink_c::checkIcePolygonDamage(&mAcch.m_gnd)) || + (mAcch.ChkRoofHit() && daAlink_c::checkIcePolygonDamage(&mAcch.m_roof))) + { + setFreeze(); + } + + if (mpBck != NULL) { + mpBck->play(); + } + + daAlink_c* player = daAlink_getAlinkActorClass(); + if (fopAcM_GetParam(this) != PRM_NORMAL_BOMB_EXPLODE) { + if (checkWaterIn()) { + if (dComIfG_Bgsp().GetPolyAtt0(mAcch.m_wtr) == 6) { + onStateFlg0(FLG0_DELETE_BOMB); + } else if (!checkStateFlg0(daNbomb_FLG0(FLG0_UNK_800 | FLG0_UNDERWATER))) { + fopAcM_seStartCurrent(this, Z2SE_CM_BODYFALL_WATER_S, 0); + cXyz pillar_pos; + + f32 dist_to_old_y = fabsf(old.pos.y - current.pos.y); + f32 dist_to_water = fabsf(mAcch.m_wtr.GetHeight() - current.pos.y); + if (dist_to_old_y < 1.0f) { + pillar_pos.x = current.pos.x; + pillar_pos.y = mAcch.m_wtr.GetHeight(); + pillar_pos.z = current.pos.z; + } else { + f32 temp_f29 = dist_to_water / dist_to_old_y; + if (temp_f29 > 1.0f) { + temp_f29 = 1.0f; + } + + pillar_pos = (old.pos * temp_f29) + (current.pos * (1.0f - temp_f29)); + } + + fopKyM_createWpillar(&pillar_pos, 1.0f, 0); + + if (!checkStateFlg0(FLG0_WATER_BOMB) && + (fopAcM_checkCarryNow(this) || fopAcM_checkHookCarryNow(this) || + fopAcM_GetParam(this) == PRM_ENEMY_BOMB_BOOMERANG_MOVE || + fopAcM_GetParam(this) == PRM_BOMB_BOOMERANG_MOVE)) + { + onStateFlg0(FLG0_DELETE_BOMB); + } else if (checkStateFlg0(FLG0_INSECT_BOMB)) { + speedF *= 0.5f; + mpBck->setPlaySpeed(mpBck->getPlaySpeed() * 0.5f); + onStateFlg0(FLG0_UNK_800); + } else { + if (checkStateFlg0(FLG0_WATER_BOMB)) { + onStateFlg0(FLG0_UNDERWATER); + } else { + onStateFlg0(FLG0_UNK_800); + field_0xbe4 = cXyz::Zero; + } + + speedF *= 0.5f; + speed.y *= 0.5f; + gravity = player->getBombWaterGravity(); + maxFallSpeed = player->getBombWaterMaxFallSpeed(); + } + } else if (!checkStateFlg0(FLG0_WATER_BOMB) && + (fopAcM_checkCarryNow(this) || fopAcM_checkHookCarryNow(this))) + { + onStateFlg0(FLG0_DELETE_BOMB); + } + + if (checkStateFlg0(FLG0_DELETE_BOMB)) { + fopAcM_delete(this); + field_0xbe4 = cXyz::Zero; + return 1; + } + } else { + if (checkStateFlg0(FLG0_UNK_800)) { + fopAcM_delete(this); + return 1; + } + + offStateFlg0(FLG0_UNDERWATER); + gravity = player->getBombGravity(); + maxFallSpeed = player->getBombMaxFallSpeed(); + } + + if (speedF > 1.0f || var_f31 > 1.0f || var_f30 > 1.0f) { + int var_r27 = 1; + f32 var_f27; + s16 temp_r3; + + if (var_f31 > 1.0f || var_f30 > 1.0f) { + cXyz spD8(field_0xc2c.x + (field_0xc20.x + (speedF * cM_ssin(current.angle.y))), + field_0xc20.y + field_0xc2c.y, + field_0xc2c.z + (field_0xc20.z + (speedF * cM_scos(current.angle.y)))); + + var_f27 = spD8.absXZ(); + temp_r3 = spD8.atan2sX_Z(); + } else { + var_f27 = speedF; + temp_r3 = current.angle.y; + + if (mAcch.i_ChkGroundHit()) { + var_r27 = 0; + } + } + + s16 var_r26 = (var_f27 / 180.0f) * (f32)0x10000; + s16 var_r25 = temp_r3 - shape_angle.y; + mDoMtx_stack_c::YrotS(var_r25); + + if (var_r27 == 0) { + mDoMtx_stack_c::XrotM(var_r26); + } else { + mDoMtx_stack_c::XrotM(var_r26 >> 1); + } + + mDoMtx_stack_c::YrotM(-var_r25); + mDoMtx_stack_c::concat(field_0xa40); + mDoMtx_copy(mDoMtx_stack_c::get(), field_0xa40); + } + + if (player->getGrabActorID() == fopAcM_GetID(this) && player->checkGrabUp()) { + mDoMtx_stack_c::YrotS(field_0xb5c - shape_angle.y); + mDoMtx_stack_c::concat(field_0xa40); + mDoMtx_copy(mDoMtx_stack_c::get(), field_0xa40); + } + + f32 var_f26 = 0.0f; + if (field_0xb5a != 0 && field_0xb5a < 0x4000) { + var_f26 = (1.0f / cM_scos(field_0xb5a) - 1.0f) * 25.0f * 0.75f; + } + + if (fopAcM_GetParam(this) != PRM_INSECT_BOMB_MOVE) { + mDoMtx_stack_c::transS(current.pos.x, field_0xbb0 + (current.pos.y + var_f26), + current.pos.z); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_stack_c::transM(0.0f, 25.0f, 0.0f); + mDoMtx_stack_c::concat(field_0xa40); + mDoMtx_stack_c::transM(0.0f, -25.0f, 0.0f); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } + + mDoMtx_multVec(mpModel->getBaseTRMtx(), &l_localCenterOffset, &attention_info.position); + eyePos = attention_info.position; + mCcSph.SetC(attention_info.position); + mCcSph.SetR(scale.x * 30.0f); + dComIfG_Ccsp()->Set(&mCcSph); + + if (fopAcM_GetParam(this) != PRM_FLOWER_BOMB) { + mSph2.SetC(attention_info.position); + dComIfG_Ccsp()->Set(&mSph2); + } + + if (!checkStateFlg0(FLG0_UNK_800)) { + setSmokePos(); + } + + if (mpBck != NULL) { + mpBck->entry(mpModel->getModelData()); + } + + mpModel->calc(); + + if (!checkTimerStop()) { + mSound.startLevelSound(Z2SE_OBJ_BOMB_IGNITION, 0, mSoundReverb); + setEffect(); + } + + field_0xb5c = shape_angle.y; + + if (checkStateFlg0(FLG0_FROZEN) && mFreezeTimer != 0) { + mFreezeTimer--; + } + } + + mSound.framework(mPolySound, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::execute() { +asm int daNbomb_c::execute() { nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/execute__9daNbomb_cFv.s" } #pragma pop +#endif /* 804CBC40-804CBC60 004F60 0020+00 1/0 0/0 0/0 .text daNbomb_Execute__FP9daNbomb_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daNbomb_Execute(daNbomb_c* param_0) { - nofralloc -#include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Execute__FP9daNbomb_c.s" +static int daNbomb_Execute(daNbomb_c* i_this) { + return i_this->execute(); } -#pragma pop /* ############################################################################################## */ /* 804CC4C8-804CC4CC 000188 0004+00 0/1 0/0 0/0 .rodata @6782 */ @@ -1809,24 +3006,124 @@ COMPILER_STRIP_GATE(0x804CC4CC, &lit_6783); #pragma pop /* 804CBC60-804CC200 004F80 05A0+00 1/1 0/0 0/0 .text draw__9daNbomb_cFv */ +// matches with literals +#ifdef NONMATCHING +int daNbomb_c::draw() { + g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); + + if (fopAcM_GetParam(this) == PRM_NORMAL_BOMB_EXPLODE) { + return 1; + } + + daAlink_c* player = daAlink_getAlinkActorClass(); + J3DGXColorS10 bomb_color; + bomb_color.g = 0; + bomb_color.a = 0; + + if (checkStateFlg0(FLG0_UNK_800)) { + bomb_color.r = 0; + bomb_color.b = 0; + } else if (checkStateFlg0(FLG0_FROZEN)) { + bomb_color.r = player->getFreezeR(); + bomb_color.g = player->getFreezeG(); + bomb_color.b = player->getFreezeB(); + } else { + s16 explode_time = player->getBombExplodeTime(); + f32 brightness; + + if (mExTime > explode_time) { + brightness = 1.0f - fabsf(cM_fcos(((f32)(mExTime - explode_time) * M_PI) / + (f32)FAST_DIV(explode_time, 2))); + } else if (mExTime > FAST_DIV(explode_time, 2)) { + brightness = 1.0f - fabsf(cM_fcos(((f32)(mExTime - FAST_DIV(explode_time, 2)) * M_PI) / + (f32)FAST_DIV(explode_time, 4))); + } else if (mExTime > FAST_DIV(explode_time, 4)) { + brightness = fabsf(cM_fsin(((f32)(mExTime - FAST_DIV(explode_time, 4)) * M_PI) / + (f32)FAST_DIV(explode_time, 7))); + } else { + brightness = fabsf(cM_fsin(((f32)(mExTime - FAST_DIV(explode_time, 7)) * M_PI) / + (f32)FAST_DIV(explode_time, 8))); + } + + if (mType == TYPE_INSECT_ENEMY || mType == TYPE_WATER_ENEMY) { + bomb_color.r = (s16)(brightness * (f32)player->getEnemyBombColorR()) & 0xFF; + } else { + bomb_color.r = (s16)(brightness * 15.0f) & 0xFF; + } + + bomb_color.b = 0; + } + + if (checkStateFlg0(FLG0_FROZEN)) { + tevStr.mFogColor.r = player->getFreezeR(); + tevStr.mFogColor.g = player->getFreezeG(); + tevStr.mFogColor.b = player->getFreezeB(); + } + + g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr); + J3DModelData* modelData = mpModel->getModelData(); + + J3DMaterial* mat; + if (mType == TYPE_INSECT_ENEMY) { + mat = modelData->getMaterialNodePointer(1); + + modelData->getMaterialNodePointer(0)->getShape()->hide(); + modelData->getMaterialNodePointer(2)->getShape()->hide(); + modelData->getMaterialNodePointer(1)->getShape()->show(); + modelData->getMaterialNodePointer(3)->getShape()->show(); + } else { + mat = modelData->getMaterialNodePointer(0); + } + + if (mType == TYPE_WATER_ENEMY || checkStateFlg0(FLG0_WATER_BOMB)) { + mat->setTevColor(0, &bomb_color); + + mat = modelData->getMaterialNodePointer(1); + mat->setTevColor(0, &bomb_color); + } else { + mat->setTevColor(1, &bomb_color); + } + + mDoExt_modelEntryDL(mpModel); + daMirror_c::entry(mpModel); + + bomb_color.r = 0; + bomb_color.g = 0; + bomb_color.b = 0; + + if (mType == TYPE_WATER_ENEMY || checkStateFlg0(FLG0_WATER_BOMB)) { + mat->setTevColor(0, &bomb_color); + modelData->getMaterialNodePointer(0)->setTevColor(0, &bomb_color); + } else { + mat->setTevColor(1, &bomb_color); + } + + if (mAcch.GetGroundH() != -1000000000.0f && !fopAcM_checkCarryNow(this)) { + cM3dGPla ground_poly; + if (dComIfG_Bgsp().GetTriPla(mAcch.m_gnd, &ground_poly)) { + dComIfGd_setSimpleShadow(¤t.pos, mAcch.GetGroundH(), scale.x * 25.0f, + &ground_poly.mNormal, 0, 1.0f, + dDlst_shadowControl_c::getSimpleTex()); + } + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::draw() { +asm int daNbomb_c::draw() { nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/draw__9daNbomb_cFv.s" } #pragma pop +#endif /* 804CC200-804CC220 005520 0020+00 1/0 0/0 0/0 .text daNbomb_Draw__FP9daNbomb_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daNbomb_Draw(daNbomb_c* param_0) { - nofralloc -#include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/daNbomb_Draw__FP9daNbomb_c.s" +static int daNbomb_Draw(daNbomb_c* i_this) { + return i_this->draw(); } -#pragma pop /* 804CC220-804CC268 005540 0048+00 1/0 0/0 0/0 .text __dt__10cCcD_GSttsFv */ #pragma push @@ -1843,8 +3140,7 @@ extern "C" asm void __dt__10cCcD_GSttsFv() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void __sinit_d_a_nbomb_cpp() { - nofralloc +asm void __sinit_d_a_nbomb_cpp(){nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/__sinit_d_a_nbomb_cpp.s" } #pragma pop @@ -1878,7 +3174,8 @@ static asm void func_804CC2B8() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::checkExplodeNow() { +// asm void daNbomb_c::checkExplodeNow() { +extern "C" asm void checkExplodeNow__9daNbomb_cFv() { nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/checkExplodeNow__9daNbomb_cFv.s" } @@ -1889,7 +3186,8 @@ asm void daNbomb_c::checkExplodeNow() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::deleteBombAndEffect() { +// asm void daNbomb_c::deleteBombAndEffect() { +extern "C" asm void deleteBombAndEffect__9daNbomb_cFv() { nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/deleteBombAndEffect__9daNbomb_cFv.s" } @@ -1900,24 +3198,28 @@ asm void daNbomb_c::deleteBombAndEffect() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daNbomb_c::setCargoBombExplode() { +// asm void daNbomb_c::setCargoBombExplode() { +extern "C" asm void setCargoBombExplode__9daNbomb_cFv() { nofralloc #include "asm/rel/d/a/d_a_nbomb/d_a_nbomb/setCargoBombExplode__9daNbomb_cFv.s" } #pragma pop /* 804CC31C-804CC324 00563C 0008+00 1/0 0/0 0/0 .text checkExplodeNow__7dBomb_cFv */ -bool dBomb_c::checkExplodeNow() { +// bool dBomb_c::checkExplodeNow() { +extern "C" bool checkExplodeNow__7dBomb_cFv() { return false; } /* 804CC324-804CC328 005644 0004+00 1/0 0/0 0/0 .text deleteBombAndEffect__7dBomb_cFv */ -void dBomb_c::deleteBombAndEffect() { +// void dBomb_c::deleteBombAndEffect() { +extern "C" void deleteBombAndEffect__7dBomb_cFv() { /* empty function */ } /* 804CC328-804CC32C 005648 0004+00 1/0 0/0 0/0 .text setCargoBombExplode__7dBomb_cFv */ -void dBomb_c::setCargoBombExplode() { +// void dBomb_c::setCargoBombExplode() { +extern "C" void setCargoBombExplode__7dBomb_cFv() { /* empty function */ } diff --git a/src/d/a/d_a_alink_grab.inc b/src/d/a/d_a_alink_grab.inc index ccf3ae3846..2d5de4aae0 100644 --- a/src/d/a/d_a_alink_grab.inc +++ b/src/d/a/d_a_alink_grab.inc @@ -54,7 +54,7 @@ void daAlink_c::setGrabCollisionOffset(f32 param_0, f32 param_1, cBgS_PolyInfo* /* 800E3A14-800E3A9C 0DE354 0088+00 1/0 0/0 0/0 .text exchangeGrabActor__9daAlink_cFP10fopAc_ac_c */ -bool daAlink_c::exchangeGrabActor(fopAc_ac_c* p_actor) { +BOOL daAlink_c::exchangeGrabActor(fopAc_ac_c* p_actor) { fopAc_ac_c* actor = mGrabItemAcKeep.getActor(); if (actor == NULL) { return false; @@ -74,7 +74,7 @@ bool daAlink_c::exchangeGrabActor(fopAc_ac_c* p_actor) { } /* 800E3A9C-800E3BCC 0DE3DC 0130+00 1/0 0/0 0/0 .text setForceGrab__9daAlink_cFP10fopAc_ac_cii */ -bool daAlink_c::setForceGrab(fopAc_ac_c* p_actor, int param_1, int param_2) { +BOOL daAlink_c::setForceGrab(fopAc_ac_c* p_actor, int param_1, int param_2) { if (((param_1 != 0 || !checkEventRun()) && !checkWolf()) && (((mEquipItem == NO_ITEM || (param_2 != 0 && checkHookshotItem(mEquipItem)))) && ((checkModeFlg(MODE_UNK_10000000) && diff --git a/src/d/a/d_a_alink_hook.inc b/src/d/a/d_a_alink_hook.inc index e265c5df37..b49a1c4a83 100644 --- a/src/d/a/d_a_alink_hook.inc +++ b/src/d/a/d_a_alink_hook.inc @@ -102,7 +102,7 @@ void daAlink_c::resetHookshotMode() { /* 8010871C-80108784 10305C 0068+00 0/0 0/0 1/1 .text * setEnemyBombHookshot__9daAlink_cFP10fopAc_ac_c */ -bool daAlink_c::setEnemyBombHookshot(fopAc_ac_c* i_actor) { +BOOL daAlink_c::setEnemyBombHookshot(fopAc_ac_c* i_actor) { if (mHookTargetAcKeep.getActor() != NULL) { cancelHookshotCarry(); mHookTargetAcKeep.setData(i_actor); diff --git a/src/d/d_bomb.cpp b/src/d/d_bomb.cpp index 1e21946d35..8b9f8cc145 100644 --- a/src/d/d_bomb.cpp +++ b/src/d/d_bomb.cpp @@ -4,20 +4,22 @@ */ #include "d/d_bomb.h" +#include "rel/d/a/d_a_nbomb/d_a_nbomb.h" bool dBomb_c::checkStateCarry() { return (fopAcM_checkCarryNow(this) || fopAcM_checkHookCarryNow(this) || - fopAcM_GetParam(this) == 2 || fopAcM_GetParam(this) == 1); + fopAcM_GetParam(this) == PRM_BOMB_HOOKSHOT || fopAcM_GetParam(this) == PRM_BOMB_CARRY); } -bool dBomb_c::checkFlowerBombWait(fopAc_ac_c* param_1) { - return (fopAcM_GetName(param_1) == PROC_NBOMB && fopAcM_GetParam(param_1) == 4); +bool dBomb_c::checkFlowerBombWait(fopAc_ac_c* i_actor) { + return (fopAcM_GetName(i_actor) == PROC_NBOMB && fopAcM_GetParam(i_actor) == PRM_FLOWER_BOMB); } -bool dBomb_c::checkWaterBomb(fopAc_ac_c* param_1) { - return (fopAcM_GetName(this) == PROC_NBOMB && daNbomb_c::checkWaterBomb()); +bool dBomb_c::checkWaterBomb(fopAc_ac_c* i_actor) { + return (fopAcM_GetName(i_actor) == PROC_NBOMB && ((daNbomb_c*)i_actor)->checkWaterBomb()); } -bool dBomb_c::checkInsectBombMove(fopAc_ac_c* param_1) { - return (fopAcM_GetName(this) == PROC_NBOMB && fopAcM_GetParam(this) == 7); +bool dBomb_c::checkInsectBombMove(fopAc_ac_c* i_actor) { + return (fopAcM_GetName(i_actor) == PROC_NBOMB && + fopAcM_GetParam(i_actor) == PRM_INSECT_BOMB_MOVE); }