summaryrefslogtreecommitdiff
path: root/src/14_Land
diff options
context:
space:
mode:
Diffstat (limited to 'src/14_Land')
-rw-r--r--src/14_Land/Actor/Character/ActorCharacter.cpp459
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);
+ }
+}