diff options
| author | Yanis002 <35189056+Yanis002@users.noreply.github.com> | 2025-06-29 21:57:44 +0200 |
|---|---|---|
| committer | Yanis002 <35189056+Yanis002@users.noreply.github.com> | 2025-06-29 21:57:44 +0200 |
| commit | f7c54542b9c2b3231c10992c80f775d4ccb1706b (patch) | |
| tree | 44545be8b43231411c967efd2289b4dd97e9e0dd /src/00_Core/Actor/ActorSpawner.cpp | |
| parent | 7d783ffb12a59965f7a288ac9e5bfc4caccf3d1a (diff) | |
| parent | 3fe49695b4936ea29526eb8b7d07250a69a06c38 (diff) | |
Merge remote-tracking branch 'upstream/main' into hammer
Diffstat (limited to 'src/00_Core/Actor/ActorSpawner.cpp')
| -rw-r--r-- | src/00_Core/Actor/ActorSpawner.cpp | 104 |
1 files changed, 96 insertions, 8 deletions
diff --git a/src/00_Core/Actor/ActorSpawner.cpp b/src/00_Core/Actor/ActorSpawner.cpp index 76b4ae74..55cf1a57 100644 --- a/src/00_Core/Actor/ActorSpawner.cpp +++ b/src/00_Core/Actor/ActorSpawner.cpp @@ -1,10 +1,98 @@ #include "Actor/ActorSpawner.hpp" +#include "Actor/ActorManager.hpp" +#include "Map/MapManager.hpp" -ActorSpawner *ActorSpawner::Create() {} -void ActorSpawner::Destroy() {} -ActorSpawner::ActorSpawner() {} -ActorSpawner::~ActorSpawner() {} -void ActorSpawner::func_ov000_020c4014() {} -void ActorSpawner::func_ov000_020c4018() {} -Actor *ActorSpawner::CreateActor(ActorTypeId type) {} -s32 ActorSpawner::Spawn(ActorTypeId type, Vec3p *pos, void *param3, ActorRef *ref) {} +extern u32 *data_027e0ce0[]; +ARM ActorSpawner *ActorSpawner::Create() { + gActorSpawner = new(data_027e0ce0[1], 4) ActorSpawner(); +} + +ARM void ActorSpawner::Destroy() { + delete gActorSpawner; + gActorSpawner = NULL; +} + +ARM ActorSpawner::ActorSpawner() {} + +ARM ActorSpawner::~ActorSpawner() {} + +ARM void ActorSpawner::func_ov000_020c4014() {} + +ARM void ActorSpawner::func_ov000_020c4018() {} + +ARM Actor *ActorSpawner::CreateActor(ActorTypeId typeId) { + Actor *actor = NULL; + ActorType *type = ActorType::Find(typeId); + if (type != NULL) { + actor = type->create(); + } + return actor; +} + +extern "C" unk32 GetCardinal(s16 angle); +ARM s32 ActorSpawner::Spawn(ActorTypeId type, Vec3p *pos, ActorSpawnOptions *options, ActorRef *ref) { + ActorManager *actorManager = gActorManager; + u16 maxActors = actorManager->mMaxActors; + s32 id = -1; + s32 index; + Actor **actorSlot = actorManager->mActorTable; + for (index = 0; index < maxActors; index++, actorSlot++) { + if (*actorSlot != NULL) { + continue; + } + + Actor *actor = this->CreateActor(type); + *actorSlot = actor; + if (actor == NULL) { + if (ref != NULL) { + ref->Reset(); + } + return -1; + } + actor->mType = type; + (*actorSlot)->mRef.id = actorManager->mNextActorId; + (*actorSlot)->mRef.index = index; + (*actorSlot)->mUnk_014 = *pos; + (*actorSlot)->mUnk_020 = options->mUnk_00; + (*actorSlot)->mAngle = options->mAngle; + (*actorSlot)->mUnk_012 = options->mAngle; + (*actorSlot)->mUnk_074 = GetCardinal(options->mAngle); + if (options->mUnk_18 >= 0xffff) { + (*actorSlot)->mUnk_03c = -1; + } else { + (*actorSlot)->mUnk_03c = options->mUnk_18; + } + (*actorSlot)->mUnk_034 = options->mUnk_1c; + (*actorSlot)->mUnk_140 = options->mUnk_24; + (*actorSlot)->mUnk_144 = options->mUnk_28; + Actor *actor2 = *actorSlot; + actor2->mPos = *pos; + actor2->mPrevPos = *pos; + (*actorSlot)->mUnk_010 = gMapManager->GetCourseData_Unk_1c(); + (*actorSlot)->mUnk_011 = gMapManager->GetCourseData_Unk_1d(); + u16 nextIndex = index + 1; + if (actorManager->mMaxActorIndex < nextIndex) { + actorManager->mMaxActorIndex = nextIndex; + } + actorManager->mCacheEmptyActorIndex = index; + + id = actorManager->mNextActorId; + if (ref != NULL) { + *ref = ActorRef(id, index); + } + actorManager->mNextActorId += 1; + actorManager->mNumActors += 1; + if (!(*actorSlot)->Init()) { + (*actorSlot)->mAlive = false; + if (ref != NULL) { + ref->Reset(); + } + return -1; + } + break; + } + if ((id == -1) && (ref != NULL)) { + ref->Reset(); + } + return id; +} |
