1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
#include "d/a/obj/d_a_obj_tarzan_pole.h"
#include "d/a/d_a_base.h"
#include "d/a/d_a_item.h"
#include "d/a/d_a_itembase.h"
#include "d/a/d_a_player.h"
#include "d/col/bg/d_bg_s.h"
#include "d/col/cc/d_cc_d.h"
#include "d/col/cc/d_cc_s.h"
#include "f/f_base.h"
#include "nw4r/g3d/res/g3d_resmdl.h"
#include "toBeSorted/attention.h"
SPECIAL_ACTOR_PROFILE(OBJ_TARZAN_POLE, dAcOTarzanPole_c, fProfile::OBJ_TARZAN_POLE, 0x235, 0, 3);
// clang-format off
dCcD_SrcSph dAcOTarzanPole_c::sCcSrc = {
/* mObjInf */ {
/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0},
/* mObjTg */ {(AT_TYPE_WHIP | AT_TYPE_WIND), 0x800311, {0, 0, 0x407}, 0x0000, 0x0000},
/* mObjCo */ {0x00000000}},
/* mSphInf */ {10.0f}
};
// clang-format on
const f32 dAcOTarzanPole_c::sXOffset = 320.0f;
const f32 dAcOTarzanPole_c::sYOffset = 0.0f;
bool dAcOTarzanPole_c::createHeap() {
// Get Res File
void *resFile = getOarcResFile("WhipBar");
mBrres = nw4r::g3d::ResFile(resFile);
// Create model
nw4r::g3d::ResMdl resMdl = mBrres.GetResMdl("WhipBar");
TRY_CREATE(mMdl.create(resMdl, &mAllocator, 0x120, 1, nullptr));
// Load Collider
void *dzb = getOarcDZB("WhipBar", "WhipBar");
void *plc = getOarcPLC("WhipBar", "WhipBar");
updateMatrix();
if (mBgCollider.Set((cBgD_t *)dzb, (PLC *)plc, 1, &mWorldMtx, &mScale)) {
return false;
}
return true;
}
int dAcOTarzanPole_c::create() {
CREATE_ALLOCATOR(dAcOTarzanPole_c);
dBgS::GetInstance()->Regist(&mBgCollider, this);
mStts.SetRank(1);
mCollider.Set(sCcSrc);
mCollider.SetStts(mStts);
mAcceleration = 0.0f;
mMaxSpeed = -40.0f;
mFloat = (s32)(mParams & 0xFF) * 10.0f;
if ((s32)(mParams & 0xFF) == 0xFF) {
mFloat = 0.0f;
}
mVec = mVec3_c::Ex * 400.0f;
mVec.rotY(mRotation.y);
mBoundingBox.Set(mVec3_c(-0.0f, -120.0f, -110.0f), mVec3_c(500.0f, 140.0f, 110.0f));
return SUCCEEDED;
}
int dAcOTarzanPole_c::doDelete() {
return SUCCEEDED;
}
int dAcOTarzanPole_c::actorExecute() {
updateMatrix();
mMdl.setLocalMtx(mWorldMtx);
mMdl.calc(false);
const dAcPy_c *player = dAcPy_c::GetLink();
bool bVar = false;
if (mCollider.ChkTgHit() && mCollider.ChkTgAtHitType(AT_TYPE_WHIP)) {
setObjectProperty(OBJ_PROP_0x1000);
}
mVec = mVec3_c::Ex * sXOffset + mVec3_c::Ey * sYOffset;
mVec.rotY(mRotation.y);
mPositionCopy2 = mPosition + mVec;
mPositionCopy3 = mPositionCopy2 + mVec3_c::Ey * 20.0f;
// 0x400000 corresponds to dAcPy_FLG0::FLG0_SWING_ROPE
if (player != nullptr && !player->checkActionFlags(0x400000) && dAcItem_c::checkFlag(ITEM_WHIP)) {
AttentionManager::GetInstance()->addUnk7Target(*this, 1, 1000.0f, 10.0f, -600.0, 200);
}
mCollider.SetC(mPositionCopy2);
dCcS::GetInstance()->Set(&mCollider);
return SUCCEEDED;
}
int dAcOTarzanPole_c::draw() {
drawModelType1(&mMdl);
return SUCCEEDED;
}
|