Files
tp/src/d/d_meter_hakusha.cpp
T
LagoLunatic 4dc0cd9d09 Debug version now builds OK and all_source compiles (#2343)
* Fix missing arg to JUT_ASSERT

* Fix some MWCC version diff errors

* Compile m_Do_ext, d_demo, actor_mng

* Add VSCode task to quickly switch between versions

* Unlink magLift for debug

* Update the hash of the debug dol

The old cbea5fa... hash here was for the dol generated by the alf2dol.py script, which produces incorrect alignment.

The dol with the new hash can be obtained by using `dtk elf2dol` to convert the debug .alf file to a dol.

The DOL now builds OK.

* Fix all debug REL dtor splits

All RELs now also build OK, meaning `ninja build/ShieldD/ok` now succeeds.

* Add genMessage declarations to all HIO subclasses

* Fixing more compilation errors

* m_Do_mtx 100% on debug

Cannot be linked due to weak function name mangling?

* Improve various matches

* Fix all remaining compilation errors

* Fix new compilation errors from main

* Fix retail regression

* Link f_pc_profile_lst
2025-03-22 18:00:51 -07:00

357 lines
13 KiB
C++

/**
* d_meter_hakusha.cpp
* UI Epona Dash Spurs
*/
#include "d/d_meter_hakusha.h"
#include "JSystem/J2DGraph/J2DGrafContext.h"
#include "JSystem/J2DGraph/J2DScreen.h"
#include "d/d_com_inf_game.h"
#include "d/d_meter2_draw.h"
#include "d/d_meter2_info.h"
#include "d/d_meter_HIO.h"
#include "d/d_pane_class.h"
/* 8020C320-8020C384 206C60 0064+00 0/0 1/1 0/0 .text __ct__15dMeterHakusha_cFPv */
dMeterHakusha_c::dMeterHakusha_c(void* i_screen) {
field_0x004 = (J2DScreen*)i_screen;
_create();
}
/* 8020C384-8020C400 206CC4 007C+00 1/0 0/0 0/0 .text __dt__15dMeterHakusha_cFv */
dMeterHakusha_c::~dMeterHakusha_c() {
_delete();
}
/* 8020C400-8020C808 206D40 0408+00 1/0 0/0 0/0 .text _create__15dMeterHakusha_cFv */
int dMeterHakusha_c::_create() {
static u64 haku_tag[] = {
'haku_n00', 'haku_n01', 'haku_n02', 'haku_n03', 'haku_n04', 'haku_n05',
};
for (int i = 0; i < 6; i++) {
mpHakushaPos[i] = new CPaneMgr(field_0x004, haku_tag[i], 0, NULL);
JUT_ASSERT(0, mpHakushaPos[i] != 0);
}
mpHakushaParent = new CPaneMgr(field_0x004, 'hakunall', 0, NULL);
JUT_ASSERT(0, mpHakushaParent != 0);
mpHakushaScreen = new J2DScreen();
JUT_ASSERT(0, mpHakushaScreen != 0);
bool fg = mpHakushaScreen->setPriority("zelda_game_image_hakusha_parts.blo", 0x20000,
dComIfGp_getMain2DArchive());
JUT_ASSERT(0, fg != false);
dPaneClass_showNullPane(mpHakushaScreen);
mpHakushaOn = new CPaneMgr(mpHakushaScreen, 'haku_n', 2, NULL);
JUT_ASSERT(0, mpHakushaOn != 0);
mpHakushaOff = new CPaneMgr(mpHakushaScreen, 'haku_b_n', 2, NULL);
JUT_ASSERT(0, mpHakushaOff != 0);
mpHakushaOn->setAlphaRate(0.0f);
mpHakushaOff->setAlphaRate(0.0f);
mpHakushaOn->hide();
mpHakushaOff->hide();
for (int i = 0; i < 12; i++) {
mHakushaData[i].pos_x = 0.0f;
mHakushaData[i].pos_y = 0.0f;
mHakushaData[i].flags = 0;
mHakushaAnimFrame[i] = 0.0f;
mHakushaStatus[i] = 0;
}
mHakushaNum = dMeter2Info_getHorseLifeCount();
mpButtonScreen = new J2DScreen();
JUT_ASSERT(0, mpButtonScreen != 0);
fg = mpButtonScreen->setPriority("zelda_game_image_hakusha_a_btn.blo", 0x20000,
dComIfGp_getMain2DArchive());
JUT_ASSERT(0, fg != false);
dPaneClass_showNullPane(mpButtonScreen);
mpButtonA = new CPaneMgr(mpButtonScreen, 'abtn_n', 2, NULL);
JUT_ASSERT(0, mpButtonA != 0);
mpButtonA->show();
mpButtonA->setAlphaRate(0.0f);
mpButtonScreen->search('info_n')->translate(0.0f, 0.0f);
field_0x100 = g_drawHIO.mButtonAHorsePosX;
field_0x104 = g_drawHIO.mButtonAHorsePosY;
if (strcmp(dComIfGp_getStartStageName(), "F_SP108") == 0) {
mpHakushaParent->paneTrans(g_drawHIO.mSpurBarPosX + 28.4f, g_drawHIO.mSpurBarPosY);
} else {
mpHakushaParent->paneTrans(g_drawHIO.mSpurBarPosX, g_drawHIO.mSpurBarPosY);
}
mpHakushaParent->scale(g_drawHIO.mSpurBarScale, g_drawHIO.mSpurBarScale);
mpButtonA->paneTrans(g_drawHIO.mButtonAHorsePosX, g_drawHIO.mButtonAHorsePosY);
mpButtonA->scale(g_drawHIO.mButtonAHorseScale, g_drawHIO.mButtonAHorseScale);
mpHakushaOn->scale(g_drawHIO.mSpurIconScale, g_drawHIO.mSpurIconScale);
mpHakushaOff->scale(g_drawHIO.mUsedSpurIconScale, g_drawHIO.mUsedSpurIconScale);
mButtonAPosX = 0.0f;
mButtonAPosY = 0.0f;
return cPhs_COMPLEATE_e;
}
/* 8020C808-8020C850 207148 0048+00 1/0 0/0 0/0 .text _execute__15dMeterHakusha_cFUl */
int dMeterHakusha_c::_execute(u32 i_flags) {
updateHakusha();
alphaAnimeHakusha(i_flags);
return 1;
}
/* 8020C850-8020CABC 207190 026C+00 1/0 0/0 0/0 .text draw__15dMeterHakusha_cFv */
void dMeterHakusha_c::draw() {
J2DGrafContext* graf_ctx = dComIfGp_getCurrentGrafPort();
graf_ctx->setup2D();
mpButtonA->translate(mButtonAPosX, mButtonAPosY);
mpButtonScreen->draw(0.0f, 0.0f, graf_ctx);
for (int i = 0; i < getHakushaNum(); i++) {
if (mHakushaData[i].flags & 1) {
mpHakushaOn->show();
} else {
mpHakushaOn->hide();
}
if (mHakushaData[i].flags & 2) {
mpHakushaOff->show();
} else {
mpHakushaOff->hide();
}
mpHakushaOn->translate(mHakushaData[i].pos_x, mHakushaData[i].pos_y);
mpHakushaOff->translate(mHakushaData[i].pos_x, mHakushaData[i].pos_y);
mpHakushaScreen->draw(0.0f, 0.0f, graf_ctx);
if (mHakushaData[i].flags != 0 && mHakushaAnimFrame[i] != 0.0f) {
Vec center = mpHakushaOn->getGlobalVtxCenter(false, 0);
if (mHakushaStatus[i] == 0) {
dMeter2Info_getMeterClass()->getMeterDrawPtr()->drawPikariHakusha(
center.x, center.y, mHakushaAnimFrame[i], g_drawHIO.mSpurIconPikariScale,
g_drawHIO.mSpurIconPikariFrontOuter, g_drawHIO.mSpurIconPikariFrontInner,
g_drawHIO.mSpurIconPikariBackOuter, g_drawHIO.mSpurIconPikariBackInner);
} else {
dMeter2Info_getMeterClass()->getMeterDrawPtr()->drawPikariHakusha(
center.x, center.y, mHakushaAnimFrame[i],
g_drawHIO.mSpurIconRevivePikariScale,
g_drawHIO.mSpurIconRevivePikariFrontOuter,
g_drawHIO.mSpurIconRevivePikariFrontInner,
g_drawHIO.mSpurIconRevivePikariBackOuter,
g_drawHIO.mSpurIconRevivePikariBackInner);
}
}
}
}
/* 8020CABC-8020CC58 2073FC 019C+00 1/0 0/0 0/0 .text _delete__15dMeterHakusha_cFv */
int dMeterHakusha_c::_delete() {
for (int i = 0; i < 6; i++) {
delete mpHakushaPos[i];
mpHakushaPos[i] = NULL;
}
mpHakushaParent->paneTrans(0.0f, 0.0f);
mpHakushaParent->scale(1.0f, 1.0f);
delete mpHakushaParent;
mpHakushaParent = NULL;
delete mpHakushaScreen;
mpHakushaScreen = NULL;
delete mpHakushaOn;
mpHakushaOn = NULL;
delete mpHakushaOff;
mpHakushaOff = NULL;
delete mpButtonScreen;
mpButtonScreen = NULL;
delete mpButtonA;
mpButtonA = NULL;
return 1;
}
/* 8020CC58-8020CD6C 207598 0114+00 1/1 0/0 0/0 .text alphaAnimeHakusha__15dMeterHakusha_cFUl */
void dMeterHakusha_c::alphaAnimeHakusha(u32 i_flags) {
if ((i_flags & 0x4000) || (i_flags & 0x40) || (i_flags & 0x100000) || (i_flags & 0x1000) ||
(i_flags & 8) || (i_flags & 0x10) || (i_flags & 0x20) || (i_flags & 0x04000000) ||
(i_flags & 0x08000000) || (i_flags & 0x01000000) || !(i_flags & 0x02000000) ||
(strcmp(dComIfGp_getStartStageName(), "F_SP00") == 0 &&
dComIfG_play_c::getLayerNo(0) == 4) ||
(dComIfGp_getDoStatus() != 9 && dComIfGp_getDoStatus() != 0))
{
setAlphaHakushaAnimeMin();
setAlphaButtonAnimeMin();
return;
}
setAlphaHakushaAnimeMax();
if (dComIfGp_getDoStatus() == 9) {
setAlphaButtonAnimeMax();
} else {
setAlphaButtonAnimeMin();
}
}
/* 8020CD6C-8020D258 2076AC 04EC+00 1/1 0/0 0/0 .text updateHakusha__15dMeterHakusha_cFv
*/
void dMeterHakusha_c::updateHakusha() {
Vec sp2C = mpHakushaPos[0]->getGlobalVtxCenter(false, 0);
Vec sp20 = mpHakushaPos[5]->getGlobalVtxCenter(false, 0);
f32 abtn_x_offset = sp2C.x;
f32 abtn_y_offset = sp2C.y;
f32 temp_f28 = (sp20.x - sp2C.x) / (f32)getHakushaNum();
if (mHakushaNum != dMeter2Info_getHorseLifeCount()) {
if (mHakushaNum > dMeter2Info_getHorseLifeCount()) {
mHakushaAnimFrame[dMeter2Info_getHorseLifeCount()] =
18.0f - g_drawHIO.mSpurIconPikariAnimSpeed;
mHakushaStatus[dMeter2Info_getHorseLifeCount()] = 0;
} else if (mHakushaNum < dMeter2Info_getHorseLifeCount()) {
for (int i = mHakushaNum; i < dMeter2Info_getHorseLifeCount(); i++) {
mHakushaAnimFrame[i] = 18.0f - g_drawHIO.mSpurIconRevivePikariAnimSpeed;
mHakushaStatus[i] = 1;
}
}
mHakushaNum = dMeter2Info_getHorseLifeCount();
}
for (int i = 0; i < getHakushaNum(); i++) {
if (mHakushaAnimFrame[i] > 0.0f) {
if (mHakushaStatus[i] == 0) {
mHakushaAnimFrame[i] += g_drawHIO.mSpurIconPikariAnimSpeed;
} else {
mHakushaAnimFrame[i] += g_drawHIO.mSpurIconRevivePikariAnimSpeed;
}
if (mHakushaAnimFrame[i] > 28.0f) {
mHakushaAnimFrame[i] = 0.0f;
}
}
mHakushaData[i].pos_x = abtn_x_offset;
mHakushaData[i].pos_y = abtn_y_offset;
if (mpHakushaOn->getAlpha() == 0) {
mHakushaData[i].flags &= ~0x1;
} else if (i < dMeter2Info_getHorseLifeCount() ||
(mHakushaAnimFrame[i] != 0.0f && mHakushaAnimFrame[i] <= 20.0f &&
mHakushaStatus[i] == 0) ||
(mHakushaAnimFrame[i] != 0.0f && mHakushaAnimFrame[i] > 20.0f &&
mHakushaStatus[i] == 1))
{
mHakushaData[i].flags |= 0x1;
} else {
mHakushaData[i].flags &= ~0x1;
}
if (mpHakushaOff->getAlpha() == 0) {
mHakushaData[i].flags &= ~0x2;
} else if (i < dMeter2Info_getHorseLifeCount() ||
(mHakushaAnimFrame[i] != 0.0f && mHakushaAnimFrame[i] <= 20.0f &&
mHakushaStatus[i] == 0) ||
(mHakushaAnimFrame[i] != 0.0f && mHakushaAnimFrame[i] > 20.0f &&
mHakushaStatus[i] == 1))
{
mHakushaData[i].flags &= ~0x2;
} else {
mHakushaData[i].flags |= 0x2;
}
abtn_x_offset += temp_f28;
}
mButtonAPosX = abtn_x_offset + field_0x100;
mButtonAPosY = abtn_y_offset + field_0x104;
if (g_drawHIO.mSpurDebug) {
field_0x100 = g_drawHIO.mButtonAHorsePosX;
field_0x104 = g_drawHIO.mButtonAHorsePosY;
if (strcmp(dComIfGp_getStartStageName(), "F_SP108") == 0) {
mpHakushaParent->paneTrans(g_drawHIO.mSpurBarPosX + 28.4f, g_drawHIO.mSpurBarPosY);
} else {
mpHakushaParent->paneTrans(g_drawHIO.mSpurBarPosX, g_drawHIO.mSpurBarPosY);
}
mpHakushaParent->scale(g_drawHIO.mSpurBarScale, g_drawHIO.mSpurBarScale);
mpButtonA->paneTrans(g_drawHIO.mButtonAHorsePosX, g_drawHIO.mButtonAHorsePosY);
mpButtonA->scale(g_drawHIO.mButtonAHorseScale, g_drawHIO.mButtonAHorseScale);
mpHakushaOn->scale(g_drawHIO.mSpurIconScale, g_drawHIO.mSpurIconScale);
mpHakushaOff->scale(g_drawHIO.mUsedSpurIconScale, g_drawHIO.mUsedSpurIconScale);
}
}
/* 8020D258-8020D308 207B98 00B0+00 1/1 0/0 0/0 .text setAlphaHakushaAnimeMin__15dMeterHakusha_cFv
*/
void dMeterHakusha_c::setAlphaHakushaAnimeMin() {
if (mpHakushaOn->getAlphaRate() != 0.0f) {
mpHakushaOn->setAlphaRate(g_drawHIO.mSpurIconAlpha);
dMeter2Info_getMeterClass()->getMeterDrawPtr()->setAlphaAnimeMin(mpHakushaOn, 5);
}
if (mpHakushaOff->getAlphaRate() != 0.0f) {
mpHakushaOff->setAlphaRate(g_drawHIO.mUsedSpurIconAlpha);
dMeter2Info_getMeterClass()->getMeterDrawPtr()->setAlphaAnimeMin(mpHakushaOff, 5);
}
}
/* 8020D308-8020D3B8 207C48 00B0+00 1/1 0/0 0/0 .text setAlphaHakushaAnimeMax__15dMeterHakusha_cFv
*/
void dMeterHakusha_c::setAlphaHakushaAnimeMax() {
if (mpHakushaOn->getAlphaRate() != g_drawHIO.mSpurIconAlpha) {
mpHakushaOn->setAlphaRate(g_drawHIO.mSpurIconAlpha);
dMeter2Info_getMeterClass()->getMeterDrawPtr()->setAlphaAnimeMax(mpHakushaOn, 5);
}
if (mpHakushaOff->getAlphaRate() != g_drawHIO.mUsedSpurIconAlpha) {
mpHakushaOff->setAlphaRate(g_drawHIO.mUsedSpurIconAlpha);
dMeter2Info_getMeterClass()->getMeterDrawPtr()->setAlphaAnimeMax(mpHakushaOff, 5);
}
}
/* 8020D3B8-8020D41C 207CF8 0064+00 1/1 0/0 0/0 .text setAlphaButtonAnimeMin__15dMeterHakusha_cFv
*/
void dMeterHakusha_c::setAlphaButtonAnimeMin() {
if (mpButtonA->getAlphaRate() != 0.0f) {
mpButtonA->setAlphaRate(1.0f);
dMeter2Info_getMeterClass()->getMeterDrawPtr()->setAlphaAnimeMin(mpButtonA, 5);
}
}
/* 8020D41C-8020D480 207D5C 0064+00 1/1 0/0 0/0 .text setAlphaButtonAnimeMax__15dMeterHakusha_cFv
*/
void dMeterHakusha_c::setAlphaButtonAnimeMax() {
if (mpButtonA->getAlphaRate() != 1.0f) {
mpButtonA->setAlphaRate(1.0f);
dMeter2Info_getMeterClass()->getMeterDrawPtr()->setAlphaAnimeMax(mpButtonA, 5);
}
}
/* 8020D480-8020D49C 207DC0 001C+00 2/2 0/0 0/0 .text getHakushaNum__15dMeterHakusha_cFv
*/
int dMeterHakusha_c::getHakushaNum() {
int hakusha_num = g_drawHIO.mMaxSpurAmount;
if (hakusha_num > 12) {
hakusha_num = 12;
}
return hakusha_num;
}