ActorCharacter OK (#162)

* ActorCharacter 93%

* ActorCharacter 98%

* ActorCharacter OK

* Fix broken matches
This commit is contained in:
Aetias
2026-05-11 20:34:17 +02:00
committed by GitHub
parent d02c870d1d
commit e704ec9942
21 changed files with 722 additions and 209 deletions
+4 -4
View File
@@ -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() {}
+4 -3
View File
@@ -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() {}
+3 -3
View File
@@ -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);
}
+407 -40
View File
@@ -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() {}
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);
}
ActorCharacter_288::ActorCharacter_288() :
UnkStruct_ov000_020c0c08(mUnk_24, NULL) {}
ActorCharacter::ActorCharacter() {}
ARM void ActorCharacter::func_ov014_02144dec() {
gAdventureFlags->func_ov00_02097bcc(mUnk_1b4);
mUnk_1b4 = -1;
}
ActorCharacter::~ActorCharacter() {}
bool ActorCharacter::Init() {}
void ActorCharacter::vfunc_20(bool param1) {}
ARM bool ActorCharacter::func_ov014_02144e14() {
return mUnk_020.mUnk_00[1] != 0;
}
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() {}
ARM bool ActorCharacter::func_ov014_02144e28() {
return mUnk_020.mUnk_00[3] != 0;
}
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) {}
ARM bool ActorCharacter::func_ov014_02144e3c() {
return gAdventureFlags->Get(mUnk_020.mUnk_00[1]);
}
void ActorCharacter::func_ov014_0214591c() {}
ARM bool ActorCharacter::func_ov014_02144e58() {
return gAdventureFlags->Get(mUnk_020.mUnk_00[3]);
}
bool ActorCharacter::IsHitboxTouched(bool param1) {}
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);
}
}
+1 -1
View File
@@ -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() {}