SuperMarioOdysseyOnline/source/layouts/NameTag.cpp

156 lines
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->getName());
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)
}