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
|
#include "d/t/d_t_action.h"
#include "common.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/a/obj/d_a_obj_bomb.h"
#include "d/d_player.h"
#include "f/f_base.h"
#include "f/f_profile_name.h"
#include "m/m_angle.h"
#include "toBeSorted/area_math.h"
SPECIAL_ACTOR_PROFILE(ACTION_TAG, dTgAction_c, fProfile::ACTION_TAG, 0x20, 0, 0);
int dTgAction_c::create() {
mEnableFlag1 = (mParams >> 6) & 0xFF;
mEnableFlag2 = (mParams >> 14) & 0xFF;
mType = (mParams >> 0) & 0x3F;
matrixCreateFromPosRotYScale(mActiveMtx, mPosition, mRotation.y, mScale, nullptr, 0.f);
return SUCCEEDED;
}
int dTgAction_c::doDelete() {
return SUCCEEDED;
}
void dTgAction_c::setActiveArea(f32 scale) {
if (mScaleIncrease < 0.1f) {
mScaleIncrease = scale;
matrixCreateFromPosRotYScale(mActiveMtx, mPosition, mRotation.y, mScale, nullptr, mScaleIncrease);
}
}
void dTgAction_c::resetActiveArea() {
if (mScaleIncrease > 0.f) {
mScaleIncrease = 0.f;
matrixCreateFromPosRotYScale(mActiveMtx, mPosition, mRotation.y, mScale, nullptr, 0.f);
field_0x134 = 0;
}
}
int dTgAction_c::actorExecute() {
dAcPy_c *player = getLinkPtr();
bool enabled = !checkActive1() && checkActive2();
// Check For Bomb within area
if (enabled && mType == WATER_RELATED) {
s32 numRefs = player->getBeetleActorReferencesSize();
for (s32 i = 0; i < numRefs; i++) {
dAcObjBase_c *pObj = player->checkBeetleActorReferences(i);
if (pObj == nullptr) {
break;
}
if (pObj->mProfileName == fProfile::BOMB) {
if (checkAreaBox(mActiveMtx, pObj->getPosition())) {
reinterpret_cast<dAcBomb_c *>(pObj)->On_0xA3C(0x20000000);
}
}
}
}
// Check For Player Within Area
if (enabled && checkAreaBox(mActiveMtx, player->getPosition())) {
if (mType == FORCE_FADE_RESTART) {
player->onFlags_0x358(0x10000000);
setActiveArea(50.f);
} else if (mType == PREVENT_RESPAWN) {
player->onForceOrPreventActionFlags(0x80);
} else if (mType == FORCE_AUTO_JUMP) {
player->onForceOrPreventActionFlags(0x200000);
} else if (mType == PREVENT_LOFTWING_CALL) {
player->onForceOrPreventActionFlags(0x20000);
setActiveArea(50.f);
} else if (mType == WATER_RELATED) {
player->onForceOrPreventActionFlags(0x400000);
setActiveArea(15.f);
} else if (mType == SHOW_DASH_PROMPT) {
if (mAng::abs(player->mRotation.y - mRotation.y) < (0x2000 + field_0x134)) {
player->onForceOrPreventActionFlags(0x20000000);
setActiveArea(50.f);
field_0x134.set(0x38E);
} else {
resetActiveArea();
}
}
} else {
resetActiveArea();
}
return SUCCEEDED;
}
int dTgAction_c::draw() {
return SUCCEEDED;
}
|