diff --git a/asm/ov00/Actor/ActorManager_Actor_FindActorById.inc b/asm/ov00/Actor/ActorManager_Actor_FindActorById.inc new file mode 100644 index 00000000..1fe5c176 --- /dev/null +++ b/asm/ov00/Actor/ActorManager_Actor_FindActorById.inc @@ -0,0 +1,43 @@ + stmdb sp!, {r3, lr} + cmp r1, #0 + mov ip, #0 + blt _020c366c + ldr r3, [r0, #8] + cmp r3, #0 + blt _020c3628 + ldr r2, [r0, #4] + cmp r3, r2 + bge _020c3628 + ldr r2, [r0, #0x10] + ldr r3, [r2, r3, lsl #2] + cmp r3, #0 + ldrneb r2, [r3, #0x118] + cmpne r2, #0 + beq _020c3628 + ldr r2, [r3, #8] + cmp r1, r2 + moveq ip, r3 + beq _020c366c +_020c3628: + ldr r3, [r0, #0x10] + ldr r0, [r0, #4] + add lr, r3, r0, lsl #2 + cmp r3, lr + bhs _020c366c +_020c363c: + ldr r2, [r3] + cmp r2, #0 + ldrneb r0, [r2, #0x118] + cmpne r0, #0 + beq _020c3660 + ldr r0, [r2, #8] + cmp r1, r0 + moveq ip, r2 + beq _020c366c +_020c3660: + add r3, r3, #4 + cmp r3, lr + blo _020c363c +_020c366c: + mov r0, ip + ldmia sp!, {r3, pc} diff --git a/src/00_Core/Actor/ActorManager.cpp b/src/00_Core/Actor/ActorManager.cpp index 55efc223..27acf972 100644 --- a/src/00_Core/Actor/ActorManager.cpp +++ b/src/00_Core/Actor/ActorManager.cpp @@ -141,3 +141,45 @@ void NONMATCH(ActorManager::Actor_vfunc_10)(u32 param1) { return; #endif } + +Actor* NONMATCH(ActorManager::FindActorById)(s32 id) { + #ifndef NONMATCHING + #include "../asm/ov00/Actor/ActorManager_Actor_FindActorById.inc" + #else + u32 actorId; + s32 cacheIndex; + Actor *actor; + Actor **pActor; + Actor **lastActor; + + actor = NULL; + if (id >= 0) { + cacheIndex = this->mCacheEmptyActorIndex; + if ((cacheIndex >= 0) && (cacheIndex < this->mMaxActorIndex)) { + pActor = this->mActorTable; + actor = this->mActorTable[cacheIndex]; + if (actor != NULL) { + pActor = (Actor**)(u32)actor->mAlive; + if (pActor != NULL && id == actor->mId) { + return actor; + } + } + } + pActor = this->mActorTable; + actorId = this->mMaxActorIndex; + lastActor = pActor + actorId; + + for (; pActor < lastActor; pActor = pActor + 1) { + if (*pActor != NULL) { + actorId = (u32)(*pActor)->mAlive; + if (actorId != 0 && id == (*pActor)->mId) { + actor = *pActor; + break; + } + } + } + } + + return actor; + #endif +}