Files
ss/src/d/lyt/d_lyt_mini_game.cpp
T
robojumper 22cff3e05d 95%
2025-12-04 22:50:16 +01:00

4230 lines
120 KiB
C++

#include "d/lyt/d_lyt_mini_game.h"
#include "common.h"
#include "d/a/d_a_item.h"
#include "d/a/d_a_itembase.h"
#include "d/d_lang.h"
#include "d/d_message.h"
#include "d/d_rawarchive.h"
#include "d/d_sc_game.h"
#include "d/d_stage_mgr.h"
#include "d/lyt/d2d.h"
#include "d/lyt/meter/d_lyt_meter.h"
#include "d/snd/d_snd_small_effect_mgr.h"
#include "d/snd/d_snd_wzsound.h"
#include "f/f_base.h"
#include "m/m_vec.h"
#include "nw4r/lyt/lyt_pane.h"
#include "nw4r/lyt/lyt_types.h"
#include "nw4r/math/math_arithmetic.h"
#include "nw4r/math/math_types.h"
#include "toBeSorted/arc_managers/layout_arc_manager.h"
#include "toBeSorted/d_d3d.h"
#include "toBeSorted/event_manager.h"
#include "toBeSorted/minigame_mgr.h"
dLytMiniGamePumpkin_c *dLytMiniGamePumpkin_c::sInstance;
dLytMiniGameBugs_c *dLytMiniGameBugs_c::sInstance;
dLytMiniGameTime_c *dLytMiniGameTime_c::sInstance;
dLytMiniGameStart_c *dLytMiniGameStart_c::sInstance;
dLytMiniGameScore_c *dLytMiniGameScore_c::sInstance;
dLytMiniGameScoreSd_c *dLytMiniGameScoreSd_c::sInstance;
dLytMiniGame_c *dLytMiniGame_c::sInstance;
static const d2d::LytBrlanMapping brlanMapPumpkin[] = {
{ "miniGamePumpkin_00_getPoint.brlan", "G_scoreAll_00"},
{ "miniGamePumpkin_00_doubleScore.brlan", "G_doubleScore_00"},
{"miniGamePumpkin_00_scorePattern.brlan", "G_pattern_00"},
};
#define PUMPKIN_ANIM_GET_POINT 0
#define PUMPKIN_ANIM_DOUBLE_SCORE 1
#define PUMPKIN_ANIM_PATTERN 2
#define PUMPKIN_NUM_ANIMS 3
bool dLytMiniGamePumpkinParts_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("miniGamePumpkin_00.brlyt", nullptr);
for (int i = 0; i < PUMPKIN_NUM_ANIMS; i++) {
mAnm[i].init(brlanMapPumpkin[i].mFile, resAcc, mLyt.getLayout(), brlanMapPumpkin[i].mName);
mAnm[i].bind(false);
mAnm[i].setRate(1.0f);
}
mPumpkinWorldPos.set(0.0f, 0.0f, 0.0f);
mPumpkinScreenPos.set(0.0f, 0.0f, 0.0f);
field_0x170.set(0.0f, 0.0f);
return true;
}
bool dLytMiniGamePumpkinParts_c::remove() {
for (int i = 0; i < PUMPKIN_NUM_ANIMS; i++) {
mAnm[i].unbind();
mAnm[i].remove();
}
return true;
}
bool dLytMiniGamePumpkinParts_c::execute() {
if (mAnm[PUMPKIN_ANIM_GET_POINT].isEnabled() && mAnm[PUMPKIN_ANIM_GET_POINT].isStop2()) {
mAnm[PUMPKIN_ANIM_GET_POINT].setAnimEnable(false);
field_0x154 = false;
}
if (mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].isEnabled() && mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].isStop2()) {
mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setAnimEnable(false);
mHasPlayedDoubleScoreSound = false;
}
if (mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].isEnabled() && 20.0f <= mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].getFrame() &&
!mHasPlayedDoubleScoreSound) {
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MG_PUMP_SHOT_DOUBLE);
mHasPlayedDoubleScoreSound = true;
}
for (int i = 0; i < PUMPKIN_NUM_ANIMS; i++) {
if (mAnm[i].isEnabled()) {
mAnm[i].play();
}
}
if (field_0x154) {
d3d::worldToScreen(mPumpkinScreenPos, mPumpkinWorldPos);
mVec3_c tmp = mPumpkinScreenPos;
tmp.z = 0.0f;
field_0x170.set(tmp.x, tmp.y);
mLyt.getLayout()->GetRootPane()->SetTranslate(tmp);
}
mLyt.calc();
return true;
}
bool dLytMiniGamePumpkinParts_c::draw() {
mLyt.addToDrawList();
return true;
}
void dLytMiniGamePumpkinParts_c::init() {
resetPattern();
resetDoubleScore();
resetGetPoint();
mAnm[PUMPKIN_ANIM_GET_POINT].setToStart();
mAnm[PUMPKIN_ANIM_GET_POINT].setAnimEnable(true);
mLyt.calc();
mAnm[PUMPKIN_ANIM_GET_POINT].setAnimEnable(false);
}
void dLytMiniGamePumpkinParts_c::setPumpkinPos(const mVec3_c &pos) {
mPumpkinWorldPos = pos;
d3d::worldToScreen(mPumpkinScreenPos, mPumpkinWorldPos);
mVec3_c tmp = mPumpkinScreenPos;
tmp.z = 0.0f;
field_0x170.set(tmp.x, tmp.y);
mLyt.getLayout()->GetRootPane()->SetTranslate(tmp);
mLyt.calc();
}
void dLytMiniGamePumpkinParts_c::getPoint(u8 combo, bool doubleScore) {
startGetPoint();
setPattern(combo);
if (doubleScore) {
startDoubleScore();
} else {
stopDoubleScore();
}
field_0x154 = true;
}
bool dLytMiniGamePumpkinParts_c::isActive() const {
return mAnm[PUMPKIN_ANIM_GET_POINT].isEnabled() || mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].isEnabled();
}
void dLytMiniGamePumpkinParts_c::startGetPoint() {
mAnm[PUMPKIN_ANIM_GET_POINT].setToStart();
mAnm[PUMPKIN_ANIM_GET_POINT].setAnimEnable(true);
}
void dLytMiniGamePumpkinParts_c::startDoubleScore() {
mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setToStart();
mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setAnimEnable(true);
}
void dLytMiniGamePumpkinParts_c::stopDoubleScore() {
mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setAnimEnable(false);
}
void dLytMiniGamePumpkinParts_c::resetGetPoint() {
mAnm[PUMPKIN_ANIM_GET_POINT].setForwardOnce();
mAnm[PUMPKIN_ANIM_GET_POINT].setToStart();
mAnm[PUMPKIN_ANIM_GET_POINT].setAnimEnable(false);
}
void dLytMiniGamePumpkinParts_c::resetDoubleScore() {
mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setForwardOnce();
mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setToStart();
mAnm[PUMPKIN_ANIM_DOUBLE_SCORE].setAnimEnable(false);
}
void dLytMiniGamePumpkinParts_c::resetPattern() {
mAnm[PUMPKIN_ANIM_PATTERN].setForwardOnce();
mAnm[PUMPKIN_ANIM_PATTERN].setFrame(0.0f);
mAnm[PUMPKIN_ANIM_PATTERN].setRate(0.0f);
mAnm[PUMPKIN_ANIM_PATTERN].setAnimEnable(false);
}
void dLytMiniGamePumpkinParts_c::setPattern(s32 pat) {
u32 frame = 0;
switch (pat) {
case 0:
frame = 0;
dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(10);
break;
case 1:
frame = 1;
dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(20);
break;
case 2:
frame = 2;
dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(30);
break;
case 3:
frame = 3;
dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(40);
break;
case 4:
frame = 4;
dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(50);
break;
}
mAnm[PUMPKIN_ANIM_PATTERN].setFrame(frame);
mAnm[PUMPKIN_ANIM_PATTERN].setAnimEnable(true);
mLyt.calc();
mAnm[PUMPKIN_ANIM_PATTERN].setAnimEnable(false);
}
bool dLytMiniGamePumpkin_c::build(d2d::ResAccIf_c *resAcc) {
for (int i = 0; i < (int)ARRAY_LENGTH(mParts); i++) {
mParts[i].build(resAcc);
}
sInstance = this;
return true;
}
bool dLytMiniGamePumpkin_c::remove() {
if (sInstance == nullptr) {
return true;
}
for (int i = 0; i < (int)ARRAY_LENGTH(mParts); i++) {
mParts[i].remove();
}
sInstance = nullptr;
return true;
}
bool dLytMiniGamePumpkin_c::execute() {
if (sInstance == nullptr) {
return true;
}
for (int i = 0; i < (int)ARRAY_LENGTH(mParts); i++) {
mParts[i].execute();
}
return true;
}
bool dLytMiniGamePumpkin_c::draw() {
if (sInstance == nullptr) {
return true;
}
for (int i = 0; i < (int)ARRAY_LENGTH(mParts); i++) {
mParts[i].draw();
}
return true;
}
void dLytMiniGamePumpkin_c::init() {
if (sInstance == nullptr) {
return;
}
for (int i = 0; i < (int)ARRAY_LENGTH(mParts); i++) {
mParts[i].init();
}
return;
}
void dLytMiniGamePumpkin_c::getPoint(const mVec3_c &pumpkinPos, s32 unk, bool doubleScore) {
if (sInstance == nullptr) {
return;
}
calcCombo(unk);
for (int i = 0; i < (int)ARRAY_LENGTH(mParts); i++) {
if (!mParts[i].isActive()) {
mParts[i].setPumpkinPos(pumpkinPos);
mParts[i].getPoint(mCombo, doubleScore);
return;
}
}
}
void dLytMiniGamePumpkin_c::calcCombo(s32 unk) {
if (unk < field_0x478) {
mCombo = 0;
} else if (field_0x478 < unk) {
mCombo++;
}
if (mCombo >= 5) {
mCombo = 4;
}
field_0x478 = unk;
}
static const d2d::LytBrlanMapping brlanMapBugs[] = {
{ "miniGameBugs_00_alphaIn.brlan", "G_inOut_00"},
{ "miniGameBugs_00_in.brlan", "G_bugIcon_00"},
{ "miniGameBugs_00_in.brlan", "G_bugIcon_01"},
{ "miniGameBugs_00_in.brlan", "G_bugIcon_02"},
{ "miniGameBugs_00_in.brlan", "G_bugIcon_03"},
{ "miniGameBugs_00_in.brlan", "G_bugIcon_04"},
{ "miniGameBugs_00_in.brlan", "G_bugIcon_05"},
{ "miniGameBugs_00_in.brlan", "G_bugIcon_06"},
{ "miniGameBugs_00_in.brlan", "G_bugIcon_07"},
{ "miniGameBugs_00_in.brlan", "G_bugIcon_08"},
{ "miniGameBugs_00_in.brlan", "G_bugIcon_09"},
{ "miniGameBugs_00_iconOn.brlan", "G_bugIcon_00"},
{ "miniGameBugs_00_iconOn.brlan", "G_bugIcon_01"},
{ "miniGameBugs_00_iconOn.brlan", "G_bugIcon_02"},
{ "miniGameBugs_00_iconOn.brlan", "G_bugIcon_03"},
{ "miniGameBugs_00_iconOn.brlan", "G_bugIcon_04"},
{ "miniGameBugs_00_iconOn.brlan", "G_bugIcon_05"},
{ "miniGameBugs_00_iconOn.brlan", "G_bugIcon_06"},
{ "miniGameBugs_00_iconOn.brlan", "G_bugIcon_07"},
{ "miniGameBugs_00_iconOn.brlan", "G_bugIcon_08"},
{ "miniGameBugs_00_iconOn.brlan", "G_bugIcon_09"},
{ "miniGameBugs_00_bugs.brlan", "G_texAnim_00"},
{ "miniGameBugs_00_bugs.brlan", "G_texAnim_01"},
{ "miniGameBugs_00_bugs.brlan", "G_texAnim_02"},
{ "miniGameBugs_00_bugs.brlan", "G_texAnim_03"},
{ "miniGameBugs_00_bugs.brlan", "G_texAnim_04"},
{ "miniGameBugs_00_bugs.brlan", "G_texAnim_05"},
{ "miniGameBugs_00_bugs.brlan", "G_texAnim_06"},
{ "miniGameBugs_00_bugs.brlan", "G_texAnim_07"},
{ "miniGameBugs_00_bugs.brlan", "G_texAnim_08"},
{ "miniGameBugs_00_bugs.brlan", "G_texAnim_09"},
{"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_00"},
{"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_01"},
{"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_02"},
{"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_03"},
{"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_04"},
{"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_05"},
{"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_06"},
{"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_07"},
{"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_08"},
{"miniGameBugs_00_iconFlash.brlan", "G_bugIcon_09"},
{ "miniGameBugs_00_alphaOut.brlan", "G_inOut_00"},
};
#define BUGS_ANIM_IN 0
#define BUGS_ANIM_ICON_IN_OFFSET 1
#define BUGS_ANIM_ICON_ON_OFFSET 11
#define BUGS_ANIM_ICON_TEX_ANIM_OFFSET 21
#define BUGS_ANIM_ICON_FLASH_OFFSET 31
#define BUGS_ANIM_OUT 41
#define BUGS_NUM_ANIMS 42
#define BUGS_NUM_BUGS 10
bool dLytMiniGameBugs_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("miniGameBugs_00.brlyt", nullptr);
for (int i = 0; i < BUGS_NUM_ANIMS; i++) {
mAnm[i].init(brlanMapBugs[i].mFile, resAcc, mLyt.getLayout(), brlanMapBugs[i].mName);
mAnm[i].bind(false);
mAnm[i].setRate(1.0f);
}
sInstance = this;
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
mBugCollected[i] = 0;
}
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
mBugItemIds[i] = ITEM_DEKU_HORNET;
}
return true;
}
bool dLytMiniGameBugs_c::remove() {
if (sInstance == nullptr) {
return true;
}
if (isBug0Flashing()) {
stopBugIconsFlash();
}
for (int i = 0; i < BUGS_NUM_ANIMS; i++) {
mAnm[i].unbind();
mAnm[i].remove();
}
sInstance = nullptr;
return true;
}
bool dLytMiniGameBugs_c::execute() {
if (sInstance == nullptr) {
return true;
}
if (areAllBugIconsOn()) {
startBugsFlash();
}
if (isIconInEndReached()) {
stopBugIconsIn();
mBugIconsInEnded = true;
}
if (isInEndReached()) {
stopIn();
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
if (mBugCollected[i] == true) {
collectBug(i);
}
}
}
if (isOutEndReached()) {
stopOut();
}
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
if (isSlotOnEndReached(i)) {
stopBugIconOn(i);
}
}
for (int i = 0; i < BUGS_NUM_ANIMS; i++) {
if (mAnm[i].isEnabled()) {
mAnm[i].play();
}
}
mLyt.calc();
return true;
}
bool dLytMiniGameBugs_c::draw() {
if (sInstance == nullptr) {
return true;
}
mLyt.addToDrawList();
return true;
}
void dLytMiniGameBugs_c::init() {
if (sInstance == nullptr) {
return;
}
switch (mBugsNumLevel) {
case 0: mBugsNum = 5; break;
case 1: mBugsNum = 10; break;
}
resetBugIconsTex();
resetBugIconsOn();
resetBugIconsFlash();
resetIn();
resetOut();
resetBugIconsIn();
}
void dLytMiniGameBugs_c::startAllIconsIn() {
if (sInstance == nullptr) {
return;
}
if (mInTriggered != true) {
for (int i = 0; i < mBugsNum; i++) {
mAnm[i + BUGS_ANIM_ICON_IN_OFFSET].setToStart();
mAnm[i + BUGS_ANIM_ICON_IN_OFFSET].setAnimEnable(true);
}
mInTriggered = true;
field_0xB4B = true;
}
}
void dLytMiniGameBugs_c::startOut() {
if (sInstance == nullptr) {
return;
}
if (mBugIconsInEnded && mInTriggered && field_0xB4B) {
mAnm[BUGS_ANIM_OUT].setToStart();
mAnm[BUGS_ANIM_OUT].setAnimEnable(true);
mInTriggered = false;
field_0xB4B = false;
}
}
void dLytMiniGameBugs_c::startIn() {
if (sInstance == nullptr) {
return;
}
if (mBugIconsInEnded && mInTriggered != true && field_0xB4B) {
mAnm[BUGS_ANIM_IN].setToStart();
mAnm[BUGS_ANIM_IN].setAnimEnable(true);
mInTriggered = true;
}
}
void dLytMiniGameBugs_c::startOutTemp() {
if (sInstance == nullptr) {
return;
}
if (mBugIconsInEnded && mInTriggered) {
mAnm[BUGS_ANIM_OUT].setToStart();
mAnm[BUGS_ANIM_OUT].setAnimEnable(true);
mInTriggered = false;
}
}
void dLytMiniGameBugs_c::collectBug(s32 slot) {
if (sInstance == nullptr) {
return;
}
if (mBugCollected[slot] == false) {
mBugCollected[slot] = true;
if (dAcItem_c::checkTreasureTempCollect(mBugItemIds[slot])) {
field_0xB4C = false;
}
if (field_0xB4C) {
return;
}
}
if (isSlotIconOnEndReached(slot) || isSlotIconOnEnabled(slot)) {
return;
}
mAnm[slot + BUGS_ANIM_ICON_ON_OFFSET].setToStart();
mAnm[slot + BUGS_ANIM_ICON_ON_OFFSET].setAnimEnable(true);
u8 bugsCount = 0;
for (int i = 0; i < mBugsNum; i++) {
if (mBugCollected[i]) {
bugsCount++;
}
}
if (bugsCount != mBugsNum) {
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MG_MUSHITORI_GET);
}
field_0xB4C = true;
}
void dLytMiniGameBugs_c::startBugsFlash() {
if (sInstance == nullptr) {
return;
}
if (!mBugIconsFlashStarted) {
mBugIconsFlashStarted = true;
return;
}
if (!isBug0Flashing()) {
for (int i = 0; i < mBugsNum; i++) {
s32 idx = i + BUGS_ANIM_ICON_FLASH_OFFSET;
mAnm[idx].setToStart();
mAnm[idx].setAnimEnable(true);
}
}
}
// corresponds to BugIndex_e
static const s32 sBugItemIds[] = {
ITEM_DEKU_HORNET, ITEM_BLESSED_BUTTERFLY, ITEM_GERUDO_DRAGONFLY, ITEM_STARRY_FIREFLY,
ITEM_WOODLAND_RHINO_BEETLE, ITEM_VOLCANIC_LADYBUG, ITEM_SAND_CICADA, ITEM_SKY_STAG_BEETLE,
ITEM_FARON_GRASSHOPPER, ITEM_SKYLOFT_MANTIS, ITEM_LANAYRU_ANT, ITEM_ELDIN_ROLLER,
};
void dLytMiniGameBugs_c::setBug(s32 slot, s32 bugIndex) {
if (sInstance == nullptr) {
return;
}
f32 frame = static_cast<float>(bugIndex);
mAnm[slot + BUGS_ANIM_ICON_TEX_ANIM_OFFSET].setFrame(frame);
mAnm[slot + BUGS_ANIM_ICON_TEX_ANIM_OFFSET].setAnimEnable(true);
mLyt.calc();
mAnm[slot + BUGS_ANIM_ICON_TEX_ANIM_OFFSET].setAnimEnable(false);
mBugItemIds[slot] = sBugItemIds[bugIndex];
}
bool dLytMiniGameBugs_c::isSlotIconOnEndReached(s32 slot) const {
if (sInstance == nullptr) {
return false;
}
s32 idx = slot + BUGS_ANIM_ICON_ON_OFFSET;
return mAnm[idx].isEndReached();
}
bool dLytMiniGameBugs_c::isSlotIconOnEnabled(s32 slot) const {
if (sInstance == nullptr) {
return false;
}
s32 idx = slot + BUGS_ANIM_ICON_ON_OFFSET;
return mAnm[idx].isEnabled_();
}
bool dLytMiniGameBugs_c::isSlotBugCollected(s32 slot) const {
if (sInstance == nullptr) {
return false;
}
return mBugCollected[slot] == true;
}
void dLytMiniGameBugs_c::resetBugIconsIn() {
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
s32 idx = i + BUGS_ANIM_ICON_IN_OFFSET;
mAnm[idx].setForwardOnce();
mAnm[idx].setToStart();
mAnm[idx].setAnimEnable(true);
}
mLyt.calc();
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
s32 idx = i + BUGS_ANIM_ICON_IN_OFFSET;
mAnm[idx].setAnimEnable(false);
}
}
void dLytMiniGameBugs_c::resetIn() {
mAnm[BUGS_ANIM_IN].setForwardOnce();
mAnm[BUGS_ANIM_IN].setToStart();
mAnm[BUGS_ANIM_IN].setAnimEnable(true);
mLyt.calc();
mAnm[BUGS_ANIM_IN].setAnimEnable(false);
}
void dLytMiniGameBugs_c::resetOut() {
mAnm[BUGS_ANIM_OUT].setForwardOnce();
mAnm[BUGS_ANIM_OUT].setToStart();
mAnm[BUGS_ANIM_OUT].setAnimEnable(true);
mLyt.calc();
mAnm[BUGS_ANIM_OUT].setAnimEnable(false);
}
void dLytMiniGameBugs_c::resetBugIconsOn() {
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
s32 idx = i + BUGS_ANIM_ICON_ON_OFFSET;
mAnm[idx].setForwardOnce();
mAnm[idx].setToStart();
mAnm[idx].setAnimEnable(true);
}
mLyt.calc();
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
s32 idx = i + BUGS_ANIM_ICON_ON_OFFSET;
mAnm[idx].setAnimEnable(false);
}
}
void dLytMiniGameBugs_c::resetBugIconsTex() {
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
s32 idx = i + BUGS_ANIM_ICON_TEX_ANIM_OFFSET;
mAnm[idx].setForwardOnce();
mAnm[idx].setToStart();
mAnm[idx].setAnimEnable(true);
}
mLyt.calc();
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
s32 idx = i + BUGS_ANIM_ICON_TEX_ANIM_OFFSET;
mAnm[idx].setAnimEnable(false);
}
}
void dLytMiniGameBugs_c::resetBugIconsFlash() {
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
s32 idx = i + BUGS_ANIM_ICON_FLASH_OFFSET;
mAnm[idx].setForwardLoop();
mAnm[idx].setToStart();
mAnm[idx].setAnimEnable(true);
}
mLyt.calc();
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
s32 idx = i + BUGS_ANIM_ICON_FLASH_OFFSET;
mAnm[idx].setAnimEnable(false);
}
}
void dLytMiniGameBugs_c::stopBugIconsIn() {
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
s32 idx = i + BUGS_ANIM_ICON_IN_OFFSET;
mAnm[idx].setAnimEnable(false);
}
}
void dLytMiniGameBugs_c::stopIn() {
mAnm[BUGS_ANIM_IN].setAnimEnable(false);
}
void dLytMiniGameBugs_c::stopOut() {
mAnm[BUGS_ANIM_OUT].setAnimEnable(false);
}
void dLytMiniGameBugs_c::stopBugIconOn(s32 slot) {
mAnm[slot + BUGS_ANIM_ICON_ON_OFFSET].setAnimEnable(false);
}
void dLytMiniGameBugs_c::stopBugIconsFlash() {
for (int i = 0; i < BUGS_NUM_BUGS; i++) {
s32 idx = i + BUGS_ANIM_ICON_FLASH_OFFSET;
mAnm[idx].setAnimEnable(false);
}
}
bool dLytMiniGameBugs_c::isIconInEndReached() const {
s32 idx = 0 + BUGS_ANIM_ICON_IN_OFFSET;
if (mAnm[idx].isEnabled() && mAnm[idx].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameBugs_c::isInEndReached() const {
s32 idx = BUGS_ANIM_IN;
if (mAnm[idx].isEnabled() && mAnm[idx].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameBugs_c::isOutEndReached() const {
s32 idx = BUGS_ANIM_OUT;
if (mAnm[idx].isEnabled() && mAnm[idx].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameBugs_c::isSlotOnEndReached(s32 slot) const {
s32 idx = slot + BUGS_ANIM_ICON_ON_OFFSET;
if (mAnm[idx].isEnabled() && mAnm[idx].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameBugs_c::isBug0Flashing() const {
s32 idx = 0 + BUGS_ANIM_ICON_FLASH_OFFSET;
return mAnm[idx].isEnabled_();
}
bool dLytMiniGameBugs_c::areAllBugIconsOn() const {
bool ret = true;
for (int i = 0; i < mBugsNum; i++) {
if (!isSlotIconOnEndReached(i)) {
ret = false;
break;
}
}
return ret;
}
static const d2d::LytBrlanMapping brlanMapTime[] = {
{ "miniGameTime_00_in.brlan", "G_inOut_00"},
{ "miniGameTime_00_alphaIn.brlan", "G_alphaInOut_00"},
{ "miniGameTime_00_out.brlan", "G_inOut_00"},
{ "miniGameTime_00_signChange.brlan", "G_signChange_00"},
{ "miniGameTime_00_0to9.brlan", "G_0to9_00"},
{ "miniGameTime_00_0to9.brlan", "G_0to9_01"},
{ "miniGameTime_00_0to9.brlan", "G_0to9_02"},
{ "miniGameTime_00_0to9.brlan", "G_0to9_03"},
{ "miniGameTime_00_0to9.brlan", "G_0to9_04"},
{ "miniGameTime_00_0to9.brlan", "G_0to9_05"},
{ "miniGameTime_00_0to9.brlan", "G_0to9B_00"},
{ "miniGameTime_00_0to9.brlan", "G_0to9B_01"},
{ "miniGameTime_00_0to9.brlan", "G_0to9B_02"},
{ "miniGameTime_00_0to9.brlan", "G_0to9B_03"},
{ "miniGameTime_00_0to9.brlan", "G_0to9B_04"},
{ "miniGameTime_00_0to9.brlan", "G_0to9B_05"},
{"miniGameTime_00_setPosition.brlan", "G_setPosi_00"},
{"miniGameTime_00_setPosition.brlan", "G_setPosiB_00"},
{"miniGameTime_00_setPosition.brlan", "G_0to9B_05"},
{"miniGameTime_00_bScoreOnOff.brlan", "G_bestScore_00"},
{ "miniGameTime_00_finishTime.brlan", "G_finish_00"},
{ "miniGameTime_00_finishTime.brlan", "G_finish_01"},
{ "miniGameTime_00_finishTime.brlan", "G_finish_02"},
{ "miniGameTime_00_finishTime.brlan", "G_finish_03"},
{ "miniGameTime_00_finishTime.brlan", "G_finish_04"},
{ "miniGameTime_00_finishTime.brlan", "G_finish_05"},
{ "miniGameTime_00_finishTime.brlan", "G_finishW_00"},
{ "miniGameTime_00_loopTime.brlan", "G_loopTime_00"},
{ "miniGameTime_00_alphaOut.brlan", "G_alphaInOut_00"},
};
#define TIME_ANIM_IN 0
#define TIME_ANIM_ALPHA_IN 1
#define TIME_ANIM_OUT 2
#define TIME_ANIM_SIGN_CHANGE 3
#define TIME_ANIM_0_TO_9_OFFSET 4
#define TIME_ANIM_0_TO_9_B_OFFSET 10
#define TIME_ANIM_SET_POSITION 16
#define TIME_ANIM_SET_POSITION_B 17
#define TIME_ANIM_SET_POSITION_0_TO_9_B 18
#define TIME_ANIM_BEST_SCORE_ON_OFF 19
#define TIME_ANIM_FINISH_OFFSET 20
#define TIME_ANIM_FINISH_W 26
#define TIME_ANIM_LOOP_TIME 27
#define TIME_ANIM_ALPHA_OUT 28
#define TIME_NUM_ANIMS 29
#define TIME_NUM_DIGITS 6
bool dLytMiniGameTime_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("miniGameTime_00.brlyt", nullptr);
for (int i = 0; i < TIME_NUM_ANIMS; i++) {
mAnm[i].init(brlanMapTime[i].mFile, resAcc, mLyt.getLayout(), brlanMapTime[i].mName);
mAnm[i].bind(false);
mAnm[i].setRate(1.0f);
mAnm[i].setAnimEnable(false);
}
sInstance = this;
return true;
}
bool dLytMiniGameTime_c::remove() {
if (sInstance == nullptr) {
return true;
}
for (int i = 0; i < TIME_NUM_ANIMS; i++) {
mAnm[i].unbind();
mAnm[i].remove();
}
sInstance = nullptr;
return true;
}
bool dLytMiniGameTime_c::execute() {
if (sInstance == nullptr) {
return true;
}
if (mIsVisible) {
switch (mTimeFormat) {
case TIMER_LONG: updateLongTimer(); break;
case TIMER_SECONDS: updateSecondsTimer(); break;
}
if (isInEndReached()) {
stopIn();
field_0x7EC = true;
}
if (isOutEndReached()) {
stopOut();
stopLoop();
resetLoop();
mIsVisible = false;
}
if (isAlphaInEndReached()) {
stopAlphaIn();
if (field_0x7EE) {
startLoop();
}
}
if (isAlphaOutEndReached()) {
stopAlphaOut();
if (field_0x7EE) {
stopLoop();
resetLoop();
}
mIsVisible = false;
}
if (isFinishEndReached()) {
stopFinish();
startLoop();
}
for (int i = 0; i < TIME_NUM_ANIMS; i++) {
if (mAnm[i].isEnabled()) {
mAnm[i].play();
}
}
mLyt.calc();
}
if (mTimeFormat == TIMER_SECONDS) {
if (mCurrentTimerValueSeconds <= 10 && mLastTimerValueSeconds != mCurrentTimerValueSeconds) {
dSndSmallEffectMgr_c::GetInstance()->playMinigameTimeUpSound(mCurrentTimerValueSeconds);
}
saveSecondsTimer();
}
if (mVariant == TIME_VARIANT_INSECT_CAPTURE) {
if (mCurrentTimerValueSeconds >= 590 && mLastTimerValueSeconds != mCurrentTimerValueSeconds &&
mCurrentTimerValueSeconds != 600) {
dSndSmallEffectMgr_c::GetInstance()->playMinigameTimeUpSound(600 - mCurrentTimerValueSeconds);
}
saveSecondsTimer();
}
return true;
}
bool dLytMiniGameTime_c::draw() {
if (sInstance == nullptr) {
return true;
}
if (mIsVisible) {
mLyt.addToDrawList();
}
return true;
}
void dLytMiniGameTime_c::init() {
if (sInstance == nullptr) {
return;
}
switch (mVariant) {
case TIME_VARIANT_INSECT_CAPTURE: mTimeFormat = TIMER_LONG; break;
case TIME_VARIANT_SPIRAL_CHARGE_TUTORIAL: mTimeFormat = TIMER_SECONDS; break;
case TIME_VARIANT_PUMPKIN_ARCHERY: mTimeFormat = TIMER_SECONDS; break;
case TIME_VARIANT_ROLLERCOASTER: mTimeFormat = TIMER_LONG; break;
case TIME_VARIANT_BOSS_RUSH: mTimeFormat = TIMER_LONG; break;
case TIME_VARIANT_TRIAL_TIME_ATTACK: mTimeFormat = TIMER_LONG; break;
}
resetAlphaIn();
resetAlphaOut();
resetOut();
resetDigits();
resetPosition();
resetShowBestTime();
resetFinish();
resetLoop();
initSignChange();
resetIn();
}
void dLytMiniGameTime_c::fn_8028DD80() {
if (sInstance == nullptr) {
return;
}
if (field_0x7ED == true) {
return;
}
mAnm[TIME_ANIM_ALPHA_IN].setToEnd2();
mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(true);
mAnm[TIME_ANIM_IN].setToStart();
mAnm[TIME_ANIM_IN].setAnimEnable(true);
mLyt.calc();
mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(false);
field_0x7ED = true;
field_0x7F4 = true;
mIsVisible = true;
}
void dLytMiniGameTime_c::startOut() {
if (sInstance == nullptr) {
return;
}
if (field_0x7EC && field_0x7ED) {
mAnm[TIME_ANIM_OUT].setToStart();
mAnm[TIME_ANIM_OUT].setAnimEnable(true);
field_0x7ED = false;
field_0x7F4 = false;
}
}
void dLytMiniGameTime_c::startIn() {
if (sInstance == nullptr) {
return;
}
if (field_0x7EC && field_0x7ED != true && field_0x7F4) {
if (!mAnm[TIME_ANIM_ALPHA_IN].isEnabled()) {
if (mAnm[TIME_ANIM_ALPHA_OUT].isEnabled()) {
mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(false);
// TODO maybe these inlines are wrong
f32 frame = mAnm[TIME_ANIM_ALPHA_OUT].getLastFrame();
f32 t = mAnm[TIME_ANIM_ALPHA_IN].getLastFrame();
frame -= mAnm[TIME_ANIM_ALPHA_OUT].getFrame();
if (t <= frame) {
frame = t - 1.0f;
}
mAnm[TIME_ANIM_ALPHA_IN].setFrame(frame);
} else {
mAnm[TIME_ANIM_ALPHA_IN].setToStart();
}
mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(true);
field_0x7ED = true;
}
mIsVisible = true;
}
}
void dLytMiniGameTime_c::startOutTemp() {
if (sInstance == nullptr) {
return;
}
if (field_0x7EC && field_0x7ED) {
if (!mAnm[TIME_ANIM_ALPHA_OUT].isEnabled()) {
if (mAnm[TIME_ANIM_ALPHA_IN].isEnabled()) {
mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(false);
// TODO maybe these inlines are wrong
f32 frame = mAnm[TIME_ANIM_ALPHA_IN].getLastFrame();
f32 t = mAnm[TIME_ANIM_ALPHA_OUT].getLastFrame();
frame -= mAnm[TIME_ANIM_ALPHA_IN].getFrame();
if (t <= frame) {
frame = t - 1.0f;
}
mAnm[TIME_ANIM_ALPHA_OUT].setFrame(frame);
} else {
mAnm[TIME_ANIM_ALPHA_OUT].setToStart();
}
mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(true);
field_0x7ED = false;
}
}
}
void dLytMiniGameTime_c::startAlphaIn() {
if (sInstance == nullptr) {
return;
}
mAnm[TIME_ANIM_IN].setToEnd2();
mAnm[TIME_ANIM_IN].setAnimEnable(true);
mAnm[TIME_ANIM_ALPHA_IN].setToStart();
mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(true);
mLyt.calc();
mAnm[TIME_ANIM_IN].setAnimEnable(false);
mIsVisible = true;
}
void dLytMiniGameTime_c::startAlphaOut() {
if (sInstance == nullptr) {
return;
}
mAnm[TIME_ANIM_ALPHA_OUT].setToStart();
mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(true);
}
void dLytMiniGameTime_c::startFinish() {
if (sInstance == nullptr) {
return;
}
for (int i = 0; i <= mHighestDigitIndex; i++) {
mAnm[i + TIME_ANIM_FINISH_OFFSET].setToStart();
mAnm[i + TIME_ANIM_FINISH_OFFSET].setAnimEnable(true);
}
mAnm[TIME_ANIM_FINISH_W].setToStart();
mAnm[TIME_ANIM_FINISH_W].setAnimEnable(true);
}
void dLytMiniGameTime_c::startLoop() {
if (sInstance == nullptr) {
return;
}
mAnm[TIME_ANIM_LOOP_TIME].setFrame(0.0f);
mAnm[TIME_ANIM_LOOP_TIME].setAnimEnable(true);
}
void dLytMiniGameTime_c::setTimerValueInMilliSeconds(s32 time) {
if (sInstance == nullptr) {
return;
}
mCurrentTimerValueMilliSeconds = time;
}
void dLytMiniGameTime_c::updateLongTimer() {
s32 seconds;
s32 timeSeconds = mCurrentTimerValueMilliSeconds / 1000;
s32 centiSeconds = (mCurrentTimerValueMilliSeconds % 1000) / 10;
seconds = timeSeconds % 60;
mCurrentTimerValueSeconds = seconds + (timeSeconds / 60) * 60;
s32 digits[6];
// ten-minutes
digits[5] = (timeSeconds / 60) / 10;
// minutes
digits[4] = (timeSeconds / 60) % 10;
// ten-seconds
digits[3] = seconds / 10;
// seconds
digits[2] = seconds % 10;
// tenths-of-a-second
digits[1] = centiSeconds / 10;
// hundredths-of-a-second
digits[0] = centiSeconds % 10;
if (digits[5] != 0) {
mHighestDigitIndex = 5;
setTimePosition(true);
} else {
mHighestDigitIndex = 4;
setTimePosition(false);
}
for (int i = 0; i <= mHighestDigitIndex; i++) {
setDigit(i, digits[i]);
}
}
void dLytMiniGameTime_c::setTimerSecondsValueInMilliSeconds(s32 time) {
if (sInstance == nullptr) {
return;
}
mCurrentTimerValueSeconds = time / 1000;
}
void dLytMiniGameTime_c::updateSecondsTimer() {
if (mCurrentTimerValueSeconds > 999) {
mCurrentTimerValueSeconds = 999;
}
s32 seconds = mCurrentTimerValueSeconds % 100;
s32 digits[3];
// 100-seconds
digits[2] = mCurrentTimerValueSeconds / 100;
// ten-seconds
digits[1] = seconds / 10;
// seconds
digits[0] = seconds % 10;
if (mCurrentTimerValueSeconds < 10) {
mHighestDigitIndex = 0;
} else if (mCurrentTimerValueSeconds < 100) {
mHighestDigitIndex = 1;
} else {
mHighestDigitIndex = 2;
}
setHighestDigitIndex(mHighestDigitIndex);
for (int i = 0; i <= mHighestDigitIndex; i++) {
setDigit(i + 2, digits[i]);
}
}
void dLytMiniGameTime_c::saveSecondsTimer() {
mLastTimerValueSeconds = mCurrentTimerValueSeconds;
}
void dLytMiniGameTime_c::setBestTime(s32 time) {
if (sInstance == nullptr) {
return;
}
s32 offset = 1;
s32 seconds;
s32 timeSeconds = time / 1000;
s32 centiSeconds = time % 1000 / 10;
seconds = timeSeconds % 60;
s32 digits[6];
// ten-minutes
digits[5] = (timeSeconds / 60) / 10;
// minutes
digits[4] = (timeSeconds / 60) % 10;
// ten-seconds
digits[3] = seconds / 10;
// seconds
digits[2] = seconds % 10;
// tenths-of-a-second
digits[1] = centiSeconds / 10;
// hundredths-of-a-second
digits[0] = centiSeconds % 10;
if (digits[5] != 0) {
offset = 0;
setBestHasSixDigits(true);
} else {
setBestHasSixDigits(false);
}
for (int i = 0; i < 6 - offset; i++) {
setDigitBest(i, digits[i]);
}
}
void dLytMiniGameTime_c::setShowBestTime(bool show) {
if (sInstance == nullptr) {
return;
}
f32 frame = 1.0f;
if (show) {
frame = 0.0f;
}
mAnm[TIME_ANIM_BEST_SCORE_ON_OFF].setFrame(frame);
mAnm[TIME_ANIM_BEST_SCORE_ON_OFF].setAnimEnable(true);
mLyt.getLayout()->Animate(0);
mLyt.calc();
mAnm[TIME_ANIM_BEST_SCORE_ON_OFF].setAnimEnable(false);
}
void dLytMiniGameTime_c::resetIn() {
mAnm[TIME_ANIM_IN].setForwardOnce();
mAnm[TIME_ANIM_IN].setToStart();
mAnm[TIME_ANIM_IN].setAnimEnable(true);
mLyt.calc();
mAnm[TIME_ANIM_IN].setAnimEnable(false);
}
void dLytMiniGameTime_c::resetOut() {
mAnm[TIME_ANIM_OUT].setForwardOnce();
mAnm[TIME_ANIM_OUT].setToStart();
mAnm[TIME_ANIM_OUT].setAnimEnable(true);
mLyt.calc();
mAnm[TIME_ANIM_OUT].setAnimEnable(false);
}
void dLytMiniGameTime_c::resetAlphaIn() {
mAnm[TIME_ANIM_ALPHA_IN].setForwardOnce();
mAnm[TIME_ANIM_ALPHA_IN].setToStart();
mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(true);
mLyt.calc();
mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(false);
}
void dLytMiniGameTime_c::resetAlphaOut() {
mAnm[TIME_ANIM_ALPHA_OUT].setForwardOnce();
mAnm[TIME_ANIM_ALPHA_OUT].setToStart();
mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(true);
mLyt.calc();
mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(false);
}
void dLytMiniGameTime_c::resetDigits() {
for (int i = 0; i < TIME_NUM_DIGITS; i++) {
s32 idx = i + TIME_ANIM_0_TO_9_OFFSET;
mAnm[idx].setForwardOnce();
mAnm[idx].setToStart();
mAnm[idx].setAnimEnable(true);
}
for (int i = 0; i < TIME_NUM_DIGITS; i++) {
s32 idx = i + TIME_ANIM_0_TO_9_B_OFFSET;
mAnm[idx].setForwardOnce();
mAnm[idx].setToStart();
mAnm[idx].setAnimEnable(true);
}
mLyt.calc();
for (int i = 0; i < TIME_NUM_DIGITS; i++) {
s32 idx = i + TIME_ANIM_0_TO_9_OFFSET;
mAnm[idx].setAnimEnable(false);
}
for (int i = 0; i < TIME_NUM_DIGITS; i++) {
s32 idx = i + TIME_ANIM_0_TO_9_B_OFFSET;
mAnm[idx].setAnimEnable(false);
}
}
void dLytMiniGameTime_c::resetPosition() {
switch (mTimeFormat) {
case TIMER_LONG:
setTimePosition(false);
setBestHasSixDigits(false);
break;
case TIMER_SECONDS: setHighestDigitIndex(0); break;
}
}
void dLytMiniGameTime_c::resetShowBestTime() {
setShowBestTime(false);
}
void dLytMiniGameTime_c::resetFinish() {
for (int i = 0; i < TIME_NUM_DIGITS; i++) {
mAnm[i + TIME_ANIM_FINISH_OFFSET].setForwardOnce();
mAnm[i + TIME_ANIM_FINISH_OFFSET].setToStart();
mAnm[i + TIME_ANIM_FINISH_OFFSET].setAnimEnable(true);
// NOTE: Unnecessary calc here?
mLyt.calc();
}
mAnm[TIME_ANIM_FINISH_W].setForwardOnce();
mAnm[TIME_ANIM_FINISH_W].setToStart();
mAnm[TIME_ANIM_FINISH_W].setAnimEnable(true);
mLyt.calc();
mAnm[TIME_ANIM_FINISH_W].setAnimEnable(false);
for (int i = 0; i < TIME_NUM_DIGITS; i++) {
mAnm[i + TIME_ANIM_FINISH_OFFSET].setAnimEnable(false);
}
}
void dLytMiniGameTime_c::resetLoop() {
mAnm[TIME_ANIM_LOOP_TIME].setForwardLoop();
mAnm[TIME_ANIM_LOOP_TIME].setFrame(0.0f);
mAnm[TIME_ANIM_LOOP_TIME].setAnimEnable(true);
mLyt.calc();
mAnm[TIME_ANIM_LOOP_TIME].setAnimEnable(false);
}
void dLytMiniGameTime_c::initSignChange() {
if (getCurrentLanguage1() == D_LANG_FR) {
setSignChange(2);
field_0x7D4 = 3;
} else {
setSignChange(1);
field_0x7D4 = 3;
}
}
void dLytMiniGameTime_c::stopIn() {
mAnm[TIME_ANIM_IN].setAnimEnable(false);
}
void dLytMiniGameTime_c::stopOut() {
mAnm[TIME_ANIM_OUT].setAnimEnable(false);
}
void dLytMiniGameTime_c::stopAlphaIn() {
mAnm[TIME_ANIM_ALPHA_IN].setAnimEnable(false);
}
void dLytMiniGameTime_c::stopAlphaOut() {
mAnm[TIME_ANIM_ALPHA_OUT].setAnimEnable(false);
}
void dLytMiniGameTime_c::stopFinish() {
mAnm[TIME_ANIM_FINISH_W].setAnimEnable(false);
for (int i = 0; i < TIME_NUM_DIGITS; i++) {
mAnm[i + TIME_ANIM_FINISH_OFFSET].setAnimEnable(false);
}
}
void dLytMiniGameTime_c::stopLoop() {
mAnm[TIME_ANIM_LOOP_TIME].setAnimEnable(false);
}
bool dLytMiniGameTime_c::isInEndReached() const {
if (mAnm[TIME_ANIM_IN].isEnabled() && mAnm[TIME_ANIM_IN].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameTime_c::isOutEndReached() const {
if (mAnm[TIME_ANIM_OUT].isEnabled() && mAnm[TIME_ANIM_OUT].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameTime_c::isAlphaInEndReached() const {
if (mAnm[TIME_ANIM_ALPHA_IN].isEnabled() && mAnm[TIME_ANIM_ALPHA_IN].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameTime_c::isAlphaOutEndReached() const {
if (mAnm[TIME_ANIM_ALPHA_OUT].isEnabled() && mAnm[TIME_ANIM_ALPHA_OUT].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameTime_c::isFinishEndReached() const {
if (mAnm[TIME_ANIM_FINISH_OFFSET].isEnabled() && mAnm[TIME_ANIM_FINISH_OFFSET].isEndReached()) {
return true;
}
return false;
}
void dLytMiniGameTime_c::setHighestDigitIndex(u8 arg) {
f32 frame = arg + field_0x7D4 + 2;
mAnm[TIME_ANIM_SET_POSITION].setForwardOnce();
mAnm[TIME_ANIM_SET_POSITION].setFrame(frame);
mAnm[TIME_ANIM_SET_POSITION].setAnimEnable(true);
mAnm[TIME_ANIM_SET_POSITION_B].setForwardOnce();
mAnm[TIME_ANIM_SET_POSITION_B].setFrame(frame);
mAnm[TIME_ANIM_SET_POSITION_B].setAnimEnable(true);
mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setForwardOnce();
mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setFrame(frame);
mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setAnimEnable(true);
mLyt.calc();
mAnm[TIME_ANIM_SET_POSITION].setAnimEnable(false);
mAnm[TIME_ANIM_SET_POSITION_B].setAnimEnable(false);
mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setAnimEnable(false);
}
void dLytMiniGameTime_c::setSignChange(u32 arg) {
f32 frame = arg;
mAnm[TIME_ANIM_SIGN_CHANGE].setFrame(frame);
mAnm[TIME_ANIM_SIGN_CHANGE].setAnimEnable(true);
mLyt.getLayout()->Animate(0);
mLyt.calc();
mAnm[TIME_ANIM_SIGN_CHANGE].setAnimEnable(false);
}
void dLytMiniGameTime_c::setTimePosition(bool b) {
f32 frame = 0.0f;
if (b) {
frame = 1.0f;
}
mAnm[TIME_ANIM_SET_POSITION].setForwardOnce();
mAnm[TIME_ANIM_SET_POSITION].setFrame(frame);
mAnm[TIME_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[TIME_ANIM_SET_POSITION].setAnimEnable(false);
}
void dLytMiniGameTime_c::setBestHasSixDigits(bool b) {
f32 frame = 0.0f;
if (b) {
frame = 1.0f;
}
mAnm[TIME_ANIM_SET_POSITION_B].setForwardOnce();
mAnm[TIME_ANIM_SET_POSITION_B].setFrame(frame);
mAnm[TIME_ANIM_SET_POSITION_B].setAnimEnable(true);
mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setForwardOnce();
mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setFrame(frame);
mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setAnimEnable(true);
mLyt.getLayout()->Animate(0);
mLyt.calc();
mAnm[TIME_ANIM_SET_POSITION_0_TO_9_B].setAnimEnable(false);
mAnm[TIME_ANIM_SET_POSITION_B].setAnimEnable(false);
}
void dLytMiniGameTime_c::setDigit(s32 digitIndex, s32 number) {
s32 idx = digitIndex + TIME_ANIM_0_TO_9_OFFSET;
f32 frame = number;
mAnm[idx].setFrame(frame);
mAnm[idx].setAnimEnable(true);
mLyt.getLayout()->Animate(0);
mLyt.calc();
mAnm[idx].setAnimEnable(false);
}
void dLytMiniGameTime_c::setDigitBest(s32 digitIndex, s32 number) {
s32 idx = digitIndex + TIME_ANIM_0_TO_9_B_OFFSET;
f32 frame = number;
mAnm[idx].setFrame(frame);
mAnm[idx].setAnimEnable(true);
mLyt.getLayout()->Animate(0);
mLyt.calc();
mAnm[idx].setAnimEnable(false);
}
static const d2d::LytBrlanMapping brlanMapStart[] = {
{"start_00_321start.brlan", "G_321start_00"},
{ "start_00_finish.brlan", "G_finish_00"},
{ "start_00_finish.brlan", "G_timeUp_00"},
};
#define START_ANIM_COUNTDOWN 0
#define START_ANIM_FINISH 1
#define START_ANIM_TIMEUP 2
#define START_NUM_ANIMS 3
bool dLytMiniGameStart_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("start_00.brlyt", nullptr);
for (int i = 0; i < START_NUM_ANIMS; i++) {
mAnm[i].init(brlanMapStart[i].mFile, resAcc, mLyt.getLayout(), brlanMapStart[i].mName);
mAnm[i].bind(false);
mAnm[i].setRate(1.0f);
}
sInstance = this;
return true;
}
bool dLytMiniGameStart_c::remove() {
if (sInstance == nullptr) {
return true;
}
for (int i = 0; i < START_NUM_ANIMS; i++) {
mAnm[i].unbind();
mAnm[i].remove();
}
sInstance = nullptr;
return true;
}
bool dLytMiniGameStart_c::execute() {
if (sInstance == nullptr) {
return true;
}
if (mIsVisible) {
if (checkCountdown3()) {
dSndSmallEffectMgr_c::GetInstance()->playMinigameCountdownSound(3);
}
if (checkCountdown2()) {
dSndSmallEffectMgr_c::GetInstance()->playMinigameCountdownSound(2);
}
if (checkCountdown1()) {
dSndSmallEffectMgr_c::GetInstance()->playMinigameCountdownSound(1);
}
if (checkStart()) {
dSndSmallEffectMgr_c::GetInstance()->playMinigameStartSound();
}
if (checkFinish()) {
dSndSmallEffectMgr_c::GetInstance()->playMinigameFinishSound();
}
if (checkTimeup()) {
dSndSmallEffectMgr_c::GetInstance()->playMinigameFinishSound();
}
if (isCountdownEndReached()) {
stopCountdown();
mIsVisible = false;
}
if (isFinishEndReached()) {
stopFinish();
resetPlayedSounds();
mIsVisible = false;
}
if (isTimeupEndReached()) {
stopTimeup();
resetPlayedSounds();
mIsVisible = false;
}
for (int i = 0; i < START_NUM_ANIMS; i++) {
if (mAnm[i].isEnabled()) {
mAnm[i].play();
}
}
mLyt.calc();
}
return true;
}
bool dLytMiniGameStart_c::draw() {
if (sInstance == nullptr) {
return true;
}
if (mIsVisible) {
mLyt.addToDrawList();
}
return true;
}
void dLytMiniGameStart_c::init() {
if (sInstance == nullptr) {
return;
}
mAnm[START_ANIM_COUNTDOWN].setForwardOnce();
mAnm[START_ANIM_COUNTDOWN].setToEnd2();
mAnm[START_ANIM_COUNTDOWN].setAnimEnable(true);
mAnm[START_ANIM_FINISH].setForwardOnce();
mAnm[START_ANIM_FINISH].setToEnd2();
mAnm[START_ANIM_FINISH].setAnimEnable(true);
mAnm[START_ANIM_TIMEUP].setForwardOnce();
mAnm[START_ANIM_TIMEUP].setToEnd2();
mAnm[START_ANIM_TIMEUP].setAnimEnable(true);
mLyt.calc();
mAnm[START_ANIM_COUNTDOWN].setAnimEnable(false);
mAnm[START_ANIM_FINISH].setAnimEnable(false);
mAnm[START_ANIM_TIMEUP].setAnimEnable(false);
resetPlayedSounds();
}
void dLytMiniGameStart_c::startCountdown() {
if (sInstance == nullptr) {
return;
}
resetCountdown();
mAnm[START_ANIM_COUNTDOWN].setAnimEnable(true);
mIsVisible = true;
}
void dLytMiniGameStart_c::startCountdown120() {
if (sInstance == nullptr) {
return;
}
resetCountdown();
mAnm[START_ANIM_COUNTDOWN].setAnimEnable(true);
mAnm[START_ANIM_COUNTDOWN].setFrame(120.0f);
mIsVisible = true;
}
void dLytMiniGameStart_c::startFinish() {
if (sInstance == nullptr) {
return;
}
resetFinish();
mAnm[START_ANIM_FINISH].setAnimEnable(true);
mIsVisible = true;
}
void dLytMiniGameStart_c::startTimeup() {
if (sInstance == nullptr) {
return;
}
resetStart();
mAnm[START_ANIM_TIMEUP].setAnimEnable(true);
mIsVisible = true;
}
bool dLytMiniGameStart_c::isCountdownEndReached() const {
if (sInstance == nullptr) {
return false;
}
if (mAnm[START_ANIM_COUNTDOWN].isEnabled() && mAnm[START_ANIM_COUNTDOWN].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameStart_c::isFinishEndReached() const {
if (sInstance == nullptr) {
return false;
}
if (mAnm[START_ANIM_FINISH].isEnabled() && mAnm[START_ANIM_FINISH].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameStart_c::isTimeupEndReached() const {
if (sInstance == nullptr) {
return false;
}
if (mAnm[START_ANIM_TIMEUP].isEnabled() && mAnm[START_ANIM_TIMEUP].isEndReached()) {
return true;
}
return false;
}
void dLytMiniGameStart_c::resetPlayedSounds() {
for (int i = 0; i < 6; i++) {
mPlayedSounds[i] = false;
}
}
void dLytMiniGameStart_c::resetCountdown() {
mAnm[START_ANIM_COUNTDOWN].setForwardOnce();
mAnm[START_ANIM_COUNTDOWN].setFrame(0.0f);
mAnm[START_ANIM_COUNTDOWN].setAnimEnable(false);
}
void dLytMiniGameStart_c::resetFinish() {
mAnm[START_ANIM_FINISH].setForwardOnce();
mAnm[START_ANIM_FINISH].setFrame(0.0f);
mAnm[START_ANIM_FINISH].setAnimEnable(false);
}
void dLytMiniGameStart_c::resetStart() {
mAnm[START_ANIM_TIMEUP].setForwardOnce();
mAnm[START_ANIM_TIMEUP].setFrame(0.0f);
mAnm[START_ANIM_TIMEUP].setAnimEnable(false);
}
void dLytMiniGameStart_c::stopCountdown() {
mAnm[START_ANIM_COUNTDOWN].setAnimEnable(false);
}
void dLytMiniGameStart_c::stopFinish() {
mAnm[START_ANIM_FINISH].setAnimEnable(false);
}
void dLytMiniGameStart_c::stopTimeup() {
mAnm[START_ANIM_TIMEUP].setAnimEnable(false);
}
bool dLytMiniGameStart_c::checkCountdown3() {
if (mAnm[START_ANIM_COUNTDOWN].isEnabled() && !mPlayedSounds[0] && 32.0f <= mAnm[START_ANIM_COUNTDOWN].getFrame()) {
mPlayedSounds[0] = true;
return true;
}
return false;
}
bool dLytMiniGameStart_c::checkCountdown2() {
if (mAnm[START_ANIM_COUNTDOWN].isEnabled() && !mPlayedSounds[1] && 62.0f <= mAnm[START_ANIM_COUNTDOWN].getFrame()) {
mPlayedSounds[1] = true;
return true;
}
return false;
}
bool dLytMiniGameStart_c::checkCountdown1() {
if (mAnm[START_ANIM_COUNTDOWN].isEnabled() && !mPlayedSounds[2] && 92.0f <= mAnm[START_ANIM_COUNTDOWN].getFrame()) {
mPlayedSounds[2] = true;
return true;
}
return false;
}
bool dLytMiniGameStart_c::checkStart() {
if (mAnm[START_ANIM_COUNTDOWN].isEnabled() && !mPlayedSounds[3] &&
122.0f <= mAnm[START_ANIM_COUNTDOWN].getFrame()) {
mPlayedSounds[3] = true;
return true;
}
return false;
}
bool dLytMiniGameStart_c::checkFinish() {
if (mAnm[START_ANIM_FINISH].isEnabled() && !mPlayedSounds[4] && 0.0f <= mAnm[START_ANIM_FINISH].getFrame()) {
mPlayedSounds[4] = true;
return true;
}
return false;
}
bool dLytMiniGameStart_c::checkTimeup() {
if (mAnm[START_ANIM_TIMEUP].isEnabled() && !mPlayedSounds[5] && 0.0f <= mAnm[START_ANIM_TIMEUP].getFrame()) {
mPlayedSounds[5] = true;
return true;
}
return false;
}
static const d2d::LytBrlanMapping brlanMapScore[] = {
{ "miniGameScore_00_in.brlan", "G_inOut_00"},
{ "miniGameScore_00_alphaIn.brlan", "G_alphaInOut_00"},
{ "miniGameScore_00_out.brlan", "G_inOut_00"},
{ "miniGameScore_00_0to9.brlan", "G_0to9_00"},
{ "miniGameScore_00_0to9.brlan", "G_0to9_01"},
{ "miniGameScore_00_0to9.brlan", "G_0to9_02"},
{ "miniGameScore_00_0to9.brlan", "G_0to9_03"},
{ "miniGameScore_00_0to9.brlan", "G_0to9_04"},
{"miniGameScore_00_setPosition00.brlan", "G_setPosition_00"},
{ "miniGameScore_00_getScore.brlan", "G_getScore_00"},
{ "miniGameScore_00_getScore.brlan", "G_getScore_01"},
{ "miniGameScore_00_getScore.brlan", "G_getScore_02"},
{ "miniGameScore_00_getScore.brlan", "G_getScore_03"},
{ "miniGameScore_00_getScore.brlan", "G_getScore_04"},
{ "miniGameScore_00_getScore.brlan", "G_getTextF_00"},
{ "miniGameScore_00_finishScore.brlan", "G_getScore_00"},
{ "miniGameScore_00_finishScore.brlan", "G_getScore_01"},
{ "miniGameScore_00_finishScore.brlan", "G_getScore_02"},
{ "miniGameScore_00_finishScore.brlan", "G_getScore_03"},
{ "miniGameScore_00_finishScore.brlan", "G_getScore_04"},
{ "miniGameScore_00_finishScore.brlan", "G_getScoreW_00"},
{ "miniGameScore_00_finishScore.brlan", "G_getScoreX_00"},
{ "miniGameScore_00_finishScore.brlan", "G_getTextF_00"},
{ "miniGameScore_00_loopScore.brlan", "G_loopScore_00"},
{ "miniGameScore_00_rupeeChange.brlan", "G_rupyChange_00"},
{ "miniGameScore_00_alphaOut.brlan", "G_alphaInOut_00"},
};
#define SCORE_ANIM_IN 0
#define SCORE_ANIM_ALPHA_IN 1
#define SCORE_ANIM_OUT 2
#define SCORE_ANIM_0_TO_9_OFFSET 3
#define SCORE_ANIM_SET_POSITION 8
#define SCORE_ANIM_GET_SCORE_OFFSET 9
#define SCORE_ANIM_GET_SCORE_GET_TEXT_F 14
#define SCORE_ANIM_FINISH_SCORE_OFFSET 15
#define SCORE_ANIM_FINISH_SCORE_GET_SCORE_W 20
#define SCORE_ANIM_FINISH_SCORE_GET_SCORE_X 21
#define SCORE_ANIM_FINISH_SCORE_GET_SCORE_F 22
#define SCORE_ANIM_LOOP_SCORE 23
#define SCORE_ANIM_RUPEE_CHANGE 24
#define SCORE_ANIM_ALPHA_OUT 25
#define SCORE_NUM_ANIMS 26
#define SCORE_NUM_DIGITS 5
static const char *sScoreTextBoxes[] = {
"T_unitText_00",
"T_unitTextS_00",
"T_unitTextF_00",
};
#define SCORE_NUM_TEXTBOXES 3
static const char *sScorePanes[] = {
"N_center_00", "N_positionAll_00", "N_position_00", "N_unit_00", "N_bg_00",
"P_bgBase_00", "P_bgFrameS_00", "P_bgFrameS_01", "P_bgFrameS_02", "P_bgFrame_00",
"P_bgFrame_01", "P_bgFrame_02", "P_target_00", "P_rupy_00", "P_question_00",
"P_position_00", "P_position_01", "P_position_02", "P_position_03", "P_position_04",
};
#define SCORE_PANE_CENTER 0
#define SCORE_PANE_POSITION_ALL 1
#define SCORE_PANE_POSITION 2
#define SCORE_PANE_UNIT 3
#define SCORE_PANE_P_POSITION_0 15
#define SCORE_NUM_PANES 20
bool dLytMiniGameScore_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("miniGameScore_00.brlyt", nullptr);
for (int i = 0; i < SCORE_NUM_ANIMS; i++) {
mAnm[i].init(brlanMapScore[i].mFile, resAcc, mLyt.getLayout(), brlanMapScore[i].mName);
mAnm[i].bind(false);
mAnm[i].setRate(1.0f);
mAnm[i].setAnimEnable(false);
}
for (int i = 0; i < SCORE_NUM_TEXTBOXES; i++) {
mpTextBoxes[i] = mLyt.getTextBox(sScoreTextBoxes[i]);
}
for (int i = 0; i < SCORE_NUM_PANES; i++) {
mpPanes[i] = mLyt.findPane(sScorePanes[i]);
}
for (int i = 0; i < 3; i++) {
const nw4r::math::VEC3 &translate = mpPanes[i + 2]->GetTranslate();
field_0x834[i][0] = translate.x;
field_0x834[i][1] = translate.y;
}
sInstance = this;
return true;
}
bool dLytMiniGameScore_c::remove() {
if (sInstance == nullptr) {
return true;
}
for (int i = 0; i < SCORE_NUM_ANIMS; i++) {
mAnm[i].unbind();
mAnm[i].remove();
}
sInstance = nullptr;
return true;
}
bool dLytMiniGameScore_c::execute() {
if (sInstance == nullptr) {
return true;
}
if (field_0x804) {
if (field_0x80C-- == 0) {
field_0x804 = false;
field_0x829 = false;
} else {
increaseScore(field_0x810);
}
}
if (mIsVisible) {
fn_80291BC0();
if (!field_0x816) {
switch (mVariant) {
case SCORE_VARIANT_BAMBOO_CUTTING:
if (hasIncreasedScore()) {
startGetScore();
}
break;
case SCORE_VARIANT_THRILL_DIGGER:
if (field_0x829) {
if (hasIncreasedScore()) {
startGetScore();
}
if (hasDecreasedScore()) {
// nothing
}
field_0x829 = false;
}
break;
case SCORE_VARIANT_FUN_FUN_ISLAND:
if (mScore != 1) {
if (hasIncreasedScore()) {
startGetScore();
}
}
break;
case SCORE_VARIANT_PUMPKIN_ARCHERY:
case SCORE_VARIANT_SPIRAL_CHARGE_TUTORIAL:
if (hasIncreasedScore()) {
startGetScore();
}
break;
}
}
if (isInEndReached()) {
stopIn();
field_0x814 = true;
}
if (isOutEndReached()) {
stopOut();
stopLoop();
resetLoop();
mIsVisible = false;
}
if (isAlphaInEndReached()) {
stopAlphaIn();
if (field_0x816) {
startLoop();
}
}
if (isAlphaOutEndReached()) {
stopAlphaOut();
if (field_0x816) {
stopLoop();
resetLoop();
}
mIsVisible = false;
}
if (isGetScoreEndReached()) {
stopGetScore();
}
if (isFinishEndReached()) {
stopFinish();
startLoop();
}
for (int i = 0; i < SCORE_NUM_ANIMS; i++) {
if (mAnm[i].isEnabled()) {
mAnm[i].play();
}
}
mLyt.calc();
}
if (!field_0x816 && mVariant == SCORE_VARIANT_BAMBOO_CUTTING && hasIncreasedScore()) {
dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(mScore);
}
saveScore();
return true;
}
bool dLytMiniGameScore_c::draw() {
if (sInstance == nullptr) {
return true;
}
if (mIsVisible) {
mLyt.addToDrawList();
}
return true;
}
// TODO this is totally arbitrary and makes no sense but it sort of looks like it generates close-ish code
// Assume the TODO also covers all the calls to `calc` below
struct PaneCalc {
PaneCalc() {
for (int i = 4; i >= 0; i--) {
work[i][1] = work[i][0] = 0.0f;
}
}
void calc(nw4r::lyt::Pane *p1, nw4r::lyt::Pane *p2) {
nw4r::lyt::Pane *pp1 = p1->GetParent();
nw4r::lyt::Pane *pp2 = p2->GetParent();
work[0][0] = p1->GetScale().x;
work[0][1] = p1->GetScale().y;
work[1][0] = p1->GetTranslate().x + pp1->GetTranslate().x;
work[1][1] = p1->GetTranslate().y;
work[2][0] = p2->GetTranslate().x + pp2->GetTranslate().x;
work[2][1] = p2->GetTranslate().y;
work[3][0] = p1->GetSize().width * p1->GetScale().x;
work[3][1] = p1->GetSize().height * p1->GetScale().y;
work[4][0] = p2->GetSize().width * p2->GetScale().x;
work[4][1] = p2->GetSize().height * p2->GetScale().y;
}
f32 work[5][2];
};
void dLytMiniGameScore_c::init() {
if (sInstance == nullptr) {
return;
}
// maybe?
PaneCalc calc;
mAnm[SCORE_ANIM_IN].setForwardOnce();
mAnm[SCORE_ANIM_IN].setToEnd2();
mAnm[SCORE_ANIM_IN].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_IN].setAnimEnable(false);
switch (mVariant) {
case SCORE_VARIANT_BAMBOO_CUTTING:
field_0x82C = 0;
field_0x81C = 21;
field_0x7E4 = 4;
dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore);
loadTextVariant(1);
fn_80293410();
switch (field_0x830) {
case 1:
mpTextBoxes[0]->SetTextPositionH(0);
mpTextBoxes[1]->SetTextPositionH(0);
mpTextBoxes[2]->SetTextPositionH(0);
break;
case 2:
mpTextBoxes[0]->SetTextPositionH(2);
mpTextBoxes[1]->SetTextPositionH(2);
mpTextBoxes[2]->SetTextPositionH(2);
break;
}
field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr);
for (int i = 0; i < field_0x7E4; i++) {
mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false);
calc.calc(mpPanes[i + 15], mpPanes[15]);
mFloats[field_0x81C + i] =
calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]);
mFloats[field_0x81C + i] += field_0x7FC;
mFloats[field_0x81C + i] += field_0x800;
}
fn_80293450(field_0x81C);
break;
case SCORE_VARIANT_FUN_FUN_ISLAND:
field_0x830 = 0;
field_0x82C = 0;
field_0x81C = 11;
field_0x7E4 = 2;
for (int i = 0; i < field_0x7E4; i++) {
mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false);
calc.calc(mpPanes[14], mpPanes[15]);
mFloats[field_0x81C + i] =
calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]);
}
for (int i = 0; i < field_0x7E4; i++) {
mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i + 2);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false);
calc.calc(mpPanes[14], mpPanes[15]);
mFloats[field_0x81C + i + 2] =
calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]);
}
mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(5.0f);
mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false);
for (int i = 0; i < field_0x7E4; i++) {
mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i + 4);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false);
calc.calc(mpPanes[14], mpPanes[15]);
mFloats[field_0x81C + i + 4] =
calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]);
}
mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(4.0f);
mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false);
for (int i = 0; i < field_0x7E4; i++) {
mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i + 6);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false);
calc.calc(mpPanes[13], mpPanes[15]);
mFloats[field_0x81C + i + 6] =
calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]);
}
fn_80293450(field_0x81C);
break;
case SCORE_VARIANT_THRILL_DIGGER:
field_0x830 = 0;
field_0x82C = 0;
field_0x81C = 6;
field_0x7E4 = 5;
for (int i = 0; i < field_0x7E4; i++) {
mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false);
calc.calc(mpPanes[14], mpPanes[15]);
mFloats[field_0x81C + i + 6] =
calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]);
}
fn_80293450(field_0x81C);
break;
case SCORE_VARIANT_PUMPKIN_ARCHERY:
field_0x82C = 0;
field_0x81C = 21;
field_0x7E4 = 4;
dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore);
loadTextVariant(0);
fn_80293410();
switch (field_0x830) {
case 1:
mpTextBoxes[0]->SetTextPositionH(0);
mpTextBoxes[1]->SetTextPositionH(0);
mpTextBoxes[2]->SetTextPositionH(0);
break;
case 2:
mpTextBoxes[0]->SetTextPositionH(2);
mpTextBoxes[1]->SetTextPositionH(2);
mpTextBoxes[2]->SetTextPositionH(2);
break;
}
field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr);
for (int i = 0; i < field_0x7E4; i++) {
mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false);
calc.calc(mpPanes[i + 15], mpPanes[15]);
mFloats[field_0x81C + i] =
calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]);
mFloats[field_0x81C + i] += field_0x7FC;
mFloats[field_0x81C + i] += field_0x800;
}
fn_80293450(field_0x81C);
break;
case SCORE_VARIANT_SPIRAL_CHARGE_TUTORIAL:
field_0x830 = 0;
field_0x82C = 0;
field_0x81C = 19;
field_0x7E4 = 2;
for (int i = 0; i < field_0x7E4; i++) {
mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + i);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false);
calc.calc(mpPanes[12], mpPanes[15]);
// NOTE: 2.0 instead of 2.0f, so this division can't be an inline...
mFloats[field_0x81C + i] =
calc.work[3][0] / 2.0 + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]);
}
fn_80293450(field_0x81C);
break;
}
resetDigits();
resetSetPosition();
resetRupeeChange();
resetGetScore();
resetFinish();
resetLoop();
setScore(0);
resetAlphaIn();
resetAlphaOut();
resetOut();
resetIn();
mLastScore = 0;
field_0x804 = false;
field_0x808 = 0;
field_0x80C = 0;
field_0x810 = 0;
}
void dLytMiniGameScore_c::fn_80291410() {
if (sInstance == nullptr) {
return;
}
if (field_0x815 == true) {
return;
}
mAnm[SCORE_ANIM_ALPHA_IN].setToEnd2();
mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(true);
mAnm[SCORE_ANIM_IN].setToStart();
mAnm[SCORE_ANIM_IN].setAnimEnable(true);
mLyt.getLayout()->Animate(0);
mLyt.calc();
mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(false);
field_0x815 = true;
field_0x820 = true;
mIsVisible = true;
if (mVariant == SCORE_VARIANT_FUN_FUN_ISLAND) {
setScore(1);
calcNumDigits();
mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true);
fn_80292C30();
mAnm[SCORE_ANIM_0_TO_9_OFFSET].setFrame(1.0f);
mAnm[SCORE_ANIM_0_TO_9_OFFSET].setAnimEnable(true);
mLyt.getLayout()->Animate(0);
mLyt.calc();
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false);
mAnm[SCORE_ANIM_0_TO_9_OFFSET].setAnimEnable(false);
}
}
void dLytMiniGameScore_c::startOut() {
if (sInstance == nullptr) {
return;
}
if (field_0x814 && field_0x815) {
mAnm[SCORE_ANIM_OUT].setToStart();
mAnm[SCORE_ANIM_OUT].setAnimEnable(true);
field_0x815 = false;
field_0x820 = false;
}
}
void dLytMiniGameScore_c::startIn() {
if (sInstance == nullptr) {
return;
}
if (field_0x814 && field_0x815 != true && field_0x820) {
if (!mAnm[SCORE_ANIM_ALPHA_IN].isEnabled()) {
if (mAnm[SCORE_ANIM_ALPHA_OUT].isEnabled()) {
mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(false);
// TODO maybe these inlines are wrong
f32 frame = mAnm[SCORE_ANIM_ALPHA_OUT].getLastFrame();
f32 t = mAnm[SCORE_ANIM_ALPHA_IN].getLastFrame();
frame -= mAnm[SCORE_ANIM_ALPHA_OUT].getFrame();
if (t <= frame) {
frame = t - 1.0f;
}
mAnm[SCORE_ANIM_ALPHA_IN].setFrame(frame);
} else {
mAnm[SCORE_ANIM_ALPHA_IN].setToStart();
}
mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(true);
field_0x815 = true;
}
mIsVisible = true;
}
}
void dLytMiniGameScore_c::startOutTemp() {
if (sInstance == nullptr) {
return;
}
if (field_0x814 && field_0x815) {
if (!mAnm[SCORE_ANIM_ALPHA_OUT].isEnabled()) {
if (mAnm[SCORE_ANIM_ALPHA_IN].isEnabled()) {
mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(false);
// TODO maybe these inlines are wrong
f32 frame = mAnm[SCORE_ANIM_ALPHA_IN].getLastFrame();
f32 t = mAnm[SCORE_ANIM_ALPHA_OUT].getLastFrame();
frame -= mAnm[SCORE_ANIM_ALPHA_IN].getFrame();
if (t <= frame) {
frame = t - 1.0f;
}
mAnm[SCORE_ANIM_ALPHA_OUT].setFrame(frame);
} else {
mAnm[SCORE_ANIM_ALPHA_OUT].setToStart();
}
mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(true);
field_0x815 = false;
}
}
}
void dLytMiniGameScore_c::startAlphaIn() {
if (sInstance == nullptr) {
return;
}
mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(false);
mAnm[SCORE_ANIM_IN].setToEnd2();
mAnm[SCORE_ANIM_IN].setAnimEnable(true);
mAnm[SCORE_ANIM_ALPHA_IN].setToStart();
mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(true);
mLyt.getLayout()->Animate(0);
mLyt.calc();
mAnm[SCORE_ANIM_IN].setAnimEnable(false);
mIsVisible = true;
}
void dLytMiniGameScore_c::startAlphaOut() {
if (sInstance == nullptr) {
return;
}
mAnm[SCORE_ANIM_ALPHA_OUT].setToStart();
mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(true);
}
void dLytMiniGameScore_c::startGetScore() {
if (sInstance == nullptr) {
return;
}
if (!mIsVisible) {
return;
}
for (int i = 0; i <= mHighestDigitIndex; i++) {
mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setToStart();
mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(true);
}
mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setToStart();
mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(true);
}
void dLytMiniGameScore_c::startFinish() {
if (sInstance == nullptr) {
return;
}
calcNumDigits();
for (int i = 0; i <= mHighestDigitIndex; i++) {
mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setToStart();
mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(true);
}
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setToStart();
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setAnimEnable(true);
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setToStart();
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setAnimEnable(true);
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setToStart();
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setAnimEnable(true);
}
void dLytMiniGameScore_c::startLoop() {
if (sInstance == nullptr) {
return;
}
mAnm[SCORE_ANIM_LOOP_SCORE].setFrame(0.0f);
mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(true);
}
void dLytMiniGameScore_c::setScore(s32 score) {
if (sInstance == nullptr) {
return;
}
mScore = score;
}
void dLytMiniGameScore_c::fn_80291BC0() {
s32 digits[5];
digits[4] = mScore / 10000;
s32 v = mScore;
v %= 10000;
digits[3] = v / 1000;
v %= 1000;
digits[2] = v / 100;
v %= 100;
digits[1] = v / 10;
v %= 10;
digits[0] = v;
calcNumDigits();
realizePosition();
if (mVariant == SCORE_VARIANT_FUN_FUN_ISLAND) {
if (field_0x828) {
fn_80291EF0();
}
} else if (mVariant == SCORE_VARIANT_THRILL_DIGGER) {
fn_80292040();
}
fn_80292C30();
for (int i = 0; i <= mHighestDigitIndex; i++) {
setDigit(i, digits[i]);
}
}
void dLytMiniGameScore_c::fn_80291D40(s32 score) {
if (sInstance == nullptr) {
return;
}
s32 diff = score - mScore;
switch (diff) {
case 1:
field_0x80C = 1;
field_0x810 = 1;
break;
case 5:
field_0x80C = 5;
field_0x810 = 1;
break;
case 20:
field_0x80C = 10;
field_0x810 = 2;
break;
case 100:
field_0x80C = 20;
field_0x810 = 5;
break;
case 300:
field_0x80C = 25;
field_0x810 = 12;
break;
case 0: return;
}
if (score < mScore) {
field_0x80C = nw4r::math::FAbs(diff);
field_0x810 = -1;
}
field_0x808 = score;
field_0x804 = true;
field_0x829 = true;
}
bool dLytMiniGameScore_c::hasIncreasedScore() const {
if (sInstance == nullptr) {
return false;
}
return mLastScore < mScore;
}
bool dLytMiniGameScore_c::hasDecreasedScore() const {
if (sInstance == nullptr) {
return false;
}
return mScore < mLastScore;
}
void dLytMiniGameScore_c::fn_80291ED0(s32 arg) {
if (sInstance == nullptr) {
return;
}
field_0x824 = arg;
}
void dLytMiniGameScore_c::fn_80291EF0() {
f32 f1 = 0.0f;
switch (field_0x824) {
case 0: f1 = 4.0; break;
case 1: f1 = 0.0; break;
case 2: f1 = 1.0; break;
case 3: f1 = 2.0; break;
case 4: f1 = 5.0; break;
case 6: f1 = 3.0; break;
}
f32 f2 = 0.0f;
if (field_0x824 == 4) {
f2 = 2.0;
} else if (field_0x824 == 0) {
f2 = 4.0;
}
f32 frame = mAnm[SCORE_ANIM_SET_POSITION].getFrame();
mAnm[SCORE_ANIM_SET_POSITION].setFrame(frame + 2.0f + f2);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true);
mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(f1);
mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false);
}
void dLytMiniGameScore_c::increaseScore(s32 arg) {
setScore(mScore + arg);
}
void dLytMiniGameScore_c::fn_80292040() {
mAnm[SCORE_ANIM_RUPEE_CHANGE].setFrame(6.0f);
mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false);
}
s32 dLytMiniGameScore_c::calcNumDigits() {
s32 num;
if (mScore >= 10000) {
num = 4;
} else if (mScore >= 1000) {
num = 3;
} else if (mScore >= 100) {
num = 2;
} else if (mScore >= 10) {
num = 1;
} else {
num = 0;
}
mHighestDigitIndex = num;
return num;
}
void dLytMiniGameScore_c::realizePosition() {
mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C + mHighestDigitIndex);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false);
}
void dLytMiniGameScore_c::setDigit(s32 digitIndex, s32 number) {
s32 idx = digitIndex + SCORE_ANIM_0_TO_9_OFFSET;
f32 frame = number;
mAnm[idx].setFrame(frame);
mAnm[idx].setAnimEnable(true);
mLyt.calc();
mAnm[idx].setAnimEnable(false);
}
void dLytMiniGameScore_c::saveScore() {
mLastScore = mScore;
}
void dLytMiniGameScore_c::resetIn() {
mAnm[SCORE_ANIM_IN].setForwardOnce();
mAnm[SCORE_ANIM_IN].setToStart();
mAnm[SCORE_ANIM_IN].setAnimEnable(true);
mLyt.getLayout()->Animate(0);
mLyt.calc();
mAnm[SCORE_ANIM_IN].setAnimEnable(false);
}
void dLytMiniGameScore_c::resetDigits() {
// NOTE: includes SCORE_ANIM_SET_POSITION
for (int i = 0; i <= SCORE_NUM_DIGITS; i++) {
s32 idx = i + SCORE_ANIM_0_TO_9_OFFSET;
mAnm[idx].setForwardOnce();
mAnm[idx].setFrame(0.0f);
mAnm[idx].setAnimEnable(false);
}
}
void dLytMiniGameScore_c::resetOut() {
mAnm[SCORE_ANIM_OUT].setForwardOnce();
mAnm[SCORE_ANIM_OUT].setToStart();
mAnm[SCORE_ANIM_OUT].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_OUT].setAnimEnable(false);
}
void dLytMiniGameScore_c::resetAlphaIn() {
mAnm[SCORE_ANIM_ALPHA_IN].setForwardOnce();
mAnm[SCORE_ANIM_ALPHA_IN].setToStart();
mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(false);
}
void dLytMiniGameScore_c::resetAlphaOut() {
mAnm[SCORE_ANIM_ALPHA_OUT].setForwardOnce();
mAnm[SCORE_ANIM_ALPHA_OUT].setToStart();
mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(false);
}
void dLytMiniGameScore_c::resetSetPosition() {
mAnm[SCORE_ANIM_SET_POSITION].setForwardOnce();
mAnm[SCORE_ANIM_SET_POSITION].setFrame(field_0x81C);
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_SET_POSITION].setAnimEnable(false);
}
void dLytMiniGameScore_c::resetRupeeChange() {
mAnm[SCORE_ANIM_RUPEE_CHANGE].setForwardOnce();
mAnm[SCORE_ANIM_RUPEE_CHANGE].setToEnd2();
mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_RUPEE_CHANGE].setAnimEnable(false);
}
void dLytMiniGameScore_c::resetGetScore() {
for (int i = 0; i < SCORE_NUM_DIGITS; i++) {
mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setForwardOnce();
mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setToStart();
mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(true);
}
mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setForwardOnce();
mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setToStart();
mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(false);
for (int i = 0; i < SCORE_NUM_DIGITS; i++) {
mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(false);
}
}
void dLytMiniGameScore_c::resetFinish() {
for (int i = 0; i < SCORE_NUM_DIGITS; i++) {
mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setForwardOnce();
mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setToStart();
mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(true);
}
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setForwardOnce();
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setToStart();
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setAnimEnable(true);
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setForwardOnce();
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setToStart();
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setAnimEnable(true);
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setForwardOnce();
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setToStart();
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setAnimEnable(false);
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setAnimEnable(false);
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setAnimEnable(false);
for (int i = 0; i < SCORE_NUM_DIGITS; i++) {
mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(false);
}
}
void dLytMiniGameScore_c::resetLoop() {
mAnm[SCORE_ANIM_LOOP_SCORE].setForwardLoop();
mAnm[SCORE_ANIM_LOOP_SCORE].setFrame(0.0f);
mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(true);
mLyt.getLayout()->Animate(0);
mLyt.calc();
mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(false);
}
void dLytMiniGameScore_c::stopIn() {
mAnm[SCORE_ANIM_IN].setAnimEnable(false);
}
void dLytMiniGameScore_c::stopOut() {
mAnm[SCORE_ANIM_OUT].setAnimEnable(false);
}
void dLytMiniGameScore_c::stopAlphaIn() {
mAnm[SCORE_ANIM_ALPHA_IN].setAnimEnable(false);
}
void dLytMiniGameScore_c::stopAlphaOut() {
mAnm[SCORE_ANIM_ALPHA_OUT].setAnimEnable(false);
}
void dLytMiniGameScore_c::stopGetScore() {
for (int i = 0; i < SCORE_NUM_DIGITS; i++) {
mAnm[i + SCORE_ANIM_GET_SCORE_OFFSET].setAnimEnable(false);
}
mAnm[SCORE_ANIM_GET_SCORE_GET_TEXT_F].setAnimEnable(false);
}
void dLytMiniGameScore_c::stopFinish() {
for (int i = 0; i < SCORE_NUM_DIGITS; i++) {
mAnm[i + SCORE_ANIM_FINISH_SCORE_OFFSET].setAnimEnable(false);
}
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_W].setAnimEnable(false);
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_X].setAnimEnable(false);
mAnm[SCORE_ANIM_FINISH_SCORE_GET_SCORE_F].setAnimEnable(false);
}
void dLytMiniGameScore_c::stopLoop() {
mAnm[SCORE_ANIM_LOOP_SCORE].setAnimEnable(false);
}
bool dLytMiniGameScore_c::isInEndReached() const {
if (mAnm[SCORE_ANIM_IN].isEnabled() && mAnm[SCORE_ANIM_IN].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameScore_c::isOutEndReached() const {
if (mAnm[SCORE_ANIM_OUT].isEnabled() && mAnm[SCORE_ANIM_OUT].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameScore_c::isAlphaInEndReached() const {
if (mAnm[SCORE_ANIM_ALPHA_IN].isEnabled() && mAnm[SCORE_ANIM_ALPHA_IN].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameScore_c::isAlphaOutEndReached() const {
if (mAnm[SCORE_ANIM_ALPHA_OUT].isEnabled() && mAnm[SCORE_ANIM_ALPHA_OUT].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameScore_c::isGetScoreEndReached() const {
if (mAnm[SCORE_ANIM_GET_SCORE_OFFSET].isEnabled() && mAnm[SCORE_ANIM_GET_SCORE_OFFSET].isEndReached()) {
return true;
}
return false;
}
bool dLytMiniGameScore_c::isFinishEndReached() const {
if (mAnm[SCORE_ANIM_FINISH_SCORE_OFFSET].isEnabled() && mAnm[SCORE_ANIM_FINISH_SCORE_OFFSET].isEndReached()) {
return true;
}
return false;
}
void dLytMiniGameScore_c::fn_80292C30() {
s32 t = 0;
if (field_0x828) {
t = field_0x824 == 4 ? 4 : field_0x824 == 0 ? 6 : 0;
}
PaneCalc calc;
switch (mVariant) {
case SCORE_VARIANT_BAMBOO_CUTTING: {
dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore);
loadTextVariant(1);
field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr);
// TODO
calc.calc(mpPanes[mHighestDigitIndex + 15], mpPanes[15]);
mFloats[field_0x81C + mHighestDigitIndex] =
calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]);
mFloats[field_0x81C + mHighestDigitIndex] += field_0x7FC;
mFloats[field_0x81C + mHighestDigitIndex] += field_0x800;
break;
}
case SCORE_VARIANT_PUMPKIN_ARCHERY: {
dMessage_c::getGlobalTagProcessor()->setNumericArg0(mScore);
loadTextVariant(0);
field_0x7E8 = mpTextBoxes[0]->GetLineWidth(nullptr);
// TODO
calc.calc(mpPanes[mHighestDigitIndex + 15], mpPanes[15]);
mFloats[field_0x81C + mHighestDigitIndex] =
calc.work[3][0] / 2.0f + calc.work[4][0] / 2.0f + (calc.work[1][0] - calc.work[2][0]);
mFloats[field_0x81C + mHighestDigitIndex] += field_0x7FC;
mFloats[field_0x81C + mHighestDigitIndex] += field_0x800;
break;
}
}
f32 f = mFloats[mHighestDigitIndex + t + field_0x81C];
if (field_0x830 != 0) {
nw4r::lyt::Size size = mpTextBoxes[0]->GetSize();
switch (field_0x830) {
case 1: {
mVec3_c pos(
f / 2.0f + size.width / 2.0f - field_0x7E8 + 0.0f + (f32)field_0x7F4 - (f32)field_0x800,
field_0x834[1][1] + (f32)field_0x7EC + (f32)field_0x7F8, 0.0f
);
mpPanes[SCORE_PANE_UNIT]->SetTranslate(pos);
break;
}
case 2: {
mVec3_c pos(
(f32)field_0x7E8 - f / 2.0f - size.width / 2.0f + 0.0 + (f32)field_0x7F4 + (f32)field_0x800,
field_0x834[1][1] + (f32)field_0x7EC + (f32)field_0x7F8, 0.0f
);
mpPanes[SCORE_PANE_UNIT]->SetTranslate(pos);
break;
}
}
}
// TODO - this uses similar annoying calculations and stack as above but
// I can't be bothered right now. Let's at least give this code
// a chance to be equivalent, even if it's not matching...
nw4r::lyt::Pane *p = mpPanes[SCORE_PANE_P_POSITION_0];
f32 fVar2 = p->GetSize().width * p->GetScale().x;
f32 fVar1 = field_0x834[0][1];
f32 fVar3 = p->GetParent()->GetTranslate().x + p->GetTranslate().x;
f32 local_e0 = 0.0;
if (field_0x830 == 0) {
local_e0 = ((-fVar3 + f * 0.5) - fVar2 * 0.5) + 0.0;
} else if (field_0x830 == 1) {
local_e0 = (((((-fVar3 + f * 0.5) - fVar2 * 0.5) - field_0x7E8) + 0.0) - (f32)field_0x7FC) - (f32)field_0x804;
} else if (field_0x830 == 2) {
local_e0 = ((-fVar3 + f * 0.5) - fVar2 * 0.5) + 0.0;
}
mVec3_c translate(local_e0 + (f32)field_0x7F4, fVar1 + field_0x7F8, 0.0f);
mpPanes[SCORE_PANE_POSITION]->SetTranslate(translate);
fn_80293450(mHighestDigitIndex + t + field_0x81C);
nw4r::math::MTX34 mtx = mpPanes[SCORE_PANE_CENTER]->GetGlobalMtx();
mVec3_c pos(mtx._03, mtx._13, 0.0f);
mpPanes[SCORE_PANE_POSITION_ALL]->SetTranslate(pos);
}
void dLytMiniGameScore_c::loadTextVariant(s32 variant) {
for (int i = 0; i < SCORE_NUM_TEXTBOXES; i++) {
mLyt.loadTextVariant(mpTextBoxes[i], variant);
}
}
void dLytMiniGameScore_c::fn_80293410() {
(void)getCurrentLanguage1();
field_0x830 = 1;
}
void dLytMiniGameScore_c::fn_80293450(s32 idx) {
// TODO - aaaaaaaaaaaaa
f32 tmp = field_0x7F0 + mFloats[idx];
mpPanes[11]->SetSize(nw4r::lyt::Size(tmp, mpPanes[11]->GetSize().height));
mpPanes[11]->SetTranslate(mVec3_c(0.0f, 0.0f, 0.0f));
tmp /= 2.0f;
mpPanes[9]->SetTranslate(mVec3_c(-tmp - mpPanes[9]->GetSize().width, 0.0f, 0.0f));
mpPanes[10]->SetTranslate(mVec3_c(tmp + mpPanes[10]->GetSize().width, 0.0f, 0.0f));
tmp = field_0x7F0 + mFloats[idx];
mpPanes[8]->SetSize(nw4r::lyt::Size(tmp, mpPanes[8]->GetSize().height));
mpPanes[8]->SetTranslate(mVec3_c(-2.0f, -2.0f, 0.0f));
tmp /= 2.0f;
mpPanes[6]->SetTranslate(mVec3_c(-tmp - mpPanes[6]->GetSize().width - 2.0f, -2.0f, 0.0f));
mpPanes[7]->SetTranslate(mVec3_c(tmp + mpPanes[7]->GetSize().width - 2.0f, -2.0f, 0.0f));
mpPanes[5]->SetSize(nw4r::lyt::Size(
mpPanes[10]->GetSize().width + mpPanes[11]->GetSize().width + mpPanes[9]->GetSize().width - 36.0f,
mpPanes[5]->GetSize().height
));
mpPanes[5]->SetTranslate(mVec3_c(0.0f, 0.0f, 0.0f));
mpPanes[4]->SetTranslate(mVec3_c(field_0x834[2][0], field_0x834[2][1], 0.0f));
}
static const d2d::LytBrlanMapping brlanMapScoreSd[] = {
{ "miniGameScoreSd_00_0to9.brlan", "G_0to9_00"},
{ "miniGameScoreSd_00_0to9.brlan", "G_0to9_01"},
{"miniGameScoreSd_00_setPosition00.brlan", "G_setPosition_00"},
{ "miniGameScoreSd_00_scoreUp.brlan", "G_animAll_00"},
{ "miniGameScoreSd_00_scoreDown.brlan", "G_animAll_00"},
};
#define SCORE_SD_ANIM_0_TO_9_OFFSET 0
#define SCORE_SD_ANIM_SET_POSITION 2
#define SCORE_SD_ANIM_SCORE_UP 3
#define SCORE_SD_ANIM_SCORE_DOWN 4
#define SCORE_SD_NUM_ANIMS 5
#define SCORE_SD_NUM_DIGITS 2
bool dLytMiniGameScoreSd_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("miniGameScoreSd_00.brlyt", nullptr);
for (int i = 0; i < SCORE_SD_NUM_ANIMS; i++) {
mAnm[i].init(brlanMapScoreSd[i].mFile, resAcc, mLyt.getLayout(), brlanMapScoreSd[i].mName);
mAnm[i].bind(false);
mAnm[i].setRate(1.0f);
mAnm[i].setAnimEnable(false);
}
sInstance = this;
return true;
}
bool dLytMiniGameScoreSd_c::remove() {
if (sInstance == nullptr) {
return true;
}
for (int i = 0; i < SCORE_SD_NUM_ANIMS; i++) {
mAnm[i].unbind();
mAnm[i].remove();
}
sInstance = nullptr;
return true;
}
bool dLytMiniGameScoreSd_c::execute() {
if (sInstance == nullptr) {
return true;
}
if (mIsVisible) {
if (isScoreUpEndReached()) {
stopScoreUp();
mIsVisible = false;
}
if (isScoreDownEndReached()) {
stopScoreDown();
mIsVisible = false;
}
for (int i = 0; i < SCORE_SD_NUM_ANIMS; i++) {
if (mAnm[i].isEnabled()) {
mAnm[i].play();
}
}
mLyt.calc();
}
return true;
}
bool dLytMiniGameScoreSd_c::draw() {
if (sInstance == nullptr) {
return true;
}
if (mIsVisible) {
mLyt.addToDrawList();
}
return true;
}
void dLytMiniGameScoreSd_c::init() {
if (sInstance == nullptr) {
return;
}
resetScoreUp();
resetScoreDown();
resetDigits();
resetPosition();
setScoreInternal(0);
mAnm[SCORE_SD_ANIM_SCORE_UP].setToEnd2();
mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(false);
}
void dLytMiniGameScoreSd_c::setScoreUp(s32 score) {
if (sInstance == nullptr) {
return;
}
setScoreInternal(score);
startScoreUp();
dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreUpSound(score);
mIsVisible = true;
}
void dLytMiniGameScoreSd_c::setScoreDown(s32 score) {
if (sInstance == nullptr) {
return;
}
setScoreInternal(score);
startScoreDown();
dSndSmallEffectMgr_c::GetInstance()->playMinigameScoreDownSound(score);
mIsVisible = true;
}
void dLytMiniGameScoreSd_c::setScoreInternal(s32 score) {
s32 digits[2];
digits[1] = score / 10;
digits[0] = score % 10;
s32 num = 0;
if (digits[1] != 0) {
num = 1;
} else if (digits[0] != 0) {
num = 0;
}
setHighestDigitIndex(num);
for (int i = 0; i <= num; i++) {
setDigit(i, digits[i]);
}
field_0x1D4 = score;
}
void dLytMiniGameScoreSd_c::setHighestDigitIndex(s32 num) {
f32 frame = num + 6.0f;
mAnm[SCORE_SD_ANIM_SET_POSITION].setRate(0.0f);
mAnm[SCORE_SD_ANIM_SET_POSITION].setFrame(frame);
mAnm[SCORE_SD_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_SD_ANIM_SET_POSITION].setAnimEnable(false);
}
void dLytMiniGameScoreSd_c::setDigit(s32 digitIndex, s32 number) {
u8 idx = digitIndex + SCORE_SD_ANIM_0_TO_9_OFFSET;
f32 frame = 0.0f;
switch (number) {
case 0: frame = 0.0f; break;
case 1: frame = 1.0f; break;
case 2: frame = 2.0f; break;
case 4: frame = 3.0f; break;
case 6: frame = 4.0f; break;
case 8: frame = 5.0f; break;
}
mAnm[idx].setFrame(frame);
mAnm[idx].setAnimEnable(true);
mLyt.calc();
mAnm[idx].setAnimEnable(false);
}
void dLytMiniGameScoreSd_c::resetScoreUp() {
mAnm[SCORE_SD_ANIM_SCORE_UP].setForwardOnce();
mAnm[SCORE_SD_ANIM_SCORE_UP].setToEnd2();
mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(false);
}
void dLytMiniGameScoreSd_c::resetScoreDown() {
mAnm[SCORE_SD_ANIM_SCORE_DOWN].setForwardOnce();
mAnm[SCORE_SD_ANIM_SCORE_DOWN].setToEnd2();
mAnm[SCORE_SD_ANIM_SCORE_DOWN].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_SD_ANIM_SCORE_DOWN].setAnimEnable(false);
}
void dLytMiniGameScoreSd_c::resetDigits() {
// NOTE: includes SCORE_SD_ANIM_SET_POSITION
for (int i = 0; i <= SCORE_SD_NUM_DIGITS; i++) {
mAnm[i + SCORE_SD_ANIM_0_TO_9_OFFSET].setForwardOnce();
mAnm[i + SCORE_SD_ANIM_0_TO_9_OFFSET].setFrame(0.0f);
mAnm[i + SCORE_SD_ANIM_0_TO_9_OFFSET].setAnimEnable(false);
}
}
void dLytMiniGameScoreSd_c::resetPosition() {
mAnm[SCORE_SD_ANIM_SET_POSITION].setForwardOnce();
mAnm[SCORE_SD_ANIM_SET_POSITION].setFrame(6.0f);
mAnm[SCORE_SD_ANIM_SET_POSITION].setAnimEnable(true);
mLyt.calc();
mAnm[SCORE_SD_ANIM_SET_POSITION].setAnimEnable(false);
}
void dLytMiniGameScoreSd_c::startScoreUp() {
mAnm[SCORE_SD_ANIM_SCORE_UP].setToStart();
mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(true);
}
void dLytMiniGameScoreSd_c::startScoreDown() {
mAnm[SCORE_SD_ANIM_SCORE_DOWN].setToStart();
mAnm[SCORE_SD_ANIM_SCORE_DOWN].setAnimEnable(true);
}
void dLytMiniGameScoreSd_c::stopScoreUp() {
mAnm[SCORE_SD_ANIM_SCORE_UP].setAnimEnable(false);
}
void dLytMiniGameScoreSd_c::stopScoreDown() {
mAnm[SCORE_SD_ANIM_SCORE_DOWN].setAnimEnable(false);
}
bool dLytMiniGameScoreSd_c::isScoreUpEndReached() const {
s32 idx = SCORE_SD_ANIM_SCORE_UP;
if (mAnm[idx].isEnabled() && mAnm[idx].isStop2()) {
return true;
}
return false;
}
bool dLytMiniGameScoreSd_c::isScoreDownEndReached() const {
s32 idx = SCORE_SD_ANIM_SCORE_DOWN;
if (mAnm[idx].isEnabled() && mAnm[idx].isStop2()) {
return true;
}
return false;
}
SPECIAL_BASE_PROFILE(LYT_MINI_GAME, dLytMiniGame_c, fProfile::LYT_MINI_GAME, 0x2B4, 0x6F9);
static const char *sMiniGame = "MiniGame";
static const char *sMiniGameScore = "MiniGameScore";
static const char *sMiniGameTime = "MiniGameTime";
static const char *sMiniGameBugs = "MiniGameBugs";
static const char *sMiniGamePumpkin = "MiniGamePumpkin";
static const char *sMiniGameSd = "MiniGameSd";
int dLytMiniGame_c::create() {
mVariant = mParams;
switch (mVariant) {
case VARIANT_BAMBOO_CUTTING: {
if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) {
return NOT_READY;
}
if (isLoading(sMiniGame) || isLoading(sMiniGameScore)) {
return NOT_READY;
}
attachLoadedData(sMiniGame, mResAccStart);
attachLoadedData(sMiniGameScore, mResAccScore);
mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_BAMBOO_CUTTING);
mScore.build(&mResAccScore);
mStart.build(&mResAccStart);
break;
}
case VARIANT_FUN_FUN_ISLAND: {
if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameSd, SLOT_MINI_GAME_SCORE_SD) ||
loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) {
return NOT_READY;
}
if (isLoading(sMiniGame) || isLoading(sMiniGameSd) || isLoading(sMiniGameScore)) {
return NOT_READY;
}
attachLoadedData(sMiniGame, mResAccStart);
attachLoadedData(sMiniGameSd, mResAccScoreSd);
attachLoadedData(sMiniGameScore, mResAccScore);
mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_FUN_FUN_ISLAND);
mScore.build(&mResAccScore);
mScoreSd.build(&mResAccScoreSd);
mStart.build(&mResAccStart);
break;
}
case VARIANT_THRILL_DIGGER: {
if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) {
return NOT_READY;
}
if (isLoading(sMiniGame) || isLoading(sMiniGameScore)) {
return NOT_READY;
}
attachLoadedData(sMiniGame, mResAccStart);
attachLoadedData(sMiniGameScore, mResAccScore);
mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_THRILL_DIGGER);
mScore.build(&mResAccScore);
mStart.build(&mResAccStart);
break;
}
case VARIANT_INSECT_CAPTURE: {
if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameBugs, SLOT_MINI_GAME_BUGS) ||
loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) {
return NOT_READY;
}
if (isLoading(sMiniGame) || isLoading(sMiniGameBugs) || isLoading(sMiniGameTime)) {
return NOT_READY;
}
attachLoadedData(sMiniGame, mResAccStart);
attachLoadedData(sMiniGameBugs, mResAccBugs);
attachLoadedData(sMiniGameTime, mResAccTime);
mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_INSECT_CAPTURE);
mTime.build(&mResAccTime);
mBugs.build(&mResAccBugs);
mStart.build(&mResAccStart);
break;
}
case VARIANT_SPIRAL_CHARGE_TUTORIAL: {
if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE) ||
loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) {
return NOT_READY;
}
if (isLoading(sMiniGame) || isLoading(sMiniGameScore) || isLoading(sMiniGameTime)) {
return NOT_READY;
}
attachLoadedData(sMiniGame, mResAccStart);
attachLoadedData(sMiniGameScore, mResAccScore);
attachLoadedData(sMiniGameTime, mResAccTime);
mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_SPIRAL_CHARGE_TUTORIAL);
mTime.build(&mResAccTime);
mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_SPIRAL_CHARGE_TUTORIAL);
mScore.build(&mResAccScore);
mStart.build(&mResAccStart);
break;
}
case VARIANT_PUMPKIN_ARCHERY: {
if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGamePumpkin, SLOT_MINI_GAME_PUMPKIN) ||
loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) {
return NOT_READY;
}
if (isLoading(sMiniGame) || isLoading(sMiniGamePumpkin) || isLoading(sMiniGameScore) ||
isLoading(sMiniGameTime)) {
return NOT_READY;
}
attachLoadedData(sMiniGame, mResAccStart);
attachLoadedData(sMiniGamePumpkin, mResAccPumpkin);
attachLoadedData(sMiniGameScore, mResAccScore);
attachLoadedData(sMiniGameTime, mResAccTime);
mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_PUMPKIN_ARCHERY);
mTime.build(&mResAccTime);
mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_PUMPKIN_ARCHERY);
mScore.build(&mResAccScore);
mStart.build(&mResAccStart);
mPumpkin.build(&mResAccPumpkin);
break;
}
case VARIANT_ROLLERCOASTER: {
if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) {
return NOT_READY;
}
if (isLoading(sMiniGame) || isLoading(sMiniGameTime)) {
return NOT_READY;
}
attachLoadedData(sMiniGame, mResAccStart);
attachLoadedData(sMiniGameTime, mResAccTime);
mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_ROLLERCOASTER);
mTime.build(&mResAccTime);
mStart.build(&mResAccStart);
break;
}
case VARIANT_BOSS_RUSH: {
if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) {
return NOT_READY;
}
if (isLoading(sMiniGame) || isLoading(sMiniGameTime)) {
return NOT_READY;
}
attachLoadedData(sMiniGame, mResAccStart);
attachLoadedData(sMiniGameTime, mResAccTime);
mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_BOSS_RUSH);
mTime.build(&mResAccTime);
mStart.build(&mResAccStart);
break;
}
case VARIANT_TRIAL_TIME_ATTACK: {
if (loadData(sMiniGame, SLOT_MINI_GAME) || loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) {
return NOT_READY;
}
if (isLoading(sMiniGame) || isLoading(sMiniGameTime)) {
return NOT_READY;
}
attachLoadedData(sMiniGame, mResAccStart);
attachLoadedData(sMiniGameTime, mResAccTime);
mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_TRIAL_TIME_ATTACK);
mTime.build(&mResAccTime);
mStart.build(&mResAccStart);
break;
}
case VARIANT_10: {
if (loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) {
return NOT_READY;
}
if (isLoading(sMiniGameScore)) {
return NOT_READY;
}
attachLoadedData(sMiniGameScore, mResAccScore);
mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_BAMBOO_CUTTING);
mScore.setField_0x816(true);
mScore.build(&mResAccScore);
break;
}
case VARIANT_11: {
if (loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) {
return NOT_READY;
}
if (isLoading(sMiniGameScore)) {
return NOT_READY;
}
attachLoadedData(sMiniGameScore, mResAccScore);
mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_THRILL_DIGGER);
mScore.setField_0x816(true);
mScore.build(&mResAccScore);
break;
}
case VARIANT_12: {
if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) {
return NOT_READY;
}
if (isLoading(sMiniGameTime)) {
return NOT_READY;
}
attachLoadedData(sMiniGameTime, mResAccTime);
mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_INSECT_CAPTURE);
mTime.setField_0x7EE(true);
mTime.build(&mResAccTime);
break;
}
case VARIANT_13: {
if (loadData(sMiniGameScore, SLOT_MINI_GAME_SCORE)) {
return NOT_READY;
}
if (isLoading(sMiniGameScore)) {
return NOT_READY;
}
attachLoadedData(sMiniGameScore, mResAccScore);
mScore.setVariant(dLytMiniGameScore_c::SCORE_VARIANT_PUMPKIN_ARCHERY);
mScore.setField_0x816(true);
mScore.build(&mResAccScore);
break;
}
case VARIANT_14: {
if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) {
return NOT_READY;
}
if (isLoading(sMiniGameTime)) {
return NOT_READY;
}
attachLoadedData(sMiniGameTime, mResAccTime);
mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_ROLLERCOASTER);
mTime.setField_0x7EE(true);
mTime.build(&mResAccTime);
break;
}
case VARIANT_15: {
if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) {
return NOT_READY;
}
if (isLoading(sMiniGameTime)) {
return NOT_READY;
}
attachLoadedData(sMiniGameTime, mResAccTime);
mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_BOSS_RUSH);
mTime.setField_0x7EE(true);
mTime.build(&mResAccTime);
break;
}
case VARIANT_16: {
if (loadData(sMiniGameTime, SLOT_MINI_GAME_TIME)) {
return NOT_READY;
}
if (isLoading(sMiniGameTime)) {
return NOT_READY;
}
attachLoadedData(sMiniGameTime, mResAccTime);
mTime.setVariant(dLytMiniGameTime_c::TIME_VARIANT_TRIAL_TIME_ATTACK);
mTime.setField_0x7EE(true);
mTime.build(&mResAccTime);
break;
}
}
init();
sInstance = this;
return SUCCEEDED;
}
int dLytMiniGame_c::doDelete() {
mScore.remove();
mScoreSd.remove();
mStart.remove();
mTime.remove();
mBugs.remove();
mPumpkin.remove();
switch (mVariant) {
case VARIANT_BAMBOO_CUTTING: {
mResAccStart.detach();
mResAccScore.detach();
unloadData(sMiniGame);
unloadData(sMiniGameScore);
break;
}
case VARIANT_FUN_FUN_ISLAND: {
mResAccStart.detach();
mResAccScoreSd.detach();
mResAccScore.detach();
unloadData(sMiniGame);
unloadData(sMiniGameSd);
unloadData(sMiniGameScore);
break;
}
case VARIANT_THRILL_DIGGER: {
mResAccStart.detach();
mResAccScore.detach();
unloadData(sMiniGame);
unloadData(sMiniGameScore);
break;
}
case VARIANT_INSECT_CAPTURE: {
mResAccStart.detach();
mResAccBugs.detach();
mResAccTime.detach();
unloadData(sMiniGame);
unloadData(sMiniGameBugs);
unloadData(sMiniGameTime);
break;
}
case VARIANT_SPIRAL_CHARGE_TUTORIAL: {
mResAccStart.detach();
mResAccScore.detach();
mResAccTime.detach();
unloadData(sMiniGame);
unloadData(sMiniGameScore);
unloadData(sMiniGameTime);
break;
}
case VARIANT_PUMPKIN_ARCHERY: {
mResAccStart.detach();
mResAccPumpkin.detach();
mResAccScore.detach();
mResAccTime.detach();
unloadData(sMiniGame);
unloadData(sMiniGamePumpkin);
unloadData(sMiniGameScore);
unloadData(sMiniGameTime);
break;
}
case VARIANT_ROLLERCOASTER: {
mResAccStart.detach();
mResAccTime.detach();
unloadData(sMiniGame);
unloadData(sMiniGameTime);
break;
}
case VARIANT_BOSS_RUSH: {
mResAccStart.detach();
mResAccTime.detach();
unloadData(sMiniGame);
unloadData(sMiniGameTime);
break;
}
case VARIANT_TRIAL_TIME_ATTACK: {
mResAccStart.detach();
mResAccTime.detach();
unloadData(sMiniGame);
unloadData(sMiniGameTime);
break;
}
case VARIANT_10: {
mResAccScore.detach();
unloadData(sMiniGameScore);
break;
}
case VARIANT_11: {
mResAccScore.detach();
unloadData(sMiniGameScore);
break;
}
case VARIANT_12: {
mResAccTime.detach();
unloadData(sMiniGameTime);
break;
}
case VARIANT_13: {
mResAccScore.detach();
unloadData(sMiniGameScore);
break;
}
case VARIANT_14: {
mResAccTime.detach();
unloadData(sMiniGameTime);
break;
}
case VARIANT_15: {
mResAccTime.detach();
unloadData(sMiniGameTime);
break;
}
case VARIANT_16: {
mResAccTime.detach();
unloadData(sMiniGameTime);
break;
}
}
sInstance = nullptr;
return SUCCEEDED;
}
int dLytMiniGame_c::execute() {
switch (mVariant) {
case VARIANT_BAMBOO_CUTTING:
case VARIANT_10: fn_80295F90(); break;
case VARIANT_FUN_FUN_ISLAND: fn_80296000(); break;
case VARIANT_THRILL_DIGGER:
case VARIANT_11: fn_80296070(); break;
case VARIANT_INSECT_CAPTURE:
case VARIANT_12: fn_80296150(); break;
case VARIANT_SPIRAL_CHARGE_TUTORIAL: fn_80296210(); break;
case VARIANT_PUMPKIN_ARCHERY:
case VARIANT_13: fn_802962A0(); break;
case VARIANT_ROLLERCOASTER:
case VARIANT_14: fn_80296330(); break;
case VARIANT_BOSS_RUSH:
case VARIANT_15: fn_802963E0(); break;
case VARIANT_TRIAL_TIME_ATTACK:
case VARIANT_16: fn_80296480(); break;
}
mScore.execute();
mScoreSd.execute();
mTime.execute();
mBugs.execute();
mPumpkin.execute();
if (!isPopupOpenExceptHelp()) {
mStart.execute();
}
return SUCCEEDED;
}
int dLytMiniGame_c::draw() {
mPumpkin.draw();
mScoreSd.draw();
mBugs.draw();
mScore.draw();
mTime.draw();
if (!isPopupOpenExceptHelp()) {
mStart.draw();
}
return SUCCEEDED;
}
void dLytMiniGame_c::scoreRelatedExecute() {
switch (mVariant) {
case VARIANT_BAMBOO_CUTTING:
case VARIANT_THRILL_DIGGER:
case VARIANT_SPIRAL_CHARGE_TUTORIAL:
case VARIANT_PUMPKIN_ARCHERY: mScore.fn_80291410(); break;
case VARIANT_FUN_FUN_ISLAND:
if (fn_80295DB0()) {
mScore.startAlphaIn();
} else {
mScore.fn_80291410();
mScore.setField_0x828(false);
}
break;
case VARIANT_10:
case VARIANT_11:
case VARIANT_13: mScore.startAlphaIn();
}
}
void dLytMiniGame_c::scoreRelated() {
switch (mVariant) {
case VARIANT_FUN_FUN_ISLAND:
if (fn_80295DB0()) {
mScore.startAlphaOut();
} else {
mScore.startOut();
}
break;
case VARIANT_10:
case VARIANT_11:
case VARIANT_13: mScore.startAlphaOut(); break;
}
}
void dLytMiniGame_c::setDisplayedPoints(s32 points) {
switch (mVariant) {
case VARIANT_BAMBOO_CUTTING:
case VARIANT_SPIRAL_CHARGE_TUTORIAL:
case VARIANT_PUMPKIN_ARCHERY: mScore.setScore(points); break;
case VARIANT_FUN_FUN_ISLAND:
fn_80295DB0();
mScore.setScore(points);
break;
case VARIANT_THRILL_DIGGER: mScore.fn_80291D40(points); break;
case VARIANT_10:
case VARIANT_13: mScore.setScore(points); break;
case VARIANT_11:
mScore.setScore(points);
field_0x3864 = 1;
field_0x3865 = 0;
break;
}
}
void dLytMiniGame_c::fn_80295900(s32 arg) {
mScore.fn_80291ED0(arg);
mScore.setField_0x828(true);
}
void dLytMiniGame_c::startCountdown() {
switch (mVariant) {
case VARIANT_BAMBOO_CUTTING:
case VARIANT_FUN_FUN_ISLAND:
case VARIANT_THRILL_DIGGER:
case VARIANT_INSECT_CAPTURE:
case VARIANT_SPIRAL_CHARGE_TUTORIAL:
case VARIANT_PUMPKIN_ARCHERY:
case VARIANT_ROLLERCOASTER:
case VARIANT_TRIAL_TIME_ATTACK: mStart.startCountdown(); break;
case VARIANT_BOSS_RUSH: mStart.startCountdown120(); break;
}
}
void dLytMiniGame_c::startFinish() {
switch (mVariant) {
case VARIANT_BAMBOO_CUTTING:
case VARIANT_FUN_FUN_ISLAND:
case VARIANT_THRILL_DIGGER:
case VARIANT_PUMPKIN_ARCHERY:
mStart.startFinish();
mScore.startFinish();
break;
case VARIANT_INSECT_CAPTURE:
case VARIANT_ROLLERCOASTER:
case VARIANT_BOSS_RUSH:
case VARIANT_TRIAL_TIME_ATTACK:
mStart.startFinish();
mTime.startFinish();
break;
case VARIANT_SPIRAL_CHARGE_TUTORIAL:
mStart.startFinish();
mScore.startFinish();
break;
}
}
void dLytMiniGame_c::fn_80295A20() {
switch (mVariant) {
case VARIANT_BAMBOO_CUTTING:
case VARIANT_FUN_FUN_ISLAND:
case VARIANT_THRILL_DIGGER:
// case VARIANT_PUMPKIN_ARCHERY:
mStart.startTimeup();
mScore.startFinish();
break;
case VARIANT_INSECT_CAPTURE:
case VARIANT_ROLLERCOASTER:
case VARIANT_BOSS_RUSH:
case VARIANT_TRIAL_TIME_ATTACK:
mStart.startTimeup();
mTime.startFinish();
break;
case VARIANT_SPIRAL_CHARGE_TUTORIAL:
mStart.startTimeup();
mScore.startFinish();
break;
}
}
bool dLytMiniGame_c::isStartCountdownDone() {
switch (mVariant) {
case VARIANT_BAMBOO_CUTTING:
case VARIANT_FUN_FUN_ISLAND:
case VARIANT_THRILL_DIGGER:
case VARIANT_INSECT_CAPTURE:
case VARIANT_SPIRAL_CHARGE_TUTORIAL:
case VARIANT_PUMPKIN_ARCHERY:
case VARIANT_ROLLERCOASTER:
case VARIANT_BOSS_RUSH:
case VARIANT_TRIAL_TIME_ATTACK: return mStart.isCountdownEndReached();
}
return false;
}
bool dLytMiniGame_c::isFinishAnimDone() {
switch (mVariant) {
case VARIANT_BAMBOO_CUTTING:
case VARIANT_FUN_FUN_ISLAND:
case VARIANT_THRILL_DIGGER:
case VARIANT_INSECT_CAPTURE:
case VARIANT_SPIRAL_CHARGE_TUTORIAL:
case VARIANT_PUMPKIN_ARCHERY:
case VARIANT_ROLLERCOASTER:
case VARIANT_BOSS_RUSH:
case VARIANT_TRIAL_TIME_ATTACK: return mStart.isFinishEndReached();
}
return false;
}
bool dLytMiniGame_c::isTimeupAnimDone() {
switch (mVariant) {
case VARIANT_BAMBOO_CUTTING:
case VARIANT_FUN_FUN_ISLAND:
case VARIANT_THRILL_DIGGER:
case VARIANT_INSECT_CAPTURE:
case VARIANT_SPIRAL_CHARGE_TUTORIAL:
// case VARIANT_PUMPKIN_ARCHERY:
case VARIANT_ROLLERCOASTER:
case VARIANT_BOSS_RUSH:
case VARIANT_TRIAL_TIME_ATTACK: return mStart.isTimeupEndReached();
}
return false;
}
void dLytMiniGame_c::fn_80295B20(s32 score) {
mScoreSd.setScoreUp(score);
}
void dLytMiniGame_c::fn_80295B30(s32 score) {
mScoreSd.setScoreDown(score);
}
void dLytMiniGame_c::timeRelatedExecute() {
switch (mVariant) {
case VARIANT_INSECT_CAPTURE:
case VARIANT_PUMPKIN_ARCHERY:
case VARIANT_ROLLERCOASTER:
case VARIANT_BOSS_RUSH:
case VARIANT_TRIAL_TIME_ATTACK: mTime.fn_8028DD80(); break;
case VARIANT_SPIRAL_CHARGE_TUTORIAL:
if (!dScGame_c::GetInstance()->isFadingIn()) {
mTime.fn_8028DD80();
}
break;
case VARIANT_12:
case VARIANT_14:
case VARIANT_15:
case VARIANT_16: mTime.startAlphaIn(); break;
}
}
void dLytMiniGame_c::timeRelated() {
switch (mVariant) {
case VARIANT_12:
case VARIANT_14:
case VARIANT_15:
case VARIANT_16: mTime.startAlphaOut(); break;
}
}
void dLytMiniGame_c::setDisplayedTime(s32 time) {
switch (mVariant) {
case VARIANT_INSECT_CAPTURE:
case VARIANT_ROLLERCOASTER:
case VARIANT_BOSS_RUSH:
case VARIANT_TRIAL_TIME_ATTACK: mTime.setTimerValueInMilliSeconds(time); break;
case VARIANT_PUMPKIN_ARCHERY: mTime.setTimerSecondsValueInMilliSeconds(time); break;
case VARIANT_SPIRAL_CHARGE_TUTORIAL: mTime.setTimerSecondsValueInMilliSeconds(time); break;
case VARIANT_12:
case VARIANT_14:
case VARIANT_15:
case VARIANT_16: mTime.setTimerValueInMilliSeconds(time); break;
}
}
void dLytMiniGame_c::setHighscore(s32 time) {
switch (mVariant) {
case VARIANT_INSECT_CAPTURE:
case VARIANT_ROLLERCOASTER:
case VARIANT_BOSS_RUSH:
case VARIANT_TRIAL_TIME_ATTACK:
// case VARIANT_SPIRAL_CHARGE_TUTORIAL:
case VARIANT_PUMPKIN_ARCHERY:
case VARIANT_12:
case VARIANT_14:
case VARIANT_15:
case VARIANT_16: mTime.setBestTime(time); break;
}
}
void dLytMiniGame_c::setShowBestTime(bool show) {
switch (mVariant) {
case VARIANT_INSECT_CAPTURE:
case VARIANT_ROLLERCOASTER:
case VARIANT_BOSS_RUSH:
case VARIANT_TRIAL_TIME_ATTACK:
// case VARIANT_SPIRAL_CHARGE_TUTORIAL:
case VARIANT_PUMPKIN_ARCHERY:
case VARIANT_12:
case VARIANT_14:
case VARIANT_15:
case VARIANT_16: mTime.setShowBestTime(show); break;
}
}
void dLytMiniGame_c::startBugsAllIconsIn() {
mBugs.startAllIconsIn();
}
void dLytMiniGame_c::set5Bugs() {
mBugs.setBugsNumLevel(0);
}
void dLytMiniGame_c::set10Bugs() {
mBugs.setBugsNumLevel(1);
}
void dLytMiniGame_c::reInitBugs() {
mBugs.init();
}
void dLytMiniGame_c::setBug(s32 slot, s32 bugIndex) {
mBugs.setBug(slot, bugIndex);
}
void dLytMiniGame_c::collectBug(s32 slot) {
mBugs.collectBug(slot);
}
void dLytMiniGame_c::startBugsFlash() {
mBugs.startBugsFlash();
}
bool dLytMiniGame_c::isBugIconOnEndReached(s32 slot) const {
return mBugs.isSlotIconOnEndReached(slot);
}
bool dLytMiniGame_c::isBugCollected(s32 slot) const {
return mBugs.isSlotBugCollected(slot);
}
void dLytMiniGame_c::fn_80295D80() {
scoreRelatedExecute();
}
void dLytMiniGame_c::fn_80295D90(s32 points) {
setDisplayedPoints(points);
}
void dLytMiniGame_c::getPumpkin(const mVec3_c &pumpkinPos, s32 unk, bool doubleScore) {
mPumpkin.getPoint(pumpkinPos, unk, doubleScore);
}
// cannot be const...
bool dLytMiniGame_c::fn_80295DB0() {
bool ret = false;
switch (mVariant) {
case VARIANT_10:
case VARIANT_11:
case VARIANT_12:
case VARIANT_13:
case VARIANT_14:
case VARIANT_15:
case VARIANT_16: ret = true; break;
case VARIANT_FUN_FUN_ISLAND:
if (!MinigameManager::GetInstance()->checkInFunFunIsland()) {
ret = true;
}
break;
}
return ret;
}
bool dLytMiniGame_c::isInEvent() const {
bool ret = false;
if (EventManager::isInEvent()) {
ret = true;
}
return ret;
}
bool dLytMiniGame_c::isPopupOpen() const {
bool ret = false;
if (dLytMeter_c::isPopupOpen()) {
ret = true;
}
return ret;
}
bool dLytMiniGame_c::isPopupOpenExceptHelp() const {
bool ret = false;
if (isPopupOpen()) {
ret = true;
}
if (dLytMeter_c::GetInstance()->isHelpOpen()) {
ret = false;
}
return ret;
}
bool dLytMiniGame_c::isFadingOut() const {
bool ret = false;
if (dStageMgr_c::GetInstance()->isFadingOut() || dScGame_c::GetInstance()->isFadingOut()) {
ret = true;
}
return ret;
}
void dLytMiniGame_c::fn_80295F90() {
if (fn_80295DB0()) {
// nothing
} else {
if (isPopupOpen()) {
mScore.startOutTemp();
} else {
mScore.startIn();
}
if (isFadingOut()) {
mScore.startOut();
}
}
}
void dLytMiniGame_c::fn_80296000() {
if (fn_80295DB0()) {
mScore.setField_0x816(true);
} else {
mScore.setField_0x816(false);
if (isPopupOpen()) {
mScore.startOutTemp();
} else {
mScore.startIn();
}
}
}
void dLytMiniGame_c::fn_80296070() {
if (fn_80295DB0()) {
if (field_0x3864 == 1) {
s32 score = mScore.getScore();
s32 rupeeDiff = dLytMeter_c::getRupeeDifference();
if (score != 0) {
if (rupeeDiff != 0) {
field_0x3865 = 1;
}
if (field_0x3865 == 1 && rupeeDiff < score) {
mScore.setScore(rupeeDiff);
}
}
}
} else {
if (isPopupOpen()) {
mScore.startOutTemp();
} else {
mScore.startIn();
}
if (isFadingOut()) {
mScore.startOut();
}
}
}
void dLytMiniGame_c::fn_80296150() {
if (fn_80295DB0()) {
// nothing
} else {
if (isInEvent() || isPopupOpen()) {
if (!field_0x3866) {
mBugs.startOutTemp();
mTime.startOutTemp();
} else {
mBugs.startIn();
mTime.startIn();
}
} else {
mBugs.startIn();
mTime.startIn();
}
if (isFadingOut()) {
mBugs.startOut();
mTime.startOut();
}
}
}
void dLytMiniGame_c::fn_80296210() {
if (isInEvent() || isPopupOpen()) {
mScore.startOutTemp();
mTime.startOutTemp();
} else {
mScore.startIn();
mTime.startIn();
}
if (isFadingOut()) {
mScore.startOut();
mTime.startOut();
}
}
void dLytMiniGame_c::fn_802962A0() {
if (!fn_80295DB0()) {
if (isPopupOpen()) {
mScore.startOutTemp();
mTime.startOutTemp();
} else {
mScore.startIn();
mTime.startIn();
}
if (isFadingOut()) {
mScore.startOut();
mTime.startOut();
}
}
}
void dLytMiniGame_c::fn_80296330() {
if (fn_80295DB0()) {
// nothing
} else {
if (isInEvent() || isPopupOpen()) {
if (!field_0x3866) {
mTime.startOutTemp();
} else {
mTime.startIn();
}
} else {
mTime.startIn();
}
if (isFadingOut() && field_0x3866 == 1) {
mTime.startOut();
}
}
}
// These two do the same thing
void dLytMiniGame_c::fn_802963E0() {
if (fn_80295DB0()) {
// nothing
} else {
if (isInEvent() || isPopupOpen()) {
if (!field_0x3866) {
mTime.startOutTemp();
} else {
mTime.startIn();
}
} else {
mTime.startIn();
}
if (isFadingOut()) {
mTime.startOut();
}
}
}
void dLytMiniGame_c::fn_80296480() {
if (fn_80295DB0()) {
// nothing
} else {
if (isInEvent() || isPopupOpen()) {
if (!field_0x3866) {
mTime.startOutTemp();
} else {
mTime.startIn();
}
} else {
mTime.startIn();
}
if (isFadingOut()) {
mTime.startOut();
}
}
}
void dLytMiniGame_c::init() {
mScore.init();
mScoreSd.init();
mStart.init();
mTime.init();
mBugs.init();
mPumpkin.init();
}
bool dLytMiniGame_c::loadData(const char *name, s32 slot) {
bool loadRequest = false;
switch (slot) {
case SLOT_MINI_GAME: loadRequest = field_0x0068; break;
case SLOT_MINI_GAME_SCORE: loadRequest = field_0x0069; break;
case SLOT_MINI_GAME_TIME: loadRequest = field_0x006A; break;
case SLOT_MINI_GAME_BUGS: loadRequest = field_0x006B; break;
case SLOT_MINI_GAME_PUMPKIN: loadRequest = field_0x006C; break;
case SLOT_MINI_GAME_SCORE_SD: loadRequest = field_0x006D; break;
}
if (!loadRequest) {
LayoutArcManager::GetInstance()->loadLayoutArcFromDisk(name, nullptr);
switch (slot) {
case SLOT_MINI_GAME: field_0x0068 = true; break;
case SLOT_MINI_GAME_SCORE: field_0x0069 = true; break;
case SLOT_MINI_GAME_TIME: field_0x006A = true; break;
case SLOT_MINI_GAME_BUGS: field_0x006B = true; break;
case SLOT_MINI_GAME_PUMPKIN: field_0x006C = true; break;
case SLOT_MINI_GAME_SCORE_SD: field_0x006D = true; break;
}
return true;
}
return false;
}
bool dLytMiniGame_c::isLoading(const char *name) const {
return LayoutArcManager::GetInstance()->ensureLoaded1(name) != D_ARC_RESULT_OK;
}
void dLytMiniGame_c::attachLoadedData(const char *name, d2d::ResAccIf_c &resAcc) {
resAcc.attach(LayoutArcManager::GetInstance()->getLoadedData(name), "");
}
void dLytMiniGame_c::unloadData(const char *name) {
s32 res = LayoutArcManager::GetInstance()->ensureLoaded2(name);
if (res == D_ARC_RESULT_ERROR_NOT_FOUND) {
return;
}
if (res == D_ARC_RESULT_OK) {
LayoutArcManager::GetInstance()->decrement(name);
}
}