summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-04-17 15:47:43 +0200
committerrobojumper <robojumper@gmail.com>2025-04-21 21:51:04 +0200
commit563e5535c705a9d710ad37e3e42e3417502736e7 (patch)
treeecdbe6bca945a58cba7e1797b80d20538b7e1ec4 /src
parenteb32c18c392bd3cf641618bc6a52b87bef6c4986 (diff)
d_lyt_meter_ganbari_gauge OK
Diffstat (limited to 'src')
-rw-r--r--src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp326
-rw-r--r--src/d/lyt/meter/d_lyt_meter_z_btn.cpp3
2 files changed, 318 insertions, 11 deletions
diff --git a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp
index 4fd6c49b..5672eb80 100644
--- a/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp
+++ b/src/d/lyt/meter/d_lyt_meter_ganbari_gauge.cpp
@@ -2,7 +2,13 @@
#include "common.h"
#include "d/a/d_a_player.h"
+#include "d/d_camera.h"
+#include "d/d_sc_game.h"
#include "d/lyt/d_lyt_meter_configuration.h"
+#include "m/m_vec.h"
+#include "toBeSorted/d_d3d.h"
+#include "toBeSorted/event_manager.h"
+#include "toBeSorted/file_manager.h"
STATE_DEFINE(dLytMeterGanbariGauge_c, InvisibleWait);
STATE_DEFINE(dLytMeterGanbariGauge_c, In);
@@ -168,10 +174,10 @@ void dLytMeterGanbariGauge_c::finalizeState_FullGutsUse() {}
void dLytMeterGanbariGauge_c::initializeState_Normal() {}
void dLytMeterGanbariGauge_c::executeState_Normal() {
- if (fn_801034B0(field_0x518)) {
+ if (isStaminaLow(field_0x518)) {
mAnm[GANBARI_ANIM_CAUTION].setRate(1.0f);
mStateMgrWheel.changeState(StateID_Caution);
- } else if (fn_80103520(field_0x518)) {
+ } else if (isStaminaCritical(field_0x518)) {
mAnm[GANBARI_ANIM_CAUTION].setRate(3.0f);
mStateMgrWheel.changeState(StateID_Caution);
} else if (field_0x518 >= 0.9999f) {
@@ -187,9 +193,9 @@ void dLytMeterGanbariGauge_c::initializeState_Caution() {
void dLytMeterGanbariGauge_c::executeState_Caution() {
if (field_0x518 <= 0.0001f) {
mStateMgrWheel.changeState(StateID_ToMin);
- } else if (fn_80103520(field_0x518)) {
+ } else if (isStaminaCritical(field_0x518)) {
mAnm[GANBARI_ANIM_CAUTION].setRate(3.0f);
- } else if (fn_801034B0(field_0x518)) {
+ } else if (isStaminaLow(field_0x518)) {
mAnm[GANBARI_ANIM_CAUTION].setRate(1.0f);
} else {
mStateMgrWheel.changeState(StateID_Normal);
@@ -285,6 +291,22 @@ void dLytMeterGanbariGauge_c::executeState_ToMax() {
}
void dLytMeterGanbariGauge_c::finalizeState_ToMax() {}
+bool dLytMeterGanbariGauge_c::isStaminaLow(f32 arg) {
+ if (swimmingRelated()) {
+ return arg <= 0.125f;
+ } else {
+ return arg <= 0.3f;
+ }
+}
+
+bool dLytMeterGanbariGauge_c::isStaminaCritical(f32 arg) {
+ if (swimmingRelated()) {
+ return false;
+ } else {
+ return arg <= 0.1f;
+ }
+}
+
bool dLytMeterGanbariGauge_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("guts_00.brlyt", nullptr);
@@ -365,19 +387,305 @@ bool dLytMeterGanbariGauge_c::execute() {
}
if (!mpPane->IsVisible()) {
- if (!(*mStateMgrMain.getStateID() != StateID_InvisibleWait)) {
- return true;
+ if (*mStateMgrMain.getStateID() != StateID_InvisibleWait) {
+ mStateMgrMain.changeState(StateID_InvisibleWait);
}
- mStateMgrMain.changeState(StateID_InvisibleWait);
return true;
}
- // TODO I really don't like the look of the rest of this function. Depends on a bunch
- // of player, camera and filemanager stuff with a ton of inlines...
+ if (fn_80104710(false) || (isCrawling() && !fn_801047B0())) {
+ field_0x534 = 1;
+ } else if (dLytMeterConfiguration_c::GetInstance()->field_0x13C) {
+ field_0x534 = 0;
+ } else {
+ field_0x534 = 1;
+ }
+
+ bool b12 = false;
+ field_0x558 = 0;
+ f32 drinkFrame = 0.0f;
+ if (displayAirInsteadOfStamina()) {
+ if (FileManager::GetInstance()->hasAirPotionPlus() || FileManager::GetInstance()->hasAirPotionNormal()) {
+ b12 = true;
+ if ((FileManager::GetInstance()->hasAirPotionNormal() &&
+ FileManager::GetInstance()->getAirPotionTimer() < 600) ||
+ (FileManager::GetInstance()->hasAirPotionPlus() &&
+ FileManager::GetInstance()->getAirPotionPlusTimer() < 600)) {
+ field_0x558 = 1;
+ }
+ if (FileManager::GetInstance()->hasAirPotionPlus()) {
+ drinkFrame = 3.0f;
+ } else if (FileManager::GetInstance()->hasAirPotionNormal()) {
+ drinkFrame = 1.0f;
+ }
+ }
+ } else {
+ if (dAcPy_c::GetLink()->isAffectedByStaminaPotionPlus() || dAcPy_c::GetLink()->isAffectedByStaminaPotion()) {
+ b12 = true;
+ if ((dAcPy_c::GetLink()->isAffectedByStaminaPotion() &&
+ FileManager::GetInstance()->getStaminaPotionTimer() < 600) ||
+ (dAcPy_c::GetLink()->isAffectedByStaminaPotionPlus() &&
+ FileManager::GetInstance()->getStaminaPotionPlusTimer() < 600)) {
+ field_0x558 = 1;
+ }
+ if (dAcPy_c::GetLink()->isAffectedByStaminaPotionPlus()) {
+ drinkFrame = 2.0f;
+ } else if (dAcPy_c::GetLink()->isAffectedByStaminaPotion()) {
+ drinkFrame = 1.0f;
+ }
+ }
+ }
+
+ mVec3_c diff = dAcPy_c::GetLink()->poscopy3 - dScGame_c::getCamera(0)->getPositionMaybe();
+ f32 len = diff.mag();
+ mVec3_c v;
+ d3d::fn_80016960(v, dAcPy_c::GetLink()->poscopy3);
+ if (!EventManager::isInEvent()) {
+ field_0x524 = v;
+ }
+
+ s32 angle = 0;
+ mVec3_c v1(field_0x524);
+ mVec2_c v2(0.0f, 0.0f);
+ if (fn_80104710(true)) {
+ field_0x540 = 5;
+ } else if (field_0x540 > 0 && *mStateMgrMain.getStateID() == StateID_Wait) {
+ mStateMgrMain.changeState(StateID_CameraOut);
+ }
+
+ f32 scale;
+ if (fn_80104710(false) || (isCrawling() && !fn_801047B0())) {
+ if (dAcPy_c::GetLink()->getRidingActorType() == 3) {
+ angle = 4;
+ v1.x = 232.0f;
+ v1.y = 145.0f;
+ scale = 1.12f;
+ } else if (displayAirInsteadOfStamina()) {
+ angle = 2;
+ scale = 1.45f;
+ v1.x = 232.0f;
+ v1.y = 145.0f;
+ } else {
+ angle = 2;
+ scale = 1.3f;
+ v1.x = 232.0f;
+ v1.y = 145.0f;
+ }
+ } else if (fn_801047B0()) {
+ v2.set(-32.0f, -40.0f);
+ scale = 0.8f;
+ } else if (field_0x55B) {
+ v2.x = -44.0f;
+ v2.y = -105.0f;
+ v2.y += 46.0f;
+ scale = 1.0f;
+ } else if (dAcPy_c::GetLink()->getRidingActorType() == 3) {
+ angle = 3;
+ v2.set(-95.0f, -50.0f);
+ scale = 0.9f;
+ } else if (field_0x559 && swimmingRelated()) {
+ angle = 1;
+ v2.set(-65.0f, 0.0f);
+ scale = 1.0f;
+ } else if (field_0x534 == 0) {
+ v2.set(-44.0f, -105.0f);
+ scale = 1.0f;
+ } else {
+ v1.x = 216.0f;
+ v1.y = -60.0f;
+ scale = 1.4f;
+ }
+
+ v1.x = v1.x + v2.x;
+ v1.y = v1.y + v2.y;
+ v1.z = 0.0f;
+ mLyt.getLayout()->GetRootPane()->SetTranslate(v1);
+ mVec2_c scaleV(scale, scale);
+ mLyt.getLayout()->GetRootPane()->SetScale(scaleV);
+
+ if (!field_0x534 && len <= dLytMeterConfiguration_c::GetInstance()->field_0x138 && !fn_80104710(false) &&
+ !isCrawling()) {
+ field_0x530 = 1;
+ } else {
+ field_0x530 = 0;
+ }
+
+ for (int i = 0; i < GANBARI_NUM_ANIMS; i++) {
+ if (i != GANBARI_ANIM_ANGLE && i != GANBARI_ANIM_UPDOWN_0 && i != GANBARI_ANIM_UPDOWN_1 &&
+ i != GANBARI_ANIM_USE && i != GANBARI_ANIM_COLOR && i != GANBARI_ANIM_DRINK) {
+ if (mAnm[i].isEnabled()) {
+ mAnm[i].play();
+ }
+ }
+ }
+
+ mAnm[GANBARI_ANIM_UPDOWN_0].setFrame(field_0x518 * 100.0f);
+ mAnm[GANBARI_ANIM_ANGLE].setFrame(angle);
+
+ mStateMgrWheel.executeState();
+
+ if (field_0x544 != 0) {
+ if (field_0x518 < field_0x550 &&
+ field_0x518 < field_0x51C - dLytMeterConfiguration_c::GetInstance()->getField_0x1CC()) {
+ field_0x548 = dLytMeterConfiguration_c::GetInstance()->getField_0x1C8();
+ field_0x54C = field_0x51C;
+ field_0x550 = field_0x518;
+ mAnm[GANBARI_ANIM_UPDOWN_1].setFrame(field_0x54C * 100.0f);
+ mAnm[GANBARI_ANIM_UPDOWN_1].setAnimEnable(true);
+ } else {
+ if (field_0x548 > 0) {
+ field_0x548--;
+ }
+ if (field_0x548 == 0) {
+ field_0x54C -= dLytMeterConfiguration_c::GetInstance()->getField_0x1D0();
+ if (field_0x54C < field_0x518) {
+ field_0x544 = 0;
+ mAnm[GANBARI_ANIM_UPDOWN_1].setAnimEnable(true);
+ mAnm[GANBARI_ANIM_UPDOWN_1].setFrame(0.0f);
+ mLyt.calc();
+ mAnm[GANBARI_ANIM_UPDOWN_1].setAnimEnable(false);
+ } else {
+ f32 frame = field_0x54C * 100.0f;
+ mAnm[GANBARI_ANIM_UPDOWN_1].setAnimEnable(true);
+ mAnm[GANBARI_ANIM_UPDOWN_1].setFrame(frame);
+ }
+ }
+ }
+ } else {
+ if (field_0x518 < field_0x51C - dLytMeterConfiguration_c::GetInstance()->getField_0x1C4()) {
+ field_0x544 = 1;
+ field_0x54C = field_0x51C;
+ field_0x550 = field_0x518;
+ field_0x548 = dLytMeterConfiguration_c::GetInstance()->getField_0x1C8();
+ mAnm[GANBARI_ANIM_UPDOWN_1].setFrame(field_0x54C * 100.0f);
+ mAnm[GANBARI_ANIM_UPDOWN_1].setAnimEnable(true);
+ } else {
+ mAnm[GANBARI_ANIM_UPDOWN_1].setFrame(field_0x518 * 100.0f);
+ mAnm[GANBARI_ANIM_UPDOWN_1].setAnimEnable(true);
+ }
+ }
+
+ if (b12) {
+ if (!mAnm[GANBARI_ANIM_M_LOOP].isEnabled()) {
+ mAnm[GANBARI_ANIM_M_LOOP].setFrame(0.0f);
+ mAnm[GANBARI_ANIM_M_LOOP].setAnimEnable(true);
+ }
+ } else if (mAnm[GANBARI_ANIM_M_LOOP].getFrame() < 1.0f) {
+ mAnm[GANBARI_ANIM_M_LOOP].setFrame(0.0f);
+ mAnm[GANBARI_ANIM_M_LOOP].setAnimEnable(false);
+ }
+
+ if (b12 && field_0x558) {
+ if (!mAnm[GANBARI_ANIM_M_CAUTION].isEnabled()) {
+ mAnm[GANBARI_ANIM_M_CAUTION].setFrame(0.0f);
+ mAnm[GANBARI_ANIM_M_CAUTION].setAnimEnable(true);
+ }
+ } else if (mAnm[GANBARI_ANIM_M_CAUTION].getFrame() < 1.0f) {
+ mAnm[GANBARI_ANIM_M_CAUTION].setFrame(0.0f);
+ mAnm[GANBARI_ANIM_M_CAUTION].setAnimEnable(false);
+ }
+
+ if (!b12 && field_0x518 < field_0x51C) {
+ if (!mAnm[GANBARI_ANIM_LOOP].isEnabled()) {
+ mAnm[GANBARI_ANIM_LOOP].setFrame(0.0f);
+ mAnm[GANBARI_ANIM_LOOP].setAnimEnable(true);
+ }
+ } else if (mAnm[GANBARI_ANIM_LOOP].getFrame() < 1.0f) {
+ mAnm[GANBARI_ANIM_LOOP].setFrame(0.0f);
+ mAnm[GANBARI_ANIM_LOOP].setAnimEnable(false);
+ }
+
+ mAnm[GANBARI_ANIM_COLOR].setFrame(field_0x554);
+ mAnm[GANBARI_ANIM_COLOR].setAnimEnable(true);
+
+ mAnm[GANBARI_ANIM_DRINK].setFrame(drinkFrame);
+ mAnm[GANBARI_ANIM_DRINK].setAnimEnable(true);
+
+ if (!EventManager::isInEvent() && !dAcPy_c::GetLink()->hasvt_0x1C0() &&
+ !dAcPy_c::GetLink()->checkActionFlagsCont(0x10) &&
+ (d3d::fn_80016A90(dAcPy_c::GetLink()->poscopy3) || fn_80104710(false) || isCrawling()) &&
+ *mStateMgrWheel.getStateID() != StateID_Full && *mStateMgrMain.getStateID() == StateID_InvisibleWait &&
+ !field_0x530) {
+ mStateMgrMain.changeState(StateID_In);
+ } else if (!EventManager::isInEvent() && *mStateMgrWheel.getStateID() == StateID_Full &&
+ *mStateMgrWheel.getOldStateID() != StateID_Full && *mStateMgrMain.getStateID() == StateID_Wait) {
+ mStateMgrMain.changeState(StateID_OutWait);
+ } else if ((EventManager::isInEvent() || dAcPy_c::GetLink()->hasvt_0x1C0() ||
+ dAcPy_c::GetLink()->checkActionFlagsCont(0x10) ||
+ (!d3d::fn_80016A90(dAcPy_c::GetLink()->poscopy3) && !fn_80104710(false) && !isCrawling())) &&
+ *mStateMgrMain.getStateID() == StateID_Wait) {
+ mStateMgrMain.changeState(StateID_CameraOut);
+ } else if (field_0x530 && *mStateMgrMain.getStateID() == StateID_Wait) {
+ mStateMgrMain.changeState(StateID_CameraOut);
+ }
+
+ if (field_0x540 > 0) {
+ field_0x540--;
+ }
+
+ if (field_0x55A != swimmingRelated() && *mStateMgrMain.getStateID() == StateID_Wait) {
+ mStateMgrMain.changeState(StateID_Out);
+ field_0x55A = swimmingRelated();
+ }
+
+ mStateMgrMain.executeState();
+ field_0x51C = field_0x518;
return true;
}
+bool dLytMeterGanbariGauge_c::fn_80104710(bool arg) const {
+ if (dAcPy_c::GetLink() != nullptr &&
+ dAcPy_c::GetLink()->checkActionFlagsCont(0x400 | 0x100 | 0x80 | 0x40 | 0x10 | 0x4 | 0x2 | 0x1) &&
+ dAcPy_c::GetLink()->checkActionFlagsCont(0x40)) {
+ return true;
+ }
+ if (!arg && field_0x540 > 0) {
+ return true;
+ }
+ return false;
+}
+
+bool dLytMeterGanbariGauge_c::fn_80104760() const {
+ const dAcPy_c *link = dAcPy_c::GetLink();
+ if (link != nullptr &&
+ (link->checkActionFlagsCont(0x2) || link->checkActionFlagsCont(0x80) || link->checkActionFlagsCont(0x4) ||
+ link->checkActionFlagsCont(0x10) || link->checkActionFlagsCont(0x100))) {
+ return true;
+ }
+ return false;
+}
+
+bool dLytMeterGanbariGauge_c::fn_801047B0() const {
+ if (fn_80081FE0(dScGame_c::getCamera(0)->getField_0xD98(), "mogu") ||
+ fn_80081FE0(dScGame_c::getCamera(0)->getField_0xD98(), "mogu2")) {
+ return true;
+ }
+ return false;
+}
+
+bool dLytMeterGanbariGauge_c::isCrawling() const {
+ return dAcPy_c::GetLink()->checkActionFlags(dAcPy_c::FLG0_CRAWLING);
+}
+
+bool dLytMeterGanbariGauge_c::swimmingRelated() {
+ if (!dAcPy_c::GetLink()->checkFlags0x340(0x100) || dAcPy_c::GetLink()->getCurrentAction() == 0x57 ||
+ dAcPy_c::GetLink()->checkActionFlags(dAcPy_c::FLG0_IN_WATER)) {
+ return true;
+ }
+ return false;
+}
+
+bool dLytMeterGanbariGauge_c::displayAirInsteadOfStamina() {
+ if (field_0x554 == 1.0f) {
+ return true;
+ }
+ if (field_0x554 == 2.0f && swimmingRelated()) {
+ return true;
+ }
+ return false;
+}
+
void dLytMeterGanbariGauge_c::realizeAnimState() {
mAnm[GANBARI_ANIM_TO_MIN].setToStart();
mAnm[GANBARI_ANIM_TO_MIN].setAnimEnable(true);
diff --git a/src/d/lyt/meter/d_lyt_meter_z_btn.cpp b/src/d/lyt/meter/d_lyt_meter_z_btn.cpp
index ddcf7c04..72148cce 100644
--- a/src/d/lyt/meter/d_lyt_meter_z_btn.cpp
+++ b/src/d/lyt/meter/d_lyt_meter_z_btn.cpp
@@ -186,8 +186,7 @@ bool dLytMeterZBtn_c::execute() {
return true;
}
field_0x1C4 = true;
- dCamera_c *cam = dScGame_c::getCamera(0);
- if ((!cam->isCurrentTrend("mogu") || AttentionManager::GetInstance()->checkLink2()) &&
+ if ((!fn_80081FE0(dScGame_c::getCamera(0)->getField_0xD98(), "mogu") || AttentionManager::GetInstance()->checkLink2()) &&
LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_Z) == 0x67) {
field_0x1C4 = false;
LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::DO_NONE);