From d7f74cf521c7cc404788ac628bce3143349c34ee Mon Sep 17 00:00:00 2001 From: ryanbevins Date: Fri, 13 Feb 2026 20:45:05 +0800 Subject: [PATCH] animalnerve decompilation (2/3 matching) --- include/Animal/AnimalBase.hpp | 26 ++++++++ include/Camera/cameralib.hpp | 2 +- src/Animal/AnimalNerve.cpp | 108 ++++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 include/Animal/AnimalBase.hpp diff --git a/include/Animal/AnimalBase.hpp b/include/Animal/AnimalBase.hpp new file mode 100644 index 00000000..355fdacc --- /dev/null +++ b/include/Animal/AnimalBase.hpp @@ -0,0 +1,26 @@ +#ifndef ANIMAL_ANIMAL_BASE_HPP +#define ANIMAL_ANIMAL_BASE_HPP + +#include + +class TAnimalBase : public TSpineEnemy { +public: + TAnimalBase(u32, const char*); + + virtual void load(JSUMemoryInputStream&); + virtual void perform(u32, JDrama::TGraphics*); + virtual BOOL receiveMessage(THitActor*, u32); + virtual void init(TLiveManager*); + virtual void calcRootMatrix(); + + void execWalk(bool); + void getRotationFlyToDir(JGeometry::TVec3*, + const JGeometry::TVec3&, f32, f32); + void resetRandomCurPathNode(); + void loadAfter(); + +public: + /* 0x150 */ int* mFrameTimer; +}; + +#endif diff --git a/include/Camera/cameralib.hpp b/include/Camera/cameralib.hpp index 4796334b..435a0360 100644 --- a/include/Camera/cameralib.hpp +++ b/include/Camera/cameralib.hpp @@ -68,7 +68,7 @@ template T CLBLinearInbetween(T a, T b, f32 f) return (T)(a + f * (b - a)); } -template void CLBPalFrame(T); +template T CLBPalFrame(T); template void CLBPalIntSpeed(T); template T CLBRoundf(f32); template void CLBTwoDegreeGeneralInbetween(T, T, f32, f32); diff --git a/src/Animal/AnimalNerve.cpp b/src/Animal/AnimalNerve.cpp index 8b137891..7c417191 100644 --- a/src/Animal/AnimalNerve.cpp +++ b/src/Animal/AnimalNerve.cpp @@ -1 +1,109 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +f32 calcDist(const JGeometry::TVec3& a, const JGeometry::TVec3& b) +{ + JGeometry::TVec3 diff = a; + diff.sub(b); + return JGeometry::TUtil::sqrt(diff.squared()); +} + +DEFINE_NERVE(TNerveAnimalGraphWander, TLiveActor) +{ + TAnimalBase* actor = (TAnimalBase*)spine->getBody(); + MActor* mActor = actor->getMActor(); + TAnimalManagerBase* manager = (TAnimalManagerBase*)actor->getManager(); + + TAnimalSaveIndividual* save = manager->mAnimalSave; + int count = save->mSLSharedAnmNum.get(); + + if (count != 0 && actor->getInstanceIndex() >= count) { + TLiveActor* other = manager->getObj(actor->getInstanceIndex() % count); + + int anmIdx = other->getMActor()->getCurAnmIdx(0); + mActor->setBckFromIndex(anmIdx); + + J3DFrameCtrl* myCtrl = mActor->getFrameCtrl(0); + J3DFrameCtrl* otherCtrl = other->getMActor()->getFrameCtrl(0); + myCtrl->mCurrentFrame = otherCtrl->mCurrentFrame; + } else if (actor->getActorType() != 0x800001) { + // not the right type, skip animation setup + } else { + if (spine->getTime() == 0) { + int hi = CLBPalFrame(500); + int lo = CLBPalFrame(150); + int* timer = actor->mFrameTimer; + timer[0] = 0; + timer[1] = lo + (int)((f32)(hi - lo) * (MsRandF())) + 1; + } + + int* timer = actor->mFrameTimer; + timer[0] = timer[0] + 1; + if (timer[0] >= timer[1]) { + timer[0] = timer[1]; + } + + BOOL anmEndsNext = mActor->curAnmEndsNext(0, 0); + + if (mActor->getCurAnmIdx(0) == 1 && anmEndsNext) { + if (!mActor->checkCurBckFromIndex(0)) + mActor->setBckFromIndex(0); + + int hi = CLBPalFrame(500); + int lo = CLBPalFrame(150); + int* timer = actor->mFrameTimer; + timer[0] = 0; + timer[1] = lo + (int)((f32)(hi - lo) * (MsRandF())) + 1; + } + } + + actor->execWalk(true); + + if (!actor->unk114.empty()) { + const JGeometry::TVec3& goalPos = actor->unkF4.getPoint(); + f32 dist = calcDist(goalPos, actor->mPosition); + + if (dist < 200.0f && !actor->unk114.empty()) { + actor->unkF4 = actor->unk114.pop(); + } + } else { + const JGeometry::TVec3& curPos = actor->unk104.getPoint(); + f32 dist = calcDist(curPos, actor->mPosition); + + if (dist < 100.0f) { + actor->goToRandomNextGraphNode(); + actor->resetRandomCurPathNode(); + + const JGeometry::TVec3& fwdPos = actor->unkF4.getPoint(); + + if (actor->mPosition.y <= fwdPos.y) { + if (!mActor->checkCurBckFromIndex(1)) + mActor->setBckFromIndex(1); + + int hi = CLBPalFrame(180); + int lo = CLBPalFrame(60); + int* timer = actor->mFrameTimer; + timer[0] = 0; + timer[1] = lo + (int)((f32)(hi - lo) * (MsRandF())) + 1; + } else { + if (!mActor->checkCurBckFromIndex(0)) + mActor->setBckFromIndex(0); + + int hi = CLBPalFrame(500); + int lo = CLBPalFrame(150); + int* timer = actor->mFrameTimer; + timer[0] = 0; + timer[1] = lo + (int)((f32)(hi - lo) * (MsRandF())) + 1; + } + } + } + + return FALSE; +}