diff --git a/include/Animal/AnimalManager.hpp b/include/Animal/AnimalManager.hpp new file mode 100644 index 00000000..42589f89 --- /dev/null +++ b/include/Animal/AnimalManager.hpp @@ -0,0 +1,29 @@ +#ifndef ANIMAL_ANIMAL_MANAGER_HPP +#define ANIMAL_ANIMAL_MANAGER_HPP + +#include + +class TAnimalSaveIndividual; + +class TAnimalManagerBase : public TEnemyManager { +public: + TAnimalManagerBase(const char* name); + + virtual void clipEnemies(JDrama::TGraphics*); + +public: + /* 0x54 */ f32 mViewClipNear; + /* 0x58 */ f32* mViewClipFarPtr; + /* 0x5C */ TAnimalSaveIndividual* mAnimalSave; +}; + +class TMewManager : public TAnimalManagerBase { +public: + TMewManager(const char* name); + + virtual void load(JSUMemoryInputStream&); + virtual void loadAfter(); + virtual void createModelData(); +}; + +#endif diff --git a/src/Animal/AnimalManager.cpp b/src/Animal/AnimalManager.cpp index 8b137891..80bb0569 100644 --- a/src/Animal/AnimalManager.cpp +++ b/src/Animal/AnimalManager.cpp @@ -1 +1,68 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +void TMewManager::createModelData() +{ + static TModelDataLoadEntry entry[] = { + { "kamome_high.bmd", 0x10210000, 1 }, + { nullptr, 0, 0 }, + }; + createModelDataArray(entry); +} + +void TMewManager::loadAfter() +{ + JDrama::TNameRef::loadAfter(); + MSoundSESystem::MSRandPlay::createRandPlayVec(0x3813, mObjNum); +} + +void TMewManager::load(JSUMemoryInputStream& stream) +{ + TEnemyManager::load(stream); + mAnimalSave = new TAnimalSaveIndividual("/Animal/mew.prm"); + mViewClipNear = mAnimalSave->mSLViewClipNear.value; + mViewClipFarPtr = &mAnimalSave->mSLViewClipFar.value; + unk3C = mAnimalSave->mSLViewClipRadius.value; +} + +void TAnimalManagerBase::clipEnemies(JDrama::TGraphics* graphics) +{ + // TODO: stack frame inflation from inline expansion + volatile u8 _pad[8]; + + SetViewFrustumClipCheckPerspective(gpCamera->mFovy, gpCamera->getAspect(), + mViewClipNear, *mViewClipFarPtr); + + s32 count = mObjNum; + for (int i = 0; i < count; ++i) { + TLiveActor* actor = (TLiveActor*)getObj(i); + JGeometry::TVec3 pos = actor->mPosition; + pos.y += 75.0f; + + if (actor->checkLiveFlag(LIVE_FLAG_UNK2000) + && SMS_IsInOtherFastCube(pos)) { + actor->onLiveFlag(LIVE_FLAG_CLIPPED_OUT); + } else { + if (ViewFrustumClipCheck(graphics, &actor->mPosition, unk3C)) + actor->offLiveFlag(LIVE_FLAG_CLIPPED_OUT); + else + actor->onLiveFlag(LIVE_FLAG_CLIPPED_OUT); + } + } +} + +TAnimalManagerBase::TAnimalManagerBase(const char* name) + : TEnemyManager(name) +{ + mViewClipNear = 250.0f; + mViewClipFarPtr = nullptr; + mAnimalSave = nullptr; +}