Files
ss/src/d/lyt/d_lyt_common_a_btn.cpp
T
2025-07-27 16:45:04 +02:00

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;
}