diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/d/a/b/d_a_b_lastboss.h | 428 | ||||
| -rw-r--r-- | include/d/a/e/d_a_en_base.h | 19 | ||||
| -rw-r--r-- | include/d/a/obj/d_a_obj_base.h | 19 | ||||
| -rw-r--r-- | include/d/col/c/c_cc_d.h | 20 | ||||
| -rw-r--r-- | include/d/col/cc/d_cc_d.h | 1 | ||||
| -rw-r--r-- | include/d/d_camera.h | 2 | ||||
| -rw-r--r-- | include/d/d_cc.h | 21 | ||||
| -rw-r--r-- | include/d/d_light_env.h | 20 | ||||
| -rw-r--r-- | include/d/d_player_act.h | 29 | ||||
| -rw-r--r-- | include/d/d_sc_game.h | 4 | ||||
| -rw-r--r-- | include/d/d_stage_mgr.h | 23 | ||||
| -rw-r--r-- | include/d/lyt/d_lyt_boss_caption.h | 28 | ||||
| -rw-r--r-- | include/d/snd/d_snd_bgm_mgr.h | 2 | ||||
| -rw-r--r-- | include/toBeSorted/d_d3d.h | 2 | ||||
| -rw-r--r-- | include/toBeSorted/d_enemy_sword_mdl.h | 75 | ||||
| -rw-r--r-- | include/toBeSorted/d_sword_swing_effect.h | 65 | ||||
| -rw-r--r-- | include/toBeSorted/d_sword_swing_effect_mgr.h | 43 |
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 |
