tp/src/d/d_menu_fishing.cpp

512 lines
20 KiB
C++

/**
* d_menu_fishing.cpp
* Menu - Fishing Journal
*/
#include "d/d_menu_fishing.h"
#include "JSystem/J2DGraph/J2DTextBox.h"
#include "JSystem/JKernel/JKRMemArchive.h"
#include "d/d_menu_dmap.h"
#include "d/d_meter2_info.h"
#include "d/d_meter_HIO.h"
#include "d/d_msg_string.h"
#include "m_Do/m_Do_controller_pad.h"
#include "m_Do/m_Do_graphic.h"
/* 803BD038-803BD044 01A158 000C+00 1/1 0/0 0/0 .data cNullVec__6Z2Calc */
static u8 cNullVec__6Z2Calc[12] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/* 803BD050-803BD05C 01A170 000C+00 2/3 0/0 0/0 .data map_init_process */
typedef void (dMenu_Fishing_c::*initFunc)();
initFunc map_init_process[] = {
&dMenu_Fishing_c::wait_init,
};
/* 803BD068-803BD074 01A188 000C+00 1/2 0/0 0/0 .data map_move_process */
typedef void (dMenu_Fishing_c::*moveFunc)();
moveFunc map_move_process[] = {
&dMenu_Fishing_c::wait_move,
};
/* 801C4D54-801C4D98 1BF694 0044+00 0/0 2/2 0/0 .text
* __ct__15dMenu_Fishing_cFP10JKRExpHeapP9STControlP10CSTControl */
dMenu_Fishing_c::dMenu_Fishing_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i_cStick) {
mpHeap = i_heap;
mpArchive = 0;
mpMount = 0;
mpStick = i_stick;
mpCStick = i_cStick;
mStatus = READY_OPEN;
mProcess = 0;
mFishListScreenFrames = 0;
}
/* 801C4D98-801C504C 1BF6D8 02B4+00 1/0 0/0 0/0 .text __dt__15dMenu_Fishing_cFv */
dMenu_Fishing_c::~dMenu_Fishing_c() {
delete mpString;
mpString = NULL;
delete mpBlackTex;
mpBlackTex = NULL;
delete mpScreen;
mpScreen = NULL;
delete mpParent;
mpParent = NULL;
for (int i = 0; i < MAX_FINDABLE_FISHES; i++) {
delete mpFishParent[i];
mpFishParent[i] = NULL;
for (int j = 0; j < MAX_FINDABLE_FISHES; j++) {
delete mpFishParts[j][i];
mpFishParts[j][i] = NULL;
}
}
for (int i = 0; i < 2; i++) {
delete mpFishInfoParent[i];
mpFishInfoParent[i] = NULL;
}
delete mpIconScreen;
mpIconScreen = NULL;
for (int i = 0; i < 2; i++) {
if (mpButtonAB[i]) {
delete mpButtonAB[i];
mpButtonAB[i] = NULL;
}
if (mpButtonText[i]) {
delete mpButtonText[i];
mpButtonText[i] = NULL;
}
}
if (mpMount) {
mpMount->getArchive()->unmount();
mpMount->destroy();
mpMount = NULL;
}
if (mpArchive) {
mpArchive->unmount();
mpArchive = NULL;
}
}
/* 801C504C-801C50B4 1BF98C 0068+00 1/1 0/0 0/0 .text _create__15dMenu_Fishing_cFv */
void dMenu_Fishing_c::_create() {
mpString = new dMsgString_c();
screenSetBase();
screenSetDoIcon();
setHIO(true);
init();
}
/* 801C50B4-801C514C 1BF9F4 0098+00 0/0 2/2 0/0 .text _move__15dMenu_Fishing_cFv */
void dMenu_Fishing_c::_move() {
JKRHeap* heap = mDoExt_setCurrentHeap((JKRHeap*)mpHeap);
u8 old_process = mProcess;
(this->*map_move_process[mProcess])();
if (old_process != mProcess) {
(this->*map_init_process[mProcess])();
}
setHIO(false);
mDoExt_setCurrentHeap(heap);
}
/* 801C514C-801C5204 1BFA8C 00B8+00 1/1 1/1 0/0 .text _draw__15dMenu_Fishing_cFv */
void dMenu_Fishing_c::_draw() {
if (mpArchive) {
J2DGrafContext* grafPort = dComIfGp_getCurrentGrafPort();
mpBlackTex->setAlpha(0xff);
mpBlackTex->draw(0.0f, 0.0f, 608.0f, 448.0f, 0, 0, 0);
mpScreen->draw(0.0f, 0.0f, grafPort);
mpIconScreen->draw(0.0f, 0.0f, grafPort);
}
}
/* 801C5204-801C522C 1BFB44 0028+00 0/0 2/2 0/0 .text isSync__15dMenu_Fishing_cFv */
bool dMenu_Fishing_c::isSync() {
if (mpMount != NULL && !mpMount->sync()) {
return false;
}
return true;
}
/* 801C522C-801C52E4 1BFB6C 00B8+00 1/1 0/0 0/0 .text init__15dMenu_Fishing_cFv */
void dMenu_Fishing_c::init() {
for (int i = 0; i < MAX_FINDABLE_FISHES; i++) {
if (dComIfGs_getFishNum(i) != 0) {
// Fish has been caught once, display it along with it's params
setFishParam(i, dComIfGs_getFishNum(i), dComIfGs_getFishSize(i));
mpFishParent[i]->show();
} else {
// Fish hasn't been caught yet, don't display it and also hide params
mpFishParent[i]->hide();
}
}
(this->*map_init_process[mProcess])();
}
/* 801C52E4-801C5470 1BFC24 018C+00 0/0 2/2 0/0 .text _open__15dMenu_Fishing_cFv */
int dMenu_Fishing_c::_open() {
if (mpMount == NULL) {
mpMount = mDoDvdThd_mountArchive_c::create("/res/Layout/fishres.arc", 0, NULL);
}
if (mpArchive == NULL) {
if (mpMount->sync()) {
if (mpArchive == NULL) {
mpArchive = (JKRArchive*)mpMount->getArchive();
delete mpMount;
mpMount = NULL;
_create();
}
} else {
return 0;
}
}
s16 openFrames = g_drawHIO.mFishListScreen.mOpenFrames;
s16 closeFrames = g_drawHIO.mFishListScreen.mCloseFrames;
mFishListScreenFrames = g_drawHIO.mFishListScreen.mOpenFrames;
if (mFishListScreenFrames >= openFrames) {
mFishListScreenFrames = closeFrames;
mStatus = READY_MOVE;
mpParent->scale(1.0f, 1.0f);
mpParent->setAlphaRate(1.0f);
return 1;
} else {
f32 div = mFishListScreenFrames / (f32)openFrames;
mpParent->scale(div, div);
mpParent->setAlphaRate(div);
return 0;
}
}
/* 801C5470-801C556C 1BFDB0 00FC+00 0/0 1/1 0/0 .text _close__15dMenu_Fishing_cFv */
int dMenu_Fishing_c::_close() {
s16 closeFrames = g_drawHIO.mFishListScreen.mCloseFrames;
mFishListScreenFrames = 0;
if (mFishListScreenFrames <= 0) {
mFishListScreenFrames = 0;
mStatus = CLOSED;
mpParent->scale(0.0f, 0.0f);
mpParent->setAlphaRate(0.0f);
return 1;
} else {
f32 div = mFishListScreenFrames / (f32)closeFrames;
mpParent->scale(div, div);
mpParent->setAlphaRate(div);
return 0;
}
}
/* 801C556C-801C55A8 1BFEAC 003C+00 1/0 0/0 0/0 .text wait_init__15dMenu_Fishing_cFv */
// While the fishing menu is open,
void dMenu_Fishing_c::wait_init() {
setAButtonString(0);
setBButtonString(0x3F9); // "Back"
}
/* 801C55A8-801C55D8 1BFEE8 0030+00 1/0 0/0 0/0 .text wait_move__15dMenu_Fishing_cFv */
void dMenu_Fishing_c::wait_move() {
if (mDoGph_gInf_c::getFader()->getStatus() == 1 && mDoCPd_c::getTrigB(PAD_1)) {
mStatus = READY_CLOSE;
}
}
/* 801C55D8-801C5D3C 1BFF18 0764+00 1/1 0/0 0/0 .text screenSetBase__15dMenu_Fishing_cFv
*/
void dMenu_Fishing_c::screenSetBase() {
static const u64 fish_n[6] = {
'fish_n_6', 'fish_n_5', 'fish_n_3', 'fish_n_1', 'fish_n_2', 'fish_n_4',
};
static const u64 fish_p0[6] = {
'fi_pa_6n', 'fi_pa_5n', 'fi_pa_3n', 'fi_pa_1n', 'fi_pa_2n', 'fi_pa_4n',
};
static const u64 fish_p1[6] = {
'fi_na_6n', 'fi_na_5n', 'fi_na_3n', 'fi_na_1n', 'fi_na_2n', 'fi_na_4n',
};
static const u64 fish_p2[6] = {'fi_li_6n', 'fi_li_5n', 'fi_li_3n',
'fi_li_1n', 'fi_li_2n', 'fi_li_4n'};
static const u64 fish_p3[6] = {
'b_box_6n', 'b_box_5n', 'b_box_3n', 'b_box_1n', 'b_box_2n', 'b_box_4n',
};
static const u64 fish_p4[6] = {
'r_box_6n', 'r_box_5n', 'r_box_3n', 'r_box_1n', 'r_box_2n', 'r_box_4n',
};
static const u64 fish_p5[6] = {
'info_6_n', 'info_5_n', 'info_3_n', 'info_1_n', 'info_2_n', 'info_4_n',
};
static const u64 size_1[6] = {
'size_t_6', 'size_t_5', 'size_t_3', 'size_t_1', 'size_t_2', 'size_t_4',
};
static const u64 size_unit_1[6] = {
'cm_t_6', 'cm_t_5', 'cm_t_3', 'cm_t_1', 'cm_t_2', 'cm_t_4',
};
static const u64 count_1[6] = {
'count_t6', 'count_t5', 'count_t3', 'count_t1', 'count_t2', 'count_t4',
};
static const u64 count_unit_1[6] = {
'cou_t_6', 'cou_t_5', 'cou_t_3', 'cou_t_1', 'cou_t_2', 'cou_t_4',
};
static const u64 name_0[6] = {
'name_6', 'name_5', 'name_3', 'name_1', 'name_2', 'name_4',
};
static const u64 fname_0[6] = {
'f_name_6', 'f_name_5', 'f_name_3', 'f_name_1', 'f_name_2', 'f_name_4',
};
static const u32 name_id[6] = {
0x59E, 0x59D, 0x59B, 0x599, 0x59A, 0x59C,
};
ResTIMG* TIMG = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource('TIMG', "tt_block8x8.bti");
mpBlackTex = new J2DPicture(TIMG);
mpBlackTex->setBlackWhite(JUtility::TColor(0, 0, 0, 0), JUtility::TColor(0, 0, 0, 0xFF));
mpScreen = new J2DScreen();
mpScreen->setPriority("zelda_fish_window.blo", 0x20000, mpArchive);
dPaneClass_showNullPane(mpScreen);
mpParent = new CPaneMgr(mpScreen, 'n_all', 2, NULL);
mpParent->setAlphaRate(0.0f);
for (int i = 0; i < MAX_FINDABLE_FISHES; i++) {
mpFishParent[i] = new CPaneMgr(mpScreen, fish_n[i], 0, NULL);
mpFishParts[0][i] = new CPaneMgr(mpScreen, fish_p0[i], 0, NULL);
mpFishParts[1][i] = new CPaneMgr(mpScreen, fish_p1[i], 0, NULL);
mpFishParts[2][i] = new CPaneMgr(mpScreen, fish_p2[i], 0, NULL);
mpFishParts[3][i] = new CPaneMgr(mpScreen, fish_p3[i], 0, NULL);
mpFishParts[4][i] = new CPaneMgr(mpScreen, fish_p4[i], 0, NULL);
mpFishParts[5][i] = new CPaneMgr(mpScreen, fish_p5[i], 0, NULL);
}
mpFishInfoParent[0] = new CPaneMgr(mpScreen, 'info_blu', 0, NULL);
mpFishInfoParent[1] = new CPaneMgr(mpScreen, 'info_red', 0, NULL);
J2DTextBox* textBox = (J2DTextBox*)mpScreen->search('f_t00');
mpScreen->search('t_t00')->hide();
textBox->setFont(mDoExt_getSubFont());
textBox->setString(0x200, "");
mpString->getString(0x5a1, textBox, NULL, NULL, NULL, 0);
for (int i = 0; i < MAX_FINDABLE_FISHES; i++) {
field_0x10c[1][i] = (J2DTextBox*)mpScreen->search(size_1[i]);
field_0x10c[1][i]->setFont(mDoExt_getSubFont());
field_0x10c[1][i]->setString(0x20, "");
field_0x16c[1][i] = (J2DTextBox*)mpScreen->search(size_unit_1[i]);
field_0x16c[1][i]->setFont(mDoExt_getSubFont());
field_0x16c[1][i]->setString(0x20, "");
field_0x13c[1][i] = (J2DTextBox*)mpScreen->search(count_1[i]);
field_0x13c[1][i]->setFont(mDoExt_getSubFont());
field_0x13c[1][i]->setString(0x20, "");
field_0x19c[1][i] = (J2DTextBox*)mpScreen->search(count_unit_1[i]);
field_0x19c[1][i]->setFont(mDoExt_getSubFont());
field_0x19c[1][i]->setString(0x20, "");
mpFishNameString[i] = (J2DTextBox*)mpScreen->search(name_0[i]);
mpScreen->search(fname_0[i])->hide();
mpFishNameString[i]->setFont(mDoExt_getSubFont());
mpFishNameString[i]->setString(0x20, "");
dMeter2Info_getStringKanji(name_id[i], mpFishNameString[i]->getStringPtr(), NULL);
}
mpInfoLargestString = (J2DTextBox*)mpScreen->search('inf_size');
mpInfoNumCaughtString = (J2DTextBox*)mpScreen->search('inf_cou');
mpInfoLargestString->setFont(mDoExt_getMesgFont());
mpInfoNumCaughtString->setFont(mDoExt_getMesgFont());
mpInfoLargestString->setString(0x20, "");
dMeter2Info_getStringKanji(0x59f, mpInfoLargestString->getStringPtr(), NULL); // "Largest"
mpInfoNumCaughtString->setString(0x20, "");
dMeter2Info_getStringKanji(0x5a0, mpInfoNumCaughtString->getStringPtr(), NULL); // "No. Caught"
}
/* 801C5D3C-801C5EB8 1C067C 017C+00 1/1 0/0 0/0 .text screenSetDoIcon__15dMenu_Fishing_cFv */
void dMenu_Fishing_c::screenSetDoIcon() {
static const u64 text_a_tag[5] = {'atext1_1', 'atext1_2', 'atext1_3', 'atext1_4', 'atext1_5'};
static const u64 text_b_tag[5] = {'btext1_1', 'btext1_2', 'btext1_3', 'btext1_4', 'btext1_5'};
mpIconScreen = new J2DScreen();
mpIconScreen->setPriority("zelda_collect_soubi_do_icon_parts.blo", 0x20000, mpArchive);
for (int i = 0; i < 2; i++) {
mpButtonAB[i] = NULL;
mpButtonText[i] = NULL;
}
dPaneClass_showNullPane(mpIconScreen);
for (int i = 0; i < 5; i++) {
mpAButtonString[i] = (J2DTextBox*)mpIconScreen->search(text_a_tag[i]);
mpBButtonString[i] = (J2DTextBox*)mpIconScreen->search(text_b_tag[i]);
mpAButtonString[i]->setFont(mDoExt_getMesgFont());
mpBButtonString[i]->setFont(mDoExt_getMesgFont());
mpAButtonString[i]->setString(0x20, "");
mpBButtonString[i]->setString(0x20, "");
}
}
/* 801C5EB8-801C5F68 1C07F8 00B0+00 1/1 0/0 0/0 .text setAButtonString__15dMenu_Fishing_cFUs */
void dMenu_Fishing_c::setAButtonString(u16 i_stringID) {
if (i_stringID == 0) {
for (int i = 0; i < 5; i++) {
strcpy(mpAButtonString[i]->getStringPtr(), "");
}
} else {
for (int i = 0; i < 5; i++) {
dMeter2Info_getStringKanji(i_stringID, mpAButtonString[i]->getStringPtr(), NULL);
}
}
}
/* 801C5F68-801C6018 1C08A8 00B0+00 1/1 0/0 0/0 .text setBButtonString__15dMenu_Fishing_cFUs */
void dMenu_Fishing_c::setBButtonString(u16 i_stringID) {
if (i_stringID == 0) {
for (int i = 0; i < 5; i++) {
strcpy(mpBButtonString[i]->getStringPtr(), "");
}
} else {
for (int i = 0; i < 5; i++) {
dMeter2Info_getStringKanji(i_stringID, mpBButtonString[i]->getStringPtr(), NULL);
}
}
}
/* 801C6018-801C605C 1C0958 0044+00 1/1 0/0 0/0 .text getFigure__15dMenu_Fishing_cFi */
u8 dMenu_Fishing_c::getFigure(int param_0) {
if (param_0 < 0) {
param_0 *= -1;
}
if (1000 <= param_0) {
param_0 = 999;
}
if (100 <= param_0) {
return 3;
}
if (param_0 >= 10) {
return 2;
}
return 1;
}
/* 801C605C-801C6210 1C099C 01B4+00 1/1 0/0 0/0 .text setFishParam__15dMenu_Fishing_cFiUsUc */
void dMenu_Fishing_c::setFishParam(int i_fishIdx, u16 i_fishCount, u8 i_fishSize) {
u8 fishCountFigure = getFigure(i_fishCount);
u8 fishSizeFigure = getFigure(i_fishSize);
char strBuff1[32];
char strBuff2[32];
for (int i = 1; i < 2; i++) {
// part one, i_fishSize
dComIfGp_setMessageCountNumber(i_fishSize);
mpString->getString(0x597, field_0x10c[i][i_fishIdx], NULL, NULL, NULL, 0); // "inches"
char* stringPtr = field_0x10c[i][i_fishIdx]->getStringPtr();
strcpy(strBuff1, stringPtr);
int j;
for (j = 0; strBuff1[j + fishSizeFigure] != 0; j++) {
strBuff2[j] = strBuff1[j + fishSizeFigure];
}
strBuff2[j] = 0;
strBuff1[fishSizeFigure] = 0;
strcpy(field_0x10c[i][i_fishIdx]->getStringPtr(), strBuff1);
strcpy(field_0x16c[i][i_fishIdx]->getStringPtr(), strBuff2);
// part two, i_fishCount
dComIfGp_setMessageCountNumber(i_fishCount);
mpString->getString(0x598, field_0x13c[i][i_fishIdx], NULL, NULL, NULL, 0); // "fish"
stringPtr = field_0x13c[i][i_fishIdx]->getStringPtr();
strcpy(strBuff1, stringPtr);
int k;
for (k = 0; strBuff1[k + fishCountFigure] != 0; k++) {
strBuff2[k] = strBuff1[k + fishCountFigure];
}
strBuff2[k] = 0;
strBuff1[fishCountFigure] = 0;
strcpy(field_0x13c[i][i_fishIdx]->getStringPtr(), strBuff1);
strcpy(field_0x19c[i][i_fishIdx]->getStringPtr(), strBuff2);
}
}
/* 801C6210-801C659C 1C0B50 038C+00 2/2 0/0 0/0 .text setHIO__15dMenu_Fishing_cFb */
void dMenu_Fishing_c::setHIO(bool i_useHIO) {
if (i_useHIO || g_drawHIO.mFishListScreen.mDebug) {
for (int i = 0; i < MAX_FINDABLE_FISHES; i++) {
mpFishParent[i]->paneTrans(g_drawHIO.mFishListScreen.mFishInfoPosX[i],
g_drawHIO.mFishListScreen.mFishInfoPosY[i]);
mpFishParent[i]->scale(g_drawHIO.mFishListScreen.mFishInfoScale[i],
g_drawHIO.mFishListScreen.mFishInfoScale[i]);
mpFishParts[0][i]->paneTrans(g_drawHIO.mFishListScreen.mFishIconPosX[i],
g_drawHIO.mFishListScreen.mFishIconPosY[i]);
mpFishParts[0][i]->scale(g_drawHIO.mFishListScreen.mFishIconScale[i],
g_drawHIO.mFishListScreen.mFishIconScale[i]);
mpFishParts[1][i]->paneTrans(g_drawHIO.mFishListScreen.mFishNamePosX[i],
g_drawHIO.mFishListScreen.mFishNamePosY[i]);
mpFishParts[1][i]->scale(g_drawHIO.mFishListScreen.mFishNameScale[i],
g_drawHIO.mFishListScreen.mFishNameScale[i]);
mpFishParts[2][i]->paneTrans(g_drawHIO.mFishListScreen.mFishLinePosX[i],
g_drawHIO.mFishListScreen.mFishLinePosY[i]);
mpFishParts[2][i]->scale(g_drawHIO.mFishListScreen.mFishLineScale[i],
g_drawHIO.mFishListScreen.mFishLineScale[i]);
mpFishParts[3][i]->paneTrans(g_drawHIO.mFishListScreen.mFishSizePosX[i],
g_drawHIO.mFishListScreen.mFishSizePosY[i]);
mpFishParts[3][i]->scale(g_drawHIO.mFishListScreen.mFishSizeScale[i],
g_drawHIO.mFishListScreen.mFishSizeScale[i]);
mpFishParts[4][i]->paneTrans(g_drawHIO.mFishListScreen.mFishCountPosX[i],
g_drawHIO.mFishListScreen.mFishCountPosY[i]);
mpFishParts[4][i]->scale(g_drawHIO.mFishListScreen.mFishCountScale[i],
g_drawHIO.mFishListScreen.mFishCountScale[i]);
mpFishParts[5][i]->paneTrans(g_drawHIO.mFishListScreen.mFishCountSizePosX[i],
g_drawHIO.mFishListScreen.mFishCountSizePosY[i]);
mpFishParts[5][i]->scale(g_drawHIO.mFishListScreen.mFishCountSizeScale[i],
g_drawHIO.mFishListScreen.mFishCountSizeScale[i]);
}
for (int i = 0; i < 2; i++) {
mpFishInfoParent[i]->paneTrans(g_drawHIO.mFishListScreen.mPosX[i],
g_drawHIO.mFishListScreen.mPosY[i]);
mpFishInfoParent[i]->scale(g_drawHIO.mFishListScreen.mScale[i],
g_drawHIO.mFishListScreen.mScale[i]);
}
}
if (g_drawHIO.mCollectScreen.mButtonDebugON || i_useHIO) {
if (mpButtonAB[A_BUTTON] != NULL) {
mpButtonAB[A_BUTTON]->paneTrans(g_drawHIO.mCollectScreen.mButtonAPosX,
g_drawHIO.mCollectScreen.mButtonAPosY);
mpButtonAB[A_BUTTON]->scale(g_drawHIO.mCollectScreen.mButtonAScale,
g_drawHIO.mCollectScreen.mButtonAScale);
}
if (mpButtonAB[B_BUTTON] != NULL) {
mpButtonAB[B_BUTTON]->paneTrans(g_drawHIO.mCollectScreen.mButtonBPosX,
g_drawHIO.mCollectScreen.mButtonBPosY);
mpButtonAB[B_BUTTON]->scale(g_drawHIO.mCollectScreen.mButtonBScale,
g_drawHIO.mCollectScreen.mButtonBScale);
}
if (mpButtonText[A_BUTTON] != NULL) {
mpButtonText[A_BUTTON]->paneTrans(g_drawHIO.mCollectScreen.mButtonATextPosX,
g_drawHIO.mCollectScreen.mButtonATextPosY);
mpButtonText[A_BUTTON]->scale(g_drawHIO.mCollectScreen.mButtonATextScale,
g_drawHIO.mCollectScreen.mButtonATextScale);
}
if (mpButtonText[B_BUTTON] != NULL) {
mpButtonText[B_BUTTON]->paneTrans(g_drawHIO.mCollectScreen.mButtonBTextPosX,
g_drawHIO.mCollectScreen.mButtonBTextPosY);
mpButtonText[B_BUTTON]->scale(g_drawHIO.mCollectScreen.mButtonBTextScale,
g_drawHIO.mCollectScreen.mButtonBTextScale);
}
}
}