diff --git a/asm/ov00/Actor/ActorManager_func_ov00_020c3484.inc b/asm/ov00/Actor/ActorManager_func_ov00_020c3484.inc new file mode 100644 index 00000000..2fa2d9dc --- /dev/null +++ b/asm/ov00/Actor/ActorManager_func_ov00_020c3484.inc @@ -0,0 +1,63 @@ + stmdb sp!, {r4, r5, r6, r7, r8, r9, r10, lr} + mov r10, r0 + mvn r3, #0 + str r3, [r10] + ldr r0, data_027e103c + str r3, [r10, #4] + ldr r0, [r0] + mov r9, r2 + ldrb r0, [r0, #0x24] + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, r9, r10, pc} + ldr r0, data_027e077c + ldr r2, data_02056be4 + ldr r0, [r0] + ldr r6, [r1, #0x10] + ldrb r0, [r2, r0] + sub r5, r3, #0x80000000 + tst r0, #1 + ldr r0, [r1, #4] + movne r8, #1 + moveq r8, #0 + add r7, r6, r0, lsl #2 + cmp r6, r7 + ldmhsia sp!, {r4, r5, r6, r7, r8, r9, r10, pc} + mov r4, #0 +_020c34e8: + ldr r0, [r6] + cmp r0, #0 + ldrneb r1, [r0, #0x118] + cmpne r1, #0 + beq _020c3560 + mov r1, r9 + bl _ZN5Actor18func_ov00_020c27a8Ei + cmp r0, #0 + beq _020c3560 + ldr r0, [r6] + ldrb r1, [r0, #0xa4] + cmp r1, #0 + cmpeq r8, #0 + beq _020c3560 + ldr r2, [r0] + mov r1, r4 + ldr r2, [r2, #0x40] + blx r2 + cmp r0, #0 + beq _020c3560 + ldr r0, [r6] + bl _ZN5Actor14DistanceToLinkEv + cmp r0, r5 + bge _020c3560 + ldr r1, [r6] + mov r5, r0 + ldr r0, [r1, #8] + str r0, [r10] + ldr r0, [r1, #0xc] + str r0, [r10, #4] +_020c3560: + add r6, r6, #4 + cmp r6, r7 + blo _020c34e8 + ldmia sp!, {r4, r5, r6, r7, r8, r9, r10, pc} + .align 2, 0 + arm_func_end _ZN12ActorManager18func_ov00_020c3484EP8ActorRefP5Actori diff --git a/src/00_Core/Actor/ActorManager.cpp b/src/00_Core/Actor/ActorManager.cpp index 31a2e2b4..55efc223 100644 --- a/src/00_Core/Actor/ActorManager.cpp +++ b/src/00_Core/Actor/ActorManager.cpp @@ -18,6 +18,9 @@ bool ActorManager::ActorTypeIsOneOf(u32 type, ActorTypeId *types) {} extern void func_ov00_020c3f54(void *, u32 param2); +extern s32 *data_027e103c; +extern s32 *data_027e077c; +extern s32 data_02056be4[]; ARM void ActorManager::DeleteActor(u32 index, bool param2) { if (!param2) { @@ -54,6 +57,64 @@ ARM void ActorManager::DeleteActor(u32 index, bool param2) { return; } +static void NONMATCH(func_ov00_020c3484)(ActorRef *ref, Actor *actor, unk32 param3) { + #ifndef NONMATCHING + #include "../asm/ov00/Actor/ActorManager_func_ov00_020c3484.inc" + #else + char bVar1; + s32 iVar3; + s32 iVar4; + u32 uVar7; + Actor **ppAVar5; + Actor **ppAVar6; + Actor *pActor; + + ref->id = 0xffffffff; + + int *puVar2 = data_027e103c; + + ref->index = 0xffffffff; + + if (*(char *)(*puVar2 + 0x24) == '\0') { + return; + } + + ppAVar5 = *(Actor ***)&actor->mUnk_010; + + bVar1 = data_02056be4[*data_027e077c]; + + iVar4 = 0x7fffffff; + ppAVar6 = ppAVar5 + actor->mType; + + for (; ppAVar5 < ppAVar6; ppAVar5++) { + pActor = *ppAVar5; + if (pActor != NULL) { + actor = (Actor *)(u32)actor->mAlive; + } + if (pActor != NULL && actor != NULL) { + uVar7 = pActor->func_ov00_020c27a8(param3); + actor = (Actor *)(uVar7 >> 0x20); + if (uVar7 != 0) { + pActor = *ppAVar5; + actor = (Actor *)(u32)(pActor->mUnk_0a4.mUnk_00); + } + if (actor != NULL || (bVar1 & 1) != 0) { + uVar7 = pActor->mUnk_040(0); + pActor = (Actor *)(uVar7 >> 0x20); + iVar3 = (*ppAVar5)->DistanceToLink(); + if (uVar7 != 0 && iVar3 < iVar4) { + pActor = *ppAVar5; + ref->id = actor->mId; + ref->index = actor->mIndex; + iVar4 = iVar3; + } + } + } + } + return; + #endif +} + void NONMATCH(ActorManager::Actor_vfunc_10)(u32 param1) { #ifndef NONMATCHING #include "../asm/ov00/Actor/ActorManager_Actor_vfunc_10.inc"