Files
tww/src/d/actor/d_a_obj_apzl.cpp
T

1137 lines
34 KiB
C++

//
// Generated by dtk
// Translation Unit: d_a_obj_apzl.cpp
//
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_obj_apzl.h"
#include "d/d_procname.h"
#include "d/d_priority.h"
#include "d/actor/d_a_item.h"
#include "m_Do/m_Do_controller_pad.h"
#include "d/res/res_apzl.h"
static const u32 daObjApzl_bmt_table[16][16] = {
{
APZL_BMT_APZLP_I00,
APZL_BMT_APZLP_I01,
APZL_BMT_APZLP_I02,
APZL_BMT_APZLP_I03,
APZL_BMT_APZLP_I04,
APZL_BMT_APZLP_I05,
APZL_BMT_APZLP_I06,
APZL_BMT_APZLP_I07,
APZL_BMT_APZLP_I08,
APZL_BMT_APZLP_I09,
APZL_BMT_APZLP_I10,
APZL_BMT_APZLP_I11,
APZL_BMT_APZLP_I12,
APZL_BMT_APZLP_I13,
APZL_BMT_APZLP_I14,
APZL_BMT_APZLP_I15,
},
{
APZL_BMT_APZLP_J00,
APZL_BMT_APZLP_J01,
APZL_BMT_APZLP_J02,
APZL_BMT_APZLP_J03,
APZL_BMT_APZLP_J04,
APZL_BMT_APZLP_J05,
APZL_BMT_APZLP_J06,
APZL_BMT_APZLP_J07,
APZL_BMT_APZLP_J08,
APZL_BMT_APZLP_J09,
APZL_BMT_APZLP_J10,
APZL_BMT_APZLP_J11,
APZL_BMT_APZLP_J12,
APZL_BMT_APZLP_J13,
APZL_BMT_APZLP_J14,
APZL_BMT_APZLP_J15,
},
{
APZL_BMT_APZLP_K00,
APZL_BMT_APZLP_K01,
APZL_BMT_APZLP_K02,
APZL_BMT_APZLP_K03,
APZL_BMT_APZLP_K04,
APZL_BMT_APZLP_K05,
APZL_BMT_APZLP_K06,
APZL_BMT_APZLP_K07,
APZL_BMT_APZLP_K08,
APZL_BMT_APZLP_K09,
APZL_BMT_APZLP_K10,
APZL_BMT_APZLP_K11,
APZL_BMT_APZLP_K12,
APZL_BMT_APZLP_K13,
APZL_BMT_APZLP_K14,
APZL_BMT_APZLP_K15,
},
{
APZL_BMT_APZLP_L00,
APZL_BMT_APZLP_L01,
APZL_BMT_APZLP_L02,
APZL_BMT_APZLP_L03,
APZL_BMT_APZLP_L04,
APZL_BMT_APZLP_L05,
APZL_BMT_APZLP_L06,
APZL_BMT_APZLP_L07,
APZL_BMT_APZLP_L08,
APZL_BMT_APZLP_L09,
APZL_BMT_APZLP_L10,
APZL_BMT_APZLP_L11,
APZL_BMT_APZLP_L12,
APZL_BMT_APZLP_L13,
APZL_BMT_APZLP_L14,
APZL_BMT_APZLP_L15,
},
{
APZL_BMT_APZLP_M00,
APZL_BMT_APZLP_M01,
APZL_BMT_APZLP_M02,
APZL_BMT_APZLP_M03,
APZL_BMT_APZLP_M04,
APZL_BMT_APZLP_M05,
APZL_BMT_APZLP_M06,
APZL_BMT_APZLP_M07,
APZL_BMT_APZLP_M08,
APZL_BMT_APZLP_M09,
APZL_BMT_APZLP_M10,
APZL_BMT_APZLP_M11,
APZL_BMT_APZLP_M12,
APZL_BMT_APZLP_M13,
APZL_BMT_APZLP_M14,
APZL_BMT_APZLP_M15,
},
{
APZL_BMT_APZLP_N00,
APZL_BMT_APZLP_N01,
APZL_BMT_APZLP_N02,
APZL_BMT_APZLP_N03,
APZL_BMT_APZLP_N04,
APZL_BMT_APZLP_N05,
APZL_BMT_APZLP_N06,
APZL_BMT_APZLP_N07,
APZL_BMT_APZLP_N08,
APZL_BMT_APZLP_N09,
APZL_BMT_APZLP_N10,
APZL_BMT_APZLP_N11,
APZL_BMT_APZLP_N12,
APZL_BMT_APZLP_N13,
APZL_BMT_APZLP_N14,
APZL_BMT_APZLP_N15,
},
{
APZL_BMT_APZLP_O00,
APZL_BMT_APZLP_O01,
APZL_BMT_APZLP_O02,
APZL_BMT_APZLP_O03,
APZL_BMT_APZLP_O04,
APZL_BMT_APZLP_O05,
APZL_BMT_APZLP_O06,
APZL_BMT_APZLP_O07,
APZL_BMT_APZLP_O08,
APZL_BMT_APZLP_O09,
APZL_BMT_APZLP_O10,
APZL_BMT_APZLP_O11,
APZL_BMT_APZLP_O12,
APZL_BMT_APZLP_O13,
APZL_BMT_APZLP_O14,
APZL_BMT_APZLP_O15,
},
{
APZL_BMT_APZLP_P00,
APZL_BMT_APZLP_P01,
APZL_BMT_APZLP_P02,
APZL_BMT_APZLP_P03,
APZL_BMT_APZLP_P04,
APZL_BMT_APZLP_P05,
APZL_BMT_APZLP_P06,
APZL_BMT_APZLP_P07,
APZL_BMT_APZLP_P08,
APZL_BMT_APZLP_P09,
APZL_BMT_APZLP_P10,
APZL_BMT_APZLP_P11,
APZL_BMT_APZLP_P12,
APZL_BMT_APZLP_P13,
APZL_BMT_APZLP_P14,
APZL_BMT_APZLP_P15,
},
{
APZL_BMT_APZLP_Q00,
APZL_BMT_APZLP_Q01,
APZL_BMT_APZLP_Q02,
APZL_BMT_APZLP_Q03,
APZL_BMT_APZLP_Q04,
APZL_BMT_APZLP_Q05,
APZL_BMT_APZLP_Q06,
APZL_BMT_APZLP_Q07,
APZL_BMT_APZLP_Q08,
APZL_BMT_APZLP_Q09,
APZL_BMT_APZLP_Q10,
APZL_BMT_APZLP_Q11,
APZL_BMT_APZLP_Q12,
APZL_BMT_APZLP_Q13,
APZL_BMT_APZLP_Q14,
APZL_BMT_APZLP_Q15,
},
{
APZL_BMT_APZLP_R00,
APZL_BMT_APZLP_R01,
APZL_BMT_APZLP_R02,
APZL_BMT_APZLP_R03,
APZL_BMT_APZLP_R04,
APZL_BMT_APZLP_R05,
APZL_BMT_APZLP_R06,
APZL_BMT_APZLP_R07,
APZL_BMT_APZLP_R08,
APZL_BMT_APZLP_R09,
APZL_BMT_APZLP_R10,
APZL_BMT_APZLP_R11,
APZL_BMT_APZLP_R12,
APZL_BMT_APZLP_R13,
APZL_BMT_APZLP_R14,
APZL_BMT_APZLP_R15,
},
{
APZL_BMT_APZLP_S00,
APZL_BMT_APZLP_S01,
APZL_BMT_APZLP_S02,
APZL_BMT_APZLP_S03,
APZL_BMT_APZLP_S04,
APZL_BMT_APZLP_S05,
APZL_BMT_APZLP_S06,
APZL_BMT_APZLP_S07,
APZL_BMT_APZLP_S08,
APZL_BMT_APZLP_S09,
APZL_BMT_APZLP_S10,
APZL_BMT_APZLP_S11,
APZL_BMT_APZLP_S12,
APZL_BMT_APZLP_S13,
APZL_BMT_APZLP_S14,
APZL_BMT_APZLP_S15,
},
{
APZL_BMT_APZLP_T00,
APZL_BMT_APZLP_T01,
APZL_BMT_APZLP_T02,
APZL_BMT_APZLP_T03,
APZL_BMT_APZLP_T04,
APZL_BMT_APZLP_T05,
APZL_BMT_APZLP_T06,
APZL_BMT_APZLP_T07,
APZL_BMT_APZLP_T08,
APZL_BMT_APZLP_T09,
APZL_BMT_APZLP_T10,
APZL_BMT_APZLP_T11,
APZL_BMT_APZLP_T12,
APZL_BMT_APZLP_T13,
APZL_BMT_APZLP_T14,
APZL_BMT_APZLP_T15,
},
{
APZL_BMT_APZLP_U00,
APZL_BMT_APZLP_U01,
APZL_BMT_APZLP_U02,
APZL_BMT_APZLP_U03,
APZL_BMT_APZLP_U04,
APZL_BMT_APZLP_U05,
APZL_BMT_APZLP_U06,
APZL_BMT_APZLP_U07,
APZL_BMT_APZLP_U08,
APZL_BMT_APZLP_U09,
APZL_BMT_APZLP_U10,
APZL_BMT_APZLP_U11,
APZL_BMT_APZLP_U12,
APZL_BMT_APZLP_U13,
APZL_BMT_APZLP_U14,
APZL_BMT_APZLP_U15,
},
{
APZL_BMT_APZLP_V00,
APZL_BMT_APZLP_V01,
APZL_BMT_APZLP_V02,
APZL_BMT_APZLP_V03,
APZL_BMT_APZLP_V04,
APZL_BMT_APZLP_V05,
APZL_BMT_APZLP_V06,
APZL_BMT_APZLP_V07,
APZL_BMT_APZLP_V08,
APZL_BMT_APZLP_V09,
APZL_BMT_APZLP_V10,
APZL_BMT_APZLP_V11,
APZL_BMT_APZLP_V12,
APZL_BMT_APZLP_V13,
APZL_BMT_APZLP_V14,
APZL_BMT_APZLP_V15,
},
{
APZL_BMT_APZLP_W00,
APZL_BMT_APZLP_W01,
APZL_BMT_APZLP_W02,
APZL_BMT_APZLP_W03,
APZL_BMT_APZLP_W04,
APZL_BMT_APZLP_W05,
APZL_BMT_APZLP_W06,
APZL_BMT_APZLP_W07,
APZL_BMT_APZLP_W08,
APZL_BMT_APZLP_W09,
APZL_BMT_APZLP_W10,
APZL_BMT_APZLP_W11,
APZL_BMT_APZLP_W12,
APZL_BMT_APZLP_W13,
APZL_BMT_APZLP_W14,
APZL_BMT_APZLP_W15,
},
{
APZL_BMT_APZLP_X00,
APZL_BMT_APZLP_X01,
APZL_BMT_APZLP_X02,
APZL_BMT_APZLP_X03,
APZL_BMT_APZLP_X04,
APZL_BMT_APZLP_X05,
APZL_BMT_APZLP_X06,
APZL_BMT_APZLP_X07,
APZL_BMT_APZLP_X08,
APZL_BMT_APZLP_X09,
APZL_BMT_APZLP_X10,
APZL_BMT_APZLP_X11,
APZL_BMT_APZLP_X12,
APZL_BMT_APZLP_X13,
APZL_BMT_APZLP_X14,
APZL_BMT_APZLP_X15,
},
};
/* 00000078-0000025C .text move_piece__11daObjApzl_cFv */
bool daObjApzl_c::move_piece() {
stick->checkTrigger();
bool swapped = false;
if (mMoveTimer != 0) {
mMoveTimer--;
return false;
}
if ((getblank() & 3) != 3 && stick->checkLeftTrigger()) {
mMoveDirection = 1;
mSwappedPieceIdx = search_piece(getblank() + 1);
swapped = true;
}
if ((getblank() & 3) != 0 && stick->checkRightTrigger()) {
mMoveDirection = 3;
mSwappedPieceIdx = search_piece(getblank() - 1);
swapped = true;
}
if ((getblank() & 0xC) != 0xC && stick->checkUpTrigger()) {
mMoveDirection = 0;
mSwappedPieceIdx = search_piece(getblank() + 4);
swapped = true;
}
if ((getblank() & 0xC) != 0 && stick->checkDownTrigger()) {
mMoveDirection = 2;
mSwappedPieceIdx = search_piece(getblank() - 4);
swapped = true;
}
if (swapped == true) {
swap_piece(mBlankIdx, mSwappedPieceIdx);
if (check_clear()) {
mMoveTimer = 0x28;
} else {
mMoveTimer = 5;
}
}
return swapped;
}
/* 0000025C-00000310 .text check_arrow_draw__11daObjApzl_cFv */
void daObjApzl_c::check_arrow_draw() {
for(int i = 0; i < 4; i++) {
mDrawArrow[i] = false;
}
if (mState != STATE_PLAYING) {
return;
}
if (mMoveTimer != 0) {
return;
}
if ((getblank() & 3) != 3) {
mDrawArrow[1] = true; // left
}
if ((getblank() & 3) != 0) {
mDrawArrow[3] = true; // right
}
if ((getblank() & 0xc) != 0xc) {
mDrawArrow[0] = true; // up
}
if ((getblank() & 0xc) != 0) {
mDrawArrow[2] = true; // down
}
}
/* 00000310-0000033C .text search_piece__11daObjApzl_cFUc */
u8 daObjApzl_c::search_piece(u8 piece) {
for (int i = 0; ; i++) {
if (mPiecePos[i] == piece) {
return i;
}
}
}
/* 0000033C-00000360 .text swap_piece__11daObjApzl_cFUcUc */
void daObjApzl_c::swap_piece(u8 firstPieceIdx, u8 secondPieceIdx) {
u8 tempPiece = mPiecePos[firstPieceIdx];
mPiecePos[firstPieceIdx] = mPiecePos[secondPieceIdx];
mPiecePos[secondPieceIdx] = tempPiece;
}
/* 00000360-00000598 .text randamize_piece__11daObjApzl_cFv */
void daObjApzl_c::randamize_piece() {
for(int i = 0; i < 16; i++) {
mPiecePos[i] = i;
}
u8 unscrambledCount;
while(true) {
unscrambledCount = 0;
for(int j = 0; j < 10000; j++) {
u8 temp = (int)cM_rndF(4.0f) & 3;
if(temp == 1) {
if((getblank() & 3) != 3) {
swap_piece(mBlankIdx, search_piece(getblank() + 1));
}
} else if(temp == 3) {
if((getblank() & 3) != 0) {
swap_piece(mBlankIdx, search_piece(getblank() - 1));
}
} else if(temp == 0) {
if((getblank() & 0xc) != 0xc) {
swap_piece(mBlankIdx, search_piece(getblank() + 4));
}
} else if((getblank() & 0xc) != 0) {
swap_piece(mBlankIdx, search_piece(getblank() - 4));
}
}
for(int j = 0; j < 16; j++) {
if((u32)mPiecePos[j] == (j & 0xff)) {
unscrambledCount++;
}
}
if(unscrambledCount < 3) {
break;
}
}
for(int i = 0; i < 3; i++) {
if ((getblank() & 3) != 3) {
swap_piece(mBlankIdx, search_piece(getblank() + 1));
}
if ((getblank() & 0xC) != 0) {
swap_piece(mBlankIdx, search_piece(getblank() - 4));
}
}
}
/* 00000598-000005CC .text save_piece__11daObjApzl_cFv */
void daObjApzl_c::save_piece() {
for(int i = 0; i < 16; i++) {
dComIfGs_setPuzzleData(i, mPiecePos[i]);
}
}
/* 000005CC-00000604 .text check_clear__11daObjApzl_cFv */
bool daObjApzl_c::check_clear() {
for (int i = 0; i < 16; i++) {
if ((u32)mPiecePos[i] != (i & 0xff)) {
return false;
}
}
return true;
}
/* 00000604-00000748 .text next_msgStatus__11daObjApzl_cFPUl */
u16 daObjApzl_c::next_msgStatus(u32* pMsgNo) {
u16 status = fopMsgStts_MSG_CONTINUES_e;
switch(*pMsgNo) {
case 0x1BC5:
mQuitGame = true;
status = fopMsgStts_MSG_ENDS_e;
break;
case 0x1BC6:
if (mpCurrMsg->mSelectNum == 0) {
*pMsgNo = 0x1BC7;
} else {
*pMsgNo = 0x1BC8;
}
break;
case 0x1BC7:
if (mpCurrMsg->mSelectNum == 0) {
*pMsgNo = 0x1BCA;
} else {
*pMsgNo = 0x1BC9;
}
break;
case 0x1BC8:
mQuitGame = true;
status = fopMsgStts_MSG_ENDS_e;
break;
case 0x1BC9:
status = fopMsgStts_MSG_ENDS_e;
break;
case 0x1BCA:
*pMsgNo = 0x1BCB;
break;
case 0x1BCB:
if (mpCurrMsg->mSelectNum == 0) {
*pMsgNo = 0x1BC9;
} else {
*pMsgNo = 0x1BCC;
}
break;
case 0x1BCC:
*pMsgNo = 0x1BCA;
break;
case 0x1BCD:
if (mpCurrMsg->mSelectNum == 0) {
status = fopMsgStts_MSG_ENDS_e;
} else {
*pMsgNo = 0x1BCE;
}
break;
case 0x1BCE:
mQuitGame = true;
status = fopMsgStts_MSG_ENDS_e;
break;
case 0x1BCF:
status = fopMsgStts_MSG_ENDS_e;
break;
case 0x1BD0:
mShownRewardMessage = true;
status = fopMsgStts_MSG_ENDS_e;
break;
default:
mQuitGame = true;
status = fopMsgStts_MSG_ENDS_e;
break;
}
return status;
}
/* 00000748-0000079C .text getMsg__11daObjApzl_cFv */
u32 daObjApzl_c::getMsg() {
if (mShownRewardMessage == true) {
return 0x1BC5;
}
if (mGaveReward == true) {
return 0x1BD0;
}
if (mGameCleared == true) {
return 0x1BCF;
}
if (mGameStarted == true) {
return 0x1BCD;
}
return 0x1BC6;
}
/* 0000079C-0000087C .text talk__11daObjApzl_cFi */
u16 daObjApzl_c::talk(int param_1) {
u16 status = 0xFF;
if (mCurrMsgId == fpcM_ERROR_PROCESS_ID_e) {
if (param_1 == 1) {
mMsgNo = getMsg();
}
mCurrMsgId = fopMsgM_messageSet(mMsgNo, this);
mpCurrMsg = NULL;
} else {
if (mpCurrMsg != NULL) {
status = mpCurrMsg->mStatus;
if (status == fopMsgStts_MSG_DISPLAYED_e) {
mpCurrMsg->mStatus = next_msgStatus(&mMsgNo);
if (mpCurrMsg->mStatus == fopMsgStts_MSG_CONTINUES_e) {
fopMsgM_messageSet(mMsgNo);
}
} else if (status == fopMsgStts_BOX_CLOSED_e) {
mpCurrMsg->mStatus = fopMsgStts_MSG_DESTROYED_e;
mCurrMsgId = -1;
}
} else {
mpCurrMsg = fopMsgM_SearchByID(mCurrMsgId);
}
}
return status;
}
#if VERSION > VERSION_JPN
u8 daObjApzl_Rupee_Table[] = {
0x01, 0x00, 0x01, 0x00,
0x01, 0x00, 0x02, 0x00,
0x01, 0x00, 0x02, 0x00,
0x03, 0x00, 0x01, 0x00,
0x01, 0x02, 0x01, 0x00,
0x01, 0x01, 0x01, 0x00,
0x01, 0x03, 0x01, 0x01,
0x01, 0x04,
};
#endif
/* 0000087C-00000D08 .text privateCut__11daObjApzl_cFv */
void daObjApzl_c::privateCut() {
static char* cut_name_tbl[] = {
"WAIT",
"TALK",
"GAME",
"GETITEM",
"STOP",
"SOUND",
"PUSH_A",
"EVENT_END"
};
enum {
ACT_WAIT,
ACT_TALK,
ACT_GAME,
ACT_GETITEM,
ACT_STOP,
ACT_SOUND,
ACT_PUSH_A,
ACT_EVENT_END
};
int staffIdx = dComIfGp_evmng_getMyStaffId("Apzl");
bool temp;
if (staffIdx != -1) {
mActIdx = dComIfGp_evmng_getMyActIdx(staffIdx, cut_name_tbl, ARRAY_SIZE(cut_name_tbl), TRUE, 0);
if (mActIdx == -1) {
dComIfGp_evmng_cutEnd(staffIdx);
} else {
temp = false;
if (dComIfGp_evmng_getIsAddvance(staffIdx)) {
switch(mActIdx) {
case ACT_WAIT:
case ACT_TALK:
case ACT_STOP:
case ACT_PUSH_A:
break;
case ACT_GAME:
mGameStarted = true;
break;
case ACT_GETITEM:
mGaveReward = true;
mRewardTimer = 0x96;
break;
case ACT_SOUND:
mDoAud_seStart(JA_SE_15PUZZLE_COMPLETE);
break;
case ACT_EVENT_END:
fopAc_ac_c* actor;
for(int i = 0; i < mGivenRupeeCount; i++) {
actor = fopAcM_SearchByID(mRupeeIds[i]);
if (actor != NULL) {
actor->current.angle.set(0, 0, 0);
}
}
break;
}
}
switch(mActIdx) {
case 0:
temp = true;
break;
case 1:
if (talk(1) == 0x12) {
temp = true;
}
break;
case 2:
temp = true;
break;
case 3:
dComIfGp_setDoStatusForce(dActStts_BLANK_e);
dComIfGp_setAStatusForce(dActStts_BLANK_e);
if (mRewardTimer == 0) {
temp = true;
} else {
mRewardTimer--;
if ((mRewardTimer & 2) == 0 && mGivenRupeeCount < 30) {
csXyz rupeeAngle(current.angle);
cXyz rupeePos(0.0f, 100.0f, 735.0f);
rupeeAngle.x += (s16)cM_rndFX(4000.0f);
rupeeAngle.y = (s16)cM_rndFX(6000.0f) + rupeeAngle.y - 0x4000;
rupeeAngle.z = 0;
int itemNo;
#if VERSION <= VERSION_JPN
if(mPuzzleNo == 15) {
f32 temp2 = cM_rndF(1000.0f);
if(temp2 < 900.0) {
itemNo = dItem_GREEN_RUPEE_e;
} else if (temp2 < 980.0) {
itemNo = dItem_BLUE_RUPEE_e;
} else if (temp2 < 995.0) {
itemNo = dItem_YELLOW_RUPEE_e;
} else if (temp2 < 999.0) {
itemNo = dItem_RED_RUPEE_e;
} else {
itemNo = dItem_PURPLE_RUPEE_e;
}
} else {
itemNo = dItem_GREEN_RUPEE_e;
}
#else
if (mPuzzleNo == 15) {
u8 rupeeType = daObjApzl_Rupee_Table[mGivenRupeeCount];
if (rupeeType == 0) {
itemNo = dItem_GREEN_RUPEE_e;
} else if (rupeeType == 1) {
itemNo = dItem_BLUE_RUPEE_e;
} else if (rupeeType == 2) {
itemNo = dItem_YELLOW_RUPEE_e;
} else if (rupeeType == 3) {
itemNo = dItem_RED_RUPEE_e;
} else {
itemNo = dItem_PURPLE_RUPEE_e;
}
} else if (mGivenRupeeCount % 6 == 0) {
itemNo = dItem_BLUE_RUPEE_e;
} else {
itemNo = dItem_GREEN_RUPEE_e;
}
#endif
daItem_c* item = (daItem_c*)fopAcM_fastCreateItem(&rupeePos, itemNo, fopAcM_GetRoomNo(this), &rupeeAngle, NULL, cM_rndF(15.0f) + 5.0f, cM_rndF(15.0f) + 5.0f, -2.1f);
if(item != NULL) {
fopAcM_OnStatus(item, fopAcStts_UNK4000_e);
item->setItemTimer(450);
}
mRupeeIds[mGivenRupeeCount] = fopAcM_GetID(item);
mGivenRupeeCount++;
mGaveReward = true;
mRewardTimer = 0x3C;
}
}
break;
case 4:
break;
case 5:
dComIfGp_setDoStatusForce(dActStts_BLANK_e);
dComIfGp_setAStatusForce(dActStts_BLANK_e);
if (!mDoAud_checkSePlaying(JA_SE_15PUZZLE_COMPLETE)) {
temp = true;
}
break;
case 6:
dComIfGp_setDoStatusForce(dActStts_NEXT_e);
dComIfGp_setAStatusForce(dActStts_BLANK_e);
if (CPad_CHECK_HOLD_A(0)) {
temp = true;
}
break;
case 7:
temp = true;
break;
default:
temp = true;
break;
}
if (temp) {
dComIfGp_evmng_cutEnd(staffIdx);
}
}
}
}
/* 00000D08-00000D28 .text CheckCreateHeap__FP10fopAc_ac_c */
static BOOL CheckCreateHeap(fopAc_ac_c* i_this) {
return ((daObjApzl_c*)i_this)->CreateHeap();
}
/* 00000D28-00001088 .text CreateHeap__11daObjApzl_cFv */
BOOL daObjApzl_c::CreateHeap() {
J3DModelData * modelData = (J3DModelData *)dComIfG_getObjectRes("Apzl", APZL_BDL_APZLP);
JUT_ASSERT(VERSION_SELECT(0x2B9, 0x2B9, 0x2E2, 0x2E2), modelData != NULL);
for(int i = 0; i < 16; i++) {
mpPieceModel[i] = mDoExt_J3DModel__create(modelData, 0x80000, 0x37441422);
if (mpPieceModel[i] == NULL) {
return FALSE;
}
}
modelData = (J3DModelData *)dComIfG_getObjectRes("Apzl", APZL_BDL_APZLY);
JUT_ASSERT(VERSION_SELECT(0x2C6, 0x2C6, 0x2EF, 0x2EF), modelData != NULL);
for(int i = 0; i < 4; i++) {
mpArrowModel[i] = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
if (mpArrowModel[i] == NULL) {
return FALSE;
}
}
modelData = (J3DModelData *)dComIfG_getObjectRes("Apzl", APZL_BDL_VBSRP);
JUT_ASSERT(VERSION_SELECT(0x2D1, 0x2D1, 0x2FA, 0x2FA), modelData != NULL);
J3DAnmTexPattern* btp_data = (J3DAnmTexPattern *)dComIfG_getObjectRes("Apzl", APZL_BTP_VBSRP);
JUT_ASSERT(VERSION_SELECT(0x2D6, 0x2D6, 0x2FF, 0x2FF), btp_data != NULL);
int i = 0;
while (true) {
mpScoreboardModel[i] = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
if (mpScoreboardModel[i] == NULL) {
return FALSE;
}
if(mScoreboardBtpAnm[i].init(modelData, btp_data, 1, 0) == 0) {
return FALSE;
}
i++;
if(i >= 0x10) {
stick = new STControl(0x3C, 0x1E, 0, 0, 0.9, 0.5, 0, 0);
JUT_ASSERT(VERSION_SELECT(0x2E7, 0x2E7, 0x310, 0x310), stick != NULL);
return TRUE;
}
}
return FALSE;
}
/* 00001088-000012BC .text CreateInit__11daObjApzl_cFv */
void daObjApzl_c::CreateInit() {
mType = daObjApzl_prm::getType(this);
mPuzzleNo = dComIfGs_getPuzzleInfo();
if (mPuzzleNo >= 0x10) {
mPuzzleNo = 0;
}
for(int i = 0; i < 16; i++) {
if (i >= mPuzzleNo) {
mScoreboardBtpAnm[i].setFrame(0.0f);
} else {
mScoreboardBtpAnm[i].setFrame(1.0f);
}
}
fopAcM_SetMtx(this, mpPieceModel[0]->getBaseTRMtx());
fopAcM_setCullSizeBox(this, -600.0f, -600.0f, -600.0f, 600.0f, 600.0f, 600.0f);
fopAcM_setCullSizeFar(this, 1.0f);
mBlankIdx = 3;
mShowBlankPiece = false;
if (mType == 0) {
randamize_piece();
} else {
for(int i = 0; i < 16; i++) {
mPiecePos[i] = i;
}
}
mEventIdx[EVENT_TALK] = dComIfGp_evmng_getEventIdx("PUZZLE_TALK", 0xff);
mEventIdx[EVENT_GAME] = dComIfGp_evmng_getEventIdx("PUZZLE_GAME", 0xff);
mEventIdx[EVENT_RUPEE] = dComIfGp_evmng_getEventIdx("PUZZLE_RUPEE", 0xff);
eventInfo.setEventId(mEventIdx[EVENT_TALK]);
if (mType == 0) {
cLib_onBit<u32>(attention_info.flags, fopAc_Attn_TALKFLAG_CHECK_e | fopAc_Attn_ACTION_SPEAK_e);
}
attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0x28;
attention_info.position = current.pos;
mpCurrMsg = NULL;
mCurrMsgId = -1;
mQuitGame = false;
mGameStarted = false;
mGameCleared = false;
mGaveReward = false;
mShownRewardMessage = false;
mSwappedPieceIdx = 0;
mMoveTimer = 0;
mMoveDirection = 0;
mPlayedStartSound = false;
mState = STATE_IDLE;
for(int i = 0; i < 4; i++) {
mDrawArrow[i] = false;
}
mGivenRupeeCount = 0;
set_mtx();
}
/* 000012BC-000016B8 .text set_mtx__11daObjApzl_cFv */
void daObjApzl_c::set_mtx() {
for(int i = 0; i < 16; i++) {
mpPieceModel[i]->setBaseScale(scale);
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(current.angle.y);
s32 piecePos = mPiecePos[i];
mDoMtx_stack_c::transM((piecePos % 4) * 40.0f - 60.0f, 60.0f - (piecePos / 4) * 40.0f, 0.0f);
if (i == mSwappedPieceIdx && mMoveTimer != 0) {
f32 moveTimer;
if (!check_clear()) {
moveTimer = mMoveTimer * 8.0f;
} else {
moveTimer = mMoveTimer;
}
u8 moveDirection = mMoveDirection;
if (moveDirection == 0) { // up
mDoMtx_stack_c::transM(0.0,-moveTimer,0.0);
} else if (moveDirection == 1) { // left
mDoMtx_stack_c::transM(moveTimer,0.0,0.0);
} else if (moveDirection == 2) { // down
mDoMtx_stack_c::transM(0.0,moveTimer,0.0);
} else { //right
mDoMtx_stack_c::transM(-moveTimer,0.0,0.0);
}
}
mpPieceModel[i]->setBaseTRMtx(mDoMtx_stack_c::get());
}
for(int i = 0; i < 4; i++) {
mpArrowModel[i]->setBaseScale(scale);
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(current.angle.y);
s32 blankIdx = getblank();
mDoMtx_stack_c::transM((blankIdx % 4) * 40.0f - 60.0f, 60.0f - (blankIdx / 4) * 40.0f, 0.0f);
mDoMtx_stack_c::ZrotM(i * 0x4000);
mDoMtx_stack_c::transM(0.0f, -15.0f, 0.0f);
mpArrowModel[i]->setBaseTRMtx(mDoMtx_stack_c::get());
}
for(int i = 0; i < 16; i++) {
mpScoreboardModel[i]->setBaseScale(scale);
mDoMtx_stack_c::transS(0.0f, -((i % 8) + 1) * 28.62f + 10.0f, (i / 8 - 2) * 28.62f);
mpScoreboardModel[i]->setBaseTRMtx(mDoMtx_stack_c::get());
}
}
cPhs_State daObjApzl_c::_create(){
fopAcM_SetupActor(this, daObjApzl_c);
cPhs_State phase_state = dComIfG_resLoad(&mPhs, "Apzl");
if (phase_state == cPhs_COMPLEATE_e) {
if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x1460)) {
return cPhs_ERROR_e;
} else {
CreateInit();
}
}
return phase_state;
}
/* 000016B8-00001780 .text daObjApzl_Create__FPv */
static cPhs_State daObjApzl_Create(void* i_this) {
return static_cast<daObjApzl_c*>(i_this)->_create();
}
bool daObjApzl_c::_delete() {
delete stick;
dComIfG_resDelete(&mPhs, "Apzl");
return true;
}
/* 0000184C-00001894 .text daObjApzl_Delete__FPv */
static BOOL daObjApzl_Delete(void* i_this) {
return static_cast<daObjApzl_c*>(i_this)->_delete();
}
/* 00001894-000018B8 .text daObjApzl_Draw__FPv */
static BOOL daObjApzl_Draw(void* i_this) {
return ((daObjApzl_c*)i_this)->_draw();
}
/* 000018B8-00001B00 .text _draw__11daObjApzl_cFv */
bool daObjApzl_c::_draw() {
if (mType == 0) {
dComIfGd_setListBG();
for(int i = 0; i < 16; i++) {
if (i != mBlankIdx || mShowBlankPiece) {
mpPieceModel[i]->getModelData()->setMaterialTable(((J3DMaterialTable*)dComIfG_getObjectRes("Apzl", daObjApzl_bmt_table[mPuzzleNo][i])), J3DMatCopyFlag_All);
mDoExt_modelUpdateDL(mpPieceModel[i]);
}
}
dComIfGd_setList();
for (int i = 0; i < 4; i++) {
if (mDrawArrow[i]) {
mDoExt_modelUpdateDL(mpArrowModel[i]);
}
}
for(int i = 0; i < 16; i++) {
mScoreboardBtpAnm[i].entry(mpScoreboardModel[i]->getModelData());
mDoExt_modelUpdateDL(mpScoreboardModel[i]);
mScoreboardBtpAnm[i].remove(mpScoreboardModel[i]->getModelData());
}
} else {
dComIfGd_setListBG();
for(int i = 0; i < 16; i++) {
mpPieceModel[i]->getModelData()->setMaterialTable(((J3DMaterialTable*)dComIfG_getObjectRes("Apzl", daObjApzl_bmt_table[mPuzzleNo][i])), J3DMatCopyFlag_All);
mDoExt_modelUpdateDL(mpPieceModel[i]);
}
dComIfGd_setList();
}
return true;
}
/* 00001B00-00001B24 .text daObjApzl_Execute__FPv */
static BOOL daObjApzl_Execute(void* i_this) {
return ((daObjApzl_c*)i_this)->_execute();
}
/* 00001B24-00001E8C .text _execute__11daObjApzl_cFv */
bool daObjApzl_c::_execute() {
if(mType == 0) {
switch(mState) {
case STATE_IDLE:
eventInfo.onCondition(dEvtCnd_CANTALK_e);
if (eventInfo.checkCommandTalk()) {
mState = STATE_TALK;
}
break;
case STATE_TALK:
privateCut();
if(dComIfGp_evmng_endCheck(mEventIdx[EVENT_TALK])) {
if(mQuitGame == true) {
dComIfGp_event_reset();
mState = STATE_IDLE;
mQuitGame = false;
mGameStarted = false;
save_piece();
} else {
mState = STATE_START;
}
}
break;
case STATE_START:
if (!mPlayedStartSound) {
mDoAud_seStart(JA_SE_15PUZZLE_START);
mPlayedStartSound = true;
}
fopAcM_orderChangeEventId(this, mEventIdx[EVENT_GAME], 0, 0xFFFF);
mState = STATE_PLAYING;
break;
case STATE_PLAYING:
privateCut();
if (move_piece()) {
mDoAud_seStart(JA_SE_TALK_CURSOR);
}
dComIfGp_setDoStatusForce(dActStts_BLANK_e);
dComIfGp_setAStatusForce(dActStts_CANCEL_e);
if (check_clear() && mMoveTimer == 0) {
mShowBlankPiece = 1;
mGameCleared = true;
dComIfGp_getVibration().StartShock(4, 1, cXyz(0.0f, 1.0f, 0.0f));
mState = STATE_END;
} else {
if (CPad_CHECK_HOLD_B(0)) {
mDoAud_seStart(JA_SE_15PUZZLE_EXIT);
mState = STATE_END;
}
}
break;
case STATE_END:
mQuitGame = false;
if (mGameCleared == true) {
u8 clearCount = dComIfGs_getPuzzleInfo();
clearCount++;
if(clearCount >= 16) {
clearCount = 0;
}
mScoreboardBtpAnm[mPuzzleNo].setFrame(1.0f);
dComIfGs_setPuzzleInfo(clearCount);
fopAcM_orderChangeEventId(this, mEventIdx[EVENT_RUPEE], 0, 0xFFFF);
mState = STATE_RUPEE;
} else {
fopAcM_orderChangeEventId(this, mEventIdx[EVENT_TALK], 0, 0xFFFF);
mState = STATE_TALK;
} // fallthrough
case STATE_RUPEE:
privateCut();
if(dComIfGp_evmng_endCheck(mEventIdx[EVENT_RUPEE])) {
dComIfGp_event_reset();
mState = STATE_IDLE;
mQuitGame = false;
mGameStarted = false;
}
break;
}
check_arrow_draw();
}
set_mtx();
return true;
}
/* 00001E8C-00001E94 .text daObjApzl_IsDelete__FPv */
static BOOL daObjApzl_IsDelete(void*) {
return TRUE;
}
static actor_method_class daObj_ApzlMethodTable = {
(process_method_func)daObjApzl_Create,
(process_method_func)daObjApzl_Delete,
(process_method_func)daObjApzl_Execute,
(process_method_func)daObjApzl_IsDelete,
(process_method_func)daObjApzl_Draw,
};
actor_process_profile_definition g_profile_Obj_Apzl = {
/* LayerID */ fpcLy_CURRENT_e,
/* ListID */ 0x0007,
/* ListPrio */ fpcPi_CURRENT_e,
/* ProcName */ PROC_Obj_Apzl,
/* Proc SubMtd */ &g_fpcLf_Method.base,
/* Size */ sizeof(daObjApzl_c),
/* SizeOther */ 0,
/* Parameters */ 0,
/* Leaf SubMtd */ &g_fopAc_Method.base,
/* Priority */ PRIO_Obj_Apzl,
/* Actor SubMtd */ &daObj_ApzlMethodTable,
/* Status */ fopAcStts_NOCULLEXEC_e | fopAcStts_CULL_e | fopAcStts_UNK40000_e,
/* Group */ fopAc_ACTOR_e,
/* CullType */ fopAc_CULLBOX_CUSTOM_e,
};