summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAetias <144526980+AetiasHax@users.noreply.github.com>2026-05-11 20:34:17 +0200
committerGitHub <noreply@github.com>2026-05-11 20:34:17 +0200
commite704ec994219540b71da323a61ffa930f80ce492 (patch)
tree8ef52838d148fcc7c1d1f1cb2458f47af9c23fa0 /src
parentd02c870d1dbe8c9b5e8b3acbb3b5bfff53ad8d03 (diff)
ActorCharacter OK (#162)
* ActorCharacter 93% * ActorCharacter 98% * ActorCharacter OK * Fix broken matches
Diffstat (limited to 'src')
-rw-r--r--src/00_Core/Actor/Actor.cpp8
-rw-r--r--src/00_Core/Actor/Navi/ActorNaviBase.cpp7
-rw-r--r--src/00_Core/Save/AdventureFlags.cpp6
-rw-r--r--src/14_Land/Actor/Character/ActorCharacter.cpp459
-rw-r--r--src/57_Rope/Actor/Player/ActorRope.cpp2
5 files changed, 425 insertions, 57 deletions
diff --git a/src/00_Core/Actor/Actor.cpp b/src/00_Core/Actor/Actor.cpp
index 19dbe4f3..9e5b4202 100644
--- a/src/00_Core/Actor/Actor.cpp
+++ b/src/00_Core/Actor/Actor.cpp
@@ -239,8 +239,8 @@ ARM bool Actor::vfunc_70() {
return true;
}
-ARM void Actor::vfunc_74() {}
-ARM void Actor::vfunc_7c() {}
+ARM void Actor::vfunc_74(ActorRef *ref) {}
+ARM void Actor::vfunc_7c(ActorRef *ref) {}
ARM bool Actor::vfunc_78() {
return true;
@@ -254,11 +254,11 @@ ARM bool Actor::vfunc_8c() {
return true;
}
-ARM bool Actor::vfunc_90() {
+ARM bool Actor::vfunc_90(unk32 param1, unk32 param2) {
return true;
}
-ARM void Actor::vfunc_94() {}
+ARM void Actor::vfunc_94(unk32 param1, unk32 param2) {}
ARM bool Actor::vfunc_98() {}
ARM bool Actor::vfunc_9c() {}
diff --git a/src/00_Core/Actor/Navi/ActorNaviBase.cpp b/src/00_Core/Actor/Navi/ActorNaviBase.cpp
index 0bbe0f8a..3e907fd4 100644
--- a/src/00_Core/Actor/Navi/ActorNaviBase.cpp
+++ b/src/00_Core/Actor/Navi/ActorNaviBase.cpp
@@ -1,4 +1,5 @@
#include "Actor/Navi/ActorNaviBase.hpp"
+#include "Actor/ActorRef.hpp"
u16 ActorNaviBase::vfunc_c4() {}
u16 ActorNaviBase::vfunc_c8() {}
@@ -36,11 +37,11 @@ void ActorNaviBase::vfunc_80() {}
void ActorNaviBase::vfunc_84() {}
bool ActorNaviBase::vfunc_78() {}
bool ActorNaviBase::vfunc_bc(unk32 param1, unk8 param2, s32 param3) {}
-void ActorNaviBase::vfunc_74() {}
+void ActorNaviBase::vfunc_74(ActorRef *ref) {}
void ActorNaviBase::func_ov000_020baca8(Vec3p *param1, unk32 param2) {}
void ActorNaviBase::func_ov000_020bad18() {}
-bool ActorNaviBase::vfunc_90() {}
-void ActorNaviBase::vfunc_94() {}
+bool ActorNaviBase::vfunc_90(unk32 param1, unk32 param2) {}
+void ActorNaviBase::vfunc_94(unk32 param1, unk32 param2) {}
void ActorNaviBase::func_ov000_020bb0ac() {}
void ActorNaviBase::func_ov000_020bb0e0() {}
void ActorNaviBase::vfunc_ec() {}
diff --git a/src/00_Core/Save/AdventureFlags.cpp b/src/00_Core/Save/AdventureFlags.cpp
index 7851fd62..59ed44c3 100644
--- a/src/00_Core/Save/AdventureFlags.cpp
+++ b/src/00_Core/Save/AdventureFlags.cpp
@@ -75,7 +75,7 @@ ARM void AdventureFlags::Set(AdventureFlag flag, bool value) {
}
}
-ARM void AdventureFlags::func_ov00_02097810(s32 param1, astruct_23 *param2) {}
+ARM unk32 AdventureFlags::func_ov00_02097810(UnkStruct_ov000_0209a50c *param2) {}
// non-matching
ARM unk32 AdventureFlags::func_ov00_02097968(unk32 param1) {
@@ -83,7 +83,7 @@ ARM unk32 AdventureFlags::func_ov00_02097968(unk32 param1) {
return -1;
}
- astruct_23 aStack_c0;
+ UnkStruct_ov000_0209a50c aStack_c0;
aStack_c0.mUnk_16 = data_027e0db0.mUnk_04 > 0;
FlagsUnk2 FStack_d8;
@@ -120,7 +120,7 @@ ARM bool AdventureFlags::func_ov00_02097bcc(s32 param1) {
return this->mUnk_44->func_ov000_02098fa4(param1);
}
-ARM bool AdventureFlags::func_ov00_02097bcc(astruct_23 *param1) {
+ARM bool AdventureFlags::func_ov00_02097bcc(UnkStruct_ov000_0209a50c *param1) {
if (this->func_ov00_02097738()) {
return this->mUnk_44->func_ov000_020990a4(param1);
}
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);
+ }
+}
diff --git a/src/57_Rope/Actor/Player/ActorRope.cpp b/src/57_Rope/Actor/Player/ActorRope.cpp
index bbcf4115..45e8925b 100644
--- a/src/57_Rope/Actor/Player/ActorRope.cpp
+++ b/src/57_Rope/Actor/Player/ActorRope.cpp
@@ -2,7 +2,7 @@
ActorRope_Unk_0219a3b0 gUnk_0219a3b0;
-void ActorRope_Unk_0219a3b0::vfunc_08(unk16 *param1) {}
+bool ActorRope_Unk_0219a3b0::vfunc_08(UnkStruct_ov000_020beba8_08 *param1) {}
bool ActorRope_Unk_0219a3b0::vfunc_10(s32 *param1) {}
ActorRope::ActorRope() {}
bool ActorRope::Init() {}