mirror of
https://github.com/zeldaret/ss
synced 2026-06-11 13:10:11 -04:00
218 lines
5.9 KiB
C++
218 lines
5.9 KiB
C++
#include "d/lyt/d_lyt_note.h"
|
|
|
|
#include "common.h"
|
|
#include "m/m_mtx.h"
|
|
#include "nw4r/lyt/lyt_pane.h"
|
|
#include "nw4r/math/math_types.h"
|
|
|
|
STATE_DEFINE(dLytNote_c, Wait);
|
|
STATE_DEFINE(dLytNote_c, In);
|
|
STATE_DEFINE(dLytNote_c, Move);
|
|
STATE_DEFINE(dLytNote_c, Out);
|
|
|
|
static const d2d::LytBrlanMapping brlanMap[] = {
|
|
{ "suiryuScore_00_noteGet.brlan", "G_mark_00"},
|
|
{ "suiryuScore_00_noteGetLoop.brlan", "G_mark_00"},
|
|
{"suiryuScore_00_noteLostLoop.brlan", "G_mark_00"},
|
|
{ "suiryuScore_00_noteLost.brlan", "G_mark_00"},
|
|
{ "suiryuScore_00_noteFix.brlan", "G_mark_00"},
|
|
{ "suiryuScore_00_noteColor.brlan", "G_color_00"},
|
|
};
|
|
|
|
#define NOTE_ANIM_GET 0
|
|
#define NOTE_ANIM_GET_LOOP 1
|
|
#define NOTE_ANIM_LOST_LOOP 2
|
|
#define NOTE_ANIM_LOST 3
|
|
#define NOTE_ANIM_FIX 4
|
|
#define NOTE_ANIM_COLOR 5
|
|
#define NOTE_ANIM_INVALID 6
|
|
|
|
void dLytNote_c::initializeState_Wait() {
|
|
field_0x273 = 0;
|
|
}
|
|
|
|
void dLytNote_c::executeState_Wait() {
|
|
if (field_0x270 != 0) {
|
|
mStateMgr.changeState(StateID_In);
|
|
}
|
|
}
|
|
|
|
void dLytNote_c::finalizeState_Wait() {}
|
|
|
|
void dLytNote_c::initializeState_In() {
|
|
field_0x274 = 0;
|
|
mpPane->SetVisible(true);
|
|
mAnmGroups[NOTE_ANIM_GET].setAnimEnable(true);
|
|
mAnmGroups[NOTE_ANIM_GET].setFrame(0.0f);
|
|
}
|
|
|
|
void dLytNote_c::executeState_In() {
|
|
if (field_0x270 == 0) {
|
|
mAnmGroups[NOTE_ANIM_GET].setToEnd();
|
|
mAnmGroups[NOTE_ANIM_GET].setAnimEnable(false);
|
|
mStateMgr.changeState(StateID_Out);
|
|
} else if (mAnmGroups[NOTE_ANIM_GET].isEndReached()) {
|
|
mAnmGroups[NOTE_ANIM_GET].setAnimEnable(false);
|
|
field_0x260 = 0.0f;
|
|
mInAnim = NOTE_ANIM_GET_LOOP;
|
|
mAnmGroups[mInAnim].setAnimEnable(true);
|
|
mAnmGroups[mInAnim].setFrame(0.0f);
|
|
mStateMgr.changeState(StateID_Move);
|
|
}
|
|
|
|
if (mAnmGroups[NOTE_ANIM_GET].isFlag2()) {
|
|
mAnmGroups[NOTE_ANIM_GET].play();
|
|
}
|
|
}
|
|
|
|
void dLytNote_c::finalizeState_In() {}
|
|
|
|
void dLytNote_c::initializeState_Move() {
|
|
field_0x273 = 1;
|
|
}
|
|
|
|
void dLytNote_c::executeState_Move() {
|
|
if (field_0x270 == 0) {
|
|
mAnmGroups[mInAnim].setAnimEnable(false);
|
|
mStateMgr.changeState(StateID_Out);
|
|
} else if (field_0x272 != 0 && mInAnim == NOTE_ANIM_GET_LOOP) {
|
|
mAnmGroups[mInAnim].setAnimEnable(false);
|
|
field_0x260 = 0.0f;
|
|
mInAnim = NOTE_ANIM_LOST_LOOP;
|
|
// Maybe an inline?
|
|
f32 progress = mAnmGroups[mInAnim].getEndFrameRaw();
|
|
f32 nul = 0.0f;
|
|
if (nul >= progress) {
|
|
field_0x260 = nul - progress;
|
|
}
|
|
mAnmGroups[mInAnim].setFrame(field_0x260);
|
|
mAnmGroups[mInAnim].setAnimEnable(true);
|
|
} else {
|
|
if (field_0x272 == 0 && mInAnim == NOTE_ANIM_LOST_LOOP) {
|
|
mAnmGroups[mInAnim].setAnimEnable(false);
|
|
field_0x260 = 0.0f;
|
|
mInAnim = NOTE_ANIM_GET_LOOP;
|
|
// Maybe an inline?
|
|
f32 progress = mAnmGroups[mInAnim].getEndFrameRaw();
|
|
f32 nul = 0.0f;
|
|
if (nul >= progress) {
|
|
field_0x260 = nul - progress;
|
|
}
|
|
mAnmGroups[mInAnim].setFrame(field_0x260);
|
|
mAnmGroups[mInAnim].setAnimEnable(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytNote_c::finalizeState_Move() {}
|
|
|
|
void dLytNote_c::initializeState_Out() {
|
|
mInAnim = NOTE_ANIM_INVALID;
|
|
field_0x273 = 0;
|
|
if (field_0x271) {
|
|
mOutAnim = NOTE_ANIM_FIX;
|
|
} else {
|
|
mOutAnim = NOTE_ANIM_LOST;
|
|
}
|
|
mAnmGroups[mOutAnim].setAnimEnable(true);
|
|
mAnmGroups[mOutAnim].setFrame(0.0f);
|
|
}
|
|
|
|
void dLytNote_c::executeState_Out() {
|
|
if (field_0x274 != 0) {
|
|
mAnmGroups[mOutAnim].setToEnd();
|
|
}
|
|
|
|
if (mAnmGroups[mOutAnim].isEndReached()) {
|
|
mAnmGroups[mOutAnim].setAnimEnable(false);
|
|
mpPane->SetVisible(false);
|
|
mStateMgr.changeState(StateID_Wait);
|
|
}
|
|
|
|
if (mAnmGroups[mOutAnim].isFlag2()) {
|
|
mAnmGroups[mOutAnim].play();
|
|
}
|
|
}
|
|
|
|
void dLytNote_c::finalizeState_Out() {}
|
|
|
|
bool dLytNote_c::build(d2d::ResAccIf_c *resAcc) {
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("suiryuScore_00.brlyt", nullptr);
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
mAnmGroups[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName);
|
|
mAnmGroups[i].setDirection(false);
|
|
mAnmGroups[i].setAnimEnable(false);
|
|
}
|
|
|
|
mAnmGroups[NOTE_ANIM_COLOR].setAnimEnable(true);
|
|
static const char *sPaneName = "N_inOutAll_00";
|
|
mpPane = mLyt.findPane(sPaneName);
|
|
mpPane->SetVisible(false);
|
|
const nw4r::math::VEC3 &translate = mpPane->GetTranslate();
|
|
mTranslate.copyFrom(translate);
|
|
mInAnim = NOTE_ANIM_INVALID;
|
|
mOutAnim = NOTE_ANIM_FIX;
|
|
field_0x260 = 0.0f;
|
|
field_0x270 = 0;
|
|
field_0x271 = 0;
|
|
field_0x272 = 0;
|
|
field_0x273 = 0;
|
|
field_0x274 = 0;
|
|
field_0x26C = 0;
|
|
mStateMgr.changeState(StateID_Wait);
|
|
return true;
|
|
}
|
|
|
|
bool dLytNote_c::remove() {
|
|
for (int i = 0; i < 6; i++) {
|
|
// @bug? .unbind call is missing
|
|
mAnmGroups[i].afterUnbind();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void dLytNote_c::execute(u8 alpha) {
|
|
mStateMgr.executeState();
|
|
if (*mStateMgr.getStateID() != StateID_Wait) {
|
|
mpPane->SetTranslate(mTranslate);
|
|
mAnmGroups[NOTE_ANIM_COLOR].setFrame(field_0x26C);
|
|
mpPane->SetAlpha(alpha);
|
|
mLyt.calc();
|
|
}
|
|
|
|
if (mInAnim != NOTE_ANIM_INVALID) {
|
|
field_0x260 += 1.0f;
|
|
f32 nextFrame = mAnmGroups[mInAnim].getEndFrameRaw();
|
|
if (field_0x260 >= nextFrame) {
|
|
field_0x260 -= nextFrame;
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytNote_c::draw() {
|
|
mLyt.addToDrawList();
|
|
}
|
|
|
|
void dLytNote_c::setTransform(nw4r::lyt::Pane &p) {
|
|
// Cool, full on struct copy here
|
|
nw4r::math::MTX34 myMtx = p.GetGlobalMtx();
|
|
mTranslate.x = myMtx.m[0][3];
|
|
mTranslate.y = myMtx.m[1][3];
|
|
mTranslate.z = 0.0f;
|
|
}
|
|
|
|
f32 dLytNote_c::getField0x260() const {
|
|
return field_0x260;
|
|
}
|
|
|
|
void dLytNote_c::setFrame(f32 arg) {
|
|
if (mInAnim != 6) {
|
|
field_0x260 = arg;
|
|
// ???
|
|
f32 newArg = (f64)arg;
|
|
mAnmGroups[mInAnim].setFrame(newArg);
|
|
}
|
|
}
|