diff options
Diffstat (limited to 'src/14_Land/Actor/Character/ActorCharacter.cpp')
| -rw-r--r-- | src/14_Land/Actor/Character/ActorCharacter.cpp | 459 |
1 files changed, 413 insertions, 46 deletions
diff --git a/src/14_Land/Actor/Character/ActorCharacter.cpp b/src/14_Land/Actor/Character/ActorCharacter.cpp index b3d2b273..1b679778 100644 --- a/src/14_Land/Actor/Character/ActorCharacter.cpp +++ b/src/14_Land/Actor/Character/ActorCharacter.cpp @@ -1,49 +1,416 @@ #include "Actor/Character/ActorCharacter.hpp" +#include "Physics/Cylinder.hpp" +#include "Player/TouchControl.hpp" +#include "Save/AdventureFlags.hpp" #include "Unknown/UnkStruct_ov000_020c0c08.hpp" +#include "Unknown/UnkStruct_ov000_020e8b08.hpp" +#include "nds/math.h" -void ActorCharacter::func_ov014_02144d94() {} -void ActorCharacter::func_ov014_02144dec() {} -void ActorCharacter::func_ov014_02144e14() {} -void ActorCharacter::func_ov014_02144e28() {} -void ActorCharacter::func_ov014_02144e3c() {} -void ActorCharacter::func_ov014_02144e58() {} -void ActorCharacter::func_ov014_02144e74() {} - -ActorCharacter_288::ActorCharacter_288() : - UnkStruct_ov000_020c0c08(mUnk_24, NULL) {} -ActorCharacter::ActorCharacter() {} - -ActorCharacter::~ActorCharacter() {} -bool ActorCharacter::Init() {} -void ActorCharacter::vfunc_20(bool param1) {} - -void ActorCharacter::func_ov014_02145178() {} -void ActorCharacter::func_ov014_021451f0(unk32 *param1) {} -void ActorCharacter::func_ov014_02145258() {} -unk32 ActorCharacter::func_ov014_021452b0() {} -unk32 ActorCharacter::func_ov014_02145318() {} -void ActorCharacter::func_ov014_021453f4() {} -void ActorCharacter::func_ov014_02145414() {} -void ActorCharacter::func_ov014_0214548c() {} -void ActorCharacter::func_ov014_02145508() {} -static void func_ov014_02145520(ActorCharacter *actor) {} -void ActorCharacter::func_ov014_0214552c() {} - -void ActorCharacter::vfunc_80() {} -void ActorCharacter::vfunc_84() {} -void ActorCharacter::vfunc_cc() {} -void ActorCharacter::vfunc_c8() {} -bool ActorCharacter::vfunc_78() {} -void ActorCharacter::vfunc_74() {} -void ActorCharacter::vfunc_7c() {} -bool ActorCharacter::vfunc_90() {} -void ActorCharacter::vfunc_94() {} -bool ActorCharacter::vfunc_98() {} -void ActorCharacter::vfunc_d0() {} -bool ActorCharacter::vfunc_9c() {} -void ActorCharacter::vfunc_ec(unk32 param1) {} -void ActorCharacter::vfunc_f0(unk32 param1) {} - -void ActorCharacter::func_ov014_0214591c() {} - -bool ActorCharacter::IsHitboxTouched(bool param1) {}
\ No newline at end of file +extern "C" void func_ov000_0209a4f4(UnkStruct_ov000_0209a50c *); +ARM void ActorCharacter::func_ov014_02144d94() { + UnkStruct_ov000_0209a50c UStack_b8; + UStack_b8.mUnk_04 = -1; + UStack_b8.mUnk_09 = 0x32; + UStack_b8.mUnk_0a = 0; + UStack_b8.mUnk_0b = 0; + mUnk_1b4 = gAdventureFlags->func_ov00_02097810(&UStack_b8); +} + +ARM void ActorCharacter::func_ov014_02144dec() { + gAdventureFlags->func_ov00_02097bcc(mUnk_1b4); + mUnk_1b4 = -1; +} + +ARM bool ActorCharacter::func_ov014_02144e14() { + return mUnk_020.mUnk_00[1] != 0; +} + +ARM bool ActorCharacter::func_ov014_02144e28() { + return mUnk_020.mUnk_00[3] != 0; +} + +ARM bool ActorCharacter::func_ov014_02144e3c() { + return gAdventureFlags->Get(mUnk_020.mUnk_00[1]); +} + +ARM bool ActorCharacter::func_ov014_02144e58() { + return gAdventureFlags->Get(mUnk_020.mUnk_00[3]); +} + +ARM bool ActorCharacter::func_ov014_02144e74() { + return mInactive && this->func_ov014_02144e58(); +} + +ARM ActorCharacter_1d8_b0::ActorCharacter_1d8_b0() : + UnkStruct_ov000_020c0c08(&mUnk_24, NULL) {} + +extern "C" void Fill32(unk32, unk32 *, unk32); +ARM ActorCharacter::ActorCharacter() : + mUnk_1d8(this) { + mUnk_448 = 3; + mUnk_454 = -1; + mUnk_458 = -1; + mUnk_460 = 0x153; + mUnk_464 = 0x71; + mUnk_468 = 0; + mUnk_469 = 0; + Fill32(0, mUnk_46c, 4); + Fill32(0, mUnk_46c, 4); +} + +ARM ActorCharacter::~ActorCharacter() {} + +ARM bool ActorCharacter::Init() { + ActorCharacterBase::Init(); + return true; +} + +extern unk32 data_ov000_020e9370; +extern "C" void func_ov005_02102c2c(unk32 *, unk32, Vec3p *, unk32, unk32, unk32, unk32, unk32, unk32, unk32); +ARM void ActorCharacter::vfunc_20(bool param1) { + if (param1 ? mUnk_0a4.mUnk_01 : mUnk_0a4.mUnk_00) { + mUnk_1d8.func_ov000_020c5f1c(); + if (mUnk_45c > 0) { + func_ov005_02102c2c(&data_ov000_020e9370, 0, &mPos, mUnk_45c, mUnk_45c, 0, 0x1f, 1, 1, 1); + } + } +} + +struct UnkStruct_ov005_021082e4 { + /* 00 */ unk32 mUnk_00; + /* 04 */ unk32 mUnk_04; + /* 08 */ unk32 mUnk_08; + /* 0c */ unk32 mUnk_0c; + /* 10 */ unk32 mUnk_10; + /* 14 */ +}; + +extern unk32 data_027e0ff8; +extern "C" void func_ov005_021082e4(unk32, ActorRef *, Vec3p *, Vec3p *, UnkStruct_ov005_021082e4 *, unk32, unk32); +ARM void ActorCharacter::func_ov014_02145178() { + UnkStruct_ov005_021082e4 unk; + unk.mUnk_0c = 0; + unk.mUnk_00 = 0; + unk.mUnk_04 = 0; + unk.mUnk_08 = 0; + unk32 size = mHitbox.size; + unk.mUnk_10 = size * 2; + unk.mUnk_00 = 0; + unk.mUnk_04 = size; + unk.mUnk_0c = size; + unk.mUnk_08 = 0; + func_ov005_021082e4(data_027e0ff8, &mRef, &mPos, &mPrevPos, &unk, mUnk_448, -1); +} + +ARM void ActorCharacter::func_ov014_021451f0(unk32 *param1) { + unk32 iVar1 = param1[0]; + mHitbox.pos.x = 0; + mHitbox.pos.y = iVar1; + mHitbox.pos.z = 0; + mHitbox.size = iVar1; + mUnk_08c.pos.x = mHitbox.pos.x; + mUnk_08c.pos.y = mHitbox.pos.y; + mUnk_08c.pos.z = mHitbox.pos.z; + mUnk_08c.size = mHitbox.size; + mUnk_0a4.mUnk_04.pos.x = 0; + mUnk_0a4.mUnk_04.pos.y = iVar1; + mUnk_0a4.mUnk_04.pos.z = 0; + mUnk_0a4.mUnk_04.size = iVar1 + 0x1000; + mUnk_45c = param1[1]; + mYOffset = param1[2]; +} + +extern "C" bool func_ov000_020ccf0c(void *, ActorRef *); +ARM void ActorCharacter::func_ov014_02145258() { + Vec3p vel = mVel; + if (func_ov000_020ccf0c(&mUnk_1c4, &mRef)) { + Vec3p_Add(&vel, &mUnk_1c4.mUnk_00, &vel); + } + Vec3p_Add(&mPos, &vel, &mPos); +} + +ARM unk32 ActorCharacter::func_ov014_021452b0() { + Vec3p offsetPos; + mUnk_1d8.mActor->GetOffsetPos(&offsetPos); + mUnk_1d8.mUnk_020.func_ov014_0214a92c(&offsetPos, &mUnk_1d8.mActor->mPos, mUnk_1d8.mActor->mAngle); + mVel.x = 0; + mVel.z = 0; + this->ApplyGravity(); + this->func_ov014_02145258(); + this->func_ov00_020c3094(); + return 0; +} + +extern "C" void ApproachAngle_thunk(u16 *src, unk32 dst, s16 param3); +ARM unk32 ActorCharacter::func_ov014_02145318() { + Vec3p offsetPos; + mUnk_1d8.mActor->GetOffsetPos(&offsetPos); + unk32 angle = mUnk_1d8.mUnk_020.func_ov014_0214aa0c(&offsetPos, mUnk_1d8.mActor->mAngle); + + if (!mUnk_468) { + s16 angleDiff = angle - (s16) mAngle; + if (angleDiff < -0x7fff) { + angleDiff = (u32) -0x7fff >> 0x11; + } else if (angleDiff < 0) { + angleDiff = -angleDiff; + } + + unk32 speed = (angleDiff << 0xa) >> 0xc; + if (speed > FLOAT_TO_Q20(0.6667)) { + speed = FLOAT_TO_Q20(0.6667); + } else if (speed < FLOAT_TO_Q20(0.0888)) { + speed = FLOAT_TO_Q20(0.0888); + } + + ApproachAngle_thunk(&this->mAngle, angle, speed); + } + + mVel.x = 0; + mVel.z = 0; + this->ApplyGravity(); + this->func_ov014_02145258(); + this->func_ov00_020c3094(); + return 0; +} + +ARM void ActorCharacter::func_ov014_021453f4(unk32 param1) { + mUnk_430.func_ov000_020c66e4(&mPos, mAngle, param1); +} + +ARM void ActorCharacter::func_ov014_02145414(unk32 param1, unk32 param2) { + Vec3p offsetPos; + mUnk_430.func_ov000_020c6838(&mPos, param1, mAngle, param2, &mVel, &mAngle); + mUnk_1d8.mActor->GetOffsetPos(&offsetPos); + mUnk_1d8.mUnk_020.func_ov014_0214a92c(&offsetPos, &mUnk_1d8.mActor->mPos, mUnk_1d8.mActor->mAngle); + this->ApplyGravity(); + this->func_ov014_02145258(); +} + +ARM void ActorCharacter::func_ov014_0214548c(unk32 param1) { + Vec3p vec; + if (!mUnk_430.func_ov000_020c66e4(&mPos, mAngle, param1)) { + return; + } + if (!mUnk_430.func_ov000_020c6e30(&vec)) { + return; + } + mPos.x = vec.x; + mPos.y = vec.y; + mPos.z = vec.z; + mPrevPos.x = vec.x; + mPrevPos.y = vec.y; + mPrevPos.z = vec.z; +} + +ARM void ActorCharacter::func_ov014_02145508() { + mUnk_430.func_ov000_020c6f08(&mPos); +} + +ARM bool ActorCharacter::func_ov014_02145520(ActorCharacterBase *actor) { + return ((ActorCharacter *) actor)->func_ov014_0214552c(); +} + +ARM bool ActorCharacter::func_ov014_0214552c() { + mUnk_1d8.func_ov014_02145cac(); + this->func_ov014_02145414(mUnk_460, 0xaab); + this->func_ov00_020c3094(); + bool result = mUnk_430.func_ov000_020c6794(&mPos); + if (result) { + mUnk_460 = 0x153; + } + return result; +} + +ARM void ActorCharacter::vfunc_80() { + ActorCharacterBase::vfunc_80(); + if (mUnk_469) { + return; + } + mUnk_44c = mUnk_1d8.mUnk_248.mUnk_00[mUnk_1d8.mUnk_248.mUnk_08]; + mUnk_1d8.func_ov014_02145f0c(0); +} + +ARM void ActorCharacter::vfunc_84() { + ActorCharacterBase::vfunc_84(); + if (mUnk_469) { + return; + } + mUnk_1d8.mUnk_020.mUnk_70.Reset(); + mUnk_1d8.func_ov014_02145f0c(mUnk_44c); +} + +// non-matching +ARM void ActorCharacter::vfunc_cc() { + bool unk; + ActorCharacter_1d8 *pUnk_1d8 = &mUnk_1d8; + if (mUnk_454 == pUnk_1d8->mUnk_248.mUnk_00[pUnk_1d8->mUnk_248.mUnk_08] && mUnk_1d8.mUnk_10->mUnk_0c.func_0202e58c()) { + unk = data_ov000_020e8b08 != NULL && mRef.id == data_ov000_020e8b08->mUnk_20[data_ov000_020e8b08->mUnk_55].id; + this->vfunc_f0(unk, 1); + mUnk_454 = -1; + } + mUnk_46c[0] &= ~1; +} + +ARM void ActorCharacter::vfunc_c8() { + this->func_ov014_02145318(); + mUnk_1d8.func_ov014_02145cac(); +} + +ARM bool ActorCharacter::vfunc_78() { + return true; +} + +ARM void ActorCharacter::vfunc_74(ActorRef *ref) { + int iVar1; + int iVar2; + + if (ref->id == mRef.id) { + mUnk_1d8.mUnk_020.mUnk_70.Reset(); + if (mUnk_1d8.mUnk_248.mUnk_00[mUnk_1d8.mUnk_248.mUnk_08] == 2) { + return; + } + if (mUnk_469) { + return; + } + if ((mUnk_46c[0] & 1U) != 0) { + return; + } + mUnk_1d8.func_ov014_02145f0c(2); + } else { + mUnk_1d8.mUnk_020.mUnk_70.id = ref->id; + mUnk_1d8.mUnk_020.mUnk_70.index = ref->index; + if (mUnk_1d8.mUnk_248.mUnk_00[mUnk_1d8.mUnk_248.mUnk_08] == 0) { + return; + } + if (mUnk_469) { + return; + } + if ((mUnk_46c[0] & 1U) != 0) { + return; + } + mUnk_1d8.func_ov014_02145f0c(0); + } +} + +ARM void ActorCharacter::vfunc_7c(ActorRef *ref) { + if (ref->id != mRef.id) { + mUnk_1d8.mUnk_020.mUnk_70.id = ref->id; + mUnk_1d8.mUnk_020.mUnk_70.index = ref->index; + } else { + mUnk_1d8.mUnk_020.mUnk_70.Reset(); + } +} + +// non-matching +ARM bool ActorCharacter::vfunc_90(unk32 param1, unk32 param2) { + u32 iVar1; + u32 iVar2; + + if (!mUnk_1c2) { + this->func_ov014_021453f4((unk8) param1); + mUnk_430.mUnk_0c = param2; + if (mUnk_1b8 == NULL) { + mUnk_1b8 = func_ov014_02145520; + mUnk_1bc = this; + } + mUnk_450 = mUnk_1d8.mUnk_248.mUnk_00[mUnk_1d8.mUnk_248.mUnk_08]; + mUnk_1d8.func_ov014_02145f0c(this->UnkInline1()); + mUnk_1c2 = true; + } + + bool result = mUnk_1b8 != func_ov014_02145520; + if (result) { + mUnk_1c2 = false; + mUnk_1d8.func_ov014_02145f0c(mUnk_450); + } + return result; +} + +ARM void ActorCharacter::vfunc_94(unk32 param1, unk32 param2) { + ActorCharacter_430_04 *unk1; + ActorCharacter_430_04_04 *unk2; + + this->func_ov014_021453f4((unk8) param1); + unk1 = mUnk_430.mUnk_04; + if (param2 == 0) { + unk2 = &unk1->mUnk_04[unk1->mUnk_00[1] - 1]; + } else { + unk2 = &unk1->mUnk_04[0]; + } + + Vec3p vec; + Vec3p_Set(&vec, unk2->mUnk_04.x, unk2->mUnk_04.y, unk2->mUnk_04.z); + vec.z = unk2->mUnk_04.z; + + mPos.x = vec.x; + mPos.y = vec.y; + mPos.z = vec.z; + mPrevPos.x = vec.x; + mPrevPos.y = vec.y; + mPrevPos.z = vec.z; +} + +ARM bool ActorCharacter::vfunc_98() { + mUnk_1c3 = true; + mUnk_44c = mUnk_1d8.mUnk_248.mUnk_00[mUnk_1d8.mUnk_248.mUnk_08]; + return mUnk_1d8.func_ov014_02145f0c(0); +} + +ARM void ActorCharacter::vfunc_d0() { + mUnk_1d8.func_ov014_02145cac(); +} + +ARM bool ActorCharacter::vfunc_9c() { + mUnk_1c3 = false; + return mUnk_1d8.func_ov014_02145f0c(mUnk_44c); +} + +ARM void ActorCharacter::vfunc_ec(unk32 param1) { + mUnk_1d8.func_ov014_02145f0c(param1); + mUnk_46c[0] |= 1; + if (mUnk_1d8.mUnk_10->mUnk_0c.mUnk_00 == 1) { + mUnk_454 = param1; + } +} + +ARM void ActorCharacter::vfunc_f0(unk32 param1, unk32 param2) { + mUnk_1d8.func_ov014_02145f0c(param1 ? 2 : 0); +} + +ARM void ActorCharacter::func_ov014_0214591c() { + if ((mUnk_46c[0] & 1U) == 0) { + bool unk = data_ov000_020e8b08 == NULL || mRef.id == data_ov000_020e8b08->mUnk_20[data_ov000_020e8b08->mUnk_55].id; + mUnk_1d8.func_ov014_02145f0c(unk ? 2 : 0); + } +} + +struct UnkStruct_ov014_02145974 { + /* 00 */ PAD(0x00, 0x18); + /* 18 */ Cylinder mUnk_18; + /* 28 */ Cylinder mUnk_28; + /* 38 */ +}; + +ARM bool ActorCharacter::IsHitboxTouched(bool param1) { + UnkStruct_ov014_02145974 sp_0; + { + sp_0.mUnk_28.size = (mYOffset + (mYOffset << 1)) >> 3; + Vec3p pos = {mPos.x, mPos.y, mPos.z}; + sp_0.mUnk_28.pos = pos; + sp_0.mUnk_28.pos.y += mYOffset >> 1; + } + { + sp_0.mUnk_18.size = FLOAT_TO_Q20(0.3); + Vec3p pos = {mPos.x, mPos.y, mPos.z}; + sp_0.mUnk_18.pos = pos; + sp_0.mUnk_18.pos.y += mYOffset + FLOAT_TO_Q20(0.3); + } + + if (param1) { + return TouchControl::func_0202b864(&sp_0.mUnk_28.pos, sp_0.mUnk_28.size, 8) || + TouchControl::func_0202b864(&sp_0.mUnk_18.pos, sp_0.mUnk_18.size, 8); + } else { + return TouchControl::func_0202b894(&sp_0.mUnk_28.pos, sp_0.mUnk_28.size, 8) || + TouchControl::func_0202b894(&sp_0.mUnk_18.pos, sp_0.mUnk_18.size, 8); + } +} |
