/** * d_shop_system.cpp * Main Shop System */ #include "d/dolzel.h" // IWYU pragma: keep #include "d/d_shop_system.h" #include "SSystem/SComponent/c_math.h" #include "d/d_a_shop_item_static.h" #include "d/d_item.h" #include "d/d_lib.h" #include "d/d_select_cursor.h" #include "d/d_meter2_info.h" #include "d/d_meter_HIO.h" #include "d/d_msg_object.h" #include "m_Do/m_Do_controller_pad.h" #include "m_Do/m_Do_lib.h" #include "d/actor/d_a_tag_shop_item.h" static daTag_ShopItem_c* dShopSystem_itemActor[7] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, }; static u8 dShopSystem_itemNo[7] = { fpcNm_ITEM_NONE, fpcNm_ITEM_NONE, fpcNm_ITEM_NONE, fpcNm_ITEM_NONE, fpcNm_ITEM_NONE, fpcNm_ITEM_NONE, fpcNm_ITEM_NONE, }; static u8 dShopSystem_sellItemMax; static int dShopSystem_item_count; static u8 data_80451060; static int dShopSystem_searchItemActor(void* i_actor, void* param_1) { if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_TAG_SHOPITM) { if ((fopAcM_GetParam(param_1) & 0xF0000000) == (fopAcM_GetParam(i_actor) & 0xF0000000) && dShopSystem_item_count < dShopSystem_sellItemMax) { u8 i_posID = (fopAcM_GetParam(i_actor) >> 0x18) & 0xF; JUT_ASSERT(0, i_posID <= dShopSystem_c::ITEM_MAX_e); if (dShopSystem_itemActor[0] != i_actor && dShopSystem_itemActor[1] != i_actor && dShopSystem_itemActor[2] != i_actor && dShopSystem_itemActor[3] != i_actor && dShopSystem_itemActor[4] != i_actor && dShopSystem_itemActor[5] != i_actor && dShopSystem_itemActor[6] != i_actor) { u8 sw = static_cast(i_actor)->home.angle.z; u8 sw2 = ((u16) static_cast(i_actor)->home.angle.z) >> 8; u8 item_no = fopAcM_GetParam(i_actor) & 0xFF; if ((sw == 0xFF || !dComIfGs_isSaveSwitch(sw)) && (sw2 == 0xFF || dComIfGs_isSaveSwitch(sw2))) { if (sw != 0xFF && item_no == fpcNm_ITEM_HYLIA_SHIELD && checkItemGet(item_no, true)) { dComIfGs_onSaveSwitch(sw); } else { if (i_posID == 0) { data_80451060 = 1; dShopSystem_itemActor[dShopSystem_item_count] = (daTag_ShopItem_c*)i_actor; dShopSystem_itemNo[dShopSystem_item_count] = item_no; } else if (dShopSystem_itemActor[i_posID - 1] == NULL) { dShopSystem_itemActor[i_posID - 1] = (daTag_ShopItem_c*)i_actor; dShopSystem_itemNo[i_posID - 1] = item_no; } dShopSystem_item_count++; } } } } } return 0; } static fopAc_ac_c* dShopSystem_cameraActor[2] = {NULL, NULL}; static int dShopSystem_camera_count; static int dShopSystem_searchCameraActor(void* i_actor, void* param_1) { if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_TAG_SHOPCAM) { if ((fopAcM_GetParam(param_1) & 0xf0000000) == (fopAcM_GetParam(i_actor) & 0xf0000000) && dShopSystem_camera_count < 2) { switch (fopAcM_GetParam(i_actor) & 0xf) { case 0: if (dShopSystem_cameraActor[0] == NULL) { dShopSystem_cameraActor[0] = (fopAc_ac_c*)i_actor; dShopSystem_camera_count++; } break; case 1: if (dShopSystem_cameraActor[1] == NULL) { dShopSystem_cameraActor[1] = (fopAc_ac_c*)i_actor; dShopSystem_camera_count++; } break; default: break; } } } return 0; } void dShopSystem_c::initShopSystem() { dShopSystem_sellItemMax = 3; data_80451060 = 0; for (int i = 0; i < 7; i++) { dShopSystem_itemActor[i] = NULL; dShopSystem_itemNo[i] = fpcNm_ITEM_NONE; } dShopSystem_item_count = 0; for (int i = 0; i < 2; i++) { dShopSystem_cameraActor[i] = NULL; } dShopSystem_camera_count = 0; if (mpStick == NULL) { mpStick = new STControl(); } if (mpDrawCursor == NULL) { mpDrawCursor = new dSelect_cursor_c(1, 1.0f, NULL); mpDrawCursor->setParam(1.0f, 1.0f, 0.1f, 0.7f, 0.7f); } field_0xf64 = -1; mEventParam = 0; field_0xf58 = 0; mFlag = 0; mCursorPos = 0; mLastCursorPos = 0; field_0xf68 = 0; mSeq = 0; field_0xf71 = mSeq; field_0xf79 = 0; field_0xf7a = 0; mWaitTimer = 0; mSoldOutFlag = -1; mSoldOutItemFlags = 0; offSpMode(); field_0xf6c = 0; field_0xf76 = 0; mMasterType = 9; field_0xf78 = -1; mFlow.onNonStopJunpFlowFlag(); } struct shop_item_data { Vec mItemPos[3]; }; static shop_item_data item_seira_shop = { { {110.0f, 150.0f, -115.0f}, {160.0f, 150.0f, -115.0f}, {210.0f, 150.0f, -115.0f}, }, }; static processFunc process[] = { &dShopSystem_c::seq_wait, &dShopSystem_c::seq_start, &dShopSystem_c::seq_select_wait, &dShopSystem_c::seq_select_start, &dShopSystem_c::seq_select, &dShopSystem_c::seq_moving, &dShopSystem_c::seq_decide, &dShopSystem_c::seq_choose, &dShopSystem_c::seq_decide_yes, &dShopSystem_c::seq_decide_no, &dShopSystem_c::seq_finish, (processFunc)&dShopSystem_c::seq_event, }; dShopSystem_c::~dShopSystem_c() { deleteObject(); dShopSystem_sellItemMax = 0; data_80451060 = 0; for (int i = 0; i < 7; i++) { dShopSystem_itemActor[i] = NULL; dShopSystem_itemNo[i] = fpcNm_ITEM_NONE; } dShopSystem_item_count = 0; for (int i = 0; i < 2; i++) { dShopSystem_cameraActor[i] = NULL; } dShopSystem_camera_count = 0; } void dShopSystem_c::onFlag(int i_flag) { mFlag |= (u16)(1 << i_flag); } void dShopSystem_c::offFlag(int i_flag) { mFlag &= ~(u16)(1 << i_flag); } BOOL dShopSystem_c::isFlag(int i_flag) { return mFlag & (u16)(1 << i_flag) ? TRUE : FALSE; } void dShopSystem_c::onSoldOutItemFlag(int i_flag) { mSoldOutItemFlags |= (u8)(1 << i_flag); } void dShopSystem_c::offSoldOutItemFlag(int i_flag) { mSoldOutItemFlags &= ~(u8)(1 << i_flag); } BOOL dShopSystem_c::isSoldOutItemFlag(int i_flag) { return mSoldOutItemFlags & (u8)(1 << i_flag) ? TRUE : FALSE; } int dShopSystem_c::checkController(u8 i_seq, dMsgFlow_c* i_flow) { if (mWaitTimer != 0) { if (mDoCPd_c::getTrigA(PAD_1)) { dMsgObject_setShopWaitTimer(1); } return 0; } if (!dpdMove()) { mpStick->checkTrigger(); } int control_status; if (dShopSystem_sellItemMax == 4) { control_status = chooseItem4(i_seq); } else if (dShopSystem_sellItemMax == 5) { control_status = chooseItem5(i_seq); } else { control_status = chooseItem3(i_seq); } if (control_status != 0) { return control_status; } dMsgObject_c* msg = dMsgObject_getMsgObjectClass(); if (msg->getSelectPushFlag() != 0) { return msg->getSelectPushFlag() == 2 ? 2 : 1; } if (mDoCPd_c::getTrigA(PAD_1)) { if (msg->getStatus() != 6 && msg->getStatus() != 8 && msg->getStatus() != 9 && msg->getStatus() != 20 && i_seq != SEQ_WAIT) { return 1; } } if (mDoCPd_c::getTrigB(PAD_1)) { if (i_seq != SEQ_SELECT_WAIT) { mLastCursorPos = mCursorPos; mCursorPos = 0; } if (!i_flow->isSelectMessage()) { return 2; } } return 0; } int dShopSystem_c::chooseItem3(u8 i_seq) { u8 old_cursor = mLastCursorPos; if (checkLeftTrigger(mpStick) && i_seq != SEQ_SELECT_WAIT) { u8 cursor_pos = mCursorPos; if (cursor_pos == 7) { mCursorPos = mLastCursorPos; mLastCursorPos = 7; if (mCursorPos != 0 && isFlag(mCursorPos - 1)) { mCursorPos = mLastCursorPos; mLastCursorPos = old_cursor; } else { if (i_seq != SEQ_START) { if (mCursorPos != 0) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); } mShopCamAction.SetSelectIdx(mCursorPos); } return 3; } } else if (cursor_pos == 4) { mLastCursorPos = cursor_pos; mCursorPos = 0; if (i_seq != SEQ_START) { if (mCursorPos != 0) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); } mShopCamAction.SetSelectIdx(mCursorPos); } return 3; } else if (cursor_pos != 0) { mLastCursorPos = cursor_pos; mCursorPos--; if (mCursorPos != 0 && isFlag(mCursorPos - 1)) { mCursorPos = mLastCursorPos; mLastCursorPos = old_cursor; } else { if (i_seq != SEQ_START) { if (mCursorPos != 0) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); } mShopCamAction.SetSelectIdx(mCursorPos); } return 3; } } } if (checkRightTrigger(mpStick) && i_seq != SEQ_SELECT_WAIT) { u8 cursor_pos = mCursorPos; if (cursor_pos != 7) { if (cursor_pos != 3 && cursor_pos != 6) { mLastCursorPos = cursor_pos; mCursorPos++; if (mCursorPos != 0 && isFlag(mCursorPos - 1)) { mCursorPos = mLastCursorPos; mLastCursorPos = old_cursor; } else { if (i_seq != SEQ_START) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); mShopCamAction.SetSelectIdx(mCursorPos); } return 4; } } else if (dShopSystem_sellItemMax == 7) { mLastCursorPos = cursor_pos; mCursorPos = 7; if (mCursorPos != 0 && isFlag(mCursorPos - 1)) { mCursorPos = mLastCursorPos; mLastCursorPos = old_cursor; } else { if (i_seq != SEQ_START) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); mShopCamAction.SetSelectIdx(mCursorPos); } return 4; } } } } if (dShopSystem_sellItemMax >= 6) { if (mpStick->checkUpTrigger() && i_seq != SEQ_SELECT_WAIT && mCursorPos <= 3) { mLastCursorPos = mCursorPos; mCursorPos += 3; if (mCursorPos != 0 && isFlag(mCursorPos - 1)) { mCursorPos = mLastCursorPos; mLastCursorPos = old_cursor; } else { if (i_seq != SEQ_START) { if (mCursorPos != 0) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); } mShopCamAction.SetSelectIdx(mCursorPos); } return 5; } } if (mpStick->checkDownTrigger() && i_seq != SEQ_SELECT_WAIT) { u8 cursor_pos = mCursorPos; if (cursor_pos > 3 && cursor_pos <= 6) { mLastCursorPos = cursor_pos; mCursorPos -= 3; if (mCursorPos != 0 && isFlag(mCursorPos - 1)) { mCursorPos = mLastCursorPos; mLastCursorPos = old_cursor; } else { if (i_seq != SEQ_START) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); mShopCamAction.SetSelectIdx(mCursorPos); } return 6; } } } } return 0; } int dShopSystem_c::chooseItem5(u8 i_seq) { u8 old_cursor = mLastCursorPos; if (checkLeftTrigger(mpStick) && i_seq != SEQ_SELECT_WAIT) { u8 cursor_pos = mCursorPos; if (cursor_pos == 3) { mLastCursorPos = cursor_pos; mCursorPos = 0; if (i_seq != SEQ_START) { if (mCursorPos != 0) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); } mShopCamAction.SetSelectIdx(mCursorPos); } return 3; } if (cursor_pos != 0) { mLastCursorPos = cursor_pos; mCursorPos--; if (mCursorPos != 0 && isFlag(mCursorPos - 1)) { mCursorPos = mLastCursorPos; mLastCursorPos = old_cursor; } else { if (i_seq != SEQ_START) { if (mCursorPos != 0) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); } mShopCamAction.SetSelectIdx(mCursorPos); } return 3; } } } if (checkRightTrigger(mpStick) && i_seq != SEQ_SELECT_WAIT) { u8 cursor_pos = mCursorPos; if (cursor_pos != 2 && cursor_pos != 5) { mLastCursorPos = cursor_pos; mCursorPos++; if (mCursorPos != 0 && isFlag(mCursorPos - 1)) { mCursorPos = mLastCursorPos; mLastCursorPos = old_cursor; } else { if (i_seq != SEQ_START) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); mShopCamAction.SetSelectIdx(mCursorPos); } return 4; } } } if (mpStick->checkUpTrigger() && i_seq != SEQ_SELECT_WAIT) { u8 cursor_pos = mCursorPos; if (cursor_pos == 3 || cursor_pos == 5) { mLastCursorPos = cursor_pos; if (mCursorPos == 3) { mCursorPos = 1; } else if (mCursorPos == 5) { mCursorPos = 2; } if (mCursorPos != 0 && isFlag(mCursorPos - 1)) { mCursorPos = mLastCursorPos; mLastCursorPos = old_cursor; } else { if (i_seq != SEQ_START) { if (mCursorPos != 0) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); } mShopCamAction.SetSelectIdx(mCursorPos); } return 5; } } } if (mpStick->checkDownTrigger() && i_seq != SEQ_SELECT_WAIT) { u8 cursor_pos = mCursorPos; if (cursor_pos == 1 || cursor_pos == 2) { mLastCursorPos = cursor_pos; if (mCursorPos == 1) { mCursorPos = 3; } else if (mCursorPos == 2) { mCursorPos = 5; } if (mCursorPos != 0 && isFlag(mCursorPos - 1)) { mCursorPos = mLastCursorPos; mLastCursorPos = old_cursor; } else { if (i_seq != SEQ_START) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); mShopCamAction.SetSelectIdx(mCursorPos); } return 6; } } } return 0; } int dShopSystem_c::chooseItem4(u8 i_seq) { u8 old_cursor = mLastCursorPos; if (checkLeftTrigger(mpStick) && i_seq != SEQ_SELECT_WAIT && mCursorPos != 0) { mLastCursorPos = mCursorPos; mCursorPos--; if (mCursorPos != 0 && isFlag(mCursorPos - 1)) { mCursorPos = mLastCursorPos; mLastCursorPos = old_cursor; } else { if (i_seq != SEQ_START) { if (mCursorPos != 0) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); } mShopCamAction.SetSelectIdx(mCursorPos); } return 3; } } if (checkRightTrigger(mpStick) && i_seq != SEQ_SELECT_WAIT && mCursorPos < 4) { mLastCursorPos = mCursorPos; mCursorPos++; if (mCursorPos != 0 && isFlag(mCursorPos - 1)) { mCursorPos = mLastCursorPos; mLastCursorPos = old_cursor; } else { if (i_seq != SEQ_START) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); mShopCamAction.SetSelectIdx(mCursorPos); } return 4; } } return 0; } int dShopSystem_c::moveCursor(int control_status, u8 param_1) { int cursor_status; if (field_0xf60 >= 0) { cursor_status = moveCursor0(control_status, param_1); } else { cursor_status = moveCursor1(control_status, param_1); } field_0xf6c = cursor_status; return cursor_status; } int dShopSystem_c::moveCursor0(int control_status, u8 param_1) { offFlag(7); switch (control_status) { case 3: if (mCursorPos == 0) { return getEventParamU8(mCursorPos) + 0x52; } return (getEventParamU8(mCursorPos) - 1) * 2 + 0x66; case 4: if (mCursorPos == 0) { return getEventParamU8(mCursorPos) + 0x52; } return (getEventParamU8(mCursorPos) - 1) * 2 + 0x66; case 7: if (mCursorPos == 0) { return getEventParamU8(mCursorPos) + 0x52; } return (getEventParamU8(mCursorPos) - 1) * 2 + 0x66; case 1: if (mCursorPos == 0) { return getEventParamU8(mCursorPos) + 0x52; } if (param_1 != 2) { return (getEventParamU8(mCursorPos) - 1) * 2 + 0x65; } return (getEventParamU8(mCursorPos) - 1) * 2 + 0x66; case 2: onFlag(7); mShopCamAction.SetSelectIdx(mCursorPos); if (mCursorPos == 0) { return getEventParamU8(mCursorPos) + 0x52; } if (param_1 != 2) { return (getEventParamU8(mCursorPos) - 1) * 2 + 0x65; } return (getEventParamU8(mCursorPos) - 1) * 2 + 0x66; } return 0; } int dShopSystem_c::moveCursor1(int control_status, u8 param_1) { offFlag(7); switch (control_status) { case 3: case 4: case 5: case 6: case 7: if (mCursorPos == 0) { return getFlowNodeNum() + 1; } return mItemCtrl.getMessageIndex(mCursorPos - 1) + 1; case 1: if (mCursorPos == 0) { return getFlowNodeNum() + 1; } else if (param_1 != 2) { return mItemCtrl.getMessageIndex(mCursorPos - 1); } return mItemCtrl.getMessageIndex(mCursorPos - 1) + 1; case 2: onFlag(7); mShopCamAction.SetSelectIdx(mCursorPos); if (mCursorPos == 0) { return getFlowNodeNum() + 1; } else if (param_1 != 2) { return mItemCtrl.getMessageIndex(mCursorPos - 1); } return mItemCtrl.getMessageIndex(mCursorPos - 1) + 1; default: return 0; } } int dShopSystem_c::drawCursor() { if ((mSeq == 4 || mSeq == 5 || ((mSeq == 6 || mSeq == SEQ_SELECT_WAIT) && isFlag(mCursorPos - 1))) && mCursorPos != 0 && mItemCtrl.isHomePos(mCursorPos - 1)) { mpDrawCursor->addAlpha(); } else { mpDrawCursor->decAlpha(); } mpDrawCursor->setScale(g_cursorHIO.mShopCursorScale); if (mCursorPos != 0) { dComIfGd_set2DOpa(mpDrawCursor); } return 1; } int dShopSystem_c::itemRotate() { u8 item_index = 0; u8 cursor_pos = mCursorPos; if (cursor_pos != 0 && mSeq != SEQ_WAIT) { if (dShopSystem_itemNo[cursor_pos - 1] == fpcNm_ITEM_ARMOR) { int tmp_index; if (isFlag(8) == false) { tmp_index = 0; } else { tmp_index = mCursorPos; } item_index = tmp_index; } else { bool no_rotate = false; int tmp_index; if (isFlag(cursor_pos - 1) || isSoldOutItemFlag(mCursorPos - 1)) { no_rotate = true; } if (no_rotate) { tmp_index = 0; } else { tmp_index = mCursorPos; } item_index = tmp_index; } } mItemCtrl.setRotateAnime(item_index); return 1; } int dShopSystem_c::itemZoom(cXyz* param_0) { cXyz local_1c; if (field_0xf60 >= 0) { local_1c.set(*param_0); if (dShopSystem_itemNo[mCursorPos - 1] == fpcNm_ITEM_OIL_BOTTLE) { mItemCtrl.setZoomAnime(mCursorPos, &local_1c, g_cursorHIO.mSeraShopObjZoomAngleX + -5000, isFlag(8) ? true : false); } else { mItemCtrl.setZoomAnime(mCursorPos, &local_1c, g_cursorHIO.mSeraShopObjZoomAngleX, isFlag(8) ? true : false); } } else { cXyz local_28; cXyz local_34; if (dShopSystem_itemActor[1] != NULL && dShopSystem_cameraActor[1] != NULL) { cXyz local_40; local_40.set(dShopSystem_itemActor[1]->home.pos); f32 tmp_05 = 0.5f; if (dShopSystem_sellItemMax == 4) { if (dShopSystem_itemActor[2] != NULL) { f32 tmp = (dShopSystem_itemActor[2]->home.pos.x + dShopSystem_itemActor[1]->home.pos.x); local_40.x = tmp * tmp_05; f32 tmp2 = (dShopSystem_itemActor[2]->home.pos.y + dShopSystem_itemActor[1]->home.pos.y); local_40.y = tmp2 * tmp_05; f32 tmp3 = (dShopSystem_itemActor[2]->home.pos.z + dShopSystem_itemActor[1]->home.pos.z); local_40.z = tmp3 * tmp_05; } } else if (dShopSystem_sellItemMax == 5) { f32 tmp = (dShopSystem_itemActor[2]->home.pos.x + dShopSystem_itemActor[3]->home.pos.x); local_40.x = tmp * tmp_05; local_40.y = dShopSystem_itemActor[0]->home.pos.y; f32 tmp3 = (dShopSystem_itemActor[2]->home.pos.z + dShopSystem_itemActor[3]->home.pos.z); local_40.z = tmp3 * tmp_05; } cXyz local_4c = local_40 - dShopSystem_cameraActor[1]->current.pos; s16 atan = cM_atan2s(local_4c.x, local_4c.z); if (!strcmp("R_SP01", dComIfGp_getStartStageName())) { local_34.set(g_cursorHIO.mObjZoom.x, g_cursorHIO.mObjZoom.y + -25.0f, g_cursorHIO.mObjZoom.z + 150.0f); } else { if (mMasterType == 5) { if (dShopSystem_itemNo[mCursorPos - 1] == fpcNm_ITEM_ARROW_10 || dShopSystem_itemNo[mCursorPos - 1] == fpcNm_ITEM_ARROW_20 || dShopSystem_itemNo[mCursorPos - 1] == fpcNm_ITEM_ARROW_30) { local_34.set(g_cursorHIO.mObjZoom.x, -50.0f + g_cursorHIO.mObjZoom.y + 5.0f, (g_cursorHIO.mObjZoom.z + 250.0f) - 60.0f); } else { local_34.set(g_cursorHIO.mObjZoom.x, -50.0f + g_cursorHIO.mObjZoom.y + 20.0f, (g_cursorHIO.mObjZoom.z + 250.0f) - 60.0f); } } else if (mCursorPos == 7) { local_34.set(g_cursorHIO.mMagicArmorObjZoom.x, g_cursorHIO.mMagicArmorObjZoom.y + -130.0f, g_cursorHIO.mMagicArmorObjZoom.z + 215.0f); } else { local_34.set(g_cursorHIO.mObjZoom.x, g_cursorHIO.mObjZoom.y + -50.0f, g_cursorHIO.mObjZoom.z + 250.0f); } } cLib_offsetPos(&local_28, &dShopSystem_cameraActor[1]->current.pos, atan, &local_34); if (dShopSystem_sellItemMax == 6 || dShopSystem_sellItemMax == 5) { param_0->y += 15.0f; } local_1c.set(local_28.x + param_0->x, local_28.y + param_0->y, local_28.z + param_0->z); } else { local_28.set(*param_0); local_1c.set(*param_0); } u8 dvar1 = mMasterType; if (dvar1 == 1) { if (dShopSystem_itemNo[mCursorPos - 1] == fpcNm_ITEM_OIL_BOTTLE) { mItemCtrl.setZoomAnime(mCursorPos, &local_1c, g_cursorHIO.mShopObjZoomAngleX + -7000, isFlag(8) ? true : false); } else { mItemCtrl.setZoomAnime(mCursorPos, &local_1c, g_cursorHIO.mShopObjZoomAngleX, isFlag(8) ? true : false); } } else if (dvar1 == 2) { if (dShopSystem_itemNo[mCursorPos - 1] == fpcNm_ITEM_RED_BOTTLE) { mItemCtrl.setZoomAnime(mCursorPos, &local_1c, g_cursorHIO.mShopObjZoomAngleX - 3000, isFlag(8) ? true : false); } else { mItemCtrl.setZoomAnime(mCursorPos, &local_1c, g_cursorHIO.mShopObjZoomAngleX, isFlag(8) ? true : false); } } else if (dvar1 == 5) { if (dShopSystem_itemNo[mCursorPos - 1] == fpcNm_ITEM_ARROW_10 || dShopSystem_itemNo[mCursorPos - 1] == fpcNm_ITEM_ARROW_20 || dShopSystem_itemNo[mCursorPos - 1] == fpcNm_ITEM_ARROW_30) { mItemCtrl.setZoomAnime(mCursorPos, &local_1c, g_cursorHIO.mShopObjZoomAngleX - 4000, isFlag(8) ? true : false); } else { mItemCtrl.setZoomAnime(mCursorPos, &local_1c, g_cursorHIO.mShopObjZoomAngleX - 2000, isFlag(8) ? true : false); } } else if (mCursorPos == 7) { mItemCtrl.setZoomAnime(mCursorPos, &local_1c, g_cursorHIO.mMagicArmorObjZoomAngleX, isFlag(8) ? true : false); } else if (dShopSystem_sellItemMax == 7) { mItemCtrl.setZoomAnime(mCursorPos, &local_1c, g_cursorHIO.mShopObjZoomAngleX - 3000, isFlag(8) ? true : false); } else { mItemCtrl.setZoomAnime(mCursorPos, &local_1c, g_cursorHIO.mShopObjZoomAngleX, isFlag(8) ? true : false); } } return 1; } int dShopSystem_c::seq_wait(fopAc_ac_c* param_0, dMsgFlow_c* param_1) { return 0; } inline void pos3Dto2D(Vec* a, Vec* b) { mDoLib_project(a, b); } int dShopSystem_c::seq_start(fopAc_ac_c* actor, dMsgFlow_c* i_flow) { if (field_0xf79 != 0) { dComIfGp_setDoStatusForce(0, 0); dComIfGp_setAStatusForce(0, 0); field_0xf79 = 0; } cXyz pos3d; cXyz pos2d; pos3d.set(mItemCtrl.getCurrentPos(0)); pos3Dto2D(&pos3d, &pos2d); mpDrawCursor->setPos(pos2d.x, pos2d.y + g_cursorHIO.mShopCursorOffsetY); if (chkSpMode() && !beforeStartSeqAction(i_flow, field_0xf5c)) { return 0; } else { if (dMsgObject_c::isMsgSendControl()) { dComIfGp_setDoStatusForce(0, 0); dComIfGp_setAStatusForce(0x2A, 0); int control_status = checkController(SEQ_WAIT, i_flow); if (control_status != 0) { dMsgObject_c::onMsgSend(); int cursor_status = moveCursor(control_status, 0); if (chkSpMode()) { if (mCursorPos != 0) { field_0xf5c = cursor_status; mShopCamAction.setCameraSpeed(0.0f, 0.0f, 0.0f, 0.0f); setSeq(SEQ_SELECT); } else if (i_flow->doFlow(actor, NULL, cursor_status)) { mShopCamAction.setCameraSpeed(0.0f, 0.0f, 0.0f, 0.0f); setSeq(SEQ_FINISH); } } else if (i_flow->doFlow(actor, NULL, cursor_status)) { if (mCursorPos == 0) { setSeq(SEQ_FINISH); } else { setSeq(SEQ_SELECT); } } } } else { if (i_flow->doFlow(actor, NULL, 0)) { int itemNo; if (mFlow.getEventId(&itemNo) == 1) { if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) { mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL); } if (fpcEx_IsExist(mItemPartnerId)) { mEvtNo = 1; evtChange(); return 1; } else { return 0; } } else { return 1; } } } } return 0; } int dShopSystem_c::seq_select_wait(fopAc_ac_c*, dMsgFlow_c*) { if (mItemCtrl.isHomePos(mCursorPos - 1)) { setSoldOut(); setSeq(SEQ_SELECT); } return 0; } int dShopSystem_c::seq_select_start(fopAc_ac_c*, dMsgFlow_c*) { if (field_0xf60 < 0 && field_0xf76 == 0 && dShopSystem_item_count != -1) { if (dShopSystem_item_count != dShopSystem_sellItemMax) { return 0; } searchItemActor(); } if (isFlag(mCursorPos - 1)) { switch (mCursorPos) { case 1: mCursorPos = 2; if (isFlag(mCursorPos - 1)) { mCursorPos = 3; if (isFlag(mCursorPos - 1)) { mCursorPos = 0; } } break; case 2: mCursorPos = 1; if (isFlag(mCursorPos - 1)) { mCursorPos = 3; if (isFlag(mCursorPos - 1)) { mCursorPos = 0; } } break; case 3: mCursorPos = 2; if (isFlag(mCursorPos - 1)) { mCursorPos = 1; if (isFlag(mCursorPos - 1)) { mCursorPos = 0; } } break; } } mShopCamAction.SetSelectIdx(mCursorPos); int cursor_status = moveCursor(4, 0); initTalk(cursor_status, NULL); setSeq(SEQ_SELECT); return 0; } int dShopSystem_c::seq_select(fopAc_ac_c* actor, dMsgFlow_c* i_flow) { if (chkSpMode() && !beforeSelectSeqAction(i_flow, field_0xf5c)) { return 0; } if (field_0xf76 != 0) { field_0xf76 = 0; } int control_status = checkController(SEQ_START, i_flow); dComIfGp_setDoStatusForce(0x22, 0); dComIfGp_setAStatusForce(0x2A, 0); if (control_status != 0) { int cursor_status = moveCursor(control_status, 1); int spMode = chkSpMode(); if (spMode && control_status == 2) { field_0xf5c = cursor_status; mShopCamAction.setCameraSpeed(0.0f, 0.0f, 0.0f, 0.0f); setSeq(SEQ_FINISH); } else if (spMode && mCursorPos == 0) { field_0xf5c = cursor_status; mShopCamAction.SetSelectIdx(mCursorPos); mShopCamAction.setCameraSpeed(0.0f, 0.0f, 0.0f, 0.0f); setSeq(SEQ_START); } else if (i_flow->doFlow(actor, NULL, cursor_status)) { if (control_status == 3) { if (mCursorPos != 0) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); } mShopCamAction.SetSelectIdx(mCursorPos); } else if (control_status == 4 || control_status == 5 || control_status == 6) { mDoAud_seStart(Z2SE_SY_TALK_NEXT, NULL, 0, 0); mShopCamAction.SetSelectIdx(mCursorPos); } dComIfGp_setMesgCancelButton(1); if (control_status == 1) { if (!isFlag(mCursorPos - 1) && !isSoldOutItemFlag(mCursorPos - 1)) { onFlag(8); } dMeter2Info_set2DVibrationM(); setSeq(SEQ_DECIDE); } else if (control_status == 2) { setSeq(SEQ_FINISH); } else if (mCursorPos == 0) { setSeq(SEQ_START); } else { field_0xf68 = 0; setSeq(SEQ_MOVING); if (mLastCursorPos != 0) { return 0; } } } else if (control_status == 3 || control_status == 4 || control_status == 5 || control_status == 6 || control_status == 7 || control_status == 2) { if (mLastCursorPos == 7) { mLastCursorPos = mCursorPos; mCursorPos = 7; } else { mCursorPos = mLastCursorPos; } field_0xf7a = 0; if (control_status == 2) { mShopCamAction.SetSelectIdx(mCursorPos); } } } else { i_flow->doFlow(actor, NULL, 0); } u8 old_cursor = 0; if (mCursorPos != 0) { old_cursor = mCursorPos; } else if (mLastCursorPos != 0) { old_cursor = mLastCursorPos; } if (old_cursor != 0) { cXyz pos3d; cXyz pos2d; pos3d.set(mItemCtrl.getCurrentPos(old_cursor - 1)); pos3Dto2D(&pos3d, &pos2d); if (old_cursor == 7) { pos2d.x += g_cursorHIO.mMagicArmorCursorOffsetX; pos2d.y += g_cursorHIO.mMagicArmorCursorOffsetY; } else { pos2d.y += g_cursorHIO.mShopCursorOffsetY; } mpDrawCursor->setPos(pos2d.x, pos2d.y); } return 0; } int dShopSystem_c::seq_moving(fopAc_ac_c*, dMsgFlow_c*) { field_0xf68++; cXyz last_pos3d; cXyz pos3d; cXyz last_pos2d; cXyz pos2d; pos3d.set(mItemCtrl.getCurrentPos(mCursorPos - 1)); pos3Dto2D(&pos3d, &pos2d); if (mCursorPos == 7) { pos2d.x += g_cursorHIO.mMagicArmorCursorOffsetX; pos2d.y += g_cursorHIO.mMagicArmorCursorOffsetY; } else { pos2d.y += g_cursorHIO.mShopCursorOffsetY; } if (mLastCursorPos != 0) { last_pos3d.set(mItemCtrl.getCurrentPos(mLastCursorPos - 1)); pos3Dto2D(&last_pos3d, &last_pos2d); if (mLastCursorPos == 7) { last_pos2d.x += g_cursorHIO.mMagicArmorCursorOffsetX; last_pos2d.y += g_cursorHIO.mMagicArmorCursorOffsetY; } else { last_pos2d.y += g_cursorHIO.mShopCursorOffsetY; } f32 tmp = (f32)(field_0xf68 * field_0xf68) / 9.0f; mpDrawCursor->setPos(last_pos2d.x + tmp * (pos2d.x - last_pos2d.x), last_pos2d.y + tmp * (pos2d.y - last_pos2d.y)); } else { mpDrawCursor->setPos(pos2d.x, pos2d.y); } if (field_0xf68 >= 3) { setSeq(SEQ_SELECT); } return 0; } int dShopSystem_c::seq_decide(fopAc_ac_c* actor, dMsgFlow_c* i_flow) { int control_status = checkController(SEQ_SELECT_WAIT, i_flow); dComIfGp_setDoStatusForce(0x22, 0); if (!i_flow->isSelectMessage()) { dComIfGp_setAStatusForce(0x2A, 0); } else if (dMsgObject_getMsgObjectClass()->getSelectCancelPos() != 0) { dComIfGp_setAStatusForce(0x2A, 0); } if (control_status != 0) { int cursor_status = moveCursor(control_status, 2); if (i_flow->doFlow(actor, NULL, cursor_status)) { offFlag(8); setSeq(SEQ_SELECT_WAIT); } else if (i_flow->isSelectMessage()) { field_0xf58 = control_status; setSeq(SEQ_CHOOSE); } } else { i_flow->doFlow(actor, NULL, 0); } return 0; } int dShopSystem_c::seq_choose(fopAc_ac_c* actor, dMsgFlow_c* i_flow) { dComIfGp_setDoStatusForce(0x22, 0); if (!i_flow->isSelectMessage()) { dComIfGp_setAStatusForce(0x2A, 0); } else if (dMsgObject_getMsgObjectClass()->getSelectCancelPos() != 0) { dComIfGp_setAStatusForce(0x2A, 0); } i_flow->doFlow(actor, NULL, 0); u16 select_num = i_flow->getSelectNum(); if (dMsgObject_c::getStatus() != 6 && dMsgObject_c::getStatus() != 8 && dMsgObject_c::getStatus() != 9 && dMsgObject_c::getStatus() != 20) { if (select_num == 0) { setSeq(SEQ_DECIDE_YES); } else { setSeq(SEQ_DECIDE_NO); } } return 0; } int dShopSystem_c::seq_decide_yes(fopAc_ac_c* actor, dMsgFlow_c* i_flow) { if (dMsgObject_getMessageID() == 0x1B82) { mShopCamAction.SetSelectIdx(0); field_0xf76 = 1; } int itemNo; if (mFlow.getEventId(&itemNo) == 1) { if (i_flow->doFlow(actor, NULL, 0)) { if (mItemPartnerId == fpcM_ERROR_PROCESS_ID_e) { mItemPartnerId = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, -1, NULL, NULL); } if (fpcEx_IsExist(mItemPartnerId)) { offFlag(8); setSoldOutItemHide(); mEvtNo = 1; evtChange(); return 2; } return 0; } } else { int flow; if (field_0xf60 >= 0) { flow = 100; } else { flow = mItemCtrl.getMessageIndex(mCursorPos - 1) + 1; } if (i_flow->doFlow(actor, NULL, flow)) { offFlag(8); setSeq(SEQ_SELECT_WAIT); } } return 0; } int dShopSystem_c::seq_decide_no(fopAc_ac_c* actor, dMsgFlow_c* i_flow) { if (i_flow->doFlow(actor, NULL, moveCursor(field_0xf58, 2))) { offFlag(8); setSeq(SEQ_SELECT_WAIT); } return 0; } int dShopSystem_c::seq_finish(fopAc_ac_c* actor, dMsgFlow_c* i_flow) { if (chkSpMode() && !beforeStartSeqAction(i_flow, field_0xf5c)) { return 0; } else if (i_flow->doFlow(actor, NULL, 0)) { setSeq(SEQ_WAIT); return 1; } return 0; } bool dShopSystem_c::seq_event(fopAc_ac_c*, dMsgFlow_c*) { return mEvtNo == 0; } int dShopSystem_c::shop_init(bool param_0) { if (param_0) { setSeq(SEQ_SELECT_START); dMeter2Info_onShopTalkFlag(); setSoldOut(); return 1; } else if (mSeq == SEQ_WAIT) { setSeq(SEQ_START); dMeter2Info_onShopTalkFlag(); return 1; } else { return 0; } } int dShopSystem_c::shop_process(fopAc_ac_c* param_0, dMsgFlow_c* param_1) { int iVar1; iVar1 = (this->*process[mSeq])(param_0, param_1); if (mWaitTimer != 0) { mWaitTimer--; } if (field_0xf7a != 0) { dMeter2Info_set2DVibration(); field_0xf7a = 0; } if (iVar1 != 0) { g_meter2_info.offShopTalkFlag(); if (mSeq != 0) { setSeq(0); } if (iVar1 != 2) { mCursorPos = 0; mLastCursorPos = 0; } } if (mSeq != field_0xf71) { field_0xf71 = mSeq; field_0xf79 = 1; } return iVar1; } static shop_item_data* shop_item_pos_data_tbl = &item_seira_shop; void dShopSystem_c::createShopItem(int itemType) { static const u8 item_no[6] = { fpcNm_ITEM_MILK_BOTTLE, fpcNm_ITEM_BEE_CHILD, fpcNm_ITEM_PACHINKO, fpcNm_ITEM_MILK_BOTTLE, fpcNm_ITEM_BEE_CHILD, fpcNm_ITEM_NONE, }; if (itemType != -1) { field_0xf60 = itemType; mSoldOutFlag = -1; cXyz pos; for (int i = 0; i < 3; i++) { const u8* itemTbl = item_no + (itemType * 3); pos.x = shop_item_pos_data_tbl->mItemPos[i].x + current.pos.x; pos.y = shop_item_pos_data_tbl->mItemPos[i].y + current.pos.y; pos.z = shop_item_pos_data_tbl->mItemPos[i].z + current.pos.z; if (itemTbl[i] != fpcNm_ITEM_NONE) { u32 index = fopAcM_create(PROC_ShopItem, itemTbl[i], &pos, fopAcM_GetRoomNo(this), ¤t.angle, NULL, -1); mItemCtrl.setItemIndex(i, index); offFlag(i); } else { mItemCtrl.setItemIndex(i, -1); onFlag(i); } } } } void dShopSystem_c::setSeq(u8 i_seq) { mSeq = i_seq; mWaitTimer = 2; } void dShopSystem_c::setSoldOutFlag() { mSoldOutFlag = mCursorPos - 1; } void dShopSystem_c::setSoldOut() { if (mSoldOutFlag != 0xFF) { if (field_0xf60 < 0) { u8 sw = (u8)dShopSystem_itemActor[mSoldOutFlag]->home.angle.z & 0xFF; if (sw != 0xFF && !dComIfGs_isSaveSwitch(sw)) { dComIfGs_onSaveSwitch(sw); } } int index = mSoldOutFlag; mSoldOutFlag = -1; if (field_0xf60 >= 0) { fopAcM_delete(mItemCtrl.getItemIndex(index)); mItemCtrl.setItemIndex(index, -1); onFlag(index); return; } else if (index == 0) { dShopSystem_itemActor[0] = NULL; dShopSystem_itemNo[0] = fpcNm_ITEM_NONE; dShopSystem_item_count = 2; } else if (index == 1) { dShopSystem_itemActor[1] = NULL; dShopSystem_itemNo[1] = fpcNm_ITEM_NONE; dShopSystem_item_count = 2; } else if (index == 2) { dShopSystem_itemActor[2] = NULL; dShopSystem_itemNo[2] = fpcNm_ITEM_NONE; dShopSystem_item_count = 2; } else if (index == 6) { dShopSystem_itemActor[6] = NULL; dShopSystem_itemNo[6] = fpcNm_ITEM_NONE; dShopSystem_item_count = 6; } if (field_0xf76 != 0) { onFlag(index); } } } void dShopSystem_c::setSoldOutItemHide() { if (field_0xf60 < 0) { fopAcM_delete(mItemCtrl.getItemIndex(mSoldOutFlag)); } else { daShopItem_c* item = (daShopItem_c*)fopAcM_SearchByID(mItemCtrl.getItemIndex(mSoldOutFlag)); if (item != NULL) { item->hide(); } } } void dShopSystem_c::deleteObject() { if (mpStick != NULL) { delete mpStick; mpStick = NULL; } if (mpDrawCursor != NULL) { delete mpDrawCursor; mpDrawCursor = NULL; } } bool dShopSystem_c::searchItemActor() { u8 temp_data; if ((dShopSystem_item_count != -1 && ((dShopSystem_item_count < (temp_data = dShopSystem_sellItemMax)) || dShopSystem_camera_count < 2))) { if (dShopSystem_item_count < temp_data) { fpcEx_Search((fpcLyIt_JudgeFunc)dShopSystem_searchItemActor, this); } if (dShopSystem_camera_count < 2) { fpcEx_Search((fpcLyIt_JudgeFunc)dShopSystem_searchCameraActor, this); } return 0; } if (dShopSystem_item_count >= dShopSystem_sellItemMax && dShopSystem_camera_count >= 2) { mSoldOutFlag = -1; if (data_80451060) { f32 actorDistArr[7]; u8 itemNoArr[7]; f32 arr2[7]; daTag_ShopItem_c* actorArr[7]; u8 arr3[7]; for (int i = 0; i < dShopSystem_sellItemMax; i++) { actorArr[i] = dShopSystem_itemActor[i]; itemNoArr[i] = dShopSystem_itemNo[i]; actorDistArr[i] = fopAcM_searchActorDistance(this, actorArr[i]); arr2[i] = 0.0f; arr3[i] = 0; } for (int i = 0; i < dShopSystem_sellItemMax; i++) { arr2[i] = actorDistArr[i]; arr3[i] = i; if (i > 0) { for (int j = i; j >= 0; j--) { if (arr2[j] < arr2[j - 1]) { f32 temp = arr2[j]; arr2[j] = arr2[j - 1]; arr2[j - 1] = temp; u8 temp2 = arr3[j]; arr3[j] = arr3[j - 1]; arr3[j - 1] = temp2; } } } } for (int i = 0; i < dShopSystem_sellItemMax; i++) { dShopSystem_itemActor[i] = actorArr[arr3[i]]; dShopSystem_itemNo[i] = itemNoArr[arr3[i]]; } } for (int i = 0; i < dShopSystem_sellItemMax; i++) { u32 processId = dShopSystem_itemActor[i]->getProcessID(); mItemCtrl.setItemIndex(i, processId); mItemCtrl.setMessageIndex(i, (u16)dShopSystem_itemActor[i]->home.angle.x != 0xFFFF ? (u16)dShopSystem_itemActor[i]->home.angle.x : -1); if (processId + 0x10000 == 0xFFFF) { onFlag(i); onSoldOutItemFlag(i); } else { offFlag(i); if ((u8)fopAcM_GetParam(dShopSystem_itemActor[i]) == 0xFF) { onSoldOutItemFlag(i); } else { offSoldOutItemFlag(i); } } } if (mMasterType == 8) { dShopSystem_cameraActor[0]->current.pos.set(-175.0f, 165.0f, 10.0f); dShopSystem_cameraActor[1]->current.pos.set(215.0f, 225.0f, 370.0f); } if (dShopSystem_sellItemMax > 3) { mShopCamAction.setCamDataIdx2( this, dShopSystem_itemActor[0], dShopSystem_itemActor[1], dShopSystem_itemActor[2], dShopSystem_itemActor[3], dShopSystem_itemActor[4], dShopSystem_itemActor[5], &dShopSystem_cameraActor[0]->current.pos, &dShopSystem_cameraActor[1]->current.pos); if (mMasterType == 8) { cXyz camCtrPos; camCtrPos.set(-180.0f, 245.0f, -380.0f); mShopCamAction.setMasterCamCtrPos(&camCtrPos); } for (int i = 0; i < 7; i++) { if (dShopSystem_itemActor[i] != NULL) { u8 sw0 = dShopSystem_itemActor[i]->home.angle.z; u8 sw1 = ((u16)dShopSystem_itemActor[i]->home.angle.z) >> 8; if ((sw0 != 0xFF && !dComIfGs_isSaveSwitch(sw0)) && (sw1 != 0xFF && !dComIfGs_isSaveSwitch(sw1))) { onFlag(i); onSoldOutItemFlag(i); } } } dShopSystem_item_count = -1; } else { mShopCamAction.setCamDataIdx( this, dShopSystem_itemActor[0], dShopSystem_itemActor[1], dShopSystem_itemActor[2], &dShopSystem_cameraActor[0]->current.pos, &dShopSystem_cameraActor[1]->current.pos); for (int i = 0; i < 7; i++) { if (dShopSystem_itemActor[i] != NULL) { u8 sw0 = dShopSystem_itemActor[i]->home.angle.z; u8 sw1 = ((u16)dShopSystem_itemActor[i]->home.angle.z) >> 8; if ((sw0 != 0xFF && !dComIfGs_isSaveSwitch(sw0)) && (sw1 != 0xFF && !dComIfGs_isSaveSwitch(sw1))) { onFlag(i); onSoldOutItemFlag(i); } } } dShopSystem_item_count = -1; } } return 1; } int dShopSystem_c::getFlowNodeNum() { u16 num = home.angle.x; if (num == 0xFFFF) { return -1; } return num; } static void dummy() { static const char* bck_str = ".bck"; static const char* btp_str = ".btp"; static const char* btk_str = ".btk"; } void dShopSystem_c::setSellItemMax(u8 i_max) { dShopSystem_sellItemMax = i_max; } BOOL dShopSystem_c::checkShopOpen() { for (int i = 0; i < 2; i++) { if (dShopSystem_cameraActor[i] != NULL) { return true; } } if (dShopSystem_camera_count) { return true; } else { return false; } } bool dShopSystem_c::checkLeftTrigger(STControl* i_stick) { return i_stick->checkLeftTrigger(); } bool dShopSystem_c::checkRightTrigger(STControl* i_stick) { return i_stick->checkRightTrigger(); } bool dShopSystem_c::dpdMove() { return false; }