-
Notifications
You must be signed in to change notification settings - Fork 1
/
Foomin.cpp
108 lines (90 loc) · 3.12 KB
/
Foomin.cpp
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
108
#include "pe/Enemy/Foomin.h"
#include "Game/Player/Player/Player.h"
#include "Game/Player/PlayerActor.h"
#include "al/HitSensor/HitSensor.h"
#include "al/LiveActor/LiveActor.h"
#include "al/LiveActor/LiveActorFunction.h"
#include "al/Nerve/Nerve.h"
#include "al/Nerve/NerveFunction.h"
#include "al/Placement/PlacementFunction.h"
#include "pe/Client/MPClient.h"
namespace pe {
namespace {
NERVE_DEF(Foomin, Wait);
NERVE_DEF(Foomin, Flip);
}
void Foomin::init(const al::ActorInitInfo& info)
{
al::initActor(this, info);
bool startWithFlip = false;
al::tryGetArg(&startWithFlip, info, "IsStartFlip");
if (startWithFlip)
al::initNerve(this, &nrvFoominFlip);
else
al::initNerve(this, &nrvFoominWait);
al::tryGetArg(&mMoveDir, info, "MoveDir");
al::tryGetArg(&pMoveAmount, info, "MoveAmount");
al::tryGetArg(&pMoveSpeed, info, "MoveSpeed");
al::tryGetArg(&pMoveLeftRight, info, "IsMoveLeftRight");
al::tryGetArg(&pFlingVelocityMultiplier, info, "VelocityMultiplier");
al::tryGetArg(&pFlingYVelocityMultiplier, info, "VelocityMultiplierY");
makeActorAppeared();
}
void Foomin::invalidateCollisionParts()
{
al::invalidateCollisionParts(this);
mFramesUntilCollisionPartsReactivate = 20;
}
bool Foomin::receiveMsg(const al::SensorMsg* msg, al::HitSensor* source, al::HitSensor* target)
{
if (al::isSensorPlayer(source))
mPlayerActor = static_cast<PlayerActor*>(al::getSensorHost(source));
if (al::isMsgPlayerFloorTouch(msg)
&& al::isNerve(this, &nrvFoominFlip)
&& (al::getNerveStep(this) >= sFlipStartFrame && al::getNerveStep(this) <= sFlipEndFrame)) {
invalidateCollisionParts();
PlayerProperty& playerProperty = *static_cast<PlayerActor*>(al::getSensorHost(source))->mPlayer->mPlayerProperty;
playerProperty.velocity = al::getFront(this) * pFlingVelocityMultiplier;
mFramesSinceLaunch = 0;
return true;
}
return false;
}
void Foomin::control()
{
if (mFramesSinceLaunch != -1) {
mFramesSinceLaunch++;
if (mFramesSinceLaunch < 2 && mPlayerActor)
mPlayerActor->mPlayer->mPlayerProperty->velocity.y = pFlingYVelocityMultiplier;
}
if (pMoveLeftRight) {
const sead::Vector3f& front = al::getFront(this);
sead::Vector3f right = { front.z, front.y, -front.x };
if (mMoveAmount >= pMoveAmount) {
mMoveDir = !mMoveDir;
mMoveAmount = 0;
}
mMoveAmount += pMoveSpeed;
*al::getTransPtr(this) += mMoveDir ? right * pMoveSpeed : -right * pMoveSpeed;
}
if (mFramesUntilCollisionPartsReactivate > 0) {
mFramesUntilCollisionPartsReactivate--;
if (mFramesUntilCollisionPartsReactivate == 0)
al::validateCollisionParts(this);
}
}
void Foomin::exeWait()
{
if (al::isFirstStep(this))
al::startAction(this, "Wait");
if (al::isActionEnd(this))
al::setNerve(this, &nrvFoominFlip);
}
void Foomin::exeFlip()
{
if (al::isFirstStep(this))
al::startAction(this, "Flip");
if (al::isActionEnd(this))
al::setNerve(this, &nrvFoominWait);
}
} // namespace pe