diff options
Diffstat (limited to 'src/14_Land/Actor/Character/ActorCharacterBase.cpp')
| -rw-r--r-- | src/14_Land/Actor/Character/ActorCharacterBase.cpp | 226 |
1 files changed, 196 insertions, 30 deletions
diff --git a/src/14_Land/Actor/Character/ActorCharacterBase.cpp b/src/14_Land/Actor/Character/ActorCharacterBase.cpp index db2ed1ee..58bbf299 100644 --- a/src/14_Land/Actor/Character/ActorCharacterBase.cpp +++ b/src/14_Land/Actor/Character/ActorCharacterBase.cpp @@ -1,32 +1,198 @@ #include "Actor/Character/ActorCharacter.hpp" +#include "Message/MessageManager.hpp" +#include "Save/AdventureFlags.hpp" -static void func_ov014_021447f8(ActorCharacterBase *actor) {} -static void func_ov014_0214480c(ActorCharacterBase *actor) {} -static void func_ov014_02144820(ActorCharacterBase *actor) {} -static void func_ov014_02144834(ActorCharacterBase *actor) {} -static void func_ov014_02144848(unk32 *param1, unk32 param2, ActorCharacterBase *actor) {} - -unk32 ActorCharacterBase::vfunc_d8() {} -unk32 ActorCharacterBase::vfunc_dc() {} -unk32 ActorCharacterBase::vfunc_e0() {} -unk32 ActorCharacterBase::vfunc_e4() {} -void ActorCharacterBase::vfunc_e8() {} - -ActorCharacterBase::ActorCharacterBase() : - mUnk_158(0x1000000) {} -ActorCharacterBase::~ActorCharacterBase() {} - -bool ActorCharacterBase::Init() {} -void ActorCharacterBase::vfunc_14(u32 param1) {} -bool ActorCharacterBase::vfunc_c0() {} -void ActorCharacterBase::vfunc_18(u32 param1) {} -unk32 ActorCharacterBase::vfunc_d4() {} -void ActorCharacterBase::vfunc_b4() {} -void ActorCharacterBase::vfunc_b8() {} -void ActorCharacterBase::vfunc_80() {} -void ActorCharacterBase::vfunc_84() {} -void ActorCharacterBase::vfunc_cc() {} -void ActorCharacterBase::vfunc_c8() {} -void ActorCharacterBase::vfunc_d0() {} -void ActorCharacterBase::vfunc_68() {} -bool ActorCharacterBase::vfunc_bc() {} +ARM static unk32 func_ov014_021447f8(void *actor, unk32 param2) { + return ((ActorCharacterBase *) actor)->vfunc_d8(param2); +} + +ARM static unk32 func_ov014_0214480c(void *actor, unk32 param2) { + return ((ActorCharacterBase *) actor)->vfunc_dc(param2); +} + +ARM static unk32 func_ov014_02144820(void *actor, unk32 param2) { + return ((ActorCharacterBase *) actor)->vfunc_e0(param2); +} + +ARM static unk32 func_ov014_02144834(void *actor, unk32 param2) { + return ((ActorCharacterBase *) actor)->vfunc_e4(param2); +} + +struct UnkStruct_ov014_02144848_1 { + /* 00 */ PAD(0x00, 0x03); + /* 03 */ u8 mUnk_03; + /* 04 */ u16 mUnk_04; + /* 06 */ u16 mUnk_06; + /* 08 */ + + u32 Unk1() { + return mUnk_04 | (mUnk_03 << 16); + } +}; + +struct UnkStruct_ov014_02144848 { + /* 00 */ UnkStruct_ov014_02144848_1 *mUnk_00; + /* 08 */ +}; + +static UnkStruct_ov014_021448f4 func_ov014_02144848(UnkStruct_ov014_02144848 param4, ActorCharacterBase *actor) { + u32 uVar1 = param4.mUnk_00->Unk1(); + + switch (uVar1) { + case 0xfe0001: + case 0xfe0002: + case 0xfe0003: + case 0xfe0004: + case 0xfe0005: + case 0xfe0006: + case 0xfe0007: + case 0xfe0008: + return actor->vfunc_e8(param4.mUnk_00->mUnk_06, (u16) (uVar1 - 0xfe0000)); + break; + default: + return UnkStruct_ov014_021448f4(); + } +} + +ARM unk32 ActorCharacterBase::vfunc_d8(unk32 param1) { + return 0; +} + +ARM unk32 ActorCharacterBase::vfunc_dc(unk32 param1) { + return 0; +} + +ARM unk32 ActorCharacterBase::vfunc_e0(unk32 param1) { + return 0; +} + +ARM unk32 ActorCharacterBase::vfunc_e4(unk32 param1) { + return 0; +} + +ARM UnkStruct_ov014_021448f4 ActorCharacterBase::vfunc_e8(u16 param2, u16 param3) { + return UnkStruct_ov014_021448f4(); +} + +ARM ActorCharacterBase::ActorCharacterBase() : + mUnk_158(0x1000000), + mUnk_1b4(-1), + mUnk_1b8(0), + mUnk_1c0(0), + mUnk_1c1(0), + mUnk_1c2(0), + mUnk_1c3(0) {} +ARM ActorCharacterBase::~ActorCharacterBase() { + if (gMessageManager.mUnk_20[0] == &mUnk_158) { + gMessageManager.func_02036d4c(&mUnk_158); + } +} + +ARM bool ActorCharacterBase::Init() { + mUnk_12c = 5; + mUnk_158.mUnk_20.id = mRef.id; + mUnk_158.mUnk_20.index = mRef.index; + mUnk_158.mUnk_04[0] = func_ov014_021447f8; + mUnk_158.mUnk_04[1] = func_ov014_0214480c; + mUnk_158.mUnk_04[2] = func_ov014_02144820; + mUnk_158.mUnk_04[3] = func_ov014_02144834; + mUnk_158.mUnk_14 = this; + mUnk_158.mUnk_44 = (unk32) func_ov014_02144848; // TODO: Set type of mUnk_44 after matching func_ov014_02144848 + mUnk_158.mUnk_48 = this; + return true; +} + +ARM void ActorCharacterBase::vfunc_14(u32 param1) { + if (this->func_ov00_020c313c(param1)) { + mPrevPos.x = mPos.x; + mPrevPos.y = mPos.y; + mPrevPos.z = mPos.z; + this->func_ov00_020c1cf8(); + this->vfunc_c4(); + } + mUnk_0a4.func_ov000_0207a1c8(param1, &mPos); + this->vfunc_b8(); +} + +ARM bool ActorCharacterBase::vfunc_c0() { + UnkStruct_02037750 *callback = gMessageManager.mUnk_20[0]; + bool result = true; + if (mUnk_11c == false && callback != &mUnk_158) { + bool unk = mUnk_1b4 != -1 && gAdventureFlags->func_ov00_02097b9c(mUnk_1b4); + if (!unk) { + result = false; + } + } + return result; +} + +ARM void ActorCharacterBase::vfunc_18(u32 param1) { + if (this->func_ov00_020c313c(param1)) { + mPrevPos.x = mPos.x; + mPrevPos.y = mPos.y; + mPrevPos.z = mPos.z; + mInactive = false; + if (mUnk_1c0) { + if (mUnk_1b8 != NULL) { + if (mUnk_1b8(mUnk_1bc) == 0) { + mUnk_0a4.func_ov000_0207a1c8(param1, &mPos); + return; + } + mUnk_1b8 = NULL; + } + this->vfunc_c8(); + this->vfunc_cc(); + mUnk_0a4.func_ov000_0207a1c8(param1, &mPos); + return; + }; + if (this->vfunc_c0()) { + if (mUnk_1b8 != NULL) { + if (mUnk_1b8(mUnk_1bc) == 0) { + mUnk_0a4.func_ov000_0207a1c8(param1, &mPos); + return; + } + mUnk_1b8 = NULL; + } + this->vfunc_c4(); + this->vfunc_cc(); + } else { + if (mUnk_1c3) { + this->vfunc_d0(); + } + } + } + mUnk_0a4.func_ov000_0207a1c8(param1, &mPos); + if ((gMessageManager.mUnk_04 == false || gAdventureFlags->func_ov00_02097738()) && !mUnk_1c1) { + return; + } + this->vfunc_b8(); +} + +ARM unk32 ActorCharacterBase::vfunc_d4() { + return mUnk_020.mUnk_10; +} + +ARM void ActorCharacterBase::vfunc_b4() { + gMessageManager.func_02036ce4(&mUnk_158, this->vfunc_d4()); +} + +ARM void ActorCharacterBase::vfunc_b8() { + mUnk_158.vfunc_10(); +} + +ARM void ActorCharacterBase::vfunc_80() { + mUnk_1c0 = true; +} + +ARM void ActorCharacterBase::vfunc_84() { + mUnk_1c0 = false; +} + +ARM void ActorCharacterBase::vfunc_cc() {} +ARM void ActorCharacterBase::vfunc_c8() {} +ARM void ActorCharacterBase::vfunc_d0() {} +ARM void ActorCharacterBase::vfunc_68() {} + +bool ActorCharacterBase::vfunc_bc() { + return (mUnk_158.mUnk_18 & 0xffff0000) == 0x1000000; +} |
