d_lyt_meter_drink with regswaps in one function (#83)

This commit is contained in:
robojumper
2024-10-28 05:03:08 +01:00
committed by GitHub
parent 6b9d1737d4
commit 1d17e35316
9 changed files with 713 additions and 84 deletions
+542
View File
@@ -1,5 +1,11 @@
#include "d/lyt/meter/d_lyt_meter_drink.h"
#include "common.h"
#include "d/lyt/d2d.h"
#include "m/m_vec.h"
#include "nw4r/lyt/lyt_pane.h"
#include "toBeSorted/file_manager.h"
STATE_DEFINE(dLytMeterDrinkParts_c, Invisible);
STATE_DEFINE(dLytMeterDrinkParts_c, In);
STATE_DEFINE(dLytMeterDrinkParts_c, Visible);
@@ -10,3 +16,539 @@ STATE_DEFINE(dLytMeterDrink_c, In);
STATE_DEFINE(dLytMeterDrink_c, Wait);
STATE_DEFINE(dLytMeterDrink_c, Move);
STATE_DEFINE(dLytMeterDrink_c, Out);
void dLytMeterDrinkParts_c::initializeState_Invisible() {
if (field_0x51) {
if (mAnmGroups[2]->isFlag2()) {
mAnmGroups[2]->setAnimEnable(false);
}
if (!mAnmGroups[0]->isFlag2()) {
mAnmGroups[0]->setAnimEnable(true);
}
mAnmGroups[0]->setFrame(0.0f);
field_0x48 = 6;
mDrinkType = TYPE_NONE;
field_0x51 = 0;
}
}
void dLytMeterDrinkParts_c::executeState_Invisible() {
if (mAnmGroups[0]->isFlag2()) {
mAnmGroups[0]->setAnimEnable(false);
}
if (field_0x50) {
mStateMgr.changeState(StateID_In);
}
}
void dLytMeterDrinkParts_c::finalizeState_Invisible() {}
void dLytMeterDrinkParts_c::initializeState_In() {
if (field_0x51) {
if (mAnmGroups[2]->isFlag2()) {
mAnmGroups[2]->setAnimEnable(false);
}
mAnmGroups[0]->setToEnd();
field_0x51 = 0;
} else {
mAnmGroups[0]->setFrame(0.0f);
}
mAnmGroups[0]->setAnimEnable(true);
}
void dLytMeterDrinkParts_c::executeState_In() {
if (mAnmGroups[0]->isEndReached()) {
mAnmGroups[0]->setAnimEnable(false);
mStateMgr.changeState(StateID_Visible);
}
if (mAnmGroups[0]->isFlag2()) {
mAnmGroups[0]->play();
}
}
void dLytMeterDrinkParts_c::finalizeState_In() {}
void dLytMeterDrinkParts_c::initializeState_Visible() {
if (field_0x51) {
if (mAnmGroups[2]->isFlag2()) {
mAnmGroups[2]->setAnimEnable(false);
}
mAnmGroups[0]->setAnimEnable(true);
mAnmGroups[0]->setToEnd();
field_0x51 = 0;
}
}
void dLytMeterDrinkParts_c::executeState_Visible() {
if (mAnmGroups[0]->isFlag2()) {
mAnmGroups[0]->setAnimEnable(false);
}
if (field_0x48 != getDrinkFrame(mDrinkType)) {
mStateMgr.changeState(StateID_Out);
}
}
void dLytMeterDrinkParts_c::finalizeState_Visible() {}
void dLytMeterDrinkParts_c::initializeState_Out() {
if (field_0x51) {
if (mAnmGroups[0]->isFlag2()) {
mAnmGroups[0]->setAnimEnable(false);
}
mAnmGroups[2]->setToEnd();
field_0x51 = 0;
} else {
mAnmGroups[2]->setFrame(0.0f);
}
mAnmGroups[2]->setAnimEnable(true);
}
void dLytMeterDrinkParts_c::executeState_Out() {
if (mAnmGroups[2]->isEndReached()) {
mAnmGroups[2]->setAnimEnable(false);
field_0x48 = 6;
mDrinkType = TYPE_NONE;
field_0x50 = 0;
mStateMgr.changeState(StateID_Invisible);
}
if (mAnmGroups[2]->isFlag2()) {
mAnmGroups[2]->play();
}
}
void dLytMeterDrinkParts_c::finalizeState_Out() {}
void dLytMeterDrinkParts_c::init() {
field_0x50 = 0;
field_0x51 = 0;
field_0x48 = 6;
mDrinkType = TYPE_NONE;
mAnmGroups[1]->setAnimEnable(true);
mStateMgr.changeState(StateID_Invisible);
}
void dLytMeterDrinkParts_c::execute() {
mStateMgr.executeState();
if (field_0x48 != 6) {
mAnmGroups[1]->setFrame(field_0x48);
}
}
dLytMeterDrinkParts_c::DrinkFrame_e dLytMeterDrinkParts_c::getDrinkFrame(dLytMeterDrinkParts_c::DrinkType_e type
) const {
if (type == TYPE_STAMINA) {
if (FileManager::sInstance->getStaminaPotionPlusTimer()) {
return FRAME_STAMINA_PLUS;
}
if (FileManager::sInstance->getStaminaPotionTimer()) {
return FRAME_STAMINA;
}
}
if (type == TYPE_AIR) {
if (FileManager::sInstance->getAirPotionPlusTimer()) {
return FRAME_AIR_PLUS;
}
if (FileManager::sInstance->getAirPotionTimer()) {
return FRAME_AIR;
}
}
if (type == TYPE_GUARDIAN) {
if (FileManager::sInstance->getGuardianPotionPlusTimer()) {
return FRAME_GUARDIAN_PLUS;
}
if (FileManager::sInstance->getGuardianPotionTimer()) {
return FRAME_GUARDIAN;
}
}
return FRAME_NONE;
}
bool dLytMeterDrinkParts_c::isDrinkAboutToExpire() const {
if (field_0x48 == FRAME_STAMINA_PLUS) {
return FileManager::sInstance->getStaminaPotionPlusTimer() < 600;
} else if (field_0x48 == FRAME_STAMINA) {
return FileManager::sInstance->getStaminaPotionTimer() < 600;
} else if (field_0x48 == FRAME_AIR_PLUS) {
return FileManager::sInstance->getAirPotionPlusTimer() < 600;
} else if (field_0x48 == FRAME_AIR) {
return FileManager::sInstance->getAirPotionTimer() < 600;
} else if (field_0x48 == FRAME_GUARDIAN_PLUS) {
return FileManager::sInstance->getGuardianPotionPlusTimer() < 600;
} else if (field_0x48 == FRAME_GUARDIAN) {
return FileManager::sInstance->getGuardianPotionTimer() < 600;
}
return false;
}
void dLytMeterDrinkParts_c::copy(dLytMeterDrinkParts_c *other, dLytMeterDrinkParts_c *third) {
field_0x50 = other->field_0x50;
field_0x51 = 1;
field_0x48 = other->field_0x48;
mDrinkType = other->mDrinkType;
mStateMgr.changeState(*other->mStateMgr.getStateID());
if (third == nullptr) {
other->field_0x50 = 0;
other->field_0x51 = 1;
other->field_0x48 = FRAME_NONE;
other->mDrinkType = TYPE_NONE;
other->mStateMgr.changeState(StateID_Invisible);
} else {
other->field_0x50 = third->field_0x50;
other->field_0x51 = 1;
other->field_0x48 = third->field_0x48;
other->mDrinkType = third->mDrinkType;
other->mStateMgr.changeState(*third->mStateMgr.getStateID());
third->field_0x50 = 0;
third->field_0x51 = 1;
third->field_0x48 = FRAME_NONE;
third->mDrinkType = TYPE_NONE;
third->mStateMgr.changeState(StateID_Invisible);
}
}
static const char *sPanes[] = {
"N_drink_00",
"N_drink_01",
"N_drink_02",
};
static const d2d::LytBrlanMapping brlanMap[] = {
{ "drink_00_demoIn.brlan", "G_demoInOut_00"},
{ "drink_00_in.brlan", "G_inOut_00"},
{ "drink_00_in.brlan", "G_inOut_01"},
{ "drink_00_in.brlan", "G_inOut_02"},
{ "drink_00_drink.brlan", "G_drink_00"},
{ "drink_00_drink.brlan", "G_drink_01"},
{ "drink_00_drink.brlan", "G_drink_02"},
{ "drink_00_loop.brlan", "G_loop_00"},
{ "drink_00_loop.brlan", "G_loop_01"},
{ "drink_00_loop.brlan", "G_loop_02"},
{"drink_00_caution.brlan", "G_caution_00"},
{"drink_00_caution.brlan", "G_caution_01"},
{"drink_00_caution.brlan", "G_caution_02"},
{ "drink_00_move.brlan", "G_move_00"},
{ "drink_00_move.brlan", "G_move_01"},
{ "drink_00_move.brlan", "G_move_02"},
{ "drink_00_out.brlan", "G_inOut_00"},
{ "drink_00_out.brlan", "G_inOut_01"},
{ "drink_00_out.brlan", "G_inOut_02"},
{"drink_00_demoOut.brlan", "G_demoInOut_00"},
};
#define LYT_METER_DRINK_OFFSET_ANIM_LOOP 7
#define LYT_METER_DRINK_OFFSET_ANIM_CAUTION 10
#define LYT_METER_DRINK_OFFSET_ANIM_MOVE 13
#define LYT_METER_DRINK_ANIM_DEMO_OUT 19
void dLytMeterDrink_c::initializeState_Invisible() {}
void dLytMeterDrink_c::executeState_Invisible() {
if (field_0x6F4) {
mStateMgr.changeState(StateID_In);
}
}
void dLytMeterDrink_c::finalizeState_Invisible() {}
void dLytMeterDrink_c::initializeState_In() {
mAnmGroups[0].setAnimEnable(true);
mAnmGroups[0].setFrame(0.0f);
}
void dLytMeterDrink_c::executeState_In() {
if (mAnmGroups[0].isEndReached()) {
mAnmGroups[0].setAnimEnable(false);
mStateMgr.changeState(StateID_Wait);
}
if (mAnmGroups[0].isFlag2()) {
mAnmGroups[0].play();
}
}
void dLytMeterDrink_c::finalizeState_In() {}
void dLytMeterDrink_c::initializeState_Wait() {
field_0x6F0 = -1;
}
void dLytMeterDrink_c::executeState_Wait() {
int i5 = -1;
int i7 = -1;
for (int i = 0; i < 3; i++) {
int a = getPartForDrinkType((dLytMeterDrinkParts_c::DrinkType_e)i);
if (fn_800E5C40(i) != 0 && a == 3) {
i5 = i;
}
if (field_0x6F5[i] == 1 && mParts[i].field_0x50 == 0) {
i7 = i;
}
}
if (i5 >= 0) {
for (int i = 0; i < 3; i++) {
if (mParts[i].field_0x50 == 0 && i7 != i) {
mParts[i].field_0x50 = 1;
mParts[i].field_0x51 = 0;
mParts[i].field_0x48 = mParts[i].getDrinkFrame((dLytMeterDrinkParts_c::DrinkType_e)i5);
mParts[i].mDrinkType = (dLytMeterDrinkParts_c::DrinkType_e)i5;
break;
}
}
}
switch (i7) {
case 0:
if (mParts[1].field_0x50 != 0) {
field_0x6F0 = i7;
mStateMgr.changeState(StateID_Move);
}
break;
case 1:
if (mParts[2].field_0x50 != 0) {
field_0x6F0 = i7;
mStateMgr.changeState(StateID_Move);
}
break;
}
if (field_0x6F4 == 0) {
mStateMgr.changeState(StateID_Out);
}
}
void dLytMeterDrink_c::finalizeState_Wait() {}
void dLytMeterDrink_c::initializeState_Move() {
for (int i = field_0x6F0; i < 3; i++) {
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].setAnimEnable(true);
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].setFrame(0.0f);
}
}
void dLytMeterDrink_c::executeState_Move() {
bool needsCopy = false;
for (int i = field_0x6F0; i < 3; i++) {
if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].isEndReached()) {
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].setFrame(0.0f);
needsCopy = true;
}
}
if (needsCopy) {
if (field_0x6F0 == 0) {
if (mParts[1].field_0x50) {
mParts[0].copy(&mParts[1], &mParts[2]);
}
} else if (field_0x6F0 == 1 && mParts[2].field_0x50) {
mParts[1].copy(&mParts[2], nullptr);
}
mLyt.calc();
for (int i = 0; i < 3; i++) {
if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].isFlag2()) {
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].setAnimEnable(false);
}
}
mStateMgr.changeState(StateID_Wait);
}
for (int i = 0; i < 3; i++) {
if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].isFlag2()) {
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].play();
}
}
}
void dLytMeterDrink_c::finalizeState_Move() {}
void dLytMeterDrink_c::initializeState_Out() {
mAnmGroups[LYT_METER_DRINK_ANIM_DEMO_OUT].setAnimEnable(true);
mAnmGroups[LYT_METER_DRINK_ANIM_DEMO_OUT].setFrame(0.0f);
}
void dLytMeterDrink_c::executeState_Out() {
if (mAnmGroups[LYT_METER_DRINK_ANIM_DEMO_OUT].isEndReached()) {
mAnmGroups[LYT_METER_DRINK_ANIM_DEMO_OUT].setAnimEnable(false);
mStateMgr.changeState(StateID_Invisible);
}
if (mAnmGroups[LYT_METER_DRINK_ANIM_DEMO_OUT].isFlag2()) {
mAnmGroups[LYT_METER_DRINK_ANIM_DEMO_OUT].play();
}
}
void dLytMeterDrink_c::finalizeState_Out() {}
bool dLytMeterDrink_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("drink_00.brlyt", nullptr);
for (int i = 0; i < 3; i++) {
mpPartPanes[i] = mLyt.findPane(sPanes[i]);
}
for (int i = 0; i < 20; i++) {
mAnmGroups[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName);
mAnmGroups[i].setDirection(false);
mAnmGroups[i].setAnimEnable(false);
}
for (int i = 0; i < 3; i++) {
mParts[i].mAnmGroups[0] = &mAnmGroups[1 + i];
mParts[i].mAnmGroups[1] = &mAnmGroups[4 + i];
mParts[i].mAnmGroups[2] = &mAnmGroups[16 + i];
mParts[i].init();
field_0x6F5[i] = mParts[i].field_0x50;
}
mpPane = mLyt.getLayout()->GetRootPane();
field_0x6F0 = -1;
field_0x6F4 = 0;
field_0x6E0.z = 0.0f;
field_0x6E0.y = 0.0f;
field_0x6E0.x = 0.0f;
mpPane->SetTranslate(field_0x6E0);
mAnmGroups[0].setFrame(0.0f);
mAnmGroups[0].setAnimEnable(true);
mLyt.calc();
mAnmGroups[0].setAnimEnable(false);
mStateMgr.changeState(StateID_Invisible);
return true;
}
bool dLytMeterDrink_c::execute() {
mStateMgr.executeState();
for (int i = 0; i < 3; i++) {
field_0x6F5[i] = mParts[i].field_0x50;
mParts[i].execute();
}
executeInternal();
mpPane->SetTranslate(field_0x6E0);
mLyt.calc();
return true;
}
bool dLytMeterDrink_c::remove() {
for (int i = 0; i < 20; i++) {
mAnmGroups[i].unbind();
mAnmGroups[i].afterUnbind();
}
return true;
}
bool dLytMeterDrink_c::draw() {
mLyt.addToDrawList();
return true;
}
int dLytMeterDrink_c::getPartForDrinkType(dLytMeterDrinkParts_c::DrinkType_e ty) const {
for (int i = 0; i < 3; i++) {
if (ty == mParts[i].mDrinkType) {
return i;
}
}
return 3;
}
bool dLytMeterDrink_c::fn_800E5C40(int i) {
if ((i == 0 || i == 3) && (FileManager::sInstance->getStaminaPotionTimer() != 0 ||
FileManager::sInstance->getStaminaPotionPlusTimer() != 0)) {
return true;
}
if ((i == 1 || i == 3) &&
(FileManager::sInstance->getAirPotionTimer() != 0 || FileManager::sInstance->getAirPotionPlusTimer() != 0)) {
return true;
}
if ((i == 2 || i == 3) && (FileManager::sInstance->getGuardianPotionTimer() != 0 ||
FileManager::sInstance->getGuardianPotionPlusTimer() != 0)) {
return true;
}
return false;
}
void dLytMeterDrink_c::executeInternal() {
bool bHasNotSoonExpiringDrink = false;
bool bHasSoonExpiringDrink = false;
bool drinksLast[3];
f32 frameLoop = 0.0f;
f32 frameCaution = 0.0f;
for (int i = 0; i < 3; i++) {
if (!mParts[i].isDrinkAboutToExpire()) {
drinksLast[i] = true;
bHasNotSoonExpiringDrink = true;
if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].isFlag2()) {
frameLoop = mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].getNextFrame();
}
} else {
drinksLast[i] = false;
bHasSoonExpiringDrink = true;
if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].isFlag2()) {
frameCaution = mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].getNextFrame();
}
}
}
if (bHasNotSoonExpiringDrink) {
for (int i = 0; i < 3; i++) {
if (drinksLast[i] == true) {
if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].isFlag2()) {
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].play();
} else {
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].setAnimEnable(true);
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].setFrame(frameLoop);
}
if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].isFlag2()) {
bool oldVisible = mpPartPanes[i]->IsVisible();
mpPartPanes[i]->SetVisible(true);
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].setFrame(0.0f);
mLyt.calc();
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].setAnimEnable(false);
mpPartPanes[i]->SetVisible(oldVisible);
}
}
}
} else {
for (int i = 0; i < 3; i++) {
if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].isFlag2()) {
bool oldVisible = mpPartPanes[i]->IsVisible();
mpPartPanes[i]->SetVisible(true);
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].setFrame(0.0f);
mLyt.calc();
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].setAnimEnable(false);
mpPartPanes[i]->SetVisible(oldVisible);
}
}
}
if (bHasSoonExpiringDrink) {
for (int i = 0; i < 3; i++) {
if (drinksLast[i] == false) {
if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].isFlag2()) {
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].play();
} else {
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].setAnimEnable(true);
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].setFrame(frameCaution);
}
if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].isFlag2()) {
bool oldVisible = mpPartPanes[i]->IsVisible();
mpPartPanes[i]->SetVisible(true);
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].setFrame(0.0f);
mLyt.calc();
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].setAnimEnable(false);
mpPartPanes[i]->SetVisible(oldVisible);
}
}
}
} else {
for (int i = 0; i < 3; i++) {
if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].isFlag2()) {
bool oldVisible = mpPartPanes[i]->IsVisible();
mpPartPanes[i]->SetVisible(true);
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].setFrame(0.0f);
mLyt.calc();
mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].setAnimEnable(false);
mpPartPanes[i]->SetVisible(oldVisible);
}
}
}
}
+12 -12
View File
@@ -171,18 +171,18 @@ u16 *FileManager::getStoryFlagsMut() {
/* 8000B670 */ void FileManager::setShieldPouchSlot(u8 slot) {}
/* 8000B6A0 */ u8 FileManager::getShieldPouchSlot() {}
/* 8000B6F0 */ void FileManager::setAirPotionTimer(s16 time) {}
/* 8000B720 */ s16 FileManager::getAirPotionTimer() {}
/* 8000B770 */ void FileManager::setAirPotionPlusTimer(s16 time) {}
/* 8000B7A0 */ s16 FileManager::getAirPotionPlusTimer() {}
/* 8000B7F0 */ void FileManager::setStaminaPotionTimer(s16 time) {}
/* 8000B820 */ s16 FileManager::getStaminaPotionTimer() {}
/* 8000B870 */ void FileManager::setStaminaPotionPlusTimer(s16 time) {}
/* 8000B8A0 */ s16 FileManager::getStaminaPotionPlusTimer() {}
/* 8000B8F0 */ void FileManager::setGuardianPotionTimer(s16 time) {}
/* 8000B920 */ s16 FileManager::getGuardianPotionTimer() {}
/* 8000B970 */ void FileManager::setGuardianPotionPlusTimer(s16 time) {}
/* 8000B9A0 */ s16 FileManager::getGuardianPotionPlusTimer() {}
/* 8000B6F0 */ void FileManager::setAirPotionTimer(u16 time) {}
/* 8000B720 */ u16 FileManager::getAirPotionTimer() {}
/* 8000B770 */ void FileManager::setAirPotionPlusTimer(u16 time) {}
/* 8000B7A0 */ u16 FileManager::getAirPotionPlusTimer() {}
/* 8000B7F0 */ void FileManager::setStaminaPotionTimer(u16 time) {}
/* 8000B820 */ u16 FileManager::getStaminaPotionTimer() {}
/* 8000B870 */ void FileManager::setStaminaPotionPlusTimer(u16 time) {}
/* 8000B8A0 */ u16 FileManager::getStaminaPotionPlusTimer() {}
/* 8000B8F0 */ void FileManager::setGuardianPotionTimer(u16 time) {}
/* 8000B920 */ u16 FileManager::getGuardianPotionTimer() {}
/* 8000B970 */ void FileManager::setGuardianPotionPlusTimer(u16 time) {}
/* 8000B9A0 */ u16 FileManager::getGuardianPotionPlusTimer() {}
/* 8000B9F0 */ void FileManager::setDowsingSlotIdx(u8 idx) {}
/* 8000BA20 */ u8 FileManager::getDowsingSlotIdx() {}