summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/d/a/b/d_a_b_lastboss.h428
-rw-r--r--include/d/a/e/d_a_en_base.h19
-rw-r--r--include/d/a/obj/d_a_obj_base.h19
-rw-r--r--include/d/col/c/c_cc_d.h20
-rw-r--r--include/d/col/cc/d_cc_d.h1
-rw-r--r--include/d/d_camera.h2
-rw-r--r--include/d/d_cc.h21
-rw-r--r--include/d/d_light_env.h20
-rw-r--r--include/d/d_player_act.h29
-rw-r--r--include/d/d_sc_game.h4
-rw-r--r--include/d/d_stage_mgr.h23
-rw-r--r--include/d/lyt/d_lyt_boss_caption.h28
-rw-r--r--include/d/snd/d_snd_bgm_mgr.h2
-rw-r--r--include/toBeSorted/d_d3d.h2
-rw-r--r--include/toBeSorted/d_enemy_sword_mdl.h75
-rw-r--r--include/toBeSorted/d_sword_swing_effect.h65
-rw-r--r--include/toBeSorted/d_sword_swing_effect_mgr.h43
17 files changed, 775 insertions, 26 deletions
diff --git a/include/d/a/b/d_a_b_lastboss.h b/include/d/a/b/d_a_b_lastboss.h
index 1d01a3f3..e1100d0f 100644
--- a/include/d/a/b/d_a_b_lastboss.h
+++ b/include/d/a/b/d_a_b_lastboss.h
@@ -2,14 +2,286 @@
#define D_A_B_LASTBOSS_H
#include "d/a/e/d_a_en_base.h"
+#include "d/d_cc.h"
+#include "d/d_light_env.h"
+#include "m/m3d/m_anmmatclr.h"
+#include "m/m3d/m_anmtexsrt.h"
+#include "m/m3d/m_mdl.h"
+#include "m/m3d/m_smdl.h"
+#include "m/m_angle.h"
+#include "m/m_vec.h"
#include "s/s_State.hpp"
-#include "s/s_StateMgr.hpp"
+#include "toBeSorted/d_emitter.h"
+#include "toBeSorted/d_enemy_sword_mdl.h"
+#include "toBeSorted/stage_render_stuff.h"
+
+class dTgSwordBattleGame_c;
+
+// TODO this might be a template but what about the offset?
+struct UnkLastBossCcSph1 {
+ /* 0x000 */ u8 _0x000[0x002 - 0x000];
+ /* 0x002 */ s16 field_0x002;
+ /* 0x004 */ s16 field_0x004;
+ /* 0x006 */ s16 field_0x006;
+ /* 0x008 */ mVec3_c field_0x008[5];
+ /* 0x044 */ mVec3_c field_0x044[5];
+ /* 0x080 */ mVec3_c field_0x080[5];
+ /* 0x0BC */ dCcD_Linked_Sph mCc;
+};
+
+struct UnkLastBossCcSph2 {
+ /* 0x000 */ s16 field_0x000;
+ /* 0x002 */ s16 field_0x002;
+ /* 0x004 */ s16 field_0x004;
+ /* 0x006 */ s16 field_0x006;
+ /* 0x008 */ s16 field_0x008;
+ /* 0x00A */ s16 field_0x00A;
+ /* 0x00C */ f32 field_0x00C;
+ /* 0x010 */ f32 field_0x010;
+ /* 0x014 */ mVec3_c field_0x014[10];
+ /* 0x08C */ mVec3_c field_0x08C[10];
+ /* 0x104 */ mVec3_c field_0x104[10];
+ /* 0x17C */ dCcD_Linked_Sph mCc;
+};
class dAcBlastboss_c : public dAcEnBase_c {
+ class callback_c : public m3d::callback_c {
+ public:
+ virtual void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override;
+
+ /* 0x04 */ mAng field_0x04;
+ /* 0x06 */ mAng field_0x06;
+ /* 0x08 */ mAng field_0x08;
+ /* 0x0A */ mAng field_0x0A;
+ /* 0x0C */ mAng field_0x0C;
+ /* 0x0E */ mAng field_0x0E;
+ /* 0x10 */ mAng field_0x10;
+ /* 0x12 */ mAng field_0x12;
+ /* 0x14 */ mAng field_0x14;
+ /* 0x16 */ mAng field_0x16;
+ /* 0x18 */ mAng field_0x18;
+ /* 0x1A */ mAng field_0x1A;
+ /* 0x1C */ mAng field_0x1C[9];
+ /* 0x2E */ mAng field_0x2E;
+ /* 0x30 */ f32 field_0x30;
+ /* 0x34 */ dAcBlastboss_c *mpOwner;
+ };
+
+ friend class callback_c;
+
+ // BLastBoss.arc > g3d > model.brres > 3DModels(NW4R) > LastBoss > Bones > ...
+ enum BLastBossModelNode_e {
+ B_LAST_BOSS_NODE_center = 0,
+ B_LAST_BOSS_NODE_backbone1 = 1,
+ B_LAST_BOSS_NODE_backbone2 = 2,
+ B_LAST_BOSS_NODE_chest = 3,
+ B_LAST_BOSS_NODE_neck = 4,
+ B_LAST_BOSS_NODE_head = 5,
+ B_LAST_BOSS_NODE_browL = 6,
+ B_LAST_BOSS_NODE_browR = 7,
+ B_LAST_BOSS_NODE_chin = 8,
+ B_LAST_BOSS_NODE_hairA1 = 9,
+ B_LAST_BOSS_NODE_hairA2 = 10,
+ B_LAST_BOSS_NODE_hairA3 = 11,
+ B_LAST_BOSS_NODE_hairA4 = 12,
+ B_LAST_BOSS_NODE_hairBL1 = 13,
+ B_LAST_BOSS_NODE_hairBL2 = 14,
+ B_LAST_BOSS_NODE_hairBL3 = 15,
+ B_LAST_BOSS_NODE_hairBR1 = 16,
+ B_LAST_BOSS_NODE_hairBR2 = 17,
+ B_LAST_BOSS_NODE_hairBR3 = 18,
+ B_LAST_BOSS_NODE_hairC1 = 19,
+ B_LAST_BOSS_NODE_hairC2 = 20,
+ B_LAST_BOSS_NODE_hairC3 = 21,
+ B_LAST_BOSS_NODE_mouthL = 22,
+ B_LAST_BOSS_NODE_mouthR = 23,
+ B_LAST_BOSS_NODE_shoulderL = 24,
+ B_LAST_BOSS_NODE_armL1 = 25,
+ B_LAST_BOSS_NODE_armL2 = 26,
+ B_LAST_BOSS_NODE_assistanceL = 27,
+ B_LAST_BOSS_NODE_wristL = 28,
+ B_LAST_BOSS_NODE_indexL1 = 29,
+ B_LAST_BOSS_NODE_indexL2 = 30,
+ B_LAST_BOSS_NODE_littleL1 = 31,
+ B_LAST_BOSS_NODE_littleL2 = 32,
+ B_LAST_BOSS_NODE_middleL1 = 33,
+ B_LAST_BOSS_NODE_middleL2 = 34,
+ B_LAST_BOSS_NODE_ringL1 = 35,
+ B_LAST_BOSS_NODE_ringL2 = 36,
+ B_LAST_BOSS_NODE_thumbL1 = 37,
+ B_LAST_BOSS_NODE_thumbL2 = 38,
+ B_LAST_BOSS_NODE_shoulderR = 39,
+ B_LAST_BOSS_NODE_armR1 = 40,
+ B_LAST_BOSS_NODE_armR2 = 41,
+ B_LAST_BOSS_NODE_assistanceR = 42,
+ B_LAST_BOSS_NODE_wristR = 43,
+ B_LAST_BOSS_NODE_indexR1 = 44,
+ B_LAST_BOSS_NODE_indexR2 = 45,
+ B_LAST_BOSS_NODE_littleR1 = 46,
+ B_LAST_BOSS_NODE_littleR2 = 47,
+ B_LAST_BOSS_NODE_loc_sword01 = 48,
+ B_LAST_BOSS_NODE_middleR1 = 49,
+ B_LAST_BOSS_NODE_middleR2 = 50,
+ B_LAST_BOSS_NODE_ringR1 = 51,
+ B_LAST_BOSS_NODE_ringR2 = 52,
+ B_LAST_BOSS_NODE_thumbR1 = 53,
+ B_LAST_BOSS_NODE_thumbR2 = 54,
+ B_LAST_BOSS_NODE_belly = 55,
+ B_LAST_BOSS_NODE_waist = 56,
+ B_LAST_BOSS_NODE_legL1 = 57,
+ B_LAST_BOSS_NODE_legL2 = 58,
+ B_LAST_BOSS_NODE_ankleL = 59,
+ B_LAST_BOSS_NODE_toeL = 60,
+ B_LAST_BOSS_NODE_legR1 = 61,
+ B_LAST_BOSS_NODE_legR2 = 62,
+ B_LAST_BOSS_NODE_ankleR = 63,
+ B_LAST_BOSS_NODE_toeR = 64,
+ B_LAST_BOSS_NODE_skirtA1 = 65,
+ B_LAST_BOSS_NODE_skirtA2 = 66,
+ B_LAST_BOSS_NODE_skirtAU1 = 67,
+ B_LAST_BOSS_NODE_skirtB1 = 68,
+ B_LAST_BOSS_NODE_skirtB2 = 69,
+ B_LAST_BOSS_NODE_skirtB3 = 70,
+ B_LAST_BOSS_NODE_skirtB4 = 71,
+ B_LAST_BOSS_NODE_skirtB5 = 72,
+ B_LAST_BOSS_NODE_skirtB6 = 73,
+ B_LAST_BOSS_NODE_skirtB7 = 74,
+ B_LAST_BOSS_NODE_skirtB8 = 75,
+ B_LAST_BOSS_NODE_skirtB9 = 76,
+ B_LAST_BOSS_NODE_skirtBU1 = 77,
+ B_LAST_BOSS_NODE_skirtC1 = 78,
+ B_LAST_BOSS_NODE_skirtC2 = 79,
+ B_LAST_BOSS_NODE_skirtC3 = 80,
+ B_LAST_BOSS_NODE_skirtC4 = 81,
+ B_LAST_BOSS_NODE_skirtC5 = 82,
+ B_LAST_BOSS_NODE_skirtC6 = 83,
+ B_LAST_BOSS_NODE_skirtC7 = 84,
+ B_LAST_BOSS_NODE_skirtC8 = 85,
+ B_LAST_BOSS_NODE_skirtC9 = 86,
+ B_LAST_BOSS_NODE_skirtCU1 = 87,
+ B_LAST_BOSS_NODE_skirtD1 = 88,
+ B_LAST_BOSS_NODE_skirtD2 = 89,
+ B_LAST_BOSS_NODE_skirtD3 = 90,
+ B_LAST_BOSS_NODE_skirtD4 = 91,
+ B_LAST_BOSS_NODE_skirtD5 = 92,
+ B_LAST_BOSS_NODE_skirtD6 = 93,
+ B_LAST_BOSS_NODE_skirtD7 = 94,
+ B_LAST_BOSS_NODE_skirtD8 = 95,
+ B_LAST_BOSS_NODE_skirtD9 = 96,
+ B_LAST_BOSS_NODE_skirtDU1 = 97,
+ B_LAST_BOSS_NODE_skirtE1 = 98,
+ B_LAST_BOSS_NODE_skirtE2 = 99,
+ B_LAST_BOSS_NODE_skirtE3 = 100,
+ B_LAST_BOSS_NODE_skirtE4 = 101,
+ B_LAST_BOSS_NODE_skirtE5 = 102,
+ B_LAST_BOSS_NODE_skirtE6 = 103,
+ B_LAST_BOSS_NODE_skirtE7 = 104,
+ B_LAST_BOSS_NODE_skirtE8 = 105,
+ B_LAST_BOSS_NODE_skirtE9 = 106,
+ B_LAST_BOSS_NODE_skirtEU1 = 107,
+ B_LAST_BOSS_NODE_skirtEU2 = 108,
+ B_LAST_BOSS_NODE_skirtF1 = 109,
+ B_LAST_BOSS_NODE_skirtF2 = 110,
+ B_LAST_BOSS_NODE_skirtF3 = 111,
+ B_LAST_BOSS_NODE_skirtF4 = 112,
+ B_LAST_BOSS_NODE_skirtF5 = 113,
+ B_LAST_BOSS_NODE_skirtF6 = 114,
+ B_LAST_BOSS_NODE_skirtF7 = 115,
+ B_LAST_BOSS_NODE_skirtF8 = 116,
+ B_LAST_BOSS_NODE_skirtF9 = 117,
+ B_LAST_BOSS_NODE_skirtFU1 = 118,
+ B_LAST_BOSS_NODE_skirtG1 = 119,
+ B_LAST_BOSS_NODE_skirtG2 = 120,
+ B_LAST_BOSS_NODE_skirtG3 = 121,
+ B_LAST_BOSS_NODE_skirtG4 = 122,
+ B_LAST_BOSS_NODE_skirtG5 = 123,
+ B_LAST_BOSS_NODE_skirtG6 = 124,
+ B_LAST_BOSS_NODE_skirtG7 = 125,
+ B_LAST_BOSS_NODE_skirtG8 = 126,
+ B_LAST_BOSS_NODE_skirtG9 = 127,
+ B_LAST_BOSS_NODE_skirtGU1 = 128,
+ B_LAST_BOSS_NODE_skirtH1 = 129,
+ B_LAST_BOSS_NODE_skirtH2 = 130,
+ B_LAST_BOSS_NODE_skirtH3 = 131,
+ B_LAST_BOSS_NODE_skirtH4 = 132,
+ B_LAST_BOSS_NODE_skirtH5 = 133,
+ B_LAST_BOSS_NODE_skirtHU1 = 134,
+ };
+
+ // TODO: mFightState probably means different things in
+ // different states, so maybe we need to either remove
+ // this again or split this up further.
+ enum SubState_e {
+ SUB_STATE_0 = 0,
+ SUB_STATE_1,
+ SUB_STATE_2,
+ SUB_STATE_3,
+ SUB_STATE_4,
+ SUB_STATE_5,
+ SUB_STATE_6,
+
+ SUB_STATE_10 = 10,
+ SUB_STATE_11,
+
+ SUB_STATE_20 = 20,
+ SUB_STATE_21,
+
+ SUB_STATE_50 = 50,
+ };
+
+ enum Timer_e {
+ TIMER_0,
+ TIMER_1,
+ TIMER_2,
+ TIMER_3,
+ TIMER_4,
+ TIMER_5,
+
+ TIMER_MAX,
+ };
+
+ // TODO: Maybe reused in other sword fight bosses?
+ // Names taken from the string array
+ enum GuardDirection_e {
+ GUARD_RIGHT,
+ GUARD_UPRIGHT,
+ GUARD_DOWNRIGHT,
+ GUARD_LEFT,
+ GUARD_UPLEFT,
+ GUARD_DOWNLEFT,
+ GUARD_UP,
+ GUARD_DOWN,
+ GUARD_CENTER,
+ GUARD_BT, // not sure
+ };
+
+ enum LightningState_e {
+ LIGHTNING_STRIKE_STATE_NONE = 0,
+
+ LIGHTNING_STRIKE_START_DEMO = 1,
+ LIGHTNING_STRIKE_DEMO,
+ LIGHTNING_STRIKE_WAIT,
+
+ LIGHTNING_STRIKE_TRIGGER_END = 100,
+ LIGHTNING_STRIKE_ENDING,
+
+ LIGHTNING_STRIKE_TRIGGER_START = 200,
+ LIGHTNING_STRIKE_START,
+ LIGHTNING_STRIKE_START_LAST = 299,
+
+ LIGHTNING_STRIKE_FINISH = 1000,
+ };
+
public:
- dAcBlastboss_c() : mStateMgr(*this, sStateID::null) {}
+ dAcBlastboss_c() : mStateMgr(*this, sStateID::null), mScnCallback(this) {}
virtual ~dAcBlastboss_c() {}
+ virtual bool createHeap() override;
+ int create() override;
+ int doDelete() override;
+ int actorExecute() override;
+ int draw() override;
+
STATE_FUNC_DECLARE(dAcBlastboss_c, Fight);
STATE_FUNC_DECLARE(dAcBlastboss_c, Guard);
STATE_FUNC_DECLARE(dAcBlastboss_c, GuardBreak);
@@ -26,7 +298,157 @@ public:
STATE_FUNC_DECLARE(dAcBlastboss_c, ThunderWait);
private:
- /* 0x??? */ STATE_MGR_DECLARE(dAcBlastboss_c);
+ void setAnm(const char *anim, f32 blend);
+ void forceSetAnm(const char *anim, f32 blend);
+ void setAnmRate(f32 rate);
+
+ bool checkDamage();
+ bool checkForCloseRangeAttack();
+ bool checkForRangeAttack();
+ bool checkForCounter();
+ void updateMainNodeTransforms();
+ void updateSkirtHairTransforms();
+ void updateSkirtTransform(s32 level);
+ void updateHairTransform(s32 level);
+ bool checkForLinkSwordBySwordHit();
+ u8 classifyAttackDirection(s32 attackDir);
+ void executeLightningStrike();
+ void setLightningTimerMaybe(s32);
+
+ /* 0x0378 */ d3d::AnmMdlWrapper mMdl;
+ /* 0x03E8 */ m3d::anmTexSrt_c mAnmTexSrt;
+ /* 0x0414 */ m3d::anmMatClr_c mAnmMatClr1;
+ /* 0x0440 */ m3d::smdl_c mThunderMdl;
+ /* 0x045C */ m3d::anmMatClr_c mThunderAnmMatClr;
+ /* 0x0488 */ callback_c mMdlCallback;
+ /* 0x04C0 */ dCcD_Linked_Cyl mCc1;
+ /* 0x0620 */ dCcD_Linked_Cyl mCc2;
+ /* 0x0780 */ dCcD_Linked_Cyl mCc3;
+ /* 0x08E0 */ dCcD_Linked_Sph mCc4;
+ /* 0x0A40 */ dCcD_Linked_Sph mLightningCc;
+ /* 0x0BA0 */ dScnCallback_c mScnCallback;
+ /* 0x0BAC */ STATE_MGR_DECLARE(dAcBlastboss_c);
+ /* 0x0BE8 */ dColliderLinkedList mCcList;
+ /* 0x0BF4 */ dEnemySwordMdl_c mSwordMdl;
+ /* 0x1130 */ u8 mThunderWaitSceneFlag;
+ /* 0x1131 */ u8 field_0x1131;
+ /* 0x1132 */ bool field_0x1132;
+ /* 0x1133 */ u8 field_0x1133;
+ /* 0x1134 */ u8 field_0x1134;
+ /* 0x1135 */ s8 mNumConsecutiveOppositeDirectionAttacks;
+ /* 0x1136 */ s8 mNumConsecutiveSameDirectionAttacks;
+ /* 0x1137 */ u8 field_0x1137;
+ /* 0x1138 */ u8 field_0x1138;
+ /* 0x1139 */ u8 field_0x1139;
+ /* 0x113A */ u8 mChanceAttackCounter;
+ /* 0x113B */ u8 field_0x113B;
+ /* 0x113C */ u8 mChanceCounter;
+ /* 0x113D */ u8 field_0x113D;
+ /* 0x113E */ u8 field_0x113E;
+ /* 0x113F */ u8 field_0x113F;
+ /* 0x1140 */ bool field_0x1140;
+ /* 0x1141 */ bool mIsDown;
+ /* 0x1142 */ u8 field_0x1142;
+ /* 0x1143 */ u8 mInvulnerabilityTimerMaybe;
+ /* 0x1144 */ s8 mGuardDirection;
+ /* 0x1145 */ s8 mLinkCloseRangeShieldTime;
+ /* 0x1146 */ bool mIsSwordEmpowered;
+ /* 0x1147 */ bool mIsThunderBeamAttackActive;
+ /* 0x1148 */ u8 mThunderBeamTimer;
+ /* 0x1149 */ s8 mIsPhaseTwo;
+ /* 0x114A */ u8 mLightingFallSwordTimer;
+ /* 0x114B */ u8 mStunState;
+ /* 0x114C */ u8 field_0x114C;
+ /* 0x114D */ bool mInBossRush;
+ /* 0x114E */ u8 field_0x114E;
+ /* 0x114F */ bool mIsDead;
+ /* 0x1150 */ bool mThunderBeamReflected;
+ /* 0x1152 */ u16 field_0x1152;
+ /* 0x1154 */ u16 mStunCounter;
+ /* 0x1156 */ u16 mTimers[TIMER_MAX];
+ /* 0x1162 */ u16 field_0x1162;
+ /* 0x1164 */ s16 mCounter;
+ /* 0x1166 */ s16 mSubState;
+
+ /* 0x1168 */ u8 _0x1168[0x116A - 0x1168];
+
+ /* 0x116A */ s16 mYAngleToLink;
+
+ /* 0x116C */ u8 _0x116C[0x1170 - 0x116C];
+
+ /* 0x1170 */ s16 field_0x1170;
+ /* 0x1172 */ s16 field_0x1172;
+ /* 0x1174 */ s16 field_0x1174;
+
+ /* 0x1176 */ u8 _0x1176[0x1178 - 0x1176];
+
+ /* 0x1178 */ s16 field_0x1178;
+ /* 0x117A */ s16 field_0x117A;
+ /* 0x117C */ s16 field_0x117C;
+ /* 0x117E */ s16 field_0x117E;
+ /* 0x1180 */ s16 field_0x1180;
+ /* 0x1182 */ s16 field_0x1182;
+ /* 0x1184 */ s16 mLightningTimerMaybe;
+ /* 0x1186 */ s16 mYRotationRelativeToLink;
+ /* 0x1188 */ s16 field_0x1188;
+ /* 0x118A */ mAng field_0x118A;
+ /* 0x118C */ mAng field_0x118C;
+
+ /* 0x118E */ u8 _0x118E[0x1190 - 0x118E];
+
+ /* 0x1190 */ f32 mXZDistanceToLink;
+
+ /* 0x1194 */ u8 _0x1194[0x119C - 0x1194];
+
+ /* 0x119C */ f32 mAttackKnockbackX;
+ /* 0x11A0 */ f32 mAttackKnockbackZ;
+ /* 0x11A4 */ f32 field_0x11A4;
+ /* 0x11A8 */ f32 mAnmRate;
+ /* 0x11AC */ f32 field_0x11AC;
+ /* 0x11B0 */ f32 field_0x11B0;
+ /* 0x11B0 */ f32 field_0x11B4;
+ /* 0x11B8 */ f32 field_0x11B8;
+ /* 0x11BC */ f32 field_0x11BC;
+ /* 0x11C0 */ f32 field_0x11C0;
+ /* 0x11C4 */ f32 field_0x11C4;
+ /* 0x11C8 */ f32 field_0x11C8;
+ /* 0x11CC */ f32 field_0x11CC;
+ /* 0x11D0 */ f32 field_0x11D0;
+ /* 0x11D4 */ s32 mLastAttackDir;
+ /* 0x11D8 */ s32 mSecondLastAttackDirection;
+ /* 0x11DC */ mAng3_c mThunderBeamRotation;
+ /* 0x11E4 */ mVec3_c mThumbL2Translation;
+ /* 0x11F0 */ mVec3_c mBackbone1Translation;
+ /* 0x11FC */ mVec3_c mChestTranslation;
+ /* 0x1208 */ mVec3_c mSwordPosition;
+ /* 0x1214 */ mVec3_c mBugNetPos;
+ /* 0x1220 */ mVec3_c mThunderBeamPosition;
+ /* 0x122C */ mVec3_c mThunderBeamVelocity;
+ /* 0x1238 */ mVec3_c mToeTranslation[2];
+ /* 0x1250 */ mVec3_c field_0x1250[2];
+
+ /* 0x1268 */ UnkLastBossCcSph2 field_0x1268[8];
+ /* 0x2948 */ UnkLastBossCcSph1 field_0x2948[1];
+
+ /* 0x2B64 */ dEmitter_c mWaterEmitter;
+ /* 0x2B98 */ dEmitter_c mEmitter2;
+ /* 0x2BCC */ dEmitter_c mEmitter3;
+ /* 0x2C00 */ dEmitter_c mEmitter4;
+ /* 0x2C34 */ dEmitter_c mEmitter5;
+ /* 0x2C68 */ dEmitter_c mEmitter6;
+ /* 0x2C9C */ dEmitter_c mEmitter7;
+ /* 0x2CD0 */ LIGHT_INFLUENCE mLightInfo;
+ /* 0x2CEC */ s16 mLightingStrikeState;
+ /* 0x2CEE */ s16 field_0x2CEE;
+ /* 0x2CF0 */ s16 field_0x2CF0;
+ /* 0x2CF4 */ f32 field_0x2CF4;
+ /* 0x2CF8 */ u8 _0x2CF8[0x2CFC - 0x2CF8];
+ /* 0x2CFC */ f32 field_0x2CFC;
+ /* 0x2D00 */ f32 field_0x2D00;
+ /* 0x2D04 */ mVec3_c field_0x2D04;
+ /* 0x2D10 */ mVec3_c field_0x2D10;
+ /* 0x2D1C */ const char *mpCurrentAnm;
+ /* 0x2D20 */ dTgSwordBattleGame_c *mpSwordBattleGame;
};
#endif
diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h
index 10cb60d1..328992a1 100644
--- a/include/d/a/e/d_a_en_base.h
+++ b/include/d/a/e/d_a_en_base.h
@@ -4,6 +4,7 @@
#include "common.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/a/obj/d_a_obj_bomb.h"
+#include "d/d_cc.h"
#include "m/m_angle.h"
#include "m/m_vec.h"
@@ -16,9 +17,21 @@ struct dAcEnData {
// non-official name
class dAcEnBase_c : public dAcObjBase_c {
public:
+ enum InteractionFlags_e {
+ INTERACT_0x1 = (1 << 0),
+ INTERACT_0x4 = (1 << 2),
+ INTERACT_0x40 = (1 << 6),
+ INTERACT_0x1000 = (1 << 12),
+ };
+
+public:
dAcEnBase_c();
virtual ~dAcEnBase_c();
+ virtual int preExecute() override;
+ virtual void postExecute(MAIN_STATE_e state) override;
+ virtual int preDraw() override;
+
virtual void *getObjectListEntry() override {
return &mEnemyLink;
}
@@ -36,7 +49,9 @@ public:
/* 0x33C */ u32 mInteractionFlags;
/* 0x340 */ u16 field_0x338;
/* 0x342 */ u16 mHealth;
- /* 0x344 */ u8 _344[0x374 - 0x344];
+ /* 0x344 */ u8 _344[0x358 - 0x344];
+ /* 0x358 */ mVec3_c mFinalBlowPosition;
+ /* 0x364 */ u8 _364[0x374 - 0x364];
/* 0x374 */ dAcEnData *mpEnemyData;
bool checkInteractionFlags(u32 mask) {
@@ -62,6 +77,8 @@ public:
void fn_80030700();
void fn_80030c20(u32 flags, f32, f32, f32, f32);
+ s32 someEnemyDamageCollisionStuffMaybe(dColliderLinkedList &list, u16 *pOutFlags);
+
bool ChkCrossPlayer(f32 height);
protected:
diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h
index 6b798af5..57f1222a 100644
--- a/include/d/a/obj/d_a_obj_base.h
+++ b/include/d/a/obj/d_a_obj_base.h
@@ -197,6 +197,7 @@ public:
void fn_8002EA60(void *);
void fn_8002EB30(void *);
void putInODesert(f32 depth, mVec3_c *position);
+ void fn_8002ECD0(m3d::smdl_c *smdl, UNKWORD);
// Disabling makes Items and Link Disappear
void drawModelType1(m3d::smdl_c *smdl);
// Disabling make Lava and other objects Disappear
@@ -220,11 +221,11 @@ public:
fProfile::PROFILE_NAME_e actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2,
u32 roomId
);
-
+
// These may not belong here
- static dAcBase_c* createInsectActor(
- dAcBase_c* parent,
- fProfile::PROFILE_NAME_e actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2, s32 roomId
+ static dAcBase_c *createInsectActor(
+ dAcBase_c *parent, fProfile::PROFILE_NAME_e actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale,
+ u32 params2, s32 roomId
);
static dAcBase_c *createActorUnkGroup3(
fProfile::PROFILE_NAME_e actorId, u32 roomId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale,
@@ -243,6 +244,16 @@ public:
if (!result) \
return result; \
} while (0)
+
+// Actors' createHeap functions often have patterns that can be matched with this macro
+// `bool result;` needs to be defined in scope prior to use
+#define TRY_CREATE2(thing) \
+ do { \
+ result = (thing); \
+ if (!result) \
+ return result; \
+ } while (0)
+
// Use this in actors' create functions
#define CREATE_ALLOCATOR(className) \
do { \
diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h
index 7e51421a..b4f7f4f2 100644
--- a/include/d/col/c/c_cc_d.h
+++ b/include/d/col/c/c_cc_d.h
@@ -836,7 +836,14 @@ public:
void OffAtGrp(u32 grp) {
mAt.SetAtFlag(GetAtGrp() & ~grp);
}
+ void SetTgRpm(u32 f) {
+ mTg.SetRPrm(f);
+ }
+ void SetAtRpm(u32 f) {
+ mAt.SetRPrm(f);
+ }
+ // Related to directional attacks?
void SetTgFlag_0xA(u16 flag) {
mTg.SetFlag_0xA(flag);
}
@@ -878,7 +885,9 @@ public:
return mTg.ChkSet();
}
-
+ void ClrAtActorInfo() { mAt.ClrActorInfo(); }
+ void ClrTgActorInfo() { mTg.ClrActorInfo(); }
+ void ClrCoActorInfo() { mCo.ClrActorInfo(); }
bool ChkAtEffCounter() { return mAt.ChkEffCounter(); }
bool ChkTgEffCounter() { return mTg.ChkEffCounter(); }
void ClrAtEffCounter() { mAt.ClrEffCounter(); }
@@ -978,9 +987,18 @@ public:
void OnTgElectric() {
return mTg.OnSPrm(0x40000);
}
+ void OnTg_0x8000000() {
+ return mTg.OnSPrm(0x8000000);
+ }
void ClrTgElectric() {
return mTg.OffSPrm(0x40000);
}
+ void ClrTg_0x10000() {
+ return mTg.OffSPrm(0x10000);
+ }
+ void ClrTg_0x8000000() {
+ return mTg.OffSPrm(0x8000000);
+ }
u32 ChkTgBonk() const {
return mTg.MskSPrm(0x200000);
}
diff --git a/include/d/col/cc/d_cc_d.h b/include/d/col/cc/d_cc_d.h
index 88dff6b7..4af5b6ff 100644
--- a/include/d/col/cc/d_cc_d.h
+++ b/include/d/col/cc/d_cc_d.h
@@ -18,6 +18,7 @@ public:
virtual cCcD_ShapeAttr *GetShapeAttr() override;
using cM3dGCps::Set;
+ using cM3dGLin::Set;
void Set(const dCcD_SrcCps &src);
void unknownCalc();
};
diff --git a/include/d/d_camera.h b/include/d/d_camera.h
index 8f4560a0..059647ba 100644
--- a/include/d/d_camera.h
+++ b/include/d/d_camera.h
@@ -61,9 +61,11 @@ public:
bool isUnderwater() const;
f32 getUnderwaterDepth() const;
+ void fn_8019EA00(const mVec3_c&, const mVec3_c&, f32, f32);
void fn_8019E430();
void fn_8019E410();
mAng fn_8019E3B0() const;
+ void fn_8019EA70(bool);
private:
/* 0x068 */ u8 _0x068[0x6C - 0x068];
diff --git a/include/d/d_cc.h b/include/d/d_cc.h
index c5349190..c06a35e5 100644
--- a/include/d/d_cc.h
+++ b/include/d/d_cc.h
@@ -27,15 +27,14 @@ public:
/* 0x210 */ LinkedColliderNode mNode;
};
-class dCcD_Linked_Cyl : public dCcD_Cyl {
+class dCcD_Linked_Cps : public dCcD_Cps {
public:
- dCcD_Linked_Cyl() : mNode(this) {}
- virtual ~dCcD_Linked_Cyl() {
+ dCcD_Linked_Cps() : mNode(this) {}
+ virtual ~dCcD_Linked_Cps() {
mNode.remove();
}
- /* 0x150 */ LinkedColliderNode mNode;
+ /* 0x170 */ LinkedColliderNode mNode;
};
-
class dCcD_Linked_Sph : public dCcD_Sph {
public:
dCcD_Linked_Sph() : mNode(this) {}
@@ -44,14 +43,13 @@ public:
}
/* 0x150 */ LinkedColliderNode mNode;
};
-
-class dCcD_Linked_Cps : public dCcD_Cps {
+class dCcD_Linked_Cyl : public dCcD_Cyl {
public:
- dCcD_Linked_Cps() : mNode(this) {}
- virtual ~dCcD_Linked_Cps() {
+ dCcD_Linked_Cyl() : mNode(this) {}
+ virtual ~dCcD_Linked_Cyl() {
mNode.remove();
}
- /* 0x170 */ LinkedColliderNode mNode;
+ /* 0x150 */ LinkedColliderNode mNode;
};
class dColliderLinkedList {
@@ -86,7 +84,8 @@ public:
// a ptmf. It's not immediately clear how this works,
// does every actor subclass the LinkedCollider___,
// or are the functions all added here for the other
- // files to implement?
+ // files to implement? d_a_b_lastboss commits a typing crime here
+ // to make it work...
typedef bool (cCcD_Obj::*ccPtmf)();
cCcD_Obj *find(ccPtmf f) const;
diff --git a/include/d/d_light_env.h b/include/d/d_light_env.h
index 8e4cc20b..5e48e39e 100644
--- a/include/d/d_light_env.h
+++ b/include/d/d_light_env.h
@@ -414,6 +414,10 @@ public:
return currentSpf;
}
+ SpfSetting &GetOverrideSpf() {
+ return mOverrideSpfSetting;
+ }
+
const PaletteEAF_smol_entry &getSmallEAF(s32 idx1, s32 idx2) {
return field_0x38E4.field_0x00[idx1].field_0x00[idx2];
}
@@ -430,6 +434,18 @@ public:
return field_0x2F1C;
}
+ s32 getField_0x38DC() const {
+ return field_0x38DC;
+ }
+
+ void setField_0x38DC(s32 v) {
+ field_0x38DC = v;
+ }
+
+ void setField_0x5D48(f32 val) {
+ field_0x5D48 = val;
+ }
+
private:
/* 0x0004 */ Spf currentSpf;
/* 0x020C */ Spf spfs[20];
@@ -487,7 +503,9 @@ private:
/* 0x48E4 */ Bpm4 field_0x48E4;
/* 0x5CE4 */ PaletteDefaultMCF field_0x5CE4;
/* 0x5D04 */ TwoPaletteDefaultMCF field_0x5D04;
- /* 0x5D44 */ u8 field_0x5D44[0x5D59 - 0x5D44];
+ /* 0x5D44 */ u8 field_0x5D44[0x5D48 - 0x5D44];
+ /* 0x5D48 */ f32 field_0x5D48;
+ /* 0x5D4C */ u8 field_0x5D4C[0x5D59 - 0x5D4C];
/* 0x5D59 */ struct { // Anonymous until more is known
bool mEnabled;
u8 mValue;
diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h
index 2a948aa8..4d3b9dc2 100644
--- a/include/d/d_player_act.h
+++ b/include/d/d_player_act.h
@@ -413,7 +413,7 @@ public:
/* vt 0x2A8 */ virtual void lookTowardItem() {}
/* vt 0x2AC */ virtual void vt_0x2AC() {}
/* vt 0x2B0 */ virtual void vt_0x2B0() {}
- /* vt 0x2B4 */ virtual void triggerMoveEventMaybe(u32, u32, u32, mVec3_c &, const mAng &, u32, u32) {}
+ /* vt 0x2B4 */ virtual void triggerMoveEventMaybe(u32, u32, u32, const mVec3_c *, const mAng&, u32, u32) {}
/* vt 0x2B8 */ virtual void setActorRef9() {}
/* vt 0x2BC */ virtual void unlinkActorRef9() {}
/* vt 0x2C0 */ virtual bool vt_0x2C0() {
@@ -463,6 +463,19 @@ public:
ATTACK_FINAL_BLOW = 11,
};
+ enum SpecificPlayerAttackDirection_e {
+ /* 0x000 */ ATTACK_DIRECTION_NONE = 0,
+ /* 0x001 */ ATTACK_DIRECTION_DOWN = 1 << 0,
+ /* 0x002 */ ATTACK_DIRECTION_DOWNRIGHT = 1 << 1,
+ /* 0x004 */ ATTACK_DIRECTION_RIGHT = 1 << 2,
+ /* 0x008 */ ATTACK_DIRECTION_UPRIGHT = 1 << 3,
+ /* 0x010 */ ATTACK_DIRECTION_UP = 1 << 4,
+ /* 0x020 */ ATTACK_DIRECTION_UPLEFT = 1 << 5,
+ /* 0x040 */ ATTACK_DIRECTION_LEFT = 1 << 6,
+ /* 0x080 */ ATTACK_DIRECTION_DOWNLEFT = 1 << 7,
+ /* 0x100 */ ATTACK_DIRECTION_STAB = 1 << 8,
+ };
+
enum ModelUpdateFlags_e {
UPDATE_MODEL_SWORD = 0x20,
UPDATE_MODEL_SHIELD = 0x40,
@@ -625,6 +638,14 @@ public:
return mAttackDirection != ATTACK_NONE;
}
+ bool isAttackingJumpSlash() const {
+ return mAttackDirection == ATTACK_JUMP_SLASH;
+ }
+
+ u16 getSpecificAttackDirection() const {
+ return mSpecificAttackDirection;
+ }
+
inline bool hasvt_0x1C0() const {
return vt_0x1C0() != nullptr;
}
@@ -637,6 +658,9 @@ public:
bool isAttackingStab() const;
bool isAttackingSpinHorizontal() const;
bool isAttackingSpinVertical() const;
+ bool isAttackingSpin() const {
+ return isAttackingSpinHorizontal() || isAttackingSpinVertical();
+ }
void setBonkRelatedAnimFlag(bool b);
void setPosYRot(const mVec3_c &pos, mAng rot, bool force = false, UNKWORD = 0, UNKWORD = 0);
void setTransform(const mMtx_c &mtx, bool force, UNKWORD, UNKWORD);
@@ -668,7 +692,8 @@ protected:
/* 0x334 */ f32 field_0x334;
/* 0x338 */ u8 mAttackDirection;
/* 0x339 */ u8 mRidingActorType;
- /* 0x33A */ u8 unk_0x33A[0x340 - 0x33A];
+ /* 0x33A */ u16 mSpecificAttackDirection;
+ /* 0x33C */ u8 unk_0x33C[0x340 - 0x33C];
/* 0x340 */ u32 someFlags_0x340;
/* 0x344 */ u32 mFaceUpdateFlags;
/* 0x348 */ u32 mSwordAndMoreStates;
diff --git a/include/d/d_sc_game.h b/include/d/d_sc_game.h
index b1ba5573..67bbddb4 100644
--- a/include/d/d_sc_game.h
+++ b/include/d/d_sc_game.h
@@ -172,6 +172,10 @@ public:
sUpdateFrameCount = 0;
}
+ static u32 getUpdateFrameCount() {
+ return sUpdateFrameCount;
+ }
+
bool savePromptFlag() const {
return mSavePromptFlag;
}
diff --git a/include/d/d_stage_mgr.h b/include/d/d_stage_mgr.h
index de4d0b47..f20c541d 100644
--- a/include/d/d_stage_mgr.h
+++ b/include/d/d_stage_mgr.h
@@ -5,6 +5,7 @@
#include "d/col/cc/d_cc_s.h"
#include "d/d_base.h"
#include "d/d_bzs_types.h"
+#include "d/d_cursor_hit_check.h"
#include "d/d_dylink.h"
#include "d/d_fader.h"
#include "egg/gfx/eggCpuTexture.h"
@@ -12,6 +13,7 @@
#include "m/m_allocator.h"
#include "m/m_dvd.h"
#include "m/m_fader_base.h"
+#include "m/m_mtx.h"
#include "nw4r/g3d/g3d_camera.h"
#include "s/s_FPhase.h"
#include "s/s_State.hpp"
@@ -103,6 +105,9 @@ public:
s32 getMapNameId() const;
bool fn_80199250();
+ void procfn_800192F0(u8 a1, const mMtx_c &mtx, u8 a2) {
+ mProc1.fn_800192F0(a1, mtx, a2);
+ }
static dStageMgr_c *GetInstance() {
return sInstance;
@@ -169,6 +174,8 @@ public:
nw4r::g3d::Camera getCamera(s32 idx);
+ void fn_80199B60(u8);
+
dFader_c *getFader() {
return &mFader;
}
@@ -202,11 +209,19 @@ private:
/* 0x0580 */ LayoutArcControl mLayoutArcCtrl2;
/* 0x058C */ dBgS mBg;
// ...
- u8 _0x00001[0x778];
+ u8 _0x00001[0x6C8];
+
+ /* 0x3E38 */ // ...
+
/* 0x3E40 */ dCcS mCc;
+
+ /* 0x75D8 */ dCursorHitCheckCC_c mCsHitCheck;
// ...
/* 0x7814 */ dParticle::tex_c mParticleTex[2];
- // ...
+ /* 0x7898 */ d3d::EggTextureProc mProc1;
+ /* 0x78EC */ d3d::XluProc mProc2;
+ u8 _0x00002[0x28];
+ /* 0x790C */ // ...
/* 0x7930 */ dFader_c mFader;
/* 0x7954 */ u16 mPcamCount;
@@ -218,6 +233,8 @@ private:
/* 0x7964 */ const STIF *mpStif;
/* 0x7968 */ const RMPL *mpRmpl;
+ u8 _0x00003[0x30];
+
/* 0x799C */ mDvd_callback_c *mpDvdCallback;
/* 0x79A0 */ mDvd_callback_c *mpDvdCallback2;
@@ -227,7 +244,7 @@ private:
/* 0x8694 */ dTimeAreaMgr_c mTimeAreaMgr;
// ...
- u8 ___[438];
+ u8 ___[390];
/* 0x8898 */ EGG::CpuTexture *field_0x8898;
u8 _0x889C[4];
diff --git a/include/d/lyt/d_lyt_boss_caption.h b/include/d/lyt/d_lyt_boss_caption.h
new file mode 100644
index 00000000..65436c12
--- /dev/null
+++ b/include/d/lyt/d_lyt_boss_caption.h
@@ -0,0 +1,28 @@
+#ifndef D_LYT_BOSS_CAPTION_H
+#define D_LYT_BOSS_CAPTION_H
+
+#include "common.h"
+
+class dLytBossCaption_c {
+public:
+ static dLytBossCaption_c *GetInstance() {
+ return sInstance;
+ }
+
+ void show(const char *label, UNKWORD);
+
+ // I believe this is the inline that causes all the Rev0 -> Rev1 pain in RELs...
+ void unk_inline() {
+ field_0x645 = 0;
+ field_0x646 = 0;
+ }
+
+private:
+ static dLytBossCaption_c *sInstance;
+
+ u8 _0x00[0x645 - 0x00];
+ u8 field_0x645;
+ u8 field_0x646;
+};
+
+#endif
diff --git a/include/d/snd/d_snd_bgm_mgr.h b/include/d/snd/d_snd_bgm_mgr.h
index ff8a31d7..3ff73f12 100644
--- a/include/d/snd/d_snd_bgm_mgr.h
+++ b/include/d/snd/d_snd_bgm_mgr.h
@@ -101,6 +101,8 @@ public:
// always returns false
bool weirdCheckAlwaysFalse();
+ void fn_80372D70(UNKWORD);
+
dSndBgmSound_c *getActiveBgmSound();
// I don't love this inline but it fixes one regswap
// TODO look into getting rid of this one
diff --git a/include/toBeSorted/d_d3d.h b/include/toBeSorted/d_d3d.h
index ebfeafd2..e565ddf2 100644
--- a/include/toBeSorted/d_d3d.h
+++ b/include/toBeSorted/d_d3d.h
@@ -203,6 +203,8 @@ public:
doDraw();
}
+ void fn_800192F0(u8, const mMtx_c&, u8);
+
private:
void doRemove();
void doDraw();
diff --git a/include/toBeSorted/d_enemy_sword_mdl.h b/include/toBeSorted/d_enemy_sword_mdl.h
new file mode 100644
index 00000000..40883513
--- /dev/null
+++ b/include/toBeSorted/d_enemy_sword_mdl.h
@@ -0,0 +1,75 @@
+#ifndef D_ENEMY_SWORD_MDL_H
+#define D_ENEMY_SWORD_MDL_H
+
+#include "common.h"
+#include "d/a/obj/d_a_obj_base.h"
+#include "d/d_cc.h"
+#include "d/d_shadow.h"
+#include "egg/gfx/eggTexture.h"
+#include "m/m3d/m_smdl.h"
+#include "m/m_allocator.h"
+#include "m/m_angle.h"
+#include "m/m_mtx.h"
+#include "m/m_quat.h"
+#include "m/m_vec.h"
+#include "nw4r/types_nw4r.h"
+#include "toBeSorted/d_sword_swing_effect_mgr.h"
+
+class dEnemySwordMdl_c {
+public:
+ /* 0x000 */ m3d::smdl_c mMdl;
+ /* 0x01C */ dSwordSwingEffectProcMgr_c mProc;
+
+private:
+ /* 0x070 */ bool mIsActive;
+ /* 0x071 */ bool mFirstFramePassed;
+ /* 0x074 */ mVec3_c field_0x074;
+ /* 0x080 */ mVec3_c field_0x080;
+ /* 0x08C */ mVec3_c field_0x08C;
+ /* 0x098 */ mVec3_c field_0x098;
+ /* 0x0A4 */ f32 field_0x0A4;
+ /* 0x0A8 */ f32 field_0x0A8;
+ /* 0x0AC */ dCcD_Linked_Cps mCcs[3];
+
+public:
+ /* 0x52C */ dColliderLinkedList mCcList;
+
+public:
+ dEnemySwordMdl_c() {}
+ virtual ~dEnemySwordMdl_c() {}
+
+ bool create(
+ mAllocator_c *alloc, void *pData, const char *mdlName, u32 bufferOption, const mVec3_c &v1, const mVec3_c &v2,
+ cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize
+ );
+ bool create(
+ mAllocator_c *alloc, nw4r::g3d::ResFile resFile, const char *mdlName, u32 bufferOption, const mVec3_c &v1,
+ const mVec3_c &v2, cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize
+ );
+
+ void calc(const mMtx_c &mtx, const mVec3_c &v1, bool mass);
+ void calc(const mMtx_c &mtx, mAng angle, bool mass) {
+ // A bit of a wild inline but this vector is very low on the dAcBlastboss_c::actorExecute stack
+ mVec3_c v1 = mVec3_c(angle.sin(), 0.0f, angle.cos());
+ calc(mtx, v1, mass);
+ }
+ bool entry(dAcObjBase_c *obj, dShadowCircle_c *shadow, mQuat_c *quat);
+
+ void enableAttack();
+ void fn_8006B660(UNKWORD, UNKWORD, UNKWORD, UNKWORD, UNKWORD, UNKWORD, UNKWORD, UNKWORD, UNKWORD, f32);
+ void setDamageMaybe(u8 damage);
+ void fn_8006B7A0(u32);
+ void fn_8006B800(u32);
+
+ void enable() {
+ enableAttack();
+ mProc.setActive(true);
+ }
+
+ void disable() {
+ mIsActive = false;
+ mProc.setActive(false);
+ }
+};
+
+#endif
diff --git a/include/toBeSorted/d_sword_swing_effect.h b/include/toBeSorted/d_sword_swing_effect.h
new file mode 100644
index 00000000..1a97f0cd
--- /dev/null
+++ b/include/toBeSorted/d_sword_swing_effect.h
@@ -0,0 +1,65 @@
+#ifndef D_SWORD_SWING_EFFECT_H
+#define D_SWORD_SWING_EFFECT_H
+
+#include "common.h"
+#include "egg/gfx/eggTexture.h"
+#include "m/m3d/m_proc.h"
+#include "m/m_allocator.h"
+#include "m/m_color.h"
+#include "m/m_vec.h"
+
+class dSwordSwingEffectProcBase_c : public m3d::proc_c {
+protected:
+ struct swing_entry {
+ swing_entry() {
+ mLifetime = 0.0f;
+ }
+ ~swing_entry() {}
+
+ void set(const mVec3_c &pos1, const mColor &c1, const mVec3_c &pos2, const mColor &c2);
+
+ /* 0x00 */ f32 mLifetime;
+ /* 0x04 */ mVec3_c mv1;
+ /* 0x10 */ mVec3_c mv2;
+ /* 0x1C */ mColor mc1;
+ /* 0x20 */ mColor mc2;
+ };
+
+public:
+ dSwordSwingEffectProcBase_c() : mpEntries(nullptr), mCount(0), mHead(0) {}
+ virtual ~dSwordSwingEffectProcBase_c() {
+ remove();
+ }
+
+ virtual int entry() override;
+ virtual void remove() override;
+ virtual void drawXlu() override;
+
+ bool create(s32 num, mAllocator_c *alloc);
+ void addSwing(const mVec3_c &pos1, const mColor c1, const mVec3_c &pos2, const mColor c2);
+ void calc(f32 f);
+
+protected:
+ bool hasSwings() const;
+
+ /* 0x18 */ swing_entry *mpEntries;
+ /* 0x1C */ u16 mNum;
+ /* 0x1E */ u16 mCount;
+ /* 0x20 */ u16 mHead;
+};
+
+class dSwordSwingEffectProc_c : public dSwordSwingEffectProcBase_c {
+public:
+ dSwordSwingEffectProc_c() : mpImg(nullptr) {}
+ virtual ~dSwordSwingEffectProc_c() {}
+
+ virtual void drawXlu() override;
+
+ bool create(s32 num, mAllocator_c *alloc, EGG::ResTIMG *pImg, f32 scale);
+
+private:
+ /* 0x24 */ EGG::ResTIMG *mpImg;
+ /* 0x28 */ f32 mTexScale;
+};
+
+#endif
diff --git a/include/toBeSorted/d_sword_swing_effect_mgr.h b/include/toBeSorted/d_sword_swing_effect_mgr.h
new file mode 100644
index 00000000..e14600ad
--- /dev/null
+++ b/include/toBeSorted/d_sword_swing_effect_mgr.h
@@ -0,0 +1,43 @@
+#ifndef D_SWORD_SWING_EFFECT_MGR_H
+#define D_SWORD_SWING_EFFECT_MGR_H
+
+#include "m/m_color.h"
+#include "m/m_vec.h"
+#include "toBeSorted/d_sword_swing_effect.h"
+
+// TODO better name
+class dSwordSwingEffectProcMgr_c {
+private:
+ /* 0x00 */ dSwordSwingEffectProc_c mProc;
+ /* 0x2C */ bool mIsActive;
+ /* 0x30 */ mColor mC1;
+ /* 0x34 */ mColor mC2;
+ /* 0x38 */ mVec3_c field_0x38;
+ /* 0x44 */ mVec3_c field_0x44;
+
+ void createSwingEntries(const mVec3_c &v1, const mVec3_c &v2);
+
+public:
+ dSwordSwingEffectProcMgr_c() : mC1(0xFF, 0xFF, 0xFF, 0x40), mC2(0xFF, 0xFF, 0xFF, 0x20) {}
+ virtual ~dSwordSwingEffectProcMgr_c() {}
+
+ void setColor1(mColor c1) {
+ mC1 = c1;
+ }
+
+ void setColor2(mColor c1) {
+ mC2 = c1;
+ }
+
+ void setActive(bool v) {
+ mIsActive = v;
+ }
+
+ bool create(s32 num, mAllocator_c *alloc, EGG::ResTIMG *pImg, f32 scale) {
+ return mProc.create(num, alloc, pImg, scale);
+ }
+ void calc(const mVec3_c &v1, const mVec3_c &v2);
+ void entry();
+};
+
+#endif