1#include "Library/MapObj/SurfMapParts.h"
2
3#include "Library/Collision/CollisionPartsKeeperUtil.h"
4#include "Library/Collision/CollisionPartsTriangle.h"
5#include "Library/Collision/KCollisionServer.h"
6#include "Library/LiveActor/ActorAreaFunction.h"
7#include "Library/LiveActor/ActorInitUtil.h"
8#include "Library/LiveActor/ActorPoseUtil.h"
9#include "Library/Math/MathUtil.h"
10#include "Library/Nerve/NerveSetupUtil.h"
11#include "Library/Placement/PlacementFunction.h"
12
13namespace {
14using namespace al;
15
16NERVE_IMPL(SurfMapParts, Wait)
17
18NERVES_MAKE_STRUCT(SurfMapParts, Wait)
19} // namespace
20
21namespace al {
22SurfMapParts::SurfMapParts(const char* name) : LiveActor(name) {}
23
24void SurfMapParts::init(const ActorInitInfo& info) {
25 initMapPartsActor(actor: this, initInfo: info, suffix: nullptr);
26 tryGetQuatPtr(actor: this);
27 initNerve(actor: this, nerve: &NrvSurfMapParts.Wait, maxStates: 0);
28 registerAreaHostMtx(actor: this, initInfo: info);
29
30 tryGetArg(arg: &mIsEnableSlope, initInfo: info, key: "IsEnableSlope");
31
32 initMaterialCode(actor: this, initInfo: info);
33
34 mQuat = getQuat(actor: this);
35 mTrans = getTrans(actor: this);
36 calcQuatUp(out: &mUpDir, quat: mQuat);
37
38 mCollisionPartsFilterActor = new CollisionPartsFilterActor(this);
39
40 trySyncStageSwitchAppear(actor: this);
41}
42
43void SurfMapParts::exeWait() {
44 sead::Vector3f hitPos;
45 Triangle triangle;
46 sead::Vector3f trans = getTrans(actor: this);
47
48 if (alCollisionUtil::getFirstPolyOnArrow(
49 this, &hitPos, &triangle, getTrans(actor: this) + mCheckOffset * sead::Vector3f::ey * 0.5f,
50 -mCheckOffset * sead::Vector3f::ey, mCollisionPartsFilterActor, nullptr)) {
51 setTrans(actor: this, trans: trans * 0.9f + hitPos * 0.1f);
52 if (mIsEnableSlope) {
53 sead::Quatf quat;
54 sead::Vector3f normal = triangle.getNormal(index: 0);
55 turnQuatYDirRate(&quat, getQuat(actor: this), normal, 0.1f);
56 calcQuatUp(out: &mUpDir, quat);
57 }
58 }
59
60 if (mIsEnableSlope)
61 turnQuatYDirRate(getQuatPtr(actor: this), mQuat, mUpDir, 1.0f);
62}
63} // namespace al
64