mirror of
https://github.com/CraftyBoss/SuperMarioOdysseyOnline.git
synced 2024-11-06 03:35:04 +00:00
156 lines
No EOL
3.9 KiB
C++
156 lines
No EOL
3.9 KiB
C++
#include "layouts/NameTag.h"
|
|
|
|
#include "actors/PuppetActor.h"
|
|
#include "al/layout/LayoutActor.h"
|
|
#include "al/util.hpp"
|
|
#include "al/util/NerveUtil.h"
|
|
#include "logger.hpp"
|
|
#include "sead/math/seadVector.h"
|
|
|
|
NameTag::NameTag(PuppetActor* pupActor, const al::LayoutInitInfo& initInfo, float startDist,
|
|
float endDist, const char *playerName)
|
|
: al::LayoutActor("PNameTag"), mPuppet(pupActor), mStartDist(startDist), mEndDist(endDist) {
|
|
|
|
al::initLayoutActor(this, initInfo, "BalloonSpeak", 0);
|
|
|
|
mPaneName = "TxtMessage";
|
|
|
|
al::setPaneStringFormat(this, mPaneName, playerName);
|
|
|
|
initNerve(&nrvNameTagWait, 0);
|
|
|
|
end();
|
|
}
|
|
|
|
void NameTag::appear() {
|
|
if (!al::isNerve(this, &nrvNameTagEnd) && !al::isNerve(this, &nrvNameTagHide) && mIsAlive) {
|
|
LayoutActor::appear();
|
|
al::startFreezeActionEnd(this, "End", 0);
|
|
al::setNerve(this, &nrvNameTagHide);
|
|
return;
|
|
}
|
|
|
|
if (!isNearPlayerActor(mStartDist)) {
|
|
LayoutActor::appear();
|
|
al::startFreezeActionEnd(this, "End", 0);
|
|
al::setNerve(this, &nrvNameTagHide);
|
|
return;
|
|
}
|
|
|
|
setText(mPuppet->getPuppetName());
|
|
|
|
al::startAction(this, "Appear", 0);
|
|
LayoutActor::appear();
|
|
al::setActionFrameRate(this, 1.0, 0);
|
|
al::setNerve(this, &nrvNameTagAppear);
|
|
}
|
|
|
|
void NameTag::control() {
|
|
|
|
update();
|
|
|
|
al::LiveActor *puppetModel = mPuppet->getCurrentModel();
|
|
|
|
if (!al::isNerve(this, &nrvNameTagEnd) &&
|
|
!al::isNerve(this, &nrvNameTagHide) &&
|
|
(al::isClipped(puppetModel) || al::isDead(puppetModel))) {
|
|
al::setNerve(this, &nrvNameTagEnd);
|
|
} else {
|
|
updateTrans();
|
|
}
|
|
}
|
|
|
|
void NameTag::updateTrans() {
|
|
sead::Vector2f newTrans = sead::Vector2f::zero;
|
|
|
|
sead::Vector3f targetOffset(0, 130, 0);
|
|
|
|
al::LiveActor *puppetModel = mPuppet->getCurrentModel();
|
|
|
|
al::calcLayoutPosFromWorldPos(&newTrans, puppetModel, al::getTrans(puppetModel) + targetOffset);
|
|
|
|
al::setLocalTrans(this, newTrans);
|
|
|
|
mNormalizedDist =
|
|
1 - al::normalize(al::calcDistance(puppetModel, al::getPlayerActor(puppetModel, 0)), 200.0f,
|
|
mEndDist);
|
|
|
|
al::setLocalScale(this, mNormalizedDist);
|
|
|
|
}
|
|
|
|
void NameTag::update() {
|
|
|
|
if (al::isNerve(this, &nrvNameTagEnd) || al::isNerve(this, &nrvNameTagHide) || !mIsAlive) {
|
|
if (isNearPlayerActor(mStartDist)) {
|
|
appear();
|
|
}
|
|
}
|
|
|
|
if (!al::isNerve(this, &nrvNameTagEnd) && !al::isNerve(this, &nrvNameTagHide) &&
|
|
mIsAlive) {
|
|
if (!isNearPlayerActor(mEndDist)) {
|
|
al::setNerve(this, &nrvNameTagEnd);
|
|
}
|
|
}
|
|
}
|
|
|
|
void NameTag::end() {
|
|
if (!al::isNerve(this, &nrvNameTagEnd) && !al::isNerve(this, &nrvNameTagHide)) {
|
|
al::setNerve(this, &nrvNameTagEnd);
|
|
}
|
|
}
|
|
|
|
void NameTag::setText(const char* text) {
|
|
al::setPaneStringFormat(this, mPaneName, text);
|
|
}
|
|
|
|
bool NameTag::isNearPlayerActor(float dist) const {
|
|
return al::isNearPlayer(mPuppet->getCurrentModel(), dist);
|
|
}
|
|
|
|
bool NameTag::isVisible() const {
|
|
return isNearPlayerActor(mStartDist);
|
|
}
|
|
|
|
const char* NameTag::getCurrentState() {
|
|
if (al::isNerve(this, &nrvNameTagAppear)) {
|
|
return "Appear";
|
|
}
|
|
if (al::isNerve(this, &nrvNameTagWait)) {
|
|
return "Wait";
|
|
}
|
|
if (al::isNerve(this, &nrvNameTagEnd)) {
|
|
return "End";
|
|
}
|
|
if (al::isNerve(this, &nrvNameTagHide)) {
|
|
return "Hide";
|
|
}
|
|
return "Unknown";
|
|
}
|
|
|
|
void NameTag::exeAppear(void) {
|
|
if (al::isActionEnd(this, 0))
|
|
al::setNerve(this, &nrvNameTagWait);
|
|
}
|
|
void NameTag::exeWait(void) {
|
|
if (al::isFirstStep(this))
|
|
al::startAction(this, "Wait", 0);
|
|
}
|
|
void NameTag::exeEnd(void) {
|
|
if (al::isFirstStep(this))
|
|
al::startAction(this, "End", 0);
|
|
|
|
if (al::isActionEnd(this, 0))
|
|
al::setNerve(this, &nrvNameTagHide);
|
|
}
|
|
|
|
void NameTag::exeHide(void) { }
|
|
|
|
|
|
namespace {
|
|
NERVE_IMPL(NameTag, Appear)
|
|
NERVE_IMPL(NameTag, Wait)
|
|
NERVE_IMPL(NameTag, End)
|
|
NERVE_IMPL(NameTag, Hide)
|
|
} |