From 38e0f8927a7f14af61748d0226b4eb89513cb2a9 Mon Sep 17 00:00:00 2001 From: Caroline Madsen <69010899+randomsalience@users.noreply.github.com> Date: Sun, 17 Mar 2024 18:53:08 -0400 Subject: [PATCH] d_a_b_ds mostly done (#2098) --- Progress.md | 8 +- .../JointCallBack__8daB_DS_cFP8J3DJointi.s | 21 - .../d_a_b_ds/d_a_b_ds/_delete__8daB_DS_cFv.s | 44 - .../d_a_b_ds/daB_DS_Delete__FP8daB_DS_c.s | 9 - .../d_a_b_ds/daB_DS_Draw__FP8daB_DS_c.s | 9 - .../d_a_b_ds/daB_DS_Execute__FP8daB_DS_c.s | 9 - .../d_a_b_ds/doYoMessage__8daB_DS_cFv.s | 36 - .../d_a_b_ds/hand_smokeSet__8daB_DS_cFUc.s | 32 - .../mBattle2BreathFireSet__8daB_DS_cFUl.s | 30 - .../d_a_b_ds/mBreakBoneSUB__8daB_DS_cFv.s | 33 - .../d_a_b_ds/mClearTrap__8daB_DS_cFb.s | 43 - .../d_a_b_ds/mHeadAngle_Clear__8daB_DS_cFv.s | 26 - .../d_a_b_ds/setActionMode__8daB_DS_cFii.s | 4 - .../d_a_b_ds/setYoMessage__8daB_DS_cFi.s | 16 - .../d_a_b_ds/useHeapInit__FP10fopAc_ac_c.s | 9 - include/JSystem/JParticle/JPAEmitter.h | 5 + include/SSystem/SComponent/c_cc_d.h | 3 + include/d/a/d_a_alink.h | 4 +- include/d/a/d_a_player.h | 9 +- include/d/cc/d_cc_d.h | 9 + include/d/cc/d_cc_uty.h | 1 + include/d/com/d_com_inf_game.h | 5 + include/d/save/d_save.h | 1 + include/f_op/f_op_actor.h | 1 + include/f_op/f_op_actor_mng.h | 4 + include/m_Do/m_Do_ext.h | 2 +- include/rel/d/a/b/d_a_b_ds/d_a_b_ds.h | 355 +- rel/d/a/b/d_a_b_ds/d_a_b_ds.cpp | 6618 ++++++++++++++--- src/d/a/d_a_alink_link.inc | 6 +- src/d/a/d_a_alink_weakfn.inc | 4 +- src/d/a/d_a_alink_wolf.inc | 2 +- src/d/a/d_a_no_chg_room.cpp | 3 +- src/d/a/d_a_player.cpp | 2 +- 33 files changed, 6120 insertions(+), 1243 deletions(-) delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/JointCallBack__8daB_DS_cFP8J3DJointi.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/_delete__8daB_DS_cFv.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Delete__FP8daB_DS_c.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Draw__FP8daB_DS_c.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Execute__FP8daB_DS_c.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/doYoMessage__8daB_DS_cFv.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/hand_smokeSet__8daB_DS_cFUc.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBattle2BreathFireSet__8daB_DS_cFUl.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBreakBoneSUB__8daB_DS_cFv.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mClearTrap__8daB_DS_cFb.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mHeadAngle_Clear__8daB_DS_cFv.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setActionMode__8daB_DS_cFii.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setYoMessage__8daB_DS_cFi.s delete mode 100644 asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/useHeapInit__FP10fopAc_ac_c.s diff --git a/Progress.md b/Progress.md index 23a0702be2b..6b1b3581421 100644 --- a/Progress.md +++ b/Progress.md @@ -21,8 +21,8 @@ Total | 52.690694% | 2118520 | 4020672 Section | Percentage | Decompiled (bytes) | Total (bytes) ---|---|---|--- main.dol | 52.690694% | 2118520 | 4020672 -RELs | 36.707175% | 4221444 | 11500324 -Total | 40.847662% | 6339964 | 15520996 +RELs | 36.717122% | 4222588 | 11500324 +Total | 40.855033% | 6341108 | 15520996 ## RELs @@ -39,7 +39,7 @@ d_a_b_bh | 24.452445% | 6520 | 26664 d_a_b_bq | 28.033347% | 11164 | 39824 d_a_b_dr | 27.536664% | 18476 | 67096 d_a_b_dre | 27.912731% | 4964 | 17784 -d_a_b_ds | 26.627364% | 26016 | 97704 +d_a_b_ds | 27.798248% | 27160 | 97704 d_a_b_gg | 22.324410% | 17380 | 77852 d_a_b_gm | 30.376176% | 11628 | 38280 d_a_b_gnd | 25.489573% | 19264 | 75576 @@ -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 | 36.707175% | 4221444 | 11500324 +Total | 36.717122% | 4222588 | 11500324 diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/JointCallBack__8daB_DS_cFP8J3DJointi.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/JointCallBack__8daB_DS_cFP8J3DJointi.s deleted file mode 100644 index da06b0fd26d..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/JointCallBack__8daB_DS_cFP8J3DJointi.s +++ /dev/null @@ -1,21 +0,0 @@ -lbl_805CB4A4: -/* 805CB4A4 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 805CB4A8 7C 08 02 A6 */ mflr r0 -/* 805CB4AC 90 01 00 14 */ stw r0, 0x14(r1) -/* 805CB4B0 7C 60 1B 78 */ mr r0, r3 -/* 805CB4B4 2C 04 00 00 */ cmpwi r4, 0 -/* 805CB4B8 40 82 00 24 */ bne lbl_805CB4DC -/* 805CB4BC 3C 60 80 43 */ lis r3, j3dSys@ha /* 0x80434AC8@ha */ -/* 805CB4C0 38 63 4A C8 */ addi r3, r3, j3dSys@l /* 0x80434AC8@l */ -/* 805CB4C4 80 A3 00 38 */ lwz r5, 0x38(r3) -/* 805CB4C8 80 65 00 14 */ lwz r3, 0x14(r5) -/* 805CB4CC 28 03 00 00 */ cmplwi r3, 0 -/* 805CB4D0 41 82 00 0C */ beq lbl_805CB4DC -/* 805CB4D4 7C 04 03 78 */ mr r4, r0 -/* 805CB4D8 4B FF FE 3D */ bl ctrlJoint__8daB_DS_cFP8J3DJointP8J3DModel -lbl_805CB4DC: -/* 805CB4DC 38 60 00 01 */ li r3, 1 -/* 805CB4E0 80 01 00 14 */ lwz r0, 0x14(r1) -/* 805CB4E4 7C 08 03 A6 */ mtlr r0 -/* 805CB4E8 38 21 00 10 */ addi r1, r1, 0x10 -/* 805CB4EC 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/_delete__8daB_DS_cFv.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/_delete__8daB_DS_cFv.s deleted file mode 100644 index 712b63a02b7..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/_delete__8daB_DS_cFv.s +++ /dev/null @@ -1,44 +0,0 @@ -lbl_805DB1AC: -/* 805DB1AC 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 805DB1B0 7C 08 02 A6 */ mflr r0 -/* 805DB1B4 90 01 00 14 */ stw r0, 0x14(r1) -/* 805DB1B8 93 E1 00 0C */ stw r31, 0xc(r1) -/* 805DB1BC 7C 7F 1B 78 */ mr r31, r3 -/* 805DB1C0 38 7F 05 AC */ addi r3, r31, 0x5ac -/* 805DB1C4 3C 80 80 5E */ lis r4, d_a_b_ds__stringBase0@ha /* 0x805DD22C@ha */ -/* 805DB1C8 38 84 D2 2C */ addi r4, r4, d_a_b_ds__stringBase0@l /* 0x805DD22C@l */ -/* 805DB1CC 4B A5 1E 3D */ bl dComIfG_resDelete__FP30request_of_phase_process_classPCc -/* 805DB1D0 88 1F 08 56 */ lbz r0, 0x856(r31) -/* 805DB1D4 28 00 00 01 */ cmplwi r0, 1 -/* 805DB1D8 41 82 00 14 */ beq lbl_805DB1EC -/* 805DB1DC 28 00 00 03 */ cmplwi r0, 3 -/* 805DB1E0 41 82 00 0C */ beq lbl_805DB1EC -/* 805DB1E4 28 00 00 04 */ cmplwi r0, 4 -/* 805DB1E8 40 82 00 0C */ bne lbl_805DB1F4 -lbl_805DB1EC: -/* 805DB1EC 38 60 00 01 */ li r3, 1 -/* 805DB1F0 48 00 00 40 */ b lbl_805DB230 -lbl_805DB1F4: -/* 805DB1F4 88 1F 2E C8 */ lbz r0, 0x2ec8(r31) -/* 805DB1F8 28 00 00 00 */ cmplwi r0, 0 -/* 805DB1FC 41 82 00 10 */ beq lbl_805DB20C -/* 805DB200 38 00 00 00 */ li r0, 0 -/* 805DB204 3C 60 80 5E */ lis r3, struct_805DDAAC+0x1@ha /* 0x805DDAAD@ha */ -/* 805DB208 98 03 DA AD */ stb r0, struct_805DDAAC+0x1@l(r3) /* 0x805DDAAD@l */ -lbl_805DB20C: -/* 805DB20C 80 1F 00 F0 */ lwz r0, 0xf0(r31) -/* 805DB210 28 00 00 00 */ cmplwi r0, 0 -/* 805DB214 41 82 00 18 */ beq lbl_805DB22C -/* 805DB218 38 7F 05 DC */ addi r3, r31, 0x5dc -/* 805DB21C 81 9F 05 DC */ lwz r12, 0x5dc(r31) -/* 805DB220 81 8C 00 08 */ lwz r12, 8(r12) -/* 805DB224 7D 89 03 A6 */ mtctr r12 -/* 805DB228 4E 80 04 21 */ bctrl -lbl_805DB22C: -/* 805DB22C 38 60 00 01 */ li r3, 1 -lbl_805DB230: -/* 805DB230 83 E1 00 0C */ lwz r31, 0xc(r1) -/* 805DB234 80 01 00 14 */ lwz r0, 0x14(r1) -/* 805DB238 7C 08 03 A6 */ mtlr r0 -/* 805DB23C 38 21 00 10 */ addi r1, r1, 0x10 -/* 805DB240 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Delete__FP8daB_DS_c.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Delete__FP8daB_DS_c.s deleted file mode 100644 index 067c535cf99..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Delete__FP8daB_DS_c.s +++ /dev/null @@ -1,9 +0,0 @@ -lbl_805DB244: -/* 805DB244 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 805DB248 7C 08 02 A6 */ mflr r0 -/* 805DB24C 90 01 00 14 */ stw r0, 0x14(r1) -/* 805DB250 4B FF FF 5D */ bl _delete__8daB_DS_cFv -/* 805DB254 80 01 00 14 */ lwz r0, 0x14(r1) -/* 805DB258 7C 08 03 A6 */ mtlr r0 -/* 805DB25C 38 21 00 10 */ addi r1, r1, 0x10 -/* 805DB260 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Draw__FP8daB_DS_c.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Draw__FP8daB_DS_c.s deleted file mode 100644 index c011db9b033..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Draw__FP8daB_DS_c.s +++ /dev/null @@ -1,9 +0,0 @@ -lbl_805CBAA8: -/* 805CBAA8 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 805CBAAC 7C 08 02 A6 */ mflr r0 -/* 805CBAB0 90 01 00 14 */ stw r0, 0x14(r1) -/* 805CBAB4 4B FF FA 3D */ bl draw__8daB_DS_cFv -/* 805CBAB8 80 01 00 14 */ lwz r0, 0x14(r1) -/* 805CBABC 7C 08 03 A6 */ mtlr r0 -/* 805CBAC0 38 21 00 10 */ addi r1, r1, 0x10 -/* 805CBAC4 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Execute__FP8daB_DS_c.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Execute__FP8daB_DS_c.s deleted file mode 100644 index 33670daad3c..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Execute__FP8daB_DS_c.s +++ /dev/null @@ -1,9 +0,0 @@ -lbl_805DB184: -/* 805DB184 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 805DB188 7C 08 02 A6 */ mflr r0 -/* 805DB18C 90 01 00 14 */ stw r0, 0x14(r1) -/* 805DB190 4B FF FC 35 */ bl execute__8daB_DS_cFv -/* 805DB194 80 01 00 14 */ lwz r0, 0x14(r1) -/* 805DB198 7C 08 03 A6 */ mtlr r0 -/* 805DB19C 38 21 00 10 */ addi r1, r1, 0x10 -/* 805DB1A0 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/doYoMessage__8daB_DS_cFv.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/doYoMessage__8daB_DS_cFv.s deleted file mode 100644 index b964dc4752e..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/doYoMessage__8daB_DS_cFv.s +++ /dev/null @@ -1,36 +0,0 @@ -lbl_805CDA44: -/* 805CDA44 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 805CDA48 7C 08 02 A6 */ mflr r0 -/* 805CDA4C 90 01 00 14 */ stw r0, 0x14(r1) -/* 805CDA50 93 E1 00 0C */ stw r31, 0xc(r1) -/* 805CDA54 7C 7F 1B 78 */ mr r31, r3 -/* 805CDA58 80 63 08 6C */ lwz r3, 0x86c(r3) -/* 805CDA5C 28 03 00 00 */ cmplwi r3, 0 -/* 805CDA60 41 82 00 3C */ beq lbl_805CDA9C -/* 805CDA64 A0 03 00 F8 */ lhz r0, 0xf8(r3) -/* 805CDA68 28 00 00 0E */ cmplwi r0, 0xe -/* 805CDA6C 40 82 00 10 */ bne lbl_805CDA7C -/* 805CDA70 38 00 00 10 */ li r0, 0x10 -/* 805CDA74 B0 03 00 F8 */ sth r0, 0xf8(r3) -/* 805CDA78 48 00 00 30 */ b lbl_805CDAA8 -lbl_805CDA7C: -/* 805CDA7C 28 00 00 12 */ cmplwi r0, 0x12 -/* 805CDA80 40 82 00 28 */ bne lbl_805CDAA8 -/* 805CDA84 38 00 00 13 */ li r0, 0x13 -/* 805CDA88 B0 03 00 F8 */ sth r0, 0xf8(r3) -/* 805CDA8C 38 00 FF FF */ li r0, -1 -/* 805CDA90 90 1F 08 68 */ stw r0, 0x868(r31) -/* 805CDA94 38 60 00 01 */ li r3, 1 -/* 805CDA98 48 00 00 14 */ b lbl_805CDAAC -lbl_805CDA9C: -/* 805CDA9C 80 7F 08 68 */ lwz r3, 0x868(r31) -/* 805CDAA0 4B A5 1F 85 */ bl fopMsgM_SearchByID__FUi -/* 805CDAA4 90 7F 08 6C */ stw r3, 0x86c(r31) -lbl_805CDAA8: -/* 805CDAA8 38 60 00 00 */ li r3, 0 -lbl_805CDAAC: -/* 805CDAAC 83 E1 00 0C */ lwz r31, 0xc(r1) -/* 805CDAB0 80 01 00 14 */ lwz r0, 0x14(r1) -/* 805CDAB4 7C 08 03 A6 */ mtlr r0 -/* 805CDAB8 38 21 00 10 */ addi r1, r1, 0x10 -/* 805CDABC 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/hand_smokeSet__8daB_DS_cFUc.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/hand_smokeSet__8daB_DS_cFUc.s deleted file mode 100644 index 0ae0f152fe8..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/hand_smokeSet__8daB_DS_cFUc.s +++ /dev/null @@ -1,32 +0,0 @@ -lbl_805CC158: -/* 805CC158 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 805CC15C 7C 08 02 A6 */ mflr r0 -/* 805CC160 90 01 00 14 */ stw r0, 0x14(r1) -/* 805CC164 93 E1 00 0C */ stw r31, 0xc(r1) -/* 805CC168 93 C1 00 08 */ stw r30, 8(r1) -/* 805CC16C 7C 7E 1B 78 */ mr r30, r3 -/* 805CC170 7C 9F 23 78 */ mr r31, r4 -/* 805CC174 54 80 06 3F */ clrlwi. r0, r4, 0x18 -/* 805CC178 41 82 00 0C */ beq lbl_805CC184 -/* 805CC17C 28 00 00 01 */ cmplwi r0, 1 -/* 805CC180 40 82 00 10 */ bne lbl_805CC190 -lbl_805CC184: -/* 805CC184 7F C3 F3 78 */ mr r3, r30 -/* 805CC188 38 80 00 00 */ li r4, 0 -/* 805CC18C 4B FF FD 45 */ bl handSPosSet__8daB_DS_cFi -lbl_805CC190: -/* 805CC190 57 E0 06 3F */ clrlwi. r0, r31, 0x18 -/* 805CC194 41 82 00 0C */ beq lbl_805CC1A0 -/* 805CC198 28 00 00 02 */ cmplwi r0, 2 -/* 805CC19C 40 82 00 10 */ bne lbl_805CC1AC -lbl_805CC1A0: -/* 805CC1A0 7F C3 F3 78 */ mr r3, r30 -/* 805CC1A4 38 80 00 01 */ li r4, 1 -/* 805CC1A8 4B FF FD 29 */ bl handSPosSet__8daB_DS_cFi -lbl_805CC1AC: -/* 805CC1AC 83 E1 00 0C */ lwz r31, 0xc(r1) -/* 805CC1B0 83 C1 00 08 */ lwz r30, 8(r1) -/* 805CC1B4 80 01 00 14 */ lwz r0, 0x14(r1) -/* 805CC1B8 7C 08 03 A6 */ mtlr r0 -/* 805CC1BC 38 21 00 10 */ addi r1, r1, 0x10 -/* 805CC1C0 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBattle2BreathFireSet__8daB_DS_cFUl.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBattle2BreathFireSet__8daB_DS_cFUl.s deleted file mode 100644 index 0a6cacd0b73..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBattle2BreathFireSet__8daB_DS_cFUl.s +++ /dev/null @@ -1,30 +0,0 @@ -lbl_805D3D14: -/* 805D3D14 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 805D3D18 7C 08 02 A6 */ mflr r0 -/* 805D3D1C 90 01 00 24 */ stw r0, 0x24(r1) -/* 805D3D20 93 E1 00 1C */ stw r31, 0x1c(r1) -/* 805D3D24 7C 7F 1B 79 */ or. r31, r3, r3 -/* 805D3D28 7C 85 23 78 */ mr r5, r4 -/* 805D3D2C 88 03 04 E2 */ lbz r0, 0x4e2(r3) -/* 805D3D30 7C 07 07 74 */ extsb r7, r0 -/* 805D3D34 38 00 00 00 */ li r0, 0 -/* 805D3D38 90 01 00 08 */ stw r0, 8(r1) -/* 805D3D3C 38 60 00 F6 */ li r3, 0xf6 -/* 805D3D40 41 82 00 0C */ beq lbl_805D3D4C -/* 805D3D44 80 9F 00 04 */ lwz r4, 4(r31) -/* 805D3D48 48 00 00 08 */ b lbl_805D3D50 -lbl_805D3D4C: -/* 805D3D4C 38 80 FF FF */ li r4, -1 -lbl_805D3D50: -/* 805D3D50 38 DF 07 00 */ addi r6, r31, 0x700 -/* 805D3D54 39 1F 04 E4 */ addi r8, r31, 0x4e4 -/* 805D3D58 39 20 00 00 */ li r9, 0 -/* 805D3D5C 39 40 FF FF */ li r10, -1 -/* 805D3D60 4B A4 61 91 */ bl fopAcM_createChild__FsUiUlPC4cXyziPC5csXyzPC4cXyzScPFPv_i -/* 805D3D64 38 00 00 00 */ li r0, 0 -/* 805D3D68 98 1F 08 5A */ stb r0, 0x85a(r31) -/* 805D3D6C 83 E1 00 1C */ lwz r31, 0x1c(r1) -/* 805D3D70 80 01 00 24 */ lwz r0, 0x24(r1) -/* 805D3D74 7C 08 03 A6 */ mtlr r0 -/* 805D3D78 38 21 00 20 */ addi r1, r1, 0x20 -/* 805D3D7C 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBreakBoneSUB__8daB_DS_cFv.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBreakBoneSUB__8daB_DS_cFv.s deleted file mode 100644 index 537b192041d..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBreakBoneSUB__8daB_DS_cFv.s +++ /dev/null @@ -1,33 +0,0 @@ -lbl_805D02F8: -/* 805D02F8 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 805D02FC 7C 08 02 A6 */ mflr r0 -/* 805D0300 90 01 00 14 */ stw r0, 0x14(r1) -/* 805D0304 93 E1 00 0C */ stw r31, 0xc(r1) -/* 805D0308 7C 7F 1B 78 */ mr r31, r3 -/* 805D030C 88 83 08 59 */ lbz r4, 0x859(r3) -/* 805D0310 28 04 00 FF */ cmplwi r4, 0xff -/* 805D0314 41 82 00 4C */ beq lbl_805D0360 -/* 805D0318 3C 60 80 40 */ lis r3, g_dComIfG_gameInfo@ha /* 0x804061C0@ha */ -/* 805D031C 38 63 61 C0 */ addi r3, r3, g_dComIfG_gameInfo@l /* 0x804061C0@l */ -/* 805D0320 88 1F 04 BA */ lbz r0, 0x4ba(r31) -/* 805D0324 7C 05 07 74 */ extsb r5, r0 -/* 805D0328 4B A6 4F 89 */ bl offSwitch__10dSv_info_cFii -/* 805D032C C0 1F 04 D0 */ lfs f0, 0x4d0(r31) -/* 805D0330 D0 1F 06 C4 */ stfs f0, 0x6c4(r31) -/* 805D0334 C0 1F 04 D4 */ lfs f0, 0x4d4(r31) -/* 805D0338 D0 1F 06 C8 */ stfs f0, 0x6c8(r31) -/* 805D033C C0 1F 04 D8 */ lfs f0, 0x4d8(r31) -/* 805D0340 D0 1F 06 CC */ stfs f0, 0x6cc(r31) -/* 805D0344 38 7F 05 DC */ addi r3, r31, 0x5dc -/* 805D0348 3C 80 00 04 */ lis r4, 4 -/* 805D034C 38 A0 00 1F */ li r5, 0x1f -/* 805D0350 81 9F 05 DC */ lwz r12, 0x5dc(r31) -/* 805D0354 81 8C 00 2C */ lwz r12, 0x2c(r12) -/* 805D0358 7D 89 03 A6 */ mtctr r12 -/* 805D035C 4E 80 04 21 */ bctrl -lbl_805D0360: -/* 805D0360 83 E1 00 0C */ lwz r31, 0xc(r1) -/* 805D0364 80 01 00 14 */ lwz r0, 0x14(r1) -/* 805D0368 7C 08 03 A6 */ mtlr r0 -/* 805D036C 38 21 00 10 */ addi r1, r1, 0x10 -/* 805D0370 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mClearTrap__8daB_DS_cFb.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mClearTrap__8daB_DS_cFb.s deleted file mode 100644 index 4f7d6395cd2..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mClearTrap__8daB_DS_cFb.s +++ /dev/null @@ -1,43 +0,0 @@ -lbl_805CC80C: -/* 805CC80C 94 21 FF D0 */ stwu r1, -0x30(r1) -/* 805CC810 7C 08 02 A6 */ mflr r0 -/* 805CC814 90 01 00 34 */ stw r0, 0x34(r1) -/* 805CC818 39 61 00 30 */ addi r11, r1, 0x30 -/* 805CC81C 4B D9 59 B9 */ bl _savegpr_27 -/* 805CC820 7C 7B 1B 78 */ mr r27, r3 -/* 805CC824 7C 9C 23 78 */ mr r28, r4 -/* 805CC828 3B A0 00 00 */ li r29, 0 -/* 805CC82C 3B E0 00 00 */ li r31, 0 -lbl_805CC830: -/* 805CC830 3B DF 2D 78 */ addi r30, r31, 0x2d78 -/* 805CC834 7C 7B F0 2E */ lwzx r3, r27, r30 -/* 805CC838 28 03 00 00 */ cmplwi r3, 0 -/* 805CC83C 41 82 00 40 */ beq lbl_805CC87C -/* 805CC840 38 81 00 08 */ addi r4, r1, 8 -/* 805CC844 4B A4 D1 79 */ bl fopAcM_SearchByID__FUiPP10fopAc_ac_c -/* 805CC848 2C 03 00 00 */ cmpwi r3, 0 -/* 805CC84C 41 82 00 30 */ beq lbl_805CC87C -/* 805CC850 80 61 00 08 */ lwz r3, 8(r1) -/* 805CC854 28 03 00 00 */ cmplwi r3, 0 -/* 805CC858 41 82 00 24 */ beq lbl_805CC87C -/* 805CC85C 57 80 06 3F */ clrlwi. r0, r28, 0x18 -/* 805CC860 41 82 00 0C */ beq lbl_805CC86C -/* 805CC864 4B A4 D4 19 */ bl fopAcM_delete__FP10fopAc_ac_c -/* 805CC868 48 00 00 0C */ b lbl_805CC874 -lbl_805CC86C: -/* 805CC86C 38 00 00 00 */ li r0, 0 -/* 805CC870 B0 03 05 62 */ sth r0, 0x562(r3) -lbl_805CC874: -/* 805CC874 38 00 00 00 */ li r0, 0 -/* 805CC878 7C 1B F1 2E */ stwx r0, r27, r30 -lbl_805CC87C: -/* 805CC87C 3B BD 00 01 */ addi r29, r29, 1 -/* 805CC880 2C 1D 00 14 */ cmpwi r29, 0x14 -/* 805CC884 3B FF 00 04 */ addi r31, r31, 4 -/* 805CC888 41 80 FF A8 */ blt lbl_805CC830 -/* 805CC88C 39 61 00 30 */ addi r11, r1, 0x30 -/* 805CC890 4B D9 59 91 */ bl _restgpr_27 -/* 805CC894 80 01 00 34 */ lwz r0, 0x34(r1) -/* 805CC898 7C 08 03 A6 */ mtlr r0 -/* 805CC89C 38 21 00 30 */ addi r1, r1, 0x30 -/* 805CC8A0 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mHeadAngle_Clear__8daB_DS_cFv.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mHeadAngle_Clear__8daB_DS_cFv.s deleted file mode 100644 index 5bc96835a0d..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mHeadAngle_Clear__8daB_DS_cFv.s +++ /dev/null @@ -1,26 +0,0 @@ -lbl_805CBD00: -/* 805CBD00 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 805CBD04 7C 08 02 A6 */ mflr r0 -/* 805CBD08 90 01 00 14 */ stw r0, 0x14(r1) -/* 805CBD0C 93 E1 00 0C */ stw r31, 0xc(r1) -/* 805CBD10 7C 7F 1B 78 */ mr r31, r3 -/* 805CBD14 38 7F 07 A8 */ addi r3, r31, 0x7a8 -/* 805CBD18 38 80 00 00 */ li r4, 0 -/* 805CBD1C 38 A0 00 14 */ li r5, 0x14 -/* 805CBD20 38 C0 01 00 */ li r6, 0x100 -/* 805CBD24 4B CA 48 E5 */ bl cLib_addCalcAngleS2__FPssss -/* 805CBD28 38 7F 07 AA */ addi r3, r31, 0x7aa -/* 805CBD2C 38 80 00 00 */ li r4, 0 -/* 805CBD30 38 A0 00 14 */ li r5, 0x14 -/* 805CBD34 38 C0 01 00 */ li r6, 0x100 -/* 805CBD38 4B CA 48 D1 */ bl cLib_addCalcAngleS2__FPssss -/* 805CBD3C 38 7F 07 AC */ addi r3, r31, 0x7ac -/* 805CBD40 38 80 00 00 */ li r4, 0 -/* 805CBD44 38 A0 00 14 */ li r5, 0x14 -/* 805CBD48 38 C0 01 00 */ li r6, 0x100 -/* 805CBD4C 4B CA 48 BD */ bl cLib_addCalcAngleS2__FPssss -/* 805CBD50 83 E1 00 0C */ lwz r31, 0xc(r1) -/* 805CBD54 80 01 00 14 */ lwz r0, 0x14(r1) -/* 805CBD58 7C 08 03 A6 */ mtlr r0 -/* 805CBD5C 38 21 00 10 */ addi r1, r1, 0x10 -/* 805CBD60 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setActionMode__8daB_DS_cFii.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setActionMode__8daB_DS_cFii.s deleted file mode 100644 index ac937aced67..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setActionMode__8daB_DS_cFii.s +++ /dev/null @@ -1,4 +0,0 @@ -lbl_805CBB74: -/* 805CBB74 90 83 06 80 */ stw r4, 0x680(r3) -/* 805CBB78 90 A3 06 84 */ stw r5, 0x684(r3) -/* 805CBB7C 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setYoMessage__8daB_DS_cFi.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setYoMessage__8daB_DS_cFi.s deleted file mode 100644 index 2732464f3f8..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setYoMessage__8daB_DS_cFi.s +++ /dev/null @@ -1,16 +0,0 @@ -lbl_805CDA08: -/* 805CDA08 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 805CDA0C 7C 08 02 A6 */ mflr r0 -/* 805CDA10 90 01 00 14 */ stw r0, 0x14(r1) -/* 805CDA14 93 E1 00 0C */ stw r31, 0xc(r1) -/* 805CDA18 7C 7F 1B 78 */ mr r31, r3 -/* 805CDA1C 90 83 08 64 */ stw r4, 0x864(r3) -/* 805CDA20 7C 83 23 78 */ mr r3, r4 -/* 805CDA24 38 80 03 E8 */ li r4, 0x3e8 -/* 805CDA28 4B A5 24 5D */ bl fopMsgM_messageSet__FUlUl -/* 805CDA2C 90 7F 08 68 */ stw r3, 0x868(r31) -/* 805CDA30 83 E1 00 0C */ lwz r31, 0xc(r1) -/* 805CDA34 80 01 00 14 */ lwz r0, 0x14(r1) -/* 805CDA38 7C 08 03 A6 */ mtlr r0 -/* 805CDA3C 38 21 00 10 */ addi r1, r1, 0x10 -/* 805CDA40 4E 80 00 20 */ blr diff --git a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/useHeapInit__FP10fopAc_ac_c.s b/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/useHeapInit__FP10fopAc_ac_c.s deleted file mode 100644 index 40326aa5f23..00000000000 --- a/asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/useHeapInit__FP10fopAc_ac_c.s +++ /dev/null @@ -1,9 +0,0 @@ -lbl_805DB954: -/* 805DB954 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 805DB958 7C 08 02 A6 */ mflr r0 -/* 805DB95C 90 01 00 14 */ stw r0, 0x14(r1) -/* 805DB960 4B FF F9 05 */ bl CreateHeap__8daB_DS_cFv -/* 805DB964 80 01 00 14 */ lwz r0, 0x14(r1) -/* 805DB968 7C 08 03 A6 */ mtlr r0 -/* 805DB96C 38 21 00 10 */ addi r1, r1, 0x10 -/* 805DB970 4E 80 00 20 */ blr diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index 4a9d3cb5c00..46a062490e0 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -106,6 +106,7 @@ public: void setEmitterCallBackPtr(JPAEmitterCallBack* ptr) { mpEmtrCallBack = ptr; } void setGlobalRTMatrix(const Mtx m) { JPASetRMtxTVecfromMtx(m, mGlobalRot, &mGlobalTrs); } void setGlobalTranslation(f32 x, f32 y, f32 z) { mGlobalTrs.set(x, y, z); } + void setGlobalTranslation(const JGeometry::TVec3& trs) { mGlobalTrs.set(trs); } void getLocalTranslation(JGeometry::TVec3& vec) { vec.set(mLocalTrs); } void setGlobalRotation(const JGeometry::TVec3& rot) { JPAGetXYZRotateMtx(rot.x, rot.y, rot.z, mGlobalRot); @@ -131,6 +132,10 @@ public: mGlobalScl.set(scale); mGlobalPScl.set(scale.x ,scale.y); } + void setGlobalSRTMatrix(const MtxP matrix) { + JPASetRMtxSTVecfromMtx(matrix, mGlobalRot, &mGlobalScl, &mGlobalTrs); + mGlobalPScl.set(mGlobalScl.x, mGlobalScl.y); + } f32 get_r_f() { return mRndm.get_rndm_f(); } f32 get_r_zp() { return mRndm.get_rndm_zp(); } diff --git a/include/SSystem/SComponent/c_cc_d.h b/include/SSystem/SComponent/c_cc_d.h index ca9b60ff42f..9d249224893 100644 --- a/include/SSystem/SComponent/c_cc_d.h +++ b/include/SSystem/SComponent/c_cc_d.h @@ -11,6 +11,9 @@ typedef struct _GXColor GXColor; class fopAc_ac_c; enum CcG_Tg_HitMark { + CcG_Tg_UNK_MARK_0 = 0, + CcG_Tg_UNK_MARK_2 = 2, + CcG_Tg_UNK_MARK_3 = 3, CcG_Tg_UNK_MARK_6 = 6, CcG_Tg_UNK_MARK_8 = 8, }; diff --git a/include/d/a/d_a_alink.h b/include/d/a/d_a_alink.h index 8541be89842..64b05d9803c 100644 --- a/include/d/a/d_a_alink.h +++ b/include/d/a/d_a_alink.h @@ -3031,7 +3031,7 @@ public: virtual f32 getBaseAnimeFrameRate() const; virtual f32 getBaseAnimeFrame() const; virtual void setAnimeFrame(f32); - virtual bool checkWolfLock(fopAc_ac_c*) const; + virtual BOOL checkWolfLock(fopAc_ac_c*) const; virtual bool cancelWolfLock(fopAc_ac_c*); virtual s32 getAtnActorID() const; virtual s32 getItemID() const; @@ -3070,7 +3070,7 @@ public: virtual u32 checkCanoeRide() const; virtual u32 checkBoardRide() const; virtual u32 checkSpinnerRide() const; - virtual fopAc_ac_c* getSpinnerActor(); + virtual daSpinner_c* getSpinnerActor(); virtual BOOL checkHorseRideNotReady() const; virtual bool checkArrowChargeEnd() const; virtual f32 getSearchBallScale() const; diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index d6993d8f33e..0f5d05366ef 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -183,6 +183,7 @@ private: }; // Size: 0x24 class daMidna_c; +class daSpinner_c; class daPy_py_c; inline daPy_py_c* dComIfGp_getLinkPlayer(); inline BOOL i_dComIfGs_isEventBit(const u16); @@ -340,7 +341,7 @@ public: ERFLG0_UNK_20000000 = 0x20000000, ERFLG0_UNK_10000000 = 0x10000000, ERFLG0_UNK_8000000 = 0x8000000, - ERFLG0_UNK_2000000 = 0x2000000, + ERFLG0_BOSS_ROOM_WAIT = 0x2000000, ERFLG0_UNK_1000000 = 0x1000000, ERFLG0_UNK_800000 = 0x800000, ERFLG0_UNK_400000 = 0x400000, @@ -610,7 +611,7 @@ public: virtual f32 getBaseAnimeFrameRate() const; virtual f32 getBaseAnimeFrame() const; virtual void setAnimeFrame(f32); - virtual bool checkWolfLock(fopAc_ac_c*) const; + virtual BOOL checkWolfLock(fopAc_ac_c*) const; virtual bool cancelWolfLock(fopAc_ac_c*); virtual s32 getAtnActorID() const { return -1; } virtual s32 getItemID() const; @@ -654,7 +655,7 @@ public: virtual u32 checkCanoeRide() const { return 0; } virtual u32 checkBoardRide() const { return 0; } virtual u32 checkSpinnerRide() const { return 0; } - virtual fopAc_ac_c* getSpinnerActor(); + virtual daSpinner_c* getSpinnerActor(); virtual BOOL checkHorseRideNotReady() const; virtual bool checkArrowChargeEnd() const; virtual f32 getSearchBallScale() const; @@ -748,6 +749,7 @@ public: bool i_checkGoronSideMove() const { return mSpecialMode == 0x2B; } u8 getCutType() const { return mCutType; } u16 getSwordAtUpTime() const { return mSwordUpTimer; } + s16 getDamageWaitTimer() const { return mDamageTimer; } bool checkWaterInMove() const { return i_checkNoResetFlg0(FLG0_UNDERWATER); } bool checkSceneChangeAreaStart() const { return i_checkNoResetFlg2(FLG2_SCN_CHG_START); } bool checkFrontRollCrash() const { return i_checkResetFlg0(RFLG0_FRONT_ROLL_CRASH); } @@ -757,6 +759,7 @@ public: bool getGrabUpEnd() const { return i_checkResetFlg0(RFLG0_GRAB_UP_END); } bool getGrabPutStart() const { return i_checkResetFlg0(RFLG0_GRAB_PUT_START); } + void onBossRoomWait() { i_onEndResetFlg0(ERFLG0_BOSS_ROOM_WAIT); } void onForceAutoJump() { i_onEndResetFlg0(ERFLG0_FORCE_AUTO_JUMP); } void onNotAutoJump() { i_onEndResetFlg0(ERFLG0_NOT_AUTO_JUMP); } void onNotHang() { i_onEndResetFlg0(ERFLG0_NOT_HANG); } diff --git a/include/d/cc/d_cc_d.h b/include/d/cc/d_cc_d.h index 70282020b4e..3c7ac0a03da 100644 --- a/include/d/cc/d_cc_d.h +++ b/include/d/cc/d_cc_d.h @@ -237,6 +237,7 @@ public: void SetRVec(cXyz& vec) { mRVec = vec; } cXyz* GetVecP() { return &mVec; } void SetHitPos(cXyz& pos) { mHitPos = pos; } + cXyz* GetHitPosP() { return &mHitPos; } private: /* 0x1C */ u8 mSe; @@ -294,6 +295,9 @@ public: void OnAtNoConHit() { mGObjAt.OnSPrm(1); } void OffAtNoConHit() { mGObjAt.OffSPrm(1); } void OnTgNoConHit() { mGObjTg.OnSPrm(2); } + void OffTgNoConHit() { mGObjTg.OffSPrm(2); } + void OnTgStopNoConHit() { mGObjTg.OnSPrm(0x2000); } + void OffTgStopNoConHit() { mGObjTg.OffSPrm(0x2000); } void SetAtHitMark(u8 mark) { mGObjAt.SetHitMark(mark); } void SetAtSe(u8 se) { mGObjAt.SetSe(se); } void SetTgSe(u8 se) { mGObjTg.SetSe(se); } @@ -324,7 +328,11 @@ public: void OffTgShieldFrontRange() { mGObjTg.OffSPrm(0x8); } void OnTgSmallShield() { mGObjTg.OnSPrm(0x10); } void OffTgSmallShield() { mGObjTg.OffSPrm(0x10); } + void OnTgIronBallRebound() { mGObjTg.OnSPrm(0x100); } + void OffTgIronBallRebound() { mGObjTg.OffSPrm(0x100); } bool ChkTgIronBallRebound() { return mGObjTg.ChkSPrm(0x100); } + void OnTgSpinnerReflect() { mGObjTg.OnSPrm(0x200); } + void OffTgSpinnerReflect() { mGObjTg.OffSPrm(0x200); } s16* GetTgShieldFrontRangeYAngle() { return mGObjTg.GetShieldFrontRangeYAngle(); } s16 GetTgShieldRange() { return mGObjTg.GetShieldRange(); } bool ChkTgShield() { return mGObjTg.ChkSPrm(1); } @@ -380,6 +388,7 @@ public: void SetAtHitPos(cXyz& pos) { mGObjAt.SetHitPos(pos); } u32 GetTgHitObjHitSeID(int i_soundID) { return getHitSeID(GetTgHitObjSe(),i_soundID); } cXyz* GetAtHitPosP() { return mGObjAt.GetHitPosP(); } + cXyz* GetTgHitPosP() { return mGObjTg.GetHitPosP(); } bool ChkTgHookshotThrough() { return mGObjTg.ChkSPrm(0x80); } static const Z2SoundID m_hitSeID[24]; diff --git a/include/d/cc/d_cc_uty.h b/include/d/cc/d_cc_uty.h index 41a732de5a2..5185f389428 100644 --- a/include/d/cc/d_cc_uty.h +++ b/include/d/cc/d_cc_uty.h @@ -31,5 +31,6 @@ struct dCcU_AtInfo { fopAc_ac_c* cc_at_check(fopAc_ac_c*,dCcU_AtInfo*); fopAc_ac_c* at_power_check(dCcU_AtInfo* i_AtInfo); +void def_se_set(Z2Creature* p_sound, cCcD_Obj* p_collider, u32 map_info, fopAc_ac_c* p_actor); #endif /* D_CC_D_CC_UTY_H */ diff --git a/include/d/com/d_com_inf_game.h b/include/d/com/d_com_inf_game.h index bf3401f9288..8a7cd35942e 100644 --- a/include/d/com/d_com_inf_game.h +++ b/include/d/com/d_com_inf_game.h @@ -824,6 +824,7 @@ int dComIfG_TimerDeleteRequest(int i_mode); int dComIfG_TimerStart(int i_mode, s16 i_time); bool dComIfGp_isLightDropMapVisible(); int dComIfG_TimerEnd(int i_mode, int param_1); +void dComIfGs_onStageBossEnemy(int i_stageNo); inline void dComIfG_setBrightness(u8 brightness) { g_dComIfG_gameInfo.mFadeBrightness = brightness; @@ -1344,6 +1345,10 @@ inline s32 dComIfGs_isStageBossEnemy() { return g_dComIfG_gameInfo.info.getMemory().getBit().isStageBossEnemy(); } +inline s32 dComIfGs_isStageLife() { + return g_dComIfG_gameInfo.info.getMemory().getBit().isStageLife(); +} + inline void dComIfGs_setKeyNum(u8 i_keyNum) { g_dComIfG_gameInfo.info.getMemory().getBit().setKeyNum(i_keyNum); } diff --git a/include/d/save/d_save.h b/include/d/save/d_save.h index b1b7aabaf8f..df8e54c8fd5 100644 --- a/include/d/save/d_save.h +++ b/include/d/save/d_save.h @@ -852,6 +852,7 @@ public: } s32 isStageBossEnemy() const { return isDungeonItem(STAGE_BOSS_ENEMY); } s32 isStageBossEnemy2() const { return isDungeonItem(STAGE_BOSS_ENEMY_2); } + s32 isStageLife() const { return isDungeonItem(STAGE_LIFE); } s32 isDungeonItemWarp() const { return isDungeonItem(OOCCOO_NOTE); } void onStageLife() { onDungeonItem(STAGE_LIFE); } diff --git a/include/f_op/f_op_actor.h b/include/f_op/f_op_actor.h index fe7ff9db7c5..b14d0d95565 100644 --- a/include/f_op/f_op_actor.h +++ b/include/f_op/f_op_actor.h @@ -251,6 +251,7 @@ public: void onWolfBiteDamage() { mFlags |= 0x40; } void onWolfDownStartFlg() { mFlags |= 0x14; } void onWolfDownPullEndFlg() { mFlags |= 0x20; } + void onWolfNoLock() { mFlags |= 0x200; } void setThrowModeCatch() { mThrowMode |= 2; } void setThrowModeDash() { mThrowMode |= 4; } diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 1402429be29..442f5428815 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -195,6 +195,10 @@ inline u8 fopAcM_GetGroup(const fopAc_ac_c* p_actor) { return p_actor->group; } +inline void fopAcM_SetGroup(fopAc_ac_c* p_actor, u8 group) { + p_actor->group = group; +} + inline void fopAcM_OnStatus(fopAc_ac_c* pActor, u32 flag) { pActor->actor_status |= flag; } diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 8fda612d6ad..84c3e66c00f 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -273,7 +273,7 @@ public: void changeAnm(J3DAnmTransform* anm) { mpAnm = anm; } u8 getPlayMode() { return mFrameCtrl.getAttribute(); } void setPlayMode(int mode) { mFrameCtrl.setAttribute(mode); } - bool isStop() { return mFrameCtrl.checkState(1) || mFrameCtrl.getRate() == 0.0f; } + BOOL isStop() { return mFrameCtrl.checkState(1) || mFrameCtrl.getRate() == 0.0f; } bool isLoop() { return mFrameCtrl.checkState(2); } f32 getStartFrame() { return mFrameCtrl.getStart(); } void setStartFrame(f32 frame) { mFrameCtrl.setStart(frame); } diff --git a/include/rel/d/a/b/d_a_b_ds/d_a_b_ds.h b/include/rel/d/a/b/d_a_b_ds/d_a_b_ds.h index dc0c8c239aa..419372d6778 100644 --- a/include/rel/d/a/b/d_a_b_ds/d_a_b_ds.h +++ b/include/rel/d/a/b/d_a_b_ds/d_a_b_ds.h @@ -1,6 +1,359 @@ #ifndef D_A_B_DS_H #define D_A_B_DS_H -#include "dolphin/types.h" +#include "SSystem/SComponent/c_phase.h" +#include "f_op/f_op_actor.h" +#include "Z2AudioLib/Z2Creature.h" +#include "d/bg/d_bg_s_acch.h" +#include "d/cc/d_cc_d.h" +#include "d/cc/d_cc_uty.h" +#include "d/msg/d_msg_flow.h" +#include "m_Do/m_Do_ext.h" + +class daB_DS_c : public fopEn_enemy_c { +public: + enum Type { + /* 0 */ PHASE_1, + /* 1 */ BULLET_A, + /* 2 */ PHASE_2, + /* 3 */ BULLET_B, + /* 4 */ BULLET_C, + }; + + enum Action { + /* 0 */ ACT_WAIT, + /* 1 */ ACT_OPENING_DEMO, + /* 2 */ ACT_CIRCLE, + /* 3 */ ACT_DAMAGE, + /* 4 */ ACT_ETC_DAMAGE, + /* 5 */ ACT_HAND_ATTACK, + /* 6 */ ACT_BREATH_ATTACK, + /* 7 */ ACT_BREATH_SEARCH, + }; + + enum B2Action { + /* 0 */ ACT_B2_OPENING_DEMO, + /* 1 */ ACT_B2_WAIT, + /* 2 */ ACT_B2_F_MOVE, + /* 3 */ ACT_B2_TIRED, + /* 4 */ ACT_B2_DAMAGE, + /* 5 */ ACT_B2_DEAD, + }; + + enum AnmID { + /* 0x06 */ ANM_ATTACK01_A = 6, + /* 0x07 */ ANM_ATTACK01_B, + /* 0x08 */ ANM_ATTACK01_C, + /* 0x09 */ ANM_ATTACK02_A_A, + /* 0x0A */ ANM_ATTACK02_A_B, + /* 0x0B */ ANM_ATTACK02_A_C, + /* 0x0C */ ANM_ATTACK02_B_A, + /* 0x0D */ ANM_ATTACK02_B_B, + /* 0x0E */ ANM_ATTACK02_B_C, + /* 0x0F */ ANM_ATTACK02_C_A, + /* 0x10 */ ANM_ATTACK02_C_B, + /* 0x11 */ ANM_ATTACK02_C_C, + /* 0x12 */ ANM_ATTACK_L_A, + /* 0x13 */ ANM_ATTACK_L_B, + /* 0x14 */ ANM_ATTACK_L_C, + /* 0x15 */ ANM_ATTACK_R_A, + /* 0x16 */ ANM_ATTACK_R_B, + /* 0x17 */ ANM_ATTACK_R_C, + /* 0x18 */ ANM_CIRCLE_L_A, + /* 0x19 */ ANM_CIRCLE_L_B, + /* 0x1A */ ANM_CIRCLE_L_C, + /* 0x1B */ ANM_CIRCLE_R_A, + /* 0x1C */ ANM_CIRCLE_R_B, + /* 0x1D */ ANM_CIRCLE_R_C, + /* 0x1E */ ANM_DAMAGE_A, + /* 0x1F */ ANM_DAMAGE_A_WAIT, + /* 0x20 */ ANM_DAMAGE_B, + /* 0x21 */ ANM_DAMAGE_B_WAIT, + /* 0x22 */ ANM_ENDDEMO, + /* 0x23 */ ANM_HEAD_DAMAGE, + /* 0x24 */ ANM_HEAD_DIE, + /* 0x25 */ ANM_HEAD_DIEB, + /* 0x26 */ ANM_HEAD_DOWN, + /* 0x27 */ ANM_HEAD_DOWN_DAMAGE, + /* 0x28 */ ANM_HEAD_DOWN_UP, + /* 0x29 */ ANM_HEAD_FATTACK_A, + /* 0x2A */ ANM_HEAD_FATTACK_B, + /* 0x2B */ ANM_HEAD_FATTACK_C, + /* 0x2C */ ANM_HEAD_FWAIT, + /* 0x2D */ ANM_HEAD_RETURN, + /* 0x2E */ ANM_HEAD_TIRED, + /* 0x2F */ ANM_LASTDAMAGE, + /* 0x30 */ ANM_LASTDAMAGE_WAIT, + /* 0x31 */ ANM_NODAMAGE_01_A, + /* 0x32 */ ANM_NODAMAGE_01_B, + /* 0x33 */ ANM_NODAMAGE_01_C, + /* 0x34 */ ANM_NODAMAGE_02_A, + /* 0x35 */ ANM_NODAMAGE_02_B, + /* 0x36 */ ANM_NODAMAGE_02_C, + /* 0x37 */ ANM_NODAMAGE_03_A, + /* 0x38 */ ANM_NODAMAGE_03_B, + /* 0x39 */ ANM_NODAMAGE_03_C, + /* 0x3A */ ANM_OPDEMO, + /* 0x3B */ ANM_REVIVAL, + /* 0x3C */ ANM_WAIT01_A, + /* 0x3D */ ANM_WAIT01_B, + /* 0x3E */ ANM_WAIT01_C, + }; + + /* 805CB314 */ int ctrlJoint(J3DJoint*, J3DModel*); + /* 805CB4A4 */ static int JointCallBack(J3DJoint*, int); + /* 805CB4F0 */ int draw(); + /* 805CBAC8 */ void setBck(int, u8, f32, f32); + /* 805CBB74 */ void setActionMode(int, int); + /* 805CBB80 */ void mSmokeSet(); + /* 805CBD00 */ void mHeadAngle_Clear(); + /* 805CBD64 */ void HandHitSoundSet(bool); + /* 805CBED0 */ void handSPosSet(int); + /* 805CC158 */ void hand_smokeSet(u8); + /* 805CC1C4 */ void mZsMoveChk(); + /* 805CC454 */ void mZsMoveChk_Guard(); + /* 805CC6F4 */ void mTrapScale(); + /* 805CC80C */ void mClearTrap(bool); + /* 805CC8A4 */ void mCreateTrap(bool); + /* 805CCEB4 */ void mChangeVer2(); + /* 805CD074 */ void damage_check(); + /* 805CD628 */ void neck_set(); + /* 805CD844 */ bool mCutTypeCheck(); + /* 805CD8D8 */ bool startDemoCheck(); + /* 805CDA08 */ void setYoMessage(int); + /* 805CDA44 */ bool doYoMessage(); + /* 805CDAC0 */ void executeOpeningDemo(); + /* 805CFC8C */ bool mHandBreathChk(); + /* 805D002C */ void executeWait(); + /* 805D0194 */ void executeCircle(); + /* 805D02F8 */ void mBreakBoneSUB(); + /* 805D0374 */ void damageSet(); + /* 805D03EC */ void damageHitCamera(); + /* 805D0584 */ void damageDownCheck(); + /* 805D074C */ void executeDamage(); + /* 805D1E30 */ void executeEtcDamage(); + /* 805D203C */ void breath_smokeSet(); + /* 805D226C */ void executeBreathAttack(); + /* 805D2520 */ void executeHandAttack(); + /* 805D272C */ void executeBreathSearch(); + /* 805D28D0 */ void executeBattle2OpeningDemo(); + /* 805D3900 */ void mFlyBMove(f32); + /* 805D39A4 */ void mFuwafuwaSet(bool); + /* 805D3D14 */ void mBattle2BreathFireSet(u32); + /* 805D3D80 */ bool mNeckAngleSet(); + /* 805D3EA0 */ void mSetFirstPos(); + /* 805D3F90 */ bool mChkScreenIn(); + /* 805D4054 */ bool mRailInOutCheck(); + /* 805D41CC */ void executeBattle2Wait(); + /* 805D429C */ bool mBattle2MoveFSet(); + /* 805D497C */ void executeBattle2FMove(); + /* 805D5040 */ void executeBattle2Tired(); + /* 805D52D4 */ void executeBattle2Damage(); + /* 805D60BC */ bool mDeadMove(); + /* 805D6534 */ void executeBattle2Dead(); + /* 805D7C10 */ void executeBullet(); + /* 805D8078 */ void mBulletAction(); + /* 805D80F0 */ void mSoundSE_Set(); + /* 805D8D04 */ void action(); + /* 805D91A4 */ void mtx_set(); + /* 805D951C */ void cc_set(); + /* 805D9A40 */ void cc_etc_set(); + /* 805D9B74 */ void mBattle2Action(); + /* 805D9CFC */ void mBattle2_spinner_damage_check(); + /* 805D9FF4 */ bool mBattle2_damage_check(); + /* 805DA584 */ void mBattle2_mtx_set(); + /* 805DA9A4 */ void mBattle2_cc_etc_set(); + /* 805DAA98 */ void mBattle2_cc_set(); + /* 805DADC4 */ int execute(); + /* 805DB1AC */ int _delete(); + /* 805DB264 */ int CreateHeap(); + /* 805DB974 */ cPhs__Step create(); + /* 805DC1E8 */ daB_DS_c(); + + /* 0x05AC */ request_of_phase_process_class mPhase; + /* 0x05B4 */ mDoExt_McaMorfSO* mpMorf; + /* 0x05B8 */ mDoExt_McaMorfSO* mpSwordMorf; + /* 0x05BC */ mDoExt_McaMorfSO* mpZantMorf; + /* 0x05C0 */ J3DModel* mpOpPatternModel; + /* 0x05C4 */ J3DModel* mpPatternModel; + /* 0x05C8 */ mDoExt_brkAnm* mpSwordBrkAnm; + /* 0x05CC */ mDoExt_brkAnm* mpOpPatternBrkAnm; + /* 0x05D0 */ mDoExt_btkAnm* mpOpPatternBtkAnm; + /* 0x05D4 */ mDoExt_brkAnm* mpPatternBrkAnm; + /* 0x05D8 */ mDoExt_btkAnm* mpPatternBtkAnm; + /* 0x05DC */ Z2CreatureEnemy mSound; + /* 0x0680 */ int mAction; + /* 0x0684 */ int mMode; + /* 0x0688 */ int mHitLocation; + /* 0x068C */ int mAnmID; + /* 0x0690 */ int mBirthTrapTimerF; + /* 0x0694 */ int mPedestalFallTimer; + /* 0x0698 */ int mSandFallTimer; + /* 0x069C */ int mSwordTimer; + /* 0x06A0 */ int mHintTimer1; + /* 0x06A4 */ int mHintTimer2; + /* 0x06A8 */ int field_0x6a8; + /* 0x06AC */ cXyz mZantScale; + /* 0x06B8 */ cXyz mSwordScale; + /* 0x06C4 */ cXyz mSoundPos; + /* 0x06D0 */ cXyz field_0x6d0; + /* 0x06DC */ cXyz mZantEyePos; + /* 0x06E8 */ cXyz mSwordPos; + /* 0x06F4 */ cXyz field_0x6f4; + /* 0x0700 */ cXyz mMouthPos; + /* 0x070C */ cXyz mBulletPos; + /* 0x0718 */ cXyz field_0x718; + /* 0x0724 */ cXyz field_0x724; + /* 0x0730 */ cXyz mSandPos; + /* 0x073C */ cXyz mBackbonePos; + /* 0x0748 */ cXyz mZantPos; + /* 0x0754 */ cXyz mHeadPos; + /* 0x0760 */ cXyz mHandPos[2]; + /* 0x0778 */ cXyz mFingerPos[2]; + /* 0x0790 */ cXyz field_0x790; + /* 0x079C */ cXyz field_0x79c; + /* 0x07A8 */ csXyz mHeadAngle; + /* 0x07AE */ csXyz field_0x7ae; + /* 0x07B4 */ u8 field_0x7b4[6]; + /* 0x07BA */ csXyz field_0x7ba; + /* 0x07C0 */ csXyz field_0x7c0; + /* 0x07C6 */ u8 field_0x7c6[4]; + /* 0x07CA */ s16 field_0x7ca; + /* 0x07CC */ s16 mBh2AttackAngleF; + /* 0x07CE */ s16 field_0x7ce; + /* 0x07D0 */ s16 field_0x7d0; + /* 0x07D2 */ s16 field_0x7d2; + /* 0x07D4 */ f32 mBreathTimerBase; + /* 0x07D8 */ f32 mBulletRadius; + /* 0x07DC */ f32 field_0x7dc[3]; + /* 0x07E8 */ f32 field_0x7e8; + /* 0x07EC */ f32 field_0x7ec; + /* 0x07F0 */ f32 mBulletDistance; + /* 0x07F4 */ f32 mChkHigh; + /* 0x07F8 */ f32 field_0x7f8; + /* 0x07FC */ f32 mColBlend; + /* 0x0800 */ f32 mGroundUpY; + /* 0x0804 */ f32 field_0x804; + /* 0x0808 */ f32 field_0x808; + /* 0x080C */ f32 field_0x80c; + /* 0x0810 */ f32 mWallR; + /* 0x0814 */ int mBrokenBone; + /* 0x0818 */ int mTimerCount; + /* 0x081C */ int mActionTimer; + /* 0x0820 */ int mHitTimer; + /* 0x0824 */ u8 field_0x824[4]; + /* 0x0828 */ int mP2FallTimer; + /* 0x082C */ int field_0x82c; + /* 0x0830 */ int mBreathTimeCount; + /* 0x0834 */ int mOutTimer; + /* 0x0838 */ int mSmokeCount; + /* 0x083C */ int field_0x83c; + /* 0x0840 */ int field_0x840; + /* 0x0844 */ u8 field_0x844[4]; + /* 0x0848 */ u32 mShadowKey; + /* 0x084C */ u8 mAttackingHand; + /* 0x084D */ u8 field_0x84d; + /* 0x084E */ u8 mDamageTimer; + /* 0x084F */ u8 mBackboneJoint; + /* 0x0850 */ bool mDead; + /* 0x0851 */ bool mIsDemo; + /* 0x0852 */ u8 mBossPhase; + /* 0x0853 */ bool mIsOpeningDemo; + /* 0x0854 */ bool mIsAppear; + /* 0x0855 */ bool mIsAppearG; + /* 0x0856 */ u8 mType; + /* 0x0857 */ u8 mBitSw; + /* 0x0858 */ u8 mBitSw2; + /* 0x0859 */ u8 mBitSw3; + /* 0x085A */ bool mCreateFireBreath; + /* 0x085B */ bool mNoDrawSword; + /* 0x085C */ bool mDrawZant; + /* 0x085D */ bool mDrawZantSword; + /* 0x085E */ bool field_0x85e; + /* 0x085F */ bool mPlayPatternAnm; + /* 0x0860 */ bool mTrapCreate; + /* 0x0861 */ bool field_0x861; + /* 0x0862 */ u8 field_0x862[1]; + /* 0x0864 */ u32 mMsgIdx; + /* 0x0868 */ u32 mMsgPcID; + /* 0x086C */ msg_class* mpMsg; + /* 0x0870 */ dBgS_AcchCir mAcchCir; + /* 0x08B0 */ dBgS_ObjAcch mAcch; + /* 0x0A88 */ dCcD_Stts mCcStts; + /* 0x0AC4 */ dCcD_Sph mWeakSph; + /* 0x0BFC */ dCcD_Sph mHeadSph[5]; + /* 0x1214 */ dCcD_Sph mBreathAtSph; + /* 0x134C */ dCcD_Sph mEtcSph[18]; + /* 0x293C */ dCcD_Cyl mBackboneCyl; + /* 0x2A78 */ dCcD_Cyl mHandAtLCyl; + /* 0x2BB4 */ dCcD_Cyl mHandAtRCyl; + /* 0x2CF0 */ dCcU_AtInfo mAtInfo; + /* 0x2D14 */ cXyz mCameraEye; + /* 0x2D20 */ cXyz mCameraCenter; + /* 0x2D2C */ f32 mCameraFovy; + /* 0x2D30 */ u8 field_0x2d30[0xc]; + /* 0x2D3C */ u32 mStaltroopID[15]; + /* 0x2D78 */ u32 mTrapID[20]; + /* 0x2DC8 */ u32 mStaltroop2ID[5]; + /* 0x2DDC */ u32 mHandSmokeParticleKey[4]; + /* 0x2DEC */ u32 mHitParticleKey[2]; + /* 0x2DF4 */ u32 mDeathParticleKey; + /* 0x2DF8 */ u8 field_0x2df8[0xc]; + /* 0x2E04 */ u32 mBackboneParticleKey[2]; + /* 0x2E0C */ u32 mSandParticleKey[2]; + /* 0x2E14 */ u32 mParticleKey1; + /* 0x2E18 */ u32 mParticleKey2; + /* 0x2E1C */ u32 mSmokeParticleKey[20]; + /* 0x2E6C */ u32 mStartingParticleKey[16]; + /* 0x2EAC */ u32 mBreathSmokeParticleKey[3]; + /* 0x2EB8 */ u32 mBulletParticleKey[4]; + /* 0x2EC8 */ bool mHIOInit; + /* 0x2EC9 */ u8 field_0x2ec9[0x13]; + /* 0x2EDC */ dMsgFlow_c mMsgFlow; +}; + +STATIC_ASSERT(sizeof(daB_DS_c) == 0x2F28); + +class daB_DS_HIO_c { +public: + /* 805CB22C */ daB_DS_HIO_c(); +#ifdef NONMATCHING + /* 805DC89C */ virtual ~daB_DS_HIO_c() {} +#else + /* 805DC89C */ ~daB_DS_HIO_c(); +#endif + +#ifndef NONMATCHING + /* 0x00 */ void* _vtable; +#endif + /* 0x04 */ s8 field_0x04; + /* 0x08 */ f32 mModelSize; + /* 0x0C */ f32 mHandRange; + /* 0x10 */ f32 mBreathRange; + /* 0x14 */ f32 mGuardSpawnRange; + /* 0x18 */ f32 mNoSearchRange; + /* 0x1C */ f32 mP2MoveAxis; + /* 0x20 */ f32 mP2ModelSize; + /* 0x24 */ f32 mP2AttackHeight; + /* 0x28 */ s16 mP2FallTime; + /* 0x2A */ s16 mPedestalFallTime; + /* 0x2C */ s16 mSandFallWaitTime; + /* 0x2E */ s16 mP2BulletFireTime; + /* 0x30 */ s16 mP2OuterWallAttackTime; + /* 0x32 */ s16 mP2TrapCreateWaitTime1; + /* 0x34 */ s16 mP2TrapCreateWaitTime2; + /* 0x36 */ s16 mP2TrapCreateID1; + /* 0x38 */ s16 mP2TrapCreateID2; + /* 0x3A */ s16 mHintTime1; + /* 0x3C */ s16 mHintTime2; + /* 0x3E */ s16 mP2OuterWallTrapSpeed; + /* 0x40 */ s16 mTowerTrapSpeed; + /* 0x42 */ s16 mP2ApproachAccel; + /* 0x44 */ s16 mP2ApproachSpeedMax; + /* 0x46 */ s16 mP2ApproachAfterBullet; + /* 0x48 */ s16 mP2ApproachDist; + /* 0x4A */ s16 mP2Health; + /* 0x4C */ bool mP2HealthDebugOn; +}; #endif /* D_A_B_DS_H */ diff --git a/rel/d/a/b/d_a_b_ds/d_a_b_ds.cpp b/rel/d/a/b/d_a_b_ds/d_a_b_ds.cpp index 4872495b9d1..7053e8b7b26 100644 --- a/rel/d/a/b/d_a_b_ds/d_a_b_ds.cpp +++ b/rel/d/a/b/d_a_b_ds/d_a_b_ds.cpp @@ -1,433 +1,23 @@ -// -// Generated By: dol2asm -// Translation Unit: d_a_b_ds -// +/** + * d_a_b_ds.cpp + * Boss - Stallord + */ #include "rel/d/a/b/d_a_b_ds/d_a_b_ds.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/J3DGraphBase/J3DMaterial.h" +#include "SSystem/SComponent/c_math.h" +#include "c/c_damagereaction.h" +#include "f_op/f_op_actor_mng.h" +#include "f_op/f_op_msg.h" +#include "f_op/f_op_msg_mng.h" +#include "d/cc/d_cc_uty.h" +#include "d/com/d_com_inf_game.h" +#include "d/a/d_a_player.h" +#include "d/s/d_s_play.h" +#include "rel/d/a/d_a_spinner/d_a_spinner.h" #include "dol2asm.h" -// -// Types: -// - -struct request_of_phase_process_class {}; - -struct csXyz {}; - -struct Vec {}; - -struct cXyz { - /* 80266AE4 */ void operator+(Vec const&) const; - /* 80266B34 */ void operator-(Vec const&) const; - /* 80267128 */ void atan2sX_Z() const; - /* 80267150 */ void atan2sY_XZ() const; - /* 805CFAD4 */ void abs() const; - /* 805DCA0C */ cXyz(cXyz const&); - /* 805DC830 */ cXyz(); - /* 805DC968 */ ~cXyz(); - /* 805DC9C0 */ void operator=(cXyz const&); - /* 805DC9F0 */ void set(Vec const&); - /* 805DCA28 */ void zero(); -}; - -struct mDoMtx_stack_c { - /* 8000CD64 */ void transS(cXyz const&); - /* 8000CD9C */ void transM(f32, f32, f32); - /* 8000CE38 */ void scaleM(f32, f32, f32); - /* 8000CF44 */ void ZXYrotM(csXyz const&); - - static u8 now[48]; -}; - -struct mDoExt_morf_c { - /* 805CFBE8 */ void isStop(); -}; - -struct J3DMaterialTable {}; - -struct J3DAnmTextureSRTKey {}; - -struct mDoExt_btkAnm { - /* 8000D63C */ void init(J3DMaterialTable*, J3DAnmTextureSRTKey*, int, int, f32, s16, s16); - /* 8000D6D8 */ void entry(J3DMaterialTable*, f32); -}; - -struct J3DAnmTevRegKey {}; - -struct mDoExt_brkAnm { - /* 8000D70C */ void init(J3DMaterialTable*, J3DAnmTevRegKey*, int, int, f32, s16, s16); - /* 8000D7A8 */ void entry(J3DMaterialTable*, f32); -}; - -struct mDoExt_baseAnm { - /* 8000D428 */ void play(); -}; - -struct mDoExt_McaMorfCallBack2_c {}; - -struct mDoExt_McaMorfCallBack1_c {}; - -struct J3DAnmTransform {}; - -struct J3DModelData {}; - -struct Z2Creature {}; - -struct mDoExt_McaMorfSO { - /* 800107D0 */ mDoExt_McaMorfSO(J3DModelData*, mDoExt_McaMorfCallBack1_c*, - mDoExt_McaMorfCallBack2_c*, J3DAnmTransform*, int, f32, int, - int, Z2Creature*, u32, u32); - /* 80010E70 */ void setAnm(J3DAnmTransform*, int, f32, f32, f32, f32); - /* 800110B0 */ void play(u32, s8); - /* 80011154 */ void updateDL(); - /* 800111C0 */ void entryDL(); - /* 800111EC */ void modelCalc(); -}; - -struct fopAc_ac_c { - /* 80018B64 */ fopAc_ac_c(); -}; - -struct daPy_py_c { - /* 805DC9A4 */ void changeDemoPos0(cXyz const*); - /* 805DC9DC */ void changeDemoMode(u32, int, int, s16); -}; - -struct J3DModel {}; - -struct J3DJoint {}; - -struct daB_DS_c { - /* 805CB314 */ void ctrlJoint(J3DJoint*, J3DModel*); - /* 805CB4A4 */ void JointCallBack(J3DJoint*, int); - /* 805CB4F0 */ void draw(); - /* 805CBAC8 */ void setBck(int, u8, f32, f32); - /* 805CBB74 */ void setActionMode(int, int); - /* 805CBB80 */ void mSmokeSet(); - /* 805CBD00 */ void mHeadAngle_Clear(); - /* 805CBD64 */ void HandHitSoundSet(bool); - /* 805CBED0 */ void handSPosSet(int); - /* 805CC158 */ void hand_smokeSet(u8); - /* 805CC1C4 */ void mZsMoveChk(); - /* 805CC454 */ void mZsMoveChk_Guard(); - /* 805CC6F4 */ void mTrapScale(); - /* 805CC80C */ void mClearTrap(bool); - /* 805CC8A4 */ void mCreateTrap(bool); - /* 805CCEB4 */ void mChangeVer2(); - /* 805CD074 */ void damage_check(); - /* 805CD628 */ void neck_set(); - /* 805CD844 */ void mCutTypeCheck(); - /* 805CD8D8 */ void startDemoCheck(); - /* 805CDA08 */ void setYoMessage(int); - /* 805CDA44 */ void doYoMessage(); - /* 805CDAC0 */ void executeOpeningDemo(); - /* 805CFC8C */ void mHandBreathChk(); - /* 805D002C */ void executeWait(); - /* 805D0194 */ void executeCircle(); - /* 805D02F8 */ void mBreakBoneSUB(); - /* 805D0374 */ void damageSet(); - /* 805D03EC */ void damageHitCamera(); - /* 805D0584 */ void damageDownCheck(); - /* 805D074C */ void executeDamage(); - /* 805D1E30 */ void executeEtcDamage(); - /* 805D203C */ void breath_smokeSet(); - /* 805D226C */ void executeBreathAttack(); - /* 805D2520 */ void executeHandAttack(); - /* 805D272C */ void executeBreathSearch(); - /* 805D28D0 */ void executeBattle2OpeningDemo(); - /* 805D3900 */ void mFlyBMove(f32); - /* 805D39A4 */ void mFuwafuwaSet(bool); - /* 805D3D14 */ void mBattle2BreathFireSet(u32); - /* 805D3D80 */ void mNeckAngleSet(); - /* 805D3EA0 */ void mSetFirstPos(); - /* 805D3F90 */ void mChkScreenIn(); - /* 805D4054 */ void mRailInOutCheck(); - /* 805D41CC */ void executeBattle2Wait(); - /* 805D429C */ void mBattle2MoveFSet(); - /* 805D497C */ void executeBattle2FMove(); - /* 805D5040 */ void executeBattle2Tired(); - /* 805D52D4 */ void executeBattle2Damage(); - /* 805D60BC */ void mDeadMove(); - /* 805D6534 */ void executeBattle2Dead(); - /* 805D7C10 */ void executeBullet(); - /* 805D8078 */ void mBulletAction(); - /* 805D80F0 */ void mSoundSE_Set(); - /* 805D8D04 */ void action(); - /* 805D91A4 */ void mtx_set(); - /* 805D951C */ void cc_set(); - /* 805D9A40 */ void cc_etc_set(); - /* 805D9B74 */ void mBattle2Action(); - /* 805D9CFC */ void mBattle2_spinner_damage_check(); - /* 805D9FF4 */ void mBattle2_damage_check(); - /* 805DA584 */ void mBattle2_mtx_set(); - /* 805DA9A4 */ void mBattle2_cc_etc_set(); - /* 805DAA98 */ void mBattle2_cc_set(); - /* 805DADC4 */ void execute(); - /* 805DB1AC */ void _delete(); - /* 805DB264 */ void CreateHeap(); - /* 805DB974 */ void create(); - /* 805DC1E8 */ daB_DS_c(); -}; - -struct daB_DS_HIO_c { - /* 805CB22C */ daB_DS_HIO_c(); - /* 805DC89C */ ~daB_DS_HIO_c(); -}; - -struct dVibration_c { - /* 8006FA24 */ void StartShock(int, int, cXyz); - /* 8006FB10 */ void StartQuake(int, int, cXyz); - /* 8006FD94 */ void StopQuake(int); -}; - -struct dSv_restart_c { - /* 80034F80 */ void setRoom(cXyz const&, s16, s8); -}; - -struct dSv_memBit_c { - /* 80034934 */ void isDungeonItem(int) const; -}; - -struct dSv_info_c { - /* 80035200 */ void onSwitch(int, int); - /* 800352B0 */ void offSwitch(int, int); -}; - -struct dSv_event_c { - /* 8003498C */ void onEventBit(u16); -}; - -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); - }; - - /* 8004C218 */ void setHitMark(u16, fopAc_ac_c*, cXyz const*, csXyz const*, cXyz const*, u32); - /* 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); - /* 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); - - static u8 mParticleTracePCB[4 + 4 /* padding */]; -}; - -struct dMsgFlow_c { - /* 80249F00 */ dMsgFlow_c(); -}; - -struct dEvt_control_c { - /* 80042468 */ void reset(); - /* 80042914 */ void setSkipProc(void*, int (*)(void*, int), int); -}; - -struct dDlst_shadowControl_c { - static u8 mSimpleTexObj[32]; -}; - -struct dCcU_AtInfo {}; - -struct dCcD_Stts { - /* 80083860 */ void Init(int, int, fopAc_ac_c*); -}; - -struct dCcD_SrcSph {}; - -struct dCcD_SrcCyl {}; - -struct dCcD_Sph { - /* 80084A34 */ void Set(dCcD_SrcSph const&); - /* 805DC514 */ dCcD_Sph(); - /* 805DC598 */ ~dCcD_Sph(); -}; - -struct dCcD_GStts { - /* 80083760 */ dCcD_GStts(); - /* 80083830 */ void Move(); - /* 805DC6F4 */ ~dCcD_GStts(); -}; - -struct dCcD_GObjInf { - /* 80083A28 */ dCcD_GObjInf(); - /* 800840E4 */ ~dCcD_GObjInf(); - /* 80084460 */ void ChkTgHit(); - /* 800844F8 */ void GetTgHitObj(); - /* 800845B0 */ void getHitSeID(u8, int); -}; - -struct dCcD_Cyl { - /* 800848B4 */ void Set(dCcD_SrcCyl const&); -}; - -struct dCamera_c { - /* 801614AC */ void Start(); - /* 801614D0 */ void Stop(); - /* 8016300C */ void SetTrimSize(s32); - /* 80180AE0 */ void Set(cXyz, cXyz, f32, s16); - /* 80180AA8 */ void Set(cXyz, cXyz); - /* 80180C18 */ void Reset(cXyz, cXyz); - /* 80181170 */ void StartBlure(int, fopAc_ac_c*, f32, f32); - /* 80181E64 */ void Eye(); - /* 80181E98 */ void Center(); -}; - -struct dBgS_PolyPassChk { - /* 80078E68 */ void SetObj(); -}; - -struct dBgS_ObjAcch { - /* 805DC750 */ ~dBgS_ObjAcch(); -}; - -struct dBgS_LinChk { - /* 80077C68 */ dBgS_LinChk(); - /* 80077CDC */ ~dBgS_LinChk(); - /* 80077D64 */ void Set(cXyz const*, cXyz const*, fopAc_ac_c const*); -}; - -struct dBgS_GndChk { - /* 8007757C */ dBgS_GndChk(); - /* 800775F0 */ ~dBgS_GndChk(); -}; - -struct dBgS_AcchCir { - /* 80075EAC */ dBgS_AcchCir(); - /* 80075F58 */ void SetWall(f32, f32); - /* 805DC7C0 */ ~dBgS_AcchCir(); -}; - -struct dBgS {}; - -struct dBgS_Acch { - /* 80075F94 */ ~dBgS_Acch(); - /* 800760A0 */ dBgS_Acch(); - /* 80076248 */ void Set(cXyz*, cXyz*, fopAc_ac_c*, int, dBgS_AcchCir*, cXyz*, csXyz*, csXyz*); - /* 80076AAC */ void CrrPos(dBgS&); - /* 80077114 */ void SetGroundUpY(f32); -}; - -struct cM3dGSph { - /* 8026F648 */ void SetC(cXyz const&); - /* 8026F708 */ void SetR(f32); - /* 805DC664 */ ~cM3dGSph(); -}; - -struct cM3dGCyl { - /* 8026F1DC */ void SetC(cXyz const&); - /* 8026F1F8 */ void SetH(f32); - /* 8026F200 */ void SetR(f32); - /* 805DC4CC */ ~cM3dGCyl(); -}; - -struct cM3dGCir { - /* 8026EF18 */ ~cM3dGCir(); -}; - -struct cM3dGAab { - /* 805DC6AC */ ~cM3dGAab(); -}; - -struct cCcD_Obj {}; - -struct cCcS { - /* 80264BA8 */ void Set(cCcD_Obj*); -}; - -struct cCcD_GStts { - /* 805DC854 */ ~cCcD_GStts(); -}; - -struct cBgS_PolyInfo { - /* 802680B0 */ ~cBgS_PolyInfo(); -}; - -struct cBgS_LinChk {}; - -struct cBgS_GndChk { - /* 80267D28 */ void SetPos(cXyz const*); -}; - -struct cBgS { - /* 800743B4 */ void LineCross(cBgS_LinChk*); - /* 800744A0 */ void GroundCross(cBgS_GndChk*); -}; - -struct _GXTexObj {}; - -struct Z2StatusMgr { - /* 802B61E8 */ void setDemoName(char*); -}; - -struct Z2SeqMgr { - /* 802AF010 */ void bgmStart(u32, u32, s32); - /* 802AF408 */ void bgmStop(u32, s32); - /* 802AF49C */ void subBgmStart(u32); - /* 802AF884 */ void subBgmStop(); - /* 802AFB94 */ void bgmStreamPrepare(u32); - /* 802AFE18 */ void bgmStreamPlay(); - /* 802AFEDC */ void bgmStreamStop(u32); - /* 802AFF8C */ void changeBgmStatus(s32); -}; - -struct JAISoundID {}; - -struct Z2SeMgr { - /* 802AB984 */ void seStart(JAISoundID, Vec const*, u32, s8, f32, f32, f32, f32, u8); - /* 802AC50C */ void seStartLevel(JAISoundID, Vec const*, u32, s8, f32, f32, f32, f32, u8); -}; - -struct Z2CreatureEnemy { - /* 802C0F64 */ Z2CreatureEnemy(); - /* 802C1094 */ void init(Vec*, Vec*, u8, u8); -}; - -struct Z2AudioMgr { - static u8 mAudioMgrPtr[4 + 4 /* padding */]; -}; - -struct JPABaseEmitter { - /* 805CFA08 */ void setGlobalSRTMatrix(f32 const (*)[4]); -}; - -struct JMath { - static u8 sincosTable_[65536]; -}; - -struct JGeometry { - template - struct TVec3 {}; - /* TVec3 */ - struct TVec3__template0 {}; -}; - -struct J3DSys { - static u8 mCurrentMtx[48]; -}; - -struct J3DFrameCtrl { - /* 803283FC */ void init(s16); - /* 8032842C */ void checkPass(f32); - /* 805DB90C */ ~J3DFrameCtrl(); -}; - // // Forward References: // @@ -538,6 +128,15 @@ extern "C" void set__4cXyzFRC3Vec(); extern "C" void __ct__4cXyzFRC4cXyz(); extern "C" void zero__4cXyzFv(); extern "C" extern char const* const d_a_b_ds__stringBase0; +extern void* __vt__12dBgS_AcchCir[3]; +extern void* __vt__10cCcD_GStts[3]; +extern void* __vt__10dCcD_GStts[3]; +extern void* __vt__8cM3dGCyl[3]; +extern void* __vt__8cM3dGSph[3]; +extern void* __vt__8cM3dGAab[3]; +extern void* __vt__12dBgS_ObjAcch[9]; +extern void* __vt__12J3DFrameCtrl[3]; +extern void* __vt__12daB_DS_HIO_c[3]; // // External References: @@ -693,11 +292,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 PSMTXMultVec(); -extern "C" void PSVECAdd(); -extern "C" void PSVECScale(); -extern "C" void PSVECSquareMag(); extern "C" void __construct_array(); extern "C" void _savegpr_19(); extern "C" void _savegpr_20(); @@ -721,9 +315,6 @@ extern "C" void _restgpr_26(); extern "C" void _restgpr_27(); extern "C" void _restgpr_28(); extern "C" void _restgpr_29(); -extern "C" void abs(); -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__8dCcD_Cyl[36]; extern "C" extern void* __vt__9dCcD_Stts[11]; @@ -732,17 +323,11 @@ extern "C" extern void* __vt__12cCcD_CylAttr[25]; extern "C" extern void* __vt__14cCcD_ShapeAttr[22]; extern "C" extern void* __vt__9cCcD_Stts[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" extern u8 j3dSys[284]; extern "C" u8 mCurrentMtx__6J3DSys[48]; extern "C" u8 sincosTable___5JMath[65536]; -extern "C" extern void* calc_mtx[1 + 1 /* padding */]; -extern "C" extern u32 __float_nan; extern "C" extern u8 struct_80450C98[4]; extern "C" u8 mParticleTracePCB__13dPa_control_c[4 + 4 /* padding */]; -extern "C" extern u8 pauseTimer__9dScnPly_c[4]; extern "C" u8 mAudioMgrPtr__10Z2AudioMgr[4 + 4 /* padding */]; extern "C" void __register_global_object(); @@ -898,77 +483,103 @@ SECTION_DATA static u8 eff_id[6 + 2 /* padding */] = { }; #pragma pop -/* 805DD280-805DD2C0 000038 0040+00 0/1 0/0 0/0 .data cc_ds_week_src__22@unnamed@d_a_b_ds_cpp@ */ +namespace { #pragma push #pragma force_active on -SECTION_DATA static u8 data_805DD280[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFB, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x20, 0x00, 0x00, + +/* 805DD280-805DD2C0 000038 0040+00 0/1 0/0 0/0 .data cc_ds_week_src__22@unnamed@d_a_b_ds_cpp@ */ +static dCcD_SrcSph cc_ds_week_src = { + { + 0, {{0, 0, 0}, {0x00fbfdff, 0x43}, {0x75}}, // mObj + {0, 0, 0, 0, 0}, // mGObjAt + {0, 2, 0, 0, 0x303}, // mGObjTg + {0}, // mGObjCo + }, // mObjInf + {{ + {0.0f, 0.0f, 0.0f}, // mCenter + 40.0f, // mRadius + }} // mSph }; -#pragma pop /* 805DD2C0-805DD300 000078 0040+00 0/1 0/0 0/0 .data cc_ds_head_src__22@unnamed@d_a_b_ds_cpp@ */ -#pragma push -#pragma force_active on -SECTION_DATA static u8 data_805DD2C0[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xD8, 0xFB, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x55, 0x0A, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x20, 0x00, 0x00, +static dCcD_SrcSph cc_ds_head_src = { + { + 0, {{0, 0, 0}, {0xd8fbfdff, 3}, {0x55}}, // mObj + {0xa, 0, 0, 0, 0}, // mGObjAt + {0, 2, 0, 0, 0x303}, // mGObjTg + {0}, // mGObjCo + }, // mObjInf + {{ + {0.0f, 0.0f, 0.0f}, // mCenter + 40.0f, // mRadius + }} // mSph }; -#pragma pop /* 805DD300-805DD340 0000B8 0040+00 0/0 0/0 0/0 .data cc_ds_body_src__22@unnamed@d_a_b_ds_cpp@ */ -#pragma push -#pragma force_active on -SECTION_DATA static u8 data_805DD300[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xD8, 0xFB, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x20, 0x00, 0x00, +static dCcD_SrcSph cc_ds_body_src = { + { + 0, {{0, 0, 0}, {0xd8fbfdff, 0x43}, {0x75}}, // mObj + {0, 0, 0, 0, 0}, // mGObjAt + {0xa, 2, 0, 0, 0x303}, // mGObjTg + {0}, // mGObjCo + }, // mObjInf + {{ + {0.0f, 0.0f, 0.0f}, // mCenter + 40.0f, // mRadius + }} // mSph }; -#pragma pop /* 805DD340-805DD384 0000F8 0044+00 0/1 0/0 0/0 .data cc_ds_backbone_src__22@unnamed@d_a_b_ds_cpp@ */ -#pragma push -#pragma force_active on -SECTION_DATA static u8 data_805DD340[68] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xD8, 0xFB, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x55, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x41, 0xF0, 0x00, 0x00, 0x43, 0x02, 0x00, 0x00, +static dCcD_SrcCyl cc_ds_backbone_src = { + { + 0, {{0, 0, 0}, {0xd8fbfdff, 0x43}, {0x55}}, // mObj + {0, 0, 0, 0, 0}, // mGObjAt + {0xa, 2, 0, 0, 0x307}, // mGObjTg + {0}, // mGObjCo + }, // mObjInf + { + {0.0f, 0.0f, 0.0f}, // mCenter + 30.0f, // mRadius + 130.0f, // mHeight + } // mCyl }; -#pragma pop /* 805DD384-805DD3C8 00013C 0044+00 0/1 0/0 0/0 .data * cc_ds_hand_at_cyl_src__22@unnamed@d_a_b_ds_cpp@ */ -#pragma push -#pragma force_active on -SECTION_DATA static u8 data_805DD384[68] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1F, 0xD8, 0xFB, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x75, - 0x0A, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x41, 0xF0, 0x00, 0x00, 0x43, 0x02, 0x00, 0x00, +static dCcD_SrcCyl cc_ds_hand_at_cyl_src = { + { + 0, {{0x100000, 4, 0x1f}, {0xd8fbfdff, 3}, {0x75}}, // mObj + {0xa, 0, 0xe, 0, 0}, // mGObjAt + {0, 2, 0, 0, 0x307}, // mGObjTg + {0}, // mGObjCo + }, // mObjInf + { + {0.0f, 0.0f, 0.0f}, // mCenter + 30.0f, // mRadius + 130.0f, // mHeight + } // mCyl }; -#pragma pop /* 805DD3C8-805DD408 000180 0040+00 0/1 0/0 0/0 .data * cc_ds_breath_at_src__22@unnamed@d_a_b_ds_cpp@ */ -#pragma push -#pragma force_active on -SECTION_DATA static u8 data_805DD3C8[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x0D, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x20, 0x00, 0x00, +static dCcD_SrcSph cc_ds_breath_at_src = { + { + 0, {{0x100000, 3, 0xd}, {0, 0}, {0}}, // mObj + {0xd, 0, 0xd, 0, 0}, // mGObjAt + {0, 0, 0, 0, 0}, // mGObjTg + {0}, // mGObjCo + }, // mObjInf + {{ + {0.0f, 0.0f, 0.0f}, // mCenter + 40.0f, // mRadius + }} // mSph }; -#pragma pop +#pragma pop +}; // namespace + +#ifndef NONMATCHING /* 805DD408-805DD470 -00001 0068+00 1/1 0/0 0/0 .data @4017 */ SECTION_DATA static void* lit_4017[26] = { (void*)(((char*)ctrlJoint__8daB_DS_cFP8J3DJointP8J3DModel) + 0x74), @@ -1000,7 +611,7 @@ SECTION_DATA static void* lit_4017[26] = { }; /* 805DD470-805DD474 000228 0004+00 5/6 0/0 0/0 .data eff_smoke_id */ -SECTION_DATA static u32 eff_smoke_id = 0x8BC48BC5; +SECTION_DATA static u16 eff_smoke_id[2] = {0x8BC4, 0x8BC5}; /* 805DD474-805DD480 00022C 000A+02 1/1 0/0 0/0 .data mGuardDt$4559 */ SECTION_DATA static u8 mGuardDt[10 + 2 /* padding */] = { @@ -1259,11 +870,9 @@ SECTION_DATA static void* lit_7939[17] = { }; /* 805DD680-805DD684 000438 0004+00 1/1 0/0 0/0 .data eff_Demo_sasi_id$9100 */ -SECTION_DATA static u8 eff_Demo_sasi_id[4] = { - 0x8B, - 0xF8, - 0x8B, - 0xF9, +SECTION_DATA static u16 eff_Demo_sasi_id[2] = { + 0x8BF8, + 0x8BF9, }; /* 805DD684-805DD818 -00001 0194+00 1/1 0/0 0/0 .data @9591 */ @@ -1468,99 +1077,42 @@ SECTION_DATA static u8 head2_setRdt[20] = { 0x43, 0x96, 0x00, 0x00, 0x43, 0xAF, 0x00, 0x00, 0x43, 0x87, 0x00, 0x00, 0x43, 0x3E, 0x00, 0x00, 0x43, 0x3E, 0x00, 0x00, }; - -/* 805DD994-805DD9B4 -00001 0020+00 1/0 0/0 0/0 .data l_daB_DS_Method */ -SECTION_DATA static void* l_daB_DS_Method[8] = { - (void*)daB_DS_Create__FP8daB_DS_c, - (void*)daB_DS_Delete__FP8daB_DS_c, - (void*)daB_DS_Execute__FP8daB_DS_c, - (void*)daB_DS_IsDelete__FP8daB_DS_c, - (void*)daB_DS_Draw__FP8daB_DS_c, - (void*)NULL, - (void*)NULL, - (void*)NULL, -}; - -/* 805DD9B4-805DD9E4 -00001 0030+00 0/0 0/0 1/0 .data g_profile_B_DS */ -SECTION_DATA extern void* g_profile_B_DS[12] = { - (void*)0xFFFFFFFD, (void*)0x0004FFFD, - (void*)0x00F60000, (void*)&g_fpcLf_Method, - (void*)0x00002F28, (void*)NULL, - (void*)NULL, (void*)&g_fopAc_Method, - (void*)0x00DC0000, (void*)&l_daB_DS_Method, - (void*)0x04040000, (void*)0x020E0000, -}; - -/* 805DD9E4-805DD9F0 00079C 000C+00 1/1 0/0 0/0 .data __vt__12dBgS_AcchCir */ -SECTION_DATA extern void* __vt__12dBgS_AcchCir[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__12dBgS_AcchCirFv, -}; - -/* 805DD9F0-805DD9FC 0007A8 000C+00 2/2 0/0 0/0 .data __vt__10cCcD_GStts */ -SECTION_DATA extern void* __vt__10cCcD_GStts[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__10cCcD_GSttsFv, -}; - -/* 805DD9FC-805DDA08 0007B4 000C+00 1/1 0/0 0/0 .data __vt__10dCcD_GStts */ -SECTION_DATA extern void* __vt__10dCcD_GStts[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__10dCcD_GSttsFv, -}; - -/* 805DDA08-805DDA14 0007C0 000C+00 2/2 0/0 0/0 .data __vt__8cM3dGCyl */ -SECTION_DATA extern void* __vt__8cM3dGCyl[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__8cM3dGCylFv, -}; - -/* 805DDA14-805DDA20 0007CC 000C+00 4/4 0/0 0/0 .data __vt__8cM3dGSph */ -SECTION_DATA extern void* __vt__8cM3dGSph[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__8cM3dGSphFv, -}; - -/* 805DDA20-805DDA2C 0007D8 000C+00 4/4 0/0 0/0 .data __vt__8cM3dGAab */ -SECTION_DATA extern void* __vt__8cM3dGAab[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__8cM3dGAabFv, -}; - -/* 805DDA2C-805DDA50 0007E4 0024+00 2/2 0/0 0/0 .data __vt__12dBgS_ObjAcch */ -SECTION_DATA extern void* __vt__12dBgS_ObjAcch[9] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__12dBgS_ObjAcchFv, - (void*)NULL, - (void*)NULL, - (void*)func_805DC960, - (void*)NULL, - (void*)NULL, - (void*)func_805DC958, -}; - -/* 805DDA50-805DDA5C 000808 000C+00 2/2 0/0 0/0 .data __vt__12J3DFrameCtrl */ -SECTION_DATA extern void* __vt__12J3DFrameCtrl[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__12J3DFrameCtrlFv, -}; - -/* 805DDA5C-805DDA68 000814 000C+00 2/2 0/0 0/0 .data __vt__12daB_DS_HIO_c */ -SECTION_DATA extern void* __vt__12daB_DS_HIO_c[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__12daB_DS_HIO_cFv, -}; +#endif /* 805CB22C-805CB314 0000EC 00E8+00 1/1 0/0 0/0 .text __ct__12daB_DS_HIO_cFv */ +#ifdef NONMATCHING +// matches with literals +daB_DS_HIO_c::daB_DS_HIO_c() { + field_0x04 = -1; + mModelSize = 1.0f; + mHandRange = 2000.0f; + mBreathRange = 3900.0f; + mGuardSpawnRange = 2000.0f; + mNoSearchRange = 2500.0f; + mP2MoveAxis = 2800.0f; + mP2AttackHeight = 700.0f; + mP2ModelSize = 5.0f; + mP2FallTime = 250; + mPedestalFallTime = 200; + mSandFallWaitTime = 50; + mP2BulletFireTime = 5; + mP2OuterWallAttackTime = 850; + mP2TrapCreateWaitTime1 = 0; + mP2TrapCreateWaitTime2 = 300; + mP2TrapCreateID1 = 70; + mP2TrapCreateID2 = 10; + mHintTime1 = 600; + mHintTime2 = 600; + mP2OuterWallTrapSpeed = 12; + mTowerTrapSpeed = 14; + mP2ApproachAccel = 5; + mP2ApproachSpeedMax = 100; + mP2ApproachAfterBullet = 0x400; + mP2ApproachDist = 0x1800; + mP2Health = 1080; + mP2HealthDebugOn = false; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1569,214 +1121,12 @@ asm daB_DS_HIO_c::daB_DS_HIO_c() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__ct__12daB_DS_HIO_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DDA70-805DDA74 000008 0001+03 8/8 0/0 0/0 .bss @1109 */ static u8 lit_1109[1 + 3 /* padding */]; -/* 805CB314-805CB4A4 0001D4 0190+00 2/1 0/0 0/0 .text ctrlJoint__8daB_DS_cFP8J3DJointP8J3DModel */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::ctrlJoint(J3DJoint* param_0, J3DModel* param_1) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/ctrlJoint__8daB_DS_cFP8J3DJointP8J3DModel.s" -} -#pragma pop - -/* 805CB4A4-805CB4F0 000364 004C+00 1/1 0/0 0/0 .text JointCallBack__8daB_DS_cFP8J3DJointi */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::JointCallBack(J3DJoint* param_0, int param_1) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/JointCallBack__8daB_DS_cFP8J3DJointi.s" -} -#pragma pop - -/* ############################################################################################## */ -/* 805DCA98-805DCA9C 000044 0004+00 0/3 0/0 0/0 .rodata @4267 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4267 = 120.0f; -COMPILER_STRIP_GATE(0x805DCA98, &lit_4267); -#pragma pop - -/* 805DCA9C-805DCAA0 000048 0004+00 0/1 0/0 0/0 .rodata @4268 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4268 = 6000.0f; -COMPILER_STRIP_GATE(0x805DCA9C, &lit_4268); -#pragma pop - -/* 805DCAA0-805DCAA4 00004C 0004+00 0/6 0/0 0/0 .rodata @4269 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4269 = 255.0f; -COMPILER_STRIP_GATE(0x805DCAA0, &lit_4269); -#pragma pop - -/* 805DCAA4-805DCAA8 000050 0004+00 0/5 0/0 0/0 .rodata @4270 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4270 = 1000.0f; -COMPILER_STRIP_GATE(0x805DCAA4, &lit_4270); -#pragma pop - -/* 805DCAA8-805DCAAC 000054 0004+00 0/1 0/0 0/0 .rodata @4271 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4271 = 7000.0f; -COMPILER_STRIP_GATE(0x805DCAA8, &lit_4271); -#pragma pop - -/* 805CB4F0-805CBAA8 0003B0 05B8+00 1/1 0/0 0/0 .text draw__8daB_DS_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::draw() { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/draw__8daB_DS_cFv.s" -} -#pragma pop - -/* 805CBAA8-805CBAC8 000968 0020+00 1/0 0/0 0/0 .text daB_DS_Draw__FP8daB_DS_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daB_DS_Draw(daB_DS_c* param_0) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Draw__FP8daB_DS_c.s" -} -#pragma pop - -/* ############################################################################################## */ -/* 805DCAAC-805DCAB0 000058 0004+00 1/6 0/0 0/0 .rodata @4285 */ -SECTION_RODATA static f32 const lit_4285 = -1.0f; -COMPILER_STRIP_GATE(0x805DCAAC, &lit_4285); - -/* 805DD22C-805DD22C 0007D8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_805DD22C = "B_DS"; -#pragma pop - -/* 805CBAC8-805CBB74 000988 00AC+00 18/18 0/0 0/0 .text setBck__8daB_DS_cFiUcff */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::setBck(int param_0, u8 param_1, f32 param_2, f32 param_3) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setBck__8daB_DS_cFiUcff.s" -} -#pragma pop - -/* 805CBB74-805CBB80 000A34 000C+00 18/18 0/0 0/0 .text setActionMode__8daB_DS_cFii */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::setActionMode(int param_0, int param_1) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setActionMode__8daB_DS_cFii.s" -} -#pragma pop - -/* ############################################################################################## */ -/* 805DCAB0-805DCAB4 00005C 0004+00 1/9 0/0 0/0 .rodata @4339 */ -SECTION_RODATA static f32 const lit_4339 = -1000000000.0f; -COMPILER_STRIP_GATE(0x805DCAB0, &lit_4339); - -/* 805CBB80-805CBD00 000A40 0180+00 1/1 0/0 0/0 .text mSmokeSet__8daB_DS_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::mSmokeSet() { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mSmokeSet__8daB_DS_cFv.s" -} -#pragma pop - -/* 805CBD00-805CBD64 000BC0 0064+00 3/3 0/0 0/0 .text mHeadAngle_Clear__8daB_DS_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::mHeadAngle_Clear() { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mHeadAngle_Clear__8daB_DS_cFv.s" -} -#pragma pop - -/* 805CBD64-805CBED0 000C24 016C+00 1/1 0/0 0/0 .text HandHitSoundSet__8daB_DS_cFb */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::HandHitSoundSet(bool param_0) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/HandHitSoundSet__8daB_DS_cFb.s" -} -#pragma pop - -/* ############################################################################################## */ -/* 805DCAB4-805DCAB8 000060 0004+00 0/5 0/0 0/0 .rodata @4465 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4465 = 800.0f; -COMPILER_STRIP_GATE(0x805DCAB4, &lit_4465); -#pragma pop - -/* 805DCAB8-805DCABC 000064 0004+00 1/5 0/0 0/0 .rodata @4466 */ -SECTION_RODATA static f32 const lit_4466 = 200.0f; -COMPILER_STRIP_GATE(0x805DCAB8, &lit_4466); - -/* 805DCABC-805DCAC0 000068 0004+00 0/2 0/0 0/0 .rodata @4467 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4467 = 400.0f; -COMPILER_STRIP_GATE(0x805DCABC, &lit_4467); -#pragma pop - -/* 805CBED0-805CC158 000D90 0288+00 1/1 0/0 0/0 .text handSPosSet__8daB_DS_cFi */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::handSPosSet(int param_0) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/handSPosSet__8daB_DS_cFi.s" -} -#pragma pop - -/* 805CC158-805CC1C4 001018 006C+00 8/8 0/0 0/0 .text hand_smokeSet__8daB_DS_cFUc */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::hand_smokeSet(u8 param_0) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/hand_smokeSet__8daB_DS_cFUc.s" -} -#pragma pop - -/* ############################################################################################## */ -/* 805DCAC0-805DCAC4 00006C 0004+00 0/3 0/0 0/0 .rodata @4551 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4551 = 1500.0f; -COMPILER_STRIP_GATE(0x805DCAC0, &lit_4551); -#pragma pop - -/* 805DCAC4-805DCAC8 000070 0004+00 0/10 0/0 0/0 .rodata @4552 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4552 = 500.0f; -COMPILER_STRIP_GATE(0x805DCAC4, &lit_4552); -#pragma pop - -/* 805DCAC8-805DCACC 000074 0004+00 0/1 0/0 0/0 .rodata @4553 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4553 = 8192.0f; -COMPILER_STRIP_GATE(0x805DCAC8, &lit_4553); -#pragma pop - /* 805DDA74-805DDA78 00000C 0001+03 0/0 0/0 0/0 .bss @1107 */ #pragma push #pragma force_active on @@ -1864,15 +1214,594 @@ static u8 lit_1010[1 + 3 /* padding */]; /* 805DDAAC-805DDAB0 -00001 0004+00 2/2 0/0 0/0 .bss None */ /* 805DDAAC 0001+00 data_805DDAAC @1009 */ /* 805DDAAD 0003+00 data_805DDAAD None */ -static u8 struct_805DDAAC[4]; +static u8 struct_805DDAAC; +static bool hioInit; + +#ifndef NONMATCHING /* 805DDAB0-805DDABC 000048 000C+00 1/1 0/0 0/0 .bss @3948 */ static u8 lit_3948[12]; +#endif /* 805DDABC-805DDB0C 000054 0050+00 21/23 0/0 0/0 .bss l_HIO */ +#ifdef NONMATCHING +static daB_DS_HIO_c l_HIO; +#else static u8 l_HIO[80]; +#endif + +/* 805DDB0C-805DDB10 -00001 0004+00 0/1 0/0 0/0 .bss None */ +#pragma push +#pragma force_active on +/* 805DDB0C 0002+00 data_805DDB0C handL_ang */ +/* 805DDB0E 0002+00 data_805DDB0E handR_ang */ +#ifdef NONMATCHING +static s16 handL_ang; +static s16 handR_ang; +#else +u8 struct_805DDB0C[4]; +#endif +#pragma pop + +/* 805DDB10-805DDB14 -00001 0004+00 3/4 0/0 0/0 .bss None */ +/* 805DDB10 0002+00 data_805DDB10 handX_ang */ +/* 805DDB12 0002+00 breathTimerBase None */ +#ifdef NONMATCHING +static s16 handX_ang; +static u8 breathTimerBase; +#else +u8 struct_805DDB10[4]; +#endif + +/* 805CB314-805CB4A4 0001D4 0190+00 2/1 0/0 0/0 .text ctrlJoint__8daB_DS_cFP8J3DJointP8J3DModel */ +#ifdef NONMATCHING +// matches once the above bss data is correct +int daB_DS_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) { + u16 joint_no = i_joint->getJntNo(); + mDoMtx_stack_c::copy(i_model->i_getAnmMtx(joint_no)); + + if (mBossPhase == 0) { + csXyz angle; + switch (joint_no) { + case 4: + angle.x = 0; + angle.y = mHeadAngle.y >> 1; + angle.z = mHeadAngle.x; + mDoMtx_stack_c::ZXYrotM(angle); + break; + + case 6: + angle.x = 0; + angle.y = mHeadAngle.y >> 1; + angle.z = mHeadAngle.x; + mDoMtx_stack_c::ZXYrotM(angle); + break; + + case 9: + mDoMtx_stack_c::YrotM(handL_ang); + mDoMtx_stack_c::XrotM(handX_ang); + break; + + case 10: + mDoMtx_stack_c::YrotM(-handL_ang); + break; + + case 28: + mDoMtx_stack_c::YrotM(-handR_ang); + mDoMtx_stack_c::XrotM(-handX_ang); + break; + + case 29: + mDoMtx_stack_c::YrotM(handR_ang); + break; + } + } + + i_model->i_setAnmMtx(joint_no, mDoMtx_stack_c::get()); + MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + return 1; +} +#else +#pragma push +#pragma optimization_level 0 +#pragma optimizewithasm off +asm int daB_DS_c::ctrlJoint(J3DJoint* param_0, J3DModel* param_1) { + nofralloc +#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/ctrlJoint__8daB_DS_cFP8J3DJointP8J3DModel.s" +} +#pragma pop +#endif + +/* 805CB4A4-805CB4F0 000364 004C+00 1/1 0/0 0/0 .text JointCallBack__8daB_DS_cFP8J3DJointi */ +int daB_DS_c::JointCallBack(J3DJoint* i_joint, int param_1) { + if (param_1 == 0) { + daB_DS_c* _this = (daB_DS_c*)j3dSys.getModel()->getUserArea(); + if (_this != NULL) { + _this->ctrlJoint(i_joint, j3dSys.getModel()); + } + } + return 1; +} + +/* ############################################################################################## */ +/* 805DCA98-805DCA9C 000044 0004+00 0/3 0/0 0/0 .rodata @4267 */ +#pragma push +#pragma force_active on +SECTION_RODATA static f32 const lit_4267 = 120.0f; +COMPILER_STRIP_GATE(0x805DCA98, &lit_4267); +#pragma pop + +/* 805DCA9C-805DCAA0 000048 0004+00 0/1 0/0 0/0 .rodata @4268 */ +#pragma push +#pragma force_active on +SECTION_RODATA static f32 const lit_4268 = 6000.0f; +COMPILER_STRIP_GATE(0x805DCA9C, &lit_4268); +#pragma pop + +/* 805DCAA0-805DCAA4 00004C 0004+00 0/6 0/0 0/0 .rodata @4269 */ +#pragma push +#pragma force_active on +SECTION_RODATA static f32 const lit_4269 = 255.0f; +COMPILER_STRIP_GATE(0x805DCAA0, &lit_4269); +#pragma pop + +/* 805DCAA4-805DCAA8 000050 0004+00 0/5 0/0 0/0 .rodata @4270 */ +#pragma push +#pragma force_active on +SECTION_RODATA static f32 const lit_4270 = 1000.0f; +COMPILER_STRIP_GATE(0x805DCAA4, &lit_4270); +#pragma pop + +/* 805DCAA8-805DCAAC 000054 0004+00 0/1 0/0 0/0 .rodata @4271 */ +#pragma push +#pragma force_active on +SECTION_RODATA static f32 const lit_4271 = 7000.0f; +COMPILER_STRIP_GATE(0x805DCAA8, &lit_4271); +#pragma pop + +/* 805CB4F0-805CBAA8 0003B0 05B8+00 1/1 0/0 0/0 .text draw__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +int daB_DS_c::draw() { + if (mType == BULLET_A || mType == BULLET_B || mType == BULLET_C || mBossPhase == 100) { + return 1; + } + + J3DModel* model = mpMorf->getModel(); + g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType_MAJI(model->mModelData, &tevStr); + J3DModelData* model_data = model->getModelData(); + + if (mType == PHASE_2) { + if (!mDead) { + if (model_data->getMaterialNodePointer(2) != NULL) { + model_data->getMaterialNodePointer(2)->getTevColor(2)->a = (u8)field_0x7e8; + model_data->getMaterialNodePointer(1)->getTevKColor(1)->a = field_0x7ec; + } + + mpMorf->entryDL(); + + cXyz shadow_pos; + shadow_pos.set(current.pos.x, current.pos.y + 120.0f, current.pos.z); + tevStr.field_0x344 = field_0x7f8; + mShadowKey = dComIfGd_setShadow(mShadowKey, 0, model, &shadow_pos, 6000.0f, 0.0f, + current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr, + 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); + } + + if (!mNoDrawSword) { + J3DModel* sword_model = mpSwordMorf->getModel(); + g_env_light.settingTevStruct(0, &mSwordPos, &tevStr); + g_env_light.setLightTevColorType_MAJI(sword_model->mModelData, &tevStr); + mpSwordBrkAnm->entry(sword_model->getModelData()); + mpSwordMorf->entryDL(); + } + + if (mPlayPatternAnm) { + mpPatternBrkAnm->entry(mpPatternModel->getModelData()); + mpPatternBtkAnm->entry(mpPatternModel->getModelData()); + mDoExt_modelUpdateDL(mpPatternModel); + } + + return 1; + } else { + if (model_data->getMaterialNodePointer(2) != NULL) { + model_data->getMaterialNodePointer(2)->getTevColor(2)->a = (u8)field_0x7e8; + model_data->getMaterialNodePointer(1)->getTevKColor(1)->a = field_0x7ec; + } + + u8 ivar12 = 0; + if (mBossPhase != 0) { + ivar12 = 6; + } else if (mBackboneJoint == 1) { + ivar12 = 4; + } else if (mBackboneJoint == 2) { + ivar12 = 5; + } + + if (field_0x7dc[mBackboneJoint] != 255.0f) { + J3DMaterial* material = + model->getModelData()->getMaterialNodePointer((u8)(mBackboneJoint + 4)); + if (material != NULL) { + material->getTevKColor(1)->a = field_0x7dc[mBackboneJoint]; + } + } + + if (mBackboneJoint != 0 && mBackboneJoint < 3) { + for (int i = 4; i < ivar12 + 1; i++) { + J3DShape* shape = + mpMorf->getModel()->getModelData()->getMaterialNodePointer((u8)i)->getShape(); + if (shape != NULL) { + shape->hide(); + } + } + } else { + for (int i = 4; i < 7; i++) { + J3DShape* shape = + mpMorf->getModel()->getModelData()->getMaterialNodePointer((u8)i)->getShape(); + if (shape != NULL) { + shape->show(); + } + } + } + + mpMorf->entryDL(); + + if (!mNoDrawSword) { + J3DModel* sword_model = mpSwordMorf->getModel(); + g_env_light.settingTevStruct(0, &mSwordPos, &tevStr); + g_env_light.setLightTevColorType_MAJI(sword_model->mModelData, &tevStr); + mpSwordBrkAnm->entry(sword_model->getModelData()); + mpSwordMorf->entryDL(); + } + + if (mPlayPatternAnm) { + mpOpPatternBrkAnm->entry(mpOpPatternModel->getModelData()); + mpOpPatternBtkAnm->entry(mpOpPatternModel->getModelData()); + mDoExt_modelUpdateDL(mpOpPatternModel); + } + + if (mDrawZant) { + J3DModel* zant_model = mpZantMorf->getModel(); + g_env_light.settingTevStruct(3, &mSwordPos, &tevStr); + g_env_light.setLightTevColorType_MAJI(zant_model->mModelData, &tevStr); + J3DShape* shape = + mpZantMorf->getModel()->getModelData()->getMaterialNodePointer(2)->getShape(); + if (shape != NULL) { + if (!mDrawZantSword) { + shape->hide(); + } else { + shape->show(); + } + } + mpZantMorf->entryDL(); + } + + cXyz shadow_pos; + shadow_pos.set(current.pos.x, current.pos.y + 1000.0f, current.pos.z); + model = mpMorf->getModel(); + tevStr.field_0x344 = field_0x7f8; + mShadowKey = dComIfGd_setShadow(mShadowKey, 0, model, &shadow_pos, 7000.0f, + 0.0f, current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, + &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); + + return 1; + } +} +#else +#pragma push +#pragma optimization_level 0 +#pragma optimizewithasm off +asm int daB_DS_c::draw() { + nofralloc +#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/draw__8daB_DS_cFv.s" +} +#pragma pop +#endif + +/* 805CBAA8-805CBAC8 000968 0020+00 1/0 0/0 0/0 .text daB_DS_Draw__FP8daB_DS_c */ +static int daB_DS_Draw(daB_DS_c* i_this) { + return i_this->draw(); +} + +/* ############################################################################################## */ +/* 805DCAAC-805DCAB0 000058 0004+00 1/6 0/0 0/0 .rodata @4285 */ +SECTION_RODATA static f32 const lit_4285 = -1.0f; +COMPILER_STRIP_GATE(0x805DCAAC, &lit_4285); + +/* 805DD22C-805DD22C 0007D8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ +#pragma push +#pragma force_active on +SECTION_DEAD static char const* const stringBase_805DD22C = "B_DS"; +#pragma pop + +/* 805CBAC8-805CBB74 000988 00AC+00 18/18 0/0 0/0 .text setBck__8daB_DS_cFiUcff */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::setBck(int i_anmID, u8 i_attr, f32 i_morf, f32 i_rate) { + J3DAnmTransform* anm = static_cast(dComIfG_getObjectRes("B_DS", i_anmID)); + mpMorf->setAnm(anm, i_attr, i_morf, i_rate, 0.0f, -1.0f); + mAnmID = i_anmID; +} +#else +#pragma push +#pragma optimization_level 0 +#pragma optimizewithasm off +asm void daB_DS_c::setBck(int param_0, u8 param_1, f32 param_2, f32 param_3) { + nofralloc +#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setBck__8daB_DS_cFiUcff.s" +} +#pragma pop +#endif + +/* 805CBB74-805CBB80 000A34 000C+00 18/18 0/0 0/0 .text setActionMode__8daB_DS_cFii */ +void daB_DS_c::setActionMode(int i_action, int i_mode) { + mAction = i_action; + mMode = i_mode; +} + +/* ############################################################################################## */ +/* 805DCAB0-805DCAB4 00005C 0004+00 1/9 0/0 0/0 .rodata @4339 */ +SECTION_RODATA static f32 const lit_4339 = -1000000000.0f; +COMPILER_STRIP_GATE(0x805DCAB0, &lit_4339); + +#ifdef NONMATCHING +/* 805DD470-805DD474 000228 0004+00 5/6 0/0 0/0 .data eff_smoke_id */ +SECTION_DATA static u16 eff_smoke_id[2] = {0x8BC4, 0x8BC5}; +#endif + +/* 805CBB80-805CBD00 000A40 0180+00 1/1 0/0 0/0 .text mSmokeSet__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::mSmokeSet() { + if (mSmokeCount >= 20) { + return; + } + + if (mAcch.i_ChkGroundHit()) { + if (field_0x84d == 0 && mAcch.GetGroundH() != -1e9f) { + cXyz particle_scale(1.0f, 1.0f, 1.0f); + cXyz particle_pos = current.pos; + csXyz particle_angle = shape_angle; + particle_pos.y = mAcch.GetGroundH(); + particle_angle.z = 0; + particle_angle.x = 0; + mSmokeParticleKey[mSmokeCount] = + dComIfGp_particle_set(mSmokeParticleKey[mSmokeCount], eff_smoke_id[1], + &particle_pos, &particle_angle, &particle_scale); + + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_H_COL, 0, -1); + + field_0x84d = 1; + mSmokeCount++; + } + } else { + field_0x84d = 0; + } +} +#else +#pragma push +#pragma optimization_level 0 +#pragma optimizewithasm off +asm void daB_DS_c::mSmokeSet() { + nofralloc +#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mSmokeSet__8daB_DS_cFv.s" +} +#pragma pop +#endif + +/* 805CBD00-805CBD64 000BC0 0064+00 3/3 0/0 0/0 .text mHeadAngle_Clear__8daB_DS_cFv */ +void daB_DS_c::mHeadAngle_Clear() { + cLib_addCalcAngleS2(&mHeadAngle.x, 0, 20, 0x100); + cLib_addCalcAngleS2(&mHeadAngle.y, 0, 20, 0x100); + cLib_addCalcAngleS2(&mHeadAngle.z, 0, 20, 0x100); +} + +/* 805CBD64-805CBED0 000C24 016C+00 1/1 0/0 0/0 .text HandHitSoundSet__8daB_DS_cFb */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::HandHitSoundSet(bool i_isLeft) { + cXyz vec, hit_pos; + if (!i_isLeft) { + vec = mHandPos[1] - *mHandAtRCyl.GetTgHitPosP(); + hit_pos = *mHandAtRCyl.GetTgHitPosP(); + hit_pos.y += 100.0f; + mSoundPos = mHandPos[1]; + } else { + vec = mHandPos[0] - *mHandAtLCyl.GetTgHitPosP(); + hit_pos = *mHandAtLCyl.GetTgHitPosP(); + hit_pos.y += 100.0f; + mSoundPos = mHandPos[0]; + } + csXyz hit_angle; + hit_angle.x = 0; + hit_angle.y = vec.atan2sX_Z(); + hit_angle.z = 0; + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + i_dComIfGp_setHitMark(2, this, &hit_pos, &hit_angle, NULL, 0); +} +#else +#pragma push +#pragma optimization_level 0 +#pragma optimizewithasm off +asm void daB_DS_c::HandHitSoundSet(bool param_0) { + nofralloc +#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/HandHitSoundSet__8daB_DS_cFb.s" +} +#pragma pop +#endif + +/* ############################################################################################## */ +/* 805DCAB4-805DCAB8 000060 0004+00 0/5 0/0 0/0 .rodata @4465 */ +#pragma push +#pragma force_active on +SECTION_RODATA static f32 const lit_4465 = 800.0f; +COMPILER_STRIP_GATE(0x805DCAB4, &lit_4465); +#pragma pop + +/* 805DCAB8-805DCABC 000064 0004+00 1/5 0/0 0/0 .rodata @4466 */ +SECTION_RODATA static f32 const lit_4466 = 200.0f; +COMPILER_STRIP_GATE(0x805DCAB8, &lit_4466); + +/* 805DCABC-805DCAC0 000068 0004+00 0/2 0/0 0/0 .rodata @4467 */ +#pragma push +#pragma force_active on +SECTION_RODATA static f32 const lit_4467 = 400.0f; +COMPILER_STRIP_GATE(0x805DCABC, &lit_4467); +#pragma pop + +/* 805CBED0-805CC158 000D90 0288+00 1/1 0/0 0/0 .text handSPosSet__8daB_DS_cFi */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::handSPosSet(int i_hand) { + dBgS_GndChk gnd_chk; + cXyz vec1, vec2; + vec1 = mFingerPos[i_hand]; + vec1.y += 800.0f; + gnd_chk.SetPos(&vec1); + vec1.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (vec1.y == -1e9f) { + vec1.y = mFingerPos[i_hand].y; + } + vec2 = vec1 - mHandPos[i_hand]; + mDoMtx_YrotS(*calc_mtx, (s16)vec2.atan2sX_Z()); + vec1.x = 0.0f; + vec1.y = 200.0f; + vec1.z = 400.0f; + MtxPosition(&vec1, &vec2); + vec2 += mHandPos[i_hand]; + vec2.y += 800.0f; + gnd_chk.SetPos(&vec1); + vec2.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (vec2.y == -1e9f) { + vec2.y = mHandPos[i_hand].y; + } + vec1 = vec2 - mHandPos[i_hand]; + csXyz particle_angle; + particle_angle.x = vec1.atan2sY_XZ(); + particle_angle.y = vec2.atan2sX_Z(); + particle_angle.z = 0; + cXyz particle_scale(1.0f, 1.0f, 1.0f); + for (int i = 0; i < 2; i++) { + mHandSmokeParticleKey[(i_hand << 1) + i] = + dComIfGp_particle_set(mHandSmokeParticleKey[(i_hand << 1) + i], eff_smoke_id[i], + &vec2, &particle_angle, &particle_scale); + } + dComIfGp_getVibration().StartShock(2, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); +} +#else +#pragma push +#pragma optimization_level 0 +#pragma optimizewithasm off +asm void daB_DS_c::handSPosSet(int param_0) { + nofralloc +#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/handSPosSet__8daB_DS_cFi.s" +} +#pragma pop +#endif + +/* 805CC158-805CC1C4 001018 006C+00 8/8 0/0 0/0 .text hand_smokeSet__8daB_DS_cFUc */ +void daB_DS_c::hand_smokeSet(u8 i_hand) { + if (i_hand == 0 || i_hand == 1) { + handSPosSet(0); + } + if (i_hand == 0 || i_hand == 2) { + handSPosSet(1); + } +} + +/* ############################################################################################## */ +/* 805DCAC0-805DCAC4 00006C 0004+00 0/3 0/0 0/0 .rodata @4551 */ +#pragma push +#pragma force_active on +SECTION_RODATA static f32 const lit_4551 = 1500.0f; +COMPILER_STRIP_GATE(0x805DCAC0, &lit_4551); +#pragma pop + +/* 805DCAC4-805DCAC8 000070 0004+00 0/10 0/0 0/0 .rodata @4552 */ +#pragma push +#pragma force_active on +SECTION_RODATA static f32 const lit_4552 = 500.0f; +COMPILER_STRIP_GATE(0x805DCAC4, &lit_4552); +#pragma pop + +/* 805DCAC8-805DCACC 000074 0004+00 0/1 0/0 0/0 .rodata @4553 */ +#pragma push +#pragma force_active on +SECTION_RODATA static f32 const lit_4553 = 8192.0f; +COMPILER_STRIP_GATE(0x805DCAC8, &lit_4553); +#pragma pop /* 805CC1C4-805CC454 001084 0290+00 1/1 0/0 0/0 .text mZsMoveChk__8daB_DS_cFv */ +#ifdef NONMATCHING +// regalloc +void daB_DS_c::mZsMoveChk() { + fopAc_ac_c* staltroop; + int indices[15]; + int count = 0; + + for (int i = 0; i < 15; i++) { + indices[count] = 0; + if (mStaltroopID[i] != 0) { + if (fopAcM_SearchByID(mStaltroopID[i], &staltroop) == 0) { + mStaltroopID[i] = 0; + } else { + indices[count] = i; + count++; + } + } + } + + if (count == 0) { + return; + } + + dBgS_GndChk gnd_chk; + s16 angle_y = fopAcM_searchPlayerAngleY(this); + cXyz vec1, vec2; + + for (int i = 0; i < count; i++) { + if (indices[i] == 0) { + continue; + } + + mDoMtx_YrotS(*calc_mtx, angle_y); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = 1500.0f; + vec1.z += cM_rndF(500.0f); + MtxPosition(&vec1, &vec2); + vec2 += current.pos; + vec2.y += 2000.0f; + gnd_chk.SetPos(&vec2); + if (vec2.y != -1e9f) { + vec2.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + } else { + vec2.y = current.pos.y += 800.0f; + } + + if (mStaltroopID[indices[i]] != 0 + && fopAcM_SearchByID(mStaltroopID[indices[i]], &staltroop) != 0 && staltroop != NULL) + { + staltroop->home.pos.x = vec2.x; + staltroop->home.pos.y = vec2.y; + staltroop->home.pos.z = vec2.z; + } + + angle_y = fopAcM_searchPlayerAngleY(this); + angle_y += (s16)cM_rndFX(0x2000); + } + + if (!daPy_getPlayerActorClass()->checkSpinnerRide() || mAction == ACT_DAMAGE + || fopAcM_searchPlayerDistance(this) > l_HIO.mBreathRange) + { + mIsAppear = false; + return; + } + mIsAppear = true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1881,8 +1810,66 @@ asm void daB_DS_c::mZsMoveChk() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mZsMoveChk__8daB_DS_cFv.s" } #pragma pop +#endif /* 805CC454-805CC6F4 001314 02A0+00 1/1 0/0 0/0 .text mZsMoveChk_Guard__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::mZsMoveChk_Guard() { + static s16 mGuardDt[5] = {-0x1800, 0xc00, -0xc00, 0, 0x1800}; + s16 angle_to_player = fopAcM_searchPlayerAngleY(this); + fopAc_ac_c* staltroop; + dBgS_GndChk gnd_chk; + cXyz vec1, vec2; + s16 angle_y[5]; + + int i = 0; + int index = cM_rndF(5.0f); + for (; i < 5; i++, index++) { + if (index > 4) { + index = 0; + } + angle_y[i] = angle_to_player; + if (mGuardDt[index] != 0) { + angle_y[i] += mGuardDt[index]; + } + } + + for (int i = 0; i < 5; i++) { + mDoMtx_YrotS(*calc_mtx, angle_y[i]); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = 500.0f; + MtxPosition(&vec1, &vec2); + vec2 += current.pos; + vec2.y += 2000.0f; + gnd_chk.SetPos(&vec2); + if (vec2.y != -1e9f) { + vec2.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + } else { + vec2.y = current.pos.y += 800.0f; + } + + if (mStaltroop2ID[i] != 0 && fopAcM_SearchByID(mStaltroop2ID[i], &staltroop) != 0 + && staltroop != NULL) { + staltroop->home.pos.x = vec2.x; + staltroop->home.pos.y = vec2.y; + staltroop->home.pos.z = vec2.z; + } + } + + if (!daPy_getPlayerActorClass()->checkSpinnerRide() || mAction == ACT_DAMAGE + || fopAcM_searchPlayerDistance(this) > l_HIO.mBreathRange) + { + mIsAppearG = false; + return; + } + + if (fopAcM_searchPlayerDistance(this) < l_HIO.mGuardSpawnRange) { + mIsAppearG = true; + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1891,6 +1878,7 @@ asm void daB_DS_c::mZsMoveChk_Guard() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mZsMoveChk_Guard__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCACC-805DCAD0 000078 0004+00 1/7 0/0 0/0 .rodata @4649 */ @@ -1926,6 +1914,29 @@ COMPILER_STRIP_GATE(0x805DCADC, &lit_4653); #pragma pop /* 805CC6F4-805CC80C 0015B4 0118+00 1/1 0/0 0/0 .text mTrapScale__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::mTrapScale() { + f32 target_scale = 1.0f; + if (mBossPhase != 0) { + target_scale = 2.0f; + } else if (mTrapID[0] == 0) { + return; + } + + for (int i = 0; i < 20; i++) { + fopAc_ac_c* trap_actor; + if (fopAcM_SearchByID(mTrapID[i], &trap_actor) != 0 && trap_actor != NULL) { + cLib_addCalc2(&trap_actor->scale.x, target_scale, 0.7f, 0.5f); + cLib_addCalc2(&trap_actor->scale.y, target_scale, 0.8f, 2.0f); + cLib_addCalc2(&trap_actor->scale.z, target_scale, 0.7f, 0.5f); + if (fabsf(trap_actor->scale.y - target_scale) < 0.1f) { + trap_actor->scale.set(target_scale, target_scale, target_scale); + } + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1934,16 +1945,25 @@ asm void daB_DS_c::mTrapScale() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mTrapScale__8daB_DS_cFv.s" } #pragma pop +#endif /* 805CC80C-805CC8A4 0016CC 0098+00 2/2 0/0 0/0 .text mClearTrap__8daB_DS_cFb */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::mClearTrap(bool param_0) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mClearTrap__8daB_DS_cFb.s" +void daB_DS_c::mClearTrap(bool i_delete) { + for (int i = 0; i < 20; i++) { + if (mTrapID[i] == 0) { + continue; + } + fopAc_ac_c* trap_actor; + if (fopAcM_SearchByID(mTrapID[i], &trap_actor) != 0 && trap_actor != NULL) { + if (i_delete) { + fopAcM_delete(trap_actor); + } else { + trap_actor->health = 0; + } + mTrapID[i] = 0; + } + } } -#pragma pop /* ############################################################################################## */ /* 805DCAE0-805DCAE4 00008C 0004+00 0/1 0/0 0/0 .rodata @4895 */ @@ -1968,6 +1988,131 @@ COMPILER_STRIP_GATE(0x805DCAE8, &lit_4897); #pragma pop /* 805CC8A4-805CCEB4 001764 0610+00 3/3 0/0 0/0 .text mCreateTrap__8daB_DS_cFb */ +#ifdef NONMATCHING +// matches with literals / generics +void daB_DS_c::mCreateTrap(bool param_0) { + daPy_py_c* player = daPy_getPlayerActorClass(); + if (mBossPhase == 0) { + if (cLib_calcTimer(&mBirthTrapTimerF) != 0 || mPedestalFallTimer != 0 || mSandFallTimer != 0 + || mAction == ACT_DAMAGE || mAction == ACT_OPENING_DEMO) + { + mClearTrap(true); + return; + } + } else if (player->current.pos.y < -1300.0f || player->current.pos.y > l_HIO.mP2AttackHeight + || (mAction == ACT_CIRCLE && mMode >= 3 && mMode <= 4) || mOutTimer == 0 + || daPy_getPlayerActorClass()->getDamageWaitTimer() != 0 || mAction == ACT_WAIT + || mAction == ACT_DAMAGE || mAction == ACT_ETC_DAMAGE || mAction == ACT_HAND_ATTACK) + { + mTrapCreate = false; + mClearTrap(false); + return; + } + mTrapScale(); + + if (mBossPhase == 0 && !param_0 && (fopAcM_searchPlayerAngleY(this) & 0xfff) == 0) { + return; + } + cXyz pos, vec; + cXyz trap_scale(1.0f, 1.0f, 1.0f); + u32 prm; + + if (mBossPhase != 0 && health <= (int)l_HIO.mP2Health / 3 * 2 && mTrapCreate) { + int i = 6; + int trap_count = 0; + for (; i < 20 && trap_count < 2; i++) { + if (mTrapID[i] != 0) { + fopAc_ac_c* actor; + if (fopAcM_SearchByID(mTrapID[i], &actor) != 0 && actor != NULL) { + continue; + } + mTrapID[i] = 0; + } + + prm = 0x1f5003; + prm |= (int)l_HIO.mTowerTrapSpeed << 8; + int trap_create_id; + if (trap_count == 0) { + trap_create_id = l_HIO.mP2TrapCreateID1; + prm |= l_HIO.mP2TrapCreateID1 << 0x18; + } else { + trap_create_id = l_HIO.mP2TrapCreateID2; + prm |= l_HIO.mP2TrapCreateID2 << 0x18; + } + + dPath* path = dPath_GetRoomPath(3, fopAcM_GetRoomNo(this)); + if (path != NULL) { + dStage_dPnt_c& point = path->m_points[trap_create_id]; + pos = point.m_position; + vec = pos - current.pos; + if (vec.abs() <= 200.0f) { + continue; + } + csXyz angle; + angle.x = 0; + angle.y = 0; + angle.z = 0; + mTrapID[i] = fopAcM_createChild(PROC_Obj_Lv6TogeTrap, fopAcM_GetID(this), prm, + ¤t.pos, fopAcM_GetRoomNo(this), + &angle, &trap_scale, -1, NULL); + trap_count++; + } + } + mTrapCreate = false; + } + + trap_scale.set(0.0f, 7.0f, 0.0f); + pos.zero(); + csXyz angle; + angle.y = 0; + angle.z = 0; + angle.x = 0; + pos.y = 1708.0f; + static s16 mBirthAngle01_dt[4] = {0x0000, 0x4000, 0x8000, 0xc000}; + static s16 mBirthAngle02_dt[3] = {0x0000, 0x5555, 0xaaaa}; + static f32 mBirthYpos02_dt[3] = {1150.0f, 350.0f, -450.0f}; + + if (mBossPhase == 0) { + int max = 6; + if (mBackboneJoint < 2) { + max = 4; + } + for (int i = 0; i < max; i++) { + if (mBackboneJoint < 2) { + angle.y = mBirthAngle01_dt[i]; + } + if (mTrapID[i] != 0) { + continue; + } + mTrapID[i] = fopAcM_createChild(PROC_Obj_Lv6TogeTrap, fopAcM_GetID(this), 0x27104dff, + &pos, fopAcM_GetRoomNo(this), &angle, &trap_scale, + -1, NULL); + if (mBackboneJoint == 2) { + angle.y += 0x2aaa; + } + } + } else { + pos.zero(); + if (health <= (int)l_HIO.mP2Health / 3) { + prm = 0x271040ff; + prm |= (int)l_HIO.mP2OuterWallTrapSpeed << 8; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 2; j++) { + int idx = (i << 1) + j; + if (mTrapID[idx] != 0) { + continue; + } + angle.y = mBirthAngle02_dt[i] + mBirthAngle01_dt[j * 2]; + pos.y = mBirthYpos02_dt[i]; + mTrapID[idx] = fopAcM_createChild(PROC_Obj_Lv6TogeTrap, fopAcM_GetID(this), + prm, &pos, fopAcM_GetRoomNo(this), &angle, + &trap_scale, -1, NULL); + } + } + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1976,8 +2121,51 @@ asm void daB_DS_c::mCreateTrap(bool param_0) { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mCreateTrap__8daB_DS_cFb.s" } #pragma pop +#endif /* 805CCEB4-805CD074 001D74 01C0+00 1/1 0/0 0/0 .text mChangeVer2__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::mChangeVer2() { + if (mBitSw != 0xff) { + i_fopAcM_offSwitch(this, mBitSw); + } + field_0x7ec = 0.0f; + shape_angle.x = 0; + mBossPhase = 1; + gravity = 0.0f; + mDead = false; + mHandAtLCyl.OffTgSetBit(); + mHandAtRCyl.OffTgSetBit(); + mHandAtLCyl.OffCoSetBit(); + mHandAtRCyl.OffCoSetBit(); + mHandAtLCyl.OffAtSetBit(); + mHandAtRCyl.OffAtSetBit(); + mWeakSph.OffTgSetBit(); + mWeakSph.OffCoSetBit(); + mWeakSph.OffAtSetBit(); + mWeakSph.OnTgNoHitMark(); + mWeakSph.OffTgShield(); + mWeakSph.OffTgNoConHit(); + mWeakSph.OnTgStopNoConHit(); + mWeakSph.SetTgHitMark(CcG_Tg_UNK_MARK_0); + mBackboneCyl.OffTgSetBit(); + mBackboneCyl.OffCoSetBit(); + for (int i = 0; i < 5; i++) { + mHeadSph[i].SetTgType(0xd8fbfdff); + mHeadSph[i].SetTgHitMark(CcG_Tg_UNK_MARK_2); + mHeadSph[i].OnTgShield(); + mHeadSph[i].OffTgIronBallRebound(); + mHeadSph[i].OffTgSpinnerReflect(); + mHeadSph[i].OnTgNoHitMark(); + } + dComIfGs_onZoneSwitch(6, fopAcM_GetRoomNo(this)); + dComIfGs_onZoneSwitch(8, fopAcM_GetRoomNo(this)); + mIsOpeningDemo = true; + mBackboneJoint = 0; + field_0x560 = health = l_HIO.mP2Health; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1986,8 +2174,137 @@ asm void daB_DS_c::mChangeVer2() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mChangeVer2__8daB_DS_cFv.s" } #pragma pop +#endif /* 805CD074-805CD628 001F34 05B4+00 1/1 0/0 0/0 .text damage_check__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with generics +void daB_DS_c::damage_check() { + if (health <= 1 || mBossPhase == 100) { + return; + } + + if (cLib_calcTimer(&mDamageTimer) != 0) { + return; + } + + if (mHandAtRCyl.ChkTgHit()) { + mDamageTimer = 8; + mAtInfo.mpCollider = mHandAtRCyl.GetTgHitObj(); + HandHitSoundSet(false); + if (mAction != ACT_OPENING_DEMO && mHandAtRCyl.GetTgHitObj()->ChkAtType(AT_TYPE_SPINNER) + && (mAction != ACT_ETC_DAMAGE || mHitLocation != 0)) + { + mAction = ACT_ETC_DAMAGE; + mHitLocation = 0; + mMode = 0; + } + mHandAtRCyl.ClrTgHit(); + return; + } + + if (mHandAtLCyl.ChkTgHit()) { + mDamageTimer = 8; + mAtInfo.mpCollider = mHandAtLCyl.GetTgHitObj(); + HandHitSoundSet(true); + if (mAction != ACT_OPENING_DEMO && mHandAtLCyl.GetTgHitObj()->ChkAtType(AT_TYPE_SPINNER) + && (mAction != ACT_ETC_DAMAGE || mHitLocation != 1)) + { + mAction = ACT_ETC_DAMAGE; + mHitLocation = 1; + mMode = 1; + } + mHandAtLCyl.ClrTgHit(); + return; + } + + for (int i = 0; i < 18; i++) { + if (mEtcSph[i].ChkTgHit()) { + mDamageTimer = 8; + mAtInfo.mpCollider = mEtcSph[i].GetTgHitObj(); + mSoundPos = *mEtcSph[i].GetTgHitPosP(); + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + mEtcSph[i].ClrTgHit(); + return; + } + } + + for (int i = 0; i < 5; i++) { + if (mHeadSph[i].ChkTgHit()) { + mDamageTimer = 8; + mAtInfo.mpCollider = mHeadSph[i].GetTgHitObj(); + mSoundPos = mHeadPos; + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + if (mAction != ACT_OPENING_DEMO && (mAction != ACT_ETC_DAMAGE || mHitLocation != 2)) { + mAction = ACT_ETC_DAMAGE; + mHitLocation = 2; + mMode = 2; + } + mHeadSph[i].ClrTgHit(); + return; + } + } + + if (mWeakSph.ChkTgHit()) { + mDamageTimer = 8; + mAtInfo.mpCollider = mWeakSph.GetTgHitObj(); + mSoundPos = mHeadPos; + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + if (mAction != ACT_OPENING_DEMO && (mAction != ACT_ETC_DAMAGE || mHitLocation != 2)) { + mAction = ACT_ETC_DAMAGE; + mHitLocation = 2; + mMode = 2; + } + mWeakSph.ClrTgHit(); + return; + } + + if (mAction == ACT_OPENING_DEMO) { + return; + } + + daPy_getPlayerActorClass()->onBossRoomWait(); + mCcStts.Move(); + + if (mBackboneCyl.ChkTgHit()) { + mAtInfo.mpCollider = mBackboneCyl.GetTgHitObj(); + cXyz vec = current.pos - *mBackboneCyl.GetTgHitPosP(); + cXyz hit_pos = *mBackboneCyl.GetTgHitPosP(); + csXyz hit_angle; + hit_angle.x = 0; + hit_angle.y = vec.atan2sX_Z(); + hit_angle.z = 0; + mSoundPos = current.pos; + + if (mBackboneCyl.GetTgHitObj()->ChkAtType(AT_TYPE_SPINNER) + && daPy_getPlayerActorClass()->checkSpinnerTriggerAttack()) + { + u8 se = static_cast(mBackboneCyl.GetTgHitObj())->GetAtSe(); + mSound.startCollisionSE(dCcD_GObjInf::getHitSeID(se, 0), mAtInfo.field_0x18); + dComIfGp_getVibration().StopQuake(0x4f); + mBackboneCyl.SetTgHitMark(CcG_Tg_UNK_MARK_3); + mHandAtLCyl.OffAtSetBit(); + mHandAtRCyl.OffAtSetBit(); + mHandAtLCyl.OffTgShield(); + mHandAtRCyl.OffTgShield(); + mActionTimer = 0; + if (mBitSw3 != 0xff) { + i_fopAcM_onSwitch(this, mBitSw3); + } + def_se_set(&mSound, mAtInfo.mpCollider, 0x1f, NULL); + i_dComIfGp_setHitMark(3, this, &hit_pos, &hit_angle, NULL, 0); + mDamageTimer = 50; + setActionMode(ACT_DAMAGE, 0); + if (mBackboneJoint >= 2) { + Z2GetAudioMgr()->bgmStop(0x1e, 0); + } + } else { + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + i_dComIfGp_setHitMark(2, this, &hit_pos, &hit_angle, NULL, 0); + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1996,6 +2313,7 @@ asm void daB_DS_c::damage_check() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/damage_check__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCAEC-805DCAF4 000098 0008+00 1/6 0/0 0/0 .rodata @5154 */ @@ -2005,6 +2323,52 @@ SECTION_RODATA static u8 const lit_5154[8] = { COMPILER_STRIP_GATE(0x805DCAEC, &lit_5154); /* 805CD628-805CD844 0024E8 021C+00 1/1 0/0 0/0 .text neck_set__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::neck_set() { + static f32 HeadAngleDt[3] = {-850.0f, -350.0f, -50.0f}; + cXyz vec; + csXyz angle; + angle.z = 0; + angle.y = 0; + angle.x = 0; + + if (mAction != ACT_OPENING_DEMO && mAction != ACT_DAMAGE) { + daPy_py_c* player = daPy_getPlayerActorClass(); + vec.x = player->current.pos.x - mHeadPos.x; + vec.z = player->current.pos.z - mHeadPos.z; + vec.y = player->current.pos.y - (mHeadPos.y + HeadAngleDt[mBackboneJoint]); + + angle.x = -vec.atan2sY_XZ() * 2.0f; + if (mAction == ACT_BREATH_ATTACK) { + angle.x = mBh2AttackAngleF; + angle.x += (s16)(mBackboneJoint * 200); + } + if (angle.x > 0x2000) { + angle.x = 0x2000; + } else if (angle.x < -0x400) { + angle.x = -0x400; + } + cLib_addCalcAngleS2(&mHeadAngle.x, -angle.x, 20, 0x100); + + angle.y = shape_angle.y - vec.atan2sX_Z(); + if (angle.y > 0x3000) { + angle.y = 0x3000; + } else if (angle.y < -0x3000) { + angle.y = -0x3000; + } + if (abs((s16)(mHeadAngle.y - angle.y)) > 0x100) { + if (abs((s16)(fopAcM_searchPlayerAngleY(this) - shape_angle.y)) < 0x4000 + && fopAcM_searchPlayerDistance(this) > l_HIO.mNoSearchRange) + { + cLib_addCalcAngleS2(&mHeadAngle.y, angle.y, 20, 0x200); + } else { + mHeadAngle_Clear(); + } + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -2013,46 +2377,96 @@ asm void daB_DS_c::neck_set() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/neck_set__8daB_DS_cFv.s" } #pragma pop +#endif /* 805CD844-805CD8D8 002704 0094+00 1/1 0/0 0/0 .text mCutTypeCheck__8daB_DS_cFv */ +#ifdef NONMATCHING +bool daB_DS_c::mCutTypeCheck() { + u8 cut_type = daPy_getPlayerActorClass()->getCutType(); + if (cut_type == daPy_py_c::CUT_TYPE_TURN_RIGHT || cut_type == daPy_py_c::CUT_TYPE_JUMP + || cut_type == daPy_py_c::CUT_TYPE_TWIRL || cut_type == daPy_py_c::CUT_TYPE_TURN_LEFT) + { + return true; + } + if (cut_type == daPy_py_c::CUT_TYPE_LARGE_JUMP + || cut_type == daPy_py_c::CUT_TYPE_LARGE_JUMP_FINISH + || cut_type == daPy_py_c::CUT_TYPE_LARGE_TURN_LEFT + || cut_type == daPy_py_c::CUT_TYPE_LARGE_TURN_RIGHT + || cut_type == daPy_py_c::CUT_TYPE_MORTAL_DRAW_A + || cut_type == daPy_py_c::CUT_TYPE_MORTAL_DRAW_B) + { + return true; + } + if (cut_type == daPy_py_c::CUT_TYPE_HEAD_JUMP || cut_type == daPy_py_c::CUT_TYPE_TWIRL) { + return true; + } + return false; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daB_DS_c::mCutTypeCheck() { +asm bool daB_DS_c::mCutTypeCheck() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mCutTypeCheck__8daB_DS_cFv.s" } #pragma pop +#endif /* 805CD8D8-805CDA08 002798 0130+00 5/5 0/0 0/0 .text startDemoCheck__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches but puts ~cXyz in the wrong place +bool daB_DS_c::startDemoCheck() { + camera_class* camera = dComIfGp_getCamera(i_dComIfGp_getPlayerCameraID(0)); + if (daPy_py_c::i_checkNowWolf()) { + return false; + } + if (!eventInfo.checkCommandDemoAccrpt()) { + fopAcM_orderPotentialEvent(this, 2, 0xffff, 0); + eventInfo.i_onCondition(2); + mCameraEye = dCam_getBody()->Center(); + mCameraCenter = dCam_getBody()->Eye(); + mCameraFovy = dCam_getBody()->Fovy(); + return false; + } else { + camera->mCamera.Stop(); + camera->mCamera.SetTrimSize(3); + daPy_getPlayerActorClass()->i_changeOriginalDemo(); + return true; + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daB_DS_c::startDemoCheck() { +asm bool daB_DS_c::startDemoCheck() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/startDemoCheck__8daB_DS_cFv.s" } #pragma pop +#endif /* 805CDA08-805CDA44 0028C8 003C+00 1/1 0/0 0/0 .text setYoMessage__8daB_DS_cFi */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::setYoMessage(int param_0) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setYoMessage__8daB_DS_cFi.s" +void daB_DS_c::setYoMessage(int i_msgIdx) { + mMsgIdx = i_msgIdx; + mMsgPcID = fopMsgM_messageSet(i_msgIdx, 1000); } -#pragma pop /* 805CDA44-805CDAC0 002904 007C+00 1/1 0/0 0/0 .text doYoMessage__8daB_DS_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::doYoMessage() { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/doYoMessage__8daB_DS_cFv.s" +bool daB_DS_c::doYoMessage() { + if (mpMsg != NULL) { + if (mpMsg->mMode == 0xe) { + mpMsg->mMode = 0x10; + } else if (mpMsg->mMode == 0x12) { + mpMsg->mMode = 0x13; + mMsgPcID = 0xffffffff; + return true; + } + } else { + mpMsg = fopMsgM_SearchByID(mMsgPcID); + } + return false; } -#pragma pop /* ############################################################################################## */ /* 805DCAF4-805DCB74 0000A0 0080+00 0/0 0/0 0/0 .rodata KIDOU_EFF_DT$5303 */ @@ -2715,19 +3129,7 @@ SECTION_DEAD static char const* const stringBase_805DD231 = "force_start"; SECTION_DEAD static char const* const stringBase_805DD23D = "force_end"; #pragma pop -/* 805DDB0C-805DDB10 -00001 0004+00 0/1 0/0 0/0 .bss None */ -#pragma push -#pragma force_active on -/* 805DDB0C 0002+00 data_805DDB0C handL_ang */ -/* 805DDB0E 0002+00 data_805DDB0E handR_ang */ -static u8 struct_805DDB0C[4]; -#pragma pop - -/* 805DDB10-805DDB14 -00001 0004+00 3/4 0/0 0/0 .bss None */ -/* 805DDB10 0002+00 data_805DDB10 handX_ang */ -/* 805DDB12 0002+00 data_805DDB12 None */ -static u8 struct_805DDB10[4]; - +#ifndef NONMATCHING /* 805DDB14-805DDB24 0000AC 000C+04 0/1 0/0 0/0 .bss @5249 */ #pragma push #pragma force_active on @@ -2979,8 +3381,583 @@ static u8 lit_5299[12]; #pragma force_active on static u8 mOpEyeBodyDt[24]; #pragma pop +#endif /* 805CDAC0-805CFA08 002980 1F48+00 2/1 0/0 0/0 .text executeOpeningDemo__8daB_DS_cFv */ +#ifdef NONMATCHING +// order of loading data/bss, and checkNowWolf not getting inlined +void daB_DS_c::executeOpeningDemo() { + camera_class* camera = dComIfGp_getCamera(i_dComIfGp_getPlayerCameraID(0)); + daPy_py_c* player = daPy_getPlayerActorClass(); + dBgS_GndChk gnd_chk; + cXyz vec1, vec2, vec3, vec4, vec5; + csXyz particle_angle; + vec3.zero(); + vec4.zero(); + + static cXyz mOpPlayerDt[3] = { + cXyz(0.0f, 1800.0f, 4900.0f), + cXyz(342.0f, 690.0f, 1753.0f), + cXyz(-20.0f, 1270.0f, 3083.0f), + }; + + static cXyz mOpCenterDt[15] = { + cXyz(0.0f, 1910.0f, 4935.0f), + cXyz(-5.0f, 2011.0f, 4664.0f), + cXyz(615.0f, 2410.0f, 2140.0f), + cXyz(131.0f, 1105.0f, 1092.0f), + cXyz(-110.0f, 1160.0f, 1200.0f), + cXyz(-50.0f, 1095.0f, 1300.0f), + cXyz(-85.0f, 1150.0f, 1250.0f), + cXyz(10.0f, 1145.0f, 1420.0f), + cXyz(0.0f, 0.0f, 0.0f), + cXyz(10.0f, 1060.0f, 1420.0f), + cXyz(45.0f, 1065.0f, 1475.0f), + cXyz(235.0f, 1110.0f, 1835.0f), + cXyz(205.0f, 795.0f, 1770.0f), + cXyz(45.0f, 905.0f, 1480.0f), + cXyz(650.0f, 2800.0f, 2350.0f), + }; + + static cXyz mOpCenterBodyDt[2] = { + cXyz(320.0f, 730.0f, 1270.0f), + cXyz(-235.0f, 1345.0f, 2090.0f), + }; + + static cXyz mOpEyeDt[15] = { + cXyz(0.0f, 1980.0f, 5300.0f), + cXyz(0.0f, 1934.0f, 5036.0f), + cXyz(655.0f, 2810.0f, 2360.0f), + cXyz(181.0f, 1190.0f, 844.0f), + cXyz(25.0f, 1125.0f, 1450.0f), + cXyz(75.0f, 1010.0f, 1540.0f), + cXyz(40.0f, 1030.0f, 1480.0f), + cXyz(150.0f, 1115.0f, 1670.0f), + cXyz(0.0f, 0.0f, 0.0f), + cXyz(160.0f, 1000.0f, 1685.0f), + cXyz(180.0f, 1110.0f, 1730.0f), + cXyz(360.0f, 1220.0f, 2080.0f), + cXyz(340.0f, 755.0f, 2020.0f), + cXyz(170.0f, 800.0f, 1710.0f), + cXyz(695.0f, 3200.0f, 2570.0f), + }; + + static cXyz mOpEyeBodyDt[2] = { + cXyz(600.0f, 710.0f, 1300.0f), + cXyz(125.0f, 1500.0f, 3320.0f), + }; + + static u16 eff_znt_Disapp_id[2] = {0x8BBA, 0x8BBB}; + static u16 eff_znt_App_id[4] = {0x8BBC, 0x8BBD, 0x8BBE, 0x8BBF}; + static u16 eff_znt_SASI_id[3] = {0x8BC0, 0x8BC1, 0x8BC2}; + + static const struct { + u16 eff_id; + int joint_no; + } KIDOU_EFF_DT[16] = { + {0x8BC6, 8}, + {0x8BC7, 8}, + {0x8BC8, 9}, + {0x8BC9, 9}, + {0x8BCA, 27}, + {0x8BCB, 27}, + {0x8BCC, 28}, + {0x8BCD, 28}, + {0x8BCE, 3}, + {0x8BCF, 3}, + {0x8BD0, 11}, + {0x8BD1, 11}, + {0x8BD2, 30}, + {0x8BD3, 30}, + {0x8BD4, 6}, + {0x8BD5, 6}, + }; + + mHintTimer1 = l_HIO.mHintTime1; + + switch (mMode) { + case 0: + for (int i = 0; i < 16; i++) { + mStartingParticleKey[i] = 0; + } + setBck(ANM_OPDEMO, 0, 1.0f, 0.0f); + mMode++; + // no break + + case 1: + case 10: + if (!startDemoCheck()) { + break; + } + Z2GetAudioMgr()->setDemoName("force_start"); + + if (mMode == 10) { + i_dComIfGp_getEvent().i_startCheckSkipEdge(this); + vec1.set(mOpPlayerDt[1]); + daPy_getPlayerActorClass()->i_changeDemoMode(4, 2, 0, 0); + vec1.set(player->current.pos); + vec2 = mZantPos - player->current.pos; + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&vec1, vec2.atan2sX_Z(), 0); + mCameraCenter.set(mOpCenterDt[14]); + mCameraEye.set(mOpEyeDt[14]); + mMode++; + } else { + daPy_getPlayerActorClass()->i_changeDemoMode(20, 0, 0, 0); + vec1.set(mOpPlayerDt[0]); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&vec1, -0x8000, 0); + vec3.set(vec1.x, vec1.y, 4700.0f); + player->i_changeDemoPos0(&vec3); + mCameraCenter.set(mOpCenterDt[0]); + mCameraEye.set(mOpEyeDt[0]); + mActionTimer = 10; + mMode++; + } + break; + + case 2: + f32 calc_center = cLib_addCalcPos(&mCameraCenter, mOpCenterDt[1], 3, 2.0f, 1.0f); + f32 calc_eye = cLib_addCalcPos(&mCameraEye, mOpEyeDt[1], 3, 2.0f, 1.0f); + if (calc_center > 2.0f || calc_eye > 2.0f || cLib_calcTimer(&mActionTimer) != 0) { + break; + } + + mCameraCenter.set(mOpCenterDt[1]); + mCameraEye.set(mOpEyeDt[1]); + vec3.set(0.0f, 1900.0f, 4727.0f); + vec4.set(0.0f, 1981.0f, 5018.0f); + camera->mCamera.Reset(vec3, vec4); + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + i_dComIfGp_event_reset(); + dComIfGs_onZoneSwitch(0, fopAcM_GetRoomNo(this)); + fopAcM_OffStatus(this, 0x4000); + mMode++; + // no break + + case 3: + mPedestalFallTimer = l_HIO.mPedestalFallTime; + if (!daPy_py_c::i_checkNowWolf() + && player->current.pos.z > 1800.0f && player->current.pos.z < 2200.0f + && player->current.pos.y > 780.0f + && player->current.pos.x > -420.0f && player->current.pos.x < 350.0f) + { + dComIfGs_onOneZoneSwitch(8, fopAcM_GetRoomNo(this)); + mMode = 10; + } + break; + + case 11: + daPy_getPlayerActorClass()->i_changeDemoMode(20, 0, 0, 0); + Z2GetAudioMgr()->seStart(Z2SE_EN_ZAN_L4_V, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); + mActionTimer = 150; + mMode++; + // no break + + case 12: + if (cLib_calcTimer(&mActionTimer) != 0) { + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[2], 0.3f, 4.0f, 2.0f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[2], 0.3f, 4.0f, 2.0f); + break; + } + daPy_getPlayerActorClass()->i_changeDemoMode(1, 0, 0, 0); + mActionTimer = 60; + mMode++; + // no break + + case 13: + mCameraCenter.set(mOpCenterDt[3]); + mCameraEye.set(mOpEyeDt[3]); + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + mpZantMorf->setAnm(static_cast(dComIfG_getObjectRes("B_DS", 66)), + 2, 1.0f, 1.0f, 0.0f, -1.0f); + mZantScale.set(0.0f, 5.0f, 0.0f); + mZantEyePos.set(mZantPos); + mZantEyePos.y += 200.0f; + daPy_getPlayerActorClass()->i_changeDemoMode(47, 1, 0, 0); + particle_angle.x = 0; + particle_angle.y = field_0x7ca + 5000; + particle_angle.z = 0; + dComIfGp_particle_set(0x8bb9, &mZantPos, &particle_angle, NULL); + mSoundPos.set(current.pos); + mSound.startCreatureSound(Z2SE_EN_ZAN_L4_WARP_IN, 0, -1); + mDrawZant = true; + mActionTimer = 10; + mMode++; + break; + + case 14: + cLib_addCalc2(&mZantScale.x, 1.0f, 0.7f, 0.1f); + cLib_addCalc2(&mZantScale.y, 1.0f, 0.7f, 0.7f); + cLib_addCalc2(&mZantScale.z, 1.0f, 0.7f, 0.1f); + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + mZantScale.set(1.0f, 1.0f, 1.0f); + daPy_getPlayerActorClass()->i_changeDemoMode(23, 1, 2, 0); + mActionTimer = 100; + mMode++; + // no break + + case 15: + if (cLib_calcTimer(&mActionTimer) != 0) { + if (mActionTimer == 86) { + Z2GetAudioMgr()->bgmStreamPrepare(0x2000047); + Z2GetAudioMgr()->bgmStreamPlay(); + } + if (mActionTimer == 1) { + setYoMessage(0x1f41); + } + } else { + if (doYoMessage()) { + mMode++; + } + } + break; + + case 16: + setYoMessage(0x1f42); + mMode++; + break; + + case 17: + if (!doYoMessage()) { + break; + } + mCameraCenter.set(mOpCenterDt[4]); + mCameraEye.set(mOpEyeDt[4]); + mActionTimer = 30; + mMode++; + // no break + + case 18: + if (cLib_calcTimer(&mActionTimer) != 0) { + if (mActionTimer == 1) { + setYoMessage(0x1f43); + } + } else { + if (doYoMessage()) { + mMode = 20; + } + } + break; + + case 20: + mCameraCenter.set(mOpCenterDt[4]); + mCameraEye.set(mOpEyeDt[4]); + mpZantMorf->setAnm(static_cast(dComIfG_getObjectRes("B_DS", 64)), + 0, 1.0f, 1.0f, 0.0f, -1.0f); + mpSwordMorf->setAnm(static_cast(dComIfG_getObjectRes("B_DS", 63)), + 0, 1.0f, 1.0f, 0.0f, -1.0f); + mpSwordBrkAnm->init(mpSwordMorf->getModel()->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 81)), + 1, 0, 1.0f, 0, -1); + + particle_angle.x = 0; + particle_angle.y = field_0x7ca + 5000; + particle_angle.z = 0; + for (int i = 0; i < 4; i++) { + dComIfGp_particle_set(eff_znt_App_id[i], &mZantPos, &particle_angle, NULL); + } + for (int i = 0; i < 3; i++) { + dComIfGp_particle_set(eff_znt_SASI_id[i], &mZantPos, &particle_angle, NULL); + } + + mSound.startCreatureSound(Z2SE_EN_ZAN_L4_1, 0, -1); + mNoDrawSword = true; + mDrawZantSword = false; + mMode++; + // no break + + case 21: + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[5], 1.0f, 20.0f, 10.0f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[5], 1.0f, 20.0f, 10.0f); + if (mpZantMorf->checkFrame(9.0f)) { + mDrawZantSword = true; + } + if ((int)mpZantMorf->getFrame() < 50) { + break; + } + mMode++; + // no break + + case 22: + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[6], 0.3f, 1.0f, 0.5f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[6], 0.3f, 1.0f, 0.5f); + if ((int)mpZantMorf->getFrame() < 191) { + break; + } + mActionTimer = 30; + mNoDrawSword = false; + mMode++; + // no break + + case 23: + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[7], 0.7f, 30.0f, 20.0f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[7], 0.7f, 30.0f, 20.0f); + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + mMode++; + // no break + + case 24: + if ((int)mpZantMorf->getFrame() >= 250) { + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[9], 0.7f, 4.0f, 1.0f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[9], 0.7f, 4.0f, 1.0f); + } + if ((int)mpZantMorf->getFrame() < 340) { + break; + } + mMode++; + // no break + + case 25: + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[10], 0.7f, 30.0f, 20.0f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[10], 0.7f, 30.0f, 20.0f); + if ((int)mpZantMorf->getFrame() < 346) { + break; + } + field_0x85e = false; + mChkHigh = 0.0f; + mActionTimer = 100; + dComIfGp_getVibration().StartShock(4, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + mMode++; + // no break + + case 26: + if (!field_0x85e && mpZantMorf->isStop()) { + mpZantMorf->setAnm(static_cast(dComIfG_getObjectRes("B_DS", 67)), + 2, 1.0f, 1.0f, 0.0f, -1.0f); + field_0x85e = true; + } + + cLib_addCalc0(&field_0x7ec, 0.7f, 20.0f); + cLib_addCalc2(&mChkHigh, 1.0f, 0.1f, 0.01f); + vec1 = mCameraCenter - mOpCenterDt[11]; + f32 step = mChkHigh * vec1.abs(); + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[11], mChkHigh, step, step); + vec1 = mCameraEye - mOpEyeDt[11]; + step = mChkHigh * vec1.abs(); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[11], mChkHigh, step, step); + + if (mActionTimer == 100) { + mpOpPatternBrkAnm->init(mpOpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 79)), + 1, 0, 1.0f, 0, -1); + mpOpPatternBtkAnm->init(mpOpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 85)), + 1, 0, 1.0f, 0, -1); + mPlayPatternAnm = true; + } + + if (cLib_calcTimer(&mActionTimer) != 0) { + if (mActionTimer == 30) { + mPlayPatternAnm = false; + } + break; + } + + mpZantMorf->setAnm(static_cast(dComIfG_getObjectRes("B_DS", 65)), + 0, 1.0f, 1.0f, 0.0f, -1.0f); + mSound.startCreatureSound(Z2SE_EN_ZAN_L4_2, 0, -1); + mMode = 30; + field_0x85e = false; + // no break + + case 30: + mCameraCenter.set(mOpCenterDt[12]); + mCameraEye.set(mOpEyeDt[12]); + if ((int)mpZantMorf->getFrame() < 65) { + break; + } + mMode++; + // no break + + case 31: + if (mpZantMorf->checkFrame(76.0f)) { + mDrawZantSword = false; + } + cLib_addCalcPos(&mCameraCenter, mOpCenterDt[13], 0.7f, 10.0f, 5.0f); + cLib_addCalcPos(&mCameraEye, mOpEyeDt[13], 0.7f, 10.0f, 5.0f); + if (!mpZantMorf->isStop()) { + break; + } + mSound.startCreatureSound(Z2SE_EN_ZAN_L4_WARP_OUT, 0, -1); + mMode++; + // no break + + case 32: + cLib_addCalc2(&mZantScale.x, 0.0f, 0.7f, 0.1f); + cLib_addCalc2(&mZantScale.y, 5.0f, 0.7f, 0.7f); + cLib_addCalc2(&mZantScale.z, 0.0f, 0.7f, 0.1f); + if (mZantScale.y < 4.9f) { + break; + } + + particle_angle.x = 0; + particle_angle.y = field_0x7ca + 5000; + particle_angle.z = 0; + for (int i = 0; i < 2; i++) { + dComIfGp_particle_set(eff_znt_Disapp_id[i], &mZantPos, &particle_angle, NULL); + } + + mDrawZant = false; + mActionTimer = 50; + mMode++; + // no break + + case 33: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + Z2GetAudioMgr()->subBgmStart(Z2BGM_HARAGIGANT_D01); + mSound.startCreatureSound(Z2SE_EN_DS_OPDEMO, 0, -1); + mActionTimer = 50; + mMode = 40; + // no break + + case 40: + mCameraCenter.set(mOpCenterBodyDt[0]); + mCameraEye.set(mOpEyeBodyDt[0]); + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + mActionTimer = 100; + dComIfGp_getVibration().StartQuake(4, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + mMode++; + // no break + + case 41: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + mMode++; + // no break + + case 42: + cLib_addCalc2(&field_0x7e8, 255.0f, 0.7f, 10.0f); + if (field_0x7e8 < 254.0f) { + break; + } + field_0x7d2 = 0; + mActionTimer = 0; + field_0x7e8 = 255.0f; + setBck(ANM_OPDEMO, 0, 1.0f, 1.0f); + dComIfGp_particle_set(0x8bd6, ¤t.pos, &shape_angle, NULL); + mMode++; + // no break + + case 43: + vec3.set(mSwordPos); + vec3.y += -100.0f; + cLib_addCalcPos(&mCameraCenter, vec3, 1.0f, 20.0f, 10.0f); + if ((int)mpMorf->getFrame() < 330) { + break; + } + mIsOpeningDemo = false; + vec2 = current.pos - player->current.pos; + shape_angle.y = -700; + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&mOpPlayerDt[2], + vec2.atan2sX_Z() + 0x1000, 0); + mMode++; + // no break + + case 44: + vec4.set(mOpEyeBodyDt[1]); + vec3.set(mOpCenterBodyDt[1]); + vec3.y = mSwordPos.y; + f32 max_step = 10.0f; + f32 min_step = 5.0f; + if ((int)mpMorf->getFrame() > 460) { + max_step = 40.0f; + min_step = 20.0f; + vec3.y -= 200.0f; + } + if (vec3.y > 1835.0f) { + vec3.y = 1835.0f; + } else if (vec3.y < 1250.0f) { + vec3.y = 1250.0f; + } + cLib_addCalcPos(&mCameraCenter, vec3, 1.0f, max_step, min_step); + cLib_addCalcPos(&mCameraEye, vec4, 1.0f, 40.0f, 20.0f); + + if (mpMorf->checkFrame(517.0f)) { + dComIfGp_getVibration().StopQuake(0x1f); + } + if (mpMorf->checkFrame(518.0f)) { + hand_smokeSet(0); + } + if (mpMorf->checkFrame(670.0f)) { + dCam_getBody()->StartBlure(40, this, 0.8f, 1.2f); + fopMsgM_messageSetDemo(0x482); + dComIfGp_getVibration().StartQuake(4, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + player->i_changeDemoMode(34, 0, 0, 0); + } + if (mpMorf->checkFrame(770.0f)) { + dComIfGp_getVibration().StopQuake(0x1f); + } + + if (mpMorf->isStop()) { + dKy_change_colpat(1); + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + i_dComIfGp_event_reset(); + attention_info.field_0x0[2] = 0; + attention_info.flags = 4; + group = 2; + Z2GetAudioMgr()->bgmStart(Z2BGM_HARAGIGANT_BTL01, 0, 0); + Z2GetAudioMgr()->setDemoName("force_end"); + dComIfGs_onZoneSwitch(5, fopAcM_GetRoomNo(this)); + field_0x7f8 = 0.5f; + mSwordTimer = 3; + setActionMode(ACT_WAIT, 0); + return; + } + } + + if (mMode > 41) { + cLib_addCalc(&mColBlend, 1.0f, 0.01f, 0.01f, 0.001f); + dKy_custom_colset(0, 1, mColBlend); + cLib_addCalc2(&field_0x7f8, 0.5f, 0.1f, 0.01f); + } + + mZantEyePos.set(mZantPos); + mZantEyePos.y += 200.0f; + + if (mMode != 0 && mMode != 3 && mMode != 4) { + camera->mCamera.Set(mCameraCenter, mCameraEye); + } + + if (mMode < 11) { + return; + } + + if (mMode >= 43) { + vec5.set(1.0f, 1.0f, 1.0f); + for (int i = 0; i < 16; i++) { + mStartingParticleKey[i] = dComIfGp_particle_set(mStartingParticleKey[i], + KIDOU_EFF_DT[i].eff_id, + ¤t.pos, &shape_angle, NULL); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mStartingParticleKey[i]); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix( + mpMorf->getModel()->i_getAnmMtx(KIDOU_EFF_DT[i].joint_no)); + } + } + } + + if (i_dComIfGp_getEvent().i_checkSkipEdge()) { + cDmr_SkipInfo = 1; + dStage_changeScene(2, 0.0f, 0, fopAcM_GetRoomNo(this), 0, -1); + dComIfGs_onZoneSwitch(5, fopAcM_GetRoomNo(this)); + Z2GetAudioMgr()->setDemoName("force_end"); + Z2GetAudioMgr()->bgmStreamStop(0); + Z2GetAudioMgr()->subBgmStop(); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -2989,13 +3966,16 @@ asm void daB_DS_c::executeOpeningDemo() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeOpeningDemo__8daB_DS_cFv.s" } #pragma pop +#endif +#ifndef NONMATCHING /* 805CFA08-805CFA54 0048C8 004C+00 1/1 0/0 0/0 .text setGlobalSRTMatrix__14JPABaseEmitterFPA4_Cf */ #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void JPABaseEmitter::setGlobalSRTMatrix(f32 const (*param_0)[4]) { +// asm void JPABaseEmitter::setGlobalSRTMatrix(f32 const (*param_0)[4]) { +extern "C" asm void setGlobalSRTMatrix__14JPABaseEmitterFPA4_Cf() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/setGlobalSRTMatrix__14JPABaseEmitterFPA4_Cf.s" } @@ -3006,8 +3986,9 @@ asm void JPABaseEmitter::setGlobalSRTMatrix(f32 const (*param_0)[4]) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -static asm void dComIfGp_particle_set(u32 param_0, u16 param_1, cXyz const* param_2, - csXyz const* param_3, cXyz const* param_4) { +// static asm void dComIfGp_particle_set(u32 param_0, u16 param_1, cXyz const* param_2, +// csXyz const* param_3, cXyz const* param_4) { +extern "C" asm void dComIfGp_particle_set__FUlUsPC4cXyzPC5csXyzPC4cXyz() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/dComIfGp_particle_set__FUlUsPC4cXyzPC5csXyzPC4cXyz.s" } @@ -3017,7 +3998,8 @@ static asm void dComIfGp_particle_set(u32 param_0, u16 param_1, cXyz const* para #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void cXyz::abs() const { +// asm void cXyz::abs() const { +extern "C" asm void abs__4cXyzCFv() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/abs__4cXyzCFv.s" } @@ -3027,7 +4009,8 @@ asm void cXyz::abs() const { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void mDoExt_morf_c::isStop() { +// asm void mDoExt_morf_c::isStop() { +extern "C" asm void isStop__13mDoExt_morf_cFv() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/isStop__13mDoExt_morf_cFv.s" } @@ -3038,22 +4021,64 @@ asm void mDoExt_morf_c::isStop() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -static asm void dComIfGp_particle_set(u16 param_0, cXyz const* param_1, csXyz const* param_2, - cXyz const* param_3) { +// static asm void dComIfGp_particle_set(u16 param_0, cXyz const* param_1, csXyz const* param_2, +// cXyz const* param_3) { +extern "C" asm void dComIfGp_particle_set__FUsPC4cXyzPC5csXyzPC4cXyz() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/dComIfGp_particle_set__FUsPC4cXyzPC5csXyzPC4cXyz.s" } #pragma pop +#endif /* 805CFC8C-805D002C 004B4C 03A0+00 3/3 0/0 0/0 .text mHandBreathChk__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +bool daB_DS_c::mHandBreathChk() { + daPy_py_c* player = daPy_getPlayerActorClass(); + if (daPy_getPlayerActorClass()->getDamageWaitTimer() > 10) { + return false; + } + + if (daPy_getPlayerActorClass()->checkSpinnerRide()) { + if (abs((s16)(fopAcM_searchPlayerAngleY(this) - shape_angle.y)) < 0x4000) { + cXyz vec1 = mHandPos[0] - player->current.pos; + cXyz vec2 = mHandPos[1] - player->current.pos; + if (vec1.abs() < l_HIO.mHandRange) { + mAttackingHand = 1; + setActionMode(ACT_HAND_ATTACK, 0); + return true; + } + if (vec2.abs() < l_HIO.mHandRange) { + mAttackingHand = 0; + setActionMode(ACT_HAND_ATTACK, 0); + return true; + } + } + } + + if (cLib_calcTimer(&mActionTimer) == 0 + && fopAcM_searchPlayerDistance(this) > l_HIO.mBreathRange) + { + if ((s16)(shape_angle.y - fopAcM_searchPlayerAngleY(this)) < 0x2000) { + setActionMode(ACT_BREATH_ATTACK, 0); + } else { + setActionMode(ACT_BREATH_SEARCH, 0); + } + return true; + } + + return false; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daB_DS_c::mHandBreathChk() { +asm bool daB_DS_c::mHandBreathChk() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mHandBreathChk__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCCE0-805DCCE4 00028C 0004+00 0/1 0/0 0/0 .rodata @5971 */ @@ -3225,6 +4250,45 @@ COMPILER_STRIP_GATE(0x805DCD3C, &lit_6201); #pragma pop /* 805D002C-805D0194 004EEC 0168+00 1/1 0/0 0/0 .text executeWait__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::executeWait() { + static int Ds_wait_id[3] = { + ANM_WAIT01_A, + ANM_WAIT01_B, + ANM_WAIT01_C, + }; + + switch (mMode) { + case 0: + if (mActionTimer == 0) { + mActionTimer = (int)cM_rndF(60.0f) + 120; + if (mBackboneJoint == 1) { + mActionTimer >>= 1; + } else if (mBackboneJoint == 2) { + mActionTimer >>= 2; + } + } + if (mAnmID != Ds_wait_id[mBackboneJoint]) { + setBck(Ds_wait_id[mBackboneJoint], 2, 10.0f, 1.0f); + } + mMode = 1; + // no break + + case 1: + if (fopAcM_searchPlayerDistance(this) > l_HIO.mNoSearchRange + || daPy_getPlayerActorClass()->checkSpinnerRide()) + { + s16 angle = shape_angle.y - fopAcM_searchPlayerAngleY(this); + if (abs(angle) > 0x1800) { + setActionMode(ACT_CIRCLE, 0); + } + } + } + + mHandBreathChk(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -3233,8 +4297,47 @@ asm void daB_DS_c::executeWait() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeWait__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D0194-805D02F8 005054 0164+00 1/1 0/0 0/0 .text executeCircle__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::executeCircle() { + static int Ds_circle_id[6] = { + ANM_CIRCLE_L_A, + ANM_CIRCLE_L_B, + ANM_CIRCLE_L_C, + ANM_CIRCLE_R_A, + ANM_CIRCLE_R_B, + ANM_CIRCLE_R_C, + }; + s16 angle = shape_angle.y - fopAcM_searchPlayerAngleY(this); + + switch (mMode) { + case 0: + if (mActionTimer == 0) { + mActionTimer = (int)cM_rndF(60.0f) + 240; + } + if (angle < 0) { + setBck(Ds_circle_id[mBackboneJoint], 2, 10.0f, 1.0f); + } else { + setBck(Ds_circle_id[mBackboneJoint + 3], 2, 10.0f, 1.0f); + } + mMode = 1; + // no break + + case 1: + angle = shape_angle.y - fopAcM_searchPlayerAngleY(this); + if (abs(angle) < 0x200) { + setActionMode(ACT_WAIT, 0); + } + } + + cLib_addCalcAngleS2(¤t.angle.y, fopAcM_searchPlayerAngleY(this), 2, 100); + shape_angle.y = current.angle.y; + mHandBreathChk(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -3243,18 +4346,29 @@ asm void daB_DS_c::executeCircle() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeCircle__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D02F8-805D0374 0051B8 007C+00 1/1 0/0 0/0 .text mBreakBoneSUB__8daB_DS_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::mBreakBoneSUB() { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBreakBoneSUB__8daB_DS_cFv.s" +void daB_DS_c::mBreakBoneSUB() { + if (mBitSw3 != 0xff) { + i_fopAcM_offSwitch(this, mBitSw3); + mSoundPos = current.pos; + mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x1f); + } } -#pragma pop /* 805D0374-805D03EC 005234 0078+00 1/1 0/0 0/0 .text damageSet__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::damageSet() { + if (mBossPhase == 0) { + dScnPly_c::setPauseTimer(5); + } + field_0x85e = true; + mBreakBoneSUB(); + dComIfGp_getVibration().StartShock(3, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -3263,6 +4377,7 @@ asm void daB_DS_c::damageSet() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/damageSet__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCD40-805DCD44 0002EC 0004+00 0/5 0/0 0/0 .rodata @6296 */ @@ -3273,6 +4388,36 @@ COMPILER_STRIP_GATE(0x805DCD40, &lit_6296); #pragma pop /* 805D03EC-805D0584 0052AC 0198+00 1/1 0/0 0/0 .text damageHitCamera__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::damageHitCamera() { + camera_class* camera = dComIfGp_getCamera(i_dComIfGp_getPlayerCameraID(0)); + cXyz vec1, vec2; + + mDoMtx_YrotS(*calc_mtx, field_0x7d0); + vec1.zero(); + vec1.y = 300.0f; + MtxPosition(&vec1, &vec2); + vec2.x += current.pos.x; + if (mAcch.GetGroundH() != -1e9f) { + vec2.y += mAcch.GetGroundH(); + } + vec2.z += current.pos.z; + mCameraCenter = vec2; + + vec1.zero(); + vec1.z = 700.0f; + MtxPosition(&vec1, &vec2); + vec2.x += current.pos.x; + if (mAcch.GetGroundH() != -1e9f) { + vec2.y += mAcch.GetGroundH(); + } + vec2.z += current.pos.z; + mCameraEye = vec2; + + camera->mCamera.Set(mCameraCenter, mCameraEye); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -3281,6 +4426,7 @@ asm void daB_DS_c::damageHitCamera() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/damageHitCamera__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCD44-805DCD48 0002F0 0004+00 0/8 0/0 0/0 .rodata @6344 */ @@ -3305,6 +4451,38 @@ COMPILER_STRIP_GATE(0x805DCD4C, &lit_6346); #pragma pop /* 805D0584-805D074C 005444 01C8+00 1/1 0/0 0/0 .text damageDownCheck__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::damageDownCheck() { + cXyz particle_scale(1.0f, 1.0f, 1.0f); + csXyz particle_angle = shape_angle; + if (mAnmID == ANM_DAMAGE_A || mAnmID == ANM_DAMAGE_B) { + int frame = 18; + if (mBrokenBone == 0) { + if (mpMorf->checkFrame(30.0f)) { + hand_smokeSet(1); + } + if (mpMorf->checkFrame(50.0f)) { + hand_smokeSet(2); + } + frame = 35; + } else { + if (mpMorf->checkFrame(13.0f)) { + hand_smokeSet(1); + } + if (mpMorf->checkFrame(29.0f)) { + hand_smokeSet(2); + } + } + if (mpMorf->checkFrame(frame)) { + for (int i = 0; i < 2; i++) { + mHitParticleKey[i] = dComIfGp_particle_set(mHitParticleKey[i], eff_smoke_id[i], + ¤t.pos, &particle_angle, &particle_scale); + } + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -3313,6 +4491,7 @@ asm void daB_DS_c::damageDownCheck() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/damageDownCheck__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCD50-805DCDB0 0002FC 0060+00 0/1 0/0 0/0 .rodata BROKENBORN_EFF_DT$6371 */ @@ -3627,6 +4806,7 @@ SECTION_RODATA static f32 const lit_7156 = 1.0f / 50.0f; COMPILER_STRIP_GATE(0x805DCE58, &lit_7156); #pragma pop +#ifndef NONMATCHING /* 805DDEA0-805DDEB0 000438 000C+04 0/1 0/0 0/0 .bss @6354 */ #pragma push #pragma force_active on @@ -3698,8 +4878,414 @@ static u8 lit_6368[12]; #pragma force_active on static u8 down_eye_dt[60]; #pragma pop +#endif /* 805D074C-805D1E30 00560C 16E4+00 1/1 0/0 0/0 .text executeDamage__8daB_DS_cFv */ +#ifdef NONMATCHING +// regalloc, bss/data ordering, and an instruction out of order +void daB_DS_c::executeDamage() { + static cXyz down_center_dt[5] = { + cXyz(345.0f, 2100.0f, -1575.0f), + cXyz(1490.0f, 1160.0f, -2050.0f), + cXyz(1465.0f, 1135.0f, -2110.0f), + cXyz(-320.0f, 30.0f, -2355.0f), + cXyz(-320.0f, -1900.0f, -2355.0f), + }; + + static cXyz down_eye_dt[5] = { + cXyz(-180.0f, 1390.0f, 3080.0f), + cXyz(1675.0f, 1120.0f, -2310.0f), + cXyz(1690.0f, 1210.0f, -2315.0f), + cXyz(1400.0f, 2215.0f, 1480.0f), + cXyz(1400.0f, 280.0f, 1480.0f), + }; + + static struct { + u16 eff_id; + int joint_no; + } const BROKENBORN_EFF_DT[12] = { + {0x8BDB, 0}, + {0x8BDC, 0}, + {0x8BDD, 0}, + {0x8BDE, 0}, + {0x8BDF, 1}, + {0x8BE0, 1}, + {0x8BE1, 1}, + {0x8BE2, 1}, + {0x8BE3, 2}, + {0x8BE4, 2}, + {0x8BE5, 2}, + {0x8BE6, 2}, + }; + + static int Ds_damage_wait_id[3] = {ANM_DAMAGE_A_WAIT, ANM_DAMAGE_B_WAIT, ANM_LASTDAMAGE_WAIT}; + static int Ds_damage_id[3] = {ANM_DAMAGE_A, ANM_DAMAGE_B, ANM_LASTDAMAGE}; + static u16 eff_spHit_id[2] = {0x8BD9, 0x8BDA}; + static u16 eff_LastSmoke_id[4] = {0x8C25, 0x8C26, 0x8C27, 0x8C28}; + + camera_class* camera = dComIfGp_getCamera(i_dComIfGp_getPlayerCameraID(0)); + daPy_py_c* player = daPy_getPlayerActorClass(); + csXyz angle = shape_angle; + cXyz vec1, vec2; + cXyz particle_scale(1.0f, 1.0f, 1.0f); + mHeadAngle_Clear(); + mDamageTimer = 50; + s16 angle_to_player; + int index; + + switch (mMode) { + case 0: + mHintTimer1 = 0; + mHandAtLCyl.OffAtSetBit(); + mHandAtRCyl.OffAtSetBit(); + if (!startDemoCheck()) { + break; + } + mColBlend = 0.0f; + for (int i = 0; i < 2; i++) { + dComIfGp_particle_set(eff_spHit_id[i], ¤t.pos, &shape_angle, NULL); + } + field_0x84d = 0; + mClearTrap(true); + daPy_getPlayerActorClass()->i_changeOriginalDemo(); + daPy_getPlayerActorClass()->i_changeDemoMode(14, 1, 0, 0); + angle_to_player = fopAcM_searchPlayerAngleY(this); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&player->current.pos, angle_to_player, 0); + dComIfGp_getVibration().StartShock(5, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + field_0x7d0 = fopAcM_searchPlayerAngleY(this); + setBck(Ds_damage_wait_id[mBackboneJoint], 2, 3.0f, 1.0f); + mIsDemo = true; + field_0x85e = false; + if (mMode == 0) { + mActionTimer = 5; + } else { + mActionTimer = 30; + } + mMode++; + break; + + case 1: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + daPy_getPlayerActorClass()->i_changeDemoMode(14, 2, 0, 0); + mActionTimer = 41; + mIsOpeningDemo = false; + if (mBackboneJoint < 2) { + mBrokenBone = mBackboneJoint; + mMode++; + } else { + mDead = true; + mIsOpeningDemo = true; + mMode = 10; + } + break; + + case 2: + if (cLib_calcTimer(&mActionTimer) == 1 && + (mAnmID == ANM_DAMAGE_A_WAIT || mAnmID == ANM_DAMAGE_B_WAIT)) + { + setBck(Ds_damage_id[mBrokenBone], 0, 3.0f, 1.0f); + } + + if (mActionTimer == 0 && mAnmID != ANM_DAMAGE_A && mAnmID != ANM_DAMAGE_B + && ((mBrokenBone == 0 && mpMorf->checkFrame(24.0f)) + || (mBrokenBone != 0 && mpMorf->checkFrame(7.0f)))) + { + int index = mBackboneJoint * 4; + for (int i = 0; i < 4; i++) { + JPABaseEmitter* emitter = dComIfGp_particle_set(BROKENBORN_EFF_DT[index + i].eff_id, + ¤t.pos, &shape_angle, NULL); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix( + mpMorf->getModel()->i_getAnmMtx(BROKENBORN_EFF_DT[index + i].joint_no)); + } + } + + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_BONE_BRK, 0, -1); + damageSet(); + mBackboneJoint++; + + angle_to_player = fopAcM_searchPlayerAngleY(this); + for (int i = 0; i < 15; i++) { + mDoMtx_YrotS(*calc_mtx, angle_to_player); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = 1000.0f; + MtxPosition(&vec1, &vec2); + vec2 += current.pos; + if (mAcch.GetGroundH() != -1e9f) { + vec2.y = mAcch.GetGroundH(); + } + angle = shape_angle; + angle.y = fopAcM_searchPlayerAngleY(this); + fopAc_ac_c* actor; + if (mStaltroopID[i] != 0 && !fopAcM_SearchByID(mStaltroopID[i], &actor)) { + mStaltroopID[i] = 0; + } + if (mStaltroopID[i] == 0) { + mStaltroopID[i] = fopAcM_createChild(PROC_E_ZS, fopAcM_GetID(this), 1, &vec2, + fopAcM_GetRoomNo(this), &angle, + NULL, -1, NULL); + } + } + + if (mBackboneJoint == 2) { + for (int i = 0; i < 5; i++) { + if (mStaltroop2ID[i] == 0) { + mStaltroop2ID[i] = fopAcM_createChild(PROC_E_ZS, fopAcM_GetID(this), 2, + ¤t.pos, fopAcM_GetRoomNo(this), + NULL, NULL, -1, NULL); + } + } + } + } + + field_0x7dc[mBrokenBone] -= 12.75f; + if (field_0x7dc[mBrokenBone] < 0.0f) { + field_0x7dc[mBrokenBone] = 0.0f; + } + damageHitCamera(); + damageDownCheck(); + if (field_0x85e && field_0x7dc[mBrokenBone] < 2.0f) { + mActionTimer = 30; + field_0x7dc[mBrokenBone] = 0.0f; + mMode = 3; + } + break; + + case 3: + damageDownCheck(); + mIsDemo = false; + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + + mDoMtx_YrotS(*calc_mtx, shape_angle.y); + vec1.zero(); + vec1.y = 1100.0f; + vec1.z = -1500.0f; + MtxPosition(&vec1, &vec2); + vec2 += current.pos; + cLib_addCalcPos(&mCameraCenter, vec2, 1.0f, 2000.0f, 300.0f); + vec1.zero(); + vec1.y = 1600.0f; + vec1.z = 4200.0f; + MtxPosition(&vec1, &vec2); + vec2 += current.pos; + cLib_addCalcPos(&mCameraEye, vec2, 1.0f, 2000.0f, 300.0f); + camera->mCamera.Set(mCameraCenter, mCameraEye); + + if (mpMorf->isStop()) { + mBrokenBone = 0; + f32 dist = fopAcM_searchPlayerDistance(this); + mDoMtx_YrotS(*calc_mtx, dist + 0x8000); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = -1000.0f; + MtxPosition(&vec1, &vec2); + vec2 += player->current.pos; + vec1 = player->current.pos; + camera->mCamera.Reset(player->current.pos, vec2); + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + i_dComIfGp_event_reset(); + + if (mBitSw3 != 0xff) { + i_fopAcM_offSwitch(this, mBitSw3); + } + mBirthTrapTimerF = 0x1e; + shape_angle.y = current.angle.y = fopAcM_searchPlayerAngleY(this) + 0xc000; + setActionMode(ACT_BREATH_ATTACK, 0); + } + break; + + case 10: + field_0x7dc[mBackboneJoint] -= 12.75f; + if (field_0x7dc[mBackboneJoint] < 0.0f) { + field_0x7dc[mBackboneJoint] = 0.0f; + } + damageHitCamera(); + + if (cLib_calcTimer(&mActionTimer) == 0 && field_0x7dc[mBackboneJoint] == 0.0f) { + if (mBitSw != 0xff) { + i_fopAcM_offSwitch(this, mBitSw); + } + setBck(Ds_damage_id[mBackboneJoint], 0, 3.0f, 1.0f); + for (int i = 0; i < 4; i++) { + dComIfGp_particle_set(eff_LastSmoke_id[i], ¤t.pos, &home.angle, NULL); + } + vec1.x = 0.0f; + vec1.y = -1600.0f; + vec1.z = 2315.0f; + daPy_getPlayerActorClass()->i_changeDemoMode(4, 2, 0, 0); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&vec1, -0x8000, 0); + mMode++; + } + break; + + case 11: + cLib_addCalcAngleS2(&shape_angle.x, 2000, 8, 0x100); + cLib_addCalc0(&field_0x7f8, 0.1f, 0.01f); + + if (mpMorf->checkFrame(120.0f)) { + hand_smokeSet(1); + dComIfGp_getVibration().StartShock(1, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + mBossPhase = 1; + damageSet(); + int index = 8; + for (int i = 0; i < 4; i++) { + JPABaseEmitter* emitter = dComIfGp_particle_set(BROKENBORN_EFF_DT[index + i].eff_id, + ¤t.pos, &shape_angle, NULL); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix( + mpMorf->getModel()->i_getAnmMtx(BROKENBORN_EFF_DT[index + i].joint_no)); + } + } + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_BONE_BRK, 0, -1); + } + + if (mpMorf->checkFrame(241.0f)) { + hand_smokeSet(2); + dComIfGp_getVibration().StartShock(5, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + + if (mpMorf->checkFrame(145.0f)) { + for (int i = 0; i < 2; i++) { + mHitParticleKey[i] = dComIfGp_particle_set(mHitParticleKey[i], eff_smoke_id[i], + ¤t.pos, &angle, &particle_scale); + } + mSoundPos = current.pos; + dComIfGp_getVibration().StartShock(2, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + + index = 0; + if ((int)mpMorf->getFrame() > 130) { + index = 1; + } + if ((int)mpMorf->getFrame() < 140) { + shape_angle.y = home.angle.y; + current.angle.y = shape_angle.y; + mCameraCenter = down_center_dt[index]; + mCameraEye = down_eye_dt[index]; + } else { + cLib_addCalcPos(&mCameraCenter, down_center_dt[2], 0.8f, 1.0f, 0.5f); + cLib_addCalcPos(&mCameraEye, down_eye_dt[2], 0.8f, 1.0f, 0.5f); + } + camera->mCamera.Set(mCameraCenter, mCameraEye); + + if (mpMorf->checkFrame(215.0f)) { + dComIfGp_getVibration().StartShock(4, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + + if (!mpMorf->isStop()) { + break; + } + mActionTimer = 30; + mMode = 20; + // no break + + case 20: + if (cLib_calcTimer(&mActionTimer) != 0) { + if (mActionTimer == 1) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_EYE_OFF, 0, -1); + } + break; + } + + cLib_addCalc0(&field_0x7e8, 0.7f, 3.0f); + if (field_0x7e8 > 2.0f) { + break; + } + mActionTimer = 30; + field_0x7e8 = 0.0f; + mMode++; + // no break + + case 21: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + mCameraCenter = down_center_dt[3]; + mCameraEye = down_eye_dt[3]; + camera->mCamera.Set(mCameraCenter, mCameraEye); + dComIfGp_getVibration().StartShock(5, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + mActionTimer = 30; + mMode++; + // no break + + case 22: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + mColBlend = 0.0f; + mMode = 100; + mSound.startCreatureSound(Z2SE_EN_DS_MDEMO_FALL, 0, -1); + // no break + + case 100: + gravity = -0.2f; + if (current.pos.y > -1600.0f) { + if (current.pos.y <= -300.0f) { + dComIfGs_onZoneSwitch(6, fopAcM_GetRoomNo(this)); + } + break; + } + mBossPhase = 100; + u32 param = fopAcM_GetParam(this); + csXyz p2_angle; + p2_angle = shape_angle; + p2_angle.z = 0; + p2_angle.y = 0; + p2_angle.x = 0; + fopAcM_create(PROC_B_DS, param | PHASE_2, ¤t.pos, + fopAcM_GetRoomNo(this), &p2_angle, NULL, 0xff); + mMode = 101; + // no break + + case 101: + cLib_addCalc2(&mCameraCenter.y, down_center_dt[4].y, 0.7f, 10.0f); + cLib_addCalc2(&mCameraEye.y, down_eye_dt[4].y, 0.7f, 10.0f); + camera->mCamera.Set(mCameraCenter, mCameraEye); + if (fabsf(mCameraCenter.y - down_center_dt[4].y) > 2.0f + || fabsf(mCameraEye.y - down_eye_dt[4].y) > 2.0f) + { + break; + } + dComIfGp_getVibration().StopQuake(0x1f); + mActionTimer = 100; + mMode = 102; + // no break + + case 102: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + dKy_change_colpat(3); + vec1.set(0.0f, -1510.0f, 2315.0f); + vec2.set(0.0f, -1435.0f, 2525.0f); + camera->mCamera.Reset(vec1, vec2); + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + i_dComIfGp_event_reset(); + fopAcM_delete(this); + } + + if (mMode >= 100) { + cLib_addCalc(&mColBlend, 1.0f, 0.02f, 0.02f, 0.001f); + dKy_custom_colset(1, 3, mColBlend); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -3708,8 +5294,57 @@ asm void daB_DS_c::executeDamage() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeDamage__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D1E30-805D203C 006CF0 020C+00 1/1 0/0 0/0 .text executeEtcDamage__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::executeEtcDamage() { + static int Ds_Etc_damage_id[9] = { + ANM_NODAMAGE_01_A, ANM_NODAMAGE_01_B, ANM_NODAMAGE_01_C, + ANM_NODAMAGE_02_A, ANM_NODAMAGE_02_B, ANM_NODAMAGE_02_C, + ANM_NODAMAGE_03_A, ANM_NODAMAGE_03_B, ANM_NODAMAGE_03_C, + }; + static int smokeSet_dt[3] = {32, 29, 29}; + switch (mMode) { + case 0: + dComIfGp_getVibration().StartShock(7, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + setBck(Ds_Etc_damage_id[mBackboneJoint], 0, 3.0f, 1.0f); + mColBlend = 0.0f; + mMode = 3; + break; + + case 1: + dComIfGp_getVibration().StartShock(7, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + setBck(Ds_Etc_damage_id[mBackboneJoint + 3], 0, 3.0f, 1.0f); + mColBlend = 0.0f; + mMode = 4; + break; + + case 2: + setBck(Ds_Etc_damage_id[mBackboneJoint + 6], 0, 3.0f, 1.0f); + mColBlend = 0.0f; + mMode = 5; + break; + + case 3: + case 4: + if ((int)mpMorf->getFrame() == smokeSet_dt[mBackboneJoint]) { + if (mMode == 4) { + hand_smokeSet(1); + } else { + hand_smokeSet(2); + } + } + // no break + + case 5: + if (mpMorf->isStop()) { + setActionMode(ACT_WAIT, 0); + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -3718,8 +5353,40 @@ asm void daB_DS_c::executeEtcDamage() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeEtcDamage__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D203C-805D226C 006EFC 0230+00 1/1 0/0 0/0 .text breath_smokeSet__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +void daB_DS_c::breath_smokeSet() { + static u16 effId[3] = {0x85F6, 0x89B0, 0x89B1}; + cXyz particle_scale(1.0f, 1.0f, 1.0f); + cLib_addCalc2(&mBreathTimerBase, 50.0f, 0.7f, 4.0f); + breathTimerBase = (int)mBreathTimerBase; + for (int i = 0; i < 3; i++) { + mBreathSmokeParticleKey[i] = dComIfGp_particle_set(mBreathSmokeParticleKey[i], effId[i], + &mHeadPos, &mHeadAngle, &particle_scale); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mBreathSmokeParticleKey[i]); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix(mpMorf->getModel()->i_getAnmMtx(6)); + } + } + Z2GetAudioMgr()->seStartLevel(Z2SE_OBJ_DS_FIRE_CLMN, &mHeadPos, + 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); + mBreathTimeCount++; + mBreathTimeCount &= 3; + if (mBreathTimeCount == 0) { + cXyz vec = mMouthPos - mBulletPos; + csXyz bullet_angle; + bullet_angle.x = -vec.atan2sY_XZ(); + bullet_angle.y = vec.atan2sX_Z(); + bullet_angle.z = 0; + cXyz bullet_pos = mBulletPos; + fopAcM_create(PROC_B_DS, BULLET_A, &bullet_pos, fopAcM_GetRoomNo(this), + &bullet_angle, NULL, 0xff); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -3728,6 +5395,7 @@ asm void daB_DS_c::breath_smokeSet() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/breath_smokeSet__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCE5C-805DCE60 000408 0004+00 0/1 0/0 0/0 .rodata @7321 */ @@ -3745,6 +5413,61 @@ COMPILER_STRIP_GATE(0x805DCE60, &lit_7322); #pragma pop /* 805D226C-805D2520 00712C 02B4+00 1/1 0/0 0/0 .text executeBreathAttack__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +void daB_DS_c::executeBreathAttack() { + static int Ds_breath_id[9] = { + ANM_ATTACK02_A_A, ANM_ATTACK02_B_A, ANM_ATTACK02_C_A, + ANM_ATTACK02_A_B, ANM_ATTACK02_B_B, ANM_ATTACK02_C_B, + ANM_ATTACK02_A_C, ANM_ATTACK02_B_C, ANM_ATTACK02_C_C, + }; + switch (mMode) { + case 0: + mColBlend = 0.0f; + field_0x840 = 1; + mBh2AttackAngleF = 0; + setBck(Ds_breath_id[mBackboneJoint * 3], 0, 10.0f, 1.0f); + mMode = 1; + break; + + case 1: + if (mpMorf->checkFrame(82.0f)) { + hand_smokeSet(0); + mSound.startCreatureSound(Z2SE_EN_DS_HANDS, 0, -1); + } + if ((int)mpMorf->getFrame() > 82) { + cLib_addCalcAngleS2(&mBh2AttackAngleF, 10000, 10, 0x100); + } + if (mpMorf->isStop()) { + setBck(Ds_breath_id[mBackboneJoint * 3 + 1], 2, 3.0f, 1.0f); + mActionTimer = 185; + mBreathTimerBase = 0.0f; + breathTimerBase = 0; + mMode = 2; + } + break; + + case 2: + if (mActionTimer == 0 || daPy_getPlayerActorClass()->getDamageWaitTimer() > 10) { + setBck(Ds_breath_id[mBackboneJoint * 3 + 2], 0, 3.0f, 1.0f); + mColBlend = 0.0f; + mMode = 3; + } else if (cLib_calcTimer(&mActionTimer) != 0) { + cLib_addCalcAngleS2(&mBh2AttackAngleF, 5000, 10, 0x100); + cLib_addCalc(&mColBlend, 1.0f, 0.02f, 0.02f, 0.04f); + dKy_custom_colset(1, 5, mColBlend); + field_0x840 = 5; + breath_smokeSet(); + } + break; + + case 3: + if (mpMorf->isStop()) { + setActionMode(ACT_WAIT, 0); + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -3753,6 +5476,7 @@ asm void daB_DS_c::executeBreathAttack() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeBreathAttack__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCE64-805DCE68 000410 0004+00 0/2 0/0 0/0 .rodata @7385 */ @@ -3770,6 +5494,50 @@ COMPILER_STRIP_GATE(0x805DCE68, &lit_7386); #pragma pop /* 805D2520-805D272C 0073E0 020C+00 1/1 0/0 0/0 .text executeHandAttack__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::executeHandAttack() { + static int Ds_HandAt_id[6] = { + ANM_ATTACK_R_A, ANM_ATTACK_R_B, ANM_ATTACK_R_C, + ANM_ATTACK_L_A, ANM_ATTACK_L_B, ANM_ATTACK_L_C, + }; + + switch (mMode) { + case 0: + mChkHigh = 0.0f; + setBck(Ds_HandAt_id[mBackboneJoint + mAttackingHand * 3], 0, 10.0f, 1.0f); + mMode++; + break; + + case 1: + if ((int)mpMorf->getFrame() > 90 && (int)mpMorf->getFrame() < 110) { + bool bvar1 = false; + int ivar3 = (int)((mpMorf->getFrame() - 90.0f) / 4.0f) + 7; + if ((int)mChkHigh < ivar3) { + mChkHigh = ivar3; + bvar1 = true; + } + if (mAttackingHand == 0) { + mHandAtRCyl.OnAtSetBit(); + if ((int)mpMorf->getFrame() > 100 && bvar1) { + hand_smokeSet(2); + } + } else { + mHandAtLCyl.OnAtSetBit(); + if ((int)mpMorf->getFrame() > 100 && bvar1) { + hand_smokeSet(1); + } + } + } else { + mHandAtLCyl.OffAtSetBit(); + mHandAtRCyl.OffAtSetBit(); + } + if (mpMorf->isStop()) { + setActionMode(ACT_WAIT, 0); + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -3778,8 +5546,43 @@ asm void daB_DS_c::executeHandAttack() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeHandAttack__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D272C-805D28D0 0075EC 01A4+00 1/1 0/0 0/0 .text executeBreathSearch__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::executeBreathSearch() { + static int Ds_BS_id[3] = {ANM_ATTACK01_A, ANM_ATTACK01_B, ANM_ATTACK01_C}; + mHeadAngle_Clear(); + + switch (mMode) { + case 0: + setBck(Ds_BS_id[mBackboneJoint], 0, 10.0f, 1.0f); + mMode++; + // no break + + case 1: + if ((int)mpMorf->getFrame() >= 177 && (int)mpMorf->getFrame() <= 195) { + mHandAtRCyl.OnAtSetBit(); + mHandAtLCyl.OnAtSetBit(); + hand_smokeSet(0); + } else { + mHandAtLCyl.OffAtSetBit(); + mHandAtRCyl.OffAtSetBit(); + } + if (mpMorf->isStop() && !mHandBreathChk()) { + setActionMode(ACT_WAIT, 0); + } + break; + } + + if ((int)mpMorf->getFrame() > 70 && (int)mpMorf->getFrame() < 150) { + s16 angle = fopAcM_searchPlayerAngleY(this); + cLib_addCalcAngleS2(¤t.angle.y, angle, 40, 0x200); + shape_angle.y = current.angle.y; + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -3788,6 +5591,7 @@ asm void daB_DS_c::executeBreathSearch() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeBreathSearch__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCE6C-805DCE70 000418 0004+00 0/1 0/0 0/0 .rodata @7892 */ @@ -4063,6 +5867,7 @@ SECTION_RODATA static f32 const lit_7930 = 760.0f; COMPILER_STRIP_GATE(0x805DCF04, &lit_7930); #pragma pop +#ifndef NONMATCHING /* 805DDF98-805DDFA8 000530 000C+04 0/1 0/0 0/0 .bss @7447 */ #pragma push #pragma force_active on @@ -4182,8 +5987,287 @@ static u8 lit_7471[12]; #pragma force_active on static u8 mOp2EyeDt[84]; #pragma pop +#endif /* 805D28D0-805D3900 007790 1030+00 2/1 0/0 0/0 .text executeBattle2OpeningDemo__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +void daB_DS_c::executeBattle2OpeningDemo() { + camera_class* camera = dComIfGp_getCamera(i_dComIfGp_getPlayerCameraID(0)); + daPy_py_c* player = daPy_getPlayerActorClass(); + cXyz vec, center, eye, unused; + center.zero(); + + static cXyz mOp2PlayerDt[3] = { + cXyz(315.0f, 1800.0f, 1460.0f), + cXyz(415.0f, 1800.0f, 1880.0f), + cXyz(465.0f, 1400.0f, 1980.0f), + }; + + static cXyz mOp2CenterDt[7] = { + cXyz(-255.0f, -1460.0f, 3320.0f), + cXyz(-255.0f, 3070.0f, 3340.0f), + cXyz(145.0f, 1940.0f, 1520.0f), + cXyz(165.0f, 1930.0f, 1515.0f), + cXyz(180.0f, 2083.0f, 1490.0f), + cXyz(450.0f, 1880.0f, 1955.0f), + cXyz(1815.0f, 2370.0f, 1660.0f), + }; + + static cXyz mOp2EyeDt[7] = { + cXyz(-290.0f, -1560.0f, 3690.0f), + cXyz(-290.0f, 3230.0f, 3690.0f), + cXyz(-15.0f, 2005.0f, 1180.0f), + cXyz(180.0f, 1840.0f, 1885.0f), + cXyz(45.0f, 2260.0f, 1250.0f), + cXyz(600.0f, 1770.0f, 2225.0f), + cXyz(2145.0f, 2410.0f, 1635.0f), + }; + + static u16 eff_Sand_id[2] = {0x8BF6, 0x8BF7}; + + unused.set(1.0f, 1.0f, 1.0f); + mHintTimer2 = l_HIO.mHintTime1; + + switch (mMode) { + case 0: + mGroundUpY = 150.0f; + shape_angle.z = -0x2134; + if (!mIsDemo) { + break; + } + mMode++; + // no break + + case 1: + if (!startDemoCheck()) { + break; + } + mCameraCenter = mOp2CenterDt[0]; + mCameraEye = mOp2EyeDt[0]; + Z2GetAudioMgr()->subBgmStart(Z2BGM_HARAGIGANT_D02); + mMode++; + // no break + + case 2: + if (player->current.pos.y < -745.0f) { + break; + } + mCameraCenter = mOp2CenterDt[1]; + mCameraEye = mOp2EyeDt[1]; + mMode++; + // no break + + case 3: + if (mIsDemo) { + break; + } + mActionTimer = 30; + mMode++; + // no break + + case 4: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + mMode++; + // no break + + case 5: + vec = mOp2PlayerDt[0]; + daPy_getPlayerActorClass()->i_changeDemoMode(4, 2, 0, 0); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&vec, 0x570, 0); + mCameraCenter = mOp2CenterDt[2]; + mCameraEye = mOp2EyeDt[2]; + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_MDEMO_REBOOT, 0, -1); + mGroundUpY = 0.0f; + mActionTimer = 50; + mMode++; + // no break + + case 6: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + mActionTimer = 18; + daPy_getPlayerActorClass()->i_changeDemoMode(25, 0, 0, 0); + mMode++; + // no break + + case 7: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + gravity = 0.0f; + speed.y = 0.0f; + mSound.startCreatureSoundLevel(Z2SE_EN_DS_H_FLOAT, 0, -1); + daPy_getPlayerActorClass()->i_changeDemoMode(23, 1, 0, 0); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&mOp2PlayerDt[0], -0x8000, 0); + vec = mOp2PlayerDt[0]; + mCameraCenter = mOp2CenterDt[3]; + mCameraEye = mOp2EyeDt[3]; + current.pos.y = 2050.0f; + current.pos.x = -140.0f; + current.pos.z = 360.0f; + shape_angle.x = 0; + shape_angle.y = 0x1000; + current.angle.y = 0x1000; + shape_angle.z = 0; + cLib_addCalc2(&field_0x7e8, 255.0f, 0.7f, 5.0f); + daPy_getPlayerActorClass()->i_changeDemoMode(23, 1, 2, 0); + mMode++; + // no break + + case 8: + cLib_addCalc2(&field_0x7e8, 255.0f, 0.7f, 5.0f); + for (int i = 0; i < 2; i++) { + mSandParticleKey[i] = dComIfGp_particle_set(mSandParticleKey[i], eff_Sand_id[i], + ¤t.pos, &shape_angle, NULL); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mSandParticleKey[i]); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix(mpMorf->getModel()->i_getAnmMtx(0)); + } + } + vec = player->current.pos - mMouthPos; + current.angle.x = vec.atan2sY_XZ(); + cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, 20, 0x200); + cLib_addCalc2(&field_0x7f8, 0.5f, 0.1f, 0.01f); + cLib_addCalc2(¤t.pos.y, 2400.0f, 0.8f, 5.0f); + mSound.startCreatureSoundLevel(Z2SE_EN_DS_H_FLOAT, 0, -1); + center = mSwordPos; + center.y += 500.0f; + if (center.y < mOp2CenterDt[3].y) { + center.y = mOp2CenterDt[3].y; + } + if (center.y > mCameraCenter.y) { + cLib_addCalc2(&mCameraCenter.y, center.y, 0.8f, 5.0f); + } + if (fabsf(current.pos.y - 2400.0f) > 2.0f) { + break; + } + mActionTimer = 50; + current.pos.y = 2400.0f; + mMode = 10; + // no break + + case 10: + vec = player->current.pos - mMouthPos; + current.angle.x = vec.atan2sY_XZ(); + cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, 20, 0x200); + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + vec = mOp2PlayerDt[1]; + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&vec, -0x664a, 0); + mActionTimer = 30; + mMode++; + // no break + + case 11: + current.pos.x = -140.0f; + current.pos.z = 760.0f; + mCameraCenter = mOp2CenterDt[4]; + mCameraEye = mOp2EyeDt[4]; + vec = player->current.pos - mMouthPos; + current.angle.x = vec.atan2sY_XZ(); + cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, 20, 0x200); + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + field_0x6f4 = current.pos; + daPy_getPlayerActorClass()->i_changeDemoMode(25, 0, 0, 0); + mActionTimer = 30; + mMode++; + break; + + case 12: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + mActionTimer = 30; + daPy_getPlayerActorClass()->i_changeDemoMode(23, 1, 2, 0); + mMode++; + // no break + + case 13: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + current.angle.y = shape_angle.y = + fopAcM_searchPlayerAngleY(this); + field_0x790.zero(); + mCameraCenter = mOp2CenterDt[5]; + mCameraEye = mOp2EyeDt[5]; + mActionTimer = 30; + mMode++; + // no break + + case 14: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + setBck(ANM_HEAD_FATTACK_A, 0, 3.0f, 1.0f); + field_0x718 = player->current.pos; + mMode++; + // no break + + case 15: + if ((int)mpMorf->getFrame() < 30) { + break; + } + if (mpMorf->checkFrame(35.0f)) { + mSound.startCreatureVoice(Z2SE_EN_DS_H_V_ATK, -1); + } + daPy_getPlayerActorClass()->i_changeDemoMode(9, 1, 0, 0); + speedF = 150.0f; + dCam_getBody()->StartBlure(40, this, 0.8f, 1.2f); + dComIfGp_getVibration().StartShock(6, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + mCameraCenter = mOp2CenterDt[6]; + mCameraEye = mOp2EyeDt[6]; + mActionTimer = 50; + mMode++; + // no break + + case 16: + cLib_addCalc0(&speedF, 0.7f, 10.0f); + if (cLib_calcTimer(&mActionTimer) != 0) { + if (mActionTimer == 20) { + center.set(644.0f, -1495.0f, 2194.0f); + eye.set(968.0f, -1421.0f, 2169.0f); + camera->mCamera.Reset(center, eye); + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + i_dComIfGp_event_reset(); + dComIfGs_onOneZoneSwitch(6, fopAcM_GetRoomNo(this)); + } + } else { + vec.set(644.0f, -1600.0f, 2195.0f); + dComIfGs_setRestartRoom(vec, -0x664a, 50); + attention_info.field_0x0[2] = 0; + attention_info.flags = 4; + group = 2; + Z2GetAudioMgr()->bgmStart(Z2BGM_HARAGIGANT_BTL02, 0, 0); + mSetFirstPos(); + setActionMode(ACT_B2_WAIT, 0); + } + } + + if (mMode > 6) { + cLib_addCalc(&mColBlend, 1.0f, 0.01f, 0.01f, 0.001f); + dKy_custom_colset(3, 2, mColBlend); + } + + if (mMode >= 10) { + mSandPos.y = current.pos.y; + mFuwafuwaSet(false); + } + + if (mMode >= 2) { + camera->mCamera.Set(mCameraCenter, mCameraEye); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4192,8 +6276,23 @@ asm void daB_DS_c::executeBattle2OpeningDemo() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeBattle2OpeningDemo__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D3900-805D39A4 0087C0 00A4+00 2/2 0/0 0/0 .text mFlyBMove__8daB_DS_cFf */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::mFlyBMove(f32 param_0) { + cLib_addCalc2(&mChkHigh, param_0, 0.8f, 30.0f); + mSandPos.y += mChkHigh; + f32 step = fabsf(mSandPos.y - current.pos.y); + if (step < 1.0f) { + step = 1.0f; + } else if (step > 30.0f) { + step = 30.0f; + } + cLib_addCalc2(¤t.pos.y, mSandPos.y, 0.8f, step); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4202,8 +6301,61 @@ asm void daB_DS_c::mFlyBMove(f32 param_0) { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mFlyBMove__8daB_DS_cFf.s" } #pragma pop +#endif /* 805D39A4-805D3D14 008864 0370+00 5/5 0/0 0/0 .text mFuwafuwaSet__8daB_DS_cFb */ +#ifdef NONMATCHING +// matches with literals / generics +void daB_DS_c::mFuwafuwaSet(bool param_0) { + if (fabsf(current.pos.y - mSandPos.y) < 20.0f) { + field_0x82c += 2.0f; + cLib_addCalc2(&field_0x790.y, cM_ssin(field_0x82c * 1000.0f) * 50.0f, 0.8f, 10.0f); + cLib_addCalc2(&field_0x790.x, cM_ssin(field_0x82c * 500.0f) * 50.0f, 0.5f, field_0x804); + cLib_addCalc2(&field_0x790.z, cM_scos(field_0x82c * 500.0f) * 50.0f, 0.5f, field_0x804); + cLib_addCalc2(&field_0x804, 4.0f, 0.8f, 0.3f); + } + mSoundPos = current.pos; + mSound.startCreatureSoundLevel(Z2SE_EN_DS_H_FLOAT, 0, -1); + + if (param_0) { + daPy_py_c* player = daPy_getPlayerActorClass(); + dBgS_GndChk gnd_chk; + f32 fvar2 = 1000.0f; + mSandPos.y = player->current.pos.y; + if (field_0x7ce > 0x2800) { + field_0x7ce = 0x2800; + } + if (mAction != ACT_B2_TIRED) { + if (daPy_getPlayerActorClass()->checkSpinnerPathMove() + || (daPy_getPlayerActorClass()->getSpinnerActor() != NULL + && !daPy_getPlayerActorClass()->getSpinnerActor()->checkGroundHit())) + { + cLib_calcTimer(&mOutTimer); + if (player->current.pos.y < l_HIO.mP2AttackHeight && mOutTimer != 0) { + mBh2AttackAngleF = 0x4800; + field_0x7ce = 0x4800; + mCreateFireBreath = false; + if (mParticleKey2 != 0) { + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticleKey2); + if (emitter != NULL) { + emitter->stopDrawParticle(); + mParticleKey2 = 0; + } + } + } else { + mOutTimer = 0; + mBirthTrapTimerF = 0; + } + fvar2 = 300.0f; + } + } else { + fvar2 = 300.0f; + } + cLib_addCalcAngleS2(&mBh2AttackAngleF, field_0x7ce, 20, 0x200); + mFlyBMove(fvar2); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4212,29 +6364,60 @@ asm void daB_DS_c::mFuwafuwaSet(bool param_0) { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mFuwafuwaSet__8daB_DS_cFb.s" } #pragma pop +#endif /* 805D3D14-805D3D80 008BD4 006C+00 1/1 0/0 0/0 .text mBattle2BreathFireSet__8daB_DS_cFUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::mBattle2BreathFireSet(u32 param_0) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBattle2BreathFireSet__8daB_DS_cFUl.s" +void daB_DS_c::mBattle2BreathFireSet(u32 params) { + fopAcM_createChild(PROC_B_DS, fopAcM_GetID(this), params, &mMouthPos, + fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL); + mCreateFireBreath = false; } -#pragma pop /* 805D3D80-805D3EA0 008C40 0120+00 3/3 0/0 0/0 .text mNeckAngleSet__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches but puts ~cXyz in the wrong place +bool daB_DS_c::mNeckAngleSet() { + s16 svar5 = 0; + cXyz vec = daPy_getPlayerActorClass()->current.pos - mMouthPos; + if (daPy_getPlayerActorClass()->checkSpinnerRide() && !mRailInOutCheck()) { + svar5 = -0x52c; + } + cLib_addCalcAngleS2(¤t.angle.y, svar5 + vec.atan2sX_Z(), 2, 0x1000); + cLib_addCalcAngleS2(¤t.angle.x, (s16)vec.atan2sY_XZ(), 8, 0x200); + shape_angle = current.angle; + return abs((s16)(shape_angle.y - (svar5 + vec.atan2sX_Z()))) <= 0x200; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daB_DS_c::mNeckAngleSet() { +asm bool daB_DS_c::mNeckAngleSet() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mNeckAngleSet__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D3EA0-805D3F90 008D60 00F0+00 2/2 0/0 0/0 .text mSetFirstPos__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::mSetFirstPos() { + daPy_py_c* player = daPy_getPlayerActorClass(); + home.pos.set(0.0f, 1900.0f, 0.0f); + cXyz vec1, vec2; + vec2 = player->current.pos - home.pos; + vec2.y = 0.0f; + mDoMtx_YrotS(*calc_mtx, vec2.atan2sX_Z() - 0x4800); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = l_HIO.mP2MoveAxis; + MtxPosition(&vec1, ¤t.pos); + current.pos += home.pos; + field_0x7e8 = 255.0f; + shape_angle.z = 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4243,28 +6426,73 @@ asm void daB_DS_c::mSetFirstPos() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mSetFirstPos__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D3F90-805D4054 008E50 00C4+00 2/2 0/0 0/0 .text mChkScreenIn__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +bool daB_DS_c::mChkScreenIn() { + camera_class* camera = dComIfGp_getCamera(0); + cXyz vec1, vec2; + vec2 = camera->mCamera.mEye - camera->mCamera.mCenter; + vec1 = camera->mCamera.mEye - current.pos; + return abs((s16)(vec1.atan2sX_Z() - vec2.atan2sX_Z())) < 0x3000; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daB_DS_c::mChkScreenIn() { +asm bool daB_DS_c::mChkScreenIn() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mChkScreenIn__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D4054-805D41CC 008F14 0178+00 2/2 0/0 0/0 .text mRailInOutCheck__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +bool daB_DS_c::mRailInOutCheck() { + cXyz vec = daPy_getPlayerActorClass()->current.pos - home.pos; + vec.y = 0.0f; + return !(vec.abs() < l_HIO.mP2MoveAxis); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daB_DS_c::mRailInOutCheck() { +asm bool daB_DS_c::mRailInOutCheck() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mRailInOutCheck__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D41CC-805D429C 00908C 00D0+00 1/1 0/0 0/0 .text executeBattle2Wait__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::executeBattle2Wait() { + switch (mMode) { + case 0: + mBh2AttackAngleF = 0x4800; + field_0x7ce = 0x4800; + mOutTimer = l_HIO.mP2OuterWallAttackTime; + mPlayPatternAnm = false; + field_0x82c = 0; + field_0x808 = 0.0f; + mCreateFireBreath = false; + mActionTimer = 0; + mWallR = 50.0f; + setBck(ANM_HEAD_FWAIT, 2, 10.0f, 1.0f); + mBirthTrapTimerF = l_HIO.mP2TrapCreateWaitTime1; + mTrapCreate = false; + setActionMode(ACT_B2_F_MOVE, 0); + break; + } + mNeckAngleSet(); + mFuwafuwaSet(true); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4273,16 +6501,84 @@ asm void daB_DS_c::executeBattle2Wait() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeBattle2Wait__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D429C-805D497C 00915C 06E0+00 2/2 0/0 0/0 .text mBattle2MoveFSet__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +bool daB_DS_c::mBattle2MoveFSet() { + daPy_py_c* player = daPy_getPlayerActorClass(); + f32 fvar9 = l_HIO.mP2MoveAxis; + bool cvar6 = mRailInOutCheck(); + cXyz vec1, vec2; + vec2 = field_0x718 - current.pos; + vec2.y = 0.0f; + if (mBh2AttackAngleF <= 0x2880 && vec2.abs() < 500.0f) { + if (!cvar6) { + fvar9 += 600.0f; + } else if (mAction != ACT_B2_TIRED) { + fvar9 += 700.0f; + } else { + fvar9 -= 700.0f; + } + } + cLib_addCalc2(&field_0x80c, fvar9, 1.0f, 20.0f); + bool ret = false; + + vec2 = player->current.pos - home.pos; + vec2.y = 0.0f; + mDoMtx_YrotS(*calc_mtx, vec2.atan2sX_Z() - mBh2AttackAngleF); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = field_0x80c; + MtxPosition(&vec1, &field_0x718); + + vec2 = field_0x718 - current.pos; + vec2.y = 0.0f; + f32 fvar8 = vec2.abs() - field_0x80c; + if (fvar8 < 10.0f || !mChkScreenIn()) { + fvar8 = 10.0f; + } else if (fvar8 > 30.0f) { + fvar8 = 30.0f; + } + fvar8 += player->speedF * 2.0f; + + vec2 = player->current.pos - home.pos; + vec2.y = 0.0f; + if (vec2.abs() > 2000.0f) { + cLib_addCalc2(&field_0x808, fvar8, 1.0f, 10.0f); + cLib_addCalc2(¤t.pos.x, field_0x718.x, 1.0f, field_0x808); + cLib_addCalc2(¤t.pos.z, field_0x718.z, 1.0f, field_0x808); + vec2 = field_0x718 - current.pos; + vec2.y = 0.0f; + if (mOutTimer == 0 || vec2.abs() < 200.0f) { + ret = true; + } + if (cLib_calcTimer(&mBirthTrapTimerF) == 0) { + if (mTrapID[6] != 0) { + mBirthTrapTimerF = l_HIO.mP2TrapCreateWaitTime2; + } else { + mBirthTrapTimerF = l_HIO.mP2TrapCreateWaitTime1; + } + mTrapCreate = true; + } + } + + if (daPy_getPlayerActorClass()->checkSpinnerPathMove()) { + field_0x6f4 = player->current.pos; + } + return ret; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daB_DS_c::mBattle2MoveFSet() { +asm bool daB_DS_c::mBattle2MoveFSet() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBattle2MoveFSet__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCF08-805DCF0C 0004B4 0004+00 0/2 0/0 0/0 .rodata @7931 */ @@ -4293,6 +6589,122 @@ COMPILER_STRIP_GATE(0x805DCF08, &lit_7931); #pragma pop /* 805D497C-805D5040 00983C 06C4+00 1/1 0/0 0/0 .text executeBattle2FMove__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +void daB_DS_c::executeBattle2FMove() { + daPy_py_c* player = daPy_getPlayerActorClass(); + bool cvar6 = mBattle2MoveFSet(); + bool cvar7 = false; + cXyz vec; + if (!cvar6 && daPy_getPlayerActorClass()->checkSpinnerRide()) { + vec = field_0x718 - current.pos; + cLib_addCalcAngleS2(¤t.angle.y, vec.atan2sX_Z(), 1, 0x400); + shape_angle.y = current.angle.y; + } else { + cvar7 = mNeckAngleSet(); + } + + switch (mMode) { + case 0: + mActionTimer = l_HIO.mP2BulletFireTime; + mCreateFireBreath = false; + setBck(ANM_HEAD_FWAIT, 2, 10.0f, 1.0f); + if (!daPy_getPlayerActorClass()->checkSpinnerRide()) { + field_0x808 = 0.0f; + mOutTimer = l_HIO.mP2OuterWallAttackTime; + } + mMode++; + // no break + + case 1: + case 2: + vec = player->current.pos - home.pos; + vec.y = 0.0f; + if (cLib_calcTimer(&mActionTimer) != 0) { + if (mActionTimer > 5) { + if (vec.abs() < 2000.0f) { + mActionTimer = 5; + } + } + } else { + if (vec.abs() > 2000.0f && (!cvar6 || !cvar7 || mBh2AttackAngleF > 0x2880)) { + break; + } + if (daPy_getPlayerActorClass()->getDamageWaitTimer() != 0) { + mOutTimer = l_HIO.mP2OuterWallAttackTime; + mTrapCreate = false; + } else { + if (mMode == 1) { + if (field_0x7ce > 0x2800) { + field_0x7ce = 0x2800; + } + } else { + setBck(ANM_HEAD_FATTACK_A, 0, 3.0f, 1.0f); + } + mMode++; + } + } + break; + + case 3: + if (!mpMorf->isStop()) { + if (mpMorf->checkFrame(35.0f)) { + mSound.startCreatureVoice(Z2SE_EN_DS_H_V_ATK, -1); + } + break; + } + setBck(ANM_HEAD_FATTACK_B, 2, 3.0f, 1.0f); + mCreateFireBreath = true; + mMode++; + // no break + + case 4: + if (mCreateFireBreath) { + field_0x6a8 = 3; + break; + } + if (daPy_getPlayerActorClass()->checkSpinnerRide() + && daPy_getPlayerActorClass()->getDamageWaitTimer() == 0) + { + field_0x7ce -= l_HIO.mP2ApproachAfterBullet; + if (field_0x7ce <= l_HIO.mP2ApproachDist) { + field_0x6a8 = 2; + setActionMode(ACT_B2_TIRED, 0); + break; + } + } else if (!daPy_getPlayerActorClass()->checkSpinnerRide() + || (daPy_getPlayerActorClass()->getSpinnerActor() != NULL + && daPy_getPlayerActorClass()->getSpinnerActor()->checkGroundHit())) + { + setBck(ANM_HEAD_FATTACK_C, 0, 3.0f, 1.0f); + mMode = 100; + break; + } + setBck(ANM_HEAD_FATTACK_C, 0, 3.0f, 1.0f); + mMode = 10; + break; + + case 10: + case 100: + if (mpMorf->isStop()) { + if (mMode == 10) { + mMode = 0; + } else { + setActionMode(ACT_B2_WAIT, 0); + } + } + break; + } + + if (cLib_calcTimer(&field_0x6a8) == 1 && mParticleKey2 != 0) { + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticleKey2); + if (emitter != NULL) { + emitter->stopDrawParticle(); + } + } + mFuwafuwaSet(true); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4301,8 +6713,65 @@ asm void daB_DS_c::executeBattle2FMove() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeBattle2FMove__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D5040-805D52D4 009F00 0294+00 1/1 0/0 0/0 .text executeBattle2Tired__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::executeBattle2Tired() { + switch (mMode) { + case 0: + setBck(ANM_HEAD_FATTACK_A, 0, 3.0f, 1.0f); + mTimerCount = 0; + mMode++; + break; + + case 1: + if (mAnmID == ANM_HEAD_FATTACK_A) { + if (mpMorf->checkFrame(35.0f)) { + mSound.startCreatureVoice(Z2SE_EN_DS_H_V_ATK, -1); + } + if (mpMorf->isStop()) { + setBck(ANM_HEAD_FATTACK_B, 2, 3.0f, 1.0f); + } + } + if (abs((s16)(mBh2AttackAngleF - 0x800)) > 0x100) { + break; + } + mCreateFireBreath = true; + mMode++; + // no break + + case 2: + if (!mCreateFireBreath) { + setBck(ANM_HEAD_FATTACK_C, 0, 3.0f, 1.0f); + mMode++; + } + break; + + case 3: + if (mpMorf->isStop()) { + mMode = 777; + } + break; + } + + if (!daPy_getPlayerActorClass()->checkSpinnerRide() + || daPy_getPlayerActorClass()->getDamageWaitTimer() != 0 || mMode == 777 + || (daPy_getPlayerActorClass()->getSpinnerActor() != NULL + && daPy_getPlayerActorClass()->getSpinnerActor()->checkGroundHit())) + { + setActionMode(ACT_B2_WAIT, 0); + } + + cLib_addCalcAngleS2(&mBh2AttackAngleF, 0x800, l_HIO.mP2ApproachAccel, l_HIO.mP2ApproachSpeedMax); + mSandPos.y = daPy_getPlayerActorClass()->current.pos.y; + mNeckAngleSet(); + mFlyBMove(100.0f); + mBattle2MoveFSet(); + mFuwafuwaSet(false); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4311,6 +6780,7 @@ asm void daB_DS_c::executeBattle2Tired() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeBattle2Tired__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCF0C-805DCF10 0004B8 0004+00 0/0 0/0 0/0 .rodata @7932 */ @@ -4392,6 +6862,264 @@ COMPILER_STRIP_GATE(0x805DCF34, &lit_8979); /* 805D52D4-805D60BC 00A194 0DE8+00 1/1 0/0 0/0 .text executeBattle2Damage__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +void daB_DS_c::executeBattle2Damage() { + camera_class* camera = dComIfGp_getCamera(i_dComIfGp_getPlayerCameraID(0)); + daPy_py_c* player = daPy_getPlayerActorClass(); + JPABaseEmitter* emitter; + dBgS_LinChk lin_chk; + dBgS_GndChk gnd_chk; + cXyz vec1, vec2, pos; + cXyz particle_scale(1.5f, 1.5f, 1.5f); + csXyz particle_angle; + pos = current.pos; + pos.y += 300.0f; + gnd_chk.SetPos(&pos); + pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (pos.y == -1e9f) { + pos.y = current.pos.y - 200.0f; + } + + switch (mMode) { + case 0: + if (!startDemoCheck()) { + break; + } + + vec2 = player->current.pos - home.pos; + vec2.y = 0.0f; + field_0x7d2 = vec2.atan2sX_Z(); + mDoMtx_YrotS(*calc_mtx, field_0x7d2); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = l_HIO.mP2MoveAxis; + MtxPosition(&vec1, &vec2); + vec2.y = player->current.pos.y; + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&vec2, -vec2.atan2sX_Z(), 0); + + mHintTimer2 = 0; + emitter = dComIfGp_particle_getEmitter(mParticleKey1); + if (emitter != NULL) { + emitter->stopDrawParticle(); + } + shape_angle.x = 0; + current.angle.x = 0; + setBck(ANM_HEAD_DAMAGE, 0, 3.0f, 1.0f); + + for (int i = 0; i < 5; i++) { + mHeadSph[i].OnTgSpinnerReflect(); + mHeadSph[i].OnTgIronBallRebound(); + mHeadSph[i].OffTgShield(); + mHeadSph[i].SetTgType(0); + mHeadSph[i].SetTgHitMark(CcG_Tg_UNK_MARK_0); + } + + shape_angle.x = 0; + mTimerCount = 0; + daPy_getPlayerActorClass()->i_changeOriginalDemo(); + daPy_getPlayerActorClass()->i_changeDemoMode(14, 0, 0, 0); + + vec2 = field_0x6f4 - home.pos; + vec2.y = 0.0f; + vec1 = home.pos - field_0x6f4; + vec1.y = 0.0f; + current.angle.y = vec1.atan2sX_Z(); + if (vec2.abs() < l_HIO.mP2MoveAxis) { + mAttackingHand = 0; + current.angle.y += 0x8000; + field_0x7d2 = vec2.atan2sX_Z() + 0x800; + } else { + mAttackingHand = 1; + field_0x7d2 = vec2.atan2sX_Z() + 0x1800; + } + + mDoMtx_YrotS(*calc_mtx, current.angle.y); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = 4000.0f; + MtxPosition(&vec1, &field_0x79c); + mWallR = 300.0f; + field_0x79c += current.pos; + if (field_0x79c.y > 1400.0f) { + field_0x79c.y = 1400.0f; + current.pos.y = 1400.0f; + } + + mSmokeCount = 0; + mMode++; + break; + + case 1: + mDoMtx_YrotS(*calc_mtx, field_0x7d2); + vec1.x = 0.0f; + vec1.y = 200.0f; + vec1.z = l_HIO.mP2MoveAxis; + MtxPosition(&vec1, &mCameraEye); + mCameraEye.y += current.pos.y; + mCameraCenter = current.pos; + + vec2 = mCameraEye - mCameraCenter; + shape_angle.y = vec2.atan2sX_Z(); + cLib_addCalcPos(¤t.pos, field_0x79c, 0.8f, 50.0f, 7.0f); + + if (!mAcch.ChkWallHit()) { + break; + } + + mSound.startCreatureSound(Z2SE_EN_DS_H_COL_WALL, 0, -1); + particle_angle = shape_angle; + particle_angle.x = 0x4000; + particle_angle.z = 0; + field_0x6d0 = mMouthPos; + mHitParticleKey[0] = dComIfGp_particle_set(mHitParticleKey[0], eff_smoke_id[1], + &field_0x6d0, &particle_angle, &particle_scale); + dScnPly_c::setPauseTimer(5); + dComIfGp_getVibration().StartShock(7, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + current.angle.y = shape_angle.y; + speedF = 0.0f; + field_0x7d0 = 0; + gravity = -3.0f; + field_0x7e8 = 0.0f; + mMode++; + // no break + + case 2: + mCameraCenter = current.pos; + if (!mAcch.i_ChkGroundHit() && current.pos.y - 100.0f > pos.y) { + break; + } + if (mAnmID != ANM_HEAD_DOWN) { + setBck(ANM_HEAD_DOWN, 0, 3.0f, 1.0f); + } + gravity = 0.0f; + speed.y = 0.0f; + particle_angle = shape_angle; + particle_angle.z = 0; + particle_angle.x = 0; + vec2 = current.pos; + vec2.y = mAcch.GetGroundH(); + mHitParticleKey[1] = dComIfGp_particle_set(mHitParticleKey[1], eff_smoke_id[1], + &vec2, &particle_angle, &particle_scale); + mSound.startCreatureSound(Z2SE_EN_DS_H_COL, 0, -1); + dComIfGp_getVibration().StartShock(3, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + mActionTimer = 50; + mMode++; + // no break + + case 3: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + camera->mCamera.Reset(mCameraCenter, mCameraEye); + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + i_dComIfGp_event_reset(); + attention_info.field_0x0[2] = 0x16; + mWeakSph.OnTgSetBit(); + mP2FallTimer = l_HIO.mP2FallTime; + mMode++; + // no break + + case 4: + if (mBattle2_damage_check()) { + return; + } + + mWeakSph.SetC(mSwordPos); + mWeakSph.SetR(140.0f); + dComIfG_Ccsp()->Set(&mWeakSph); + + if (cLib_calcTimer(&mP2FallTimer) != 0) { + mParticleKey1 = dComIfGp_particle_set(mParticleKey1, 0x8bf5, ¤t.pos, + &shape_angle, NULL); + emitter = dComIfGp_particle_getEmitter(mParticleKey1); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix(mpMorf->getModel()->i_getAnmMtx(0)); + } + Z2GetAudioMgr()->seStartLevel(Z2SE_EN_DS_SMOKE_2, &mSwordPos, + 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); + break; + } + + emitter = dComIfGp_particle_getEmitter(mParticleKey1); + if (emitter != NULL) { + emitter->stopDrawParticle(); + } + attention_info.field_0x0[2] = 0; + setBck(ANM_HEAD_DOWN_UP, 0, 3.0f, 1.0f); + Z2GetAudioMgr()->changeBgmStatus(1); + mWeakSph.OffTgSetBit(); + mMode++; + // no break + + case 5: + mDamageTimer = 100; + if (!mChkScreenIn()) { + mSetFirstPos(); + for (int i = 0; i < 5; i++) { + mHeadSph[i].OnTgShield(); + mHeadSph[i].SetTgType(0xd8fbfdff); + mHeadSph[i].SetTgHitMark(CcG_Tg_UNK_MARK_2); + mHeadSph[i].OffTgSpinnerReflect(); + mHeadSph[i].OffTgIronBallRebound(); + } + mDamageTimer = 100; + setActionMode(ACT_B2_WAIT, 0); + return; + } + + if ((int)mpMorf->getFrame() >= 20) { + if (mpMorf->checkFrame(20.0f)) { + mSound.startCreatureSound(Z2SE_EN_DS_H_DOWN_UP, 0, -1); + } + cLib_addCalc2(&mWallR, 500.0f, 0.7f, 30.0f); + cLib_addCalcAngleS2(&shape_angle.z, 0, 4, 0x400); + cLib_addCalc2(&field_0x7e8, 255.0f, 0.7f, 10.0f); + mFuwafuwaSet(true); + + if (field_0x7e8 > 254.0f && shape_angle.z < 0x100) { + field_0x7e8 = 255.0f; + shape_angle.z = 0; + for (int i = 0; i < 5; i++) { + mHeadSph[i].OnTgShield(); + mHeadSph[i].SetTgType(0xd8fbfdff); + mHeadSph[i].SetTgHitMark(CcG_Tg_UNK_MARK_2); + mHeadSph[i].OffTgSpinnerReflect(); + mHeadSph[i].OffTgIronBallRebound(); + } + setActionMode(ACT_B2_WAIT, 0); + return; + } + } + break; + } + + if (mMode >= 1 && mMode <= 3) { + camera->mCamera.Set(mCameraCenter, mCameraEye); + cLib_addCalc0(&field_0x7e8, 0.7f, 10.0f); + } + + if (mMode >= 1 && mMode <= 3) { + s16 target_z = 13000; + if (mAttackingHand == 0) { + target_z = -13000; + } + cLib_addCalcAngleS2(&shape_angle.z, target_z, 4, 0x400); + } + + if (mP2FallTimer != 0) { + if (mP2FallTimer > l_HIO.mP2FallTime / 3.0f) { + return; + } + if ((mP2FallTimer & 0x20) == 0) { + cLib_addCalc0(&field_0x7e8, 0.8f, 10.0f); + } else { + cLib_addCalc2(&field_0x7e8, 255.0f, 0.8f, 10.0f); + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4400,6 +7128,7 @@ asm void daB_DS_c::executeBattle2Damage() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeBattle2Damage__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCF38-805DCF3C 0004E4 0004+00 0/1 0/0 0/0 .rodata @9079 */ @@ -4431,14 +7160,107 @@ COMPILER_STRIP_GATE(0x805DCF44, &lit_9082); #pragma pop /* 805D60BC-805D6534 00AF7C 0478+00 1/1 0/0 0/0 .text mDeadMove__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +bool daB_DS_c::mDeadMove() { + mTimerCount++; + cXyz vec1; + cXyz vec2 = home.pos - (current.pos + field_0x790); + vec2.y = 0.0f; + + if (mTimerCount < 80) { + if (mAttackingHand != 0) { + shape_angle.z -= 0x80; + } else { + shape_angle.z += 0x80; + } + + field_0x83c++; + cLib_addCalc2(&field_0x790.x, cM_ssin(field_0x83c * -300.0f) * 1000.0f, 0.8f, 50.0f); + cLib_addCalc2(&field_0x790.z, cM_scos(field_0x83c * -100.0f) * -200.0f, 0.8f, 50.0f); + + vec2 = home.pos - (current.pos + field_0x790); + vec2.y = (home.pos.y + 8000.0f) - current.pos.y; + if (mTimerCount == 1) { + current.angle.y = vec2.atan2sX_Z(); + speedF = 40.0f; + } + current.angle.x = vec2.atan2sY_XZ(); + + mDoMtx_YrotS(*calc_mtx, current.angle.y); + mDoMtx_XrotM(*calc_mtx, current.angle.x); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = 80.0f; + MtxPosition(&vec1, &vec2); + speed.y = vec2.y; + + field_0x861 = false; + mActionTimer = 30; + } else { + if (mAnmID != ANM_HEAD_DAMAGE) { + setBck(ANM_HEAD_DAMAGE, 0, 3.0f, 1.0f); + } + + if (cLib_calcTimer(&mActionTimer) == 0) { + field_0x861 = true; + if (mAttackingHand != 0) { + shape_angle.z -= 0x80; + cLib_addCalc2(&speedF, 20.0f, 0.8f, 3.0f); + } else { + shape_angle.z += 0x80; + cLib_addCalc2(&speedF, 17.0f, 0.8f, 3.0f); + } + + vec2 = field_0x718 - (current.pos + field_0x790); + field_0x7ba.z = 0; + current.angle.x = vec2.atan2sY_XZ(); + current.angle.y = vec2.atan2sX_Z(); + + mDoMtx_YrotS(*calc_mtx, current.angle.y); + mDoMtx_XrotM(*calc_mtx, current.angle.x); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = 40.0f; + MtxPosition(&vec1, &vec2); + speed.y = vec2.y; + } else { + speed.y = 0.0f; + cLib_addCalc0(&speedF, 0.7f, 2.0f); + } + cLib_addCalc0(&field_0x7e8, 0.7f, 3.0f); + } + + s16 angle_scale, angle_step; + if (!field_0x861) { + angle_scale = 8; + angle_step = 0x200; + } else { + angle_scale = 40; + angle_step = 0x100; + } + cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, angle_scale, angle_step); + cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, angle_scale, angle_step); + + vec2 = current.pos + field_0x790; + cLib_addCalcPos(&mCameraCenter, vec2, 1.0f, 100.0f, 20.0f); + + if (mTimerCount < 0x50 || home.pos.y + 700.0f < current.pos.y) { + return false; + } else { + return true; + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daB_DS_c::mDeadMove() { +asm bool daB_DS_c::mDeadMove() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mDeadMove__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCF48-805DCF4C 0004F4 0004+00 0/2 0/0 0/0 .rodata @9560 */ @@ -4532,6 +7354,7 @@ SECTION_RODATA static f32 const lit_9572 = 3000.0f; COMPILER_STRIP_GATE(0x805DCF78, &lit_9572); #pragma pop +#ifndef NONMATCHING /* 805DE13C-805DE14C 0006D4 000C+04 0/1 0/0 0/0 .bss @9091 */ #pragma push #pragma force_active on @@ -4567,8 +7390,487 @@ static u8 lit_9099[12]; #pragma force_active on static u8 mEd22EyeDt[24]; #pragma pop +#endif /* 805D6534-805D7C10 00B3F4 16DC+00 2/1 0/0 0/0 .text executeBattle2Dead__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +void daB_DS_c::executeBattle2Dead() { + static cXyz mEd2CenterDt[2] = { + cXyz(70.0f, 890.0f, -1190.0f), + cXyz(-90.0f, 1890.0f, -2200.0f), + }; + static cXyz mEd22EyeDt[2] = { + cXyz(105.0f, 1880.0f, -945.0f), + cXyz(110.0f, 1880.0f, -885.0f), + }; + static u16 eff_Demo_sasi_id[2] = {0x8BF8, 0x8BF9}; + + camera_class* camera = dComIfGp_getCamera(i_dComIfGp_getPlayerCameraID(0)); + csXyz particle_angle = shape_angle; + cXyz vec1, vec2; + cXyz particle_scale(1.5f, 1.5f, 1.5f); + cXyz item_scale; + + switch (mMode) { + case 0: + if (!startDemoCheck()) { + break; + } + mSmokeCount = 0; + field_0x6f4 = current.pos; + home.angle = shape_angle; + field_0x7c0 = current.angle; + dComIfGp_getVibration().StartShock(5, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + // no break + + case 100: + field_0x790.zero(); + setBck(ANM_HEAD_DIEB, 2, 3.0f, 1.0f); + field_0x7e8 = 255.0f; + mTimerCount = 0; + mCameraFovy = 50.0f; + mWallR = 500.0f; + mGroundUpY = 500.0f; + vec2 = current.pos - home.pos; + if (mAttackingHand != 0) { + field_0x7d2 = vec2.atan2sX_Z() + 0x2000; + } else { + field_0x7d2 = vec2.atan2sX_Z() - 0x8000; + } + field_0x83c = 0; + speedF = 0.0f; + speed.y = 0.0f; + gravity = 0.0f; + current.angle.y = field_0x7d2; + daPy_getPlayerActorClass()->i_changeDemoMode(4, 1, 0, 0); + mDoMtx_YrotS(*calc_mtx, field_0x7d2); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = 1500.0f; + MtxPosition(&vec1, &vec2); + vec2 += field_0x6f4; + mCameraEye = vec2; + mMode = 1; + // no break + + case 1: + shape_angle.z += 0x100; + if (current.pos.y < 1700.0f) { + mCameraCenter = current.pos; + vec2 = current.pos; + vec2.y = 2500.0f; + cLib_addCalcPos(¤t.pos, vec2, 1.0f, 90.0f, 45.0f); + cLib_addCalcAngleS2(&shape_angle.x, -0x4000, 4, 0x400); + break; + } + speedF = 0.0f; + mMode++; + // no break + + case 2: + mWallR = 650.0f; + vec2 = current.pos - home.pos; + field_0x80c = 3400.0f; + mDoMtx_YrotS(*calc_mtx, vec2.atan2sX_Z()); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = field_0x80c; + MtxPosition(&vec1, &vec2); + vec2 += home.pos; + current.pos.x = vec2.x; + current.pos.y = 2500.0f; + current.pos.z = vec2.z; + + vec2 = home.pos - current.pos; + vec2.y = 0.0f; + field_0x80c = 3600.0f; + mDoMtx_YrotS(*calc_mtx, vec2.atan2sX_Z() + 10000); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = field_0x80c; + MtxPosition(&vec1, &vec2); + vec2 += home.pos; + vec2.y = 3400.0f; + mCameraEye = vec2; + + field_0x80c = 3600.0f; + vec2 = home.pos - current.pos; + mDoMtx_YrotS(*calc_mtx, vec2.atan2sX_Z()); + mDoMtx_XrotM(*calc_mtx, vec2.atan2sY_XZ()); + vec1.x = 0.0f; + vec1.y = 100.0f; + vec1.z = field_0x80c; + MtxPosition(&vec1, &vec2); + field_0x718 = vec2 + home.pos; + vec2 = field_0x718 - current.pos; + field_0x7ba.x = vec2.atan2sY_XZ(); + field_0x7ba.y = vec2.atan2sX_Z(); + field_0x7ba.z = 0; + current.angle = field_0x7ba; + + mCameraCenter = current.pos; + mMode++; + // no break + + case 3: + if (!mDeadMove()) { + break; + } + speedF = 0.0f; + speed.y = 0.0f; + gravity = 0.0f; + field_0x7e8 = 0.0f; + field_0x790.zero(); + field_0x7d2 -= 0x1000; + setBck(ANM_HEAD_DIE, 2, 3.0f, 1.0f); + speedF = 0.0f; + mMode++; + // no break + + case 4: + current.pos = field_0x718; + shape_angle.z = 0x5277; + shape_angle.x = 0x4a4; + current.angle.x = 0x4a4; + + vec2 = home.pos - current.pos; + vec2.y = 0.0f; + mDoMtx_YrotS(*calc_mtx, vec2.atan2sX_Z() - 40000); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = 3000.0f; + MtxPosition(&vec1, &vec2); + vec2 += home.pos; + vec2.y -= 3000.0f; + mCameraEye = vec2; + + vec2 = home.pos - current.pos; + vec1 = field_0x718 - current.pos; + + mSound.startCreatureSound(Z2SE_EN_DS_END_COL, 0, -1); + gravity = 0.0f; + speedF = 0.0f; + particle_angle = shape_angle; + particle_angle.x = 0x4000; + particle_angle.z = 0; + mDeathParticleKey = dComIfGp_particle_set(mDeathParticleKey, eff_smoke_id[1], + &field_0x718, &particle_angle, &particle_scale); + + current.angle.y = shape_angle.y; + vec2 = mCameraEye - current.pos; + vec2.y = mCameraEye.y - current.pos.y; + current.angle.y = vec2.atan2sX_Z() - 0x800; + current.angle.x = vec2.atan2sY_XZ(); + + mActionTimer = 10; + dComIfGp_getVibration().StartShock(6, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + mMode++; + break; + + case 5: + speedF = 50.0f; + mGroundUpY = 400.0f; + mDoMtx_YrotS(*calc_mtx, current.angle.y); + mDoMtx_XrotM(*calc_mtx, current.angle.x); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = speedF; + MtxPosition(&vec1, &vec2); + speed.y = vec2.y; + cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 20, 0x100); + cLib_addCalcAngleS2(&shape_angle.x, current.angle.x, 20, 0x100); + if (cLib_calcTimer(&mActionTimer) == 0) { + mMode++; + } + break; + + case 6: + if (mAcch.ChkGroundHit()) { + mGroundUpY = 500.0f; + dComIfGp_getVibration().StartShock(5, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + speedF = 50.0f; + speed.y = 70.0f; + gravity = -5.0f; + mMode++; + } + break; + + case 7: + vec2.zero(); + vec2.y = mAcch.GetGroundH() - current.pos.y; + current.angle.x = vec2.atan2sY_XZ(); + cLib_addCalcAngleS2(&shape_angle.x, 0, 8, 0x200); + cLib_addCalcAngleS2(&shape_angle.z, -0x4000, 10, 0x200); + if (mAcch.ChkGroundHit()) { + dComIfGp_getVibration().StartShock(4, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + current.angle.y -= 0x1830; + mGroundUpY = 400.0f; + speedF = 120.0f; + speed.y = 50.0f; + gravity = -5.0f; + mMode = 10; + } + break; + + case 10: + case 12: + case 14: + cLib_addCalcAngleS2(&shape_angle.z, -0x4000, 10, 0x200); + if (mAcch.ChkGroundHit()) { + dComIfGp_getVibration().StartShock(3, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + mMode++; + } + break; + + case 11: + case 13: + case 15: + if (mMode != 15) { + speedF = 180.0f; + speed.y = 20.0f; + gravity = -5.0f; + } else { + mActionTimer = 40; + } + mMode++; + break; + + case 16: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + + gravity = 0.0f; + speed.y = 0.0f; + speedF = 0.0f; + + vec2 = current.pos - home.pos; + mDoMtx_YrotS(*calc_mtx, vec2.atan2sX_Z() + 0x2000); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = vec2.abs() - 2500.0f; + MtxPosition(&vec1, &vec2); + vec2 += home.pos; + vec2.y = -1600.0f; + fopAcM_createDisappear(this, &vec2, 1, 0, 0xff); + + dComIfGp_getVibration().StartShock(7, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + mSound.startCreatureSound(Z2SE_EN_DS_END_COL_LAST, 0, -1); + daPy_getPlayerActorClass()->i_changeDemoMode(4, 1, 0, 0); + mActionTimer = 80; + mMode++; + // no break + + case 17: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + + mDead = true; + shape_angle.x = 0; + shape_angle.z = 0; + vec2.set(0.0f, 1800.0f, -900.0f); + daPy_getPlayerActorClass()->i_changeDemoMode(2, 0, 0, 0); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&vec2, 0x8000, 0); + + vec1.set(0.0f, 1800.0f, -1140.0f); + vec2 = vec1 - home.pos; + vec2.y = 0.0f; + mDoMtx_YrotS(*calc_mtx, (s16)vec2.atan2sX_Z()); + vec1.x = 0.0f; + vec1.y = -500.0f; + vec1.z = l_HIO.mP2MoveAxis - 600.0f; + MtxPosition(&vec1, ¤t.pos); + current.pos += home.pos; + + shape_angle.y = 0x4000; + mCameraCenter = current.pos; + mCameraCenter.y = mEd2CenterDt[0].y; + vec2 = mEd22EyeDt[0]; + mCameraEye = vec2; + mCameraFovy = 68.0f; + current.angle.x = -0x4000; + + vec1.set(0.0f, 1800.0f, -1140.0f); + vec2 = vec1 - home.pos; + vec2.y = 0.0f; + mDoMtx_YrotS(*calc_mtx, (s16)vec2.atan2sX_Z()); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = l_HIO.mP2MoveAxis - 1600.0f; + MtxPosition(&vec1, &field_0x718); + field_0x718 += home.pos; + + vec2 = field_0x718 - current.pos; + current.angle.y = vec2.atan2sX_Z(); + mActionTimer = 80; + mMode = 20; + // no break + + case 20: + vec2.set(0.0f, 1800.0f, -1140.0f); + daPy_getPlayerActorClass()->i_changeDemoPos0(&vec2); + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + Z2GetAudioMgr()->seStart(Z2SE_OBJ_DS_END_ZAN_SWD, ¤t.pos, + 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); + mMode++; + // no break + + case 21: + shape_angle.z += 0x2000; + cLib_addCalcAngleS2(¤t.angle.x, 0x4000, 100, 200); + mDoMtx_YrotS(*calc_mtx, current.angle.y); + mDoMtx_XrotM(*calc_mtx, current.angle.x); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = 30.0f; + MtxPosition(&vec1, &vec2); + speed.y = vec2.y; + if (speed.y < 0.0f) { + speed.y *= 4.0f; + } + if (abs(current.angle.x) > 0x2000) { + cLib_addCalc2(&speedF, 9.0f, 0.1f, 0.3f); + } + if (speed.y < 0.0f && current.pos.y <= 1955.0f) { + mMode++; + } + break; + + case 22: + if ((s16)shape_angle.z != 0) { + shape_angle.z += 0x2000; + } + cLib_addCalc2(&speedF, 9.0f, 0.1f, 0.3f); + if (current.pos.y > 1850.0f) { + break; + } + speedF = 0.0f; + speed.y = 0.0f; + gravity = 0.0f; + current.pos.y = 1850.0f; + vec2 = current.pos; + vec2.x += 85.0f; + vec2.y = 1800.0f; + dComIfGp_getVibration().StartShock(2, 0x4f, cXyz(0.0f, 1.0f, 0.0f)); + for (int i = 0; i < 2; i++) { + dComIfGp_particle_set(eff_Demo_sasi_id[i], &vec2, &shape_angle, NULL); + } + mActionTimer = 30; + mMode++; + // no break + + case 23: + if (cLib_calcTimer(&mActionTimer) == 0) { + mpSwordBrkAnm->init(mpSwordMorf->getModel()->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 80)), + 1, 1, 1.0f, 0, -1); + mColBlend = 0.0f; + field_0x840 = 4; + mMode++; + } + break; + + case 24: + if (mpSwordMorf->isStop()) { + vec2 = current.pos; + vec2.x += 85.0f; + vec2.y = 1800.0f; + dComIfGp_particle_set(0x8c20, &vec2, &shape_angle, NULL); + fopAcM_createDisappear(this, &vec2, 4, 1, 0xff); + mNoDrawSword = true; + mActionTimer = 80; + mMode++; + } + break; + + case 25: + if (cLib_calcTimer(&mActionTimer) != 0) { + if (mActionTimer == 70) { + item_scale.set(1.0f, 1.0f, 1.0f); + vec2 = current.pos; + vec2.x += 85.0f; + vec2.y = 1800.0f; + fopAcM_createItemForBoss(&vec2, 0x22, fopAcM_GetRoomNo(this), &shape_angle, + &item_scale, 0.0f, 0.0f, -1); + daPy_getPlayerActorClass()->i_changeDemoMode(30, 0, 0, 0); + } + cLib_addCalcPos(&mCameraCenter, mEd2CenterDt[1], 0.3f, 50.0f, 10.0f); + cLib_addCalcPos(&mCameraEye, mEd22EyeDt[1], 0.3f, 50.0f, 10.0f); + break; + } + daPy_getPlayerActorClass()->i_changeDemoMode(1, 0, 0, 0); + mActionTimer = 80; + mMode++; + // no break + + case 26: + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + i_fopAcM_onSwitch(this, 0x70); + mActionTimer = 140; + mMode++; + // no break + + case 27: + mCameraCenter.set(-280.0f, 1950.0f, -4150.0f); + mCameraEye.set(-340.0f, 2075.0f, -4505.0f); + mCameraFovy = 56.0f; + if (cLib_calcTimer(&mActionTimer) != 0) { + break; + } + i_fopAcM_onSwitch(this, 0x7b); + mActionTimer = 140; + mMode++; + // no break + + case 28: + mCameraCenter.set(410.0f, 1890.0f, -3835.0f); + mCameraEye.set(535.0f, 1725.0f, -3515.0f); + mCameraFovy = 59.0f; + if (cLib_calcTimer(&mActionTimer) == 0) { + camera->mCamera.Start(); + camera->mCamera.SetTrimSize(0); + i_dComIfGp_event_reset(); + dComIfGs_onStageBossEnemy(0x13); + dComIfGs_onEventBit(0x2010); + fopAcM_delete(this); + } + } + + if (mMode >= 20 && mMode <= 23) { + vec2 = current.pos; + if (mEd2CenterDt[0].y < current.pos.y) { + cLib_addCalc2(&mCameraCenter.y, current.pos.y, 0.8f, 100.0f); + } + vec2.x += 70.0f; + cLib_addCalc2(&mCameraCenter.x, vec2.x, 0.8f, 100.0f); + cLib_addCalc2(&mCameraCenter.z, vec2.z, 0.8f, 100.0f); + eyePos = current.pos; + } + + if (mMode >= 5 && mMode <= 15) { + cLib_addCalcPos(&mCameraCenter, current.pos, 0.8f, 100.0f, 40.0f); + } + + if (mMode >= 5 && mMode <= 16) { + mSmokeSet(); + } + + if (mMode >= 25 && mMode != 100) { + cLib_addCalc(&mColBlend, 1.0f, 0.01f, 0.01f, 0.001f); + dKy_custom_colset(2, 4, mColBlend); + } + + if (mMode != 0) { + camera->mCamera.Set(mCameraCenter, mCameraEye, mCameraFovy, 0); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4577,6 +7879,7 @@ asm void daB_DS_c::executeBattle2Dead() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeBattle2Dead__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCF7C-805DCF80 000528 0004+00 0/0 0/0 0/0 .rodata @9573 */ @@ -4713,6 +8016,104 @@ COMPILER_STRIP_GATE(0x805DCFC4, &lit_9720); #pragma pop /* 805D7C10-805D8078 00CAD0 0468+00 1/1 0/0 0/0 .text executeBullet__8daB_DS_cFv */ +#ifdef NONMATCHING +// stack alloc +void daB_DS_c::executeBullet() { + static u16 effId[4] = {0x89AC, 0x89AD, 0x89AE, 0x89AF}; + cXyz vec1, vec2; + switch (mMode) { + case 0: + if (mType == BULLET_A) { + speedF = -100.0f; + mBulletRadius = 100.0f; + mActionTimer = breathTimerBase; + mMode = 2; + break; + } else { + mBulletDistance = 500.0f; + mBulletRadius = 80.0f; + mActionTimer = 100; + mMode++; + } + // no break + + case 1: + if (!daPy_getPlayerActorClass()->checkSpinnerPathMove() + || (s16)(current.angle.y - home.angle.y) > 0x2000) { + speedF = 100.0f; + mActionTimer = 100; + mMode = 2; + } else { + fopAc_ac_c* parent_actor; + if (fopAcM_SearchByID(parentActorID, &parent_actor) && parent_actor != NULL) { + daB_DS_c* parent = static_cast(parent_actor); + vec1 = parent->field_0x6d0 - parent->mMouthPos; + current.angle.x = vec1.atan2sY_XZ(); + current.angle.y = vec1.atan2sX_Z(); + mDoMtx_YrotS(*calc_mtx, current.angle.y); + mDoMtx_XrotM(*calc_mtx, current.angle.x); + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = mBulletDistance; + MtxPosition(&vec1, &vec2); + current.pos = vec2 + parent->mMouthPos; + mBulletDistance += 100.0f; + } + mBulletRadius += 10.0f; + if (mBulletRadius > 240.0f) { + mBulletRadius = 240.0f; + } + } + break; + + case 2: + mDoMtx_YrotS(*calc_mtx, current.angle.y); + if (mType == BULLET_A) { + mDoMtx_XrotM(*calc_mtx, -current.angle.x); + } else { + mDoMtx_XrotM(*calc_mtx, current.angle.x); + } + vec1.x = 0.0f; + vec1.y = 0.0f; + vec1.z = speedF; + MtxPosition(&vec1, &speed); + if (cLib_calcTimer(&mActionTimer) == 0) { + fopAcM_delete(this); + } + break; + } + + if (mAcch.ChkWallHit() || mAcch.ChkGroundHit()) { + fopAcM_delete(this); + return; + } + + mBreathAtSph.SetC(current.pos); + mBreathAtSph.SetR(mBulletRadius); + dComIfG_Ccsp()->Set(&mBreathAtSph); + + if (mType == BULLET_B || mType == BULLET_C) { + cXyz scale(l_HIO.mP2ModelSize, l_HIO.mP2ModelSize, l_HIO.mP2ModelSize); + field_0x724 = current.pos - old.pos; + VECScale(&field_0x724, &field_0x724, 0.8f); + Z2GetAudioMgr()->seStartLevel(Z2SE_OBJ_DS_H_FIRE, ¤t.pos, + 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); + for (int i = 0; i < 4; i++) { + mBulletParticleKey[i] = dComIfGp_particle_set(mBulletParticleKey[i], effId[i], + ¤t.pos, ¤t.angle, &scale); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mBulletParticleKey[i]); + if (emitter != NULL) { + // JGeometry::TVec3 pos(current.pos); + JGeometry::TVec3 pos; + JGeometry::setTVec3f(¤t.pos.x, &pos.x); + emitter->setGlobalTranslation(pos); + emitter->setParticleCallBackPtr(dPa_control_c::getParticleTracePCB()); + emitter->setUserWork((u32)&field_0x724); + } + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4721,8 +8122,20 @@ asm void daB_DS_c::executeBullet() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/executeBullet__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D8078-805D80F0 00CF38 0078+00 1/1 0/0 0/0 .text mBulletAction__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::mBulletAction() { + executeBullet(); + fopAcM_posMove(this, mCcStts.GetCCMoveP()); + if (mType == BULLET_B || mType == BULLET_C) { + mAcchCir.SetWall(0.0f, 100.0f); + mAcch.CrrPos(dComIfG_Bgsp()); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4731,15 +8144,218 @@ asm void daB_DS_c::mBulletAction() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBulletAction__8daB_DS_cFv.s" } #pragma pop +#endif +#ifndef NONMATCHING /* ############################################################################################## */ /* 805DE1A4-805DE1A8 00073C 0004+00 1/1 0/0 0/0 .bss None */ static u8 data_805DE1A4[4]; /* 805DE1A8-805DE1B4 000740 000C+00 1/1 0/0 0/0 .bss mWaitDt$9733 */ static u8 mWaitDt[12]; +#endif /* 805D80F0-805D8D04 00CFB0 0C14+00 2/1 0/0 0/0 .text mSoundSE_Set__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::mSoundSE_Set() { + static JAISoundID mWaitDt[3] = { + Z2SE_EN_DS_V_WAIT_A, + Z2SE_EN_DS_V_WAIT_B, + Z2SE_EN_DS_V_WAIT_C, + }; + + switch (mAnmID) { + case ANM_WAIT01_A: + case ANM_WAIT01_B: + case ANM_WAIT01_C: + if (mpMorf->checkFrame(29.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(mWaitDt[mAnmID - ANM_WAIT01_A], -1); + } + break; + + case ANM_NODAMAGE_01_A: + case ANM_NODAMAGE_01_B: + case ANM_NODAMAGE_01_C: + if (mpMorf->checkFrame(25.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_NODMG, -1); + } + if (mpMorf->checkFrame(39.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_1, 0, -1); + } + break; + + case ANM_NODAMAGE_02_A: + case ANM_NODAMAGE_02_B: + case ANM_NODAMAGE_02_C: + if (mpMorf->checkFrame(28.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_NODMG, -1); + } + if (mpMorf->checkFrame(51.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_2, 0, -1); + } + break; + + case ANM_NODAMAGE_03_A: + case ANM_NODAMAGE_03_B: + case ANM_NODAMAGE_03_C: + if (mpMorf->checkFrame(42.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_NODMG, -1); + } + break; + + case ANM_ATTACK_L_A: + case ANM_ATTACK_L_B: + case ANM_ATTACK_L_C: + case ANM_ATTACK_R_A: + case ANM_ATTACK_R_B: + case ANM_ATTACK_R_C: + if (mpMorf->checkFrame(32.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_ATK_1, -1); + } + if (mpMorf->checkFrame(97.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_ATK_2, -1); + } + if (mpMorf->checkFrame(105.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_ATK, 0, -1); + } + break; + + case ANM_ATTACK02_A_A: + case ANM_ATTACK02_A_B: + case ANM_ATTACK02_A_C: + if (mpMorf->checkFrame(83.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_ATK_FIRE, -1); + } + break; + + case ANM_CIRCLE_L_A: + case ANM_CIRCLE_L_B: + case ANM_CIRCLE_L_C: + case ANM_CIRCLE_R_A: + case ANM_CIRCLE_R_B: + case ANM_CIRCLE_R_C: + if (mpMorf->checkFrame(32.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_1, 0, -1); + } + if (mpMorf->checkFrame(54.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_2, 0, -1); + } + if (mpMorf->checkFrame(92.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_1, 0, -1); + } + if (mpMorf->checkFrame(114.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_2, 0, -1); + } + break; + + case ANM_ATTACK01_A: + if (mpMorf->checkFrame(272.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_1, 0, -1); + } + if (mpMorf->checkFrame(314.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HAND_2, 0, -1); + } + // no break + + case ANM_ATTACK01_B: + case ANM_ATTACK01_C: + if (mpMorf->checkFrame(10.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_RTT, -1); + } + if (mpMorf->checkFrame(184.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_HANDS, 0, -1); + } + break; + + case ANM_DAMAGE_A_WAIT: + case ANM_DAMAGE_B_WAIT: + case ANM_LASTDAMAGE_WAIT: + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_WAIT, 0, -1); + break; + + case ANM_DAMAGE_A: + if (mpMorf->checkFrame(0.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_DMG_A, -1); + } + if (mpMorf->checkFrame(20.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_A_FALL, 0, -1); + } + if (mpMorf->checkFrame(28.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + if (mpMorf->checkFrame(54.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + break; + + case ANM_DAMAGE_B: + if (mpMorf->checkFrame(0.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_DMG_B, -1); + } + if (mpMorf->checkFrame(6.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_B_FALL, 0, -1); + } + if (mpMorf->checkFrame(33.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + if (mpMorf->checkFrame(45.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + break; + + case ANM_LASTDAMAGE: + if (mpMorf->checkFrame(0.0f)) { + mSoundPos = current.pos; + mSound.startCreatureVoice(Z2SE_EN_DS_V_DMG_L, -1); + } + if (mpMorf->checkFrame(124.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_L_FALL, 0, -1); + } + if (mpMorf->checkFrame(119.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + if (mpMorf->checkFrame(236.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_BODY, 0, -1); + } + if (mpMorf->checkFrame(240.0f)) { + mSoundPos = current.pos; + mSound.startCreatureSound(Z2SE_EN_DS_DMG_HAND, 0, -1); + } + break; + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4748,6 +8364,7 @@ asm void daB_DS_c::mSoundSE_Set() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mSoundSE_Set__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DCFC8-805DCFCC 000574 0004+00 0/0 0/0 0/0 .rodata @9967 */ @@ -4876,6 +8493,7 @@ SECTION_RODATA static f32 const lit_9984 = 236.0f; COMPILER_STRIP_GATE(0x805DD00C, &lit_9984); #pragma pop +#ifndef NONMATCHING /* 805DD010-805DD040 0005BC 0030+00 0/1 0/0 0/0 .rodata SEBONE_EFF_DT$9989 */ #pragma push #pragma force_active on @@ -4886,8 +8504,127 @@ SECTION_RODATA static u8 const SEBONE_EFF_DT[48] = { }; COMPILER_STRIP_GATE(0x805DD010, &SEBONE_EFF_DT); #pragma pop +#endif /* 805D8D04-805D91A4 00DBC4 04A0+00 2/1 0/0 0/0 .text action__8daB_DS_cFv */ +#ifdef NONMATCHING +// regalloc and one instruction out of order +void daB_DS_c::action() { + static const struct { + u16 particle; + int joint; + } SEBONE_EFF_DT[6] = { + {0x8BEF, 0}, + {0x8BF0, 0}, + {0x8BF1, 1}, + {0x8BF2, 1}, + {0x8BF3, 2}, + {0x8BF4, 2}, + }; + + int joint = mBackboneJoint; + if (mAction != ACT_OPENING_DEMO && joint < 3 && mBossPhase == 0) { + for (int i = 0; i < 2; i++) { + mDoMtx_stack_c::copy(model->i_getAnmMtx(SEBONE_EFF_DT[joint * 2 + i].joint)); + cXyz pos; + mDoMtx_stack_c::multVecZero(&pos); + mBackboneParticleKey[i] = dComIfGp_particle_set(mBackboneParticleKey[i], + SEBONE_EFF_DT[joint * 2 + i].particle, + &pos, &shape_angle, NULL); + } + Z2GetAudioMgr()->seStartLevel(Z2SE_EN_DS_SMOKE_1, ¤t.pos, + 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); + } + + if (cLib_calcTimer(&mHintTimer1) != 0 && mHintTimer1 == 1) { + dComIfGs_onOneZoneSwitch(5, fopAcM_GetRoomNo(this)); + } + if (mBackboneJoint != 0) { + mZsMoveChk(); + mZsMoveChk_Guard(); + } + damage_check(); + mCreateTrap(false); + + if (mAction != ACT_OPENING_DEMO && !dComIfGs_isZoneSwitch(8, fopAcM_GetRoomNo(this)) + && cLib_calcTimer(&mPedestalFallTimer) == 0) { + dComIfGs_onZoneSwitch(8, fopAcM_GetRoomNo(this)); + mSandFallTimer = l_HIO.mSandFallWaitTime; + } + + if (mType == PHASE_1 && dComIfGs_isZoneSwitch(8, fopAcM_GetRoomNo(this))) { + cLib_calcTimer(&mSandFallTimer); + if (mSandFallTimer >= 1 && mSandFallTimer <= 3 && mBitSw != 0xff) { + i_fopAcM_onSwitch(this, mBitSw); + mSandFallTimer = 0; + } + } + + switch (mAction) { + case ACT_OPENING_DEMO: + executeOpeningDemo(); + break; + case ACT_WAIT: + executeWait(); + break; + case ACT_CIRCLE: + executeCircle(); + break; + case ACT_DAMAGE: + executeDamage(); + break; + case ACT_ETC_DAMAGE: + executeEtcDamage(); + break; + case ACT_BREATH_ATTACK: + executeBreathAttack(); + break; + case ACT_HAND_ATTACK: + executeHandAttack(); + break; + case ACT_BREATH_SEARCH: + executeBreathSearch(); + break; + } + + if ((mAction != ACT_BREATH_ATTACK || mMode >= 3) && field_0x840 == 5) { + cLib_addCalc(&mColBlend, 1.0f, 0.02f, 0.02f, 0.04f); + if (mColBlend > 0.998f) { + field_0x840 = 1; + mColBlend = 1.0f; + } + dKy_custom_colset(5, 1, mColBlend); + } + + mSoundSE_Set(); + fopAcM_posMoveF(this, mCcStts.GetCCMoveP()); + mAcchCir.SetWall(300.0f, 600.0f); + f32 ground_up_y = -60.0f; + if (mAction == ACT_OPENING_DEMO) { + ground_up_y = 0.0f; + } + if (mAction != ACT_DAMAGE || mMode < 100) { + mAcch.SetGroundUpY(ground_up_y); + mAcch.CrrPos(dComIfG_Bgsp()); + } + + if (mBossPhase != 100) { + if (daPy_getPlayerActorClass()->checkWolfLock(this)) { + daPy_getPlayerActorClass()->cancelWolfLock(this); + } + mpMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + mpSwordBrkAnm->play(); + mpSwordMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + if (mDrawZant) { + mpZantMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } + if (mPlayPatternAnm) { + mpOpPatternBrkAnm->play(); + mpOpPatternBtkAnm->play(); + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4896,6 +8633,7 @@ asm void daB_DS_c::action() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/action__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DD040-805DD044 0005EC 0004+00 0/0 0/0 0/0 .rodata @10107 */ @@ -4941,6 +8679,68 @@ COMPILER_STRIP_GATE(0x805DD054, &lit_10205); #pragma pop /* 805D91A4-805D951C 00E064 0378+00 1/1 0/0 0/0 .text mtx_set__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::mtx_set() { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_stack_c::scaleM(l_HIO.mModelSize, l_HIO.mModelSize, l_HIO.mModelSize); + if (mPlayPatternAnm) { + mpOpPatternModel->i_setBaseTRMtx(mDoMtx_stack_c::get()); + } + J3DModel* model = mpMorf->getModel(); + model->i_setBaseTRMtx(mDoMtx_stack_c::get()); + mpMorf->modelCalc(); + + mDoMtx_stack_c::copy(model->i_getAnmMtx(6)); + mDoMtx_stack_c::multVecZero(&mHeadPos); + + mDoMtx_stack_c::copy(model->i_getAnmMtx(7)); + cXyz vec(0.0f, 100.0f, 0.0f); + mDoMtx_stack_c::multVec(&vec, &mMouthPos); + + mDoMtx_stack_c::copy(model->i_getAnmMtx(7)); + vec.set(100.0f, 20.0f, 0.0f); + mDoMtx_stack_c::multVec(&vec, &mBulletPos); + + mDoMtx_stack_c::copy(model->i_getAnmMtx(6)); + if (mAction == ACT_OPENING_DEMO || cLib_calcTimer(&mSwordTimer) != 0) { + vec.set(594.0f, -196.0f, 0.0f); + } else { + vec.set(584.0f, -136.0f, 0.0f); + } + mDoMtx_stack_c::transM(vec.x, vec.y, vec.z); + if (mAction == ACT_OPENING_DEMO || mSwordTimer != 0) { + mDoMtx_stack_c::YrotM(-0x4000); + mDoMtx_stack_c::XrotM(-0x7770); + } else { + mDoMtx_stack_c::YrotM(-0x3d44); + mDoMtx_stack_c::XrotM(-0x7c4c); + } + mDoMtx_stack_c::scaleM(mSwordScale.x, mSwordScale.y, mSwordScale.z); + mDoMtx_stack_c::multVecZero(&mSwordPos); + mpSwordMorf->getModel()->i_setBaseTRMtx(mDoMtx_stack_c::get()); + mpSwordMorf->modelCalc(); + + vec.set(0.0f, -20.0f, 40.0f); + mDoMtx_stack_c::multVec(&vec, &eyePos); + if (mDrawZant == true) { + eyePos = mZantEyePos; + } + attention_info.position = eyePos; + attention_info.position.y += 100.0f; + + mDoMtx_stack_c::transS(mSwordPos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + vec.set(5.0f, 0.0f, 10.0f); + mDoMtx_stack_c::transM(vec.x, vec.y, vec.z); + mDoMtx_stack_c::YrotM(field_0x7ca + 5000); + mDoMtx_stack_c::scaleM(mZantScale.x, mZantScale.y, mZantScale.z); + mDoMtx_stack_c::multVecZero(&mZantPos); + mpZantMorf->getModel()->i_setBaseTRMtx(mDoMtx_stack_c::get()); + mpZantMorf->modelCalc(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -4949,6 +8749,7 @@ asm void daB_DS_c::mtx_set() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mtx_set__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DD058-805DD05C 000604 0004+00 0/2 0/0 0/0 .rodata @10356 */ @@ -4993,6 +8794,7 @@ SECTION_RODATA static f32 const lit_10361 = 440.0f; COMPILER_STRIP_GATE(0x805DD06C, &lit_10361); #pragma pop +#ifndef NONMATCHING /* 805DE1B4-805DE1C4 00074C 000C+04 0/1 0/0 0/0 .bss @10210 */ #pragma push #pragma force_active on @@ -5028,8 +8830,93 @@ static u8 lit_10216[12]; #pragma force_active on static u8 head_cc_dt[60]; #pragma pop +#endif /* 805D951C-805D9A40 00E3DC 0524+00 1/1 0/0 0/0 .text cc_set__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::cc_set() { + static cXyz head_cc_dt[5] = { + cXyz(380.0f, 0.0f, 0.0f), + cXyz(50.0f, -50.0f, 0.0f), + cXyz(-300.0f, -70.0f, 0.0f), + cXyz(640.0f, 80.0f, 0.0f), + cXyz(670.0f, -100.0f, 0.0f), + }; + + static f32 head_setRdt[5] = { + 300.0f, + 350.0f, + 270.0f, + 190.0f, + 190.0f, + }; + + J3DModel* model = mpMorf->getModel(); + cXyz center_base, center; + + mDoMtx_stack_c::copy(model->i_getAnmMtx(6)); + center_base.set(660.0f, -230.0f, 0.0f); + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mWeakSph.SetC(center); + mWeakSph.SetR(70.0f); + dComIfG_Ccsp()->Set(&mWeakSph); + + for (int i = 0; i < 5; i++) { + center_base = head_cc_dt[i]; + mDoMtx_stack_c::multVec(¢er_base, ¢er); + f32 radius = head_setRdt[i]; + mHeadSph[i].SetC(center); + mHeadSph[i].SetR(radius); + dComIfG_Ccsp()->Set(&mHeadSph[i]); + } + + if (mBackboneJoint < 3) { + mDoMtx_stack_c::copy(model->i_getAnmMtx(mBackboneJoint)); + center_base.set(-20.0f, 0.0f, 0.0f); + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mBackboneCyl.SetC(center); + mBackboneCyl.SetH(400.0f); + mBackboneCyl.SetR(120.0f); + dComIfG_Ccsp()->Set(&mBackboneCyl); + } + + mDoMtx_stack_c::copy(model->i_getAnmMtx(3)); + mDoMtx_stack_c::multVecZero(&mBackbonePos); + + mDoMtx_stack_c::copy(model->i_getAnmMtx(11)); + mDoMtx_stack_c::multVecZero(&mHandPos[0]); + if (mAction == ACT_OPENING_DEMO) { + center_base.set(500.0f, -100.0f, 180.0f); + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mHandAtLCyl.SetC(center); + mHandAtLCyl.SetH(300.0f); + mHandAtLCyl.SetR(440.0f); + } else { + center_base.set(400.0f, -100.0f, 100.0f); + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mHandAtLCyl.SetC(center); + mHandAtLCyl.SetH(300.0f); + mHandAtLCyl.SetR(500.0f); + } + dComIfG_Ccsp()->Set(&mHandAtLCyl); + + mDoMtx_stack_c::copy(model->i_getAnmMtx(20)); + mDoMtx_stack_c::multVecZero(&mFingerPos[0]); + + mDoMtx_stack_c::copy(model->i_getAnmMtx(30)); + mDoMtx_stack_c::multVecZero(&mHandPos[1]); + center_base.set(400.0f, -100.0f, -100.0f); + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mHandAtRCyl.SetC(center); + mHandAtRCyl.SetH(300.0f); + mHandAtRCyl.SetR(500.0f); + dComIfG_Ccsp()->Set(&mHandAtRCyl); + + mDoMtx_stack_c::copy(model->i_getAnmMtx(39)); + mDoMtx_stack_c::multVecZero(&mFingerPos[1]); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -5038,7 +8925,9 @@ asm void daB_DS_c::cc_set() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/cc_set__8daB_DS_cFv.s" } #pragma pop +#endif +#ifndef NONMATCHING /* ############################################################################################## */ /* 805DD070-805DD1D8 00061C 0168+00 1/1 0/0 0/0 .rodata ETC_CC_DT$10368 */ SECTION_RODATA static u8 const ETC_CC_DT[360] = { @@ -5067,8 +8956,70 @@ SECTION_RODATA static u8 const ETC_CC_DT[360] = { 0x00, 0x00, 0x00, 0x00, 0x43, 0x48, 0x00, 0x00, }; COMPILER_STRIP_GATE(0x805DD070, &ETC_CC_DT); +#endif /* 805D9A40-805D9B74 00E900 0134+00 1/1 0/0 0/0 .text cc_etc_set__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::cc_etc_set() { + static const struct { + int joint_no; + Vec center; + f32 radius; + } ETC_CC_DT[18] = { + {0, {2000.0f, 800.0f, 150.0f}, 200.0f}, + {0, {1500.0f, 500.0f, 250.0f}, 550.0f}, + {0, {1000.0f, 200.0f, 150.0f}, 440.0f}, + {4, {-220.0f, 0.0f, -250.0f}, 150.0f}, + {4, {0.0f, 0.0f, 750.0f}, 150.0f}, + {29, {0.0f, -50.0f, 150.0f}, 150.0f}, + {11, {70.0f, 0.0f, 0.0f}, 170.0f}, + {11, {-140.0f, -50.0f, -100.0f}, 120.0f}, + {11, {-310.0f, -70.0f, -180.0f}, 100.0f}, + {10, {240.0f, 50.0f, 0.0f}, 80.0f}, + {10, {-100.0f, 100.0f, 250.0f}, 120.0f}, + {9, {180.0f, 50.0f, -50.0f}, 110.0f}, + {11, {-100.0f, 200.0f, -100.0f}, 200.0f}, + {10, {150.0f, 0.0f, 0.0f}, 200.0f}, + {10, {-150.0f, 0.0f, 0.0f}, 200.0f}, + {30, {-100.0f, 200.0f, -100.0f}, 200.0f}, + {29, {150.0f, 0.0f, 0.0f}, 200.0f}, + {29, {-150.0f, 0.0f, 0.0f}, 200.0f}, + }; + + static f32 etc_setRdt[18] = { + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, + }; + + if (health <= 1 || mBossPhase == 100) { + return; + } + + int last = 18; + int i = 0; + if (mAction == ACT_OPENING_DEMO) { + if (mMode == 3) { + last = 12; + } else { + return; + } + } else { + i = 12; + } + J3DModel* model = mpMorf->getModel(); + + for (; i < last; i++) { + mDoMtx_stack_c::copy(model->i_getAnmMtx(ETC_CC_DT[i].joint_no)); + cXyz center_base = ETC_CC_DT[i].center; + cXyz center; + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mEtcSph[i].SetC(center); + mEtcSph[i].SetR(ETC_CC_DT[i].radius); + dComIfG_Ccsp()->Set(&mEtcSph[i]); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -5077,8 +9028,54 @@ asm void daB_DS_c::cc_etc_set() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/cc_etc_set__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D9B74-805D9CFC 00EA34 0188+00 1/1 0/0 0/0 .text mBattle2Action__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +void daB_DS_c::mBattle2Action() { + mBattle2_spinner_damage_check(); + + switch (mAction) { + case ACT_B2_OPENING_DEMO: + executeBattle2OpeningDemo(); + break; + case ACT_B2_WAIT: + executeBattle2Wait(); + break; + case ACT_B2_F_MOVE: + executeBattle2FMove(); + break; + case ACT_B2_TIRED: + executeBattle2Tired(); + break; + case ACT_B2_DAMAGE: + executeBattle2Damage(); + break; + case ACT_B2_DEAD: + executeBattle2Dead(); + break; + } + + if (cLib_calcTimer(&mHintTimer2) != 0 && mHintTimer2 == 1) { + dComIfGs_onOneZoneSwitch(7, fopAcM_GetRoomNo(this)); + } + mCreateTrap(false); + fopAcM_posMoveF(this, mCcStts.GetCCMoveP()); + if (!mDead) { + mAcchCir.SetWall(200.0f, mWallR); + mAcch.SetGroundUpY(mGroundUpY); + mAcch.CrrPos(dComIfG_Bgsp()); + mpMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } + mpSwordBrkAnm->play(); + mpSwordMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + if (mPlayPatternAnm) { + mpPatternBrkAnm->play(); + mpPatternBtkAnm->play(); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -5087,9 +9084,66 @@ asm void daB_DS_c::mBattle2Action() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBattle2Action__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D9CFC-805D9FF4 00EBBC 02F8+00 1/1 0/0 0/0 .text mBattle2_spinner_damage_check__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +void daB_DS_c::mBattle2_spinner_damage_check() { + if (cLib_calcTimer(&mDamageTimer) != 0 || mAnmID == ANM_HEAD_RETURN + || mAction == ACT_B2_DAMAGE || mAction == ACT_B2_DEAD || health < 1) + { + return; + } + + for (int i = 0; i < 18; i++) { + if (mEtcSph[i].ChkTgHit()) { + mDamageTimer = 8; + mAtInfo.mpCollider = mEtcSph[i].GetTgHitObj(); + mSoundPos = *mEtcSph[i].GetTgHitPosP(); + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + mEtcSph[i].ClrTgHit(); + return; + } + } + + if (mAction == ACT_B2_OPENING_DEMO || mAction == ACT_B2_DAMAGE || mAction == ACT_B2_DEAD) { + return; + } + + daPy_getPlayerActorClass()->onBossRoomWait(); + + for (int i = 0; i < 5; i++) { + if (mHeadSph[i].ChkTgHit()) { + mAtInfo.mpCollider = mHeadSph[i].GetTgHitObj(); + cXyz vec1 = mSwordPos - *mHeadSph[i].GetTgHitPosP(); + cXyz hit_pos = *mHeadSph[i].GetTgHitPosP(); + mDamageTimer = 8; + csXyz hit_angle; + hit_angle.x = 0; + hit_angle.y = vec1.atan2sX_Z(); + hit_angle.z = 0; + if (mHeadSph[i].GetTgHitObj()->ChkAtType(AT_TYPE_SPINNER)) { + mSound.startCreatureVoice(Z2SE_EN_DS_H_V_DMG_SPNR, -1); + mCreateFireBreath = false; + def_se_set(&mSound, mAtInfo.mpCollider, 0x1f, NULL); + i_dComIfGp_setHitMark(3, this, &hit_pos, &hit_angle, NULL, 0); + Z2GetAudioMgr()->changeBgmStatus(2); + field_0x790.set(0.0f, 0.0f, 0.0f); + setBck(ANM_HEAD_FATTACK_A, 0, 3.0f, 1.0f); + setActionMode(ACT_B2_DAMAGE, 0); + } else { + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + i_dComIfGp_setHitMark(2, this, &hit_pos, &hit_angle, NULL, 0); + } + mHeadSph[i].ClrTgHit(); + } + } + + mCcStts.Move(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -5098,17 +9152,109 @@ asm void daB_DS_c::mBattle2_spinner_damage_check() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBattle2_spinner_damage_check__8daB_DS_cFv.s" } #pragma pop +#endif /* 805D9FF4-805DA584 00EEB4 0590+00 1/1 0/0 0/0 .text mBattle2_damage_check__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +bool daB_DS_c::mBattle2_damage_check() { + if (health < 1) { + return false; + } + + if (cLib_calcTimer(&mDamageTimer) != 0) { + return false; + } + + if (mWeakSph.ChkTgHit()) { + mAtInfo.mpCollider = mWeakSph.GetTgHitObj(); + cXyz vec1 = mSwordPos - *mWeakSph.GetTgHitPosP(); + cXyz hit_pos = *mWeakSph.GetTgHitPosP(); + mDamageTimer = 8; + cc_at_check(this, &mAtInfo); + csXyz hit_angle; + hit_angle.x = 0; + hit_angle.y = vec1.atan2sX_Z(); + hit_angle.z = 0; + + if (health <= 1) { + i_dComIfGp_setHitMark(3, this, &eyePos, &hit_angle, NULL, 0); + mPlayPatternAnm = false; + mSoundPos = current.pos; + mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x20); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticleKey1); + if (emitter != NULL) { + emitter->stopDrawParticle(); + } + Z2GetAudioMgr()->bgmStop(0x1e, 0); + Z2GetAudioMgr()->bgmStreamPrepare(0x2000048); + Z2GetAudioMgr()->bgmStreamPlay(); + mSound.startCreatureVoice(Z2SE_EN_DS_END_V, -1); + setBck(ANM_HEAD_DOWN_DAMAGE, 0, 3.0f, 1.0f); + setActionMode(ACT_B2_DEAD, 0); + return true; + } + + if (mWeakSph.GetTgHitObj()->ChkAtType(AT_TYPE_NORMAL_SWORD) + || mWeakSph.GetTgHitObj()->ChkAtType(AT_TYPE_8000)) + { + setBck(ANM_HEAD_DOWN_DAMAGE, 0, 3.0f, 1.0f); + mSound.startCreatureVoice(Z2SE_EN_DS_H_V_DMG_SWD, -1); + mpPatternBrkAnm->init(mpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 78)), + 1, 0, 1.0f, 0, -1); + mpPatternBtkAnm->init(mpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 84)), + 1, 0, 1.0f, 0, -1); + mPlayPatternAnm = true; + mSoundPos = current.pos; + if (mAtInfo.mHitStatus == 0) { + i_dComIfGp_setHitMark(1, this, &eyePos, &hit_angle, NULL, 0); + field_0x7d0 = 0x200; + mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x1e); + } else { + i_dComIfGp_setHitMark(3, this, &eyePos, &hit_angle, NULL, 0); + field_0x7d0 = 0x400; + mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x1f); + } + } else { + i_dComIfGp_setHitMark(2, this, &eyePos, &hit_angle, NULL, 0); + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + } + + mpSwordBrkAnm->init(mpSwordMorf->getModel()->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 80)), 1, 1, 1.0f, 0, -1); + + if (mCutTypeCheck()) { + mpPatternBrkAnm->init(mpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 78)), + 1, 0, 1.0f, 0, -1); + mpPatternBtkAnm->init(mpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 84)), + 1, 0, 1.0f, 0, -1); + mPlayPatternAnm = true; + mDamageTimer = 12; + mWeakSph.ClrTgHit(); + mWeakSph.OnTgStopNoConHit(); + return 0; + } + } + + mWeakSph.OffTgStopNoConHit(); + mCcStts.Move(); + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daB_DS_c::mBattle2_damage_check() { +asm bool daB_DS_c::mBattle2_damage_check() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBattle2_damage_check__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DD1D8-805DD1DC 000784 0004+00 0/1 0/0 0/0 .rodata @10787 */ @@ -5126,6 +9272,80 @@ COMPILER_STRIP_GATE(0x805DD1DC, &lit_10788); #pragma pop /* 805DA584-805DA9A4 00F444 0420+00 1/1 0/0 0/0 .text mBattle2_mtx_set__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +void daB_DS_c::mBattle2_mtx_set() { + cXyz vec1, vec2, vec3; + J3DModel* model = mpMorf->getModel(); + if (!mDead) { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::transM(field_0x790.x, field_0x790.y, field_0x790.z); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_stack_c::ZXYrotM(field_0x7ae); + mDoMtx_stack_c::scaleM(l_HIO.mModelSize, l_HIO.mModelSize, l_HIO.mModelSize); + model->i_setBaseTRMtx(mDoMtx_stack_c::get()); + mpMorf->modelCalc(); + mDoMtx_stack_c::copy(model->i_getAnmMtx(0)); + mDoMtx_stack_c::multVecZero(&mHeadPos); + if (mPlayPatternAnm) { + mDoMtx_stack_c::copy(model->i_getAnmMtx(0)); + mpPatternModel->i_setBaseTRMtx(mDoMtx_stack_c::get()); + } + mDoMtx_stack_c::copy(model->i_getAnmMtx(0)); + vec1.set(0.0f, 100.0f, 0.0f); + mDoMtx_stack_c::multVec(&vec1, &mMouthPos); + } + + if (!mDead) { + mDoMtx_stack_c::copy(model->i_getAnmMtx(0)); + vec1.set(590.0f, 175.0f, 0.0f); + mDoMtx_stack_c::transM(vec1.x, vec1.y, vec1.z); + mDoMtx_stack_c::YrotM(0x4000); + mDoMtx_stack_c::XrotM(7000); + mDoMtx_stack_c::scaleM(mSwordScale.x, mSwordScale.y, mSwordScale.z); + mDoMtx_stack_c::multVecZero(&mSwordPos); + } else { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_stack_c::transM(0.0f, -50.0f, 0.0f); + } + mpSwordMorf->getModel()->i_setBaseTRMtx(mDoMtx_stack_c::get()); + mpSwordMorf->modelCalc(); + + vec1.set(0.0f, 30.0f, 80.0f); + mDoMtx_stack_c::multVec(&vec1, &eyePos); + attention_info.position = eyePos; + attention_info.position.y += 100.0f; + + { + dBgS_LinChk lin_chk; + csXyz angle; + angle = shape_angle; + mDoMtx_YrotS(*calc_mtx, angle.y); + mDoMtx_XrotM(*calc_mtx, angle.x); + vec2.set(0.0f, 0.0f, 4000.0f); + MtxPosition(&vec2, &vec3); + field_0x6d0 = mMouthPos + vec3; + lin_chk.Set(&mMouthPos, &field_0x6d0, this); + if (dComIfG_Bgsp().LineCross(&lin_chk)) { + field_0x6d0 = lin_chk.i_GetCross(); + } + } + + if (mCreateFireBreath) { + mBattle2BreathFireSet(BULLET_C); + } + + if (mAction == ACT_B2_F_MOVE && mMode >= 3 && mMode <= 4) { + mParticleKey2 = dComIfGp_particle_set(mParticleKey2, 0x8bfa, ¤t.pos, + &shape_angle, NULL); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticleKey2); + if (emitter != NULL) { + emitter->setGlobalSRTMatrix(mpMorf->getModel()->i_getAnmMtx(0)); + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -5134,6 +9354,7 @@ asm void daB_DS_c::mBattle2_mtx_set() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBattle2_mtx_set__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DD1E0-805DD208 00078C 0028+00 1/1 0/0 0/0 .rodata B2_ETC_CC_DT$10792 */ @@ -5145,6 +9366,32 @@ SECTION_RODATA static u8 const B2_ETC_CC_DT[40] = { COMPILER_STRIP_GATE(0x805DD1E0, &B2_ETC_CC_DT); /* 805DA9A4-805DAA98 00F864 00F4+00 1/1 0/0 0/0 .text mBattle2_cc_etc_set__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +void daB_DS_c::mBattle2_cc_etc_set() { + static const struct { + int joint_no; + Vec center; + f32 radius; + } B2_ETC_CC_DT[2] = { + {0, {60.0f, 300.0f, -120.0f}, 410.0f}, + {0, {-290.0f, 400.0f, -300.0f}, 100.0f}, + }; + + if (mAction == ACT_B2_OPENING_DEMO) { + J3DModel* model = mpMorf->getModel(); + for (int i = 0; i < 2; i++) { + mDoMtx_stack_c::copy(model->i_getAnmMtx(B2_ETC_CC_DT[i].joint_no)); + cXyz center_base = B2_ETC_CC_DT[i].center; + cXyz center; + mDoMtx_stack_c::multVec(¢er_base, ¢er); + mEtcSph[i].SetC(center); + mEtcSph[i].SetR(B2_ETC_CC_DT[i].radius); + dComIfG_Ccsp()->Set(&mEtcSph[i]); + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -5153,6 +9400,7 @@ asm void daB_DS_c::mBattle2_cc_etc_set() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBattle2_cc_etc_set__8daB_DS_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 805DD208-805DD20C 0007B4 0004+00 0/2 0/0 0/0 .rodata @10940 */ @@ -5169,6 +9417,7 @@ SECTION_RODATA static f32 const lit_10941 = 130.0f; COMPILER_STRIP_GATE(0x805DD20C, &lit_10941); #pragma pop +#ifndef NONMATCHING /* 805DE230-805DE240 0007C8 000C+04 0/1 0/0 0/0 .bss @10829 */ #pragma push #pragma force_active on @@ -5204,8 +9453,58 @@ static u8 lit_10835[12]; #pragma force_active on static u8 head2_cc_dt[60]; #pragma pop +#endif /* 805DAA98-805DADC4 00F958 032C+00 1/1 0/0 0/0 .text mBattle2_cc_set__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals / generics +void daB_DS_c::mBattle2_cc_set() { + static cXyz head2_cc_dt[5] = { + cXyz(380.0f, 0.0f, 0.0f), + cXyz(-50.0f, 50.0f, 0.0f), + cXyz(-400.0f, 130.0f, 0.0f), + cXyz(640.0f, 80.0f, 0.0f), + cXyz(670.0f, -100.0f, 0.0f), + }; + + static f32 head2_setRdt[5] = { + 300.0f, + 350.0f, + 270.0f, + 190.0f, + 190.0f, + }; + + mDoMtx_stack_c::copy(mpMorf->getModel()->i_getAnmMtx(0)); + cLib_calcTimer(&mHitTimer); + + for (int i = 0; i < 5; i++) { + cXyz center_base = head2_cc_dt[i]; + cXyz center; + mDoMtx_stack_c::multVec(¢er_base, ¢er); + f32 radius = head2_setRdt[i]; + mHeadSph[i].SetC(center); + mHeadSph[i].SetR(radius); + dComIfG_Ccsp()->Set(&mHeadSph[i]); + + if (mHeadSph[i].ChkTgHit()) { + mAtInfo.mpCollider = mHeadSph[i].GetTgHitObj(); + mHeadSph[i].ClrTgHit(); + if (mHitTimer == 0) { + cXyz delta_pos = current.pos - *mHeadSph[i].GetTgHitPosP(); + cXyz hit_pos = *mHeadSph[i].GetTgHitPosP(); + csXyz hit_angle; + hit_angle.x = 0; + hit_angle.y = delta_pos.atan2sX_Z(); + hit_angle.z = 0; + i_dComIfGp_setHitMark(2, this, &hit_pos, &hit_angle, NULL, 0); + def_se_set(&mSound, mAtInfo.mpCollider, 2, NULL); + mHitTimer = 8; + } + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -5214,81 +9513,290 @@ asm void daB_DS_c::mBattle2_cc_set() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/mBattle2_cc_set__8daB_DS_cFv.s" } #pragma pop +#endif /* 805DADC4-805DB184 00FC84 03C0+00 1/1 0/0 0/0 .text execute__8daB_DS_cFv */ +#ifdef NONMATCHING +// an extra `extsh` +int daB_DS_c::execute() { + if (mType == BULLET_A || mType == BULLET_B || mType == BULLET_C) { + mBulletAction(); + return 1; + } else if (mType == PHASE_2) { + mBattle2Action(); + mBattle2_mtx_set(); + mBattle2_cc_set(); + mBattle2_cc_etc_set(); + return 1; + } + + action(); + + if (mBossPhase == 100) { + return 1; + } + + handR_ang = -4000; + handL_ang = -4000; + mtx_set(); + dBgS_GndChk gnd_chk; + cXyz vec1, vec2; + J3DModel* model = mpMorf->getModel(); + s8 bvar3; + int i = 0; + + if (!mIsOpeningDemo) { + s16 hand_x_ang_target = (s16)(mBackboneJoint * 1000) - 6000; + if (handX_ang > -4000) { + handX_ang = -4000; + } + cLib_addCalcAngleS2(&handX_ang, hand_x_ang_target, 20, 0x100); + while (true) { + bvar3 = false; + mDoMtx_stack_c::copy(model->i_getAnmMtx(11)); + mDoMtx_stack_c::multVecZero(&vec2); + vec1 = vec2; + vec2.y += 3000.0f; + gnd_chk.SetPos(&vec2); + vec2.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (vec2.y == -1e9f) { + vec2.y = vec1.y; + } + if (vec1.y < vec2.y) { + handL_ang += (s16)(fabsf(vec1.y - vec2.y) * 10.0f); + bvar3 = true; + if (field_0x84d & 1) { + if ((int)mpMorf->getFrame() >= 0x48 && (int)mpMorf->getFrame() < 0x4f) { + hand_smokeSet(1); + field_0x84d ^= 1; + } + } + } + mDoMtx_stack_c::copy(model->i_getAnmMtx(30)); + mDoMtx_stack_c::multVecZero(&vec2); + vec1 = vec2; + vec2.y += 3000.0f; + gnd_chk.SetPos(&vec2); + vec2.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (vec2.y == -1e9f) { + vec2.y = vec1.y; + } + if (vec1.y < vec2.y) { + handR_ang += (s16)(fabsf(vec1.y - vec2.y) * 10.0f); + bvar3 = true; + if (field_0x84d & 2) { + if ((int)mpMorf->getFrame() >= 0x22 && (int)mpMorf->getFrame() < 0x29) { + hand_smokeSet(2); + field_0x84d ^= 2; + } + } + } + if (!bvar3) { + break; + } + mpMorf->updateDL(); + i++; + if (i > 10) { + break; + } + } + } else { + handL_ang = 0; + handR_ang = 0; + handX_ang = 0; + } + + if (mBossPhase == 0) { + neck_set(); + } + cc_set(); + cc_etc_set(); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daB_DS_c::execute() { +asm int daB_DS_c::execute() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/execute__8daB_DS_cFv.s" } #pragma pop +#endif /* 805DB184-805DB1A4 010044 0020+00 2/1 0/0 0/0 .text daB_DS_Execute__FP8daB_DS_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daB_DS_Execute(daB_DS_c* param_0) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Execute__FP8daB_DS_c.s" +static int daB_DS_Execute(daB_DS_c* i_this) { + return i_this->execute(); } -#pragma pop /* 805DB1A4-805DB1AC 010064 0008+00 1/0 0/0 0/0 .text daB_DS_IsDelete__FP8daB_DS_c */ -static bool daB_DS_IsDelete(daB_DS_c* param_0) { - return true; +static int daB_DS_IsDelete(daB_DS_c* i_this) { + return 1; } /* 805DB1AC-805DB244 01006C 0098+00 1/1 0/0 0/0 .text _delete__8daB_DS_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daB_DS_c::_delete() { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/_delete__8daB_DS_cFv.s" +int daB_DS_c::_delete() { + dComIfG_resDelete(&mPhase, "B_DS"); + if (mType == BULLET_A || mType == BULLET_B || mType == BULLET_C) { + return 1; + } + if (mHIOInit) { + hioInit = false; + } + if (heap != NULL) { + mSound.deleteObject(); + } + return 1; } -#pragma pop /* 805DB244-805DB264 010104 0020+00 1/0 0/0 0/0 .text daB_DS_Delete__FP8daB_DS_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daB_DS_Delete(daB_DS_c* param_0) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/daB_DS_Delete__FP8daB_DS_c.s" +static int daB_DS_Delete(daB_DS_c* i_this) { + return i_this->_delete(); } -#pragma pop /* 805DB264-805DB90C 010124 06A8+00 1/1 0/0 0/0 .text CreateHeap__8daB_DS_cFv */ +#ifdef NONMATCHING +// regalloc +int daB_DS_c::CreateHeap() { + if (mType == PHASE_1 && dComIfGs_isZoneSwitch(6, fopAcM_GetRoomNo(this)) + && dComIfGs_isZoneSwitch(7, fopAcM_GetRoomNo(this))) { + mType = PHASE_2; + home.pos.set(0.0f, 1900.0f, 0.0f); + current.pos.set(0.0f, 1900.0f, 0.0f); + } + + J3DModelData* model_data = static_cast(dComIfG_getObjectRes("B_DS", 70)); + int anm_index = 60; + if (mType == PHASE_2) { + model_data = static_cast(dComIfG_getObjectRes("B_DS", 71)); + anm_index = 44; + } + mpMorf = + new mDoExt_McaMorfSO(model_data, NULL, NULL, + static_cast(dComIfG_getObjectRes("B_DS", anm_index)), + 0, 1.0f, 0, -1, &mSound, 0, 0x11000084); + if (mpMorf == NULL || mpMorf->getModel() == NULL) { + return 0; + } + model = mpMorf->getModel(); + model->setUserArea((u32)this); + for (u16 i = 0; i < model->getModelData()->getJointNum(); i++) { + if (i != 0) { + model->getModelData()->getJointNodePointer(i)->setCallBack(JointCallBack); + } + } + + J3DModelData* sword_model_data = static_cast(dComIfG_getObjectRes("B_DS", 74)); + mpSwordMorf = + new mDoExt_McaMorfSO(sword_model_data, NULL, NULL, + static_cast(dComIfG_getObjectRes("B_DS", 63)), + 0, 1.0f, 0, -1, NULL, 0, 0x11000084); + if (mpSwordMorf == NULL || mpSwordMorf->getModel() == NULL) { + return 0; + } + + mpSwordBrkAnm = new mDoExt_brkAnm(); + if (mpSwordBrkAnm == NULL) { + return 0; + } + if (!mpSwordBrkAnm->init(mpSwordMorf->getModel()->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 81)), + 1, 0, 1.0f, 0, -1)) { + return 0; + } + + J3DModelData* zant_model_data = static_cast(dComIfG_getObjectRes("B_DS", 75)); + mpZantMorf = + new mDoExt_McaMorfSO(zant_model_data, NULL, NULL, + static_cast(dComIfG_getObjectRes("B_DS", 66)), + 2, 1.0f, 0, -1, NULL, 0, 0x11000084); + if (mpZantMorf == NULL || mpZantMorf->getModel() == NULL) { + return 0; + } + + J3DModelData* op_pattern_model_data = + static_cast(dComIfG_getObjectRes("B_DS", 73)); + mpOpPatternModel = mDoExt_J3DModel__create(op_pattern_model_data, 0, 0x11000284); + if (mpOpPatternModel == NULL) { + return 0; + } + + mpOpPatternBrkAnm = new mDoExt_brkAnm(); + if (mpOpPatternBrkAnm == NULL) { + return 0; + } + if (!mpOpPatternBrkAnm->init(mpOpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 79)), + 1, 0, 1.0f, 0, -1)) { + return 0; + } + + mpOpPatternBtkAnm = new mDoExt_btkAnm(); + if (mpOpPatternBtkAnm == NULL) { + return 0; + } + if (!mpOpPatternBtkAnm->init(mpOpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 85)), + 1, 2, 1.0f, 0, -1)) { + return 0; + } + + J3DModelData* pattern_model_data = static_cast(dComIfG_getObjectRes("B_DS", 72)); + mpPatternModel = mDoExt_J3DModel__create(pattern_model_data, 0, 0x11000284); + if (mpPatternModel == NULL) { + return 0; + } + + mpPatternBrkAnm = new mDoExt_brkAnm(); + if (mpPatternBrkAnm == NULL) { + return 0; + } + if (!mpPatternBrkAnm->init(mpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 78)), + 1, 0, 1.0f, 0, -1)) { + return 0; + } + + mpPatternBtkAnm = new mDoExt_btkAnm(); + if (mpPatternBtkAnm == NULL) { + return 0; + } + if (!mpPatternBtkAnm->init(mpPatternModel->getModelData(), + static_cast(dComIfG_getObjectRes("B_DS", 84)), + 1, 2, 1.0f, 0, -1)) { + return 0; + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daB_DS_c::CreateHeap() { +asm int daB_DS_c::CreateHeap() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/CreateHeap__8daB_DS_cFv.s" } #pragma pop +#endif +#ifndef NONMATCHING /* 805DB90C-805DB954 0107CC 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/b/d_a_b_ds/d_a_b_ds/__dt__12J3DFrameCtrlFv.s" } #pragma pop +#endif /* 805DB954-805DB974 010814 0020+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void useHeapInit(fopAc_ac_c* param_0) { - nofralloc -#include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/useHeapInit__FP10fopAc_ac_c.s" +static int useHeapInit(fopAc_ac_c* i_this) { + return static_cast(i_this)->CreateHeap(); } -#pragma pop /* ############################################################################################## */ /* 805DD210-805DD214 0007BC 0004+00 0/1 0/0 0/0 .rodata @11601 */ @@ -5341,16 +9849,201 @@ COMPILER_STRIP_GATE(0x805DD228, &lit_11607); #pragma pop /* 805DB974-805DC1E8 010834 0874+00 1/1 0/0 0/0 .text create__8daB_DS_cFv */ +#ifdef NONMATCHING +// matches with literals +cPhs__Step daB_DS_c::create() { + fopAcM_SetupActor(this, daB_DS_c); + cPhs__Step step = (cPhs__Step)dComIfG_resLoad(&mPhase, "B_DS"); + if (step == cPhs_COMPLEATE_e) { + if (mType == PHASE_1 && dComIfGs_isStageBossEnemy()) { + dComIfGs_onZoneSwitch(8, fopAcM_GetRoomNo(this)); + g_env_light.mColpatPrevGather = 4; + g_env_light.mColpatCurrGather = 4; + g_env_light.mColPatBlendGather = 1.0f; + if (!dComIfGs_isStageLife()) { + cXyz scale(1.0f, 1.0f, 1.0f); + cXyz pos; + csXyz angle; + angle.x = angle.y = angle.z = 0; + pos.set(-400.0f, 1775.0f, -4132.0f); + fopAcM_createItemForBoss(&pos, 0x22, fopAcM_GetRoomNo(this), + &angle, &scale, 0.0f, 0.0f, -1); + } + return cPhs_ERROR_e; + } + mType = fopAcM_GetParamBit(this, 0, 8); + mBitSw = fopAcM_GetParamBit(this, 8, 8); + mBitSw2 = fopAcM_GetParamBit(this, 16, 8); + mBitSw3 = fopAcM_GetParamBit(this, 24, 8); + if (mType == 0xff) { + mType = PHASE_1; + } + if (mType == BULLET_A || mType == BULLET_B || mType == BULLET_C) { + attention_info.field_0x0[2] = 0; + attention_info.flags &= ~4; + fopAcM_SetGroup(this, 0); + fopAcM_OffStatus(this, 0); + mCcStts.Init(0xff, 0, this); + gravity = 0.0f; + mBreathAtSph.Set(cc_ds_breath_at_src); + mBreathAtSph.SetStts(&mCcStts); + fopAcM_OffStatus(this, 0); + attention_info.flags &= ~4; + if (mType == BULLET_B || mType == BULLET_C) { + mAcch.Set(¤t.pos, &old.pos, this, 1, &mAcchCir, &speed, NULL, NULL); + mAcch.CrrPos(dComIfG_Bgsp()); + fopAcM_OnStatus(this, 0x4000); + } + setActionMode(8, 0); + } else { + if (mType != BULLET_A && mType != BULLET_B && mType != BULLET_C + && !fopAcM_entrySolidHeap(this, useHeapInit, 0xfac0)) { + return cPhs_ERROR_e; + } + field_0x560 = health = l_HIO.mP2Health; + if (!hioInit) { + hioInit = 1; + mHIOInit = true; + l_HIO.field_0x04 = -1; + } + shape_angle.z = 0; + shape_angle.x = 0; + shape_angle.y = current.angle.y; + attention_info.field_0x0[2] = 0; + attention_info.flags = 4; + fopAcM_SetMtx(this, mpMorf->mpModel->getBaseTRMtx()); + fopAcM_SetMin(this, -40000.0f, -40000.0f, -40000.0f); + fopAcM_SetMax(this, 40000.0f, 40000.0f, 40000.0f); + mAcch.Set(¤t.pos, &old.pos, this, 1, &mAcchCir, &speed, NULL, NULL); + mCcStts.Init(0xff, 0, this); + mWeakSph.Set(cc_ds_week_src); + mWeakSph.SetStts(&mCcStts); + { + dBgS_GndChk gnd_chk; + cXyz pos = current.pos; + pos.y += 800.0f; + gnd_chk.SetPos(&pos); + pos.y = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (pos.y != -1e9f) { + current.pos.y = pos.y; + } + } + for (int i = 0; i < 5; i++) { + mHeadSph[i].Set(cc_ds_head_src); + mHeadSph[i].SetStts(&mCcStts); + } + for (int i = 0; i < 18; i++) { + mEtcSph[i].Set(cc_ds_head_src); + mEtcSph[i].SetStts(&mCcStts); + } + mWallR = 500.0f; + mBackboneCyl.Set(cc_ds_backbone_src); + mBackboneCyl.SetStts(&mCcStts); + mHandAtLCyl.Set(cc_ds_hand_at_cyl_src); + mHandAtLCyl.SetStts(&mCcStts); + mHandAtRCyl.Set(cc_ds_hand_at_cyl_src); + mHandAtRCyl.SetStts(&mCcStts); + mHandAtLCyl.OffAtSetBit(); + mHandAtRCyl.OffAtSetBit(); + mHandAtLCyl.OnTgShield(); + mHandAtRCyl.OnTgShield(); + mSoundPos = current.pos; + mSound.init(&mSoundPos, &eyePos, 3, 1); + mAtInfo.mpSound = &mSound; + mAtInfo.mPowerType = 0xb; + mSwordPos = current.pos; + for (int i = 0; i < 2; i++) { + mHandPos[i] = current.pos; + } + for (int i = 0; i < 3; i++) { + field_0x7dc[i] = 255.0f; + } + field_0x7e8 = 255.0f; + field_0x7ec = 0.0f; + mpSwordMorf->setStartFrame(379.0f); + mZantScale.set(0.0f, 0.0f, 0.0f); + mSwordScale.set(1.0f, 1.0f, 1.0f); + dComIfGs_onZoneSwitch(8, fopAcM_GetRoomNo(this)); + onWolfNoLock(); + mHintTimer1 = l_HIO.mHintTime1; + mHintTimer2 = l_HIO.mHintTime1; + if (mType == PHASE_1) { + gravity = -1.0f; + if (mBitSw != 0xff) { + i_fopAcM_onSwitch(this, mBitSw); + } + fopAcM_OnStatus(this, 0x4000); + if (!cDmr_SkipInfo && !dComIfGs_isZoneSwitch(5, fopAcM_GetRoomNo(this))) { + mDrawZant = false; + mNoDrawSword = true; + dComIfGs_offZoneSwitch(8, fopAcM_GetRoomNo(this)); + mIsOpeningDemo = true; + field_0x7e8 = 0.0f; + field_0x7ec = 255.0f; + if (mBitSw != 0xff) { + i_fopAcM_offSwitch(this, mBitSw); + } + attention_info.field_0x0[2] = 0; + attention_info.flags &= ~4; + fopAcM_SetGroup(this, 0); + fopAcM_OffStatus(this, 0); + if (!dComIfGs_isZoneSwitch(0, fopAcM_GetRoomNo(this))) { + setActionMode(ACT_OPENING_DEMO, 0); + } else { + setActionMode(ACT_OPENING_DEMO, 3); + } + setBck(ANM_OPDEMO, 0, 1.0f, 0.0f); + } else { + cDmr_SkipInfo = 0; + dComIfGs_onZoneSwitch(5, fopAcM_GetRoomNo(this)); + } + if (mBitSw3 != 0xff) { + i_fopAcM_offSwitch(this, mBitSw3); + } + if (mAction != ACT_OPENING_DEMO) { + field_0x7f8 = 0.5f; + Z2GetAudioMgr()->bgmStart(Z2BGM_HARAGIGANT_BTL01, 0, 0); + dKy_change_colpat(1); + mCreateTrap(true); + setActionMode(ACT_WAIT, 0); + } + } else { + mChangeVer2(); + gravity = -1.0f; + attention_info.field_0x0[2] = 0; + attention_info.flags &= ~4; + fopAcM_SetGroup(this, 0); + fopAcM_OffStatus(this, 0); + shape_angle.y = -0x500a; + field_0x7e8 = 0.0f; + current.pos.set(345.0f, -1375.0f, -1040.0f); + shape_angle.y = 20000; + shape_angle.z = -15000; + setActionMode(ACT_B2_OPENING_DEMO, 0); + } + } + daB_DS_Execute(this); + } + return step; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daB_DS_c::create() { +asm cPhs__Step daB_DS_c::create() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/create__8daB_DS_cFv.s" } #pragma pop +#endif /* 805DC1E8-805DC4CC 0110A8 02E4+00 1/1 0/0 0/0 .text __ct__8daB_DS_cFv */ +#ifdef NONMATCHING +// vtable ordering +daB_DS_c::daB_DS_c() { + /* empty function */ +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -5359,12 +10052,16 @@ asm daB_DS_c::daB_DS_c() { #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__ct__8daB_DS_cFv.s" } #pragma pop +#endif + +#ifndef NONMATCHING /* 805DC4CC-805DC514 01138C 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGCylFv */ #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm cM3dGCyl::~cM3dGCyl() { +// asm cM3dGCyl::~cM3dGCyl() { +extern "C" asm void __dt__8cM3dGCylFv() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__dt__8cM3dGCylFv.s" } @@ -5374,7 +10071,8 @@ asm cM3dGCyl::~cM3dGCyl() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm dCcD_Sph::dCcD_Sph() { +// asm dCcD_Sph::dCcD_Sph() { +extern "C" asm void __ct__8dCcD_SphFv() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__ct__8dCcD_SphFv.s" } @@ -5384,7 +10082,8 @@ asm dCcD_Sph::dCcD_Sph() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm dCcD_Sph::~dCcD_Sph() { +// asm dCcD_Sph::~dCcD_Sph() { +extern "C" asm void __dt__8dCcD_SphFv() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__dt__8dCcD_SphFv.s" } @@ -5394,7 +10093,8 @@ asm dCcD_Sph::~dCcD_Sph() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm cM3dGSph::~cM3dGSph() { +// asm cM3dGSph::~cM3dGSph() { +extern "C" asm void __dt__8cM3dGSphFv() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__dt__8cM3dGSphFv.s" } @@ -5404,7 +10104,8 @@ asm cM3dGSph::~cM3dGSph() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm cM3dGAab::~cM3dGAab() { +// asm cM3dGAab::~cM3dGAab() { +extern "C" asm void __dt__8cM3dGAabFv() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__dt__8cM3dGAabFv.s" } @@ -5414,7 +10115,8 @@ asm cM3dGAab::~cM3dGAab() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm dCcD_GStts::~dCcD_GStts() { +// asm dCcD_GStts::~dCcD_GStts() { +extern "C" asm void __dt__10dCcD_GSttsFv() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__dt__10dCcD_GSttsFv.s" } @@ -5424,7 +10126,8 @@ asm dCcD_GStts::~dCcD_GStts() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm dBgS_ObjAcch::~dBgS_ObjAcch() { +// asm dBgS_ObjAcch::~dBgS_ObjAcch() { +extern "C" asm void __dt__12dBgS_ObjAcchFv() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__dt__12dBgS_ObjAcchFv.s" } @@ -5434,16 +10137,19 @@ asm dBgS_ObjAcch::~dBgS_ObjAcch() { #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/b/d_a_b_ds/d_a_b_ds/__dt__12dBgS_AcchCirFv.s" } #pragma pop /* 805DC830-805DC834 0116F0 0004+00 1/1 0/0 0/0 .text __ct__4cXyzFv */ -cXyz::cXyz() { +// cXyz::cXyz() { +extern "C" void __ct__4cXyzFv() { /* empty function */ } +#endif /* 805DC834-805DC854 0116F4 0020+00 1/0 0/0 0/0 .text daB_DS_Create__FP8daB_DS_c */ #pragma push @@ -5455,11 +10161,13 @@ static asm void daB_DS_Create(daB_DS_c* param_0) { } #pragma pop +#ifndef NONMATCHING /* 805DC854-805DC89C 011714 0048+00 1/0 0/0 0/0 .text __dt__10cCcD_GSttsFv */ #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm cCcD_GStts::~cCcD_GStts() { +// asm cCcD_GStts::~cCcD_GStts() { +extern "C" asm void __dt__10cCcD_GSttsFv() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__dt__10cCcD_GSttsFv.s" } @@ -5534,7 +10242,8 @@ static asm void func_805DC960() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm cXyz::~cXyz() { +// asm cXyz::~cXyz() { +extern "C" asm void __dt__4cXyzFv() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__dt__4cXyzFv.s" } @@ -5555,7 +10264,8 @@ asm void daPy_py_c::changeDemoPos0(cXyz const* param_0) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void cXyz::operator=(cXyz const& param_0) { +// asm void cXyz::operator=(cXyz const& param_0) { +extern "C" asm void __as__4cXyzFRC4cXyz() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__as__4cXyzFRC4cXyz.s" } @@ -5575,7 +10285,8 @@ asm void daPy_py_c::changeDemoMode(u32 param_0, int param_1, int param_2, s16 pa #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void cXyz::set(Vec const& param_0) { +// asm void cXyz::set(Vec const& param_0) { +extern "C" asm void set__4cXyzFRC3Vec() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/set__4cXyzFRC3Vec.s" } @@ -5585,7 +10296,8 @@ asm void cXyz::set(Vec const& param_0) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm cXyz::cXyz(cXyz const& param_0) { +// asm cXyz::cXyz(cXyz const& param_0) { +extern "C" asm void __ct__4cXyzFRC4cXyz() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/__ct__4cXyzFRC4cXyz.s" } @@ -5595,7 +10307,8 @@ asm cXyz::cXyz(cXyz const& param_0) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void cXyz::zero() { +// asm void cXyz::zero() { +extern "C" asm void zero__4cXyzFv() { nofralloc #include "asm/rel/d/a/b/d_a_b_ds/d_a_b_ds/zero__4cXyzFv.s" } @@ -5774,3 +10487,102 @@ static u8 data_805DE30C[4]; #pragma pop /* 805DD22C-805DD22C 0007D8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ +#endif + +/* 805DD994-805DD9B4 -00001 0020+00 1/0 0/0 0/0 .data l_daB_DS_Method */ +static actor_method_class l_daB_DS_Method = { + (process_method_func)daB_DS_Create, + (process_method_func)daB_DS_Delete, + (process_method_func)daB_DS_Execute, + (process_method_func)daB_DS_IsDelete, + (process_method_func)daB_DS_Draw, +}; + +/* 805DD9B4-805DD9E4 -00001 0030+00 0/0 0/0 1/0 .data g_profile_B_DS */ +extern actor_process_profile_definition g_profile_B_DS = { + fpcLy_CURRENT_e, + 4, + fpcPi_CURRENT_e, + PROC_B_DS, + &g_fpcLf_Method.mBase, + sizeof(daB_DS_c), + 0, + 0, + &g_fopAc_Method.base, + 0xDC, + &l_daB_DS_Method, + 0x4040000, + fopAc_ENEMY_e, + fopAc_CULLBOX_CUSTOM_e, +}; + +#ifndef NONMATCHING +/* 805DD9E4-805DD9F0 00079C 000C+00 1/1 0/0 0/0 .data __vt__12dBgS_AcchCir */ +SECTION_DATA extern void* __vt__12dBgS_AcchCir[3] = { + (void*)NULL /* RTTI */, + (void*)NULL, + (void*)__dt__12dBgS_AcchCirFv, +}; + +/* 805DD9F0-805DD9FC 0007A8 000C+00 2/2 0/0 0/0 .data __vt__10cCcD_GStts */ +SECTION_DATA extern void* __vt__10cCcD_GStts[3] = { + (void*)NULL /* RTTI */, + (void*)NULL, + (void*)__dt__10cCcD_GSttsFv, +}; + +/* 805DD9FC-805DDA08 0007B4 000C+00 1/1 0/0 0/0 .data __vt__10dCcD_GStts */ +SECTION_DATA extern void* __vt__10dCcD_GStts[3] = { + (void*)NULL /* RTTI */, + (void*)NULL, + (void*)__dt__10dCcD_GSttsFv, +}; + +/* 805DDA08-805DDA14 0007C0 000C+00 2/2 0/0 0/0 .data __vt__8cM3dGCyl */ +SECTION_DATA extern void* __vt__8cM3dGCyl[3] = { + (void*)NULL /* RTTI */, + (void*)NULL, + (void*)__dt__8cM3dGCylFv, +}; + +/* 805DDA14-805DDA20 0007CC 000C+00 4/4 0/0 0/0 .data __vt__8cM3dGSph */ +SECTION_DATA extern void* __vt__8cM3dGSph[3] = { + (void*)NULL /* RTTI */, + (void*)NULL, + (void*)__dt__8cM3dGSphFv, +}; + +/* 805DDA20-805DDA2C 0007D8 000C+00 4/4 0/0 0/0 .data __vt__8cM3dGAab */ +SECTION_DATA extern void* __vt__8cM3dGAab[3] = { + (void*)NULL /* RTTI */, + (void*)NULL, + (void*)__dt__8cM3dGAabFv, +}; + +/* 805DDA2C-805DDA50 0007E4 0024+00 2/2 0/0 0/0 .data __vt__12dBgS_ObjAcch */ +SECTION_DATA extern void* __vt__12dBgS_ObjAcch[9] = { + (void*)NULL /* RTTI */, + (void*)NULL, + (void*)__dt__12dBgS_ObjAcchFv, + (void*)NULL, + (void*)NULL, + (void*)func_805DC960, + (void*)NULL, + (void*)NULL, + (void*)func_805DC958, +}; + +/* 805DDA50-805DDA5C 000808 000C+00 2/2 0/0 0/0 .data __vt__12J3DFrameCtrl */ +SECTION_DATA extern void* __vt__12J3DFrameCtrl[3] = { + (void*)NULL /* RTTI */, + (void*)NULL, + (void*)__dt__12J3DFrameCtrlFv, +}; + +/* 805DDA5C-805DDA68 000814 000C+00 2/2 0/0 0/0 .data __vt__12daB_DS_HIO_c */ +SECTION_DATA extern void* __vt__12daB_DS_HIO_c[3] = { + (void*)NULL /* RTTI */, + (void*)NULL, + (void*)__dt__12daB_DS_HIO_cFv, +}; +#endif diff --git a/src/d/a/d_a_alink_link.inc b/src/d/a/d_a_alink_link.inc index 42ff1ddc4d9..30560586326 100644 --- a/src/d/a/d_a_alink_link.inc +++ b/src/d/a/d_a_alink_link.inc @@ -2508,7 +2508,7 @@ SECTION_DEAD static char const* const pad_8039263C = "\0\0\0"; int daAlink_c::execute() { loadModelDVD(); - if (checkEndResetFlg0(ERFLG0_UNK_2000000) && getMidnaActor() != NULL) { + if (checkEndResetFlg0(ERFLG0_BOSS_ROOM_WAIT) && getMidnaActor() != NULL) { getMidnaActor()->onNoServiceWait(); } @@ -4696,7 +4696,7 @@ bool daAlink_c::checkAcceptDungeonWarpAlink(int param_0) { } /* 800D0228-800D0274 0CAB68 004C+00 1/0 0/0 0/0 .text getSpinnerActor__9daAlink_cFv */ -fopAc_ac_c* daAlink_c::getSpinnerActor() { +daSpinner_c* daAlink_c::getSpinnerActor() { fopAc_ac_c* spinnerActor; if (!checkSpinnerRide()) { @@ -4704,7 +4704,7 @@ fopAc_ac_c* daAlink_c::getSpinnerActor() { } else { spinnerActor = mRideAcKeep.getActor(); } - return spinnerActor; + return static_cast(spinnerActor); } /* 800D0274-800D027C 0CABB4 0008+00 1/0 0/0 0/0 .text getSumouCounter__9daAlink_cCFv */ diff --git a/src/d/a/d_a_alink_weakfn.inc b/src/d/a/d_a_alink_weakfn.inc index fda52b12169..7bd5ec54337 100644 --- a/src/d/a/d_a_alink_weakfn.inc +++ b/src/d/a/d_a_alink_weakfn.inc @@ -780,7 +780,7 @@ void daPy_py_c::setAnimeFrame(f32 param_0) { } /* 801416A0-801416A8 13BFE0 0008+00 1/0 0/0 0/0 .text checkWolfLock__9daPy_py_cCFP10fopAc_ac_c */ -bool daPy_py_c::checkWolfLock(fopAc_ac_c* param_0) const { +BOOL daPy_py_c::checkWolfLock(fopAc_ac_c* param_0) const { return false; } @@ -969,7 +969,7 @@ void daPy_py_c::onSceneChangeDead(u8 param_0, int param_1) { } /* 80141770-80141778 13C0B0 0008+00 1/0 0/0 0/0 .text getSpinnerActor__9daPy_py_cFv */ -fopAc_ac_c* daPy_py_c::getSpinnerActor() { +daSpinner_c* daPy_py_c::getSpinnerActor() { return NULL; } diff --git a/src/d/a/d_a_alink_wolf.inc b/src/d/a/d_a_alink_wolf.inc index 173f28e8f2a..0ba8ffe3c5b 100644 --- a/src/d/a/d_a_alink_wolf.inc +++ b/src/d/a/d_a_alink_wolf.inc @@ -5594,7 +5594,7 @@ asm void daAlink_c::checkWolfLockData() { #endif /* 8013911C-8013916C 133A5C 0050+00 1/0 0/0 0/0 .text checkWolfLock__9daAlink_cCFP10fopAc_ac_c */ -bool daAlink_c::checkWolfLock(fopAc_ac_c* i_actor) const { +BOOL daAlink_c::checkWolfLock(fopAc_ac_c* i_actor) const { u32 actor_id = fopAcM_GetID(i_actor); for (int i = 0; i < mWolfLockNum; i++) { diff --git a/src/d/a/d_a_no_chg_room.cpp b/src/d/a/d_a_no_chg_room.cpp index 49e54b5bbbe..beaf0e4c8a5 100644 --- a/src/d/a/d_a_no_chg_room.cpp +++ b/src/d/a/d_a_no_chg_room.cpp @@ -10,6 +10,7 @@ #include "d/d_procname.h" #include "d/s/d_s_room.h" #include "rel/d/a/d_a_horse/d_a_horse.h" +#include "rel/d/a/d_a_spinner/d_a_spinner.h" /* 801451EC-801452DC 13FB2C 00F0+00 1/1 0/0 0/0 .text isLoadRoom__Fi */ static bool isLoadRoom(int i_roomNo) { @@ -56,7 +57,7 @@ int daNocrm_c::execute() { if (player_p->checkHorseRide()) { cur_player_pos.y = i_dComIfGp_getHorseActor()->current.pos.y; } else if (player_p->checkSpinnerRide()) { - fopAc_ac_c* spinner_actor = player_p->getSpinnerActor(); + daSpinner_c* spinner_actor = player_p->getSpinnerActor(); if (spinner_actor != NULL) { cur_player_pos.y = spinner_actor->current.pos.y; diff --git a/src/d/a/d_a_player.cpp b/src/d/a/d_a_player.cpp index 8a939a68cb9..4684cdb0afd 100644 --- a/src/d/a/d_a_player.cpp +++ b/src/d/a/d_a_player.cpp @@ -580,7 +580,7 @@ f32 daPy_py_c::getSpinnerRideSpeed() const { /* 8015F814-8015F89C 15A154 0088+00 0/0 0/0 1/1 .text checkSpinnerReflectEffect__9daPy_py_cFv */ bool daPy_py_c::checkSpinnerReflectEffect() { - daSpinner_c* spinner_p = (daSpinner_c*)getSpinnerActor(); + daSpinner_c* spinner_p = getSpinnerActor(); if (spinner_p != NULL && spinner_p->reflectAccept()) { return true;