Merge pull request #168 from robojumper/player

d_player_mdl OK
This commit is contained in:
robojumper
2025-05-24 00:30:57 +02:00
committed by GitHub
53 changed files with 4974 additions and 1261 deletions
@@ -42,7 +42,7 @@ calcRoll__10dAcOtubo_cFv = .text:0x00001D30; // type:function size:0x78C
adjustRoll__10dAcOtubo_cFv = .text:0x000024C0; // type:function size:0x1B0
fn_272_2670__10dAcOtubo_cFv = .text:0x00002670; // type:function size:0x3A0
attemptDestroy__10dAcOtubo_cFv = .text:0x00002A10; // type:function size:0x324
attemptDestroyOnWall__10dAcOtubo_cFPUlPCUc = .text:0x00002D40; // type:function size:0x64
attemptDestroyOnWall__10dAcOtubo_cFRCUlRCb = .text:0x00002D40; // type:function size:0x64
getCenter__10dAcOtubo_cCFv = .text:0x00002DB0; // type:function size:0xAC
fn_272_2E60__10dAcOtubo_cFRC7mVec3_c = .text:0x00002E60; // type:function size:0x1B8
fn_272_3020__10dAcOtubo_cFv = .text:0x00003020; // type:function size:0x12C
+8 -4
View File
@@ -248,15 +248,19 @@ d/d_player_act.cpp:
.bss start:0x805A06B0 end:0x805A06C8
d/d_player_mdl.cpp:
.text start:0x8005CE90 end:0x80061B10 align:16
.ctors start:0x804DB68C end:0x804DB690
.rodata start:0x804DE1E8 end:0x804E0B38
.text start:0x8005CE90 end:0x80061AA4 align:16
.rodata start:0x804DE1E8 end:0x804E0918
.data start:0x8050D690 end:0x8050DDD8
.sdata start:0x80571C80 end:0x80571D08
.sbss start:0x80575208 end:0x80575220
.sbss start:0x80575208 end:0x80575210
.sdata2 start:0x80577020 end:0x80577680
.bss start:0x805A06C8 end:0x805A06F0
d/d_player_guide_colors.cpp:
.text start:0x80061AB0 end:0x80061B0C align:16
.ctors start:0x804DB68C end:0x804DB690
.sbss start:0x80575210 end:0x80575220
d/d_rawarchive.cpp:
.text start:0x80061B10 end:0x800629D0 align:16
.data start:0x8050DDD8 end:0x8050DDF8
+905 -875
View File
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -413,7 +413,8 @@ config.libs = [
Object(NonMatching, "d/d_pad.cpp"),
Object(NonMatching, "d/d_pad_player.cpp"),
Object(NonMatching, "d/d_player_act.cpp"),
Object(NonMatching, "d/d_player_mdl.cpp"),
Object(Matching, "d/d_player_mdl.cpp"),
Object(Matching, "d/d_player_guide_colors.cpp"),
Object(Matching, "d/d_rawarchive.cpp"),
Object(Matching, "d/d_scene.cpp"),
Object(NonMatching, "d/d_state.cpp"),
+65 -2
View File
@@ -15,11 +15,74 @@ struct cBgS_PolyInfo;
struct SoundSource {
virtual ~SoundSource() {}
// TODO
// TODO there's probably multiple inheritance involved and stuff
#define SOUNDSOURCE_VIRTUAL(offset) virtual void vt_##offset();
SOUNDSOURCE_VIRTUAL(0x0C);
SOUNDSOURCE_VIRTUAL(0x10);
SOUNDSOURCE_VIRTUAL(0x14);
SOUNDSOURCE_VIRTUAL(0x18);
SOUNDSOURCE_VIRTUAL(0x1C);
SOUNDSOURCE_VIRTUAL(0x20);
SOUNDSOURCE_VIRTUAL(0x24);
SOUNDSOURCE_VIRTUAL(0x28);
SOUNDSOURCE_VIRTUAL(0x2C);
SOUNDSOURCE_VIRTUAL(0x30);
SOUNDSOURCE_VIRTUAL(0x34);
SOUNDSOURCE_VIRTUAL(0x38);
SOUNDSOURCE_VIRTUAL(0x3C);
SOUNDSOURCE_VIRTUAL(0x40);
SOUNDSOURCE_VIRTUAL(0x44);
virtual bool shutdown(); // 0x48
SOUNDSOURCE_VIRTUAL(0x4C);
SOUNDSOURCE_VIRTUAL(0x50);
SOUNDSOURCE_VIRTUAL(0x54);
SOUNDSOURCE_VIRTUAL(0x58);
SOUNDSOURCE_VIRTUAL(0x5C);
SOUNDSOURCE_VIRTUAL(0x60);
SOUNDSOURCE_VIRTUAL(0x64);
SOUNDSOURCE_VIRTUAL(0x68);
SOUNDSOURCE_VIRTUAL(0x6C);
SOUNDSOURCE_VIRTUAL(0x70);
SOUNDSOURCE_VIRTUAL(0x74);
SOUNDSOURCE_VIRTUAL(0x78);
SOUNDSOURCE_VIRTUAL(0x7C);
SOUNDSOURCE_VIRTUAL(0x80);
SOUNDSOURCE_VIRTUAL(0x84);
SOUNDSOURCE_VIRTUAL(0x88);
SOUNDSOURCE_VIRTUAL(0x8C);
SOUNDSOURCE_VIRTUAL(0x90);
SOUNDSOURCE_VIRTUAL(0x94);
SOUNDSOURCE_VIRTUAL(0x98);
SOUNDSOURCE_VIRTUAL(0x9C);
SOUNDSOURCE_VIRTUAL(0xA0);
SOUNDSOURCE_VIRTUAL(0xA4);
SOUNDSOURCE_VIRTUAL(0xA8);
SOUNDSOURCE_VIRTUAL(0xAC);
SOUNDSOURCE_VIRTUAL(0xB0);
SOUNDSOURCE_VIRTUAL(0xB4);
SOUNDSOURCE_VIRTUAL(0xB8);
SOUNDSOURCE_VIRTUAL(0xBC);
SOUNDSOURCE_VIRTUAL(0xC0);
SOUNDSOURCE_VIRTUAL(0xC4);
SOUNDSOURCE_VIRTUAL(0xC8);
SOUNDSOURCE_VIRTUAL(0xCC);
SOUNDSOURCE_VIRTUAL(0xD0);
SOUNDSOURCE_VIRTUAL(0xD4);
SOUNDSOURCE_VIRTUAL(0xD8);
SOUNDSOURCE_VIRTUAL(0xDC);
SOUNDSOURCE_VIRTUAL(0xE0);
SOUNDSOURCE_VIRTUAL(0xE4);
SOUNDSOURCE_VIRTUAL(0xE8);
SOUNDSOURCE_VIRTUAL(0xEC);
SOUNDSOURCE_VIRTUAL(0xF0);
SOUNDSOURCE_VIRTUAL(0xF4);
SOUNDSOURCE_VIRTUAL(0xF8);
SOUNDSOURCE_VIRTUAL(0xFC);
virtual bool isReadyMaybe(); // 0x100
virtual bool load(void *data, const char *name); // 0x100
virtual bool load(void *data, const char *name); // 0x104
virtual void setFrame(f32 frame); // 0x108
virtual void setRate(f32 frame); // 0x10C
virtual void set_0x164(UNKWORD val); // 0x114
+3
View File
@@ -47,6 +47,9 @@ public:
static void spawnItem(u16 item, u32 room, const mVec3_c &pos, const mAng3_c &rot, u32 params, u32 arg);
static void spawnDrop(u16 item, u32 room, const mVec3_c &pos, const mAng3_c &rot);
static u32 checkFlag(u32 flag);
static bool hasItem(u32 flag) {
return checkFlag(flag);
}
static void setFlag(s32 id);
void setItemPosition(const mVec3_c &);
+22 -288
View File
@@ -2,311 +2,42 @@
#define D_A_PLAYER_H
#include "common.h"
#include "d/a/d_a_base.h"
#include "d/a/d_a_itembase.h"
#include "d/a/obj/d_a_obj_base.h"
#include "m/m3d/m_anmmatclr.h"
#include "m/m_allocator.h"
#include "m/m_angle.h"
#include "m/m_mtx.h"
#include "m/m_vec.h"
#include "nw4r/g3d/res/g3d_resfile.h"
#include "d/d_player_mdl.h"
#include "toBeSorted/file_manager.h"
#include "toBeSorted/minigame_mgr.h"
class dAcPy_c : public dAcObjBase_c {
// See Below for some info
// https://github.com/lepelog/skywardsword-tools/wiki/Player-Actor
// See Below for some info
// https://github.com/lepelog/skywardsword-tools/wiki/Player-Actor
class dAcPy_c : public daPlayerModelBase_c {
public:
// These Flags are named under general guesses. Very likely may need some changes
// Correspond to mActionFlags
enum dAcPy_FLG0 {
FLG0_ON_FOOT = 0x80000000,
FLG0_USE_ITEM_0 = 0x40000000,
FLG0_USE_ITEM_1 = 0x20000000,
FLG0_UNK_GEN_MOVE = 0x10000000,
FLG0_ATTACK_MOVE = 0x8000000,
FLG0_USE_ITEM_2 = 0x4000000,
FLG0_RECOVER_ELEC = 0x2000000,
FLG0_CRAWLING = 0x1000000,
FLG0_TIGHT_ROPE = 0x800000,
FLG0_SWING_ROPE = 0x400000,
FLG0_PUSHPULL = 0x200000,
FLG0_UNK_100000 = 0x100000,
FLG0_UNK_80000 = 0x80000,
FLG0_IN_WATER = 0x40000,
FLG0_ON_LADDDER = 0x20000,
FLG0_ON_VINES = 0x10000,
FLG0_UNK_0x8000 = 0x8000,
FLG0_UNK_0x4000 = 0x4000,
FLG0_INTERATION = 0x2000,
FLG0_BASIC_ACTION = 0x1000,
FLG0_HANGING_ITEM = 0x800,
FLG0_EXTERN_CONTROL = 0x400,
FLG0_ATTACK_RELATED = 0x200,
FLG0_UNK_0x100 = 0x100,
FLG0_UNK_0x80 = 0x80,
FLG0_HANGING_LEDGE = 0x40,
FLG0_UNK_0x20 = 0x20,
FLG0_UNK_0x10 = 0x10,
FLG0_DAMAGED = 0x8,
FLG0_UNK_0x4 = 0x4,
FLG0_IN_AIR = 0x2,
FLG0_STATIONARY = 0x1,
FLG0_FLY = FLG0_TIGHT_ROPE | FLG0_SWING_ROPE | FLG0_IN_WATER | FLG0_ON_LADDDER | FLG0_ON_VINES |
FLG0_HANGING_ITEM | FLG0_HANGING_LEDGE | FLG0_UNK_0x10 | FLG0_IN_AIR,
};
enum dAcPy_RidingActor {
RIDING_NONE = 0,
RIDING_TRUCK_MINECART = 1,
RIDING_LOFTWING = 2,
RIDING_BOAT = 3,
};
dAcPy_c();
virtual ~dAcPy_c();
void setTransform(const mMtx_c &mtx, UNKWORD, UNKWORD, UNKWORD);
void setPosYRot(const mVec3_c &pos, mAng rot, UNKWORD, UNKWORD, UNKWORD);
// argument is always false in existing code, true doesn't seem to make a difference
void bonk(bool unk = false);
bool fn_80202D90(bool);
/* vt 0x080 */ virtual UNKWORD IfCurrentActionToActor(dAcBase_c *ac, UNKWORD);
/* vt 0x084 */ virtual void vt_0x084(dAcBase_c *ac, UNKWORD);
/* vt 0x088 */ virtual void set0x439F(dAcBase_c *ac, UNKWORD);
/* vt 0x08C */ virtual void set0x43DE();
/* vt 0x090 */ virtual f32 vt_0x090();
/* vt 0x094 */ virtual void relatedToUsingItem0x11();
/* vt 0x098 */ virtual void setPosRot(const mVec3_c &pos, const mAng3_c &ang, UNKWORD, UNKWORD, UNKWORD);
/* vt 0x09C */ virtual void isLiftingObject();
/* vt 0x0A0 */ virtual void isThrowingOrRollingItem();
/* vt 0x0A4 */ virtual void canThrowObject();
/* vt 0x0A8 */ virtual void canRollObject();
/* vt 0x0AC */ virtual void vt_0x0AC();
/* vt 0x0B0 */ virtual void isCarryingBomb();
/* vt 0x0B4 */ virtual void isPullingOutBomb();
/* vt 0x0B8 */ virtual void isUsingHarp();
/* vt 0x0BC */ virtual void isFinishedPlayingHarp();
/* vt 0x0C0 */ virtual void isUsingWhip();
/* vt 0x0C4 */ virtual void anotherThingWithWhip();
/* vt 0x0C8 */ virtual void somethingWithWHip();
/* vt 0x0CC */ virtual void isWhipOnObject();
/* vt 0x0D0 */ virtual void tryGrabItemWithWhip();
/* vt 0x0D4 */ virtual void someFloatWithWhip();
/* vt 0x0D8 */ virtual void getItemFromClawshotsMaybe();
/* vt 0x0DC */ virtual void vt_0x0DC(dAcBase_c *, mVec3_c &);
/* vt 0x0E0 */ virtual void isUsingBomb();
/* vt 0x0E4 */ virtual mVec3_c &getCenterTranslation() const;
/* vt 0x0E8 */ virtual void vt_0x0E8();
/* vt 0x0EC */ virtual void vt_0x0EC();
/* vt 0x0F0 */ virtual void vt_0x0F0();
/* vt 0x0F4 */ virtual void vt_0x0F4();
/* vt 0x0F8 */ virtual void vt_0x0F8();
/* vt 0x0FC */ virtual void vt_0x0FC();
/* vt 0x100 */ virtual void isCrawling();
/* vt 0x104 */ virtual void isUsingSword();
/* vt 0x108 */ virtual void isUsingMitts();
/* vt 0x10C */ virtual void isUsingShield();
/* vt 0x110 */ virtual void getTargetedActor1();
/* vt 0x114 */ virtual void somethingWithCarriedActorFlags();
/* vt 0x118 */ virtual dAcObjBase_c *getCurrentCarriedActor();
/* vt 0x11C */ virtual void checkBeetleActorReferences();
/* vt 0x120 */ virtual void getBeetleActorReferencesSize();
/* vt 0x124 */ virtual void vt_0x124();
/* vt 0x128 */ virtual void vt_0x128();
/* vt 0x12C */ virtual void vt_0x12C();
/* vt 0x130 */ virtual void isBurning();
/* vt 0x134 */ virtual void isShocked();
/* vt 0x138 */ virtual void isCursed();
/* vt 0x13C */ virtual void isSmelly();
/* vt 0x140 */ virtual void store2Floats0x4500();
/* vt 0x144 */ virtual void setActorLinkToSomething();
/* vt 0x148 */ virtual void applyDamageWithIFrames();
/* vt 0x14C */ virtual void vt_0x14C();
/* vt 0x150 */ virtual bool hasLessThanQuarterHealth(bool);
/* vt 0x154 */ virtual void vt_0x154();
/* vt 0x158 */ virtual void vt_0x158();
/* vt 0x15C */ virtual void vt_0x15C();
/* vt 0x160 */ virtual void vt_0x160();
/* vt 0x164 */ virtual void vt_0x164();
/* vt 0x168 */ virtual f32 getCurrentAnimFrame() const;
/* vt 0x16C */ virtual void getFloatIfStruggling();
/* vt 0x170 */ virtual void isSwimming();
/* vt 0x174 */ virtual void isGustBellowsBeingBlown();
/* vt 0x178 */ virtual void getPointedAngle();
/* vt 0x17C */ virtual void getBellowsPosOrOtherVec3F();
/* vt 0x180 */ virtual void setWindMillPos();
/* vt 0x184 */ virtual void isOffeset0x435eEqual0x20();
/* vt 0x188 */ virtual void getVec3F_Z();
/* vt 0x18C */ virtual void getBodyMtx(mMtx_c *out_mtx, int boneIdx);
/* vt 0x190 */ virtual void getSheathModelMatrix();
/* vt 0x194 */ virtual void getSwordModelMatrix();
/* vt 0x198 */ virtual void vt_0x198();
/* vt 0x19C */ virtual void vt_0x19C();
/* vt 0x1A0 */ virtual void vt_0x1A0();
/* vt 0x1A4 */ virtual void vt_0x1A4();
/* vt 0x1A8 */ virtual void vt_0x1A8();
/* vt 0x1AC */ virtual void vt_0x1AC();
/* vt 0x1B0 */ virtual bool isItemFairyFromBugnet();
/* vt 0x1B4 */ virtual void isByte0x434eEqual7();
/* vt 0x1B8 */ virtual void canHandleGameOver();
/* vt 0x1BC */ virtual void vt_0x1BC();
/* vt 0x1C0 */ virtual void *vt_0x1C0() const;
/* vt 0x1C4 */ virtual void getActorInActorRef1();
/* vt 0x1C8 */ virtual void doesActorRef1Exist();
/* vt 0x1CC */ virtual void unlinkActorRef1();
/* vt 0x1D0 */ virtual void ifHasHealthAndSomethingElse();
/* vt 0x1D4 */ virtual void isChargingWeapon();
/* vt 0x1D8 */ virtual void isWeaponChargedFully();
/* vt 0x1DC */ virtual void didShootBow();
/* vt 0x1E0 */ virtual void vt_0x1E0();
/* vt 0x1E4 */ virtual void checkRefArrayAtIndex();
/* vt 0x1E8 */ virtual void sizeOfActorRefs_16();
/* vt 0x1EC */ virtual void vt_0x1EC();
/* vt 0x1F0 */ virtual void vt_0x1F0();
/* vt 0x1F4 */ virtual void didDiveSky_and_other();
/* vt 0x1F8 */ virtual void didDiveSky_andNotOther();
/* vt 0x1FC */ virtual void isLandingFromSailcloth();
/* vt 0x200 */ virtual void isBeingPulledFromRightClawshot();
/* vt 0x204 */ virtual void isBeingPulledByLeftClawshot();
/* vt 0x208 */ virtual void isDashing();
/* vt 0x20C */ virtual void isSliding();
/* vt 0x210 */ virtual void isSlding2();
/* vt 0x214 */ virtual void vt_0x214();
/* vt 0x218 */ virtual void isinMpPosePower();
/* vt 0x21C */ virtual void isPushingBlock();
/* vt 0x220 */ virtual void getRidingActor();
/* vt 0x224 */ virtual bool isRidingBall() const;
/* vt 0x228 */ virtual dAcObjBase_c *getRidingMinecartActor() const;
/* vt 0x22C */ virtual void getTurnableSwitch();
/* vt 0x230 */ virtual void vt_0x230();
/* vt 0x234 */ virtual void vt_0x234();
/* vt 0x238 */ virtual void setVecIfInFreeFall();
/* vt 0x23C */ virtual void setActorRef10();
/* vt 0x240 */ virtual void vt_0x240();
/* vt 0x244 */ virtual void vt_0x244();
/* vt 0x248 */ virtual void vt_0x248();
/* vt 0x24C */ virtual void vt_0x24C();
/* vt 0x250 */ virtual void vt_0x250();
/* vt 0x254 */ virtual void isAttackingUnderground();
/* vt 0x258 */ virtual mAng vt_0x258() const;
/* vt 0x25C */ virtual void vt_0x25C();
/* vt 0x260 */ virtual f32 vt_0x260() const;
/* vt 0x264 */ virtual void getGroosenatorIfIn();
/* vt 0x268 */ virtual void setActorRef11();
/* vt 0x26C */ virtual void doesGameOver();
/* vt 0x270 */ virtual void triggerExitRelated();
/* vt 0x274 */ virtual void vt_0x274();
/* vt 0x278 */ virtual void vt_0x278();
/* vt 0x27C */ virtual void getSwordPos();
/* vt 0x280 */ virtual void vt_0x280();
/* vt 0x284 */ virtual bool isUsingBugnet() const;
/* vt 0x288 */ virtual const mVec3_c &getBugNetPos() const;
/* vt 0x28C */ virtual bool isUsingBugnet1();
/* vt 0x290 */ virtual void bugNetCollectTreasure(u32 itemId);
/* vt 0x294 */ virtual void somethingSwitchDials();
/* vt 0x298 */ virtual void vt_0x298();
/* vt 0x29C */ virtual void getDieLargeDamageDir();
/* vt 0x2A0 */ virtual void doGameOver();
/* vt 0x2A4 */ virtual void isRunningUpWall();
/* vt 0x2A8 */ virtual void lookTowardItem();
/* vt 0x2AC */ virtual void vt_0x2AC();
/* vt 0x2B0 */ virtual void vt_0x2B0();
/* vt 0x2B4 */ virtual void triggerMoveEventMaybe();
/* vt 0x2B8 */ virtual void setActorRef9();
/* vt 0x2BC */ virtual void unlinkActorRef9();
/* vt 0x2C0 */ virtual void vt_0x2C0();
/* vt 0x2C4 */ virtual void vt_0x2C4();
/* vt 0x2C8 */ virtual bool isRecovering() const;
/* vt 0x2CC */ virtual void isDrinkingPotion();
/* vt 0x2D0 */ virtual void isHealingShield();
/* vt 0x2D4 */ virtual void isBottleOut();
/* vt 0x2D8 */ virtual void isUsingBottle();
/* vt 0x2DC */ virtual void getShieldRegenProgressMaybe();
/* vt 0x2E0 */ virtual void vt_0x2E0();
/* vt 0x2E4 */ virtual void someDivingHrabbingStuff();
/* vt 0x2E8 */ virtual void vt_0x2E8();
/* vt 0x2EC */ virtual void isOnClawTargetMaybe();
/* vt 0x2F0 */ virtual void isMPPose();
/* vt 0x2F4 */ virtual void isOnTightRope();
/* vt 0x2F8 */ virtual void isOnVines();
/* vt 0x2FC */ virtual void alwaysRet0();
/* vt 0x300 */ virtual void canBlockAttack();
/* vt 0x304 */ virtual void vt_0x304();
/* vt 0x308 */ virtual void vt_0x308();
/* vt 0x30C */ virtual void vt_0x30C();
/* overrides omitted */
/* vt 0x310 */ virtual void vt_0x310();
/* vt 0x314 */ virtual void vt_0x314();
/* vt 0x318 */ virtual void vt_0x318();
/* 0x330 */ u8 unk_0x330[0x339 - 0x330];
/* 0x339 */ u8 mRidingActorType;
/* 0x33A */ u8 unk_0x33A[0x340 - 0x33A];
/* 0x340 */ u32 someFlags_0x340;
/* 0x344 */ u8 unk_0x344[0x348 - 0x344];
/* 0x348 */ u32 mSwordAndMoreStates;
/* 0x34C */ u8 unk_0x34C[0x350 - 0x34C];
/* 0x350 */ u32 someFlags_0x350;
u8 UNK_0x354[0x35C - 0x354];
/* 0x35C */ u32 mForceOrPreventActionFlags;
/* 0x360 */ UNKWORD field_0x360;
/* 0x364 */ u32 mActionFlags;
/* 0x368 */ u32 mActionFlagsCont;
/* 0x36C */ int mCurrentAction; // TODO (Document Enum)
/* 0x370 */ u8 _370[0x3C8 - 0x370];
/* 0x3C8 */ nw4r::g3d::ResFile mSwordRes;
/* 0x3CC */ u8 _0x3CC[0x5B4 - 0x3CC];
/* 0x5B4 */ m3d::anmMatClr_c mAnmMatClr;
/* 0x5E0 */ u8 _0x5E0[0x4564 - 0x5E0];
protected:
/* 0x137C */ u8 _0x137C[0x4564 - 0x137C];
/* 0x4564 */ f32 field_0x4564;
public:
f32 getField_0x4564() const {
return field_0x4564;
}
f32 getAnmMatClrFrame() const {
return mAnmMatClr.getFrame(0);
f32 getSwordAnmFrame() const {
return mSwordAnmMatClr.getFrame(0);
}
inline bool checkFlags0x340(u32 mask) const {
return (someFlags_0x340 & mask) != 0;
}
inline bool checkFlags0x350(u32 mask) const {
return (someFlags_0x350 & mask) != 0;
}
bool CheckPlayerFly() const {
return mActionFlags & FLG0_FLY;
}
int getCurrentAction() const {
return mCurrentAction;
}
bool checkCurrentAction(int action) const {
return mCurrentAction == action;
}
bool isSittingOrUnk0xAE() const {
return mCurrentAction == 0xAD || mCurrentAction == 0xAE;
}
inline bool checkSwordAndMoreStates(u32 mask) const {
return (mSwordAndMoreStates & mask) != 0;
}
inline bool checkActionFlags(u32 mask) const {
return (mActionFlags & mask) != 0;
}
inline bool checkActionFlagsCont(u32 mask) const {
return (mActionFlagsCont & mask) != 0;
}
inline u8 getRidingActorType() const {
return mRidingActorType;
nw4r::g3d::ResFile getSwordResFile() const {
return mSwordRes;
}
inline bool hasvt_0x1C0() const {
@@ -321,8 +52,6 @@ public:
return FileManager::GetInstance()->hasStaminaPotionPlus() && getRidingActorType() != RIDING_BOAT;
}
static nw4r::g3d::ResFile getItemResFile(const char *name, mAllocator_c &allocator);
static const dAcPy_c *GetLink() {
return LINK;
}
@@ -331,6 +60,8 @@ public:
return LINK2;
}
void onShieldUpdate();
static dAcPy_c *LINK;
static dAcPy_c *LINK2;
@@ -338,15 +69,18 @@ public:
static s32 getCurrentSlingshotType();
static s32 getCurrentBeetleType();
static s32 getCurrentBugNetType();
static s32 getCurrentlyEquippedShieldType();
static bool isInBambooCuttingMinigame();
static bool isInBambooCuttingMinigame() {
return MinigameManager::isInMinigameState(MinigameManager::BAMBOO_CUTTING);
}
static bool isItemRestrictedByBokoBase(ITEM_ID item);
static u32 getCurrentHealthCapacity();
bool canDowseProbably() const;
mAng fn_8023B520() const;
mAng fn_8023B590() const;
};
#endif
+4
View File
@@ -38,6 +38,10 @@ public:
// This is a remnant of cCcS, which dCcS::Ct calls. Idk the correct layout
void Ct_cCcS();
dCcMassS_Mng &GetMassMng() {
return mMassMng;
}
void Ct();
void Dt();
+640
View File
@@ -0,0 +1,640 @@
#ifndef D_A_PLAYER_ACT_H
#define D_A_PLAYER_ACT_H
#include "d/d_player_base.h"
class dAcEnBase_c;
// Does this one have a vtable?
// Name unknown
class daPlayerActBase_c : public daPlBase_c {
public:
daPlayerActBase_c() : field_0x334(120.0f), mCurrentAction(187) {}
virtual ~daPlayerActBase_c() {}
int preExecute() override;
void postExecute(MAIN_STATE_e state) override;
/* vt 0x080 */ virtual UNKWORD IfCurrentActionToActor(dAcBase_c *ac, UNKWORD) {
return 0;
}
/* vt 0x084 */ virtual UNKWORD vt_0x084(dAcBase_c *ac, UNKWORD) {
return 0;
}
/* vt 0x088 */ virtual void set0x439F(dAcBase_c *ac, UNKWORD) {}
/* vt 0x08C */ virtual void set0x43DE() {}
/* vt 0x090 */ virtual f32 vt_0x090() {
return 0.0f;
}
/* vt 0x094 */ virtual void relatedToUsingItem0x11() {
// TODO obvious hack, not sure
delete (daPlBase_c *)0;
}
/* vt 0x098 */ virtual void setPosRot(const mVec3_c *pos, const mAng3_c *ang, bool force, UNKWORD, UNKWORD);
/* vt 0x09C */ virtual bool isLiftingObject() {
return false;
}
/* vt 0x0A0 */ virtual bool isThrowingOrRollingItem() {
return false;
}
/* vt 0x0A4 */ virtual bool canThrowObject() {
return false;
}
/* vt 0x0A8 */ virtual bool canRollObject() {
return false;
}
/* vt 0x0AC */ virtual UNKWORD vt_0x0AC() {
return 0;
}
/* vt 0x0B0 */ virtual bool isCarryingBomb() {
return false;
}
/* vt 0x0B4 */ virtual bool isPullingOutBomb() {
return false;
}
/* vt 0x0B8 */ virtual bool isUsingHarp() {
return false;
}
/* vt 0x0BC */ virtual void finishPlayingHarp() {}
/* vt 0x0C0 */ virtual bool isUsingWhip() {
return false;
}
/* vt 0x0C4 */ virtual bool anotherThingWithWhip() {
return false;
}
/* vt 0x0C8 */ virtual bool somethingWithWHip() {
return false;
}
/* vt 0x0CC */ virtual bool isWhipOnObject() {
return false;
}
/* vt 0x0D0 */ virtual bool tryGrabItemWithWhip() {
return false;
}
/* vt 0x0D4 */ virtual f32 someFloatWithWhip() {
return 0.0f;
}
/* vt 0x0D8 */ virtual UNKWORD getItemFromClawshotsMaybe() {
return 0;
}
/* vt 0x0DC */ virtual UNKWORD vt_0x0DC(dAcBase_c *, mVec3_c &) {
return 0;
}
/* vt 0x0E0 */ virtual bool isUsingBomb() {
return false;
}
/* vt 0x0E4 */ virtual const mVec3_c &getCenterTranslation() const {
// unused; overridden by daPlayerModelBase_c
return mVec3_c::Zero;
}
/* vt 0x0E8 */ virtual const mVec3_c &vt_0x0E8() const {
// unused; overridden by daPlayerModelBase_c
return mVec3_c::Zero;
}
/* vt 0x0EC */ virtual const mVec3_c &vt_0x0EC() const {
// unused; overridden by daPlayerModelBase_c
return mVec3_c::Zero;
}
/* vt 0x0F0 */ virtual const mVec3_c &vt_0x0F0() const {
// unused; overridden by daPlayerModelBase_c
return mVec3_c::Zero;
}
/* vt 0x0F4 */ virtual const mVec3_c &vt_0x0F4() const {
// unused; overridden by daPlayerModelBase_c
return mVec3_c::Zero;
}
/* vt 0x0F8 */ virtual mAng vt_0x0F8() {
return 0;
}
/* vt 0x0FC */ virtual mAng vt_0x0FC() {
return 0;
}
/* vt 0x100 */ virtual bool isCrawling() {
return false;
}
/* vt 0x104 */ virtual bool isUsingSword() {
return false;
}
/* vt 0x108 */ virtual bool isUsingMitts() {
return false;
}
/* vt 0x10C */ virtual bool isUsingShield() {
return false;
}
/* vt 0x110 */ virtual dAcEnBase_c *getTargetedActor1() const {
return nullptr;
}
/* vt 0x114 */ virtual void somethingWithCarriedActorFlags() {
// unused; overridden by daPlayerModelBase_c
}
/* vt 0x118 */ virtual dAcObjBase_c *getCurrentCarriedActor() {
// unused; overridden by daPlayerModelBase_c
return nullptr;
}
/* vt 0x11C */ virtual UNKWORD checkBeetleActorReferences() {
return 0;
}
/* vt 0x120 */ virtual UNKWORD getBeetleActorReferencesSize() {
return 0;
}
/* vt 0x124 */ virtual UNKWORD vt_0x124() {
return 0;
}
/* vt 0x128 */ virtual UNKWORD vt_0x128() {
return 0;
}
/* vt 0x12C */ virtual UNKWORD vt_0x12C() {
return 0;
}
/* vt 0x130 */ virtual bool isBurning() {
return 0;
}
/* vt 0x134 */ virtual bool isShocked() {
return 0;
}
/* vt 0x138 */ virtual bool isCursed() {
return 0;
}
/* vt 0x13C */ virtual bool isSmelly() {
return 0;
}
/* vt 0x140 */ virtual void store2Floats0x4500() {}
/* vt 0x144 */ virtual bool setActorLinkToSomething() {
return true;
}
/* vt 0x148 */ virtual void applyDamageWithIFrames() {}
/* vt 0x14C */ virtual void vt_0x14C() {}
/* vt 0x150 */ virtual bool hasLessThanQuarterHealth(bool) {
return false;
}
/* vt 0x154 */ virtual UNKWORD vt_0x154() {
return 0;
}
/* vt 0x158 */ virtual UNKWORD vt_0x158() {
return 0;
}
/* vt 0x15C */ virtual UNKWORD vt_0x15C() {
return 0;
}
/* vt 0x160 */ virtual f32 getYPos() {
return position.y;
}
/* vt 0x164 */ virtual f32 vt_0x164() {
return position.y;
}
/* vt 0x168 */ virtual f32 getCurrentAnimFrame() const {
return 0.0f;
}
/* vt 0x16C */ virtual f32 getFloatIfStruggling() {
return 0.0f;
}
/* vt 0x170 */ virtual bool isSwimming() {
return false;
}
/* vt 0x174 */ virtual bool isGustBellowsBeingBlown() {
return false;
}
/* vt 0x178 */ virtual const mAng3_c &getPointedAngle() const {
return rotation;
}
/* vt 0x17C */ virtual const mVec3_c &getBellowsPosOrOtherVec3F() const {
return position;
}
/* vt 0x180 */ virtual void setWindMillPos() {}
/* vt 0x184 */ virtual bool isOffeset0x435eEqual0x20() {
return 0;
}
/* vt 0x188 */ virtual const mVec3_c &getVec3F_Z() const {
return mVec3_c::Ez;
}
/* vt 0x18C */ virtual void getBodyMtx(mMtx_c *out_mtx, int boneIdx) {
// unused; overridden by daPlayerModelBase_c
}
/* vt 0x190 */ virtual void getSheathModelMatrix(mMtx_c *out_mtx) {
// unused; overridden by daPlayerModelBase_c
}
/* vt 0x194 */ virtual void getSwordModelMatrix(mMtx_c *out_mtx) {
// unused; overridden by daPlayerModelBase_c
}
/* vt 0x198 */ virtual mAng vt_0x198() {
// unused; overridden by daPlayerModelBase_c
return 0;
}
/* vt 0x19C */ virtual mAng vt_0x19C() {
// unused; overridden by daPlayerModelBase_c
return 0;
}
/* vt 0x1A0 */ virtual f32 vt_0x1A0() {
return 0.0f;
}
/* vt 0x1A4 */ virtual const mVec3_c &vt_0x1A4() {
return poscopy3;
}
/* vt 0x1A8 */ virtual f32 vt_0x1A8() {
return yoffset;
}
/* vt 0x1AC */ virtual f32 vt_0x1AC() {
return 0.0f;
}
/* vt 0x1B0 */ virtual bool isItemFairyFromBugnet() {
return false;
}
/* vt 0x1B4 */ virtual bool isByte0x434eEqual7() {
return false;
}
/* vt 0x1B8 */ virtual void canHandleGameOver() {}
/* vt 0x1BC */ virtual UNKWORD vt_0x1BC() {
return 0;
}
/* vt 0x1C0 */ virtual void *vt_0x1C0() const {
return nullptr;
}
/* vt 0x1C4 */ virtual UNKWORD getActorInActorRef1() {
return 0;
}
/* vt 0x1C8 */ virtual bool doesActorRef1Exist() {
return false;
}
/* vt 0x1CC */ virtual void unlinkActorRef1() {}
/* vt 0x1D0 */ virtual bool ifHasHealthAndSomethingElse() {
return false;
}
/* vt 0x1D4 */ virtual bool isChargingWeapon() {
return false;
}
/* vt 0x1D8 */ virtual bool isWeaponChargedFully() {
return false;
}
/* vt 0x1DC */ virtual bool didShootBow() {
return true;
}
/* vt 0x1E0 */ virtual UNKWORD vt_0x1E0() {
return 0;
}
/* vt 0x1E4 */ virtual dAcObjBase_c *checkRefArrayAtIndex() {
return nullptr;
}
/* vt 0x1E8 */ virtual s32 sizeOfActorRefs_16() {
return 0;
}
/* vt 0x1EC */ virtual bool vt_0x1EC() {
return true;
}
/* vt 0x1F0 */ virtual UNKWORD vt_0x1F0() {
return 0;
}
/* vt 0x1F4 */ virtual UNKWORD didDiveSky_and_other() {
return 0;
}
/* vt 0x1F8 */ virtual UNKWORD didDiveSky_andNotOther() {
return 0;
}
/* vt 0x1FC */ virtual UNKWORD isLandingFromSailcloth() {
return 0;
}
/* vt 0x200 */ virtual bool isBeingPulledFromRightClawshot() {
return false;
}
/* vt 0x204 */ virtual bool isBeingPulledByLeftClawshot() {
return false;
}
/* vt 0x208 */ virtual bool isDashing() {
return false;
}
/* vt 0x20C */ virtual bool isSliding() {
return false;
}
/* vt 0x210 */ virtual bool isSlding2() {
return false;
}
/* vt 0x214 */ virtual UNKWORD vt_0x214() {
return 0;
}
/* vt 0x218 */ virtual bool isinMpPosePower() {
return false;
}
/* vt 0x21C */ virtual bool isPushingBlock() {
return false;
}
/* vt 0x220 */ virtual dAcObjBase_c *getRidingActor() {
return nullptr;
}
/* vt 0x224 */ virtual bool isRidingBall() const {
return false;
}
/* vt 0x228 */ virtual dAcObjBase_c *getRidingMinecartActor() const {
return 0;
}
/* vt 0x22C */ virtual UNKWORD getTurnableSwitch() {
return 0;
}
/* vt 0x230 */ virtual UNKWORD vt_0x230() {
return 0;
}
/* vt 0x234 */ virtual UNKWORD vt_0x234() {
return 0;
}
/* vt 0x238 */ virtual void setVecIfInFreeFall() {}
/* vt 0x23C */ virtual void setActorRef10() {}
/* vt 0x240 */ virtual f32 vt_0x240() {
return 0.0f;
}
/* vt 0x244 */ virtual UNKWORD vt_0x244() {
return 0;
}
/* vt 0x248 */ virtual UNKWORD vt_0x248() {
return 0;
}
/* vt 0x24C */ virtual UNKWORD vt_0x24C() {
return 0;
}
/* vt 0x250 */ virtual f32 vt_0x250() {
return 1.0f;
}
/* vt 0x254 */ virtual bool isAttackingUnderground() {
return false;
}
/* vt 0x258 */ virtual mAng vt_0x258() const {
return 0;
}
/* vt 0x25C */ virtual UNKWORD vt_0x25C() {
return 0;
}
/* vt 0x260 */ virtual f32 vt_0x260() const {
return 1.0f;
}
/* vt 0x264 */ virtual UNKWORD getGroosenatorIfIn() {
return 0;
}
/* vt 0x268 */ virtual void setActorRef11() {}
/* vt 0x26C */ virtual bool doesGameOver() {
return true;
}
/* vt 0x270 */ virtual void triggerExitRelated() {}
/* vt 0x274 */ virtual mAng vt_0x274() {
return rotation.y;
}
/* vt 0x278 */ virtual const mVec3_c &vt_0x278() const {
return position;
}
/* vt 0x27C */ virtual const mVec3_c &getSwordPos() const {
return position;
}
/* vt 0x280 */ virtual UNKWORD vt_0x280() {
return 0;
}
/* vt 0x284 */ virtual bool isUsingBugnet() const {
return false;
}
/* vt 0x288 */ virtual const mVec3_c &getBugNetPos() const {
return position;
}
/* vt 0x28C */ virtual bool isUsingBugnet1() {
return false;
}
/* vt 0x290 */ virtual UNKWORD bugNetCollectTreasure(u32 itemId) {
return 0;
}
/* vt 0x294 */ virtual mAng somethingSwitchDials() {
return 0;
}
/* vt 0x298 */ virtual UNKWORD vt_0x298() {
return 0;
}
/* vt 0x29C */ virtual UNKWORD getDieLargeDamageDir() {
return 0;
}
/* vt 0x2A0 */ virtual void doGameOver() {}
/* vt 0x2A4 */ virtual bool isRunningUpWall() {
return false;
}
/* vt 0x2A8 */ virtual void lookTowardItem() {}
/* vt 0x2AC */ virtual void vt_0x2AC() {}
/* vt 0x2B0 */ virtual void vt_0x2B0() {}
/* vt 0x2B4 */ virtual void triggerMoveEventMaybe() {}
/* vt 0x2B8 */ virtual void setActorRef9() {}
/* vt 0x2BC */ virtual void unlinkActorRef9() {}
/* vt 0x2C0 */ virtual bool vt_0x2C0() {
return true;
}
/* vt 0x2C4 */ virtual bool vt_0x2C4() {
return true;
}
/* vt 0x2C8 */ virtual bool isRecovering() const {
return false;
}
/* vt 0x2CC */ virtual bool isDrinkingPotion() {
return false;
}
/* vt 0x2D0 */ virtual bool isHealingShield() {
return false;
}
/* vt 0x2D4 */ virtual bool isBottleOut() {
return false;
}
/* vt 0x2D8 */ virtual bool isUsingBottle() {
return false;
}
/* vt 0x2DC */ virtual f32 getShieldRegenProgressMaybe() {
return 0.0f;
}
enum dAcPy_RidingActor {
RIDING_NONE = 0,
RIDING_TRUCK_MINECART = 1,
RIDING_LOFTWING = 2,
RIDING_BOAT = 3,
};
enum PlayerAttackDirection_e {
ATTACK_NONE = 0,
ATTACK_SWING_LEFT = 1,
ATTACK_SWING_RIGHT = 2,
ATTACK_SWING_DOWN = 3,
ATTACK_SWING_UP = 4,
ATTACK_STAB = 5,
ATTACK_SPIN_RIGHT = 6,
ATTACK_SPIN_LEFT = 7,
ATTACK_SPIN_DOWN = 8,
ATTACK_SPIN_UP = 9,
ATTACK_JUMP_SLASH = 10,
ATTACK_FINAL_BLOW = 11,
};
enum ModelUpdateFlags_e {
UPDATE_MODEL_SWORD = 0x20,
UPDATE_MODEL_SHIELD = 0x40,
};
enum SwordAndMoreStates_e {
NO_SHIETH = (1 << 0),
POUCH = (1 << 1),
SWORD_AWAY = (1 << 2),
FLASH_RED = (1 << 4),
DEPLETE_STAMINA = (1 << 5),
SPRINTING = (1 << 6),
B_WHEEL_OPEN = (1 << 7),
POUCH_OPEN = (1 << 8),
TRYING_TO_USE_STAMINA_NOT_ABLE = (1 << 9),
PUTTING_AWAY_SAILCLOTH = (1 << 10),
GRAB_LEDGE_FROM_UNDER = (1 << 13),
HOLDING_A_NO_STAMINA_DROP = (1 << 14),
FIRST_PERSON = (1 << 18),
SKYWARD_STRIKE_ACTIVE = (1 << 20),
LIGHTNING_STRIKE_ACTIVE = (1 << 22),
C_MENU_OPEN = (1 << 23),
SHIELD_OUT = (1 << 27),
HOLDING_TARGET = (1 << 28),
ITEM_NEAR_LINK = (1 << 29),
USING_ITEM = (1 << 31),
};
// These Flags are named under general guesses. Very likely may need some changes
// Correspond to mActionFlags
enum dAcPy_FLG0 {
FLG0_ON_FOOT = 0x80000000,
FLG0_USE_ITEM_0 = 0x40000000,
FLG0_USE_ITEM_1 = 0x20000000,
FLG0_UNK_GEN_MOVE = 0x10000000,
FLG0_ATTACK_MOVE = 0x8000000,
FLG0_USE_ITEM_2 = 0x4000000,
FLG0_RECOVER_ELEC = 0x2000000,
FLG0_CRAWLING = 0x1000000,
FLG0_TIGHT_ROPE = 0x800000,
FLG0_SWING_ROPE = 0x400000,
FLG0_PUSHPULL = 0x200000,
FLG0_UNK_100000 = 0x100000,
FLG0_UNK_80000 = 0x80000,
FLG0_IN_WATER = 0x40000,
FLG0_ON_LADDDER = 0x20000,
FLG0_ON_VINES = 0x10000,
FLG0_UNK_0x8000 = 0x8000,
FLG0_UNK_0x4000 = 0x4000,
FLG0_INTERATION = 0x2000,
FLG0_BASIC_ACTION = 0x1000,
FLG0_HANGING_ITEM = 0x800,
FLG0_EXTERN_CONTROL = 0x400,
FLG0_ATTACK_RELATED = 0x200,
FLG0_UNK_0x100 = 0x100,
FLG0_UNK_0x80 = 0x80,
FLG0_HANGING_LEDGE = 0x40,
FLG0_UNK_0x20 = 0x20,
FLG0_UNK_0x10 = 0x10,
FLG0_DAMAGED = 0x8,
FLG0_UNK_0x4 = 0x4,
FLG0_IN_AIR = 0x2,
FLG0_STATIONARY = 0x1,
FLG0_FLY = FLG0_TIGHT_ROPE | FLG0_SWING_ROPE | FLG0_IN_WATER | FLG0_ON_LADDDER | FLG0_ON_VINES |
FLG0_HANGING_ITEM | FLG0_HANGING_LEDGE | FLG0_UNK_0x10 | FLG0_IN_AIR,
};
inline bool checkFlags0x340(u32 mask) const {
return (someFlags_0x340 & mask) != 0;
}
inline void offFlags_0x340(u32 mask) {
someFlags_0x340 &= ~mask;
}
inline bool checkFlags0x350(u32 mask) const {
return (someFlags_0x350 & mask) != 0;
}
inline void onFlags_0x360(u32 mask) {
field_0x360 |= mask;
}
inline void onForceOrPreventActionFlags(u32 mask) {
mForceOrPreventActionFlags |= mask;
}
inline void onFaceUpdateFlags(u32 mask) {
mFaceUpdateFlags |= mask;
}
inline void offFaceUpdateFlags(u32 mask) {
mFaceUpdateFlags &= ~mask;
}
inline bool checkFaceUpdateFlags(u32 mask) const {
return (mFaceUpdateFlags & mask) != 0;
}
bool CheckPlayerFly() const {
return mActionFlags & FLG0_FLY;
}
int getCurrentAction() const {
return mCurrentAction;
}
bool checkCurrentAction(int action) const {
return mCurrentAction == action;
}
bool isSittingOrUnk0xAE() const {
return mCurrentAction == 0xAD || mCurrentAction == 0xAE;
}
inline bool checkActionFlags(u32 mask) const {
return (mActionFlags & mask) != 0;
}
inline bool checkActionFlagsCont(u32 mask) const {
return (mActionFlagsCont & mask) != 0;
}
inline u8 getRidingActorType() const {
return mRidingActorType;
}
static bool isInEvent();
bool isAttackingLeft() const;
bool isAttackingRight() const;
bool isAttackingDown() const;
bool isAttackingUp() const;
bool isAttackingStab() const;
bool isAttackingSpinHorizontal() const;
bool isAttackingSpinVertical() const;
void setBonkRelatedAnimFlag(bool b);
void setPosYRot(const mVec3_c &pos, mAng rot, bool force, UNKWORD, UNKWORD);
void setTransform(const mMtx_c &mtx, bool force, UNKWORD, UNKWORD);
bool someTargetedActorCheck() const;
static mAng fn_8005BA90();
static mAng fn_8005BAA0();
static void updateCurrentSword();
static s32 getCurrentSwordType();
static const char *getSwordName(s32);
static s32 getCurrentlyEquippedShieldType();
static const mColor &getEarringsColor();
static mVec3_c sPos1;
static mVec3_c sPos2;
static mAng sRot1;
static mAng sRot2;
static const f32 sPushRelatedConstant;
static u8 sCurrentSword;
protected:
/* 0x330 */ u8 unk_0x330[0x334 - 0x330];
/* 0x334 */ f32 field_0x334;
/* 0x338 */ u8 mAttackDirection;
/* 0x339 */ u8 mRidingActorType;
/* 0x33A */ u8 unk_0x33A[0x340 - 0x33A];
/* 0x340 */ u32 someFlags_0x340;
/* 0x344 */ u32 mFaceUpdateFlags;
/* 0x348 */ u32 mSwordAndMoreStates;
/* 0x34C */ u32 mModelUpdateFlags;
/* 0x350 */ u32 someFlags_0x350;
/* 0x354 */ u32 someFlags_0x354;
/* 0x358 */ u32 someFlags_0x358;
/* 0x35C */ u32 mForceOrPreventActionFlags;
/* 0x360 */ u32 field_0x360;
/* 0x364 */ u32 mActionFlags;
/* 0x368 */ u32 mActionFlagsCont;
/* 0x36C */ int mCurrentAction; // TODO (Document Enum)
};
#endif
+26
View File
@@ -0,0 +1,26 @@
#ifndef D_A_PLAYER_BASE_H
#define D_A_PLAYER_BASE_H
#include "d/a/obj/d_a_obj_base.h"
/*
* The inheritance chain goes something like:
* dAcObjBase_c straightfoward
* v
* daPlBase_c only has a dtor, vtable (80533128) pooled into d_a_player at the end
* v
* daPlayerActBase_c has a few strong and many weak functions, vtable stripped
* v
* daPlayerModelBase_c has the actual implementation of many functions, vtable at 8050da00, size 0x310
* v
* dAcPy_c "ActorLink", vtable at 80532cb0
*/
// Vtable at 80533128, no differences to dAcObjBase_c?
// Name unknown, though this name exists in NSMBW
class daPlBase_c : public dAcObjBase_c {
public:
virtual ~daPlBase_c() {}
};
#endif
File diff suppressed because it is too large Load Diff
+1
View File
@@ -12,6 +12,7 @@ s32 getPouchSlotCount(bool unk);
bool isItemExtraAmmo(s32 item);
bool isItemMedal(s32 item);
bool hasAnyShields();
bool isItemShield(s32 item);
#define POUCH_SLOT_NONE 8
+3
View File
@@ -3,6 +3,7 @@
#include "common.h"
#include "m/m_dvd.h"
#include "nw4r/g3d/res/g3d_resfile.h"
#include "sized_string.h"
class ArcCallbackHandlerBase {
@@ -23,6 +24,8 @@ public:
static ArcCallbackHandler sInstance;
};
void BindSystemModelsAndLighting(nw4r::g3d::ResFile);
// TODO: loading status could be an enum (-2/-1/0/+1)
// Ghidra: ArcManagerEntry
+1
View File
@@ -136,6 +136,7 @@ public:
STATE_VIRTUAL_FUNC_DECLARE(dScGame_c, Stanby); // sic
STATE_VIRTUAL_FUNC_DECLARE(dScGame_c, Action);
static bool isHeroMode();
static bool isCurrentStage(const char *stageName);
static bool isStageSkyloftLayer20();
static bool isInCredits();
+12
View File
@@ -446,6 +446,18 @@ public:
}
}
static void setShieldMaxDurability(f32 durability) {
if (sInstance != nullptr) {
sInstance->mMain.mShield.setMaxDurability(durability);
}
}
static void setShieldId(s32 type) {
if (sInstance != nullptr) {
sInstance->mMain.mShield.setShieldId(type);
}
}
static f32 getShieldMaxDurability() {
if (sInstance != nullptr) {
return sInstance->mMain.mShield.getMaxDurability();
@@ -47,6 +47,14 @@ public:
return mMaxDurability;
}
void setMaxDurability(f32 durability) {
mMaxDurability = durability;
}
void setShieldId(s32 id) {
mShieldId = id;
}
private:
s32 getLytFrameForShield(s32) const;
void setLevel(f32 level);
@@ -77,7 +85,7 @@ private:
/* 0x30C */ u8 field_0x30C;
/* 0x30D */ u8 field_0x30D;
/* 0x30E */ u8 field_0x30E;
/* 0x310 */ s32 mShieldType;
/* 0x310 */ s32 mShieldId;
/* 0x314 */ s32 mSavedShieldType;
/* 0x318 */ s32 field_0x318;
/* 0x31C */ u8 field_0x31C;
+5
View File
@@ -21,6 +21,11 @@ public:
inline MEMAllocator *getHandle() {
return static_cast<MEMAllocator *>(this);
}
Heap *getHeap() {
return mHeap;
}
/* 0x14 */ Heap *mHeap;
/* 0x18 */ s32 align;
};
+17 -2
View File
@@ -5,13 +5,14 @@
#include "common.h"
#include "egg/core/eggDisposer.h"
#include "egg/core/eggThread.h"
#include "egg/egg_types.h"
#include "egg/prim/eggBitFlag.h"
#include "nw4r/ut.h"
#include "rvl/MEM.h"
#include "rvl/OS.h"
namespace EGG {
// class ExpHeap;
@@ -79,6 +80,20 @@ public:
return this;
}
static inline EGG::FrmHeap *toFrmHeap(EGG::Heap *heap) {
if (heap != nullptr && heap->getHeapKind() == HEAP_KIND_FRAME) {
return (FrmHeap *)heap;
}
return nullptr;
}
static inline EGG::ExpHeap *toExpHeap(EGG::Heap *heap) {
if (heap != nullptr && heap->getHeapKind() == HEAP_KIND_EXPANDED) {
return (ExpHeap *)heap;
}
return nullptr;
}
public:
// members
/* 0x10 */ MEMiHeapHead *mHeapHandle;
+9
View File
@@ -1,6 +1,7 @@
#ifndef M3D_M_ANMCHR_H
#define M3D_M_ANMCHR_H
#include "common.h"
#include "m/m3d/m_bmdl.h"
#include "m/m3d/m_fanm.h"
#include "nw4r/g3d/res/g3d_resanmchr.h"
@@ -13,6 +14,14 @@ public:
virtual int getType() const override;
bool create(nw4r::g3d::ResMdl mdl, nw4r::g3d::ResAnmChr anm, mAllocator_c *alloc) {
return create(mdl, anm, alloc, nullptr);
}
// Not sure about this overload but it fixes stack alloc in some cases and other files
// definitely have similar overloads with seemingly identical argument types
bool create2(nw4r::g3d::ResMdl mdl, nw4r::g3d::ResAnmChr anm, mAllocator_c *alloc) {
return create(mdl, anm, alloc);
}
bool create(nw4r::g3d::ResMdl, nw4r::g3d::ResAnmChr, mAllocator_c *, u32 *);
void setAnm(bmdl_c &, nw4r::g3d::ResAnmChr, playMode_e);
void setAnmAfter(bmdl_c &, nw4r::g3d::ResAnmChr, playMode_e);
+4
View File
@@ -1,6 +1,7 @@
#ifndef M3D_M_ANMCHRBLEND_H
#define M3D_M_ANMCHRBLEND_H
#include "common.h"
#include "m/m3d/m_anmchr.h"
#include "m/m3d/m_banm.h"
#include "m/m3d/m_bmdl.h"
@@ -14,6 +15,9 @@ public:
virtual int getType() const override;
bool create(nw4r::g3d::ResMdl mdl, int nView, mAllocator_c *alloc) {
return create(mdl, nView, alloc, nullptr);
}
bool create(nw4r::g3d::ResMdl, int, mAllocator_c *, u32 *);
void attach(int, nw4r::g3d::AnmObjChrRes *, f32);
void attach(int, anmChr_c *, f32);
+3 -3
View File
@@ -28,9 +28,9 @@ public:
}
protected:
nw4r::g3d::AnmObj *mpAnmObj;
EGG::FrmHeap *mpFrameHeap;
mAllocator_c mAllocator;
/* 0x04 */ nw4r::g3d::AnmObj *mpAnmObj;
/* 0x08 */ EGG::FrmHeap *mpFrameHeap;
/* 0x0C */ mAllocator_c mAllocator;
};
} // namespace m3d
+2 -2
View File
@@ -22,7 +22,7 @@ public:
int getNodeID(const char *name) const;
bool getNodeWorldMtx(u32 p1, nw4r::math::MTX34 *out) const;
bool getNodeWorldMtxMultVecZero(u32 p1, nw4r::math::VEC3 &out) const;
bool getNodeWorldMtxMultVec(u32, nw4r::math::VEC3 &, nw4r::math::VEC3 &) const;
bool getNodeWorldMtxMultVec(u32, const nw4r::math::VEC3 &, nw4r::math::VEC3 &) const;
nw4r::g3d::ResMdl getResMdl() const;
nw4r::g3d::ResMat getResMat(u32 index) const;
@@ -40,7 +40,7 @@ public:
bool getBounds(mVec3_c *min, mVec3_c *max) const;
private:
banm_c *mpCurrentAnm;
/* 0x18 */ banm_c *mpCurrentAnm;
};
} // namespace m3d
+4 -4
View File
@@ -47,10 +47,10 @@ public:
}
private:
f32 mEndFrame;
f32 mStartFrame;
f32 mCurrentFrame;
u8 mPlayState;
/* 0x28 */ f32 mEndFrame;
/* 0x2C */ f32 mStartFrame;
/* 0x30 */ f32 mCurrentFrame;
/* 0x34 */ u8 mPlayState;
};
} // namespace m3d
+7 -3
View File
@@ -43,7 +43,11 @@ public:
mpBaseCallback = cb;
}
private:
nw4r::g3d::ChrAnmResult *getNodeResult(u16 node) {
return &mpNodes[node];
}
protected:
/* 0x04 */ calcRatio_c mCalcRatio;
/* 0x20 */ int mNumNode;
/* 0x24 */ nw4r::g3d::ChrAnmResult *mpNodes;
@@ -66,9 +70,9 @@ public:
private:
/** If we allocated the callback ourselves, this is what we need to free */
mdlCallback_c *mpOwnedCallback;
/* 0x1C */ mdlCallback_c *mpOwnedCallback;
/** The actual callback to use */
mdlCallback_c *mpCallback;
/* 0x20 */ mdlCallback_c *mpCallback;
};
} // namespace m3d
+5 -1
View File
@@ -52,6 +52,10 @@ struct mAng {
mVal -= other.mVal;
return *this;
}
mAng &operator*=(const s32 &other) {
mVal *= other;
return *this;
}
s32 step(s16 target, s32 steps, s16 max, s16 min);
@@ -67,7 +71,7 @@ struct mAng {
return (360.0f / 65536.0f) * mVal;
}
static mAng fromDeg(f32 deg) {
static s16 fromDeg(f32 deg) {
return deg * sDegToAng;
}
f32 degree2() const {
+6
View File
@@ -32,6 +32,12 @@ public:
operator nw4r::math::MTX34 &() {
return *(nw4r::math::MTX34 *)(this);
}
operator const nw4r::math::MTX34 *() const {
return (nw4r::math::MTX34 *)(this);
}
operator const nw4r::math::MTX34 &() const {
return *(nw4r::math::MTX34 *)(this);
}
void XrotS(const mAng &angle); ///< Generates a rotation matrix for the X axis with the given angle.
void XrotM(const mAng &angle); ///< Rotates the matrix on the X axis by the given angle.
+8 -3
View File
@@ -43,13 +43,13 @@ public:
virtual ~ICalcWorldCallback() {}; // at 0x8
virtual void ExecCallbackA(ChrAnmResult *pResult, ResMdl mdl,
FuncObjCalcWorld *pFuncObj) = 0; // at 0xC
FuncObjCalcWorld *pFuncObj) {}; // at 0xC
virtual void ExecCallbackB(WorldMtxManip *pManip, ResMdl mdl,
FuncObjCalcWorld *pFuncObj) = 0; // at 0x10
FuncObjCalcWorld *pFuncObj) {}; // at 0x10
virtual void ExecCallbackC(math::MTX34 *pMtxArray, ResMdl mdl,
FuncObjCalcWorld *pFuncObj) = 0; // at 0x14
FuncObjCalcWorld *pFuncObj) {}; // at 0x14
};
/******************************************************************************
@@ -76,6 +76,11 @@ public:
}
}
// Not sure
void SetMtxUnchecked(const nw4r::math::MTX34 *arg) {
PSMTXCopy(*arg, *mpM);
}
private:
math::MTX34 *mpM; // at 0x0
math::VEC3 *mpS; // at 0x4
+5
View File
@@ -220,6 +220,11 @@ public:
u32 GetShpID() const;
u32 GetNodeID() const;
};
// Not sure, but d_player_mdl has these strings at the end of .data (inlines) and in reverse order (in the same inline)
DrawEnumerator ConstructDrawEnumerator() const {
return DrawEnumerator(GetResByteCode("DrawOpa"), GetResByteCode("DrawXlu"));
}
};
} // namespace g3d
+1 -5
View File
@@ -109,11 +109,7 @@ public:
}
u32 GetMtxID() const {
if (IsValid()) {
return ptr()->mtxID;
}
return 0;
return IsValid() ? ptr()->mtxID : 0;
}
bool IsVisible() const {
+9
View File
@@ -148,6 +148,15 @@ public:
return !(ref().flag & ResShpData::FLAG_INVISIBLE);
}
// Not sure, copied from ResNode
void SetVisibility(bool visible) {
if (visible) {
ptr()->flag &= ~ResShpData::FLAG_INVISIBLE;
} else {
ptr()->flag |= ResShpData::FLAG_INVISIBLE;
}
}
void DCStore(bool sync);
};
+8
View File
@@ -0,0 +1,8 @@
#ifndef CX_UTIL_H
#define CX_UTIL_H
#include "common.h"
bool lzSafeDecompress(const void *src, u32 maxSize, void *dest);
#endif
-1
View File
@@ -5,7 +5,6 @@
#include "m/m3d/m_scnleaf.h"
#include "nw4r/g3d/g3d_scnobj.h"
class dScnCallback_c : public nw4r::g3d::IScnObjCallback {
public:
dScnCallback_c(dAcObjBase_c *arg) : mpActor(arg) {}
+6 -7
View File
@@ -133,7 +133,7 @@ int dAcBombf_c::actorExecute() {
}
int dAcBombf_c::draw() {
if (field_0x3D0 != 0 && (dAcPy_c::LINK->mActionFlagsCont & 0x400000) == 0) {
if (field_0x3D0 != 0 && !dAcPy_c::LINK->checkActionFlagsCont(0x400000)) {
return SUCCEEDED;
}
drawModelType1(&mModel);
@@ -170,7 +170,6 @@ void dAcBombf_c::initializeState_Wait() {}
extern "C" u16 lbl_8057A750;
void dAcBombf_c::executeState_Wait() {
// Stack problems
if (SceneflagManager::sInstance->checkBoolFlag(roomid, mDespawnSceneFlag)) {
deleteRequest();
dAcBomb_c *bomb = mBombRef.get();
@@ -184,12 +183,12 @@ void dAcBombf_c::executeState_Wait() {
f32 scaleFactor = mScale.x;
if (field_0x3D2 == 0 || field_0x3D2 == 2) {
mVec3_c m;
PSMTXMultVecSR(mWorldMtx, mVec3_c::Ey, m);
mVec3_c up;
PSMTXMultVecSR(mWorldMtx, mVec3_c::Ey, up);
mVec3_c upScaled = up * 30.0f;
mVec3_c checkPos = position + upScaled;
mVec3_c m3 = position + (m * 30.0f);
if (mTimeAreaStruct.check(roomid, m3, 0, 30.0f, 0.1f) && field_0x3D4 != 1) {
if (mTimeAreaStruct.check(roomid, checkPos, 0, 30.0f, 0.1f) && field_0x3D4 != 1) {
if (mTimeAreaStruct.field_0x04 == 1) {
playSound(SE_TIMESLIP_TIMESLIP);
} else {
+1 -1
View File
@@ -55,7 +55,7 @@ extern const u16 PARTICLE_RESOURCE_ID_MAPPING_8_;
void dAcTWoodArea_c::initializeState_Wait() {}
void dAcTWoodArea_c::executeState_Wait() {
if (dAcPy_c::LINK != nullptr && (dAcPy_c::LINK->someFlags_0x350 & 0x2000)) {
if (dAcPy_c::LINK != nullptr && dAcPy_c::LINK->checkFlags0x350(0x2000)) {
// This is a bit messed up
mVec3_c dist = position - dAcPy_c::LINK->position;
f32 attachRadius = getAttachRadius();
+4 -6
View File
@@ -42,16 +42,14 @@ const InteractionTargetDef dAcOSeatSword_c::sInteractionDef = {
const Vec dAcOSeatSword_c::sEffectPos = {-20.f, 260.f, 30.f};
extern "C" const char *getSwordName(int);
extern "C" u8 EQUIPPED_SWORD;
bool dAcOSeatSword_c::createHeap() {
if (mSubtype == 0) {
const char *goddess_sword = getSwordName(1);
const char *goddess_sword = daPlayerActBase_c::getSwordName(1);
mRes = dAcPy_c::getItemResFile(goddess_sword, heap_allocator);
TRY_CREATE(mSwordMdl.create(mRes.GetResMdl(goddess_sword), &heap_allocator, 0x120, 1, nullptr));
} else if (mSubtype == 1) {
mRes = dAcPy_c::LINK->mSwordRes;
const char *sword_name = getSwordName(EQUIPPED_SWORD);
mRes = dAcPy_c::GetLink()->getSwordResFile();
const char *sword_name = daPlayerActBase_c::getSwordName(daPlayerActBase_c::sCurrentSword);
TRY_CREATE(mSwordMdl.create(mRes.GetResMdl(sword_name), &heap_allocator, 0x120, 1, nullptr));
}
@@ -173,7 +171,7 @@ void dAcOSeatSword_c::registerInEvent() {
ang.y += someAng;
vec.rotY(rotation.y);
vec += position;
player->setPosRot(vec, ang, 0, 1, 0);
player->setPosRot(&vec, &ang, 0, 1, 0);
mField_0x7E8.set(0);
updateSwordMdl();
}
+3 -3
View File
@@ -459,13 +459,13 @@ void dAcOtubo_c::destroy() {
mActorCarryInfo.fn_80050EA0(this);
dEmitterBase_c *fx_thing = dJEffManager_c::spawnEffect(
PARTICLE_RESOURCE_ID_MAPPING_209_, poscopy2, nullptr, nullptr, nullptr, nullptr, 0, 0
PARTICLE_RESOURCE_ID_MAPPING_211_, poscopy2, nullptr, nullptr, nullptr, nullptr, 0, 0
);
if (fx_thing) {
fx_thing->attachEmitterCallbackId(mSubtype != 0 ? dJEffManager_c::TsuboB : dJEffManager_c::TsuboA);
}
fx_thing = dJEffManager_c::spawnEffect(
PARTICLE_RESOURCE_ID_MAPPING_109_, position, nullptr, nullptr, nullptr, nullptr, 0, 0
PARTICLE_RESOURCE_ID_MAPPING_116_, position, nullptr, nullptr, nullptr, nullptr, 0, 0
);
if (fx_thing) {
fx_thing->bindShpEmitter(mSubtype != 0 ? dJEffManager_c::TsuboB : dJEffManager_c::TsuboA, false);
@@ -573,7 +573,7 @@ void dAcOtubo_c::fn_272_2670() {
static const s16 unk = {0}; // needed for rodata ordering
if (!cM::isZero(mField_0x9CA)) {
angle.y = (*(s16 *)((u8 *)this + 0x9CA)); // HACK to force load again
mField_0x9CA = 0;
mField_0x9CA.set(0);
} else {
mQuat_c q;
q.set(1.f, 0.f, 0.f, 0.f);
+1 -1
View File
@@ -21,7 +21,7 @@ int dTgHolyWater_c::actorExecute() {
mDowsingTarget.doUnregister();
}
if (isLinkNearby()) {
dAcPy_c::LINK->mForceOrPreventActionFlags |= 0x10000000;
dAcPy_c::LINK->onForceOrPreventActionFlags(0x10000000);
}
return SUCCEEDED;
}
+2 -3
View File
@@ -7,6 +7,7 @@
#include "d/col/c/c_cc_d.h"
#include "d/col/cc/d_cc_s.h"
#include "d/d_pouch.h"
#include "d/d_sc_game.h"
#include "d/flag/sceneflag_manager.h"
#include "m/m_angle.h"
#include "toBeSorted/small_sound_mgr.h"
@@ -30,8 +31,6 @@ bool dTgReaction_c::createHeap() {
return true;
}
extern "C" bool isHeroMode();
int dTgReaction_c::create() {
// Note the double _c here
if (!initAllocatorWork1Heap(0x1000, "dTgReaction_c_c::m_allocator", 0x20)) {
@@ -54,7 +53,7 @@ int dTgReaction_c::create() {
return FAILED;
}
if (isHeroMode()) {
if (dScGame_c::isHeroMode()) {
if (getParam0x10() == 1) {
field_0x4DE = 1;
}
+7
View File
@@ -1,3 +1,10 @@
#include "d/a/d_a_player.h"
dAcPy_c *dAcPy_c::LINK;
// TODO: Disable this pragma when the ctors are matching
#pragma dont_inline on
dAcPy_c::dAcPy_c() {}
#pragma dont_inline reset
dAcPy_c::~dAcPy_c() {}
+5 -5
View File
@@ -43,20 +43,20 @@ void dAcOsw_c::rideCallback(dBgW *unknown, dAcObjBase_c *actor, dAcObjBase_c *in
dAcOsw_c *sw = static_cast<dAcOsw_c *>(actor);
// halp
if (!(link == nullptr || ((link->mActionFlags & 0x40000) == 0 &&
(((link->someFlags_0x340 & 0x800000) == 0 ||
if (!(link == nullptr || (!link->checkActionFlags(dAcPy_c::FLG0_IN_WATER) &&
((!link->checkFlags0x340(0x800000) ||
((link->getCurrentCarriedActor() != nullptr &&
link->getCurrentCarriedActor()->mActorCarryInfo.testCarryFlag(0x04)))))))) {
return;
}
if (interactor->mActorCarryInfo.isCarried != 1) {
if (link == nullptr || (link->mActionFlags & 0xC70852) == 0) {
if (link == nullptr || (link->checkActionFlags(0xC70852)) == 0) {
if (!sw->someInteractCheck(link != nullptr)) {
bool needsOnFlag = sw->mOnSceneFlag < 0xFF &&
!SceneflagManager::sInstance->checkBoolFlag(sw->roomid, sw->mOnSceneFlag);
if (!needsOnFlag && sw->mObjRef.get() == nullptr && link != nullptr && sw->field_0x5F1 == 0 &&
sw->mStateMgr.isState(StateID_On)) {
link->field_0x360 |= 0x8000;
link->onFlags_0x360(0x8000);
}
}
}
@@ -136,7 +136,7 @@ int dAcOsw_c::actorPostCreate() {
int dAcOsw_c::doDelete() {
dAcPy_c *link = dAcPy_c::LINK;
if (mSwitchType != 1 && field_0x5F2 == 0) {
if ((link == nullptr || (link->someFlags_0x340 & 0x200) != 0) && (link == nullptr || link->roomid == roomid)) {
if ((link == nullptr || link->checkFlags0x340(0x200)) && (link == nullptr || link->roomid == roomid)) {
if (mOffSceneFlag < 0xFF && SceneflagManager::sInstance->checkBoolFlag(roomid, mOffSceneFlag)) {
SceneflagManager::sInstance->unsetFlag(roomid, mOffSceneFlag);
}
+1
View File
@@ -96,6 +96,7 @@ const cCcD_SrcGObj dAcTbox_c::sColSrc = {
};
// clang-format on
// TODO: pragma readonly_strings on?
static const char sGetTriForce[] = "GetTriForce";
static const char sGetSwordA[] = "GetSwordA";
static const char sGetHarp[] = "GetHarp";
-1
View File
@@ -1 +0,0 @@
#include "d/d_player.h"
+127
View File
@@ -0,0 +1,127 @@
#include "d/d_player_act.h"
#include "common.h"
#include "d/a/d_a_item.h"
#include "d/a/d_a_itembase.h"
#include "d/a/d_a_player.h"
#include "d/a/obj/d_a_obj_base.h"
#include "m/m_angle.h"
#include "m/m_color.h"
#include "m/m_vec.h"
#include "toBeSorted/event_manager.h"
mVec3_c daPlayerActBase_c::sPos1(mVec3_c::Zero);
mVec3_c daPlayerActBase_c::sPos2(mVec3_c::Zero);
mAng daPlayerActBase_c::sRot1(0);
mAng daPlayerActBase_c::sRot2(0);
const f32 daPlayerActBase_c::sPushRelatedConstant = 75.0f;
int daPlayerActBase_c::preExecute() {
if (dAcObjBase_c::preExecute() == NOT_READY) {
return NOT_READY;
}
someFlags_0x350 = 0;
someFlags_0x354 = 0;
return SUCCEEDED;
}
void daPlayerActBase_c::postExecute(MAIN_STATE_e state) {
if (state != CANCELED) {
someFlags_0x358 = 0;
mForceOrPreventActionFlags = 0;
}
dAcObjBase_c::postExecute(state);
}
bool daPlayerActBase_c::isInEvent() {
return EventManager::isInEvent();
}
bool daPlayerActBase_c::isAttackingLeft() const {
return mAttackDirection == ATTACK_SPIN_LEFT || mAttackDirection == ATTACK_SWING_LEFT;
}
bool daPlayerActBase_c::isAttackingRight() const {
return mAttackDirection == ATTACK_SPIN_RIGHT || mAttackDirection == ATTACK_SWING_RIGHT;
}
bool daPlayerActBase_c::isAttackingDown() const {
return mAttackDirection == ATTACK_SWING_DOWN || mAttackDirection == ATTACK_SPIN_DOWN ||
mAttackDirection == ATTACK_JUMP_SLASH;
}
bool daPlayerActBase_c::isAttackingUp() const {
return mAttackDirection == ATTACK_SPIN_UP || mAttackDirection == ATTACK_SWING_UP;
}
bool daPlayerActBase_c::isAttackingStab() const {
return mAttackDirection == ATTACK_STAB;
}
bool daPlayerActBase_c::isAttackingSpinHorizontal() const {
return mAttackDirection == ATTACK_SPIN_LEFT || mAttackDirection == ATTACK_SPIN_RIGHT;
}
bool daPlayerActBase_c::isAttackingSpinVertical() const {
return mAttackDirection == ATTACK_SPIN_DOWN || mAttackDirection == ATTACK_SPIN_UP;
}
void daPlayerActBase_c::setBonkRelatedAnimFlag(bool b) {
if (b) {
field_0x360 |= 2;
} else {
field_0x360 |= 1;
}
}
void daPlayerActBase_c::setPosRot(const mVec3_c *pos, const mAng3_c *rot, bool force, UNKWORD, UNKWORD) {
if (isInEvent() || force) {
mStts.ClrCcMove();
if (pos != nullptr) {
position = *pos;
mOldPosition = position;
velocity.y = 0.0f;
}
if (rot != nullptr) {
rotation = *rot;
angle.y = rotation.y;
}
}
}
void daPlayerActBase_c::setPosYRot(const mVec3_c &pos, mAng rot, bool force, UNKWORD a4, UNKWORD a5) {
mAng3_c ang(0, rot, 0);
setPosRot(&pos, &ang, force, a4, a5);
}
void daPlayerActBase_c::setTransform(const mMtx_c &mtx, bool force, UNKWORD a4, UNKWORD a5) {
mVec3_c translate;
mtx.getTranslation(translate);
mAng3_c rot;
mtx.toRot(rot);
setPosRot(&translate, &rot, force, a4, a5);
}
extern "C" bool fn_80213090(dAcEnBase_c *);
bool daPlayerActBase_c::someTargetedActorCheck() const {
return fn_80213090(getTargetedActor1());
}
mAng daPlayerActBase_c::fn_8005BA90() {
return dAcPy_c::LINK2->fn_8023B520();
}
mAng daPlayerActBase_c::fn_8005BAA0() {
return dAcPy_c::LINK2->fn_8023B590();
}
const mColor &daPlayerActBase_c::getEarringsColor() {
static const mColor sNoFireshieldEarrings = mColor(45, 80, 127, 255);
static const mColor sFireshieldEarrings = mColor(222, 57, 20, 255);
if (dAcItem_c::hasItem(ITEM_FIRESHIELD_EARRINGS)) {
return sFireshieldEarrings;
} else {
return sNoFireshieldEarrings;
}
}
+7
View File
@@ -0,0 +1,7 @@
#include "d/a/d_a_player.h"
// Need to be their own file due to sbss alignment
mColor daPlayerModelBase_c::sGuideColor1(0x00, 0x82, 0xDC, 0xFF);
mColor daPlayerModelBase_c::sGuideColor2(0x64, 0xFF, 0xFF, 0xFF);
mColor daPlayerModelBase_c::sGuideColor3(0x46, 0xC8, 0xFF, 0xFF);
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -294,7 +294,7 @@ bool dLytDobutton_c::remove() {
bool dLytDobutton_c::execute() {
bool isInEvent = EventManager::isInEvent();
bool b1 = true;
if (dAcPy_c::isInBambooCuttingMinigame()) {
if (dAcPy_c::GetLink()->isInBambooCuttingMinigame()) {
setActionTextStuff(ICON_12, ACT_DO_70, false);
}
if (field_0x490 == 0) {
+2 -1
View File
@@ -491,7 +491,8 @@ bool dLytMeterCrossBtn_c::execute() {
if (field_0x637 != 0) {
if (mIconDown == 0) {
f32 frame = dAcPy_c::GetLink2()->getAnmMatClrFrame();
// Start UI animation together with sword animation on Link's back
f32 frame = dAcPy_c::GetLink2()->getSwordAnmFrame();
if (frame == 0.0f) {
mAnm[CROSS_BTN_ANIM_CALL_0].setToEnd();
if (!mAnm[CROSS_BTN_ANIM_CALL_0].isEnabled()) {
+4 -4
View File
@@ -78,7 +78,7 @@ bool dLytMeterShieldGauge_c::build(d2d::ResAccIf_c *resAcc) {
field_0x31F = 0;
field_0x31E = 0;
field_0x318 = 0;
mShieldType = 0;
mShieldId = 0;
mSavedShieldType = -1;
mAnm[SHIELD_ANIM_UPDOWN].setFrame(mCurrentDurability);
@@ -134,11 +134,11 @@ bool dLytMeterShieldGauge_c::execute() {
bool b3 = false;
bool b4 = false;
if (mShieldType != mSavedShieldType ||
if (mShieldId != mSavedShieldType ||
mCurrentShieldPouchSlot != convertFilePouchSlot(FileManager::GetInstance()->getShieldPouchSlot())) {
mLyt.findPane("N_alpha_00")->SetVisible(true);
mSavedShieldType = mShieldType;
mAnm[SHIELD_ANIM_TYPE].setFrame(getLytFrameForShield(mShieldType));
mSavedShieldType = mShieldId;
mAnm[SHIELD_ANIM_TYPE].setFrame(getLytFrameForShield(mShieldId));
mAnm[SHIELD_ANIM_TYPE].setAnimEnable(true);
mAnm[SHIELD_ANIM_LOOP_0].setFrame(0.0f);
field_0x31D = 1;
+1 -1
View File
@@ -1,9 +1,9 @@
#include "egg/core/eggHeap.h"
#include "egg/core/eggAllocator.h"
#include "egg/core/eggThread.h"
#include "nw4r/ut/ut_list.h"
namespace EGG {
/* 80673ae8 */ nw4r::ut::List Heap::sHeapList;
+1 -1
View File
@@ -39,7 +39,7 @@ bool bmdl_c::getNodeWorldMtxMultVecZero(u32 p1, nw4r::math::VEC3 &out) const {
}
}
bool bmdl_c::getNodeWorldMtxMultVec(u32 p1, nw4r::math::VEC3 &in, nw4r::math::VEC3 &out) const {
bool bmdl_c::getNodeWorldMtxMultVec(u32 p1, const nw4r::math::VEC3 &in, nw4r::math::VEC3 &out) const {
nw4r::math::MTX34 mtx;
if (!getNodeWorldMtx(p1, &mtx)) {
return false;
+12 -16
View File
@@ -514,17 +514,14 @@ bool mShadowChild_c::setGeom(const GXTexObj *texObj, const mMtx_c &mtx, const mQ
}
void mShadowChild_c::updateMtx() {
const mQuat_c &q = GetQuat();
const mVec3_c &pos = GetPosition();
// NONMATCHING
field_0x13C = mQuat.w;
Set0x13C(q.w);
mVec3_c a(q.v);
a += pos * GetOffset();
mVec3_c b(q.v);
b -= pos * Get0x13C();
mVec3_c a(mQuat.v.x, mQuat.v.y, mQuat.v.z);
a += mPositionMaybe * GetOffset();
mVec3_c b(mQuat.v.x, mQuat.v.y, mQuat.v.z);
b -= mPositionMaybe * field_0x13C;
const mVec3_c *up;
if (cM::isZero((a - b).squareMagXZ())) {
@@ -536,17 +533,16 @@ void mShadowChild_c::updateMtx() {
mMtx_c mtx;
C_MTXLookAt(mtx.m, a, *up, b);
const f32 f = Get0x13C();
f32 f = field_0x13C;
mFrustum.set(f, -f, -f, f, f, f + GetOffset(), mtx, true);
}
void mShadowChild_c::drawMdl() {
// Equivalent, but stack problems and regswaps
using namespace nw4r;
mMtx_c mtx;
Mtx44 mtx;
GXSetTevColor(GX_TEVREG0, sColors[mColorChanIdx]);
C_MTXOrtho(mtx.m, field_0x13C, -field_0x13C, -field_0x13C, field_0x13C, 0.0f, 100.0f + (-mFrustum.mFar));
GXSetProjection(mtx.m, GX_ORTHOGRAPHIC);
C_MTXOrtho(mtx, field_0x13C, -field_0x13C, -field_0x13C, field_0x13C, 0.0f, 100.0f + (-mFrustum.mFar));
GXSetProjection(mtx, GX_ORTHOGRAPHIC);
g3d::G3DState::Invalidate(0x7FF);
mMtx_c &viewMtx = mFrustum.mView;
@@ -571,7 +567,7 @@ void mShadowChild_c::drawMdl() {
g3d::DrawResMdlReplacement *pRep = mdl2 ? &mdl2->GetDrawResMdlReplacement() : nullptr;
g3d::DrawResMdlDirectly(
resMdl, viewPosArray, nullptr, nullptr, mdl2->GetByteCode(g3d::ScnMdlSimple::BYTE_CODE_DRAW_OPA),
resMdl, viewPosArray, nullptr, nullptr, mdl->GetByteCode(g3d::ScnMdlSimple::BYTE_CODE_DRAW_OPA),
nullptr, pRep, g3d::RESMDL_DRAWMODE_FORCE_LIGHTOFF | g3d::RESMDL_DRAWMODE_IGNORE_MATERIAL
);
GXInvalidateVtxCache();
+3 -10
View File
@@ -63,19 +63,12 @@ void mHeapAllocator_c::destroyHeap() {
}
}
inline EGG::Heap *getHeapOfKind(EGG::Heap *heap, EGG::Heap::eHeapKind kind) {
if (heap != nullptr && heap->getHeapKind() == kind) {
return heap;
}
return nullptr;
}
s32 mHeapAllocator_c::adjustFrmHeap() {
EGG::Heap *heap = mHeap;
if (heap == mHeap::g_assertHeap) {
return 0;
}
return mHeap::adjustFrmHeap(static_cast<EGG::FrmHeap *>(getHeapOfKind(heap, EGG::Heap::HEAP_KIND_FRAME)));
return mHeap::adjustFrmHeap(EGG::Heap::toFrmHeap(heap));
}
s32 mHeapAllocator_c::adjustExpHeap() {
@@ -83,7 +76,7 @@ s32 mHeapAllocator_c::adjustExpHeap() {
if (heap == mHeap::g_assertHeap) {
return 0;
}
return mHeap::adjustExpHeap(static_cast<EGG::ExpHeap *>(getHeapOfKind(heap, EGG::Heap::HEAP_KIND_EXPANDED)));
return mHeap::adjustExpHeap(EGG::Heap::toExpHeap(heap));
}
bool mHeapAllocator_c::createNewTempFrmHeap(s32 size, EGG::Heap *newHeap, char *heapName, s32 align, u32 attrs) {
@@ -98,7 +91,7 @@ bool mHeapAllocator_c::createNewTempFrmHeap(s32 size, EGG::Heap *newHeap, char *
void mHeapAllocator_c::adjustFrmHeapRestoreCurrent() {
mHeap::restoreCurrentHeap();
EGG::Heap *heap = mHeap;
mHeap::adjustFrmHeap(static_cast<EGG::FrmHeap *>(getHeapOfKind(heap, EGG::Heap::HEAP_KIND_FRAME)));
mHeap::adjustFrmHeap(EGG::Heap::toFrmHeap(heap));
}
void *operator new[](size_t size, mAllocator_c *allocator) {
+3 -4
View File
@@ -7,6 +7,7 @@
#include "d/a/d_a_itembase.h"
#include "d/a/d_a_player.h"
#include "d/d_pouch.h"
#include "d/d_sc_game.h"
#include "m/m_angle.h"
#include "m/m_vec.h"
@@ -386,8 +387,6 @@ static const struct {
};
static const u16 RAND_RUPEE_ARRAY[3] = {ITEM_GREEN_RUPEE, ITEM_BLUE_RUPEE, ITEM_RED_RUPEE};
extern "C" bool isHeroMode();
// 800c7bb0
int SpecialItemDropMgr::fn_800C7BB0(int specialItemId) {
const DropList *list = &sDropTable.mList[specialItemId];
@@ -410,8 +409,8 @@ int SpecialItemDropMgr::fn_800C7BB0(int specialItemId) {
// No seeds until you get the Slingshot
weight = 0;
}
} else if (specialItemId != 0x27 && (entryIdx == 1 || entryIdx == 2) && isHeroMode()) {
// Hearts generally don't drop on Hero Mode unless it's a special kind of heart (which?)
} else if (specialItemId != 0x27 && (entryIdx == 1 || entryIdx == 2) && dScGame_c::isHeroMode()) {
// Hearts generally don't drop on Hero Mode unless it's a special kind of heart (TODO which?)
weight = 0;
} else if ((entryIdx == 7 || entryIdx == 8) && !dAcItem_c::checkFlag(ITEM_BOMB_BAG)) {
// Bombs won't drop until you get the Bomb Bag