mirror of
https://github.com/zeldaret/ss
synced 2026-05-24 07:10:53 -04:00
245 lines
5.9 KiB
C++
245 lines
5.9 KiB
C++
|
|
|
|
#include "d/lyt/d_lyt_common_a_btn.h"
|
|
|
|
#include "common.h"
|
|
#include "d/d_sys.h"
|
|
#include "d/lyt/d2d.h"
|
|
#include "d/snd/d_snd_small_effect_mgr.h"
|
|
|
|
static const d2d::LytBrlanMapping brlanMap[] = {
|
|
{ "aBtn_00_in.brlan", "G_inOut_00"},
|
|
{ "aBtn_00_loop.brlan", "G_loopBtn_00"},
|
|
{"aBtn_00_decide.brlan", "G_decide_00"},
|
|
{ "aBtn_00_out.brlan", "G_inOut_00"},
|
|
};
|
|
|
|
#define A_BTN_ANIM_IN 0
|
|
#define A_BTN_ANIM_LOOP 1
|
|
#define A_BTN_ANIM_DECIDE 2
|
|
#define A_BTN_ANIM_OUT 3
|
|
|
|
#define A_BTN_NUM_ANIMS 4
|
|
|
|
const dLytCommonABtn_c::executeFunc dLytCommonABtn_c::sExecuteFuncs[4] = {
|
|
&dLytCommonABtn_c::executeStateInvisible,
|
|
&dLytCommonABtn_c::executeStateIn,
|
|
&dLytCommonABtn_c::executeStateVisible,
|
|
&dLytCommonABtn_c::executeStateDecideOut,
|
|
};
|
|
|
|
bool dLytCommonABtn_c::build(d2d::ResAccIf_c *resAcc) {
|
|
mLyt.setResAcc(resAcc);
|
|
mLyt.build("aBtn_00.brlyt", nullptr);
|
|
|
|
for (int i = 0; i < A_BTN_NUM_ANIMS; i++) {
|
|
mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName);
|
|
}
|
|
|
|
resetToInvisble();
|
|
setSoundVariant(VARIANT_NORMAL);
|
|
return true;
|
|
}
|
|
|
|
bool dLytCommonABtn_c::remove() {
|
|
for (int i = 0; i < A_BTN_NUM_ANIMS; i++) {
|
|
mAnm[i].remove();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool dLytCommonABtn_c::execute() {
|
|
runExecuteFunc();
|
|
if (mState == STATE_INVISIBLE) {
|
|
return true;
|
|
}
|
|
mLyt.calc();
|
|
return true;
|
|
}
|
|
|
|
bool dLytCommonABtn_c::requestIn() {
|
|
if (mState != STATE_INVISIBLE) {
|
|
return false;
|
|
}
|
|
mInRequested = true;
|
|
return true;
|
|
}
|
|
|
|
bool dLytCommonABtn_c::requestOut(bool b) {
|
|
if (mState != STATE_VISIBLE) {
|
|
return false;
|
|
}
|
|
mOutRequested = true;
|
|
field_0x1AC = b;
|
|
return true;
|
|
}
|
|
|
|
void dLytCommonABtn_c::resetToInvisble() {
|
|
gotoStateInvisible();
|
|
}
|
|
|
|
void dLytCommonABtn_c::setSoundVariant(SoundVariant value) {
|
|
mSoundVariant = value;
|
|
}
|
|
|
|
void dLytCommonABtn_c::runExecuteFunc() {
|
|
executeFunc fn = sExecuteFuncs[mState];
|
|
if (fn != nullptr) {
|
|
(this->*fn)();
|
|
}
|
|
}
|
|
|
|
void dLytCommonABtn_c::gotoStateInvisible() {
|
|
setState(STATE_INVISIBLE);
|
|
mLyt.unbindAnims();
|
|
|
|
d2d::AnmGroup_c &inAnim = mAnm[A_BTN_ANIM_IN];
|
|
field_0x1A8 = 0;
|
|
mInRequested = false;
|
|
mOutRequested = false;
|
|
mIsDoneOut = false;
|
|
field_0x1AC = 0;
|
|
mNoDecide = false;
|
|
|
|
inAnim.bind(false);
|
|
inAnim.setAnimEnable(true);
|
|
inAnim.setFrame(0.0f);
|
|
if (dSys_c::getFrameRate() == 1) {
|
|
inAnim.setRate(0.5f);
|
|
} else {
|
|
inAnim.setRate(1.0f);
|
|
}
|
|
mLyt.calc();
|
|
}
|
|
|
|
void dLytCommonABtn_c::executeStateInvisible() {
|
|
if (mInRequested != true) {
|
|
return;
|
|
}
|
|
|
|
if (field_0x1AC == 1) {
|
|
gotoStateInvisible();
|
|
}
|
|
mInRequested = false;
|
|
field_0x1A8 = 1;
|
|
gotoStateIn();
|
|
}
|
|
|
|
void dLytCommonABtn_c::gotoStateIn() {
|
|
setState(STATE_IN);
|
|
}
|
|
|
|
void dLytCommonABtn_c::executeStateIn() {
|
|
d2d::AnmGroup_c &anm = mAnm[A_BTN_ANIM_IN];
|
|
if (anm.isEndReached() == true) {
|
|
goToStateVisible();
|
|
} else {
|
|
anm.play();
|
|
}
|
|
}
|
|
|
|
void dLytCommonABtn_c::goToStateVisible() {
|
|
setState(STATE_VISIBLE);
|
|
mAnm[A_BTN_ANIM_IN].unbind();
|
|
d2d::AnmGroup_c &anm = mAnm[A_BTN_ANIM_LOOP];
|
|
anm.bind(false);
|
|
anm.setFrame(0.0f);
|
|
if (dSys_c::getFrameRate() == 1) {
|
|
anm.setRate(0.5f);
|
|
} else {
|
|
anm.setRate(1.0f);
|
|
}
|
|
}
|
|
|
|
void dLytCommonABtn_c::executeStateVisible() {
|
|
if (mOutRequested == true) {
|
|
goToStateDecideOut();
|
|
mOutRequested = false;
|
|
} else {
|
|
d2d::AnmGroup_c &anm = mAnm[A_BTN_ANIM_LOOP];
|
|
anm.play();
|
|
}
|
|
}
|
|
|
|
void dLytCommonABtn_c::goToStateDecideOut() {
|
|
setState(STATE_OUT);
|
|
mAnm[A_BTN_ANIM_LOOP].unbind();
|
|
if (mNoDecide == true) {
|
|
mNoDecide = false;
|
|
d2d::AnmGroup_c &anm = mAnm[A_BTN_ANIM_OUT];
|
|
anm.bind(false);
|
|
anm.setFrame(0.0f);
|
|
if (dSys_c::getFrameRate() == 1) {
|
|
anm.setRate(0.5f);
|
|
} else {
|
|
anm.setRate(1.0f);
|
|
}
|
|
mOutState = OUT_STATE_OUT;
|
|
} else {
|
|
d2d::AnmGroup_c &anm = mAnm[A_BTN_ANIM_DECIDE];
|
|
anm.bind(false);
|
|
anm.setAnimEnable(true);
|
|
anm.setFrame(0.0f);
|
|
if (dSys_c::getFrameRate() == 1) {
|
|
anm.setRate(0.5f);
|
|
} else {
|
|
anm.setRate(1.0f);
|
|
}
|
|
if (mSoundVariant == VARIANT_NORMAL) {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_WINDOW_PRESS_A);
|
|
} else {
|
|
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_TITLE_PRESS_START);
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytCommonABtn_c::executeStateDecideOut() {
|
|
d2d::AnmGroup_c &decideAnm = mAnm[A_BTN_ANIM_DECIDE];
|
|
switch (mOutState) {
|
|
case OUT_STATE_DECIDING: {
|
|
if (decideAnm.isEndReached() == true) {
|
|
mOutState = OUT_STATE_GOTO_OUT;
|
|
if (field_0x1AC == 1) {
|
|
mIsDoneOut = true;
|
|
setState(STATE_INVISIBLE);
|
|
break;
|
|
}
|
|
}
|
|
decideAnm.play();
|
|
break;
|
|
}
|
|
case OUT_STATE_GOTO_OUT: {
|
|
decideAnm.unbind();
|
|
d2d::AnmGroup_c &anmOut = mAnm[A_BTN_ANIM_OUT];
|
|
anmOut.bind(false);
|
|
anmOut.setAnimEnable(true);
|
|
anmOut.setFrame(0.0f);
|
|
if (dSys_c::getFrameRate() == 1) {
|
|
anmOut.setRate(0.5f);
|
|
} else {
|
|
anmOut.setRate(1.0f);
|
|
}
|
|
mOutState = OUT_STATE_OUT;
|
|
break;
|
|
}
|
|
case OUT_STATE_OUT: {
|
|
d2d::AnmGroup_c &anmOut = mAnm[A_BTN_ANIM_OUT];
|
|
if (anmOut.isEndReached() == true) {
|
|
mOutState = OUT_STATE_GOTO_INVISIBLE;
|
|
mIsDoneOut = true;
|
|
}
|
|
anmOut.play();
|
|
break;
|
|
}
|
|
case OUT_STATE_GOTO_INVISIBLE: {
|
|
gotoStateInvisible();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void dLytCommonABtn_c::setState(ABtnState state) {
|
|
mState = state;
|
|
mOutState = OUT_STATE_DECIDING;
|
|
}
|